OSDN Git Service

Merge pull request #2429 from habu1010/feature/vector-dungeon-r_char
[hengbandforosx/hengbandosx.git] / src / info-reader / dungeon-reader.cpp
index 98b6754..b401a35 100644 (file)
@@ -20,8 +20,9 @@
  */
 static bool grab_one_dungeon_flag(dungeon_type *d_ptr, std::string_view what)
 {
-    if (EnumClassFlagGroup<DungeonFeatureType>::grab_one_flag(d_ptr->flags, d_info_flags, what))
+    if (EnumClassFlagGroup<DungeonFeatureType>::grab_one_flag(d_ptr->flags, d_info_flags, what)) {
         return true;
+    }
 
     msg_format(_("未知のダンジョン・フラグ '%s'。", "Unknown dungeon type flag '%s'."), what.data());
     return false;
@@ -56,10 +57,6 @@ static bool grab_one_basic_monster_flag(dungeon_type *d_ptr, std::string_view wh
         return true;
     }
 
-    if (info_grab_one_flag(d_ptr->mflags9, r_info_flags9, what)) {
-        return true;
-    }
-
     if (EnumClassFlagGroup<MonsterResistanceType>::grab_one_flag(d_ptr->mon_resistance_flags, r_info_flagsr, what)) {
         return true;
     }
@@ -76,6 +73,14 @@ static bool grab_one_basic_monster_flag(dungeon_type *d_ptr, std::string_view wh
         return true;
     }
 
+    if (EnumClassFlagGroup<MonsterDropType>::grab_one_flag(d_ptr->mon_drop_flags, r_info_drop_flags, what)) {
+        return true;
+    }
+
+    if (EnumClassFlagGroup<MonsterWildernessType>::grab_one_flag(d_ptr->mon_wilderness_flags, r_info_wilderness_flags, what)) {
+        return true;
+    }
+
     msg_format(_("未知のモンスター・フラグ '%s'。", "Unknown monster flag '%s'."), what.data());
     return false;
 }
