OSDN Git Service

Merge pull request #2639 from Hourier/Adjust-Dropping-Artifact-Procedure
[hengbandforosx/hengbandosx.git] / src / monster-floor / monster-death.cpp
index 0074153..64e0e54 100644 (file)
@@ -1,5 +1,6 @@
 #include "monster-floor/monster-death.h"
 #include "artifact/fixed-art-generator.h"
+#include "artifact/fixed-art-types.h"
 #include "cmd-building/cmd-building.h"
 #include "core/player-redraw-types.h"
 #include "core/player-update-types.h"
@@ -154,19 +155,17 @@ static void drop_corpse(PlayerType *player_ptr, monster_death_type *md_ptr)
  * @param md_ptr モンスター死亡構造体への参照ポインタ
  * @return 何かドロップするならドロップしたアーティファクトのID、何もドロップしないなら0
  */
-static ARTIFACT_IDX drop_artifact_index(PlayerType *player_ptr, monster_death_type *md_ptr)
+static void drop_artifact_from_unique(PlayerType *player_ptr, monster_death_type *md_ptr)
 {
-    for (auto [a_idx, chance] : md_ptr->r_ptr->drop_artifacts) {
-        if ((randint0(100) >= chance) && !w_ptr->wizard) {
+    for (const auto &[a_idx, chance] : md_ptr->r_ptr->drop_artifacts) {
+        if (!w_ptr->wizard && (randint0(100) >= chance)) {
             continue;
         }
 
         if (drop_single_artifact(player_ptr, md_ptr, a_idx)) {
-            return a_idx;
+            return;
         }
     }
-
-    return 0;
 }
 
 /*!
@@ -176,65 +175,59 @@ static ARTIFACT_IDX drop_artifact_index(PlayerType *player_ptr, monster_death_ty
  * @param a_ix ドロップを試みるアーティファクトID
  * @return ドロップするならtrue
  */
-bool drop_single_artifact(PlayerType *player_ptr, monster_death_type *md_ptr, ARTIFACT_IDX a_idx)
+bool drop_single_artifact(PlayerType *player_ptr, monster_death_type *md_ptr, FixedArtifactId a_idx)
 {
-    auto *a_ptr = &a_info[a_idx];
-    if (a_ptr->is_generated) {
+    auto &a_ref = a_info.at(a_idx);
+    if (a_ref.is_generated) {
         return false;
     }
 
-    if (create_named_art(player_ptr, a_idx, md_ptr->md_y, md_ptr->md_x)) {
-        a_ptr->is_generated = true;
-
-        if (w_ptr->character_dungeon) {
-            a_ptr->floor_id = player_ptr->floor_id;
-        }
-
-        if (!preserve_mode) {
-            a_ptr->is_generated = true;
-        }
+    if (!create_named_art(player_ptr, a_idx, md_ptr->md_y, md_ptr->md_x)) {
+        return false;
+    }
 
-        return true;
+    if (w_ptr->character_dungeon) {
+        a_ref.floor_id = player_ptr->floor_id;
     }
-    return false;
+
+    return true;
 }
 
-static KIND_OBJECT_IDX drop_dungeon_final_artifact(PlayerType *player_ptr, monster_death_type *md_ptr, ARTIFACT_IDX a_idx)
+static KIND_OBJECT_IDX drop_dungeon_final_artifact(PlayerType *player_ptr, monster_death_type *md_ptr)
 {
-    auto k_idx = d_info[player_ptr->dungeon_idx].final_object != 0 ? d_info[player_ptr->dungeon_idx].final_object : lookup_kind(ItemKindType::SCROLL, SV_SCROLL_ACQUIREMENT);
-    if (d_info[player_ptr->dungeon_idx].final_artifact == 0) {
+    const auto &dungeon = d_info[player_ptr->dungeon_idx];
+    auto k_idx = dungeon.final_object != 0 ? dungeon.final_object : lookup_kind(ItemKindType::SCROLL, SV_SCROLL_ACQUIREMENT);
+    if (dungeon.final_artifact == FixedArtifactId::NONE) {
         return k_idx;
     }
 
-    a_idx = d_info[player_ptr->dungeon_idx].final_artifact;
-    auto *a_ptr = &a_info[a_idx];
-    if (a_ptr->is_generated) {
+    const auto a_idx = dungeon.final_artifact;
+    auto &a_ref = a_info.at(a_idx);
+    if (a_ref.is_generated) {
         return k_idx;
     }
+
     if (create_named_art(player_ptr, a_idx, md_ptr->md_y, md_ptr->md_x)) {
-        a_ptr->is_generated = true;
         if (w_ptr->character_dungeon) {
-            a_ptr->floor_id = player_ptr->floor_id;
+            a_ref.floor_id = player_ptr->floor_id;
         }
-    } else if (!preserve_mode) {
-        a_ptr->is_generated = true;
     }
 
-    return d_info[player_ptr->dungeon_idx].final_object ? k_idx : 0;
+    return dungeon.final_object ? k_idx : 0;
 }
 
-static void drop_artifact(PlayerType *player_ptr, monster_death_type *md_ptr)
+static void drop_artifacts(PlayerType *player_ptr, monster_death_type *md_ptr)
 {
     if (!md_ptr->drop_chosen_item) {
         return;
     }
 
-    ARTIFACT_IDX a_idx = drop_artifact_index(player_ptr, md_ptr);
+    drop_artifact_from_unique(player_ptr, md_ptr);
     if (((md_ptr->r_ptr->flags7 & RF7_GUARDIAN) == 0) || (d_info[player_ptr->dungeon_idx].final_guardian != md_ptr->m_ptr->r_idx)) {
         return;
     }
 
-    KIND_OBJECT_IDX k_idx = drop_dungeon_final_artifact(player_ptr, md_ptr, a_idx);
+    KIND_OBJECT_IDX k_idx = drop_dungeon_final_artifact(player_ptr, md_ptr);
     if (k_idx != 0) {
         ObjectType forge;
         auto *q_ptr = &forge;
@@ -423,7 +416,7 @@ void monster_death(PlayerType *player_ptr, MONSTER_IDX m_idx, bool drop_item, At
     monster_drop_carried_objects(player_ptr, md_ptr->m_ptr);
     decide_drop_quality(md_ptr);
     switch_special_death(player_ptr, md_ptr, attribute_flags);
-    drop_artifact(player_ptr, md_ptr);
+    drop_artifacts(player_ptr, md_ptr);
     int drop_numbers = decide_drop_numbers(player_ptr, md_ptr, drop_item);
     coin_type = md_ptr->force_coin;
     auto *floor_ptr = player_ptr->current_floor_ptr;