From 7a1d8288597ab5f2cae6ccf1a8ecba0ef78eb5b6 Mon Sep 17 00:00:00 2001 From: Hourier Date: Tue, 2 Jun 2020 22:32:26 +0900 Subject: [PATCH] [Refactor] #40399 Separated apply-magic-weapon.c/h from object2.c --- Hengband/Hengband/Hengband.vcxproj | 2 + Hengband/Hengband/Hengband.vcxproj.filters | 6 + src/Makefile.am | 1 + src/object-enchant/apply-magic-weapon.c | 273 +++++++++++++++++++++++++++ src/object-enchant/apply-magic-weapon.h | 5 + src/object/object2.c | 288 +---------------------------- 6 files changed, 288 insertions(+), 287 deletions(-) create mode 100644 src/object-enchant/apply-magic-weapon.c create mode 100644 src/object-enchant/apply-magic-weapon.h diff --git a/Hengband/Hengband/Hengband.vcxproj b/Hengband/Hengband/Hengband.vcxproj index 15ed65871..279ec13eb 100644 --- a/Hengband/Hengband/Hengband.vcxproj +++ b/Hengband/Hengband/Hengband.vcxproj @@ -211,6 +211,7 @@ + @@ -496,6 +497,7 @@ + diff --git a/Hengband/Hengband/Hengband.vcxproj.filters b/Hengband/Hengband/Hengband.vcxproj.filters index 46c02c76f..ffed288ac 100644 --- a/Hengband/Hengband/Hengband.vcxproj.filters +++ b/Hengband/Hengband/Hengband.vcxproj.filters @@ -1091,6 +1091,9 @@ object-enchant + + object-enchant + @@ -2332,6 +2335,9 @@ object + + object-enchant + diff --git a/src/Makefile.am b/src/Makefile.am index 012bc3ec8..07efa927e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -313,6 +313,7 @@ hengband_SOURCES = \ object/object-util.h \ object/item-use-flags.h \ \ + object-enchant/apply-magic-weapon.c object-enchant/apply-magic-weapon.h \ object-enchant/artifact.c object-enchant/artifact.h \ object-enchant/object-boost.c object-enchant/object-boost.h \ object-enchant/object-curse.c object-enchant/object-curse.h \ diff --git a/src/object-enchant/apply-magic-weapon.c b/src/object-enchant/apply-magic-weapon.c new file mode 100644 index 000000000..7b7323d1b --- /dev/null +++ b/src/object-enchant/apply-magic-weapon.c @@ -0,0 +1,273 @@ +/*! + * todo ちょっと長い。要分割 + * @brief 武器系のアイテムを強化して(恐らく床に)生成する処理 + * @date 2020/06/02 + * @author Hourier + */ + +#include "object-enchant/apply-magic-weapon.h" +#include "floor/floor.h" +#include "object-enchant/artifact.h" +#include "object-enchant/object-boost.h" +#include "object-enchant/object-ego.h" +#include "object-enchant/tr-types.h" +#include "object-enchant/trc-types.h" +#include "sv-definition/sv-weapon-types.h" + +/*! + * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン + * Apply magic to an item known to be a "weapon" + * @param owner_ptr プレーヤーへの参照ポインタ + * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ + * @param level 生成基準階 + * @param power 生成ランク + * @return なし + * @details + * Hack -- note special base damage dice boosting\n + * Hack -- note special processing for weapon/digger\n + */ +void apply_magic_weapon(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power) +{ + HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level); + HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level); + + HIT_PROB tohit2 = (HIT_PROB)m_bonus(10, level); + HIT_POINT todam2 = (HIT_POINT)m_bonus(10, level); + + if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT)) { + tohit2 = (tohit2 + 1) / 2; + todam2 = (todam2 + 1) / 2; + } + + if (power > 0) { + o_ptr->to_h += tohit1; + o_ptr->to_d += todam1; + if (power > 1) { + o_ptr->to_h += tohit2; + o_ptr->to_d += todam2; + } + } else if (power < 0) { + o_ptr->to_h -= tohit1; + o_ptr->to_d -= todam1; + if (power < -1) { + o_ptr->to_h -= tohit2; + o_ptr->to_d -= todam2; + } + + if (o_ptr->to_h + o_ptr->to_d < 0) + o_ptr->curse_flags |= TRC_CURSED; + } + + if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) + return; + + switch (o_ptr->tval) { + case TV_DIGGING: { + if (power > 1) { + /* power > 2 is debug only */ + if (one_in_(30) || (power > 2)) + become_random_artifact(owner_ptr, o_ptr, FALSE); + else + o_ptr->name2 = EGO_DIGGING; + } else if (power < -1) { + o_ptr->pval = 0 - (5 + randint1(5)); + } else if (power < 0) { + o_ptr->pval = 0 - (o_ptr->pval); + } + + break; + } + case TV_HAFTED: + case TV_POLEARM: + case TV_SWORD: { + if (power > 1) { + /* power > 2 is debug only */ + if (one_in_(40) || (power > 2)) { + become_random_artifact(owner_ptr, o_ptr, FALSE); + break; + } + while (TRUE) { + o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE); + if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD) + continue; + if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED) + continue; + if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD) + continue; + break; + } + + switch (o_ptr->name2) { + case EGO_HA: + if (one_in_(4) && (level > 40)) + add_flag(o_ptr->art_flags, TR_BLOWS); + break; + case EGO_DF: + if (one_in_(3)) + add_flag(o_ptr->art_flags, TR_RES_POIS); + if (one_in_(3)) + add_flag(o_ptr->art_flags, TR_WARNING); + break; + case EGO_KILL_DRAGON: + if (one_in_(3)) + add_flag(o_ptr->art_flags, TR_RES_POIS); + break; + case EGO_WEST: + if (one_in_(3)) + add_flag(o_ptr->art_flags, TR_RES_FEAR); + break; + case EGO_SLAYING_WEAPON: + if (one_in_(3)) + o_ptr->dd *= 2; + else { + do { + o_ptr->dd++; + } while (one_in_(o_ptr->dd)); + + do { + o_ptr->ds++; + } while (one_in_(o_ptr->ds)); + } + + if (one_in_(5)) { + add_flag(o_ptr->art_flags, TR_BRAND_POIS); + } + if (o_ptr->tval == TV_SWORD && one_in_(3)) { + add_flag(o_ptr->art_flags, TR_VORPAL); + } + break; + case EGO_TRUMP: + if (one_in_(5)) + add_flag(o_ptr->art_flags, TR_SLAY_DEMON); + if (one_in_(7)) + one_ability(o_ptr); + break; + case EGO_PATTERN: + if (one_in_(3)) + add_flag(o_ptr->art_flags, TR_HOLD_EXP); + if (one_in_(3)) + add_flag(o_ptr->art_flags, TR_DEX); + if (one_in_(5)) + add_flag(o_ptr->art_flags, TR_RES_FEAR); + break; + case EGO_SHARPNESS: + o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1; + break; + case EGO_EARTHQUAKES: + if (one_in_(3) && (level > 60)) + add_flag(o_ptr->art_flags, TR_BLOWS); + else + o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level); + break; + case EGO_VAMPIRIC: + if (one_in_(5)) + add_flag(o_ptr->art_flags, TR_SLAY_HUMAN); + break; + case EGO_DEMON: + + if (one_in_(3)) + o_ptr->curse_flags |= (TRC_HEAVY_CURSE); + one_in_(3) ? add_flag(o_ptr->art_flags, TR_DRAIN_EXP) + : one_in_(2) ? add_flag(o_ptr->art_flags, TR_DRAIN_HP) : add_flag(o_ptr->art_flags, TR_DRAIN_MANA); + + if (one_in_(3)) + add_flag(o_ptr->art_flags, TR_CHAOTIC); + if (one_in_(4)) + add_flag(o_ptr->art_flags, TR_BLOWS); + if (one_in_(5)) + add_flag(o_ptr->art_flags, TR_ADD_H_CURSE); + if (one_in_(5)) + add_flag(o_ptr->art_flags, TR_CALL_DEMON); + break; + } + + if (!o_ptr->art_name) { + while (one_in_(10L * o_ptr->dd * o_ptr->ds)) + o_ptr->dd++; + + if (o_ptr->dd > 9) + o_ptr->dd = 9; + } + } else if (power < -1) { + if (randint0(MAX_DEPTH) < level) { + while (TRUE) { + o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE); + if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD) { + continue; + } + + break; + } + + switch (o_ptr->name2) { + case EGO_MORGUL: + if (one_in_(6)) + add_flag(o_ptr->art_flags, TR_TY_CURSE); + if (one_in_(3)) + o_ptr->curse_flags |= (TRC_HEAVY_CURSE); + break; + case EGO_WEIRD: + if (one_in_(4)) + add_flag(o_ptr->art_flags, TR_BRAND_POIS); + if (one_in_(4)) + add_flag(o_ptr->art_flags, TR_RES_NETHER); + if (one_in_(3)) + add_flag(o_ptr->art_flags, TR_NO_MAGIC); + if (one_in_(6)) + add_flag(o_ptr->art_flags, TR_NO_TELE); + if (one_in_(6)) + add_flag(o_ptr->art_flags, TR_TY_CURSE); + if (one_in_(6)) + add_flag(o_ptr->art_flags, TR_ADD_H_CURSE); + break; + } + } + } + + break; + } + case TV_BOW: { + if (power > 1) { + /* power > 2 is debug only */ + if (one_in_(20) || (power > 2)) { + become_random_artifact(owner_ptr, o_ptr, FALSE); + break; + } + + o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE); + } + + break; + } + case TV_BOLT: + case TV_ARROW: + case TV_SHOT: { + if (power > 1) { + /* power > 2 is debug only */ + if (power > 2) { + become_random_artifact(owner_ptr, o_ptr, FALSE); + break; + } + + o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE); + switch (o_ptr->name2) { + case EGO_SLAYING_BOLT: + o_ptr->dd++; + break; + } + + while (one_in_(10L * o_ptr->dd * o_ptr->ds)) + o_ptr->dd++; + + if (o_ptr->dd > 9) + o_ptr->dd = 9; + } else if (power < -1) { + if (randint0(MAX_DEPTH) < level) { + o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE); + } + } + + break; + } + } +} diff --git a/src/object-enchant/apply-magic-weapon.h b/src/object-enchant/apply-magic-weapon.h new file mode 100644 index 000000000..164fd1623 --- /dev/null +++ b/src/object-enchant/apply-magic-weapon.h @@ -0,0 +1,5 @@ +#pragma once + +#include "system/angband.h" + +void apply_magic_weapon(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power); diff --git a/src/object/object2.c b/src/object/object2.c index 9b853d6f0..9adc13592 100644 --- a/src/object/object2.c +++ b/src/object/object2.c @@ -20,6 +20,7 @@ #include "main/sound-definitions-table.h" #include "monster/monster-race-hook.h" #include "monster/monster.h" +#include "object-enchant/apply-magic-weapon.h" #include "object-enchant/artifact.h" #include "object-enchant/item-apply-magic.h" #include "object-enchant/item-feeling.h" @@ -679,293 +680,6 @@ void object_absorb(object_type *o_ptr, object_type *j_ptr) /*! - * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン - * Apply magic to an item known to be a "weapon" - * @param owner_ptr プレーヤーへの参照ポインタ - * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ - * @param level 生成基準階 - * @param power 生成ランク - * @return なし - * @details - * Hack -- note special base damage dice boosting\n - * Hack -- note special processing for weapon/digger\n - */ -void apply_magic_weapon(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power) -{ - HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level); - HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level); - - HIT_PROB tohit2 = (HIT_PROB)m_bonus(10, level); - HIT_POINT todam2 = (HIT_POINT)m_bonus(10, level); - - if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT)) - { - tohit2 = (tohit2 + 1) / 2; - todam2 = (todam2 + 1) / 2; - } - - if (power > 0) - { - o_ptr->to_h += tohit1; - o_ptr->to_d += todam1; - if (power > 1) - { - o_ptr->to_h += tohit2; - o_ptr->to_d += todam2; - } - } - else if (power < 0) - { - o_ptr->to_h -= tohit1; - o_ptr->to_d -= todam1; - if (power < -1) - { - o_ptr->to_h -= tohit2; - o_ptr->to_d -= todam2; - } - - if (o_ptr->to_h + o_ptr->to_d < 0) - o_ptr->curse_flags |= TRC_CURSED; - } - - if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return; - - switch (o_ptr->tval) - { - case TV_DIGGING: - { - if (power > 1) - { - /* power > 2 is debug only */ - if (one_in_(30) || (power > 2)) - become_random_artifact(owner_ptr, o_ptr, FALSE); - else - o_ptr->name2 = EGO_DIGGING; - } - else if (power < -1) - { - o_ptr->pval = 0 - (5 + randint1(5)); - } - else if (power < 0) - { - o_ptr->pval = 0 - (o_ptr->pval); - } - - break; - } - case TV_HAFTED: - case TV_POLEARM: - case TV_SWORD: - { - if (power > 1) - { - /* power > 2 is debug only */ - if (one_in_(40) || (power > 2)) - { - become_random_artifact(owner_ptr, o_ptr, FALSE); - break; - } - while (TRUE) - { - o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE); - if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD) - continue; - if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED) - continue; - if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD) - continue; - break; - } - - switch (o_ptr->name2) - { - case EGO_HA: - if (one_in_(4) && (level > 40)) - add_flag(o_ptr->art_flags, TR_BLOWS); - break; - case EGO_DF: - if (one_in_(3)) - add_flag(o_ptr->art_flags, TR_RES_POIS); - if (one_in_(3)) - add_flag(o_ptr->art_flags, TR_WARNING); - break; - case EGO_KILL_DRAGON: - if (one_in_(3)) - add_flag(o_ptr->art_flags, TR_RES_POIS); - break; - case EGO_WEST: - if (one_in_(3)) - add_flag(o_ptr->art_flags, TR_RES_FEAR); - break; - case EGO_SLAYING_WEAPON: - if (one_in_(3)) - o_ptr->dd *= 2; - else - { - do - { - o_ptr->dd++; - } while (one_in_(o_ptr->dd)); - - do - { - o_ptr->ds++; - } while (one_in_(o_ptr->ds)); - } - - if (one_in_(5)) - { - add_flag(o_ptr->art_flags, TR_BRAND_POIS); - } - if (o_ptr->tval == TV_SWORD && one_in_(3)) - { - add_flag(o_ptr->art_flags, TR_VORPAL); - } - break; - case EGO_TRUMP: - if (one_in_(5)) - add_flag(o_ptr->art_flags, TR_SLAY_DEMON); - if (one_in_(7)) - one_ability(o_ptr); - break; - case EGO_PATTERN: - if (one_in_(3)) - add_flag(o_ptr->art_flags, TR_HOLD_EXP); - if (one_in_(3)) - add_flag(o_ptr->art_flags, TR_DEX); - if (one_in_(5)) - add_flag(o_ptr->art_flags, TR_RES_FEAR); - break; - case EGO_SHARPNESS: - o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1; - break; - case EGO_EARTHQUAKES: - if (one_in_(3) && (level > 60)) - add_flag(o_ptr->art_flags, TR_BLOWS); - else - o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level); - break; - case EGO_VAMPIRIC: - if (one_in_(5)) - add_flag(o_ptr->art_flags, TR_SLAY_HUMAN); - break; - case EGO_DEMON: - - if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE); - one_in_(3) ? - add_flag(o_ptr->art_flags, TR_DRAIN_EXP) : - one_in_(2) ? - add_flag(o_ptr->art_flags, TR_DRAIN_HP) : - add_flag(o_ptr->art_flags, TR_DRAIN_MANA); - - - if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC); - if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS); - if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE); - if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON); - break; - } - - if (!o_ptr->art_name) - { - while (one_in_(10L * o_ptr->dd * o_ptr->ds)) - o_ptr->dd++; - - if (o_ptr->dd > 9) o_ptr->dd = 9; - } - } - else if (power < -1) - { - if (randint0(MAX_DEPTH) < level) - { - while (TRUE) - { - o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE); - if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD) - { - continue; - } - - break; - } - - switch (o_ptr->name2) - { - case EGO_MORGUL: - if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE); - if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE); - break; - case EGO_WEIRD: - if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS); - if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER); - if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC); - if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE); - if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE); - if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE); - break; - } - } - } - - break; - } - case TV_BOW: - { - if (power > 1) - { - /* power > 2 is debug only */ - if (one_in_(20) || (power > 2)) - { - become_random_artifact(owner_ptr, o_ptr, FALSE); - break; - } - - o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE); - } - - break; - } - case TV_BOLT: - case TV_ARROW: - case TV_SHOT: - { - if (power > 1) - { - /* power > 2 is debug only */ - if (power > 2) - { - become_random_artifact(owner_ptr, o_ptr, FALSE); - break; - } - - o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE); - switch (o_ptr->name2) - { - case EGO_SLAYING_BOLT: - o_ptr->dd++; - break; - } - - while (one_in_(10L * o_ptr->dd * o_ptr->ds)) - o_ptr->dd++; - - if (o_ptr->dd > 9) o_ptr->dd = 9; - } - else if (power < -1) - { - if (randint0(MAX_DEPTH) < level) - { - o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE); - } - } - - break; - } - } -} - - -/*! * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン * Apply magic to an item known to be "armor" * @param owner_ptr プレーヤーへの参照ポインタ -- 2.11.0