2 * @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_MAIN_HAND, 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) {
103 case EGO_SLAYING_WEAPON:
109 } while (one_in_(o_ptr->dd));
113 } while (one_in_(o_ptr->ds));
117 o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1;
119 case EGO_EARTHQUAKES:
120 if (one_in_(3) && (level > 60))
121 add_flag(o_ptr->art_flags, TR_BLOWS);
123 o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level);
129 if (!o_ptr->art_name) {
130 while (one_in_(10L * o_ptr->dd * o_ptr->ds))
136 } else if (power < -1) {
137 if (randint0(MAX_DEPTH) < level) {
139 o_ptr->name2 = get_random_ego(INVEN_MAIN_HAND, FALSE);
140 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD) {
153 /* power > 2 is debug only */
154 if (one_in_(20) || (power > 2)) {
155 become_random_artifact(owner_ptr, o_ptr, FALSE);
159 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
168 /* power > 2 is debug only */
170 become_random_artifact(owner_ptr, o_ptr, FALSE);
174 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
175 switch (o_ptr->name2) {
176 case EGO_SLAYING_BOLT:
181 while (one_in_(10L * o_ptr->dd * o_ptr->ds))
186 } else if (power < -1) {
187 if (randint0(MAX_DEPTH) < level) {
188 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);