OSDN Git Service

Merge pull request #1023 from shimitei/feature/#896_migration_wide_api
[hengbandforosx/hengbandosx.git] / src / artifact / random-art-pval-investor.cpp
1 /*!
2  * @file random-art-pval-investor.cpp
3  * @brief ランダムアーティファクトにpvalを追加する処理
4  * @date 2020/07/14
5  * @author Hourier
6  */
7
8 #include "artifact/random-art-pval-investor.h"
9 #include "artifact/random-art-bias-types.h"
10 #include "object-enchant/tr-types.h"
11 #include "object-hook/hook-weapon.h"
12 #include "sv-definition/sv-armor-types.h"
13 #include "system/object-type-definition.h"
14 #include "util/bit-flags-calculator.h"
15
16 static bool random_art_bias_strength(object_type *o_ptr)
17 {
18     if (has_flag(o_ptr->art_flags, TR_STR))
19         return FALSE;
20
21     add_flag(o_ptr->art_flags, TR_STR);
22     return one_in_(2);
23 }
24
25 static bool random_art_bias_intelligence(object_type *o_ptr)
26 {
27     if (has_flag(o_ptr->art_flags, TR_INT))
28         return FALSE;
29
30     add_flag(o_ptr->art_flags, TR_INT);
31     return one_in_(2);
32 }
33
34 static bool random_art_bias_wisdom(object_type *o_ptr)
35 {
36     if (has_flag(o_ptr->art_flags, TR_WIS))
37         return FALSE;
38
39     add_flag(o_ptr->art_flags, TR_WIS);
40     return one_in_(2);
41 }
42
43 static bool random_art_bias_dexterity(object_type *o_ptr)
44 {
45     if (has_flag(o_ptr->art_flags, TR_DEX))
46         return FALSE;
47
48     add_flag(o_ptr->art_flags, TR_DEX);
49     return one_in_(2);
50 }
51
52 static bool random_art_bias_constitution(object_type *o_ptr)
53 {
54     if (has_flag(o_ptr->art_flags, TR_CON))
55         return FALSE;
56
57     add_flag(o_ptr->art_flags, TR_CON);
58     return one_in_(2);
59 }
60
61 static bool random_art_bias_charisma(object_type *o_ptr)
62 {
63     if (has_flag(o_ptr->art_flags, TR_CHR))
64         return FALSE;
65
66     add_flag(o_ptr->art_flags, TR_CHR);
67     return one_in_(2);
68 }
69
70 static bool random_art_bias_magic_mastery(object_type *o_ptr)
71 {
72     if ((o_ptr->tval != TV_GLOVES) || has_flag(o_ptr->art_flags, TR_MAGIC_MASTERY))
73         return FALSE;
74
75     add_flag(o_ptr->art_flags, TR_MAGIC_MASTERY);
76     return one_in_(2);
77 }
78
79 static bool random_art_bias_stealth(object_type *o_ptr)
80 {
81     if (has_flag(o_ptr->art_flags, TR_STEALTH))
82         return FALSE;
83
84     add_flag(o_ptr->art_flags, TR_STEALTH);
85     return one_in_(2);
86 }
87
88 static bool random_art_bias_search(object_type *o_ptr)
89 {
90     if (has_flag(o_ptr->art_flags, TR_SEARCH))
91         return FALSE;
92
93     add_flag(o_ptr->art_flags, TR_SEARCH);
94     return one_in_(2);
95 }
96
97 static bool switch_random_art_bias(object_type *o_ptr)
98 {
99     switch (o_ptr->artifact_bias) {
100     case BIAS_WARRIOR:
101         return random_art_bias_strength(o_ptr) || random_art_bias_constitution(o_ptr) || random_art_bias_dexterity(o_ptr);
102     case BIAS_MAGE:
103         return random_art_bias_intelligence(o_ptr) || random_art_bias_magic_mastery(o_ptr);
104     case BIAS_RANGER:
105         return random_art_bias_dexterity(o_ptr) || random_art_bias_constitution(o_ptr) || random_art_bias_strength(o_ptr);
106     case BIAS_ROGUE:
107         return random_art_bias_stealth(o_ptr) || random_art_bias_search(o_ptr);
108     case BIAS_STR:
109         return random_art_bias_strength(o_ptr);
110     case BIAS_INT:
111         return random_art_bias_intelligence(o_ptr);
112     case BIAS_PRIESTLY:
113     case BIAS_WIS:
114         return random_art_bias_wisdom(o_ptr);
115     case BIAS_DEX:
116         return random_art_bias_dexterity(o_ptr);
117     case BIAS_CON:
118         return random_art_bias_constitution(o_ptr);
119     case BIAS_CHR:
120         return random_art_bias_charisma(o_ptr);
121     default:
122         return FALSE;
123     }
124 }
125
126 static bool random_art_bias_decrease_mana(object_type *o_ptr)
127 {
128     if (((o_ptr->artifact_bias != BIAS_MAGE) && (o_ptr->artifact_bias != BIAS_PRIESTLY)) || (o_ptr->tval != TV_SOFT_ARMOR) || (o_ptr->sval != SV_ROBE)
129         || has_flag(o_ptr->art_flags, TR_DEC_MANA) || !one_in_(3))
130         return FALSE;
131
132     add_flag(o_ptr->art_flags, TR_DEC_MANA);
133     return one_in_(2);
134 }
135
136 /*!
137  * @brief ランダムアーティファクト生成中、対象のオブジェクトにpval能力を付加する。/ Add one pval on generation of randam artifact.
138  * @details 優先的に付加されるpvalがランダムアーティファクトバイアスに依存して存在する。
139  * 原則的候補は腕力、知力、賢さ、器用さ、耐久、魅力、探索、隠密、赤外線視力、加速。武器のみ採掘、追加攻撃も候補に入る。
140  * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
141  * @param o_ptr 対象のオブジェクト構造体ポインタ
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 }