OSDN Git Service

[Fix] 天然生成のアーティファクトでXTRA_DICEが無効になる
authoriks <iks3@users.noreply.github.com>
Sun, 28 Mar 2021 15:55:42 +0000 (00:55 +0900)
committeriks <iks3@users.noreply.github.com>
Sun, 28 Mar 2021 15:55:42 +0000 (00:55 +0900)
src/artifact/fixed-art-generator.cpp
src/artifact/fixed-art-generator.h
src/object-enchant/apply-magic.cpp

index 708f5ae..b52385b 100644 (file)
@@ -15,6 +15,7 @@
 #include "floor/floor-object.h"
 #include "object-enchant/object-boost.h"
 #include "object-enchant/object-curse.h"
+#include "object-enchant/special-object-flags.h"
 #include "object-enchant/tr-types.h"
 #include "object-enchant/trc-types.h"
 #include "object-enchant/trg-types.h"
@@ -254,7 +255,6 @@ bool make_artifact(player_type *player_ptr, object_type *o_ptr)
             continue;
 
         o_ptr->name1 = i;
-        random_artifact_resistance(player_ptr, o_ptr, a_ptr);
         return TRUE;
     }
 
@@ -262,6 +262,50 @@ bool make_artifact(player_type *player_ptr, object_type *o_ptr)
 }
 
 /*!
+ * @brief make_artifact()で選択した固定アーティファクトをオブジェクトに割り当てる。
+ * @param player_ptr プレーヤーへの参照ポインタ
+ * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
+ * @return 適用したアーティファクト情報への参照ポインタ
+ */
+artifact_type *apply_artifact(player_type *player_ptr, object_type *o_ptr)
+{
+    artifact_type *a_ptr = &a_info[o_ptr->name1];
+    o_ptr->pval = a_ptr->pval;
+    o_ptr->ac = a_ptr->ac;
+    o_ptr->dd = a_ptr->dd;
+    o_ptr->ds = a_ptr->ds;
+    o_ptr->to_a = a_ptr->to_a;
+    o_ptr->to_h = a_ptr->to_h;
+    o_ptr->to_d = a_ptr->to_d;
+    o_ptr->weight = a_ptr->weight;
+    o_ptr->xtra2 = a_ptr->act_idx;
+    random_artifact_resistance(player_ptr, o_ptr, a_ptr);
+
+    if (o_ptr->name1 == ART_MILIM) {
+        if (player_ptr->pseikaku == PERSONALITY_SEXY) {
+            o_ptr->pval = 3;
+        }
+    }
+
+    if (!a_ptr->cost)
+        o_ptr->ident |= (IDENT_BROKEN);
+    if (a_ptr->gen_flags.has(TRG::CURSED))
+        o_ptr->curse_flags |= (TRC_CURSED);
+    if (a_ptr->gen_flags.has(TRG::HEAVY_CURSE))
+        o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
+    if (a_ptr->gen_flags.has(TRG::PERMA_CURSE))
+        o_ptr->curse_flags |= (TRC_PERMA_CURSE);
+    if (a_ptr->gen_flags.has(TRG::RANDOM_CURSE0))
+        o_ptr->curse_flags |= get_curse(player_ptr, 0, o_ptr);
+    if (a_ptr->gen_flags.has(TRG::RANDOM_CURSE1))
+        o_ptr->curse_flags |= get_curse(player_ptr, 1, o_ptr);
+    if (a_ptr->gen_flags.has(TRG::RANDOM_CURSE2))
+        o_ptr->curse_flags |= get_curse(player_ptr, 2, o_ptr);
+
+    return a_ptr;
+}
+
+/*!
  * @brief INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
  * Mega-Hack -- Attempt to create one of the "Special Objects"
  * @param player_ptr プレーヤーへの参照ポインタ
index b439d3d..829ef6e 100644 (file)
@@ -2,6 +2,8 @@
 
 #include "system/angband.h"
 
+struct artifact_type;
 bool create_named_art(player_type *player_ptr, ARTIFACT_IDX a_idx, POSITION y, POSITION x);
 bool make_artifact(player_type *player_ptr, object_type *o_ptr);
+artifact_type *apply_artifact(player_type *player_ptr, object_type *o_ptr);
 bool make_artifact_special(player_type *player_ptr, object_type *o_ptr);
index 9ae0e7c..ce46e02 100644 (file)
@@ -124,42 +124,10 @@ void apply_magic(player_type *owner_ptr, object_type *o_ptr, DEPTH lev, BIT_FLAG
     }
 
     if (object_is_fixed_artifact(o_ptr)) {
-        artifact_type *a_ptr = &a_info[o_ptr->name1];
+        artifact_type *a_ptr = apply_artifact(owner_ptr, o_ptr);
         a_ptr->cur_num = 1;
         if (current_world_ptr->character_dungeon)
             a_ptr->floor_id = owner_ptr->floor_id;
-
-        o_ptr->pval = a_ptr->pval;
-        o_ptr->ac = a_ptr->ac;
-        o_ptr->dd = a_ptr->dd;
-        o_ptr->ds = a_ptr->ds;
-        o_ptr->to_a = a_ptr->to_a;
-        o_ptr->to_h = a_ptr->to_h;
-        o_ptr->to_d = a_ptr->to_d;
-        o_ptr->weight = a_ptr->weight;
-        o_ptr->xtra2 = a_ptr->act_idx;
-
-        if (o_ptr->name1 == ART_MILIM) {
-            if (owner_ptr->pseikaku == PERSONALITY_SEXY) {
-                o_ptr->pval = 3;
-            }
-        }
-
-        if (!a_ptr->cost)
-            o_ptr->ident |= (IDENT_BROKEN);
-        if (a_ptr->gen_flags.has(TRG::CURSED))
-            o_ptr->curse_flags |= (TRC_CURSED);
-        if (a_ptr->gen_flags.has(TRG::HEAVY_CURSE))
-            o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
-        if (a_ptr->gen_flags.has(TRG::PERMA_CURSE))
-            o_ptr->curse_flags |= (TRC_PERMA_CURSE);
-        if (a_ptr->gen_flags.has(TRG::RANDOM_CURSE0))
-            o_ptr->curse_flags |= get_curse(owner_ptr, 0, o_ptr);
-        if (a_ptr->gen_flags.has(TRG::RANDOM_CURSE1))
-            o_ptr->curse_flags |= get_curse(owner_ptr, 1, o_ptr);
-        if (a_ptr->gen_flags.has(TRG::RANDOM_CURSE2))
-            o_ptr->curse_flags |= get_curse(owner_ptr, 2, o_ptr);
-
         return;
     }