OSDN Git Service

Merge branch 'master' of git.osdn.net:/gitroot/hengband/hengband
[hengband/hengband.git] / src / artifact / random-art-pval-investor.c
index 48f1214..113be3d 100644 (file)
@@ -6,8 +6,8 @@
 
 #include "artifact/random-art-pval-investor.h"
 #include "artifact/random-art-bias-types.h"
-#include "object-hook/hook-weapon.h"
 #include "object-enchant/tr-types.h"
+#include "object-hook/hook-weapon.h"
 #include "sv-definition/sv-armor-types.h"
 #include "system/object-type-definition.h"
 #include "util/bit-flags-calculator.h"
@@ -57,6 +57,15 @@ static bool random_art_bias_constitution(object_type *o_ptr)
     return one_in_(2);
 }
 
+static bool random_art_bias_charisma(object_type *o_ptr)
+{
+    if (have_flag(o_ptr->art_flags, TR_CHR))
+        return FALSE;
+
+    add_flag(o_ptr->art_flags, TR_CHR);
+    return one_in_(2);
+}
+
 static bool random_art_bias_magic_mastery(object_type *o_ptr)
 {
     if ((o_ptr->tval != TV_GLOVES) || have_flag(o_ptr->art_flags, TR_MAGIC_MASTERY))
@@ -84,102 +93,59 @@ static bool random_art_bias_search(object_type *o_ptr)
     return one_in_(2);
 }
 
-/*!
- * @brief ランダムアーティファクト生成中、対象のオブジェクトにpval能力を付加する。/ Add one pval on generation of randam artifact.
- * @details 優先的に付加されるpvalがランダムアーティファクトバイアスに依存して存在する。
- * 原則的候補は腕力、知力、賢さ、器用さ、耐久、魅力、探索、隠密、赤外線視力、加速。武器のみ採掘、追加攻撃も候補に入る。
- * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
- * @param o_ptr 対象のオブジェクト構造体ポインタ
- * @return なし
- */
-void random_plus(object_type *o_ptr)
+static bool switch_random_art_bias(object_type *o_ptr)
 {
-    int this_type = object_is_weapon_ammo(o_ptr) ? 23 : 19;
     switch (o_ptr->artifact_bias) {
     case BIAS_WARRIOR:
-        if (random_art_bias_strength(o_ptr) || random_art_bias_constitution(o_ptr) || random_art_bias_dexterity(o_ptr))
-            return;
-
-        break;
+        return random_art_bias_strength(o_ptr) || random_art_bias_constitution(o_ptr) || random_art_bias_dexterity(o_ptr);
     case BIAS_MAGE:
-        if (random_art_bias_intelligence(o_ptr) || random_art_bias_magic_mastery(o_ptr))
-            return;
-
-        break;
-    case BIAS_PRIESTLY:
-        if (random_art_bias_wisdom(o_ptr))
-            return;
-
-        break;
+        return random_art_bias_intelligence(o_ptr) || random_art_bias_magic_mastery(o_ptr);
     case BIAS_RANGER:
-        if (random_art_bias_dexterity(o_ptr) || random_art_bias_constitution(o_ptr) || random_art_bias_strength(o_ptr))
-            return;
-
-        break;
-
+        return random_art_bias_dexterity(o_ptr) || random_art_bias_constitution(o_ptr) || random_art_bias_strength(o_ptr);
     case BIAS_ROGUE:
-        if (random_art_bias_stealth(o_ptr) || random_art_bias_search(o_ptr))
-            return;
-
-        break;
+        return random_art_bias_stealth(o_ptr) || random_art_bias_search(o_ptr);
     case BIAS_STR:
-        if (!(have_flag(o_ptr->art_flags, TR_STR))) {
-            add_flag(o_ptr->art_flags, TR_STR);
-            if (one_in_(2))
-                return;
-        }
-
-        break;
-    case BIAS_WIS:
-        if (!(have_flag(o_ptr->art_flags, TR_WIS))) {
-            add_flag(o_ptr->art_flags, TR_WIS);
-            if (one_in_(2))
-                return;
-        }
-
-        break;
+        return random_art_bias_strength(o_ptr);
     case BIAS_INT:
-        if (!(have_flag(o_ptr->art_flags, TR_INT))) {
-            add_flag(o_ptr->art_flags, TR_INT);
-            if (one_in_(2))
-                return;
-        }
-
-        break;
+        return random_art_bias_intelligence(o_ptr);
+    case BIAS_PRIESTLY:
+    case BIAS_WIS:
+        return random_art_bias_wisdom(o_ptr);
     case BIAS_DEX:
-        if (!(have_flag(o_ptr->art_flags, TR_DEX))) {
-            add_flag(o_ptr->art_flags, TR_DEX);
-            if (one_in_(2))
-                return;
-        }
-
-        break;
+        return random_art_bias_dexterity(o_ptr);
     case BIAS_CON:
-        if (!(have_flag(o_ptr->art_flags, TR_CON))) {
-            add_flag(o_ptr->art_flags, TR_CON);
-            if (one_in_(2))
-                return;
-        }
-
-        break;
+        return random_art_bias_constitution(o_ptr);
     case BIAS_CHR:
-        if (!(have_flag(o_ptr->art_flags, TR_CHR))) {
-            add_flag(o_ptr->art_flags, TR_CHR);
-            if (one_in_(2))
-                return;
-        }
-
-        break;
+        return random_art_bias_charisma(o_ptr);
+    default:
+        return FALSE;
     }
+}
 