@@ -89,8 +94,9 @@ static bool grab_one_basic_monster_flag(dungeon_type *d_ptr, std::string_view wh
  */
 static bool grab_one_spell_monster_flag(dungeon_type *d_ptr, std::string_view what)
 {
-    if (EnumClassFlagGroup<MonsterAbilityType>::grab_one_flag(d_ptr->mon_ability_flags, r_info_ability_flags, what))
+    if (EnumClassFlagGroup<MonsterAbilityType>::grab_one_flag(d_ptr->mon_ability_flags, r_info_ability_flags, what)) {
         return true;
+    }
 
     msg_format(_("未知のモンスター・フラグ '%s'。", "Unknown monster flag '%s'."), what.data());
     return false;
@@ -110,12 +116,14 @@ errr parse_d_info(std::string_view buf, angband_header *)
 
     if (tokens[0] == "N") {
         // N:index:name_ja
-        if (tokens.size() < 3 || tokens[1].size() == 0)
+        if (tokens.size() < 3 || tokens[1].size() == 0) {
             return PARSE_ERROR_TOO_FEW_ARGUMENTS;
+        }
 
         auto i = std::stoi(tokens[1]);
-        if (i < error_idx)
+        if (i < error_idx) {
             return PARSE_ERROR_NON_SEQUENTIAL_RECORDS;
+        }
         if (i >= static_cast<int>(d_info.size())) {
             d_info.resize(i + 1);
         }
@@ -126,27 +134,31 @@ errr parse_d_info(std::string_view buf, angband_header *)
 #ifdef JP
         d_ptr->name = tokens[2];
 #endif
-    } else if (!d_ptr)
+    } else if (!d_ptr) {
         return PARSE_ERROR_MISSING_RECORD_HEADER;
-    else if (tokens[0] == "E") {
+    else if (tokens[0] == "E") {
         // E:name_en
 #ifndef JP
-        if (tokens.size() < 2 || tokens[1].size() == 0)
+        if (tokens.size() < 2 || tokens[1].size() == 0) {
             return PARSE_ERROR_TOO_FEW_ARGUMENTS;
+        }
         d_ptr->name = tokens[1];
 #endif
     } else if (tokens[0] == "D") {
         // D:text_ja
         // D:$text_en
-        if (tokens.size() < 2 || tokens[1].size() == 0)
+        if (tokens.size() < 2 || tokens[1].size() == 0) {
             return PARSE_ERROR_TOO_FEW_ARGUMENTS;
+        }
 #ifdef JP
-        if (tokens[1][0] == '$')
+        if (tokens[1][0] == '$') {
             return PARSE_ERROR_NONE;
+        }
         d_ptr->text.append(buf.substr(2));
 #else
-        if (tokens[1][0] != '$')
+        if (tokens[1][0] != '$') {
             return PARSE_ERROR_NONE;
+        }
         append_english_text(d_ptr->text, buf.substr(3));
 #endif
     } else if (tokens[0] == "W") {
@@ -156,8 +168,9 @@ errr parse_d_info(std::string_view buf, angband_header *)
         // (3)maximum probability of level boost of allocation monster
         // (4)maximum probability of dropping good objects
         // (5)maximum probability of dropping great objects
-        if (tokens.size() < 11)
+        if (tokens.size() < 11) {
             return PARSE_ERROR_TOO_FEW_ARGUMENTS;
+        }
 
         info_set_value(d_ptr->mindepth, tokens[1]);
         info_set_value(d_ptr->maxdepth, tokens[2]);
@@ -171,22 +184,25 @@ errr parse_d_info(std::string_view buf, angband_header *)
         info_set_value(d_ptr->nest, tokens[10], 16);
     } else if (tokens[0] == "P") {
         // P:wild_y:wild_x
-        if (tokens.size() < 3)
+        if (tokens.size() < 3) {
             return PARSE_ERROR_TOO_FEW_ARGUMENTS;
+        }
 
         info_set_value(d_ptr->dy, tokens[1]);
         info_set_value(d_ptr->dx, tokens[2]);
     } else if (tokens[0] == "L") {
         // L:floor_1:prob_1:floor_2:prob_2:floor_3:prob_3:tunnel_prob
-        if (tokens.size() < DUNGEON_FEAT_PROB_NUM * 2 + 2)
+        if (tokens.size() < DUNGEON_FEAT_PROB_NUM * 2 + 2) {
             return PARSE_ERROR_TOO_FEW_ARGUMENTS;
+        }
 
         for (size_t i = 0; i < DUNGEON_FEAT_PROB_NUM; i++) {
             auto feat_idx = i * 2 + 1;
             auto per_idx = feat_idx + 1;
             d_ptr->floor[i].feat = f_tag_to_index(tokens[feat_idx]);
-            if (d_ptr->floor[i].feat < 0)
+            if (d_ptr->floor[i].feat < 0) {
                 return PARSE_ERROR_UNDEFINED_TERRAIN_TAG;
+            }
 
             info_set_value(d_ptr->floor[i].percent, tokens[per_idx]);
         }
@@ -195,44 +211,52 @@ errr parse_d_info(std::string_view buf, angband_header *)
         info_set_value(d_ptr->tunnel_percent, tokens[tunnel_idx]);
     } else if (tokens[0] == "A") {
         // A:wall_1:prob_1:wall_2:prob_2:wall_3:prob_3:outer_wall:inner_wall:stream_1:stream_2
-        if (tokens.size() < DUNGEON_FEAT_PROB_NUM * 2 + 5)
+        if (tokens.size() < DUNGEON_FEAT_PROB_NUM * 2 + 5) {
             return PARSE_ERROR_TOO_FEW_ARGUMENTS;
+        }
 
         for (int i = 0; i < DUNGEON_FEAT_PROB_NUM; i++) {
             auto feat_idx = i * 2 + 1;
             auto prob_idx = feat_idx + 1;
             d_ptr->fill[i].feat = f_tag_to_index(tokens[feat_idx]);
-            if (d_ptr->fill[i].feat < 0)
+            if (d_ptr->fill[i].feat < 0) {
                 return PARSE_ERROR_UNDEFINED_TERRAIN_TAG;
+            }
 
             info_set_value(d_ptr->fill[i].percent, tokens[prob_idx]);
         }
 
         auto idx = DUNGEON_FEAT_PROB_NUM * 2 + 1;
         d_ptr->outer_wall = f_tag_to_index(tokens[idx++]);
-        if (d_ptr->outer_wall < 0)
+        if (d_ptr->outer_wall < 0) {
             return PARSE_ERROR_UNDEFINED_TERRAIN_TAG;
+        }
 
         d_ptr->inner_wall = f_tag_to_index(tokens[idx++]);
-        if (d_ptr->inner_wall < 0)
+        if (d_ptr->inner_wall < 0) {
             return PARSE_ERROR_UNDEFINED_TERRAIN_TAG;
+        }
 
         d_ptr->stream1 = f_tag_to_index(tokens[idx++]);
-        if (d_ptr->stream1 < 0)
+        if (d_ptr->stream1 < 0) {
             return PARSE_ERROR_UNDEFINED_TERRAIN_TAG;
+        }
 
         d_ptr->stream2 = f_tag_to_index(tokens[idx]);
-        if (d_ptr->stream2 < 0)
+        if (d_ptr->stream2 < 0) {
             return PARSE_ERROR_UNDEFINED_TERRAIN_TAG;
+        }
     } else if (tokens[0] == "F") {
         // F:flags
-        if (tokens.size() < 2)
+        if (tokens.size() < 2) {
             return PARSE_ERROR_TOO_FEW_ARGUMENTS;
+        }
 
         const auto &flags = str_split(tokens[1], '|', true);
         for (const auto &f : flags) {
-            if (f.size() == 0)
+            if (f.size() == 0) {
                 continue;
+            }
 
             const auto &f_tokens = str_split(f, '_');
             if (f_tokens.size() == 3) {
@@ -254,53 +278,59 @@ errr parse_d_info(std::string_view buf, angband_header *)
                 }
             }
 
-            if (!grab_one_dungeon_flag(d_ptr, f))
+            if (!grab_one_dungeon_flag(d_ptr, f)) {
                 return PARSE_ERROR_INVALID_FLAG;
+            }
         }
     } else if (tokens[0] == "M") {
         // M:monsterflags
-        if (tokens.size() < 2)
+        if (tokens.size() < 2) {
             return PARSE_ERROR_TOO_FEW_ARGUMENTS;
+        }
 
         const auto &flags = str_split(tokens[1], '|', true);
         for (const auto &f : flags) {
-            if (f.size() == 0)
+            if (f.size() == 0) {
                 continue;
+            }
 
             const auto &m_tokens = str_split(f, '_');
             if (m_tokens[0] == "R" && m_tokens[1] == "CHAR") {
-                if (m_tokens[2].size() > 4)
-                    return PARSE_ERROR_GENERIC;
-
-                strcpy(d_ptr->r_char, m_tokens[2].c_str());
+                d_ptr->r_chars.insert(d_ptr->r_chars.end(), m_tokens[2].begin(), m_tokens[2].end());
                 continue;
             }
 
-            if (!grab_one_basic_monster_flag(d_ptr, f))
+            if (!grab_one_basic_monster_flag(d_ptr, f)) {
                 return PARSE_ERROR_INVALID_FLAG;
+            }
         }
     } else if (tokens[0] == "S") {
         // S: flags
-        if (tokens.size() < 2)
+        if (tokens.size() < 2) {
             return PARSE_ERROR_TOO_FEW_ARGUMENTS;
+        }
 
         const auto &flags = str_split(tokens[1], '|', true);
         for (const auto &f : flags) {
-            if (f.size() == 0)
+            if (f.size() == 0) {
                 continue;
+            }
 
             const auto &s_tokens = str_split(f, '_');
             if (s_tokens.size() == 3 && s_tokens[1] == "IN") {
-                if (s_tokens[0] != "1")
+                if (s_tokens[0] != "1") {
                     return PARSE_ERROR_GENERIC;
+                }
                 continue; //!< r_info.txtからのコピペ対策
             }
 
-            if (!grab_one_spell_monster_flag(d_ptr, f))
+            if (!grab_one_spell_monster_flag(d_ptr, f)) {
                 return PARSE_ERROR_INVALID_FLAG;
+            }
         }
-    } else
+    } else {
         return PARSE_ERROR_UNDEFINED_DIRECTIVE;
+    }
 
     return 0;
 }