From be76d6ed3860dcc34ca526dc202975f0f69096a1 Mon Sep 17 00:00:00 2001 From: Hourier Date: Tue, 14 Jul 2020 18:26:35 +0900 Subject: [PATCH] [Refactor] #40561 Separated random-art-activation.c/h from artifact.c --- Hengband/Hengband/Hengband.vcxproj | 2 + Hengband/Hengband/Hengband.vcxproj.filters | 6 + src/Makefile.am | 1 + src/artifact/random-art-activation.c | 182 +++++++++++++++++++++++++++++ src/artifact/random-art-activation.h | 5 + src/object-enchant/artifact.c | 176 +--------------------------- 6 files changed, 197 insertions(+), 175 deletions(-) create mode 100644 src/artifact/random-art-activation.c create mode 100644 src/artifact/random-art-activation.h diff --git a/Hengband/Hengband/Hengband.vcxproj b/Hengband/Hengband/Hengband.vcxproj index 1c7449457..957b77319 100644 --- a/Hengband/Hengband/Hengband.vcxproj +++ b/Hengband/Hengband/Hengband.vcxproj @@ -159,6 +159,7 @@ + @@ -651,6 +652,7 @@ + diff --git a/Hengband/Hengband/Hengband.vcxproj.filters b/Hengband/Hengband/Hengband.vcxproj.filters index f876b7e7e..7bbba89d9 100644 --- a/Hengband/Hengband/Hengband.vcxproj.filters +++ b/Hengband/Hengband/Hengband.vcxproj.filters @@ -1736,6 +1736,9 @@ artifact + + artifact + @@ -3790,6 +3793,9 @@ artifact + + artifact + diff --git a/src/Makefile.am b/src/Makefile.am index e5bd9106a..602f80925 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -14,6 +14,7 @@ hengband_SOURCES = \ action/tunnel-execution.c action/tunnel-execution.h \ action/weapon-shield.c action/weapon-shield.h \ \ + artifact/random-art-activation.c artifact/random-art-activation.h \ artifact/random-art-bias-types.h \ artifact/random-art-misc.c artifact/random-art-misc.h \ artifact/random-art-pval-investor.c artifact/random-art-pval-investor.h \ diff --git a/src/artifact/random-art-activation.c b/src/artifact/random-art-activation.c new file mode 100644 index 000000000..2d4fcd3ca --- /dev/null +++ b/src/artifact/random-art-activation.c @@ -0,0 +1,182 @@ +#include "artifact/random-art-activation.h" +#include "artifact/random-art-bias-types.h" +#include "art-definition/random-art-effects.h" +#include "object-enchant/object-boost.h" +#include "object-enchant/tr-types.h" +#include "system/object-type-definition.h" +#include "util/bit-flags-calculator.h" + +/*! + * @brief ランダムアーティファクト生成中、対象のオブジェクトにバイアスに依存した発動を与える。/ Add one activaton of randam artifact depend on bias. + * @details バイアスが無い場合、一部のバイアスの確率によっては one_ability() に処理が移行する。 + * @param o_ptr 対象のオブジェクト構造体ポインタ + * @return なし + */ +void give_activation_power(object_type *o_ptr) +{ + int type = 0, chance = 0; + + switch (o_ptr->artifact_bias) { + case BIAS_ELEC: + if (!one_in_(3)) { + type = ACT_BO_ELEC_1; + } else if (!one_in_(5)) { + type = ACT_BA_ELEC_2; + } else { + type = ACT_BA_ELEC_3; + } + + chance = 101; + break; + + case BIAS_POIS: + type = ACT_BA_POIS_1; + chance = 101; + break; + + case BIAS_FIRE: + if (!one_in_(3)) { + type = ACT_BO_FIRE_1; + } else if (!one_in_(5)) { + type = ACT_BA_FIRE_1; + } else { + type = ACT_BA_FIRE_2; + } + + chance = 101; + break; + + case BIAS_COLD: + chance = 101; + if (!one_in_(3)) + type = ACT_BO_COLD_1; + else if (!one_in_(3)) + type = ACT_BA_COLD_1; + else if (!one_in_(3)) + type = ACT_BA_COLD_2; + else + type = ACT_BA_COLD_3; + break; + + case BIAS_CHAOS: + chance = 50; + if (one_in_(6)) + type = ACT_SUMMON_DEMON; + else + type = ACT_CALL_CHAOS; + break; + + case BIAS_PRIESTLY: + chance = 101; + + if (one_in_(13)) + type = ACT_CHARM_UNDEAD; + else if (one_in_(12)) + type = ACT_BANISH_EVIL; + else if (one_in_(11)) + type = ACT_DISP_EVIL; + else if (one_in_(10)) + type = ACT_PROT_EVIL; + else if (one_in_(9)) + type = ACT_CURE_1000; + else if (one_in_(8)) + type = ACT_CURE_700; + else if (one_in_(7)) + type = ACT_REST_ALL; + else if (one_in_(6)) + type = ACT_REST_EXP; + else + type = ACT_CURE_MW; + break; + + case BIAS_NECROMANTIC: + chance = 101; + if (one_in_(66)) + type = ACT_WRAITH; + else if (one_in_(13)) + type = ACT_DISP_GOOD; + else if (one_in_(9)) + type = ACT_MASS_GENO; + else if (one_in_(8)) + type = ACT_GENOCIDE; + else if (one_in_(13)) + type = ACT_SUMMON_UNDEAD; + else if (one_in_(9)) + type = ACT_DRAIN_2; + else if (one_in_(6)) + type = ACT_CHARM_UNDEAD; + else + type = ACT_DRAIN_1; + break; + + case BIAS_LAW: + chance = 101; + if (one_in_(8)) + type = ACT_BANISH_EVIL; + else if (one_in_(4)) + type = ACT_DISP_EVIL; + else + type = ACT_PROT_EVIL; + break; + + case BIAS_ROGUE: + chance = 101; + if (one_in_(50)) + type = ACT_SPEED; + else if (one_in_(4)) + type = ACT_SLEEP; + else if (one_in_(3)) + type = ACT_DETECT_ALL; + else if (one_in_(8)) + type = ACT_ID_FULL; + else + type = ACT_ID_PLAIN; + break; + + case BIAS_MAGE: + chance = 66; + if (one_in_(20)) + type = ACT_SUMMON_ELEMENTAL; + else if (one_in_(10)) + type = ACT_SUMMON_PHANTOM; + else if (one_in_(5)) + type = ACT_RUNE_EXPLO; + else + type = ACT_ESP; + break; + + case BIAS_WARRIOR: + chance = 80; + if (one_in_(100)) + type = ACT_INVULN; + else + type = ACT_BERSERK; + break; + + case BIAS_RANGER: + chance = 101; + if (one_in_(20)) + type = ACT_CHARM_ANIMALS; + else if (one_in_(7)) + type = ACT_SUMMON_ANIMAL; + else if (one_in_(6)) + type = ACT_CHARM_ANIMAL; + else if (one_in_(4)) + type = ACT_RESIST_ALL; + else if (one_in_(3)) + type = ACT_SATIATE; + else + type = ACT_CURE_POISON; + break; + } + + if (!type || (randint1(100) >= chance)) { + one_activation(o_ptr); + return; + } + + /* A type was chosen... */ + o_ptr->xtra2 = (byte)type; + add_flag(o_ptr->art_flags, TR_ACTIVATE); + o_ptr->timeout = 0; +} diff --git a/src/artifact/random-art-activation.h b/src/artifact/random-art-activation.h new file mode 100644 index 000000000..6fd292688 --- /dev/null +++ b/src/artifact/random-art-activation.h @@ -0,0 +1,5 @@ +#pragma once + +#include "system/angband.h" + +void give_activation_power(object_type *o_ptr); diff --git a/src/object-enchant/artifact.c b/src/object-enchant/artifact.c index 68615512a..260d1376d 100644 --- a/src/object-enchant/artifact.c +++ b/src/object-enchant/artifact.c @@ -10,6 +10,7 @@ */ #include "object-enchant/artifact.h" +#include "artifact/random-art-activation.h" #include "artifact/random-art-bias-types.h" #include "artifact/random-art-misc.h" #include "artifact/random-art-pval-investor.h" @@ -128,181 +129,6 @@ static void curse_artifact(player_type *player_ptr, object_type *o_ptr) } /*! - * @brief ランダムアーティファクト生成中、対象のオブジェクトにバイアスに依存した発動を与える。/ Add one activaton of randam artifact depend on bias. - * @details バイアスが無い場合、一部のバイアスの確率によっては one_ability() に処理が移行する。 - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return なし - */ -static void give_activation_power(object_type *o_ptr) -{ - int type = 0, chance = 0; - - switch (o_ptr->artifact_bias) { - case BIAS_ELEC: - if (!one_in_(3)) { - type = ACT_BO_ELEC_1; - } else if (!one_in_(5)) { - type = ACT_BA_ELEC_2; - } else { - type = ACT_BA_ELEC_3; - } - - chance = 101; - break; - - case BIAS_POIS: - type = ACT_BA_POIS_1; - chance = 101; - break; - - case BIAS_FIRE: - if (!one_in_(3)) { - type = ACT_BO_FIRE_1; - } else if (!one_in_(5)) { - type = ACT_BA_FIRE_1; - } else { - type = ACT_BA_FIRE_2; - } - - chance = 101; - break; - - case BIAS_COLD: - chance = 101; - if (!one_in_(3)) - type = ACT_BO_COLD_1; - else if (!one_in_(3)) - type = ACT_BA_COLD_1; - else if (!one_in_(3)) - type = ACT_BA_COLD_2; - else - type = ACT_BA_COLD_3; - break; - - case BIAS_CHAOS: - chance = 50; - if (one_in_(6)) - type = ACT_SUMMON_DEMON; - else - type = ACT_CALL_CHAOS; - break; - - case BIAS_PRIESTLY: - chance = 101; - - if (one_in_(13)) - type = ACT_CHARM_UNDEAD; - else if (one_in_(12)) - type = ACT_BANISH_EVIL; - else if (one_in_(11)) - type = ACT_DISP_EVIL; - else if (one_in_(10)) - type = ACT_PROT_EVIL; - else if (one_in_(9)) - type = ACT_CURE_1000; - else if (one_in_(8)) - type = ACT_CURE_700; - else if (one_in_(7)) - type = ACT_REST_ALL; - else if (one_in_(6)) - type = ACT_REST_EXP; - else - type = ACT_CURE_MW; - break; - - case BIAS_NECROMANTIC: - chance = 101; - if (one_in_(66)) - type = ACT_WRAITH; - else if (one_in_(13)) - type = ACT_DISP_GOOD; - else if (one_in_(9)) - type = ACT_MASS_GENO; - else if (one_in_(8)) - type = ACT_GENOCIDE; - else if (one_in_(13)) - type = ACT_SUMMON_UNDEAD; - else if (one_in_(9)) - type = ACT_DRAIN_2; - else if (one_in_(6)) - type = ACT_CHARM_UNDEAD; - else - type = ACT_DRAIN_1; - break; - - case BIAS_LAW: - chance = 101; - if (one_in_(8)) - type = ACT_BANISH_EVIL; - else if (one_in_(4)) - type = ACT_DISP_EVIL; - else - type = ACT_PROT_EVIL; - break; - - case BIAS_ROGUE: - chance = 101; - if (one_in_(50)) - type = ACT_SPEED; - else if (one_in_(4)) - type = ACT_SLEEP; - else if (one_in_(3)) - type = ACT_DETECT_ALL; - else if (one_in_(8)) - type = ACT_ID_FULL; - else - type = ACT_ID_PLAIN; - break; - - case BIAS_MAGE: - chance = 66; - if (one_in_(20)) - type = ACT_SUMMON_ELEMENTAL; - else if (one_in_(10)) - type = ACT_SUMMON_PHANTOM; - else if (one_in_(5)) - type = ACT_RUNE_EXPLO; - else - type = ACT_ESP; - break; - - case BIAS_WARRIOR: - chance = 80; - if (one_in_(100)) - type = ACT_INVULN; - else - type = ACT_BERSERK; - break; - - case BIAS_RANGER: - chance = 101; - if (one_in_(20)) - type = ACT_CHARM_ANIMALS; - else if (one_in_(7)) - type = ACT_SUMMON_ANIMAL; - else if (one_in_(6)) - type = ACT_CHARM_ANIMAL; - else if (one_in_(4)) - type = ACT_RESIST_ALL; - else if (one_in_(3)) - type = ACT_SATIATE; - else - type = ACT_CURE_POISON; - break; - } - - if (!type || (randint1(100) >= chance)) { - one_activation(o_ptr); - return; - } - - /* A type was chosen... */ - o_ptr->xtra2 = (byte)type; - add_flag(o_ptr->art_flags, TR_ACTIVATE); - o_ptr->timeout = 0; -} - -/*! * @brief ランダムアーティファクト生成中、対象のオブジェクトに名前を与える。/ Set name of randomartifact. * @details 確率によって、シンダリン銘、漢字銘、固定名のいずれか一つが与えられる。 * @param o_ptr 処理中のアイテム参照ポインタ -- 2.11.0