OSDN Git Service

[Refactor] #40561 Separated random-art-misc.c/h from artifact.c
authorHourier <hourier@users.sourceforge.jp>
Tue, 14 Jul 2020 09:19:55 +0000 (18:19 +0900)
committerHourier <hourier@users.sourceforge.jp>
Tue, 14 Jul 2020 09:19:55 +0000 (18:19 +0900)
Hengband/Hengband/Hengband.vcxproj
Hengband/Hengband/Hengband.vcxproj.filters
src/artifact/random-art-misc.c [new file with mode: 0644]
src/artifact/random-art-misc.h [new file with mode: 0644]
src/object-enchant/artifact.c

index ec58e97..a23a8cd 100644 (file)
     <ClCompile Include="..\..\src\action\travel-execution.c" />\r
     <ClCompile Include="..\..\src\action\tunnel-execution.c" />\r
     <ClCompile Include="..\..\src\action\weapon-shield.c" />\r
+    <ClCompile Include="..\..\src\artifact\random-art-misc.c" />\r
     <ClCompile Include="..\..\src\artifact\random-art-resistance.c" />\r
     <ClCompile Include="..\..\src\birth\auto-roller.c" />\r
     <ClCompile Include="..\..\src\birth\birth-body-spec.c" />\r
     <ClInclude Include="..\..\src\art-definition\art-sword-types.h" />\r
     <ClInclude Include="..\..\src\art-definition\art-weapon-types.h" />\r
     <ClInclude Include="..\..\src\art-definition\random-art-effects.h" />\r
+    <ClInclude Include="..\..\src\artifact\random-art-misc.h" />\r
     <ClInclude Include="..\..\src\artifact\random-art-resistance.h" />\r
     <ClInclude Include="..\..\src\birth\auto-roller.h" />\r
     <ClInclude Include="..\..\src\birth\birth-body-spec.h" />\r
index a4bcd73..58fb493 100644 (file)
     <ClCompile Include="..\..\src\artifact\random-art-resistance.c">
       <Filter>artifact</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\artifact\random-art-misc.c">
+      <Filter>artifact</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\src\combat\shoot.h">
     <ClInclude Include="..\..\src\artifact\random-art-resistance.h">
       <Filter>artifact</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\artifact\random-art-misc.h">
