OSDN Git Service

[Refactor] 青魔法の失敗率の計算を共通化する
authorHabu <habu1010+github@gmail.com>
Fri, 1 Oct 2021 13:17:08 +0000 (22:17 +0900)
committerHabu <habu1010+github@gmail.com>
Fri, 1 Oct 2021 13:17:08 +0000 (22:17 +0900)
青魔法の失敗率の計算が魔法リスト一覧表示用と実際の使用時用で別々に実装
されている。シンプルに良くないので魔法リスト一覧表示用でリファクタリング
された関数を実際の使用時にも使用するようにする。
また、関数の先頭ですべての変数を宣言する悪しき習慣が残っていたので必要な
時になってからの宣言に変更しておく。

src/blue-magic/learnt-power-getter.cpp
src/blue-magic/learnt-power-getter.h
src/mind/mind-blue-mage.cpp

index 9eab51d..56204ab 100644 (file)
@@ -250,7 +250,7 @@ static bool switch_blue_magic_choice(char key, int &menu_line, const bluemage_da
  * @param need_mana 青魔法を使うのに必要なMP
  * @return int 失敗率(%)を返す
  */
-static int calculate_blue_magic_failure_probability(player_type *player_ptr, const monster_power &mp, int need_mana)
+int calculate_blue_magic_failure_probability(player_type *player_ptr, const monster_power &mp, int need_mana)
 {
     auto chance = mp.fail;
     if (player_ptr->lev > mp.level) {
index 4b0698a..b4740b5 100644 (file)
@@ -10,4 +10,6 @@
 
 enum class RF_ABILITY;
 struct player_type;
+struct monster_power;
+int calculate_blue_magic_failure_probability(player_type *player_ptr, const monster_power &mp, int need_mana);
 std::optional<RF_ABILITY> get_learned_power(player_type *player_ptr);
index c85e312..c570566 100644 (file)
  */
 bool do_cmd_cast_learned(player_type *player_ptr)
 {
-    PERCENTAGE chance;
-    PERCENTAGE minfail = 0;
-    PLAYER_LEVEL plev = player_ptr->lev;
-    monster_power spell;
-    bool cast;
-    MANA_POINT need_mana;
-
     if (cmd_limit_confused(player_ptr))
         return false;
 
@@ -46,8 +39,8 @@ bool do_cmd_cast_learned(player_type *player_ptr)
         return false;
     }
 
-    spell = monster_powers.at(selected_spell.value());
-    need_mana = mod_need_mana(player_ptr, spell.smana, 0, REALM_NONE);
+    const auto &spell = monster_powers.at(selected_spell.value());
+    const auto need_mana = mod_need_mana(player_ptr, spell.smana, 0, REALM_NONE);
     if (need_mana > player_ptr->csp) {
         msg_print(_("MPが足りません。", "You do not have enough mana to use this power."));
         if (!over_exert)
@@ -57,42 +50,22 @@ bool do_cmd_cast_learned(player_type *player_ptr)
             return false;
     }
 
-    chance = spell.fail;
-    if (plev > spell.level)
-        chance -= 3 * (plev - spell.level);
-    else
-        chance += (spell.level - plev);
-
-    chance -= 3 * (adj_mag_stat[player_ptr->stat_index[A_INT]] - 1);
-    chance = mod_spell_chance_1(player_ptr, chance);
-    if (need_mana > player_ptr->csp) {
-        chance += 5 * (need_mana - player_ptr->csp);
-    }
-
-    minfail = adj_mag_fail[player_ptr->stat_index[A_INT]];
-    if (chance < minfail)
-        chance = minfail;
+    const auto chance = calculate_blue_magic_failure_probability(player_ptr, spell, need_mana);
 
-    auto player_stun = player_ptr->effects()->stun();
-    chance += player_stun->get_magic_chance_penalty();
-    if (chance > 95) {
-        chance = 95;
-    }
-
-    chance = mod_spell_chance_2(player_ptr, chance);
     if (randint0(100) < chance) {
         if (flush_failure)
             flush();
 
         msg_print(_("魔法をうまく唱えられなかった。", "You failed to concentrate hard enough!"));
         sound(SOUND_FAIL);
-        if (RF_ABILITY_SUMMON_MASK.has(selected_spell.value()))
-            cast = cast_learned_spell(player_ptr, selected_spell.value(), false);
+        if (RF_ABILITY_SUMMON_MASK.has(selected_spell.value())) {
+            cast_learned_spell(player_ptr, selected_spell.value(), false);
+        }
     } else {
         sound(SOUND_ZAP);
-        cast = cast_learned_spell(player_ptr, selected_spell.value(), true);
-        if (!cast)
+        if (!cast_learned_spell(player_ptr, selected_spell.value(), true)) {
             return false;
+        }
     }
 
     if (need_mana <= player_ptr->csp) {