3 * @brief 武器系のアイテムを強化して(恐らく床に)生成する処理
8 #include "object-enchant/apply-magic-weapon.h"
9 #include "artifact/random-art-generator.h"
10 #include "inventory/inventory-slot-types.h"
11 #include "object-enchant/object-boost.h"
12 #include "object-enchant/object-ego.h"
13 #include "object-enchant/tr-types.h"
14 #include "object-enchant/trc-types.h"
15 #include "sv-definition/sv-weapon-types.h"
16 #include "system/floor-type-definition.h"
17 #include "util/bit-flags-calculator.h"
20 * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン
21 * Apply magic to an item known to be a "weapon"
22 * @param owner_ptr プレーヤーへの参照ポインタ
23 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
28 * Hack -- note special base damage dice boosting\n
29 * Hack -- note special processing for weapon/digger\n
31 void apply_magic_weapon(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power)
33 HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level);
34 HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level);
36 HIT_PROB tohit2 = (HIT_PROB)m_bonus(10, level);
37 HIT_POINT todam2 = (HIT_POINT)m_bonus(10, level);
39 if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT)) {
40 tohit2 = (tohit2 + 1) / 2;
41 todam2 = (todam2 + 1) / 2;
45 o_ptr->to_h += tohit1;
46 o_ptr->to_d += todam1;
48 o_ptr->to_h += tohit2;
49 o_ptr->to_d += todam2;
51 } else if (power < 0) {
52 o_ptr->to_h -= tohit1;
53 o_ptr->to_d -= todam1;
55 o_ptr->to_h -= tohit2;
56 o_ptr->to_d -= todam2;
59 if (o_ptr->to_h + o_ptr->to_d < 0)
60 o_ptr->curse_flags |= TRC_CURSED;
63 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE))
66 switch (o_ptr->tval) {
69 /* power > 2 is debug only */
70 if (one_in_(30) || (power > 2))
71 become_random_artifact(owner_ptr, o_ptr, FALSE);
73 o_ptr->name2 = EGO_DIGGING;
74 } else if (power < -1) {
75 o_ptr->pval = 0 - (5 + randint1(5));
76 } else if (power < 0) {
77 o_ptr->pval = 0 - (o_ptr->pval);
86 /* power > 2 is debug only */
87 if (one_in_(40) || (power > 2)) {
88 become_random_artifact(owner_ptr, o_ptr, FALSE);
92 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
93 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
95 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
97 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
102 switch (o_ptr->name2) {
104 if (one_in_(4) && (level > 40))
105 add_flag(o_ptr->art_flags, TR_BLOWS);
109 add_flag(o_ptr->art_flags, TR_RES_POIS);
111 add_flag(o_ptr->art_flags, TR_WARNING);
113 case EGO_KILL_DRAGON:
115 add_flag(o_ptr->art_flags, TR_RES_POIS);
119 add_flag(o_ptr->art_flags, TR_RES_FEAR);
121 case EGO_SLAYING_WEAPON:
127 } while (one_in_(o_ptr->dd));
131 } while (one_in_(o_ptr->ds));
135 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
137 if (o_ptr->tval == TV_SWORD && one_in_(3)) {
138 add_flag(o_ptr->art_flags, TR_VORPAL);
143 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
149 add_flag(o_ptr->art_flags, TR_HOLD_EXP);
151 add_flag(o_ptr->art_flags, TR_DEX);
153 add_flag(o_ptr->art_flags, TR_RES_FEAR);
156 o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1;
158 case EGO_EARTHQUAKES:
159 if (one_in_(3) && (level > 60))
160 add_flag(o_ptr->art_flags, TR_BLOWS);
162 o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level);
166 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
171 o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
172 one_in_(3) ? add_flag(o_ptr->art_flags, TR_DRAIN_EXP)
173 : one_in_(2) ? add_flag(o_ptr->art_flags, TR_DRAIN_HP) : add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
176 add_flag(o_ptr->art_flags, TR_CHAOTIC);
178 add_flag(o_ptr->art_flags, TR_BLOWS);
180 add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
182 add_flag(o_ptr->art_flags, TR_CALL_DEMON);
186 if (!o_ptr->art_name) {
187 while (one_in_(10L * o_ptr->dd * o_ptr->ds))
193 } else if (power < -1) {
194 if (randint0(MAX_DEPTH) < level) {
196 o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
197 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD) {
204 switch (o_ptr->name2) {
207 add_flag(o_ptr->art_flags, TR_TY_CURSE);
209 o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
219 /* power > 2 is debug only */
220 if (one_in_(20) || (power > 2)) {
221 become_random_artifact(owner_ptr, o_ptr, FALSE);
225 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
234 /* power > 2 is debug only */
236 become_random_artifact(owner_ptr, o_ptr, FALSE);
240 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
241 switch (o_ptr->name2) {
242 case EGO_SLAYING_BOLT:
247 while (one_in_(10L * o_ptr->dd * o_ptr->ds))
252 } else if (power < -1) {
253 if (randint0(MAX_DEPTH) < level) {
254 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);