+      <Filter>artifact</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\..\src\wall.bmp" />
diff --git a/src/artifact/random-art-misc.c b/src/artifact/random-art-misc.c
new file mode 100644 (file)
index 0000000..0332202
--- /dev/null
@@ -0,0 +1,291 @@
+#include "artifact/random-art-misc.h"
+#include "artifact/random-art-bias-types.h"
+#include "object-enchant/tr-types.h"
+#include "object-hook/hook-armor.h"
+#include "system/object-type-definition.h"
+#include "util/bit-flags-calculator.h"
+
+/*!
+ * @brief ランダムアーティファクト生成中、対象のオブジェクトにその他特性を付加する。/ Add one misc flag on generation of randam artifact.
+ * @details 優先的に付加される耐性がランダムアーティファクトバイアスに依存して存在する。
+ * 原則的候補は各種能力維持、永久光源+1、麻痺知らず、経験値維持、浮遊、透明視、急回復、遅消化、
+ * 乱テレポート、反魔法、反テレポート、警告、テレパシー、各種ESP、一部装備に殺戮修正。
+ * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
+ * @param o_ptr 対象のオブジェクト構造体ポインタ
+ * @return なし
+ */
+void random_misc(player_type *player_ptr, object_type *o_ptr)
+{
+    switch (o_ptr->artifact_bias) {
+    case BIAS_RANGER:
+        if (!(have_flag(o_ptr->art_flags, TR_SUST_CON))) {
+            add_flag(o_ptr->art_flags, TR_SUST_CON);
+            if (one_in_(2))
+                return;
+        }
+
+        break;
+
+    case BIAS_STR:
+        if (!(have_flag(o_ptr->art_flags, TR_SUST_STR))) {
+            add_flag(o_ptr->art_flags, TR_SUST_STR);
+            if (one_in_(2))
+                return;
+        }
+
+        break;
+
+    case BIAS_WIS:
+        if (!(have_flag(o_ptr->art_flags, TR_SUST_WIS))) {
+            add_flag(o_ptr->art_flags, TR_SUST_WIS);
+            if (one_in_(2))
+                return;
+        }
+
+        break;
+
+    case BIAS_INT:
+        if (!(have_flag(o_ptr->art_flags, TR_SUST_INT))) {
+            add_flag(o_ptr->art_flags, TR_SUST_INT);
+            if (one_in_(2))
+                return;
+        }
+
+        break;
+
+    case BIAS_DEX:
+        if (!(have_flag(o_ptr->art_flags, TR_SUST_DEX))) {
+            add_flag(o_ptr->art_flags, TR_SUST_DEX);
+            if (one_in_(2))
+                return;
+        }
+
+        break;
+
+    case BIAS_CON:
+        if (!(have_flag(o_ptr->art_flags, TR_SUST_CON))) {
+            add_flag(o_ptr->art_flags, TR_SUST_CON);
+            if (one_in_(2))
+                return;
+        }
+
+        break;
+
+    case BIAS_CHR:
+        if (!(have_flag(o_ptr->art_flags, TR_SUST_CHR))) {
+            add_flag(o_ptr->art_flags, TR_SUST_CHR);
+            if (one_in_(2))
+                return;
+        }
+
+        break;
+
+    case BIAS_CHAOS:
+        if (!(have_flag(o_ptr->art_flags, TR_TELEPORT))) {
+            add_flag(o_ptr->art_flags, TR_TELEPORT);
+            if (one_in_(2))
+                return;
+        }
+
+        break;
+
+    case BIAS_FIRE:
+        if (!(have_flag(o_ptr->art_flags, TR_LITE_1))) {
+            add_flag(o_ptr->art_flags, TR_LITE_1); /* Freebie */
+        }
+
+        break;
+    }
+
+    switch (randint1(33)) {
+    case 1:
+        add_flag(o_ptr->art_flags, TR_SUST_STR);
+        if (!o_ptr->artifact_bias)
+            o_ptr->artifact_bias = BIAS_STR;
+        break;
+    case 2:
+        add_flag(o_ptr->art_flags, TR_SUST_INT);
+        if (!o_ptr->artifact_bias)
+            o_ptr->artifact_bias = BIAS_INT;
+        break;
+    case 3:
+        add_flag(o_ptr->art_flags, TR_SUST_WIS);
+        if (!o_ptr->artifact_bias)
+            o_ptr->artifact_bias = BIAS_WIS;
+        break;
+    case 4:
+        add_flag(o_ptr->art_flags, TR_SUST_DEX);
+        if (!o_ptr->artifact_bias)
+            o_ptr->artifact_bias = BIAS_DEX;
+        break;
+    case 5:
+        add_flag(o_ptr->art_flags, TR_SUST_CON);
+        if (!o_ptr->artifact_bias)
+            o_ptr->artifact_bias = BIAS_CON;
+        break;
+    case 6:
+        add_flag(o_ptr->art_flags, TR_SUST_CHR);
+        if (!o_ptr->artifact_bias)
+            o_ptr->artifact_bias = BIAS_CHR;
+        break;
+    case 7:
+    case 8:
+    case 14:
+        add_flag(o_ptr->art_flags, TR_FREE_ACT);
+        break;
+    case 9:
+        add_flag(o_ptr->art_flags, TR_HOLD_EXP);
+        if (!o_ptr->artifact_bias && one_in_(5))
+            o_ptr->artifact_bias = BIAS_PRIESTLY;
+        else if (!o_ptr->artifact_bias && one_in_(6))
+            o_ptr->artifact_bias = BIAS_NECROMANTIC;
+        break;
+    case 10:
+    case 11:
+        add_flag(o_ptr->art_flags, TR_LITE_1);
+        break;
+    case 12:
+    case 13:
+        add_flag(o_ptr->art_flags, TR_LEVITATION);
+        break;
+    case 15:
+    case 16:
+    case 17:
+        add_flag(o_ptr->art_flags, TR_SEE_INVIS);
+        break;
+    case 19:
+    case 20:
+        add_flag(o_ptr->art_flags, TR_SLOW_DIGEST);
+        break;
+    case 21:
+    case 22:
+        add_flag(o_ptr->art_flags, TR_REGEN);
+        break;
+    case 23:
+        add_flag(o_ptr->art_flags, TR_TELEPORT);
+        break;
+    case 24:
+    case 25:
+    case 26:
+        if (object_is_armour(player_ptr, o_ptr))
+            random_misc(player_ptr, o_ptr);
+        else {
+            o_ptr->to_a = 4 + randint1(11);
+        }
+
+        break;
+    case 27:
+    case 28:
+    case 29: {
+        HIT_PROB bonus_h;
+        HIT_POINT bonus_d;
+        add_flag(o_ptr->art_flags, TR_SHOW_MODS);
+        bonus_h = 4 + (HIT_PROB)(randint1(11));
+        bonus_d = 4 + (HIT_POINT)(randint1(11));
+        if ((o_ptr->tval != TV_SWORD) && (o_ptr->tval != TV_POLEARM) && (o_ptr->tval != TV_HAFTED) && (o_ptr->tval != TV_DIGGING) && (o_ptr->tval != TV_GLOVES)
+            && (o_ptr->tval != TV_RING)) {
+            bonus_h /= 2;
+            bonus_d /= 2;
+        }
+        o_ptr->to_h += bonus_h;
+        o_ptr->to_d += bonus_d;
+        break;
+    }
+    case 30:
+        add_flag(o_ptr->art_flags, TR_NO_MAGIC);
+        break;
+    case 31:
+        add_flag(o_ptr->art_flags, TR_NO_TELE);
+        break;
+    case 32:
+        add_flag(o_ptr->art_flags, TR_WARNING);
+        break;
+
+    case 18:
+        switch (randint1(3)) {
+        case 1:
+            add_flag(o_ptr->art_flags, TR_ESP_EVIL);
+            if (!o_ptr->artifact_bias && one_in_(3))
+                o_ptr->artifact_bias = BIAS_LAW;
+            break;
+        case 2:
+            add_flag(o_ptr->art_flags, TR_ESP_NONLIVING);
+            if (!o_ptr->artifact_bias && one_in_(3))
+                o_ptr->artifact_bias = BIAS_MAGE;
+            break;
+        case 3:
+            add_flag(o_ptr->art_flags, TR_TELEPATHY);
+            if (!o_ptr->artifact_bias && one_in_(9))
+                o_ptr->artifact_bias = BIAS_MAGE;
+            break;
+        }
+
+        break;
+
+    case 33: {
+        int idx[3];
+        int n = randint1(3);
+
+        idx[0] = randint1(10);
+
+        idx[1] = randint1(9);
+        if (idx[1] >= idx[0])
+            idx[1]++;
+
+        idx[2] = randint1(8);
+        if (idx[2] >= idx[0])
+            idx[2]++;
+        if (idx[2] >= idx[1])
+            idx[2]++;
+
+        while (n--) {
+            switch (idx[n]) {
+            case 1:
+                add_flag(o_ptr->art_flags, TR_ESP_ANIMAL);
+                if (!o_ptr->artifact_bias && one_in_(4))
+                    o_ptr->artifact_bias = BIAS_RANGER;
+                break;
+            case 2:
+                add_flag(o_ptr->art_flags, TR_ESP_UNDEAD);
+                if (!o_ptr->artifact_bias && one_in_(3))
+                    o_ptr->artifact_bias = BIAS_PRIESTLY;
+                else if (!o_ptr->artifact_bias && one_in_(6))
+                    o_ptr->artifact_bias = BIAS_NECROMANTIC;
+                break;
+            case 3:
+                add_flag(o_ptr->art_flags, TR_ESP_DEMON);
+                break;
+            case 4:
+                add_flag(o_ptr->art_flags, TR_ESP_ORC);
+                break;
+            case 5:
+                add_flag(o_ptr->art_flags, TR_ESP_TROLL);
+                break;
+            case 6:
+                add_flag(o_ptr->art_flags, TR_ESP_GIANT);
+                break;
+            case 7:
+                add_flag(o_ptr->art_flags, TR_ESP_DRAGON);
+                break;
+            case 8:
+                add_flag(o_ptr->art_flags, TR_ESP_HUMAN);
+                if (!o_ptr->artifact_bias && one_in_(6))
+                    o_ptr->artifact_bias = BIAS_ROGUE;
+                break;
+            case 9:
+                add_flag(o_ptr->art_flags, TR_ESP_GOOD);
+                if (!o_ptr->artifact_bias && one_in_(3))
+                    o_ptr->artifact_bias = BIAS_LAW;
+                break;
+            case 10:
+                add_flag(o_ptr->art_flags, TR_ESP_UNIQUE);
+                if (!o_ptr->artifact_bias && one_in_(3))
+                    o_ptr->artifact_bias = BIAS_LAW;
+                break;
+            }
+
+            break;
+        }
+    }
+    }
+}
diff --git a/src/artifact/random-art-misc.h b/src/artifact/random-art-misc.h
new file mode 100644 (file)
index 0000000..174495a
--- /dev/null
@@ -0,0 +1,5 @@
+#pragma once
+
+#include "system/angband.h"
+
+void random_misc(player_type *player_ptr, object_type *o_ptr);
index 85167f1..7f5ec9b 100644 (file)
@@ -11,6 +11,7 @@
 
 #include "object-enchant/artifact.h"
 #include "artifact/random-art-bias-types.h"