-    if ((o_ptr->artifact_bias == BIAS_MAGE || o_ptr->artifact_bias == BIAS_PRIESTLY) && (o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_ROBE)) {
-        if (!(have_flag(o_ptr->art_flags, TR_DEC_MANA)) && one_in_(3)) {
-            add_flag(o_ptr->art_flags, TR_DEC_MANA);
-            if (one_in_(2))
-                return;
-        }
-    }
+static bool random_art_bias_decrease_mana(object_type *o_ptr)
+{
+    if (((o_ptr->artifact_bias != BIAS_MAGE) && (o_ptr->artifact_bias != BIAS_PRIESTLY)) || (o_ptr->tval != TV_SOFT_ARMOR) || (o_ptr->sval != SV_ROBE)
+        || have_flag(o_ptr->art_flags, TR_DEC_MANA) || !one_in_(3))
+        return FALSE;
+
+    add_flag(o_ptr->art_flags, TR_DEC_MANA);
+    return one_in_(2);
+}
+
+/*!
+ * @brief ランダムアーティファクト生成中、対象のオブジェクトにpval能力を付加する。/ Add one pval on generation of randam artifact.
+ * @details 優先的に付加されるpvalがランダムアーティファクトバイアスに依存して存在する。
+ * 原則的候補は腕力、知力、賢さ、器用さ、耐久、魅力、探索、隠密、赤外線視力、加速。武器のみ採掘、追加攻撃も候補に入る。
+ * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
+ * @param o_ptr 対象のオブジェクト構造体ポインタ
+ * @return なし
+ */
+void random_plus(object_type *o_ptr)
+{
+    if (switch_random_art_bias(o_ptr) || random_art_bias_decrease_mana(o_ptr))
+        return;
 
+    int this_type = object_is_weapon_ammo(o_ptr) ? 23 : 19;
     switch (randint1(this_type)) {
     case 1:
     case 2:
@@ -188,6 +154,7 @@ void random_plus(object_type *o_ptr)
             o_ptr->artifact_bias = BIAS_STR;
         else if (!o_ptr->artifact_bias && one_in_(7))
             o_ptr->artifact_bias = BIAS_WARRIOR;
+
         break;
     case 3:
     case 4:
@@ -196,6 +163,7 @@ void random_plus(object_type *o_ptr)
             o_ptr->artifact_bias = BIAS_INT;
         else if (!o_ptr->artifact_bias && one_in_(7))
             o_ptr->artifact_bias = BIAS_MAGE;
+
         break;
     case 5:
     case 6:
@@ -204,6 +172,7 @@ void random_plus(object_type *o_ptr)
             o_ptr->artifact_bias = BIAS_WIS;
         else if (!o_ptr->artifact_bias && one_in_(7))
             o_ptr->artifact_bias = BIAS_PRIESTLY;
+
         break;
     case 7:
     case 8:
@@ -212,6 +181,7 @@ void random_plus(object_type *o_ptr)
             o_ptr->artifact_bias = BIAS_DEX;
         else if (!o_ptr->artifact_bias && one_in_(7))
             o_ptr->artifact_bias = BIAS_ROGUE;
+
         break;
     case 9:
     case 10:
@@ -220,24 +190,28 @@ void random_plus(object_type *o_ptr)
             o_ptr->artifact_bias = BIAS_CON;
         else if (!o_ptr->artifact_bias && one_in_(9))
             o_ptr->artifact_bias = BIAS_RANGER;
+
         break;
     case 11:
     case 12:
         add_flag(o_ptr->art_flags, TR_CHR);
         if (!o_ptr->artifact_bias && !one_in_(13))
             o_ptr->artifact_bias = BIAS_CHR;
+
         break;
     case 13:
     case 14:
         add_flag(o_ptr->art_flags, TR_STEALTH);
         if (!o_ptr->artifact_bias && one_in_(3))
             o_ptr->artifact_bias = BIAS_ROGUE;
+
         break;
     case 15:
     case 16:
         add_flag(o_ptr->art_flags, TR_SEARCH);
         if (!o_ptr->artifact_bias && one_in_(9))
             o_ptr->artifact_bias = BIAS_RANGER;
+
         break;
     case 17:
     case 18:
@@ -247,6 +221,7 @@ void random_plus(object_type *o_ptr)
         add_flag(o_ptr->art_flags, TR_SPEED);
         if (!o_ptr->artifact_bias && one_in_(11))
             o_ptr->artifact_bias = BIAS_ROGUE;
+
         break;
     case 20:
     case 21:
@@ -254,14 +229,15 @@ void random_plus(object_type *o_ptr)
         break;
     case 22:
     case 23:
-        if (o_ptr->tval == TV_BOW)
+        if (o_ptr->tval == TV_BOW) {
             random_plus(o_ptr);
-        else {
-            add_flag(o_ptr->art_flags, TR_BLOWS);
-            if (!o_ptr->artifact_bias && one_in_(11))
-                o_ptr->artifact_bias = BIAS_WARRIOR;
+            break;
         }
 
+        add_flag(o_ptr->art_flags, TR_BLOWS);
+        if (!o_ptr->artifact_bias && one_in_(11))
+            o_ptr->artifact_bias = BIAS_WARRIOR;
+
         break;
     }
 }