OSDN Git Service

モンスター魔法「ユニークモンスター口寄せ」を追加。併せて使用するモンスターの追加、巨大サイバー以下略の使用魔法に追加、青魔法とものまねも追加。
[hengbandforosx/hengbandosx.git] / src / object-enchant / others / apply-magic-others.cpp
index e09e1c9..12be934 100644 (file)
@@ -9,6 +9,7 @@
 #include "artifact/random-art-generator.h"
 #include "game-option/cheat-options.h"
 #include "inventory/inventory-slot-types.h"
+#include "monster-floor/place-monster-types.h"
 #include "monster-race/monster-race-hook.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-indice-types.h"
@@ -49,7 +50,8 @@ OtherItemsEnchanter::OtherItemsEnchanter(PlayerType *player_ptr, ItemEntity *o_p
  */
 void OtherItemsEnchanter::apply_magic()
 {
-    switch (this->o_ptr->tval) {
+    const auto tval = this->o_ptr->bi_key.tval();
+    switch (tval) {
     case ItemKindType::FLASK:
         this->o_ptr->fuel = this->o_ptr->pval;
         this->o_ptr->pval = 0;
@@ -59,7 +61,7 @@ void OtherItemsEnchanter::apply_magic()
         this->enchant_wand_staff();
         break;
     case ItemKindType::ROD:
-        this->o_ptr->pval = baseitems_info[this->o_ptr->k_idx].pval;
+        this->o_ptr->pval = this->o_ptr->get_baseitem().pval;
         break;
     case ItemKindType::CAPTURE:
         this->o_ptr->pval = 0;
@@ -90,8 +92,8 @@ void OtherItemsEnchanter::apply_magic()
  */
 void OtherItemsEnchanter::enchant_wand_staff()
 {
-    auto *k_ptr = &baseitems_info[this->o_ptr->k_idx];
-    this->o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
+    const auto &baseitem = this->o_ptr->get_baseitem();
+    this->o_ptr->pval = baseitem.pval / 2 + randint1((baseitem.pval + 1) / 2);
 }
 
 /*
@@ -137,7 +139,7 @@ void OtherItemsEnchanter::generate_figurine()
  */
 void OtherItemsEnchanter::generate_corpse()
 {
-    const std::unordered_map<OBJECT_SUBTYPE_VALUE, MonsterDropType> match = {
+    const std::unordered_map<int, MonsterDropType> match = {
         { SV_SKELETON, MonsterDropType::DROP_SKELETON },
         { SV_CORPSE, MonsterDropType::DROP_CORPSE },
     };
@@ -146,10 +148,15 @@ void OtherItemsEnchanter::generate_corpse()
     auto *floor_ptr = this->player_ptr->current_floor_ptr;
     MonsterRaceId r_idx;
     while (true) {
-        r_idx = get_mon_num(this->player_ptr, 0, floor_ptr->dun_level, 0);
+        r_idx = get_mon_num(this->player_ptr, 0, floor_ptr->dun_level, PM_NONE);
         auto &r_ref = monraces_info[r_idx];
         auto check = (floor_ptr->dun_level < r_ref.level) ? (r_ref.level - floor_ptr->dun_level) : 0;
-        if ((r_ref.rarity == 0) || (match.find(o_ptr->sval) != match.end() && r_ref.drop_flags.has_not(match.at(o_ptr->sval))) || (randint0(check) > 0)) {
+        const auto sval = this->o_ptr->bi_key.sval();
+        if (!sval.has_value()) {
+            continue;
+        }
+
+        if ((r_ref.rarity == 0) || (match.find(sval.value()) != match.end() && r_ref.drop_flags.has_not(match.at(sval.value()))) || (randint0(check) > 0)) {
             continue;
         }
 
@@ -193,13 +200,13 @@ void OtherItemsEnchanter::generate_statue()
  */
 void OtherItemsEnchanter::generate_chest()
 {
-    auto obj_level = baseitems_info[this->o_ptr->k_idx].level;
+    auto obj_level = this->o_ptr->get_baseitem().level;
     if (obj_level <= 0) {
         return;
     }
 
     this->o_ptr->pval = randint1(obj_level);
-    if (this->o_ptr->sval == SV_CHEST_KANDUME) {
+    if (this->o_ptr->bi_key.sval() == SV_CHEST_KANDUME) {
         this->o_ptr->pval = 6;
     }