+#include "artifact/random-art-misc.h"
 #include "artifact/random-art-pval-investor.h"
 #include "artifact/random-art-resistance.h"
 #include "art-definition/art-armor-types.h"
@@ -126,291 +127,6 @@ static void curse_artifact(player_type *player_ptr, object_type *o_ptr)
 }
 
 /*!
- * @brief ランダムアーティファクト生成中、対象のオブジェクトにその他特性を付加する。/ Add one misc flag on generation of randam artifact.
- * @details 優先的に付加される耐性がランダムアーティファクトバイアスに依存して存在する。
- * 原則的候補は各種能力維持、永久光源+1、麻痺知らず、経験値維持、浮遊、透明視、急回復、遅消化、
- * 乱テレポート、反魔法、反テレポート、警告、テレパシー、各種ESP、一部装備に殺戮修正。
- * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
- * @param o_ptr 対象のオブジェクト構造体ポインタ
- * @return なし
- */
-static void random_misc(player_type *player_ptr, object_type *o_ptr)
-{
-    switch (o_ptr->artifact_bias) {
-    case BIAS_RANGER:
-        if (!(have_flag(o_ptr->art_flags, TR_SUST_CON))) {
-            add_flag(o_ptr->art_flags, TR_SUST_CON);
-            if (one_in_(2))
-                return;
-        }
-
-        break;
-
-    case BIAS_STR:
-        if (!(have_flag(o_ptr->art_flags, TR_SUST_STR))) {
-            add_flag(o_ptr->art_flags, TR_SUST_STR);
-            if (one_in_(2))
-                return;
-        }
-
-        break;
-
-    case BIAS_WIS:
-        if (!(have_flag(o_ptr->art_flags, TR_SUST_WIS))) {
-            add_flag(o_ptr->art_flags, TR_SUST_WIS);
-            if (one_in_(2))
-                return;
-        }
-
-        break;
-
-    case BIAS_INT:
-        if (!(have_flag(o_ptr->art_flags, TR_SUST_INT))) {
-            add_flag(o_ptr->art_flags, TR_SUST_INT);
-            if (one_in_(2))
-                return;
-        }
-
-        break;
-
-    case BIAS_DEX:
-        if (!(have_flag(o_ptr->art_flags, TR_SUST_DEX))) {
-            add_flag(o_ptr->art_flags, TR_SUST_DEX);
-            if (one_in_(2))
-                return;
-        }
-
-        break;
-
-    case BIAS_CON:
-        if (!(have_flag(o_ptr->art_flags, TR_SUST_CON))) {
-            add_flag(o_ptr->art_flags, TR_SUST_CON);
-            if (one_in_(2))
-                return;
-        }
-
-        break;
-
-    case BIAS_CHR:
-        if (!(have_flag(o_ptr->art_flags, TR_SUST_CHR))) {
-            add_flag(o_ptr->art_flags, TR_SUST_CHR);
-            if (one_in_(2))
-                return;
-        }
-
-        break;
-
-    case BIAS_CHAOS:
-        if (!(have_flag(o_ptr->art_flags, TR_TELEPORT))) {
-            add_flag(o_ptr->art_flags, TR_TELEPORT);
-            if (one_in_(2))
-                return;
-        }
-
-        break;
-
-    case BIAS_FIRE:
-        if (!(have_flag(o_ptr->art_flags, TR_LITE_1))) {
-            add_flag(o_ptr->art_flags, TR_LITE_1); /* Freebie */
-        }
-
-        break;
-    }
-
-    switch (randint1(33)) {
-    case 1:
-        add_flag(o_ptr->art_flags, TR_SUST_STR);
-        if (!o_ptr->artifact_bias)
-            o_ptr->artifact_bias = BIAS_STR;
-        break;
-    case 2:
-        add_flag(o_ptr->art_flags, TR_SUST_INT);
-        if (!o_ptr->artifact_bias)
-            o_ptr->artifact_bias = BIAS_INT;
-        break;
-    case 3:
-        add_flag(o_ptr->art_flags, TR_SUST_WIS);
-        if (!o_ptr->artifact_bias)
-            o_ptr->artifact_bias = BIAS_WIS;
-        break;
-    case 4:
-        add_flag(o_ptr->art_flags, TR_SUST_DEX);
-        if (!o_ptr->artifact_bias)
-            o_ptr->artifact_bias = BIAS_DEX;
-        break;
-    case 5:
-        add_flag(o_ptr->art_flags, TR_SUST_CON);
-        if (!o_ptr->artifact_bias)
-            o_ptr->artifact_bias = BIAS_CON;
-        break;
-    case 6:
-        add_flag(o_ptr->art_flags, TR_SUST_CHR);
-        if (!o_ptr->artifact_bias)
-            o_ptr->artifact_bias = BIAS_CHR;
-        break;
-    case 7:
-    case 8:
-    case 14:
-        add_flag(o_ptr->art_flags, TR_FREE_ACT);
-        break;
-    case 9:
-        add_flag(o_ptr->art_flags, TR_HOLD_EXP);
-        if (!o_ptr->artifact_bias && one_in_(5))
-            o_ptr->artifact_bias = BIAS_PRIESTLY;
-        else if (!o_ptr->artifact_bias && one_in_(6))
-            o_ptr->artifact_bias = BIAS_NECROMANTIC;
-        break;
-    case 10:
-    case 11:
-        add_flag(o_ptr->art_flags, TR_LITE_1);
-        break;
-    case 12:
-    case 13:
-        add_flag(o_ptr->art_flags, TR_LEVITATION);
-        break;
-    case 15:
-    case 16:
-    case 17:
-        add_flag(o_ptr->art_flags, TR_SEE_INVIS);
-        break;
-    case 19:
-    case 20:
-        add_flag(o_ptr->art_flags, TR_SLOW_DIGEST);
-        break;
-    case 21:
-    case 22:
-        add_flag(o_ptr->art_flags, TR_REGEN);
-        break;
-    case 23:
-        add_flag(o_ptr->art_flags, TR_TELEPORT);
-        break;
-    case 24:
-    case 25:
-    case 26:
-        if (object_is_armour(player_ptr, o_ptr))
-            random_misc(player_ptr, o_ptr);
-        else {
-            o_ptr->to_a = 4 + randint1(11);
-        }
-
-        break;
-    case 27:
-    case 28:
-    case 29: {
-        HIT_PROB bonus_h;
-        HIT_POINT bonus_d;
-        add_flag(o_ptr->art_flags, TR_SHOW_MODS);
-        bonus_h = 4 + (HIT_PROB)(randint1(11));
-        bonus_d = 4 + (HIT_POINT)(randint1(11));
-        if ((o_ptr->tval != TV_SWORD) && (o_ptr->tval != TV_POLEARM) && (o_ptr->tval != TV_HAFTED) && (o_ptr->tval != TV_DIGGING) && (o_ptr->tval != TV_GLOVES)
-            && (o_ptr->tval != TV_RING)) {
-            bonus_h /= 2;
-            bonus_d /= 2;
-        }
-        o_ptr->to_h += bonus_h;
-        o_ptr->to_d += bonus_d;
-        break;
-    }
-    case 30:
-        add_flag(o_ptr->art_flags, TR_NO_MAGIC);
-        break;
-    case 31:
-        add_flag(o_ptr->art_flags, TR_NO_TELE);
-        break;
-    case 32:
-        add_flag(o_ptr->art_flags, TR_WARNING);
-        break;
-
-    case 18:
-        switch (randint1(3)) {
-        case 1:
-            add_flag(o_ptr->art_flags, TR_ESP_EVIL);
-            if (!o_ptr->artifact_bias && one_in_(3))
-                o_ptr->artifact_bias = BIAS_LAW;
-            break;
-        case 2:
-            add_flag(o_ptr->art_flags, TR_ESP_NONLIVING);
-            if (!o_ptr->artifact_bias && one_in_(3))
-                o_ptr->artifact_bias = BIAS_MAGE;
-            break;
-        case 3:
-            add_flag(o_ptr->art_flags, TR_TELEPATHY);
-            if (!o_ptr->artifact_bias && one_in_(9))
-                o_ptr->artifact_bias = BIAS_MAGE;
-            break;
-        }
-
-        break;
-
-    case 33: {
-        int idx[3];
-        int n = randint1(3);
-
-        idx[0] = randint1(10);
-
-        idx[1] = randint1(9);
-        if (idx[1] >= idx[0])
-            idx[1]++;
-
-        idx[2] = randint1(8);
-        if (idx[2] >= idx[0])
-            idx[2]++;
-        if (idx[2] >= idx[1])
-            idx[2]++;
-
-        while (n--) {
-            switch (idx[n]) {
-            case 1:
-                add_flag(o_ptr->art_flags, TR_ESP_ANIMAL);
-                if (!o_ptr->artifact_bias && one_in_(4))
-                    o_ptr->artifact_bias = BIAS_RANGER;
-                break;
-            case 2:
-                add_flag(o_ptr->art_flags, TR_ESP_UNDEAD);
-                if (!o_ptr->artifact_bias && one_in_(3))
-                    o_ptr->artifact_bias = BIAS_PRIESTLY;
-                else if (!o_ptr->artifact_bias && one_in_(6))
-                    o_ptr->artifact_bias = BIAS_NECROMANTIC;
-                break;
-            case 3:
-                add_flag(o_ptr->art_flags, TR_ESP_DEMON);
-                break;
-            case 4:
-                add_flag(o_ptr->art_flags, TR_ESP_ORC);
-                break;
-            case 5:
-                add_flag(o_ptr->art_flags, TR_ESP_TROLL);
-                break;
-            case 6:
-                add_flag(o_ptr->art_flags, TR_ESP_GIANT);
-                break;
-            case 7:
-                add_flag(o_ptr->art_flags, TR_ESP_DRAGON);
-                break;
-            case 8:
-                add_flag(o_ptr->art_flags, TR_ESP_HUMAN);
-                if (!o_ptr->artifact_bias && one_in_(6))
-                    o_ptr->artifact_bias = BIAS_ROGUE;
-                break;
-            case 9:
-                add_flag(o_ptr->art_flags, TR_ESP_GOOD);
-                if (!o_ptr->artifact_bias && one_in_(3))
-                    o_ptr->artifact_bias = BIAS_LAW;
-                break;
-            case 10:
-                add_flag(o_ptr->art_flags, TR_ESP_UNIQUE);
-                if (!o_ptr->artifact_bias && one_in_(3))
-                    o_ptr->artifact_bias = BIAS_LAW;
-                break;
-            }
-
-            break;
-        }
-    }
-    }
-}
-
-/*!
  * @brief ランダムアーティファクト生成中、対象のオブジェクトにスレイ効果を付加する。/ Add one slaying on generation of randam artifact.
  * @details 優先的に付加される耐性がランダムアーティファクトバイアスに依存して存在する。
  * 原則的候補は強力射、高速射、混沌効果、吸血効果、祝福、投擲しやすい、焼棄、凍結、電撃、溶解、毒殺、