OSDN Git Service

[Feature] *_infoのname、text、tagをstd::stringにする
authoriks <iks3@users.noreply.github.com>
Sat, 27 Mar 2021 06:53:49 +0000 (15:53 +0900)
committeriks <iks3@users.noreply.github.com>
Sat, 27 Mar 2021 13:35:38 +0000 (22:35 +0900)
テキストをかき集めたchar *は不要になる
rawファイルを廃止してtxtから直接データを読む(バージョニングを気にしなくて済む)

94 files changed:
src/action/activation-execution.cpp
src/action/movement-execution.cpp
src/action/open-close-execution.cpp
src/action/tunnel-execution.cpp
src/artifact/fixed-art-generator.cpp
src/autopick/autopick-entry.cpp
src/cmd-action/cmd-move.cpp
src/cmd-action/cmd-open-close.cpp
src/cmd-action/cmd-pet.cpp
src/cmd-io/cmd-lore.cpp
src/cmd-item/cmd-magiceat.cpp
src/cmd-visual/cmd-visuals.cpp
src/core/hp-mp-processor.cpp
src/dungeon/dungeon-processor.cpp
src/dungeon/dungeon.cpp
src/dungeon/dungeon.h
src/dungeon/quest.cpp
src/effect/effect-feature.cpp
src/flavor/flavor-util.cpp
src/flavor/named-item-describer.cpp
src/flavor/object-flavor.cpp
src/flavor/tval-description-switcher.cpp
src/floor/floor-util.cpp
src/grid/feature.cpp
src/grid/feature.h
src/info-reader/artifact-reader.cpp
src/info-reader/dungeon-reader.cpp
src/info-reader/ego-reader.cpp
src/info-reader/feature-reader.cpp
src/info-reader/general-parser.cpp
src/info-reader/info-reader-util.cpp
src/info-reader/info-reader-util.h
src/info-reader/kind-reader.cpp
src/info-reader/race-reader.cpp
src/info-reader/vault-reader.cpp
src/io-dump/character-dump.cpp
src/io-dump/special-class-dump.cpp
src/io/write-diary.cpp
src/knowledge/knowledge-features.cpp
src/knowledge/knowledge-items.cpp
src/knowledge/knowledge-monsters.cpp
src/knowledge/knowledge-quests.cpp
src/knowledge/knowledge-uniques.cpp
src/load/load-v1-5-0.cpp
src/lore/monster-lore.cpp
src/main/angband-headers.h
src/main/angband-initializer.cpp
src/main/info-initializer.cpp
src/main/info-initializer.h
src/market/arena.cpp
src/market/bounty.cpp
src/market/building-monster.cpp
src/market/building-quest.cpp
src/monster-floor/monster-death.cpp
src/monster-floor/one-monster-placer.cpp
src/monster-race/monster-race.cpp
src/monster-race/monster-race.h
src/monster/monster-describer.cpp
src/monster/monster-status.cpp
src/mutation/mutation-techniques.cpp
src/object-activation/activation-others.cpp
src/object-enchant/apply-magic-others.cpp
src/object-enchant/object-ego.cpp
src/object-enchant/object-ego.h
src/object-hook/hook-quest.cpp
src/object/object-kind.cpp
src/object/object-kind.h
src/perception/identification.cpp
src/player/eldritch-horror.cpp
src/player/player-class.h
src/player/player-damage.cpp
src/player/player-skill.h
src/room/rooms-pit-nest.cpp
src/room/rooms-trap.cpp
src/room/rooms-vault.cpp
src/room/rooms-vault.h
src/spell-kind/spells-sight.cpp
src/spell-kind/spells-world.cpp
src/store/purchase-order.cpp
src/store/rumor.cpp
src/system/artifact-type-definition.cpp
src/system/artifact-type-definition.h
src/system/monster-race-definition.h
src/target/target-describer.cpp
src/view/display-lore-status.cpp
src/view/display-lore.cpp
src/view/display-store.cpp
src/window/display-sub-windows.cpp
src/wizard/fixed-artifacts-spoiler.cpp
src/wizard/monster-info-spoiler.cpp
src/wizard/wizard-game-modifier.cpp
src/wizard/wizard-item-modifier.cpp
src/wizard/wizard-spoiler.cpp
src/world/world-turn-processor.cpp

index 7190522..6e13359 100644 (file)
@@ -132,7 +132,7 @@ static bool check_activation_conditions(player_type *user_ptr, ae_type *ae_ptr)
  */
 static bool activate_artifact(player_type *user_ptr, object_type *o_ptr)
 {
-    concptr name = k_name + k_info[o_ptr->k_idx].name;
+    concptr name = k_info[o_ptr->k_idx].name.c_str();
     const activation_type *const act_ptr = find_activation_info(user_ptr, o_ptr);
     if (!act_ptr) {
         msg_print("Activation information is not found.");
index 6f228ae..9c2de66 100644 (file)
@@ -200,17 +200,17 @@ void exe_movement(player_type *creature_ptr, DIRECTION dir, bool do_pickup, bool
             /* Allow moving */
         } else if (has_flag(f_ptr->flags, FF_WATER) && !(riding_r_ptr->flags7 & RF7_AQUATIC)
             && (has_flag(f_ptr->flags, FF_DEEP) || (riding_r_ptr->flags2 & RF2_AURA_FIRE))) {
-            msg_format(_("%sの上に行けない。", "Can't swim."), f_name + f_info[get_feat_mimic(g_ptr)].name);
+            msg_format(_("%sの上に行けない。", "Can't swim."), f_info[get_feat_mimic(g_ptr)].name.c_str());
             free_turn(creature_ptr);
             can_move = FALSE;
             disturb(creature_ptr, FALSE, TRUE);
         } else if (!has_flag(f_ptr->flags, FF_WATER) && (riding_r_ptr->flags7 & RF7_AQUATIC)) {
-            msg_format(_("%sから上がれない。", "Can't land."), f_name + f_info[get_feat_mimic(&floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name);
+            msg_format(_("%sから上がれない。", "Can't land."), f_info[get_feat_mimic(&floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name.c_str());
             free_turn(creature_ptr);
             can_move = FALSE;
             disturb(creature_ptr, FALSE, TRUE);
         } else if (has_flag(f_ptr->flags, FF_LAVA) && !(riding_r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)) {
-            msg_format(_("%sの上に行けない。", "Too hot to go through."), f_name + f_info[get_feat_mimic(g_ptr)].name);
+            msg_format(_("%sの上に行けない。", "Too hot to go through."), f_info[get_feat_mimic(g_ptr)].name.c_str());
             free_turn(creature_ptr);
             can_move = FALSE;
             disturb(creature_ptr, FALSE, TRUE);
@@ -227,7 +227,7 @@ void exe_movement(player_type *creature_ptr, DIRECTION dir, bool do_pickup, bool
 
     if (!can_move) {
     } else if (!has_flag(f_ptr->flags, FF_MOVE) && has_flag(f_ptr->flags, FF_CAN_FLY) && !creature_ptr->levitation) {
-        msg_format(_("空を飛ばないと%sの上には行けない。", "You need to fly to go through the %s."), f_name + f_info[get_feat_mimic(g_ptr)].name);
+        msg_format(_("空を飛ばないと%sの上には行けない。", "You need to fly to go through the %s."), f_info[get_feat_mimic(g_ptr)].name.c_str());
         free_turn(creature_ptr);
         creature_ptr->running = 0;
         can_move = FALSE;
@@ -242,7 +242,7 @@ void exe_movement(player_type *creature_ptr, DIRECTION dir, bool do_pickup, bool
     } else if (!p_can_enter && !p_can_kill_walls) {
         FEAT_IDX feat = get_feat_mimic(g_ptr);
         feature_type *mimic_f_ptr = &f_info[feat];
-        concptr name = f_name + mimic_f_ptr->name;
+        concptr name = mimic_f_ptr->name.c_str();
         can_move = FALSE;
         if (!(g_ptr->info & CAVE_MARK) && !player_can_see_bold(creature_ptr, y, x)) {
             if (boundary_floor(g_ptr, f_ptr, mimic_f_ptr))
index 55787ae..0672c62 100644 (file)
@@ -38,7 +38,7 @@ bool exe_open(player_type *creature_ptr, POSITION y, POSITION x)
     feature_type *f_ptr = &f_info[g_ptr->feat];
     take_turn(creature_ptr, 100);
     if (!has_flag(f_ptr->flags, FF_OPEN)) {
-        msg_format(_("%sはがっちりと閉じられているようだ。", "The %s appears to be stuck."), f_name + f_info[get_feat_mimic(g_ptr)].name);
+        msg_format(_("%sはがっちりと閉じられているようだ。", "The %s appears to be stuck."), f_info[get_feat_mimic(g_ptr)].name.c_str());
         return FALSE;
     }
 
@@ -134,7 +134,7 @@ bool easy_open_door(player_type *creature_ptr, POSITION y, POSITION x)
         return FALSE;
 
     if (!has_flag(f_ptr->flags, FF_OPEN)) {
-        msg_format(_("%sはがっちりと閉じられているようだ。", "The %s appears to be stuck."), f_name + f_info[get_feat_mimic(g_ptr)].name);
+        msg_format(_("%sはがっちりと閉じられているようだ。", "The %s appears to be stuck."), f_info[get_feat_mimic(g_ptr)].name.c_str());
     } else if (f_ptr->power) {
         i = creature_ptr->skill_dis;
         if (creature_ptr->blind || no_lite(creature_ptr))
@@ -241,7 +241,7 @@ bool exe_disarm(player_type *creature_ptr, POSITION y, POSITION x, DIRECTION dir
 {
     grid_type *g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
     feature_type *f_ptr = &f_info[g_ptr->feat];
-    concptr name = (f_name + f_ptr->name);
+    concptr name = f_ptr->name.c_str();
     int power = f_ptr->power;
     bool more = FALSE;
     int i = creature_ptr->skill_dis;
@@ -296,7 +296,7 @@ bool exe_bash(player_type *creature_ptr, POSITION y, POSITION x, DIRECTION dir)
     int bash = adj_str_blow[creature_ptr->stat_index[A_STR]];
     int temp = f_ptr->power;
     bool more = FALSE;
-    concptr name = f_name + f_info[get_feat_mimic(g_ptr)].name;
+    concptr name = f_info[get_feat_mimic(g_ptr)].name.c_str();
     take_turn(creature_ptr, 100);
     msg_format(_("%sに体当たりをした!", "You smash into the %s!"), name);
     temp = (bash - (temp * 10));
index 4765ce6..a397027 100644 (file)
@@ -60,7 +60,7 @@ bool exe_tunnel(player_type *creature_ptr, POSITION y, POSITION x)
     f_ptr = &f_info[g_ptr->feat];
     power = f_ptr->power;
     mimic_f_ptr = &f_info[get_feat_mimic(g_ptr)];
-    name = f_name + mimic_f_ptr->name;
+    name = mimic_f_ptr->name.c_str();
     sound(SOUND_DIG);
     if (has_flag(f_ptr->flags, FF_PERMANENT)) {
         if (has_flag(mimic_f_ptr->flags, FF_PERMANENT))
index db1f47c..708f5ae 100644 (file)
@@ -179,7 +179,7 @@ static void invest_curse_to_fixed_artifact(player_type *player_ptr, artifact_typ
 bool create_named_art(player_type *player_ptr, ARTIFACT_IDX a_idx, POSITION y, POSITION x)
 {
     artifact_type *a_ptr = &a_info[a_idx];
-    if (!a_ptr->name)
+    if (a_ptr->name.empty())
         return FALSE;
 
     KIND_OBJECT_IDX i = lookup_kind(a_ptr->tval, a_ptr->sval);
@@ -226,7 +226,7 @@ bool make_artifact(player_type *player_ptr, object_type *o_ptr)
 
     for (ARTIFACT_IDX i = 0; i < max_a_idx; i++) {
         artifact_type *a_ptr = &a_info[i];
-        if (!a_ptr->name)
+        if (a_ptr->name.empty())
             continue;
 
         if (a_ptr->cur_num)
@@ -291,7 +291,7 @@ bool make_artifact_special(player_type *player_ptr, object_type *o_ptr)
         artifact_type *a_ptr = &a_info[i];
 
         /*! @note アーティファクト名が空の不正なデータは除外する / Skip "empty" artifacts */
-        if (!a_ptr->name)
+        if (a_ptr->name.empty())
             continue;
 
         /*! @note 既に生成回数がカウントされたアーティファクト、QUESTITEMと非INSTA_ARTは除外 / Cannot make an artifact twice */
index fbe9d94..b8c011d 100644 (file)
@@ -346,10 +346,10 @@ void autopick_entry_from_object(player_type *player_ptr, autopick_type *entry, o
                 ego_item_type *e_ptr = &e_info[o_ptr->name2];
 #ifdef JP
                 /* エゴ銘には「^」マークが使える */
-                sprintf(name_str, "^%s", e_name + e_ptr->name);
+                sprintf(name_str, "^%s", e_ptr->name.c_str());
 #else
                 /* We ommit the basename and cannot use the ^ mark */
-                strcpy(name_str, e_name + e_ptr->name);
+                strcpy(name_str, e_ptr->name.c_str());
 #endif
                 name = FALSE;
                 if (!object_is_rare(o_ptr))
index 638d9f5..68f161a 100644 (file)
@@ -224,7 +224,7 @@ void do_cmd_go_down(player_type *creature_ptr)
         }
 
         if (!max_dlv[target_dungeon]) {
-            msg_format(_("ここには%sの入り口(%d階相当)があります", "There is the entrance of %s (Danger level: %d)"), d_name + d_info[target_dungeon].name,
+            msg_format(_("ここには%sの入り口(%d階相当)があります", "There is the entrance of %s (Danger level: %d)"), d_info[target_dungeon].name.c_str(),
                 d_info[target_dungeon].mindepth);
             if (!get_check(_("本当にこのダンジョンに入りますか?", "Do you really get in this dungeon? ")))
                 return;
@@ -261,7 +261,7 @@ void do_cmd_go_down(player_type *creature_ptr)
         msg_print(_("わざと落とし戸に落ちた。", "You deliberately jump through the trap door."));
     } else {
         if (target_dungeon) {
-            msg_format(_("%sへ入った。", "You entered %s."), d_text + d_info[creature_ptr->dungeon_idx].text);
+            msg_format(_("%sへ入った。", "You entered %s."), d_info[creature_ptr->dungeon_idx].text.c_str());
         } else {
             if (is_echizen(creature_ptr))
                 msg_print(_("なんだこの階段は!", "What's this STAIRWAY!"));
index 07e95e7..f822fe8 100644 (file)
@@ -361,7 +361,7 @@ void do_cmd_spike(player_type *creature_ptr)
         do_cmd_attack(creature_ptr, y, x, HISSATSU_NONE);
     } else {
         take_turn(creature_ptr, 100);
-        msg_format(_("%sにくさびを打ち込んだ。", "You jam the %s with a spike."), f_name + f_info[feat].name);
+        msg_format(_("%sにくさびを打ち込んだ。", "You jam the %s with a spike."), f_info[feat].name.c_str());
         cave_alter_feat(creature_ptr, y, x, FF_SPIKE);
         vary_item(creature_ptr, item, -1);
     }
index a8b6ef0..bb95c8b 100644 (file)
@@ -255,7 +255,7 @@ bool do_cmd_riding(player_type *creature_ptr, bool force)
             /* Feature code (applying "mimic" field) */
             feature_type *f_ptr = &f_info[get_feat_mimic(g_ptr)];
 #ifdef JP
-            msg_format("そのモンスターは%sの%sにいる。", f_name + f_ptr->name,
+            msg_format("そのモンスターは%sの%sにいる。", f_ptr->name.c_str(),
                 ((!has_flag(f_ptr->flags, FF_MOVE) && !has_flag(f_ptr->flags, FF_CAN_FLY))
                     || (!has_flag(f_ptr->flags, FF_LOS) && !has_flag(f_ptr->flags, FF_TREE)))
                     ? "中"
@@ -266,7 +266,7 @@ bool do_cmd_riding(player_type *creature_ptr, bool force)
                     || (!has_flag(f_ptr->flags, FF_LOS) && !has_flag(f_ptr->flags, FF_TREE)))
                     ? "in"
                     : "on",
-                f_name + f_ptr->name);
+                f_ptr->name.c_str());
 #endif
 
             return FALSE;
@@ -408,12 +408,12 @@ void do_cmd_pet(player_type *creature_ptr)
 #ifdef JP
     sprintf(target_buf, "ペットのターゲットを指定 (現在:%s)",
         (creature_ptr->pet_t_m_idx
-                ? (creature_ptr->image ? "何か奇妙な物" : (r_name + r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->pet_t_m_idx].ap_r_idx].name))
+                ? (creature_ptr->image ? "何か奇妙な物" : r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->pet_t_m_idx].ap_r_idx].name.c_str())
                 : "指定なし"));
 #else
     sprintf(target_buf, "specify a target of pet (now:%s)",
         (creature_ptr->pet_t_m_idx ? (
-             creature_ptr->image ? "something strange" : (r_name + r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->pet_t_m_idx].ap_r_idx].name))
+             creature_ptr->image ? "something strange" : r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->pet_t_m_idx].ap_r_idx].name.c_str())
                                    : "nothing"));
 #endif
     power_desc[num] = target_buf;
index 49cc7ca..4b9a781 100644 (file)
@@ -118,16 +118,16 @@ void do_cmd_query_symbol(player_type *creature_ptr)
             }
 
 #ifdef JP
-            strcpy(temp2, r_name + r_ptr->E_name);
+            strcpy(temp2, r_ptr->E_name.c_str());
 #else
-            strcpy(temp2, r_name + r_ptr->name);
+            strcpy(temp2, r_ptr->name.c_str());
 #endif
             for (xx = 0; temp2[xx] && xx < MAX_MONSTER_NAME; xx++)
                 if (isupper(temp2[xx]))
                     temp2[xx] = (char)tolower(temp2[xx]);
 
 #ifdef JP
-            if (angband_strstr(temp2, temp) || angband_strstr(r_name + r_ptr->name, temp))
+            if (angband_strstr(temp2, temp) || angband_strstr(r_ptr->name.c_str(), temp))
 #else
             if (angband_strstr(temp2, temp))
 #endif
index 475069a..1fcbb79 100644 (file)
@@ -301,7 +301,7 @@ static OBJECT_SUBTYPE_VALUE select_magic_eater(player_type *creature_ptr, bool o
                                        {
                                                strcat(dummy, format(
                                                               _(" %-22.22s 充填:%2d/%2d%3d%%", " %-22.22s   (%2d/%2d) %3d%%"),
-                                                              k_name + k_info[k_idx].name
+                                                              k_info[k_idx].name.c_str()
                                                               creature_ptr->magic_num1[ctr+ext] ? 
                                                               (creature_ptr->magic_num1[ctr+ext] - 1) / (EATER_ROD_CHARGE * k_info[k_idx].pval) +1 : 0, 
                                                               creature_ptr->magic_num2[ctr+ext], chance));
@@ -309,7 +309,7 @@ static OBJECT_SUBTYPE_VALUE select_magic_eater(player_type *creature_ptr, bool o
                                        }
                                        else
                                        {
-                                               strcat(dummy, format(" %-22.22s    %2d/%2d %3d%%", k_name + k_info[k_idx].name, (s16b)(creature_ptr->magic_num1[ctr+ext]/EATER_CHARGE), creature_ptr->magic_num2[ctr+ext], chance));
+                                               strcat(dummy, format(" %-22.22s    %2d/%2d %3d%%", k_info[k_idx].name.c_str(), (s16b)(creature_ptr->magic_num1[ctr+ext]/EATER_CHARGE), creature_ptr->magic_num2[ctr+ext], chance));
                                                if (creature_ptr->magic_num1[ctr+ext] < EATER_CHARGE) col = TERM_RED;
                                        }
                                }
@@ -454,7 +454,7 @@ static OBJECT_SUBTYPE_VALUE select_magic_eater(player_type *creature_ptr, bool o
                                char tmp_val[160];
 
                                /* Prompt */
-                               (void) strnfmt(tmp_val, 78, _("%sを使いますか? ", "Use %s?"), k_name + k_info[lookup_kind(tval ,i)].name);
+                               (void) strnfmt(tmp_val, 78, _("%sを使いますか? ", "Use %s?"), k_info[lookup_kind(tval ,i)].name.c_str());
 
                                /* Belay that order */
                                if (!get_check(tmp_val)) continue;
@@ -493,7 +493,7 @@ static OBJECT_SUBTYPE_VALUE select_magic_eater(player_type *creature_ptr, bool o
                        term_erase(7, 21, 255);
                        term_erase(7, 20, 255);
 
-                       shape_buffer(k_text + k_info[lookup_kind(tval, i)].text, 62, temp, sizeof(temp));
+                       shape_buffer(k_info[lookup_kind(tval, i)].text.c_str(), 62, temp, sizeof(temp));
                        for (j = 0, line = 21; temp[j]; j += 1 + strlen(&temp[j]))
                        {
                                prt(&temp[j], line, 10);
index 0288fbc..0c12683 100644 (file)
@@ -119,10 +119,10 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
             auto_dump_printf(auto_dump_stream, _("\n# モンスターの[色/文字]の設定\n\n", "\n# Monster attr/char definitions\n\n"));
             for (i = 0; i < max_r_idx; i++) {
                 monster_race *r_ptr = &r_info[i];
-                if (!r_ptr->name)
+                if (r_ptr->name.empty())
                     continue;
 
-                auto_dump_printf(auto_dump_stream, "# %s\n", (r_name + r_ptr->name));
+                auto_dump_printf(auto_dump_stream, "# %s\n", r_ptr->name.c_str());
                 auto_dump_printf(auto_dump_stream, "R:%d:0x%02X/0x%02X\n\n", i, (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
             }
 
@@ -146,7 +146,7 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
             for (KIND_OBJECT_IDX k_idx = 0; k_idx < max_k_idx; k_idx++) {
                 GAME_TEXT o_name[MAX_NLEN];
                 object_kind *k_ptr = &k_info[k_idx];
-                if (!k_ptr->name)
+                if (k_ptr->name.empty())
                     continue;
 
                 if (!k_ptr->flavor) {
@@ -180,12 +180,12 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
             auto_dump_printf(auto_dump_stream, _("\n# 地形の[色/文字]の設定\n\n", "\n# Feature attr/char definitions\n\n"));
             for (i = 0; i < max_f_idx; i++) {
                 feature_type *f_ptr = &f_info[i];
-                if (!f_ptr->name)
+                if (f_ptr->name.empty())
                     continue;
                 if (f_ptr->mimic != i)
                     continue;
 
-                auto_dump_printf(auto_dump_stream, "# %s\n", (f_name + f_ptr->name));
+                auto_dump_printf(auto_dump_stream, "# %s\n", (f_ptr->name.c_str()));
                 auto_dump_printf(auto_dump_stream, "F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", i, (byte)(f_ptr->x_attr[F_LIT_STANDARD]),
                     (byte)(f_ptr->x_char[F_LIT_STANDARD]), (byte)(f_ptr->x_attr[F_LIT_LITE]), (byte)(f_ptr->x_char[F_LIT_LITE]),
                     (byte)(f_ptr->x_attr[F_LIT_DARK]), (byte)(f_ptr->x_char[F_LIT_DARK]));
@@ -209,7 +209,7 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
                 TERM_COLOR ca = r_ptr->x_attr;
                 byte cc = r_ptr->x_char;
 
-                term_putstr(5, 17, -1, TERM_WHITE, format(_("モンスター = %d, 名前 = %-40.40s", "Monster = %d, Name = %-40.40s"), r, (r_name + r_ptr->name)));
+                term_putstr(5, 17, -1, TERM_WHITE, format(_("モンスター = %d, 名前 = %-40.40s", "Monster = %d, Name = %-40.40s"), r, r_ptr->name.c_str()));
                 term_putstr(10, 19, -1, TERM_WHITE, format(_("初期値  色 / 文字 = %3u / %3u", "Default attr/char = %3u / %3u"), da, dc));
                 term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
                 term_queue_bigchar(43, 19, da, dc, 0, 0);
@@ -236,7 +236,7 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
                             r = prev_r;
                             break;
                         }
-                    } while (!r_info[r].name);
+                    } while (r_info[r].name.empty());
                 }
 
                 break;
@@ -278,7 +278,7 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
 
                 term_putstr(5, 17, -1, TERM_WHITE,
                     format(
-                        _("アイテム = %d, 名前 = %-40.40s", "Object = %d, Name = %-40.40s"), k, k_name + (!k_ptr->flavor ? k_ptr->name : k_ptr->flavor_name)));
+                        _("アイテム = %d, 名前 = %-40.40s", "Object = %d, Name = %-40.40s"), k, (!k_ptr->flavor ? k_ptr->name : k_ptr->flavor_name).c_str()));
                 term_putstr(10, 19, -1, TERM_WHITE, format(_("初期値  色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
                 term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
                 term_queue_bigchar(43, 19, da, dc, 0, 0);
@@ -306,7 +306,7 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
                             k = prev_k;
                             break;
                         }
-                    } while (!k_info[k].name);
+                    } while (k_info[k].name.empty());
                 }
 
                 break;
@@ -349,7 +349,7 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
 
                 prt("", 17, 5);
                 term_putstr(5, 17, -1, TERM_WHITE,
-                    format(_("地形 = %d, 名前 = %s, 明度 = %s", "Terrain = %d, Name = %s, Lighting = %s"), f, (f_name + f_ptr->name),
+                    format(_("地形 = %d, 名前 = %s, 明度 = %s", "Terrain = %d, Name = %s, Lighting = %s"), f, (f_ptr->name.c_str()),
                         lighting_level_str[lighting_level]));
                 term_putstr(10, 19, -1, TERM_WHITE, format(_("初期値  色 / 文字 = %3d / %3d", "Default attr/char = %3d / %3d"), da, dc));
                 term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
@@ -379,7 +379,7 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
                             f = prev_f;
                             break;
                         }
-                    } while (!f_info[f].name || (f_info[f].mimic != f));
+                    } while (f_info[f].name.empty() || (f_info[f].mimic != f));
                 }
 
                 break;
index ab865f5..da39082 100644 (file)
@@ -125,10 +125,10 @@ void process_player_hp_mp(player_type *creature_ptr)
                 msg_print(_("熱で火傷した!", "The heat burns you!"));
                 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage,
                     format(_("%sの上に浮遊したダメージ", "flying over %s"),
-                        f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name),
+                        f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name.c_str()),
                     -1);
             } else {
-                concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
+                concptr name = f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name.c_str();
                 msg_format(_("%sで火傷した!", "The %s burns you!"), name);
                 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
             }
@@ -160,10 +160,10 @@ void process_player_hp_mp(player_type *creature_ptr)
                 msg_print(_("冷気に覆われた!", "The cold engulfs you!"));
                 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage,
                     format(_("%sの上に浮遊したダメージ", "flying over %s"),
-                        f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name),
+                        f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name.c_str()),
                     -1);
             } else {
-                concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
+                concptr name = f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name.c_str();
                 msg_format(_("%sに凍えた!", "The %s frostbites you!"), name);
                 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
             }
@@ -195,10 +195,10 @@ void process_player_hp_mp(player_type *creature_ptr)
                 msg_print(_("電撃を受けた!", "The electricity shocks you!"));
                 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage,
                     format(_("%sの上に浮遊したダメージ", "flying over %s"),
-                        f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name),
+                       f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name.c_str()),
                     -1);
             } else {
-                concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
+                concptr name = f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name.c_str();
                 msg_format(_("%sに感電した!", "The %s shocks you!"), name);
                 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
             }
@@ -230,10 +230,10 @@ void process_player_hp_mp(player_type *creature_ptr)
                 msg_print(_("酸が飛び散った!", "The acid melts you!"));
                 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage,
                     format(_("%sの上に浮遊したダメージ", "flying over %s"),
-                        f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name),
+                        f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name.c_str()),
                     -1);
             } else {
-                concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
+                concptr name = f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name.c_str();
                 msg_format(_("%sに溶かされた!", "The %s melts you!"), name);
                 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
             }
@@ -262,12 +262,12 @@ void process_player_hp_mp(player_type *creature_ptr)
                 msg_print(_("毒気を吸い込んだ!", "The gas poisons you!"));
                 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage,
                     format(_("%sの上に浮遊したダメージ", "flying over %s"),
-                        f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name),
+                        f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name.c_str()),
                     -1);
                 if (!has_resist_pois(creature_ptr))
                     (void)set_poisoned(creature_ptr, creature_ptr->poisoned + damage);
             } else {
-                concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
+                concptr name = f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name.c_str();
                 msg_format(_("%sに毒された!", "The %s poisons you!"), name);
                 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
                 if (!has_resist_pois(creature_ptr))
index b56d1b2..1ae6071 100644 (file)
@@ -130,11 +130,11 @@ void process_dungeon(player_type *player_ptr, bool load_game)
     if ((floor_ptr->dun_level == d_info[player_ptr->dungeon_idx].maxdepth) && d_info[player_ptr->dungeon_idx].final_guardian) {
         if (r_info[d_info[player_ptr->dungeon_idx].final_guardian].max_num)
 #ifdef JP
-            msg_format("この階には%sの主である%sが棲んでいる。", d_name + d_info[player_ptr->dungeon_idx].name,
-                r_name + r_info[d_info[player_ptr->dungeon_idx].final_guardian].name);
+            msg_format("この階には%sの主である%sが棲んでいる。", d_info[player_ptr->dungeon_idx].name.c_str(),
+                r_info[d_info[player_ptr->dungeon_idx].final_guardian].name.c_str());
 #else
-            msg_format("%^s lives in this level as the keeper of %s.", r_name + r_info[d_info[player_ptr->dungeon_idx].final_guardian].name,
-                d_name + d_info[player_ptr->dungeon_idx].name);
+            msg_format("%^s lives in this level as the keeper of %s.", r_info[d_info[player_ptr->dungeon_idx].final_guardian].name.c_str(),
+                d_info[player_ptr->dungeon_idx].name.c_str());
 #endif
     }
 
index 80d6294..6fd852b 100644 (file)
@@ -12,8 +12,6 @@
  * The dungeon arrays
  */
 dungeon_type *d_info;
-char *d_name;
-char *d_text;
 
 /*
  * Maximum number of dungeon in d_info.txt
@@ -41,7 +39,7 @@ DUNGEON_IDX choose_dungeon(concptr note, POSITION y, POSITION x)
                if (max_dlv[DUNGEON_ANGBAND]) return DUNGEON_ANGBAND;
                else
                {
-                       msg_format(_("まだ%sに入ったことはない。", "You haven't entered %s yet."), d_name + d_info[DUNGEON_ANGBAND].name);
+                    msg_format(_("まだ%sに入ったことはない。", "You haven't entered %s yet."), d_info[DUNGEON_ANGBAND].name.c_str());
                        msg_print(NULL);
                        return 0;
                }
@@ -65,7 +63,7 @@ DUNGEON_IDX choose_dungeon(concptr note, POSITION y, POSITION x)
                else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
 
                sprintf(buf, _("      %c) %c%-12s : 最大 %d 階", "      %c) %c%-16s : Max level %d"),
-                       'a' + num, seiha ? '!' : ' ', d_name + d_info[i].name, (int)max_dlv[i]);
+                       'a' + num, seiha ? '!' : ' ', d_info[i].name.c_str(), (int)max_dlv[i]);
                prt(buf, y + num, x);
                dun[num++] = i;
        }
index bf0a136..22b8f49 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "system/angband.h"
 #include "grid/feature.h"
+#include <string>
 
 #define DUNGEON_FEAT_PROB_NUM 3
 
 typedef struct dungeon_type dungeon_type;
 struct dungeon_type {
 
-       STR_OFFSET name; /* Name */
-       STR_OFFSET text; /* Description */
-
-       POSITION dy;
-       POSITION dx;
-
-       feat_prob floor[DUNGEON_FEAT_PROB_NUM]; /* Floor probability */
-       feat_prob fill[DUNGEON_FEAT_PROB_NUM];  /* Cave wall probability */
-       FEAT_IDX outer_wall;                        /* Outer wall tile */
-       FEAT_IDX inner_wall;                        /* Inner wall tile */
-       FEAT_IDX stream1;                           /* stream tile */
-       FEAT_IDX stream2;                           /* stream tile */
-
-       DEPTH mindepth;         /* Minimal depth */
-       DEPTH maxdepth;         /* Maximal depth */
-       PLAYER_LEVEL min_plev;         /* Minimal plev needed to enter -- it's an anti-cheating mesure */
-       BIT_FLAGS16 pit;
-       BIT_FLAGS16 nest;
-       BIT_FLAGS8 mode; /* Mode of combinaison of the monster flags */
-
-       int min_m_alloc_level;  /* Minimal number of monsters per level */
-       int max_m_alloc_chance; /* There is a 1/max_m_alloc_chance chance per round of creating a new monster */
-
-       BIT_FLAGS flags1;               /* Flags 1 */
-
-       BIT_FLAGS mflags1;              /* The monster flags that are allowed */
-       BIT_FLAGS mflags2;
-       BIT_FLAGS mflags3;
-       BIT_FLAGS mflags4;
-       BIT_FLAGS mflags7;
-       BIT_FLAGS mflags8;
-       BIT_FLAGS mflags9;
-       BIT_FLAGS mflagsr;
-
-       BIT_FLAGS m_a_ability_flags1;
-       BIT_FLAGS m_a_ability_flags2;
-       BIT_FLAGS m_a_ability_flags3;
-       BIT_FLAGS m_a_ability_flags4;
-
-       char r_char[5];         /* Monster race allowed */
-       KIND_OBJECT_IDX final_object;   /* The object you'll find at the bottom */
-       ARTIFACT_IDX final_artifact;    /* The artifact you'll find at the bottom */
-       MONRACE_IDX final_guardian;     /* The artifact's guardian. If an artifact is specified, then it's NEEDED */
-
-       PROB special_div;       /* % of monsters affected by the flags/races allowed, to add some variety */
-       int tunnel_percent;
-       int obj_great;
-       int obj_good;
+       std::string name; /* Name */
+    std::string text; /* Description */
+
+       POSITION dy{};
+       POSITION dx{};
+
+       feat_prob floor[DUNGEON_FEAT_PROB_NUM]{}; /* Floor probability */
+       feat_prob fill[DUNGEON_FEAT_PROB_NUM]{};  /* Cave wall probability */
+       FEAT_IDX outer_wall{};                        /* Outer wall tile */
+       FEAT_IDX inner_wall{};                        /* Inner wall tile */
+       FEAT_IDX stream1{};                           /* stream tile */
+       FEAT_IDX stream2{};                           /* stream tile */
+
+       DEPTH mindepth{};         /* Minimal depth */
+       DEPTH maxdepth{};         /* Maximal depth */
+       PLAYER_LEVEL min_plev{};         /* Minimal plev needed to enter -- it's an anti-cheating mesure */
+       BIT_FLAGS16 pit{};
+       BIT_FLAGS16 nest{};
+       BIT_FLAGS8 mode{}; /* Mode of combinaison of the monster flags */
+
+       int min_m_alloc_level{};        /* Minimal number of monsters per level */
+       int max_m_alloc_chance{};       /* There is a 1/max_m_alloc_chance chance per round of creating a new monster */
+
+       BIT_FLAGS flags1{};             /* Flags 1 */
+
+       BIT_FLAGS mflags1{};            /* The monster flags that are allowed */
+       BIT_FLAGS mflags2{};
+       BIT_FLAGS mflags3{};
+       BIT_FLAGS mflags4{};
+       BIT_FLAGS mflags7{};
+       BIT_FLAGS mflags8{};
+       BIT_FLAGS mflags9{};
+       BIT_FLAGS mflagsr{};
+
+       BIT_FLAGS m_a_ability_flags1{};
+       BIT_FLAGS m_a_ability_flags2{};
+       BIT_FLAGS m_a_ability_flags3{};
+       BIT_FLAGS m_a_ability_flags4{};
+
+       char r_char[5]{};               /* Monster race allowed */
+       KIND_OBJECT_IDX final_object{}; /* The object you'll find at the bottom */
+       ARTIFACT_IDX final_artifact{};  /* The artifact you'll find at the bottom */
+       MONRACE_IDX final_guardian{};   /* The artifact's guardian. If an artifact is specified, then it's NEEDED */
+
+       PROB special_div{};     /* % of monsters affected by the flags/races allowed, to add some variety */
+       int tunnel_percent{};
+       int obj_great{};
+       int obj_good{};
 };
 
 extern DEPTH *max_dlv;
 extern dungeon_type *d_info;
-extern char *d_name;
-extern char *d_text;
 
 extern DUNGEON_IDX choose_dungeon(concptr note, POSITION y, POSITION x);
index aa28b1d..e42784a 100644 (file)
@@ -162,7 +162,7 @@ void quest_discovery(QUEST_IDX q_idx)
         return;
 
     GAME_TEXT name[MAX_NLEN];
-    strcpy(name, (r_name + r_ptr->name));
+    strcpy(name, (r_ptr->name.c_str()));
 
     msg_print(find_quest[rand_range(0, 4)]);
     msg_print(NULL);
index d40b25a..c64259b 100644 (file)
@@ -228,7 +228,7 @@ bool affect_feature(player_type *caster_ptr, MONSTER_IDX who, POSITION r, POSITI
         if (!known || !has_flag(mimic_f_ptr->flags, FF_OPEN))
             break;
 
-        msg_format(_("%sに何かがつっかえて開かなくなった。", "The %s seems stuck."), f_name + mimic_f_ptr->name);
+        msg_format(_("%sに何かがつっかえて開かなくなった。", "The %s seems stuck."), mimic_f_ptr->name.c_str());
         obvious = TRUE;
         break;
     }
@@ -237,7 +237,7 @@ bool affect_feature(player_type *caster_ptr, MONSTER_IDX who, POSITION r, POSITI
             break;
 
         if (known && (g_ptr->info & (CAVE_MARK))) {
-            msg_format(_("%sが溶けて泥になった!", "The %s turns into mud!"), f_name + f_info[get_feat_mimic(g_ptr)].name);
+            msg_format(_("%sが溶けて泥になった!", "The %s turns into mud!"), f_info[get_feat_mimic(g_ptr)].name.c_str());
             obvious = TRUE;
         }
 
@@ -394,7 +394,7 @@ bool affect_feature(player_type *caster_ptr, MONSTER_IDX who, POSITION r, POSITI
             break;
 
         if (known && (g_ptr->info & CAVE_MARK)) {
-            msg_format(_("%sが割れた!", "The %s crumbled!"), f_name + f_info[get_feat_mimic(g_ptr)].name);
+            msg_format(_("%sが割れた!", "The %s crumbled!"), f_info[get_feat_mimic(g_ptr)].name.c_str());
             sound(SOUND_GLASS);
         }
 
@@ -415,7 +415,7 @@ bool affect_feature(player_type *caster_ptr, MONSTER_IDX who, POSITION r, POSITI
             break;
 
         if (known && (g_ptr->info & CAVE_MARK)) {
-            msg_format(_("%sが割れた!", "The %s crumbled!"), f_name + f_info[get_feat_mimic(g_ptr)].name);
+            msg_format(_("%sが割れた!", "The %s crumbled!"), f_info[get_feat_mimic(g_ptr)].name.c_str());
             sound(SOUND_GLASS);
         }
 
index 3c74e1c..250f39e 100644 (file)
@@ -17,7 +17,7 @@ flavor_type *initialize_flavor_type(flavor_type *flavor_ptr, char *buf, object_t
     flavor_ptr->buf = buf;
     flavor_ptr->o_ptr = o_ptr;
     flavor_ptr->mode = mode;
-    flavor_ptr->kindname = k_name + k_info[o_ptr->k_idx].name;
+    flavor_ptr->kindname = k_info[o_ptr->k_idx].name.c_str();
     flavor_ptr->basenm = flavor_ptr->kindname;
     flavor_ptr->modstr = "";
     flavor_ptr->aware = FALSE;
index 6d1e99d..15ff38f 100644 (file)
@@ -52,7 +52,7 @@ static void set_base_name(flavor_type *flavor_ptr)
     if (!flavor_ptr->aware || !has_flag(flavor_ptr->tr_flags, TR_FULL_NAME))
         return;
 
-    flavor_ptr->basenm = (flavor_ptr->known && (flavor_ptr->o_ptr->name1 != 0)) ? a_name + a_info[flavor_ptr->o_ptr->name1].name : flavor_ptr->kindname;
+    flavor_ptr->basenm = (flavor_ptr->known && (flavor_ptr->o_ptr->name1 != 0)) ? a_info[flavor_ptr->o_ptr->name1].name.c_str() : flavor_ptr->kindname;
 }
 
 #ifdef JP
@@ -113,15 +113,15 @@ static void describe_artifact_ja(flavor_type *flavor_ptr)
     if (flavor_ptr->o_ptr->name1 && !has_flag(flavor_ptr->tr_flags, TR_FULL_NAME)) {
         artifact_type *a_ptr = &a_info[flavor_ptr->o_ptr->name1];
         /* '『' から始まらない伝説のアイテムの名前は最初に付加する */
-        if (strncmp(a_name + a_ptr->name, "『", 2) != 0)
-            flavor_ptr->t = object_desc_str(flavor_ptr->t, a_name + a_ptr->name);
+        if (a_ptr->name.find("『", 0, 2) != 0)
+            flavor_ptr->t = object_desc_str(flavor_ptr->t, a_ptr->name.c_str());
 
         return;
     }
 
     if (object_is_ego(flavor_ptr->o_ptr)) {
         ego_item_type *e_ptr = &e_info[flavor_ptr->o_ptr->name2];
-        flavor_ptr->t = object_desc_str(flavor_ptr->t, e_name + e_ptr->name);
+        flavor_ptr->t = object_desc_str(flavor_ptr->t, e_ptr->name.c_str());
     }
 }
 
@@ -198,8 +198,8 @@ static void describe_artifact_body_ja(flavor_type *flavor_ptr)
 
     if (object_is_fixed_artifact(flavor_ptr->o_ptr)) {
         artifact_type *a_ptr = &a_info[flavor_ptr->o_ptr->name1];
-        if (strncmp(a_name + a_ptr->name, "『", 2) == 0)
-            flavor_ptr->t = object_desc_str(flavor_ptr->t, a_name + a_ptr->name);
+        if (a_ptr->name.find("『", 0, 2) == 0)
+            flavor_ptr->t = object_desc_str(flavor_ptr->t, a_ptr->name.c_str());
 
         return;
     }
@@ -295,14 +295,14 @@ static void describe_artifact_body_en(flavor_type *flavor_ptr)
     if (object_is_fixed_artifact(flavor_ptr->o_ptr)) {
         artifact_type *a_ptr = &a_info[flavor_ptr->o_ptr->name1];
         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
-        flavor_ptr->t = object_desc_str(flavor_ptr->t, a_name + a_ptr->name);
+        flavor_ptr->t = object_desc_str(flavor_ptr->t, a_ptr->name.c_str());
         return;
     }
 
     if (object_is_ego(flavor_ptr->o_ptr)) {
         ego_item_type *e_ptr = &e_info[flavor_ptr->o_ptr->name2];
         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
-        flavor_ptr->t = object_desc_str(flavor_ptr->t, e_name + e_ptr->name);
+        flavor_ptr->t = object_desc_str(flavor_ptr->t, e_ptr->name.c_str());
     }
 
     if (flavor_ptr->o_ptr->inscription && angband_strchr(quark_str(flavor_ptr->o_ptr->inscription), '#')) {
index 53dd59e..518a8f8 100644 (file)
@@ -238,7 +238,7 @@ void flavor_init(void)
     Rand_state_set(current_world_ptr->seed_flavor);
     for (KIND_OBJECT_IDX i = 0; i < max_k_idx; i++) {
         object_kind *k_ptr = &k_info[i];
-        if (!k_ptr->flavor_name)
+        if (k_ptr->flavor_name.empty())
             continue;
 
         k_ptr->flavor = i;
@@ -255,7 +255,7 @@ void flavor_init(void)
     Rand_state_restore(state_backup);
     for (KIND_OBJECT_IDX i = 1; i < max_k_idx; i++) {
         object_kind *k_ptr = &k_info[i];
-        if (!k_ptr->name)
+        if (k_ptr->name.empty())
             continue;
 
         if (!k_ptr->flavor)
@@ -274,7 +274,7 @@ void flavor_init(void)
 void strip_name(char *buf, KIND_OBJECT_IDX k_idx)
 {
     object_kind *k_ptr = &k_info[k_idx];
-    concptr str = (k_name + k_ptr->name);
+    concptr str = k_ptr->name.c_str();
     while ((*str == ' ') || (*str == '&'))
         str++;
 
index 08201a7..d9e17eb 100644 (file)
@@ -29,10 +29,10 @@ static void describe_monster_ball(flavor_type *flavor_ptr)
     }
 
 #ifdef JP
-    sprintf(flavor_ptr->tmp_val2, " (%s)", r_name + r_ptr->name);
+    sprintf(flavor_ptr->tmp_val2, " (%s)", r_ptr->name.c_str());
     flavor_ptr->modstr = flavor_ptr->tmp_val2;
 #else
-    flavor_ptr->t = r_name + r_ptr->name;
+    flavor_ptr->t = format("%s", r_ptr->name.c_str());
     if (!(r_ptr->flags1 & RF1_UNIQUE)) {
         sprintf(flavor_ptr->tmp_val2, " (%s%s)", (is_a_vowel(*flavor_ptr->t) ? "an " : "a "), flavor_ptr->t);
         flavor_ptr->modstr = flavor_ptr->tmp_val2;
@@ -47,9 +47,9 @@ static void describe_statue(flavor_type *flavor_ptr)
 {
     monster_race *r_ptr = &r_info[flavor_ptr->o_ptr->pval];
 #ifdef JP
-    flavor_ptr->modstr = r_name + r_ptr->name;
+    flavor_ptr->modstr = r_ptr->name.c_str();
 #else
-    flavor_ptr->t = r_name + r_ptr->name;
+    flavor_ptr->t = format("%s", r_ptr->name.c_str());
     if (!(r_ptr->flags1 & RF1_UNIQUE)) {
         sprintf(flavor_ptr->tmp_val2, "%s%s", (is_a_vowel(*flavor_ptr->t) ? "an " : "a "), flavor_ptr->t);
         flavor_ptr->modstr = flavor_ptr->tmp_val2;
@@ -61,7 +61,7 @@ static void describe_statue(flavor_type *flavor_ptr)
 static void describe_corpse(flavor_type *flavor_ptr)
 {
     monster_race *r_ptr = &r_info[flavor_ptr->o_ptr->pval];
-    flavor_ptr->modstr = r_name + r_ptr->name;
+    flavor_ptr->modstr = r_ptr->name.c_str();
 #ifdef JP
     flavor_ptr->basenm = "#%";
 #else
@@ -77,7 +77,7 @@ static void describe_amulet(flavor_type *flavor_ptr)
     if (flavor_ptr->aware && (object_is_fixed_artifact(flavor_ptr->o_ptr) || flavor_ptr->k_ptr->gen_flags.has(TRG::INSTA_ART)))
         return;
 
-    flavor_ptr->modstr = k_name + flavor_ptr->flavor_k_ptr->flavor_name;
+    flavor_ptr->modstr = flavor_ptr->flavor_k_ptr->flavor_name.c_str();
     if (!flavor_ptr->flavor)
         flavor_ptr->basenm = _("%のアミュレット", "& Amulet~ of %");
     else if (flavor_ptr->aware)
@@ -91,7 +91,7 @@ static void describe_ring(flavor_type *flavor_ptr)
     if (flavor_ptr->aware && (object_is_fixed_artifact(flavor_ptr->o_ptr) || flavor_ptr->k_ptr->gen_flags.has(TRG::INSTA_ART)))
         return;
 
-    flavor_ptr->modstr = k_name + flavor_ptr->flavor_k_ptr->flavor_name;
+    flavor_ptr->modstr = flavor_ptr->flavor_k_ptr->flavor_name.c_str();
     if (!flavor_ptr->flavor)
         flavor_ptr->basenm = _("%の指輪", "& Ring~ of %");
     else if (flavor_ptr->aware)
@@ -105,7 +105,7 @@ static void describe_ring(flavor_type *flavor_ptr)
 
 static void describe_staff(flavor_type *flavor_ptr)
 {
-    flavor_ptr->modstr = k_name + flavor_ptr->flavor_k_ptr->flavor_name;
+    flavor_ptr->modstr = flavor_ptr->flavor_k_ptr->flavor_name.c_str();
     if (!flavor_ptr->flavor)
         flavor_ptr->basenm = _("%の杖", "& Staff~ of %");
     else if (flavor_ptr->aware)
@@ -116,7 +116,7 @@ static void describe_staff(flavor_type *flavor_ptr)
 
 static void describe_wand(flavor_type *flavor_ptr)
 {
-    flavor_ptr->modstr = k_name + flavor_ptr->flavor_k_ptr->flavor_name;
+    flavor_ptr->modstr = flavor_ptr->flavor_k_ptr->flavor_name.c_str();
     if (!flavor_ptr->flavor)
         flavor_ptr->basenm = _("%の魔法棒", "& Wand~ of %");
     else if (flavor_ptr->aware)
@@ -127,7 +127,7 @@ static void describe_wand(flavor_type *flavor_ptr)
 
 static void describe_rod(flavor_type *flavor_ptr)
 {
-    flavor_ptr->modstr = k_name + flavor_ptr->flavor_k_ptr->flavor_name;
+    flavor_ptr->modstr = flavor_ptr->flavor_k_ptr->flavor_name.c_str();
     if (!flavor_ptr->flavor)
         flavor_ptr->basenm = _("%のロッド", "& Rod~ of %");
     else if (flavor_ptr->aware)
@@ -138,7 +138,7 @@ static void describe_rod(flavor_type *flavor_ptr)
 
 static void describe_scroll(flavor_type *flavor_ptr)
 {
-    flavor_ptr->modstr = k_name + flavor_ptr->flavor_k_ptr->flavor_name;
+    flavor_ptr->modstr = flavor_ptr->flavor_k_ptr->flavor_name.c_str();
     if (!flavor_ptr->flavor)
         flavor_ptr->basenm = _("%の巻物", "& Scroll~ of %");
     else if (flavor_ptr->aware)
@@ -149,7 +149,7 @@ static void describe_scroll(flavor_type *flavor_ptr)
 
 static void describe_potion(flavor_type *flavor_ptr)
 {
-    flavor_ptr->modstr = k_name + flavor_ptr->flavor_k_ptr->flavor_name;
+    flavor_ptr->modstr = flavor_ptr->flavor_k_ptr->flavor_name.c_str();
     if (!flavor_ptr->flavor)
         flavor_ptr->basenm = _("%の薬", "& Potion~ of %");
     else if (flavor_ptr->aware)
@@ -160,10 +160,10 @@ static void describe_potion(flavor_type *flavor_ptr)
 
 static void describe_food(flavor_type *flavor_ptr)
 {
-    if (!flavor_ptr->k_ptr->flavor_name)
+    if (flavor_ptr->k_ptr->flavor_name.empty())
         return;
 
-    flavor_ptr->modstr = k_name + flavor_ptr->flavor_k_ptr->flavor_name;
+    flavor_ptr->modstr = flavor_ptr->flavor_k_ptr->flavor_name.c_str();
     if (!flavor_ptr->flavor)
         flavor_ptr->basenm = _("%のキノコ", "& Mushroom~ of %");
     else if (flavor_ptr->aware)
index 54a936f..0d1ba61 100644 (file)
@@ -206,5 +206,5 @@ concptr map_name(player_type *creature_ptr)
     else if (!floor_ptr->dun_level && creature_ptr->town_num)
         return town_info[creature_ptr->town_num].name;
     else
-        return d_name + d_info[creature_ptr->dungeon_idx].name;
+        return d_info[creature_ptr->dungeon_idx].name.c_str();
 }
index 438c089..1cc1a3e 100644 (file)
@@ -18,8 +18,6 @@
 
 /* The terrain feature arrays */
 feature_type *f_info;
-char *f_name;
-char *f_tag;
 
 /* Nothing */
 FEAT_IDX feat_none;
index a363b15..4c10955 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "grid/feature-flag-types.h"
 #include "system/angband.h"
+#include <string>
 
 /* Number of feats we change to (Excluding default). Used in f_info.txt. */
 #define MAX_FEAT_STATES         8
  * @brief 地形状態変化指定構造体 / Feature state structure
  */
 typedef struct feature_state {
-       FF_FLAGS_IDX action; /*!< 変化条件をFF_*のIDで指定 / Action (FF_*) */
-       STR_OFFSET result_tag; /*!< 変化先ID / Result (f_info ID) */
-       FEAT_IDX result; /*!< 変化先ID / Result (f_info ID) */
+    FF_FLAGS_IDX action{}; /*!< 変化条件をFF_*のIDで指定 / Action (FF_*) */
+    std::string result_tag{}; /*!< 変化先ID / Result (f_info ID) */
+    FEAT_IDX result{}; /*!< 変化先ID / Result (f_info ID) */
 } feature_state;
 
 typedef struct feat_prob {
-       FEAT_IDX feat;    /* Feature tile */
-       PERCENTAGE percent; /* Chance of type */
+    FEAT_IDX feat{}; /* Feature tile */
+    PERCENTAGE percent{}; /* Chance of type */
 } feat_prob;
 
 /*!
@@ -34,28 +35,26 @@ typedef struct feat_prob {
  * @brief 地形情報の構造体 / Information about terrain "features"
  */
 typedef struct feature_type {
-       STR_OFFSET name;                /*!< 地形名参照のためのネームバッファオフセット値 / Name (offset) */
-       STR_OFFSET text;                /*!< 地形説明参照のためのネームバッファオフセット値 /  Text (offset) */
-       STR_OFFSET tag;                 /*!< 地形特性タグ参照のためのネームバッファオフセット値 /  Tag (offset) */
-       STR_OFFSET mimic_tag;
-       STR_OFFSET destroyed_tag;
-       FEAT_IDX mimic;               /*!< 未確定時の外形地形ID / Feature to mimic */
-       FEAT_IDX destroyed;           /*!< *破壊*に巻き込まれた時の地形移行先(未実装?) / Default destroyed state */
-       BIT_FLAGS flags[FF_FLAG_SIZE]; /*!< 地形の基本特性ビット配列 / Flags */
-       FEAT_PRIORITY priority;            /*!< 縮小表示で省略する際の表示優先度 / Map priority */
-       feature_state state[MAX_FEAT_STATES]; /*!< feature_state テーブル */
-       FEAT_SUBTYPE subtype;  /*!< 副特性値 */
-       FEAT_POWER power;    /*!< 地形強度 */
-       TERM_COLOR d_attr[F_LIT_MAX];   /*!< デフォルトの地形シンボルカラー / Default feature attribute */
-       SYMBOL_CODE d_char[F_LIT_MAX];   /*!< デフォルトの地形シンボルアルファベット / Default feature character */
-       TERM_COLOR x_attr[F_LIT_MAX];   /*!< 設定変更後の地形シンボルカラー / Desired feature attribute */
-       SYMBOL_CODE x_char[F_LIT_MAX];   /*!< 設定変更後の地形シンボルアルファベット / Desired feature character */
+    std::string name; /*!< 地形名参照のためのネームバッファオフセット値 / Name (offset) */
+    std::string text; /*!< 地形説明参照のためのネームバッファオフセット値 /  Text (offset) */
+    std::string tag; /*!< 地形特性タグ参照のためのネームバッファオフセット値 /  Tag (offset) */
+    std::string mimic_tag;
+    std::string destroyed_tag;
+    FEAT_IDX mimic{}; /*!< 未確定時の外形地形ID / Feature to mimic */
+    FEAT_IDX destroyed{}; /*!< *破壊*に巻き込まれた時の地形移行先(未実装?) / Default destroyed state */
+    BIT_FLAGS flags[FF_FLAG_SIZE]{}; /*!< 地形の基本特性ビット配列 / Flags */
+    FEAT_PRIORITY priority{}; /*!< 縮小表示で省略する際の表示優先度 / Map priority */
+    feature_state state[MAX_FEAT_STATES]{}; /*!< feature_state テーブル */
+    FEAT_SUBTYPE subtype{}; /*!< 副特性値 */
+    FEAT_POWER power{}; /*!< 地形強度 */
+    TERM_COLOR d_attr[F_LIT_MAX]{}; /*!< デフォルトの地形シンボルカラー / Default feature attribute */
+    SYMBOL_CODE d_char[F_LIT_MAX]{}; /*!< デフォルトの地形シンボルアルファベット / Default feature character */
+    TERM_COLOR x_attr[F_LIT_MAX]{}; /*!< 設定変更後の地形シンボルカラー / Desired feature attribute */
+    SYMBOL_CODE x_char[F_LIT_MAX]{}; /*!< 設定変更後の地形シンボルアルファベット / Desired feature character */
 } feature_type;
 
 extern FEAT_IDX max_f_idx;
 extern feature_type *f_info;
-extern char *f_name;
-extern char *f_tag;
 
 /*** Terrain feature variables ***/
 extern FEAT_IDX feat_none;
index af54353..76112f4 100644 (file)
@@ -6,6 +6,7 @@
 #include "util/bit-flags-calculator.h"
 #include "util/string-processor.h"
 #include "view/display-messages.h"
+#include <string>
 
 /*!
  * @brief テキストトークンを走査してフラグを一つ得る(アーティファクト用) /
@@ -64,8 +65,7 @@ errr parse_a_info(char *buf, angband_header *head)
         add_flag(a_ptr->flags, TR_IGNORE_FIRE);
         add_flag(a_ptr->flags, TR_IGNORE_COLD);
 #ifdef JP
-        if (!add_name(&a_ptr->name, head, s))
-            return 7;
+        a_ptr->name = std::string(s);
 #endif
     } else if (!a_ptr) {
         return 3;
@@ -79,8 +79,7 @@ errr parse_a_info(char *buf, angband_header *head)
 #else
     else if (buf[0] == 'E') {
         s = buf + 2;
-        if (!add_name(&a_ptr->name, head, s))
-            return 7;
+        a_ptr->name = std::string(s);
     }
 #endif
     else if (buf[0] == 'D') {
@@ -93,8 +92,7 @@ errr parse_a_info(char *buf, angband_header *head)
             return 0;
         s = buf + 3;
 #endif
-        if (!add_text(&a_ptr->text, head, s, TRUE))
-            return 7;
+        a_ptr->text.append(s);
     } else if (buf[0] == 'I') {
         int tval, sval, pval;
         if (3 != sscanf(buf + 2, "%d:%d:%d", &tval, &sval, &pval))
index 2d8885e..685fe56 100644 (file)
@@ -8,6 +8,7 @@
 #include "main/angband-headers.h"
 #include "util/string-processor.h"
 #include "view/display-messages.h"
+#include <string>
 
 /*!
  * @brief テキストトークンを走査してフラグを一つ得る(ダンジョン用) /
@@ -112,8 +113,7 @@ errr parse_d_info(char *buf, angband_header *head)
         error_idx = i;
         d_ptr = &d_info[i];
 #ifdef JP
-        if (!add_name(&d_ptr->name, head, s))
-            return 7;
+        d_ptr->name = std::string(s);
 #endif
     }
 #ifdef JP
@@ -125,8 +125,7 @@ errr parse_d_info(char *buf, angband_header *head)
         s = buf + 2;
 
         /* Store the name */
-        if (!add_name(&d_ptr->name, head, s))
-            return 7;
+        d_ptr->name = std::string(s);
     }
 #endif
     else if (buf[0] == 'D') {
@@ -139,8 +138,7 @@ errr parse_d_info(char *buf, angband_header *head)
             return 0;
         s = buf + 3;
 #endif
-        if (!add_text(&d_ptr->text, head, s, TRUE))
-            return 7;
+        d_ptr->text.append(s);
     } else if (buf[0] == 'W') {
         int min_lev, max_lev;
         int min_plev, mode;
index ac3b0fd..7a08c88 100644 (file)
@@ -6,6 +6,7 @@
 #include "util/bit-flags-calculator.h"
 #include "util/string-processor.h"
 #include "view/display-messages.h"
+#include <string>
 
 /*!
  * @brief テキストトークンを走査してフラグを一つ得る(エゴ用) /
@@ -62,8 +63,7 @@ errr parse_e_info(char *buf, angband_header *head)
         error_idx = i;
         e_ptr = &e_info[i];
 #ifdef JP
-        if (!add_name(&e_ptr->name, head, s))
-            return 7;
+        e_ptr->name = std::string(s);
 #endif
     } else if (!e_ptr) {
         return 3;
@@ -77,8 +77,7 @@ errr parse_e_info(char *buf, angband_header *head)
 #else
     else if (buf[0] == 'E') {
         s = buf + 2;
-        if (!add_name(&e_ptr->name, head, s))
-            return 7;
+        e_ptr->name = std::string(s);
     }
 #endif
     else if (buf[0] == 'X') {
index be64786..7123f72 100644 (file)
@@ -11,6 +11,8 @@
 #include "util/bit-flags-calculator.h"
 #include "util/string-processor.h"
 #include "view/display-messages.h"
+#include <string>
+#include <string_view>
 
 /*! 地形タグ情報から地形IDを得られなかった場合にTRUEを返す */
 static bool feat_tag_is_not_found = FALSE;
@@ -84,8 +86,7 @@ errr parse_f_info(char *buf, angband_header *head)
         error_idx = i;
         f_ptr = &f_info[i];
         if (s) {
-            if (!add_tag(&f_ptr->tag, head, s))
-                return 7;
+            f_ptr->tag = std::string(s);
         }
 
         f_ptr->mimic = (FEAT_IDX)i;
@@ -97,24 +98,17 @@ errr parse_f_info(char *buf, angband_header *head)
     }
 #ifdef JP
     else if (buf[0] == 'J') {
-        if (!add_name(&f_ptr->name, head, buf + 2))
-            return 7;
+        f_ptr->name = std::string(buf + 2);
     } else if (buf[0] == 'E') {
     }
 #else
     else if (buf[0] == 'J') {
     } else if (buf[0] == 'E') {
-        s = buf + 2;
-        if (!add_name(&f_ptr->name, head, s))
-            return 7;
+        f_ptr->name = std::string(buf + 2);
     }
 #endif
     else if (buf[0] == 'M') {
-        STR_OFFSET offset;
-        if (!add_tag(&offset, head, buf + 2))
-            return PARSE_ERROR_OUT_OF_MEMORY;
-
-        f_ptr->mimic_tag = offset;
+        f_ptr->mimic_tag = std::string(buf + 2);
     } else if (buf[0] == 'G') {
         int j;
         byte s_attr;
@@ -209,7 +203,6 @@ errr parse_f_info(char *buf, angband_header *head)
             return (PARSE_ERROR_GENERIC);
         f_ptr->priority = (FEAT_PRIORITY)priority;
     } else if (buf[0] == 'K') {
-        STR_OFFSET offset;
         for (i = 0; i < MAX_FEAT_STATES; i++)
             if (f_ptr->state[i].action == FF_FLAG_MAX)
                 break;
@@ -225,18 +218,13 @@ errr parse_f_info(char *buf, angband_header *head)
             *t++ = '\0';
 
         if (streq(s, "DESTROYED")) {
-            if (!add_tag(&offset, head, t))
-                return PARSE_ERROR_OUT_OF_MEMORY;
-
-            f_ptr->destroyed_tag = offset;
+            f_ptr->destroyed_tag = std::string(t);
         } else {
             f_ptr->state[i].action = 0;
             if (0 != grab_one_feat_action(f_ptr, s, i))
                 return PARSE_ERROR_INVALID_FLAG;
-            if (!add_tag(&offset, head, t))
-                return PARSE_ERROR_OUT_OF_MEMORY;
 
-            f_ptr->state[i].result_tag = offset;
+            f_ptr->state[i].result_tag = std::string(t);
         }
     } else {
         return 6;
@@ -408,7 +396,7 @@ errr init_feat_variables(void)
 s16b f_tag_to_index(concptr str)
 {
     for (u16b i = 0; i < f_head.info_num; i++) {
-        if (streq(f_tag + f_info[i].tag, str)) {
+        if (streq(f_info[i].tag.c_str(), str)) {
             return (s16b)i;
         }
     }
@@ -437,19 +425,19 @@ s16b f_tag_to_index_in_init(concptr str)
  * @param feat タグ文字列のオフセット
  * @return 地形ID。該当がないなら-1
  */
-static FEAT_IDX search_real_feat(STR_OFFSET feat)
+static FEAT_IDX search_real_feat(std::string feat)
 {
-    if (feat <= 0) {
+    if (feat.empty()) {
         return -1;
     }
 
     for (FEAT_IDX i = 0; i < f_head.info_num; i++) {
-        if (feat == f_info[i].tag) {
+        if (feat.compare(f_info[i].tag) == 0) {
             return i;
         }
     }
 
-    msg_format(_("未定義のタグ '%s'。", "%s is undefined."), f_tag + feat);
+    msg_format(_("未定義のタグ '%s'。", "%s is undefined."), feat.c_str());
     return -1;
 }
 
index bd0a46d..6521193 100644 (file)
@@ -32,10 +32,6 @@ errr init_info_txt(FILE *fp, char *buf, angband_header *head, parse_info_txt_fun
     error_idx = -1;
     error_line = 0;
 
-    head->name_size = 0;
-    head->text_size = 0;
-    head->tag_size = 0;
-
     errr err;
     while (angband_fgets(fp, buf, 1024) == 0) {
         error_line++;
@@ -61,11 +57,6 @@ errr init_info_txt(FILE *fp, char *buf, angband_header *head, parse_info_txt_fun
             return (err);
     }
 
-    if (head->name_size)
-        head->name_size++;
-    if (head->text_size)
-        head->text_size++;
-
     return 0;
 }
 
index 4359802..1248278 100644 (file)
@@ -8,106 +8,6 @@ int error_idx; /*!< データ読み込み/初期化時に汎用的にエラー
 int error_line; /*!< データ読み込み/初期化時に汎用的にエラー行数を保存するグローバル変数 */
 
 /*!
- * @brief データの可変文字列情報をテキストとして保管する /
- * Add a text to the text-storage and store offset to it.
- * @param offset 文字列保管ポインタからのオフセット
- * @param head テキスト保管ヘッダ情報の構造体参照ポインタ
- * @param buf 保管文字列
- * @param normal_text テキストの正規化を行う
- * @return
- * 無事保管ができたらTRUEを返す。
- * Returns FALSE when there isn't enough space available to store
- * the text.
- */
-bool add_text(u32b *offset, angband_header *head, concptr buf, bool normal_text)
-{
-    if (head->text_size + strlen(buf) + 8 > FAKE_TEXT_SIZE)
-        return FALSE;
-
-    if (*offset == 0) {
-        *offset = ++head->text_size;
-    } else if (normal_text) {
-        /*
-         * If neither the end of the last line nor
-         * the beginning of current line is not a space,
-         * fill up a space as a correct separator of two words.
-         */
-        if (head->text_size > 0 &&
-#ifdef JP
-            (*(head->text_ptr + head->text_size - 1) != ' ') && ((head->text_size == 1) || !iskanji(*(head->text_ptr + head->text_size - 2))) && (buf[0] != ' ')
-            && !iskanji(buf[0])
-#else
-            (*(head->text_ptr + head->text_size - 1) != ' ') && (buf[0] != ' ')
-#endif
-        ) {
-            *(head->text_ptr + head->text_size) = ' ';
-            head->text_size++;
-        }
-    }
-
-    strcpy(head->text_ptr + head->text_size, buf);
-    head->text_size += strlen(buf);
-    return TRUE;
-}
-
-/*!
- * @brief データの可変文字列情報を名前として保管する /
- * Add a name to the name-storage and return an offset to it.
- * @param offset 文字列保管ポインタからのオフセット
- * @param head テキスト保管ヘッダ情報の構造体参照ポインタ
- * @param buf 保管文字列
- * @return
- * 無事保管ができたらTRUEを返す。
- * Returns FALSE when there isn't enough space available to store
- * the text.
- */
-bool add_name(u32b *offset, angband_header *head, concptr buf)
-{
-    if (head->name_size + strlen(buf) + 8 > FAKE_NAME_SIZE)
-        return FALSE;
-
-    if (*offset == 0) {
-        *offset = ++head->name_size;
-    }
-
-    strcpy(head->name_ptr + head->name_size, buf);
-    head->name_size += strlen(buf);
-    return TRUE;
-}
-
-/*!
- * @brief データの可変文字列情報をタグとして保管する /
- * Add a tag to the tag-storage and return an offset to it.
- * @param offset 文字列保管ポインタからのオフセット
- * @param head テキスト保管ヘッダ情報の構造体参照ポインタ
- * @param buf 保管文字列
- * @return
- * 無事保管ができたらTRUEを返す。
- * Returns FALSE when there isn't enough space available to store
- * the text.
- */
-bool add_tag(STR_OFFSET *offset, angband_header *head, concptr buf)
-{
-    u32b i;
-    for (i = 1; i < head->tag_size; i += strlen(&head->tag_ptr[i]) + 1) {
-        if (streq(&head->tag_ptr[i], buf))
-            break;
-    }
-
-    if (i >= head->tag_size) {
-        if (head->tag_size + strlen(buf) + 8 > FAKE_TAG_SIZE)
-            return FALSE;
-
-        strcpy(head->tag_ptr + head->tag_size, buf);
-        i = head->tag_size;
-        head->tag_size += strlen(buf) + 1;
-    }
-
-    *offset = (s16b)i;
-    return TRUE;
-}
-
-/*!
  * @brief テキストトークンを走査してフラグを一つ得る(汎用) /
  * Grab one flag from a textual string
  * @param flags ビットフラグを追加する先の参照ポインタ
index 8e3408a..08ade59 100644 (file)
@@ -5,16 +5,9 @@
 /*
  * Size of memory reserved for initialization of some arrays
  */
-#define FAKE_NAME_SIZE 100 * 1024L /*!< ゲーム情報の種別毎に用意される名前用バッファの容量 */
-#define FAKE_TEXT_SIZE 150 * 1024L /*!< ゲーム情報の種別毎に用意されるテキスト用バッファの容量 */
-#define FAKE_TAG_SIZE 10 * 1024L /*!< ゲーム情報の種別毎に用意されるタグ用バッファの容量 */
-
 extern int error_idx;
 extern int error_line;
 
 typedef struct angband_header angband_header;
-bool add_text(u32b *offset, angband_header *head, concptr buf, bool normal_text);
-bool add_name(u32b *offset, angband_header *head, concptr buf);
-bool add_tag(STR_OFFSET *offset, angband_header *head, concptr buf);
 errr grab_one_flag(u32b *flags, concptr names[], concptr what);
 byte grab_one_activation_flag(concptr what);
index 003abdd..5b97841 100644 (file)
@@ -7,6 +7,7 @@
 #include "util/bit-flags-calculator.h"
 #include "util/string-processor.h"
 #include "view/display-messages.h"
+#include <string>
 
 /*!
  * @brief テキストトークンを走査してフラグを一つ得る(ベースアイテム用) /
@@ -69,12 +70,10 @@ errr parse_k_info(char *buf, angband_header *head)
         flavor = angband_strchr(s, ':');
         if (flavor) {
             *flavor++ = '\0';
-            if (!add_name(&k_ptr->flavor_name, head, flavor))
-                return 7;
+            k_ptr->flavor_name = std::string(flavor);
         }
 
-        if (!add_name(&k_ptr->name, head, s))
-            return 7;
+        k_ptr->name = std::string(s);
 #endif
     } else if (!k_ptr) {
         return 3;
@@ -92,12 +91,10 @@ errr parse_k_info(char *buf, angband_header *head)
         flavor = angband_strchr(s, ':');
         if (flavor) {
             *flavor++ = '\0';
-            if (!add_name(&k_ptr->flavor_name, head, flavor))
-                return 7;
+            k_ptr->flavor_name = std::string(flavor);
         }
 
-        if (!add_name(&k_ptr->name, head, s))
-            return 7;
+        k_ptr->name = std::string(s);
     }
 #endif
     else if (buf[0] == 'D') {
@@ -110,8 +107,7 @@ errr parse_k_info(char *buf, angband_header *head)
             return 0;
         s = buf + 3;
 #endif
-        if (!add_text(&k_ptr->text, head, s, TRUE))
-            return 7;
+        k_ptr->text.append(s);
     } else if (buf[0] == 'G') {
         char sym;
         byte tmp;
index 78a87ce..a224f99 100644 (file)
@@ -95,8 +95,7 @@ errr parse_r_info(char *buf, angband_header *head)
         error_idx = i;
         r_ptr = &r_info[i];
 #ifdef JP
-        if (!add_name(&r_ptr->name, head, s))
-            return PARSE_ERROR_OUT_OF_MEMORY;
+        r_ptr->name = std::string(s);
 #endif
     } else if (!r_ptr) {
         return PARSE_ERROR_MISSING_RECORD_HEADER;
@@ -105,15 +104,11 @@ errr parse_r_info(char *buf, angband_header *head)
     /* 英語名を読むルーチンを追加 */
     /* 'E' から始まる行は英語名 */
     else if (buf[0] == 'E') {
-        s = buf + 2;
-        if (!add_name(&r_ptr->E_name, head, s))
-            return PARSE_ERROR_OUT_OF_MEMORY;
+        r_ptr->E_name = std::string(buf + 2);
     }
 #else
     else if (buf[0] == 'E') {
-        s = buf + 2;
-        if (!add_name(&r_ptr->name, head, s))
-            return PARSE_ERROR_OUT_OF_MEMORY;
+        r_ptr->name = std::string(buf + 2);
     }
 #endif
     else if (buf[0] == 'D') {
@@ -127,8 +122,7 @@ errr parse_r_info(char *buf, angband_header *head)
             return PARSE_ERROR_NONE;
         s = buf + 3;
 #endif
-        if (!add_text(&r_ptr->text, head, s, TRUE))
-            return PARSE_ERROR_OUT_OF_MEMORY;
+        r_ptr->text.append(s);
     } else if (buf[0] == 'G') {
         if ((buf[1] != ':') || !buf[2] || (buf[3] != ':') || !buf[4])
             return PARSE_ERROR_GENERIC;
index e9355fc..39aad67 100644 (file)
@@ -2,6 +2,7 @@
 #include "main/angband-headers.h"
 #include "room/rooms-vault.h"
 #include "util/string-processor.h"
+#include <string>
 
 /*!
  * @brief Vault情報(v_info)のパース関数 /
@@ -32,14 +33,11 @@ errr parse_v_info(char *buf, angband_header *head)
 
         error_idx = i;
         v_ptr = &v_info[i];
-        if (!add_name(&v_ptr->name, head, s))
-            return 7;
+        v_ptr->name = std::string(s);
     } else if (!v_ptr)
         return 3;
     else if (buf[0] == 'D') {
-        s = buf + 2;
-        if (!add_text(&v_ptr->text, head, s, FALSE))
-            return 7;
+        v_ptr->text.append(buf + 2);
     } else if (buf[0] == 'X') {
         EFFECT_ID typ, rat, hgt, wid;
         if (4 != sscanf(buf + 2, "%d:%d:%d:%d", &typ, &rat, &hgt, &wid))
index 898ebe1..960e52f 100644 (file)
@@ -170,7 +170,7 @@ static void dump_aux_recall(FILE *fff)
         } else if (max_dlv[y] == d_info[y].maxdepth)
             seiha = TRUE;
 
-        fprintf(fff, _("   %c%-12s: %3d 階\n", "   %c%-16s: level %3d\n"), seiha ? '!' : ' ', d_name + d_info[y].name, (int)max_dlv[y]);
+        fprintf(fff, _("   %c%-12s: %3d 階\n", "   %c%-16s: level %3d\n"), seiha ? '!' : ' ', d_info[y].name.c_str(), (int)max_dlv[y]);
     }
 }
 
@@ -245,9 +245,9 @@ static void dump_aux_arena(player_type *creature_ptr, FILE *fff)
         } else {
 #ifdef JP
             fprintf(
-                fff, "\n 闘技場: %d回戦で%sの前に敗北\n", -creature_ptr->arena_number, r_name + r_info[arena_info[-1 - creature_ptr->arena_number].r_idx].name);
+                fff, "\n 闘技場: %d回戦で%sの前に敗北\n", -creature_ptr->arena_number, r_info[arena_info[-1 - creature_ptr->arena_number].r_idx].name.c_str());
 #else
-            fprintf(fff, "\n Arena: Defeated by %s in the %d%s fight\n", r_name + r_info[arena_info[-1 - creature_ptr->arena_number].r_idx].name,
+            fprintf(fff, "\n Arena: Defeated by %s in the %d%s fight\n", r_info[arena_info[-1 - creature_ptr->arena_number].r_idx].name.c_str(),
                 -creature_ptr->arena_number, get_ordinal_number_suffix(-creature_ptr->arena_number));
 #endif
         }
@@ -297,7 +297,7 @@ static void dump_aux_monsters(player_type *creature_ptr, FILE *fff)
     for (MONRACE_IDX k = 1; k < max_r_idx; k++) {
         /* Ignore unused index */
         monster_race *r_ptr = &r_info[k];
-        if (!r_ptr->name)
+        if (r_ptr->name.empty())
             continue;
 
         if (r_ptr->flags1 & RF1_UNIQUE) {
@@ -349,7 +349,7 @@ static void dump_aux_monsters(player_type *creature_ptr, FILE *fff)
 
     for (MONRACE_IDX k = uniq_total - 1; k >= 0 && k >= uniq_total - 10; k--) {
         monster_race *r_ptr = &r_info[who[k]];
-        fprintf(fff, _("  %-40s (レベル%3d)\n", "  %-40s (level %3d)\n"), (r_name + r_ptr->name), (int)r_ptr->level);
+        fprintf(fff, _("  %-40s (レベル%3d)\n", "  %-40s (level %3d)\n"), r_ptr->name.c_str(), (int)r_ptr->level);
     }
 
     C_KILL(who, max_r_idx, s16b);
index 9f3d028..78fc178 100644 (file)
@@ -57,7 +57,7 @@ static void dump_magic_eater(player_type *creature_ptr, FILE *fff)
             KIND_OBJECT_IDX k_idx = lookup_kind(tval, i);
             if (!k_idx)
                 continue;
-            sprintf(s[eat_num], "%23s (%2d)", (k_name + k_info[k_idx].name), magic_num);
+            sprintf(s[eat_num], "%23s (%2d)", k_info[k_idx].name.c_str(), magic_num);
             eat_num++;
         }
 
index 5346c1a..f310b18 100644 (file)
@@ -87,9 +87,9 @@ static QUEST_IDX write_floor(player_type *creature_ptr, concptr *note_level, cha
        else
        {
 #ifdef JP
-               sprintf(note_level_buf, "%d階(%s):", (int)floor_ptr->dun_level, d_name + d_info[creature_ptr->dungeon_idx].name);
+               sprintf(note_level_buf, "%d階(%s):", (int)floor_ptr->dun_level, d_info[creature_ptr->dungeon_idx].name.c_str());
 #else
-               sprintf(note_level_buf, "%s L%d:", d_name + d_info[creature_ptr->dungeon_idx].name, (int)floor_ptr->dun_level);
+               sprintf(note_level_buf, "%s L%d:", d_info[creature_ptr->dungeon_idx].name.c_str(), (int)floor_ptr->dun_level);
 #endif
                *note_level = note_level_buf;
        }
@@ -257,7 +257,7 @@ errr exe_write_diary(player_type *creature_ptr, int type, int num, concptr note)
        case DIARY_RAND_QUEST_C:
        {
                GAME_TEXT name[MAX_NLEN];
-               strcpy(name, r_name + r_info[quest[num].r_idx].name);
+        strcpy(name, r_info[quest[num].r_idx].name.c_str());
                fprintf(fff, _(" %2d:%02d %20s ランダムクエスト(%s)を達成した。\n",
                        " %2d:%02d %20s completed random quest '%s'\n"), hour, min, note_level, name);
                break;
@@ -265,7 +265,7 @@ errr exe_write_diary(player_type *creature_ptr, int type, int num, concptr note)
        case DIARY_RAND_QUEST_F:
        {
                GAME_TEXT name[MAX_NLEN];
-               strcpy(name, r_name + r_info[quest[num].r_idx].name);
+               strcpy(name, r_info[quest[num].r_idx].name.c_str());
                fprintf(fff, _(" %2d:%02d %20s ランダムクエスト(%s)から逃げ出した。\n",
                        " %2d:%02d %20s ran away from quest '%s'.\n"), hour, min, note_level, name);
                break;
@@ -274,16 +274,16 @@ errr exe_write_diary(player_type *creature_ptr, int type, int num, concptr note)
        {
                fprintf(fff, _(" %2d:%02d %20s %sの最深階%d階に到達した。\n",
                        " %2d:%02d %20s reached level %d of %s for the first time.\n"), hour, min, note_level,
-                       _(d_name + d_info[creature_ptr->dungeon_idx].name, num),
-                       _(num, d_name + d_info[creature_ptr->dungeon_idx].name));
+                       _(d_info[creature_ptr->dungeon_idx].name.c_str(), num),
+                       _(num, d_info[creature_ptr->dungeon_idx].name.c_str()));
                break;
        }
        case DIARY_TRUMP:
        {
                fprintf(fff, _(" %2d:%02d %20s %s%sの最深階を%d階にセットした。\n",
                        " %2d:%02d %20s reset recall level of %s to %d %s.\n"), hour, min, note_level, note,
-                       _(d_name + d_info[num].name, (int)max_dlv[num]),
-                       _((int)max_dlv[num], d_name + d_info[num].name));
+                       _(d_info[num].name.c_str(), (int)max_dlv[num]),
+                       _((int)max_dlv[num], d_info[num].name.c_str()));
                break;
        }
        case DIARY_STAIR:
@@ -301,8 +301,8 @@ errr exe_write_diary(player_type *creature_ptr, int type, int num, concptr note)
        {
                if (!num)
                        fprintf(fff, _(" %2d:%02d %20s 帰還を使って%sの%d階へ下りた。\n", " %2d:%02d %20s recalled to dungeon level %d of %s.\n"),
-                               hour, min, note_level, _(d_name + d_info[creature_ptr->dungeon_idx].name, (int)max_dlv[creature_ptr->dungeon_idx]),
-                               _((int)max_dlv[creature_ptr->dungeon_idx], d_name + d_info[creature_ptr->dungeon_idx].name));
+                               hour, min, note_level, _(d_info[creature_ptr->dungeon_idx].name.c_str(), (int)max_dlv[creature_ptr->dungeon_idx]),
+                               _((int)max_dlv[creature_ptr->dungeon_idx], d_info[creature_ptr->dungeon_idx].name.c_str()));
                else
                        fprintf(fff, _(" %2d:%02d %20s 帰還を使って地上へと戻った。\n", " %2d:%02d %20s recalled from dungeon to surface.\n"), hour, min, note_level);
 
@@ -363,7 +363,7 @@ errr exe_write_diary(player_type *creature_ptr, int type, int num, concptr note)
        {
         concptr to = !is_in_dungeon(creature_ptr)
                        ? _("地上", "the surface")
-                       : format(_("%d階(%s)", "level %d of %s"), creature_ptr->current_floor_ptr->dun_level, d_name + d_info[creature_ptr->dungeon_idx].name);
+                       : format(_("%d階(%s)", "level %d of %s"), creature_ptr->current_floor_ptr->dun_level, d_info[creature_ptr->dungeon_idx].name.c_str());
                fprintf(fff, _(" %2d:%02d %20s %sへとウィザード・テレポートで移動した。\n",
                        " %2d:%02d %20s wizard-teleported to %s.\n"), hour, min, note_level, to);
                break;
@@ -372,7 +372,7 @@ errr exe_write_diary(player_type *creature_ptr, int type, int num, concptr note)
        {
                concptr to = !is_in_dungeon(creature_ptr)
                        ? _("地上", "the surface")
-                       : format(_("%d階(%s)", "level %d of %s"), creature_ptr->current_floor_ptr->dun_level, d_name + d_info[creature_ptr->dungeon_idx].name);
+                       : format(_("%d階(%s)", "level %d of %s"), creature_ptr->current_floor_ptr->dun_level, d_info[creature_ptr->dungeon_idx].name.c_str());
                fprintf(fff, _(" %2d:%02d %20s %sへとパターンの力で移動した。\n",
                        " %2d:%02d %20s used Pattern to teleport to %s.\n"), hour, min, note_level, to);
                break;
index 7c5f6e8..6819d55 100644 (file)
@@ -29,7 +29,7 @@ static FEAT_IDX collect_features(FEAT_IDX *feat_idx, BIT_FLAGS8 mode)
     FEAT_IDX feat_cnt = 0;
     for (FEAT_IDX i = 0; i < max_f_idx; i++) {
         feature_type *f_ptr = &f_info[i];
-        if (!f_ptr->name)
+        if (f_ptr->name.empty())
             continue;
         if (f_ptr->mimic != i)
             continue;
@@ -61,9 +61,9 @@ static void display_feature_list(int col, int row, int per_page, FEAT_IDX *feat_
         feature_type *f_ptr = &f_info[f_idx];
         int row_i = row + i;
         attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
-        c_prt(attr, f_name + f_ptr->name, row_i, col);
+        c_prt(attr, f_ptr->name.c_str(), row_i, col);
         if (per_page == 1) {
-            c_prt(attr, format("(%s)", lighting_level_str[lighting_level]), row_i, col + 1 + strlen(f_name + f_ptr->name));
+            c_prt(attr, format("(%s)", lighting_level_str[lighting_level]), row_i, col + 1 + f_ptr->name.size());
             c_prt(attr, format("%02x/%02x", f_ptr->x_attr[lighting_level], f_ptr->x_char[lighting_level]), row_i,
                 f_idx_col - ((current_world_ptr->wizard || visual_only) ? 6 : 2));
         }
@@ -360,7 +360,7 @@ void do_cmd_knowledge_dungeon(player_type *creature_ptr)
         } else if (max_dlv[i] == d_info[i].maxdepth)
             seiha = TRUE;
 
-        fprintf(fff, _("%c%-12s :  %3d 階\n", "%c%-16s :  level %3d\n"), seiha ? '!' : ' ', d_name + d_info[i].name, (int)max_dlv[i]);
+        fprintf(fff, _("%c%-12s :  %3d 階\n", "%c%-16s :  level %3d\n"), seiha ? '!' : ' ', d_info[i].name.c_str(), (int)max_dlv[i]);
     }
 
     angband_fclose(fff);
index e52ddd0..22a1a4e 100644 (file)
@@ -54,7 +54,7 @@ void do_cmd_knowledge_artifacts(player_type *player_ptr)
     for (ARTIFACT_IDX k = 0; k < max_a_idx; k++) {
         artifact_type *a_ptr = &a_info[k];
         okay[k] = FALSE;
-        if (!a_ptr->name)
+        if (a_ptr->name.empty())
             continue;
         if (!a_ptr->cur_num)
             continue;
@@ -138,7 +138,7 @@ static KIND_OBJECT_IDX collect_objects(int grp_cur, KIND_OBJECT_IDX object_idx[]
     byte group_tval = object_group_tval[grp_cur];
     for (KIND_OBJECT_IDX i = 0; i < max_k_idx; i++) {
         object_kind *k_ptr = &k_info[i];
-        if (!k_ptr->name)
+        if (k_ptr->name.empty())
             continue;
 
         if (!(mode & 0x02)) {
@@ -199,7 +199,7 @@ static void display_object_list(int col, int row, int per_page, IDX object_idx[]
         if (!k_ptr->flavor || (!visual_only && k_ptr->aware)) {
             strip_name(o_name, k_idx);
         } else {
-            strcpy(o_name, k_name + flavor_k_ptr->flavor_name);
+            strcpy(o_name, flavor_k_ptr->flavor_name.c_str());
         }
 
         c_prt(attr, o_name, row + i, col);
index 88fc518..8599c5c 100644 (file)
@@ -59,7 +59,7 @@ static IDX collect_monsters(player_type *creature_ptr, IDX grp_cur, IDX mon_idx[
     IDX mon_cnt = 0;
     for (IDX i = 0; i < max_r_idx; i++) {
         monster_race *r_ptr = &r_info[i];
-        if (!r_ptr->name)
+        if (r_ptr->name.empty())
             continue;
         if (((mode != MONSTER_LORE_DEBUG) && (mode != MONSTER_LORE_RESEARCH)) && !cheat_know && !r_ptr->r_sights)
             continue;
@@ -192,7 +192,7 @@ void do_cmd_knowledge_kill_count(player_type *creature_ptr)
     int n = 0;
     for (MONRACE_IDX i = 1; i < max_r_idx; i++) {
         monster_race *r_ptr = &r_info[i];
-        if (r_ptr->name)
+        if (!r_ptr->name.empty())
             who[n++] = i;
     }
 
@@ -203,7 +203,7 @@ void do_cmd_knowledge_kill_count(player_type *creature_ptr)
         if (any_bits(r_ptr->flags1, RF1_UNIQUE)) {
             bool dead = (r_ptr->max_num == 0);
             if (dead) {
-                fprintf(fff, "     %s\n", (r_name + r_ptr->name));
+                fprintf(fff, "     %s\n", r_ptr->name.c_str());
                 total++;
             }
 
@@ -216,17 +216,17 @@ void do_cmd_knowledge_kill_count(player_type *creature_ptr)
 
 #ifdef JP
         concptr number_of_kills = angband_strchr("pt", r_ptr->d_char) ? "人" : "体";
-        fprintf(fff, "     %3d %sの %s\n", (int)this_monster, number_of_kills, r_name + r_ptr->name);
+        fprintf(fff, "     %3d %sの %s\n", (int)this_monster, number_of_kills, r_ptr->name.c_str());
 #else
         if (this_monster < 2) {
-            if (angband_strstr(r_name + r_ptr->name, "coins")) {
-                fprintf(fff, "     1 pile of %s\n", (r_name + r_ptr->name));
+            if (angband_strstr(r_ptr->name.c_str(), "coins")) {
+                fprintf(fff, "     1 pile of %s\n", r_ptr->name.c_str());
             } else {
-                fprintf(fff, "     1 %s\n", (r_name + r_ptr->name));
+                fprintf(fff, "     1 %s\n", r_ptr->name.c_str());
             }
         } else {
             char ToPlural[80];
-            strcpy(ToPlural, (r_name + r_ptr->name));
+            strcpy(ToPlural, r_ptr->name.c_str());
             plural_aux(ToPlural);
             fprintf(fff, "     %d %s\n", this_monster, ToPlural);
         }
@@ -258,7 +258,7 @@ static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
         MONRACE_IDX r_idx = mon_idx[mon_top + i];
         monster_race *r_ptr = &r_info[r_idx];
         attr = ((i + mon_top == mon_cur) ? TERM_L_BLUE : TERM_WHITE);
-        c_prt(attr, (r_name + r_ptr->name), row + i, col);
+        c_prt(attr, (r_ptr->name.c_str()), row + i, col);
         if (per_page == 1)
             c_prt(attr, format("%02x/%02x", r_ptr->x_attr, r_ptr->x_char), row + i, (current_world_ptr->wizard || visual_only) ? 56 : 61);
 
@@ -470,7 +470,7 @@ void do_cmd_knowledge_bounty(player_type *creature_ptr)
         return;
 
     fprintf(fff, _("今日のターゲット : %s\n", "Today's target : %s\n"),
-        (creature_ptr->today_mon ? r_name + r_info[creature_ptr->today_mon].name : _("不明", "unknown")));
+        (creature_ptr->today_mon ? r_info[creature_ptr->today_mon].name.c_str() : _("不明", "unknown")));
     fprintf(fff, "\n");
     fprintf(fff, _("賞金首リスト\n", "List of wanted monsters\n"));
     fprintf(fff, "----------------------------------------------\n");
@@ -478,7 +478,7 @@ void do_cmd_knowledge_bounty(player_type *creature_ptr)
     bool listed = FALSE;
     for (int i = 0; i < MAX_BOUNTY; i++) {
         if (current_world_ptr->bounty_r_idx[i] <= 10000) {
-            fprintf(fff, "%s\n", r_name + r_info[current_world_ptr->bounty_r_idx[i]].name);
+            fprintf(fff, "%s\n", r_info[current_world_ptr->bounty_r_idx[i]].name.c_str());
             listed = TRUE;
         }
     }
index 50934dd..c9f281b 100644 (file)
@@ -82,7 +82,7 @@ static void do_cmd_knowledge_quests_current(player_type *creature_ptr, FILE *fff
                 case QUEST_TYPE_KILL_LEVEL:
                 case QUEST_TYPE_KILL_ANY_LEVEL:
                     r_ptr = &r_info[quest[i].r_idx];
-                    strcpy(name, r_name + r_ptr->name);
+                    strcpy(name, r_ptr->name.c_str());
                     if (quest[i].max_num > 1) {
 #ifdef JP
                         sprintf(note, " - %d 体の%sを倒す。(あと %d 体)", (int)quest[i].max_num, name, (int)(quest[i].max_num - quest[i].cur_num));
@@ -151,7 +151,7 @@ static void do_cmd_knowledge_quests_current(player_type *creature_ptr, FILE *fff
             continue;
 
         r_ptr = &r_info[quest[i].r_idx];
-        strcpy(name, r_name + r_ptr->name);
+        strcpy(name, r_ptr->name.c_str());
         if (quest[i].max_num <= 1) {
             sprintf(rand_tmp_str, _("  %s (%d 階) - %sを倒す。\n", "  %s (Dungeon level: %d)\n  Kill %s.\n"), quest[i].name, (int)quest[i].level, name);
             continue;
@@ -203,12 +203,12 @@ static bool do_cmd_knowledge_quests_aux(player_type *player_ptr, FILE *fff, IDX
 
     if (q_ptr->complev == 0) {
         sprintf(tmp_str, _("  %-35s (%3d階)            -   不戦勝 - %s\n", "  %-35s (Dungeon level: %3d) - Unearned - %s\n"),
-            r_name + r_info[q_ptr->r_idx].name, (int)q_ptr->level, playtime_str);
+            r_info[q_ptr->r_idx].name.c_str(), (int)q_ptr->level, playtime_str);
         fputs(tmp_str, fff);
         return TRUE;
     }
 
-    sprintf(tmp_str, _("  %-35s (%3d階)            - レベル%2d - %s\n", "  %-35s (Dungeon level: %3d) - level %2d - %s\n"), r_name + r_info[q_ptr->r_idx].name,
+    sprintf(tmp_str, _("  %-35s (%3d階)            - レベル%2d - %s\n", "  %-35s (Dungeon level: %3d) - level %2d - %s\n"), r_info[q_ptr->r_idx].name.c_str(),
         (int)q_ptr->level, q_ptr->complev, playtime_str);
     fputs(tmp_str, fff);
     return TRUE;
@@ -276,7 +276,7 @@ static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
 
         if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN)) {
             total++;
-            sprintf(tmp_str, _("  %s (%d階, %s)\n", "  %s (%d, %s)\n"), quest[i].name, (int)quest[i].level, r_name + r_info[quest[i].r_idx].name);
+            sprintf(tmp_str, _("  %s (%d階, %s)\n", "  %s (%d, %s)\n"), quest[i].name, (int)quest[i].level, r_info[quest[i].r_idx].name.c_str());
             fputs(tmp_str, fff);
         }
     }
index 4bbbd20..502931b 100644 (file)
@@ -49,7 +49,7 @@ unique_list_type *initialize_unique_lsit_type(unique_list_type *unique_list_ptr,
  */
 static bool sweep_uniques(monster_race *r_ptr, bool is_alive)
 {
-    if (!r_ptr->name)
+    if (r_ptr->name.empty())
         return FALSE;
 
     if (!(r_ptr->flags1 & RF1_UNIQUE))
@@ -110,7 +110,7 @@ static void display_uniques(unique_list_type *unique_list_ptr, FILE *fff)
 
     for (int k = 0; k < unique_list_ptr->n; k++) {
         monster_race *r_ptr = &r_info[unique_list_ptr->who[k]];
-        fprintf(fff, _("     %s (レベル%d)\n", "     %s (level %d)\n"), r_name + r_ptr->name, (int)r_ptr->level);
+        fprintf(fff, _("     %s (レベル%d)\n", "     %s (level %d)\n"), r_ptr->name.c_str(), (int)r_ptr->level);
     }
 }
 
index 9763013..12d3b6d 100644 (file)
@@ -318,14 +318,14 @@ void rd_item_old(player_type *player_ptr, object_type *o_ptr)
     if (object_is_fixed_artifact(o_ptr)) {
         artifact_type *a_ptr;
         a_ptr = &a_info[o_ptr->name1];
-        if (!a_ptr->name)
+        if (a_ptr->name.empty())
             o_ptr->name1 = 0;
     }
 
     if (object_is_ego(o_ptr)) {
         ego_item_type *e_ptr;
         e_ptr = &e_info[o_ptr->name2];
-        if (!e_ptr->name)
+        if (e_ptr->name.empty())
             o_ptr->name2 = 0;
     }
 }
index 267e9ab..9350e7b 100644 (file)
@@ -135,7 +135,7 @@ void process_monster_lore(player_type *player_ptr, MONRACE_IDX r_idx, monster_lo
     set_flags1(lore_ptr);
     set_race_flags(lore_ptr);
     display_kill_numbers(lore_ptr);
-    concptr tmp = r_text + lore_ptr->r_ptr->text;
+    concptr tmp = lore_ptr->r_ptr->text.c_str();
     if (tmp[0]) {
         hooked_roff(tmp);
         hooked_roff("\n");
index 24720cd..4cb56b6 100644 (file)
@@ -9,31 +9,8 @@ typedef struct angband_header angband_header;
 typedef errr (*parse_info_txt_func)(char *buf, angband_header *head);
 
 struct angband_header {
-    byte v_major; //!< Major version
-    byte v_minor; //!< Minor version
-    byte v_patch; //!< Patch version
     byte checksum; //!< Checksum of "info" records
-
     u16b info_num; //!< このinfoのデータ数
-    int info_len; //!< このinfoの総サイズ
-    u16b head_size; //!< このinfoのヘッダサイズ
-
-    STR_OFFSET info_size; //!< info配列サイズ
-    STR_OFFSET name_size; //!< 名前文字列群サイズ(総文字長)
-    STR_OFFSET text_size; //!< フレーバー文字列群サイズ(総文字長)
-    STR_OFFSET tag_size; //!< タグ文字列群サイズ(総文字長)
-
-    void *info_ptr; //!< info配列へのポインタ
-    char *name_ptr; //!< 名前文字列群へのポインタ
-    char *text_ptr; //!< フレーバー文字列群へのポインタ
-    char *tag_ptr; //!< タグ文字列群へのポインタ
-
-    parse_info_txt_func parse_info_txt; //!< Pointer to parser callback function
-
-    void (*retouch)(angband_header *head); //!< 設定再読み込み用?
-
-    byte v_extra; ///< Extra version for Alpha, Beta
-    byte v_savefile; ///< Savefile version
 };
 
 extern angband_header f_head;
index 44794fb..e95c6a1 100644 (file)
@@ -276,30 +276,30 @@ void init_angband(player_type *player_ptr, process_autopick_file_command_pf proc
         quit(_("その他の変数を初期化できません", "Cannot initialize misc. values"));
 
     init_note(_("[データの初期化中... (地形)]", "[Initializing arrays... (features)]"));
-    if (init_f_info(player_ptr))
+    if (init_f_info())
         quit(_("地形初期化不能", "Cannot initialize features"));
 
     if (init_feat_variables())
         quit(_("地形初期化不能", "Cannot initialize features"));
 
     init_note(_("[データの初期化中... (アイテム)]", "[Initializing arrays... (objects)]"));
-    if (init_k_info(player_ptr))
+    if (init_k_info())
         quit(_("アイテム初期化不能", "Cannot initialize objects"));
 
     init_note(_("[データの初期化中... (伝説のアイテム)]", "[Initializing arrays... (artifacts)]"));
-    if (init_a_info(player_ptr))
+    if (init_a_info())
         quit(_("伝説のアイテム初期化不能", "Cannot initialize artifacts"));
 
     init_note(_("[データの初期化中... (名のあるアイテム)]", "[Initializing arrays... (ego-items)]"));
-    if (init_e_info(player_ptr))
+    if (init_e_info())
         quit(_("名のあるアイテム初期化不能", "Cannot initialize ego-items"));
 
     init_note(_("[データの初期化中... (モンスター)]", "[Initializing arrays... (monsters)]"));
-    if (init_r_info(player_ptr))
+    if (init_r_info())
         quit(_("モンスター初期化不能", "Cannot initialize monsters"));
 
     init_note(_("[データの初期化中... (ダンジョン)]", "[Initializing arrays... (dungeon)]"));
-    if (init_d_info(player_ptr))
+    if (init_d_info())
         quit(_("ダンジョン初期化不能", "Cannot initialize dungeon"));
 
     for (int i = 1; i < current_world_ptr->max_d_idx; i++)
@@ -307,11 +307,11 @@ void init_angband(player_type *player_ptr, process_autopick_file_command_pf proc
             r_info[d_info[i].final_guardian].flags7 |= RF7_GUARDIAN;
 
     init_note(_("[データの初期化中... (魔法)]", "[Initializing arrays... (magic)]"));
-    if (init_m_info(player_ptr))
+    if (init_m_info())
         quit(_("魔法初期化不能", "Cannot initialize magic"));
 
     init_note(_("[データの初期化中... (熟練度)]", "[Initializing arrays... (skill)]"));
-    if (init_s_info(player_ptr))
+    if (init_s_info())
         quit(_("熟練度初期化不能", "Cannot initialize skill"));
 
     init_note(_("[配列を初期化しています... (荒野)]", "[Initializing arrays... (wilderness)]"));
@@ -330,7 +330,7 @@ void init_angband(player_type *player_ptr, process_autopick_file_command_pf proc
     if (init_quests())
         quit(_("クエストを初期化できません", "Cannot initialize quests"));
 
-    if (init_v_info(player_ptr))
+    if (init_v_info())
         quit(_("vault 初期化不能", "Cannot initialize vaults"));
 
     init_note(_("[データの初期化中... (その他)]", "[Initializing arrays... (other)]"));
index be228ef..2048a06 100644 (file)
 errr init_misc(player_type *player_ptr) { return parse_fixed_map(player_ptr, "misc.txt", 0, 0, 0, 0); }
 
 /*!
- * @brief rawファイルからのデータの読み取り処理
- * Initialize the "*_info" array, by parsing a binary "image" file
- * @param fd ファイルディスクリプタ
- * @param head rawファイルのヘッダ
- * @return エラーコード
- */
-static errr init_info_raw(int fd, angband_header *head)
-{
-    angband_header test;
-    if (fd_read(fd, (char *)(&test), sizeof(angband_header))
-        || (test.v_major != head->v_major) || (test.v_minor != head->v_minor) || (test.v_patch != head->v_patch)
-        || (test.v_extra != head->v_extra) || (test.v_savefile != head->v_savefile)
-        || (test.head_size != head->head_size) || (test.info_size != head->info_size)
-        || (test.info_num != head->info_num) || (test.info_len != head->info_len))
-        return -1;
-
-    *head = test;
-    C_MAKE(head->info_ptr, head->info_size, char);
-    fd_read(fd, static_cast<char*>(head->info_ptr), head->info_size);
-    if (head->name_size) {
-        C_MAKE(head->name_ptr, head->name_size, char);
-        fd_read(fd, head->name_ptr, head->name_size);
-    }
-
-    if (head->text_size) {
-        C_MAKE(head->text_ptr, head->text_size, char);
-        fd_read(fd, head->text_ptr, head->text_size);
-    }
-
-    if (head->tag_size) {
-        C_MAKE(head->tag_ptr, head->tag_size, char);
-        fd_read(fd, head->tag_ptr, head->tag_size);
-    }
-
-    return 0;
-}
-
-static void update_header(angband_header *head, void **info, char **name, char **text, char **tag)
-{
-    if (info)
-        *info = static_cast<char*>(head->info_ptr);
-
-    if (name)
-        *name = head->name_ptr;
-
-    if (text)
-        *text = head->text_ptr;
-
-    if (tag)
-        *tag = head->tag_ptr;
-}
-
-/*!
  * @brief ヘッダ構造体の更新
  * Initialize the header of an *_info.raw file.
  * @param head rawファイルのヘッダ
@@ -101,111 +48,39 @@ static void update_header(angband_header *head, void **info, char **name, char *
  * @param len データの長さ
  * @return エラーコード
  */
-static void init_header(angband_header *head, IDX num, int len)
+static void init_header(angband_header *head, IDX num)
 {
-    head->v_major = FAKE_VER_MAJOR;
-    head->v_minor = FAKE_VER_MINOR;
-    head->v_patch = FAKE_VER_PATCH;
     head->checksum = 0;
-
     head->info_num = (IDX)num;
-    head->info_len = len;
-
-    head->head_size = sizeof(angband_header);
-    head->info_size = head->info_num * head->info_len;
-
-    head->v_extra = FAKE_VER_EXTRA;
-    head->v_savefile = SAVEFILE_VERSION;
-}
-
-/*!
- * @brief テキストファイルとrawファイルの更新時刻を比較する
- * Find the default paths to all of our important sub-directories.
- * @param fd ファイルディスクリプタ
- * @param template_file ファイル名
- * @return テキストの方が新しいか、rawファイルがなく更新の必要がある場合-1、更新の必要がない場合0。
- */
-static errr check_modification_date(int fd, concptr template_file)
-{
-    struct stat txt_stat, raw_stat;
-    char buf[1024];
-    path_build(buf, sizeof(buf), ANGBAND_DIR_EDIT, template_file);
-    if (stat(buf, &txt_stat))
-        return 0;
-
-    if (fstat(fd, &raw_stat))
-        return -1;
-
-    if (txt_stat.st_mtime > raw_stat.st_mtime)
-        return -1;
-
-    return 0;
 }
 
 /*!
- * @brief ヘッダ構造体の更新
+ * @brief 各種設定データをlib/edit/のテキストから読み込み
  * Initialize the "*_info" array
- * @param filename ファイル名(拡張子txt/raw)
+ * @param filename ファイル名(拡張子txt)
  * @param head 処理に用いるヘッダ構造体
  * @param info データ保管先の構造体ポインタ
- * @param name 名称用可変文字列の保管先
- * @param text テキスト用可変文字列の保管先
- * @param tag タグ用可変文字列の保管先
  * @return エラーコード
  * @note
  * Note that we let each entry have a unique "name" and "text" string,
  * even if the string happens to be empty (everyone has a unique '\0').
  */
-static errr init_info(player_type *player_ptr, concptr filename, angband_header *head, void **info, char **name, char **text, char **tag)
+template <typename InfoType>
+static errr init_info(concptr filename, angband_header& head, InfoType*& info, parse_info_txt_func parser, void(*retouch)(angband_header *head))
 {
     char buf[1024];
-    path_build(buf, sizeof(buf), ANGBAND_DIR_DATA, format(_("%s_j.raw", "%s.raw"), filename));
-    int fd = fd_open(buf, O_RDONLY);
-    errr err = 1;
-    if (fd >= 0) {
-        err = check_modification_date(fd, format("%s.txt", filename));
-        if (!err)
-            err = init_info_raw(fd, head);
-
-        (void)fd_close(fd);
-    }
-
-    BIT_FLAGS file_permission = 0644;
-    if (err == 0) {
-        update_header(head, info, name, text, tag);
-        return 0;
-    }
-
-    C_MAKE(head->info_ptr, head->info_size, char);
-    if (name)
-        C_MAKE(head->name_ptr, FAKE_NAME_SIZE, char);
-
-    if (text)
-        C_MAKE(head->text_ptr, FAKE_TEXT_SIZE, char);
-
-    if (tag)
-        C_MAKE(head->tag_ptr, FAKE_TAG_SIZE, char);
-
-    if (info)
-        *info = static_cast<char*>(head->info_ptr);
-
-    if (name)
-        *name = head->name_ptr;
-
-    if (text)
-        *text = head->text_ptr;
+    path_build(buf, sizeof(buf), ANGBAND_DIR_EDIT, format("%s.txt", filename));
 
-    if (tag)
-        *tag = head->tag_ptr;
+    FILE *fp = angband_fopen(buf, "r");
 
-    path_build(buf, sizeof(buf), ANGBAND_DIR_EDIT, format("%s.txt", filename));
-    FILE *fp;
-    fp = angband_fopen(buf, "r");
     if (!fp)
         quit(format(_("'%s.txt'ファイルをオープンできません。", "Cannot open '%s.txt' file."), filename));
 
-    err = init_info_txt(fp, buf, head, head->parse_info_txt);
+    C_MAKE(info, head.info_num, InfoType);
+
+    errr err = init_info_txt(fp, buf, &head, parser);
     angband_fclose(fp);
+
     if (err) {
         concptr oops = (((err > 0) && (err < PARSE_ERROR_MAX)) ? err_str[err] : _("未知の", "unknown"));
 #ifdef JP
@@ -219,45 +94,9 @@ static errr init_info(player_type *player_ptr, concptr filename, angband_header
         quit(format(_("'%s.txt'ファイルにエラー", "Error in '%s.txt' file."), filename));
     }
 
-    if (head->retouch)
-        (*head->retouch)(head);
-
-    path_build(buf, sizeof(buf), ANGBAND_DIR_DATA, format(_("%s_j.raw", "%s.raw"), filename));
-    safe_setuid_grab(player_ptr);
-    (void)fd_kill(buf);
-    fd = fd_make(buf, file_permission);
-    safe_setuid_drop();
-    if (fd >= 0) {
-        fd_write(fd, (concptr)(head), head->head_size);
-        fd_write(fd, static_cast<concptr>(head->info_ptr), head->info_size);
-        fd_write(fd, head->name_ptr, head->name_size);
-        fd_write(fd, head->text_ptr, head->text_size);
-        fd_write(fd, head->tag_ptr, head->tag_size);
-        (void)fd_close(fd);
-    }
-
-    C_FREE(static_cast<char *>(head->info_ptr), head->info_size, char);
-    head->info_ptr = nullptr;
-    if (name)
-        C_KILL(head->name_ptr, FAKE_NAME_SIZE, char);
-
-    if (text)
-        C_KILL(head->text_ptr, FAKE_TEXT_SIZE, char);
-
-    if (tag)
-        C_KILL(head->tag_ptr, FAKE_TAG_SIZE, char);
-
-    path_build(buf, sizeof(buf), ANGBAND_DIR_DATA, format(_("%s_j.raw", "%s.raw"), filename));
-    fd = fd_open(buf, O_RDONLY);
-    if (fd < 0)
-        quit(format(_("'%s_j.raw'ファイルをロードできません。", "Cannot load '%s.raw' file."), filename));
-
-    err = init_info_raw(fd, head);
-    (void)fd_close(fd);
-    if (err)
-        quit(format(_("'%s_j.raw'ファイルを解析できません。", "Cannot parse '%s.raw' file."), filename));
+    if (retouch)
+        (*retouch)(&head);
 
-    update_header(head, info, name, text, tag);
     return 0;
 }
 
@@ -266,12 +105,10 @@ static errr init_info(player_type *player_ptr, concptr filename, angband_header
  * Initialize the "f_info" array
  * @return エラーコード
  */
-errr init_f_info(player_type *player_ptr)
+errr init_f_info()
 {
-    init_header(&f_head, max_f_idx, sizeof(feature_type));
-    f_head.parse_info_txt = parse_f_info;
-    f_head.retouch = retouch_f_info;
-    return init_info(player_ptr, "f_info", &f_head, reinterpret_cast<void**>(&f_info), &f_name, NULL, &f_tag);
+    init_header(&f_head, max_f_idx);
+    return init_info("f_info", f_head, f_info, parse_f_info, retouch_f_info);
 }
 
 /*!
@@ -279,11 +116,10 @@ errr init_f_info(player_type *player_ptr)
  * Initialize the "k_info" array
  * @return エラーコード
  */
-errr init_k_info(player_type *player_ptr)
+errr init_k_info()
 {
-    init_header(&k_head, max_k_idx, sizeof(object_kind));
-    k_head.parse_info_txt = parse_k_info;
-    return init_info(player_ptr, "k_info", &k_head, reinterpret_cast<void**>(&k_info), &k_name, &k_text, NULL);
+    init_header(&k_head, max_k_idx);
+    return init_info("k_info", k_head, k_info, parse_k_info, NULL);
 }
 
 /*!
@@ -291,11 +127,10 @@ errr init_k_info(player_type *player_ptr)
  * Initialize the "a_info" array
  * @return エラーコード
  */
-errr init_a_info(player_type *player_ptr)
+errr init_a_info()
 {
-    init_header(&a_head, max_a_idx, sizeof(artifact_type));
-    a_head.parse_info_txt = parse_a_info;
-    return init_info(player_ptr, "a_info", &a_head, reinterpret_cast<void**>(&a_info), &a_name, &a_text, NULL);
+    init_header(&a_head, max_a_idx);
+    return init_info("a_info", a_head, a_info, parse_a_info, NULL);
 }
 
 /*!
@@ -303,11 +138,10 @@ errr init_a_info(player_type *player_ptr)
  * Initialize the "e_info" array
  * @return エラーコード
  */
-errr init_e_info(player_type *player_ptr)
+errr init_e_info()
 {
-    init_header(&e_head, max_e_idx, sizeof(ego_item_type));
-    e_head.parse_info_txt = parse_e_info;
-    return init_info(player_ptr, "e_info", &e_head, reinterpret_cast<void**>(&e_info), &e_name, &e_text, NULL);
+    init_header(&e_head, max_e_idx);
+    return init_info("e_info", e_head, e_info, parse_e_info, NULL);
 }
 
 /*!
@@ -315,11 +149,10 @@ errr init_e_info(player_type *player_ptr)
  * Initialize the "r_info" array
  * @return エラーコード
  */
-errr init_r_info(player_type *player_ptr)
+errr init_r_info()
 {
-    init_header(&r_head, max_r_idx, sizeof(monster_race));
-    r_head.parse_info_txt = parse_r_info;
-    return init_info(player_ptr, "r_info", &r_head, reinterpret_cast<void**>(&r_info), &r_name, &r_text, NULL);
+    init_header(&r_head, max_r_idx);
+    return init_info("r_info", r_head, r_info, parse_r_info, NULL);
 }
 
 /*!
@@ -327,11 +160,10 @@ errr init_r_info(player_type *player_ptr)
  * Initialize the "d_info" array
  * @return エラーコード
  */
-errr init_d_info(player_type *player_ptr)
+errr init_d_info()
 {
-    init_header(&d_head, current_world_ptr->max_d_idx, sizeof(dungeon_type));
-    d_head.parse_info_txt = parse_d_info;
-    return init_info(player_ptr, "d_info", &d_head, reinterpret_cast<void**>(&d_info), &d_name, &d_text, NULL);
+    init_header(&d_head, current_world_ptr->max_d_idx);
+    return init_info("d_info", d_head, d_info, parse_d_info, NULL);
 }
 
 /*!
@@ -342,11 +174,10 @@ errr init_d_info(player_type *player_ptr)
  * Note that we let each entry have a unique "name" and "text" string,
  * even if the string happens to be empty (everyone has a unique '\0').
  */
-errr init_v_info(player_type *player_ptr)
+errr init_v_info()
 {
-    init_header(&v_head, max_v_idx, sizeof(vault_type));
-    v_head.parse_info_txt = parse_v_info;
-    return init_info(player_ptr, "v_info", &v_head, reinterpret_cast<void**>(&v_info), &v_name, &v_text, NULL);
+    init_header(&v_head, max_v_idx);
+    return init_info("v_info", v_head, v_info, parse_v_info, NULL);
 }
 
 /*!
@@ -354,11 +185,10 @@ errr init_v_info(player_type *player_ptr)
  * Initialize the "s_info" array
  * @return エラーコード
  */
-errr init_s_info(player_type *player_ptr)
+errr init_s_info()
 {
-    init_header(&s_head, MAX_CLASS, sizeof(skill_table));
-    s_head.parse_info_txt = parse_s_info;
-    return init_info(player_ptr, "s_info", &s_head, reinterpret_cast<void**>(&s_info), NULL, NULL, NULL);
+    init_header(&s_head, MAX_CLASS);
+    return init_info("s_info", s_head, s_info, parse_s_info, NULL);
 }
 
 /*!
@@ -366,9 +196,8 @@ errr init_s_info(player_type *player_ptr)
  * Initialize the "m_info" array
  * @return エラーコード
  */
-errr init_m_info(player_type *player_ptr)
+errr init_m_info()
 {
-    init_header(&m_head, MAX_CLASS, sizeof(player_magic));
-    m_head.parse_info_txt = parse_m_info;
-    return init_info(player_ptr, "m_info", &m_head, reinterpret_cast<void**>(&m_info), NULL, NULL, NULL);
+    init_header(&m_head, MAX_CLASS);
+    return init_info("m_info", m_head, m_info, parse_m_info, NULL);
 }
index 568d303..26d5644 100644 (file)
@@ -1,14 +1,14 @@
-#pragma once
+#pragma once
 
 #include "system/angband.h"
 
 errr init_misc(player_type *player_ptr);
-errr init_f_info(player_type *player_ptr);
-errr init_k_info(player_type *player_ptr);
-errr init_a_info(player_type *player_ptr);
-errr init_e_info(player_type *player_ptr);
-errr init_r_info(player_type *player_ptr);
-errr init_d_info(player_type *player_ptr);
-errr init_v_info(player_type *player_ptr);
-errr init_s_info(player_type *player_ptr);
-errr init_m_info(player_type *player_ptr);
+errr init_f_info();
+errr init_k_info();
+errr init_a_info();
+errr init_e_info();
+errr init_r_info();
+errr init_d_info();
+errr init_v_info();
+errr init_s_info();
+errr init_m_info();
index a57e4d7..28c3572 100644 (file)
@@ -127,7 +127,7 @@ static void see_arena_poster(player_type *player_ptr)
 
     monster_race *r_ptr;
     r_ptr = &r_info[arena_info[player_ptr->arena_number].r_idx];
-    concptr name = (r_name + r_ptr->name);
+    concptr name = r_ptr->name.c_str();
     msg_format(_("%s に挑戦するものはいないか?", "Do I hear any challenges against: %s"), name);
 
     player_ptr->monster_race_idx = arena_info[player_ptr->arena_number].r_idx;
@@ -304,8 +304,8 @@ bool monster_arena_comm(player_type *player_ptr)
         monster_race *r_ptr = &r_info[battle_mon[i]];
 
         sprintf(buf, _("%d) %-58s  %4ld.%02ld倍", "%d) %-58s  %4ld.%02ld"), i + 1,
-            _(format("%s%s", r_name + r_ptr->name, (r_ptr->flags1 & RF1_UNIQUE) ? "もどき" : "      "),
-                format("%s%s", (r_ptr->flags1 & RF1_UNIQUE) ? "Fake " : "", r_name + r_ptr->name)),
+            _(format("%s%s", r_ptr->name.c_str(), (r_ptr->flags1 & RF1_UNIQUE) ? "もどき" : "      "),
+                format("%s%s", (r_ptr->flags1 & RF1_UNIQUE) ? "Fake " : "", r_ptr->name.c_str())),
             (long int)mon_odds[i] / 100, (long int)mon_odds[i] % 100);
         prt(buf, 5 + i, 1);
     }
@@ -385,4 +385,4 @@ bool monster_arena_comm(player_type *player_ptr)
 
     screen_load();
     return TRUE;
-}
\ No newline at end of file
+}
index a1303b9..dc21c1a 100644 (file)
@@ -100,7 +100,7 @@ bool exchange_cash(player_type *player_ptr)
     for (INVENTORY_IDX i = 0; i < INVEN_PACK; i++) {
         o_ptr = &player_ptr->inventory_list[i];
         if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE)
-            && (streq(r_name + r_info[o_ptr->pval].name, r_name + r_info[current_world_ptr->today_mon].name))) {
+            && (streq(r_info[o_ptr->pval].name.c_str(), r_info[current_world_ptr->today_mon].name.c_str()))) {
             char buf[MAX_NLEN + 32];
             describe_flavor(player_ptr, o_name, o_ptr, 0);
             sprintf(buf, _("%s を換金しますか?", "Convert %s into money? "), o_name);
@@ -119,7 +119,7 @@ bool exchange_cash(player_type *player_ptr)
         o_ptr = &player_ptr->inventory_list[i];
 
         if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON)
-            && (streq(r_name + r_info[o_ptr->pval].name, r_name + r_info[current_world_ptr->today_mon].name))) {
+            && (streq(r_info[o_ptr->pval].name.c_str(), r_info[current_world_ptr->today_mon].name.c_str()))) {
             char buf[MAX_NLEN + 32];
             describe_flavor(player_ptr, o_name, o_ptr, 0);
             sprintf(buf, _("%s を換金しますか?", "Convert %s into money? "), o_name);
@@ -202,7 +202,7 @@ void today_target(player_type *player_ptr)
 
     clear_bldg(4, 18);
     c_put_str(TERM_YELLOW, _("本日の賞金首", "Wanted monster that changes from day to day"), 5, 10);
-    sprintf(buf, _("ターゲット: %s", "target: %s"), r_name + r_ptr->name);
+    sprintf(buf, _("ターゲット: %s", "target: %s"), r_ptr->name.c_str());
     c_put_str(TERM_YELLOW, buf, 6, 10);
     sprintf(buf, _("死体 ---- $%d", "corpse   ---- $%d"), (int)r_ptr->level * 50 + 100);
     prt(buf, 8, 10);
@@ -251,7 +251,7 @@ void show_bounty(void)
             done_mark = "";
         }
 
-        c_prt(color, format("%s %s", r_name + r_ptr->name, done_mark), y + 7, 10);
+        c_prt(color, format("%s %s", r_ptr->name.c_str(), done_mark), y + 7, 10);
 
         y = (y + 1) % 10;
         if (!y && (i < MAX_BOUNTY - 1)) {
@@ -291,7 +291,7 @@ void determine_daily_bounty(player_type *player_ptr, bool conv_old)
         r_ptr = &r_info[current_world_ptr->today_mon];
 
         if (cheat_hear) {
-            msg_format("日替わり候補: %s ", r_ptr->name + r_name);
+            msg_format("日替わり候補: %s ", r_ptr->name.c_str());
         }
 
         if (r_ptr->flags1 & RF1_UNIQUE)
index 7445e97..49686d2 100644 (file)
@@ -91,7 +91,7 @@ bool research_mon(player_type *player_ptr)
         monster_race *r_ptr = &r_info[i];
 
         /* Empty monster */
-        if (!r_ptr->name)
+        if (r_ptr->name.empty())
             continue;
 
         /* XTRA HACK WHATSEARCH */
@@ -118,9 +118,9 @@ bool research_mon(player_type *player_ptr)
 
             char temp2[MAX_MONSTER_NAME];
 #ifdef JP
-            strcpy(temp2, r_name + r_ptr->E_name);
+            strcpy(temp2, r_ptr->E_name.c_str());
 #else
-            strcpy(temp2, r_name + r_ptr->name);
+            strcpy(temp2, r_ptr->name.c_str());
 #endif
             for (int xx = 0; temp2[xx] && xx < 80; xx++) {
                 if (isupper(temp2[xx]))
@@ -128,7 +128,7 @@ bool research_mon(player_type *player_ptr)
             }
 
 #ifdef JP
-            if (angband_strstr(temp2, temp) || angband_strstr(r_name + r_ptr->name, temp))
+            if (angband_strstr(temp2, temp) || angband_strstr(r_ptr->name.c_str(), temp))
 #else
             if (angband_strstr(temp2, temp))
 #endif
index 0ee2e04..62df220 100644 (file)
@@ -116,7 +116,7 @@ void castle_quest(player_type *player_ptr)
     }
 
     q_ptr->cur_num = 0;
-    concptr name = (r_name + r_ptr->name);
+    concptr name = r_ptr->name.c_str();
 #ifdef JP
     msg_format("クエスト: %sを %d体倒す", name, q_ptr->max_num);
 #else
index ec80a5c..930aff9 100644 (file)
@@ -217,7 +217,7 @@ static void drop_artifact(player_type *player_ptr, monster_death_type *md_ptr)
         (void)drop_near(player_ptr, q_ptr, -1, md_ptr->md_y, md_ptr->md_x);
     }
 
-    msg_format(_("あなたは%sを制覇した!", "You have conquered %s!"), d_name + d_info[player_ptr->dungeon_idx].name);
+    msg_format(_("あなたは%sを制覇した!", "You have conquered %s!"), d_info[player_ptr->dungeon_idx].name.c_str());
 }
 
 static void decide_drop_quality(monster_death_type *md_ptr)
index 679b6c3..3456850 100644 (file)
@@ -236,9 +236,9 @@ bool place_monster_one(player_type *player_ptr, MONSTER_IDX who, POSITION y, POS
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
     grid_type *g_ptr = &floor_ptr->grid_array[y][x];
     monster_race *r_ptr = &r_info[r_idx];
-    concptr name = (r_name + r_ptr->name);
+    concptr name = r_ptr->name.c_str();
 
-    if (player_ptr->wild_mode || !in_bounds(floor_ptr, y, x) || (r_idx == 0) || (r_ptr->name == 0))
+    if (player_ptr->wild_mode || !in_bounds(floor_ptr, y, x) || (r_idx == 0) || r_ptr->name.empty())
         return FALSE;
 
     if (((mode & PM_IGNORE_TERRAIN) == 0) && (pattern_tile(floor_ptr, y, x) || !monster_can_enter(player_ptr, y, x, r_ptr, 0)))
index f34394f..462df28 100644 (file)
@@ -3,10 +3,5 @@
 /* The monster race arrays */
 monster_race *r_info;
 
-/* The monster race names */
-char *r_name;
-
-char *r_text;
-
 /* Maximum number of monsters in r_info.txt */
 MONRACE_IDX max_r_idx;
index 928562e..0f2a196 100644 (file)
@@ -4,7 +4,4 @@
 #include "system/monster-race-definition.h"
 
 extern monster_race *r_info;
-extern char *r_name;
-extern char *r_text;
-
 extern MONRACE_IDX max_r_idx;
index d2adf46..7df730c 100644 (file)
@@ -25,7 +25,7 @@ void monster_desc(player_type *player_ptr, char *desc, monster_type *m_ptr, BIT_
 {
     monster_race *r_ptr;
     r_ptr = &r_info[m_ptr->ap_r_idx];
-    concptr name = (mode & MD_TRUE_NAME) ? (r_name + real_r_ptr(m_ptr)->name) : (r_name + r_ptr->name);
+    concptr name = (mode & MD_TRUE_NAME) ? real_r_ptr(m_ptr)->name.c_str() : r_ptr->name.c_str();
     GAME_TEXT silly_name[1024];
     bool named = FALSE;
     if (player_ptr->image && !(mode & MD_IGNORE_HALLU)) {
@@ -39,9 +39,9 @@ void monster_desc(player_type *player_ptr, char *desc, monster_type *m_ptr, BIT_
 
             do {
                 hallu_race = &r_info[randint1(max_r_idx - 1)];
-            } while (!hallu_race->name || (hallu_race->flags1 & RF1_UNIQUE));
+            } while (hallu_race->name.empty() || (hallu_race->flags1 & RF1_UNIQUE));
 
-            strcpy(silly_name, (r_name + hallu_race->name));
+            strcpy(silly_name, (hallu_race->name.c_str()));
         }
 
         name = silly_name;
@@ -231,7 +231,7 @@ void monster_desc(player_type *player_ptr, char *desc, monster_type *m_ptr, BIT_
     }
 
     if ((mode & MD_IGNORE_HALLU) && !is_original_ap(m_ptr)) {
-        strcat(desc, format("(%s)", r_name + r_info[m_ptr->r_idx].name));
+        strcat(desc, format("(%s)", r_info[m_ptr->r_idx].name.c_str()));
     }
 
     /* Handle the Possessive as a special afterthought */
index 9b8ba35..e4d5c9d 100644 (file)
@@ -602,10 +602,10 @@ void monster_gain_exp(player_type *target_ptr, MONSTER_IDX m_idx, MONRACE_IDX s_
 
                 do {
                     hallu_race = &r_info[randint1(max_r_idx - 1)];
-                } while (!hallu_race->name || (hallu_race->flags1 & RF1_UNIQUE));
-                msg_format(_("%sは%sに進化した。", "%^s evolved into %s."), m_name, r_name + hallu_race->name);
+                } while (hallu_race->name.empty() || (hallu_race->flags1 & RF1_UNIQUE));
+                msg_format(_("%sは%sに進化した。", "%^s evolved into %s."), m_name, hallu_race->name.c_str());
             } else {
-                msg_format(_("%sは%sに進化した。", "%^s evolved into %s."), m_name, r_name + r_ptr->name);
+                msg_format(_("%sは%sに進化した。", "%^s evolved into %s."), m_name, r_ptr->name.c_str());
             }
         }
 
@@ -895,7 +895,7 @@ bool mon_take_hit(player_type *target_ptr, MONSTER_IDX m_idx, HIT_POINT dam, boo
 
         if ((r_ptr->flags1 & RF1_UNIQUE) && record_destroy_uniq) {
             char note_buf[160];
-            sprintf(note_buf, "%s%s", r_name + r_ptr->name, m_ptr->mflag2.has(MFLAG2::CLONED) ? _("(クローン)", "(Clone)") : "");
+            sprintf(note_buf, "%s%s", r_ptr->name.c_str(), m_ptr->mflag2.has(MFLAG2::CLONED) ? _("(クローン)", "(Clone)") : "");
             exe_write_diary(target_ptr, DIARY_UNIQUE, 0, note_buf);
         }
 
index 8bcc307..204afe9 100644 (file)
@@ -39,7 +39,7 @@ bool eat_rock(player_type *caster_ptr)
     if (!has_flag(mimic_f_ptr->flags, FF_HURT_ROCK)) {
         msg_print(_("この地形は食べられない。", "You cannot eat this feature."));
     } else if (has_flag(f_ptr->flags, FF_PERMANENT)) {
-        msg_format(_("いてっ!この%sはあなたの歯より硬い!", "Ouch!  This %s is harder than your teeth!"), f_name + mimic_f_ptr->name);
+        msg_format(_("いてっ!この%sはあなたの歯より硬い!", "Ouch!  This %s is harder than your teeth!"), mimic_f_ptr->name.c_str());
     } else if (g_ptr->m_idx) {
         monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
         msg_print(_("何かが邪魔しています!", "There's something in the way!"));
@@ -55,7 +55,7 @@ bool eat_rock(player_type *caster_ptr)
     } else if (has_flag(f_ptr->flags, FF_MAY_HAVE_GOLD) || has_flag(f_ptr->flags, FF_HAS_GOLD)) {
         (void)set_food(caster_ptr, caster_ptr->food + 5000);
     } else {
-        msg_format(_("この%sはとてもおいしい!", "This %s is very filling!"), f_name + mimic_f_ptr->name);
+        msg_format(_("この%sはとてもおいしい!", "This %s is very filling!"), mimic_f_ptr->name.c_str());
         (void)set_food(caster_ptr, caster_ptr->food + 10000);
     }
 
index 6c29c21..d5ecfe5 100644 (file)
@@ -154,7 +154,7 @@ bool activate_unique_detection(player_type *user_ptr)
 
         r_ptr = &r_info[m_ptr->r_idx];
         if (r_ptr->flags1 & RF1_UNIQUE)
-            msg_format(_("%s. ", "%s. "), r_name + r_ptr->name);
+            msg_format(_("%s. ", "%s. "), r_ptr->name.c_str());
 
         if (m_ptr->r_idx == MON_DIO)
             msg_print(_("きさま! 見ているなッ!", "You bastard! You're watching me, well watch this!"));
index 0ba406c..bba206e 100644 (file)
@@ -195,7 +195,7 @@ void apply_magic_others(player_type *owner_ptr, object_type *o_ptr, int power)
 
         o_ptr->pval = i;
         if (cheat_peek) {
-            msg_format(_("%sの像", "Statue of %s"), r_name + r_ptr->name);
+            msg_format(_("%sの像", "Statue of %s"), r_ptr->name.c_str());
         }
 
         object_aware(owner_ptr, o_ptr);
index b3b3ad7..f028412 100644 (file)
@@ -14,8 +14,6 @@
  * The ego-item arrays
  */
 ego_item_type *e_info;
-char *e_name;
-char *e_text;
 
 /*
  * Maximum number of ego-items in e_info.txt
index ea43d2d..3ebe574 100644 (file)
@@ -1,9 +1,10 @@
 #pragma once
 
-#include "system/angband.h"
 #include "object-enchant/trg-types.h"
-#include "util/flag-group.h"
+#include "system/angband.h"
 #include "system/object-type-definition.h"
+#include "util/flag-group.h"
+#include <string>
 
 /* Body Armor */
 #define EGO_A_MORGUL            4
  * Information about "ego-items".
  */
 typedef struct ego_item_type {
-       STR_OFFSET name;                        /* Name (offset) */
-       STR_OFFSET text;                        /* Text (offset) */
+    std::string name; /* Name (offset) */
+    std::string text; /* Text (offset) */
 
-       INVENTORY_IDX slot;             /*!< 装備部位 / Standard slot value */
-       PRICE rating;           /*!< ベースアイテムからの価値加速 / Rating boost */
+    INVENTORY_IDX slot{}; /*!< 装備部位 / Standard slot value */
+    PRICE rating{}; /*!< ベースアイテムからの価値加速 / Rating boost */
 
-       DEPTH level;                    /* Minimum level */
-       RARITY rarity;          /* Object rarity */
+    DEPTH level{}; /* Minimum level */
+    RARITY rarity{}; /* Object rarity */
 
-       HIT_PROB max_to_h;              /* Maximum to-hit bonus */
-       HIT_POINT max_to_d;             /* Maximum to-dam bonus */
-       ARMOUR_CLASS max_to_a;          /* Maximum to-ac bonus */
+    HIT_PROB max_to_h{}; /* Maximum to-hit bonus */
+    HIT_POINT max_to_d{}; /* Maximum to-dam bonus */
+    ARMOUR_CLASS max_to_a{}; /* Maximum to-ac bonus */
 
-       PARAMETER_VALUE max_pval;               /* Maximum pval */
+    PARAMETER_VALUE max_pval{}; /* Maximum pval */
 
-       PRICE cost;                     /* Ego-item "cost" */
+    PRICE cost{}; /* Ego-item "cost" */
 
-       BIT_FLAGS flags[TR_FLAG_SIZE];  /* Ego-Item Flags */
-       FlagGroup<TRG> gen_flags;               /* flags for generate */
+    BIT_FLAGS flags[TR_FLAG_SIZE]{}; /* Ego-Item Flags */
+    FlagGroup<TRG> gen_flags; /* flags for generate */
 
-       IDX act_idx;            /* Activative ability index */
+    IDX act_idx{}; /* Activative ability index */
 } ego_item_type;
 
 extern EGO_IDX max_e_idx;
 extern ego_item_type *e_info;
-extern char *e_name;
-extern char *e_text;
 
 byte get_random_ego(byte slot, bool good);
index 5bbd242..64dc544 100644 (file)
@@ -25,7 +25,7 @@ bool object_is_bounty(player_type *player_ptr, object_type *o_ptr)
     if (vanilla_town)
         return FALSE;
 
-    if (player_ptr->today_mon > 0 && (streq(r_name + r_info[o_ptr->pval].name, r_name + r_info[current_world_ptr->today_mon].name)))
+    if (player_ptr->today_mon > 0 && (streq(r_info[o_ptr->pval].name.c_str(), r_info[current_world_ptr->today_mon].name.c_str())))
         return TRUE;
 
     if (o_ptr->pval == MON_TSUCHINOKO)
index 259336d..5b1356a 100644 (file)
@@ -13,8 +13,6 @@
  * The object kind arrays
  */
 object_kind *k_info;
-char *k_name;
-char *k_text;
 
 /*
  * Maximum number of items in k_info.txt
index f9623b6..5e5d4bb 100644 (file)
@@ -1,63 +1,59 @@
 #pragma once
 
-#include "system/angband.h"
 #include "object-enchant/trg-types.h"
-#include "util/flag-group.h"
+#include "system/angband.h"
 #include "system/object-type-definition.h"
+#include "util/flag-group.h"
+#include <string>
 
 typedef struct object_kind {
-       STR_OFFSET name;                        /*!< ベースアイテム名参照のためのネームバッファオフセット値 / Name (offset) */
-       STR_OFFSET text;                        /*!< 解説テキスト参照のためのネームバッファオフセット値 / Text (offset) */
-       STR_OFFSET flavor_name; /*!< 未確定名参照のためのネームバッファオフセット値 / Flavor name (offset) */
-
-       tval_type tval;                 /*!< ベースアイテム種別の大項目値 Object type */
-       OBJECT_SUBTYPE_VALUE sval;                      /*!< ベースアイテム種別の小項目値 Object sub type */
-
-       PARAMETER_VALUE pval;   /*!< ベースアイテムのpval(能力修正共通値) Object extra info */
-
-       HIT_PROB to_h;                  /*!< ベースアイテムの命中修正値 / Bonus to hit */
-       HIT_POINT to_d;                 /*!< ベースアイテムのダメージ修正値 / Bonus to damage */
-       ARMOUR_CLASS to_a;                      /*!< ベースアイテムのAC修正値 / Bonus to armor */
+    std::string name; /*!< ベースアイテム名参照のためのネームバッファオフセット値 / Name (offset) */
+    std::string text; /*!< 解説テキスト参照のためのネームバッファオフセット値 / Text (offset) */
+    std::string flavor_name; /*!< 未確定名参照のためのネームバッファオフセット値 / Flavor name (offset) */
 
-       ARMOUR_CLASS ac;                        /*!< ベースアイテムのAC基本値 /  Base armor */
+    tval_type tval{}; /*!< ベースアイテム種別の大項目値 Object type */
+    OBJECT_SUBTYPE_VALUE sval{}; /*!< ベースアイテム種別の小項目値 Object sub type */
 
-       DICE_NUMBER dd;
-       DICE_SID ds;            /*!< ダメージダイスの数と大きさ / Damage dice/sides */
+    PARAMETER_VALUE pval{}; /*!< ベースアイテムのpval(能力修正共通値) Object extra info */
 
-       WEIGHT weight;          /*!< ベースアイテムの重量 / Weight */
+    HIT_PROB to_h{}; /*!< ベースアイテムの命中修正値 / Bonus to hit */
+    HIT_POINT to_d{}; /*!< ベースアイテムのダメージ修正値 / Bonus to damage */
+    ARMOUR_CLASS to_a{}; /*!< ベースアイテムのAC修正値 / Bonus to armor */
 
-       PRICE cost;                     /*!< ベースアイテムの基本価値 / Object "base cost" */
+    ARMOUR_CLASS ac{}; /*!< ベースアイテムのAC基本値 /  Base armor */
 
-       BIT_FLAGS flags[TR_FLAG_SIZE];  /*!< ベースアイテムの基本特性ビット配列 / Flags */
+    DICE_NUMBER dd{};
+    DICE_SID ds{}; /*!< ダメージダイスの数と大きさ / Damage dice/sides */
 
-       FlagGroup<TRG> gen_flags;               /*!< ベースアイテムの生成特性ビット配列 / flags for generate */
+    WEIGHT weight{}; /*!< ベースアイテムの重量 / Weight */
 
-       DEPTH locale[4];                /*!< ベースアイテムの生成階テーブル / Allocation level(s) */
-       PROB chance[4];         /*!< ベースアイテムの生成確率テーブル / Allocation chance(s) */
+    PRICE cost{}; /*!< ベースアイテムの基本価値 / Object "base cost" */
 
-       DEPTH level;                    /*!< ベースアイテムの基本生成階 / Level */
-       BIT_FLAGS8 extra;                       /*!< その他色々のビットフラグ配列 / Something */
+    BIT_FLAGS flags[TR_FLAG_SIZE]{}; /*!< ベースアイテムの基本特性ビット配列 / Flags */
 
-       TERM_COLOR d_attr;              /*!< デフォルトのアイテムシンボルカラー / Default object attribute */
-       SYMBOL_CODE d_char;             /*!< デフォルトのアイテムシンボルアルファベット / Default object character */
+    FlagGroup<TRG> gen_flags; /*!< ベースアイテムの生成特性ビット配列 / flags for generate */
 
-       TERM_COLOR x_attr;              /*!< 設定変更後のアイテムシンボルカラー /  Desired object attribute */
-       SYMBOL_CODE x_char;             /*!< 設定変更後のアイテムシンボルアルファベット /  Desired object character */
+    DEPTH locale[4]{}; /*!< ベースアイテムの生成階テーブル / Allocation level(s) */
+    PROB chance[4]{}; /*!< ベースアイテムの生成確率テーブル / Allocation chance(s) */
 
-       IDX flavor;             /*!< 調査中(TODO) / Special object flavor (or zero) */
+    DEPTH level{}; /*!< ベースアイテムの基本生成階 / Level */
+    BIT_FLAGS8 extra{}; /*!< その他色々のビットフラグ配列 / Something */
 
-       bool easy_know;         /*!< ベースアイテムが初期からベース名を判断可能かどうか / This object is always known (if aware) */
+    TERM_COLOR d_attr{}; /*!< デフォルトのアイテムシンボルカラー / Default object attribute */
+    SYMBOL_CODE d_char{}; /*!< デフォルトのアイテムシンボルアルファベット / Default object character */
 
-       bool aware;                     /*!< ベースアイテムが鑑定済かどうか /  The player is "aware" of the item's effects */
+    TERM_COLOR x_attr{}; /*!< 設定変更後のアイテムシンボルカラー /  Desired object attribute */
+    SYMBOL_CODE x_char{}; /*!< 設定変更後のアイテムシンボルアルファベット /  Desired object character */
 
-       bool tried;                     /*!< ベースアイテムを未鑑定のまま試したことがあるか /  The player has "tried" one of the items */
+    IDX flavor{}; /*!< 未鑑定名の何番目を当てるか(0は未鑑定名なし) / Special object flavor (or zero) */
+    bool easy_know{}; /*!< ベースアイテムが初期からベース名を判断可能かどうか / This object is always known (if aware) */
+    bool aware{}; /*!< ベースアイテムが鑑定済かどうか /  The player is "aware" of the item's effects */
+    bool tried{}; /*!< ベースアイテムを未鑑定のまま試したことがあるか /  The player has "tried" one of the items */
 
-       ACTIVATION_IDX act_idx;         /*!< 発動能力のID /  Activative ability index */
+    ACTIVATION_IDX act_idx{}; /*!< 発動能力のID /  Activative ability index */
 } object_kind;
 
 extern object_kind *k_info;
-extern char *k_name;
-extern char *k_text;
 extern KIND_OBJECT_IDX max_k_idx;
 
 SYMBOL_CODE object_char(object_type *o_ptr);
index fc91036..ce60449 100644 (file)
@@ -43,7 +43,7 @@ bool screen_object(player_type *player_ptr, object_type *o_ptr, BIT_FLAGS mode)
     int trivial_info = 0;
     object_flags(player_ptr, o_ptr, flgs);
 
-    shape_buffer(o_ptr->name1 ? (a_text + a_info[o_ptr->name1].text) : (k_text + k_info[o_ptr->k_idx].text), 77 - 15, temp, sizeof(temp));
+    shape_buffer(o_ptr->name1 ? a_info[o_ptr->name1].text.c_str() : k_info[o_ptr->k_idx].text.c_str(), 77 - 15, temp, sizeof(temp));
 
     int i = 0;
     for (int j = 0; temp[j]; j += 1 + strlen(&temp[j])) {
@@ -724,8 +724,8 @@ bool screen_object(player_type *player_ptr, object_type *o_ptr, BIT_FLAGS mode)
 
     if ((o_ptr->tval == TV_STATUE) && (o_ptr->sval == SV_PHOTO)) {
         monster_race *r_ptr = &r_info[o_ptr->pval];
-        int namelen = strlen(r_name + r_ptr->name);
-        prt(format("%s: '", r_name + r_ptr->name), 1, 15);
+        int namelen = strlen(r_ptr->name.c_str());
+        prt(format("%s: '", r_ptr->name.c_str()), 1, 15);
         term_queue_bigchar(18 + namelen, 1, r_ptr->x_attr, r_ptr->x_char, 0, 0);
         prt("'", 1, (use_bigtile ? 20 : 19) + namelen);
     } else {
index 2d08cc6..180c696 100644 (file)
@@ -148,7 +148,7 @@ void sanity_blast(player_type *creature_ptr, monster_type *m_ptr, bool necro)
         get_mon_num_prep(creature_ptr, get_nightmare, NULL);
         r_ptr = &r_info[get_mon_num(creature_ptr, 0, MAX_DEPTH, 0)];
         power = r_ptr->level + 10;
-        desc = r_name + r_ptr->name;
+        desc = r_ptr->name.c_str();
         get_mon_num_prep(creature_ptr, NULL, NULL);
 #ifdef JP
 #else
index f2900df..79518c0 100644 (file)
@@ -6,6 +6,7 @@
 #include "realm/realm-types.h"
 #include "system/angband.h"
 #include "spell/technic-info-table.h"
+#include <string>
 
 /** m_info.txtでMPの無い職業に設定される */
 #define SPELL_FIRST_NO_SPELL 99
  */
 
 typedef struct player_magic {
-       tval_type spell_book; /* Tval of spell books (if any) */
-       int spell_xtra;         /* Something for later */
+    tval_type spell_book{}; /* Tval of spell books (if any) */
+    int spell_xtra{}; /* Something for later */
 
-       int spell_stat;         /* Stat for spells (if any)  */
-       int spell_type;         /* Spell type (mage/priest) */
+    int spell_stat{}; /* Stat for spells (if any)  */
+    int spell_type{}; /* Spell type (mage/priest) */
 
-       int spell_first;                /* Level of first spell */
-       int spell_weight;               /* Weight that hurts spells */
+    int spell_first{}; /* Level of first spell */
+    int spell_weight{}; /* Weight that hurts spells */
 
-       magic_type info[MAX_MAGIC][32];    /* The available spells */
+    magic_type info[MAX_MAGIC][32]{}; /* The available spells */
 } player_magic;
 
 extern player_magic *m_info;
index a736b0c..44da0a6 100644 (file)
@@ -355,7 +355,7 @@ int take_hit(player_type *creature_ptr, int damage_type, HIT_POINT damage, concp
         creature_ptr->leaving = TRUE;
         creature_ptr->is_dead = TRUE;
         if (creature_ptr->current_floor_ptr->inside_arena) {
-            concptr m_name = r_name + r_info[arena_info[creature_ptr->arena_number].r_idx].name;
+            concptr m_name = r_info[arena_info[creature_ptr->arena_number].r_idx].name.c_str();
             msg_format(_("あなたは%sの前に敗れ去った。", "You are beaten by %s."), m_name);
             msg_print(NULL);
             if (record_arena)
index a2fa9b7..48df491 100644 (file)
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "system/angband.h"
+#include <string>
 
 #define GINOU_SUDE 0
 #define GINOU_NITOURYU 1
@@ -42,10 +43,10 @@ extern const concptr exp_level_str[5];
  * Information about "skill"
  */
 typedef struct skill_table {
-       SUB_EXP w_start[5][64];   /* start weapon exp */
-       SUB_EXP w_max[5][64];        /* max weapon exp */
-       SUB_EXP s_start[10];      /* start skill */
-       SUB_EXP s_max[10];           /* max skill */
+    SUB_EXP w_start[5][64]{}; /* start weapon exp */
+    SUB_EXP w_max[5][64]{}; /* max weapon exp */
+    SUB_EXP s_start[10]{}; /* start skill */
+    SUB_EXP s_max[10]{}; /* max skill */
 } skill_table;
 
 extern skill_table *s_info;
index b4eb0b3..0c12210 100644 (file)
@@ -67,7 +67,7 @@ static concptr pit_subtype_string(int type, bool nest)
     if (nest) {
         switch (type) {
         case NEST_TYPE_CLONE:
-            sprintf(inner_buf, "(%s)", r_name + r_info[vault_aux_race].name);
+            sprintf(inner_buf, "(%s)", r_info[vault_aux_race].name.c_str());
             break;
         case NEST_TYPE_SYMBOL_GOOD:
         case NEST_TYPE_SYMBOL_EVIL:
@@ -380,7 +380,7 @@ bool build_type5(player_type *player_ptr, dun_data_type *dd_ptr)
                     break;
             }
 
-            msg_format_wizard(player_ptr, CHEAT_DUNGEON, "Nest構成モンスターNo.%d:%s", i, r_name + r_info[nest_mon_info[i].r_idx].name);
+            msg_format_wizard(player_ptr, CHEAT_DUNGEON, "Nest構成モンスターNo.%d:%s", i, r_info[nest_mon_info[i].r_idx].name.c_str());
         }
     }
 
@@ -600,7 +600,7 @@ bool build_type6(player_type *player_ptr, dun_data_type *dd_ptr)
     for (i = 0; i < 8; i++) {
         /* Every other entry */
         what[i] = what[i * 2];
-        msg_format_wizard(player_ptr, CHEAT_DUNGEON, _("Nest構成モンスター選択No.%d:%s", "Nest Monster Select No.%d:%s"), i, r_name + r_info[what[i]].name);
+        msg_format_wizard(player_ptr, CHEAT_DUNGEON, _("Nest構成モンスター選択No.%d:%s", "Nest Monster Select No.%d:%s"), i, r_info[what[i]].name.c_str());
     }
 
     /* Top and bottom rows */
@@ -924,7 +924,7 @@ bool build_type13(player_type *player_ptr, dun_data_type *dd_ptr)
         what[i] = what[i * 2];
 
         if (cheat_hear) {
-            msg_print(r_name + r_info[what[i]].name);
+            msg_print(r_info[what[i]].name.c_str());
         }
     }
 
index 989be1f..38c6057 100644 (file)
@@ -83,6 +83,6 @@ bool build_type14(player_type *player_ptr, dun_data_type *dd_ptr)
     g_ptr->mimic = g_ptr->feat;
     g_ptr->feat = trap;
 
-    msg_format_wizard(player_ptr, CHEAT_DUNGEON, _("%sの部屋が生成されました。", "Room of %s was generated."), f_name + f_info[trap].name);
+    msg_format_wizard(player_ptr, CHEAT_DUNGEON, _("%sの部屋が生成されました。", "Room of %s was generated."), f_info[trap].name.c_str());
     return TRUE;
 }
index 2aa6e6f..56b2b6d 100644 (file)
@@ -36,8 +36,6 @@
  * The vault generation arrays
  */
 vault_type *v_info;
-char *v_name;
-char *v_text;
 
 /*
  * Maximum number of vaults in v_info.txt
@@ -664,10 +662,10 @@ bool build_type7(player_type *player_ptr, dun_data_type *dd_ptr)
     if (!find_space(player_ptr, dd_ptr, &yval, &xval, abs(y), abs(x)))
         return FALSE;
 
-    msg_format_wizard(player_ptr, CHEAT_DUNGEON, _("小型Vault(%s)を生成しました。", "Lesser vault (%s)."), v_name + v_ptr->name);
+    msg_format_wizard(player_ptr, CHEAT_DUNGEON, _("小型Vault(%s)を生成しました。", "Lesser vault (%s)."), v_ptr->name.c_str());
 
     /* Hack -- Build the vault */
-    build_vault(player_ptr, yval, xval, v_ptr->hgt, v_ptr->wid, v_text + v_ptr->text, xoffset, yoffset, transno);
+    build_vault(player_ptr, yval, xval, v_ptr->hgt, v_ptr->wid, v_ptr->text.c_str(), xoffset, yoffset, transno);
 
     return TRUE;
 }
@@ -739,10 +737,10 @@ bool build_type8(player_type *player_ptr, dun_data_type *dd_ptr)
     if (!find_space(player_ptr, dd_ptr, &yval, &xval, (POSITION)(abs(y) + 2), (POSITION)(abs(x) + 2)))
         return FALSE;
 
-    msg_format_wizard(player_ptr, CHEAT_DUNGEON, _("大型固定Vault(%s)を生成しました。", "Greater vault (%s)."), v_name + v_ptr->name);
+    msg_format_wizard(player_ptr, CHEAT_DUNGEON, _("大型固定Vault(%s)を生成しました。", "Greater vault (%s)."), v_ptr->name.c_str());
 
     /* Hack -- Build the vault */
-    build_vault(player_ptr, yval, xval, v_ptr->hgt, v_ptr->wid, v_text + v_ptr->text, xoffset, yoffset, transno);
+    build_vault(player_ptr, yval, xval, v_ptr->hgt, v_ptr->wid, v_ptr->text.c_str(), xoffset, yoffset, transno);
 
     return TRUE;
 }
@@ -1208,10 +1206,10 @@ bool build_type17(player_type *player_ptr, dun_data_type *dd_ptr)
     if (!find_space(player_ptr, dd_ptr, &yval, &xval, abs(y), abs(x)))
         return FALSE;
 
-    msg_format_wizard(player_ptr, CHEAT_DUNGEON, _("特殊固定部屋(%s)を生成しました。", "Special Fixed Room (%s)."), v_name + v_ptr->name);
+    msg_format_wizard(player_ptr, CHEAT_DUNGEON, _("特殊固定部屋(%s)を生成しました。", "Special Fixed Room (%s)."), v_ptr->name.c_str());
 
     /* Hack -- Build the vault */
-    build_vault(player_ptr, yval, xval, v_ptr->hgt, v_ptr->wid, v_text + v_ptr->text, xoffset, yoffset, transno);
+    build_vault(player_ptr, yval, xval, v_ptr->hgt, v_ptr->wid, v_ptr->text.c_str(), xoffset, yoffset, transno);
 
     return TRUE;
 }
index b0888d5..88d2f9f 100644 (file)
@@ -1,20 +1,19 @@
-#pragma once 
+#pragma once
 
 #include "system/angband.h"
+#include <string>
 
 typedef struct vault_type {
-       STR_OFFSET name;        /* Name (offset) */
-       STR_OFFSET text;        /* Text (offset) */
+    std::string name; /* Name (offset) */
+    std::string text; /* Text (offset) */
 
-       ROOM_IDX typ;           /* Vault type */
-       PROB rat;                       /* Vault rating (unused) */
-       POSITION hgt;           /* Vault height */
-       POSITION wid;           /* Vault width */
+    ROOM_IDX typ{}; /* Vault type */
+    PROB rat{}; /* Vault rating (unused) */
+    POSITION hgt{}; /* Vault height */
+    POSITION wid{}; /* Vault width */
 } vault_type;
 
 extern vault_type *v_info;
-extern char *v_name;
-extern char *v_text;
 extern VAULT_IDX max_v_idx;
 
 typedef struct dun_data_type dun_data_type;
index 6f7ce70..3f28cdf 100644 (file)
@@ -382,7 +382,7 @@ bool probing(player_type *caster_ptr)
         inkey();
         term_erase(0, 0, 255);
         if (lore_do_probe(caster_ptr, m_ptr->r_idx)) {
-            strcpy(buf, (r_name + r_ptr->name));
+            strcpy(buf, (r_ptr->name.c_str()));
 #ifdef JP
             msg_format("%sについてさらに詳しくなった気がする。", buf);
 #else
index bef479e..da6bae5 100644 (file)
@@ -402,7 +402,7 @@ bool free_level_recall(player_type *creature_ptr)
     }
 
     QUANTITY amt = get_quantity(
-        format(_("%sの何階にテレポートしますか?", "Teleport to which level of %s? "), d_name + d_info[select_dungeon].name), (QUANTITY)max_depth);
+        format(_("%sの何階にテレポートしますか?", "Teleport to which level of %s? "), d_info[select_dungeon].name.c_str()), (QUANTITY)max_depth);
     if (amt <= 0) {
         return FALSE;
     }
@@ -460,7 +460,7 @@ bool reset_recall(player_type *caster_ptr)
     if (record_maxdepth)
         exe_write_diary(caster_ptr, DIARY_TRUMP, select_dungeon, _("フロア・リセットで", "using a scroll of reset recall"));
 #ifdef JP
-    msg_format("%sの帰還レベルを %d 階にセット。", d_name + d_info[select_dungeon].name, dummy, dummy * 50);
+    msg_format("%sの帰還レベルを %d 階にセット。", d_info[select_dungeon].name.c_str(), dummy, dummy * 50);
 #else
     msg_format("Recall depth set to level %d (%d').", dummy, dummy * 50);
 #endif
index 052b316..e37a5bc 100644 (file)
@@ -284,7 +284,7 @@ static void shuffle_store(player_type *player_ptr)
     prt("", 3, 0);
     sprintf(buf, "%s (%s)", ot_ptr->owner_name, race_info[ot_ptr->owner_race].title);
     put_str(buf, 3, 10);
-    sprintf(buf, "%s (%ld)", (f_name + f_info[cur_store_feat].name), (long)(ot_ptr->max_cost));
+    sprintf(buf, "%s (%ld)", f_info[cur_store_feat].name.c_str(), (long)(ot_ptr->max_cost));
     prt(buf, 3, 50);
 }
 
index 2ff4d3a..da8d4d2 100644 (file)
@@ -68,7 +68,7 @@ void display_rumor(player_type *player_ptr, bool ex)
             a_idx = rumor_num(zz[1], max_a_idx);
 
             a_ptr = &a_info[a_idx];
-            if (a_ptr->name)
+            if (!a_ptr->name.empty())
                 break;
         }
 
@@ -84,11 +84,11 @@ void display_rumor(player_type *player_ptr, bool ex)
         while (TRUE) {
             MONRACE_IDX r_idx = rumor_num(zz[1], max_r_idx);
             r_ptr = &r_info[r_idx];
-            if (r_ptr->name)
+            if (!r_ptr->name.empty())
                 break;
         }
 
-        strcpy(fullname, r_name + r_ptr->name);
+        strcpy(fullname, r_ptr->name.c_str());
 
         if (!r_ptr->r_sights) {
             r_ptr->r_sights++;
@@ -99,11 +99,11 @@ void display_rumor(player_type *player_ptr, bool ex)
         while (TRUE) {
             d_idx = rumor_num(zz[1], current_world_ptr->max_d_idx);
             d_ptr = &d_info[d_idx];
-            if (d_ptr->name)
+            if (!d_ptr->name.empty())
                 break;
         }
 
-        strcpy(fullname, d_name + d_ptr->name);
+        strcpy(fullname, d_ptr->name.c_str());
 
         if (!max_dlv[d_idx]) {
             max_dlv[d_idx] = d_ptr->mindepth;
index f7c0ab4..48eb462 100644 (file)
@@ -4,8 +4,6 @@
  * The artifact arrays
  */
 artifact_type *a_info;
-char *a_name;
-char *a_text;
 
 /*
  * Maximum number of artifacts in a_info.txt
index b93b610..99e120e 100644 (file)
@@ -4,6 +4,7 @@
 #include "object-enchant/trg-types.h"
 #include "util/flag-group.h"
 #include "system/object-type-definition.h"
+#include <string>
 
 /*!
  * @struct artifact_type
  * "max_num" is always "1" (if that artifact "exists")
  */
 typedef struct artifact_type {
-       STR_OFFSET name;                        /*!< アーティファクト名(headerオフセット参照) / Name (offset) */
-       STR_OFFSET text;                        /*!< アーティファクト解説(headerオフセット参照) / Text (offset) */
-       tval_type tval;         /*!< ベースアイテム大項目ID / Artifact type */
-       OBJECT_SUBTYPE_VALUE sval;      /*!< ベースアイテム小項目ID / Artifact sub type */
-       PARAMETER_VALUE pval;   /*!< pval修正値 / Artifact extra info */
-       HIT_PROB to_h;                  /*!< 命中ボーナス値 /  Bonus to hit */
-       HIT_POINT to_d;         /*!< ダメージボーナス値 / Bonus to damage */
-       ARMOUR_CLASS to_a;                      /*!< ACボーナス値 / Bonus to armor */
-       ARMOUR_CLASS ac;                        /*!< 上書きベースAC値 / Base armor */
-       DICE_NUMBER dd;
-       DICE_SID ds;    /*!< ダイス値 / Damage when hits */
-       WEIGHT weight;          /*!< 重量 / Weight */
-       PRICE cost;                     /*!< 基本価格 / Artifact "cost" */
-       BIT_FLAGS flags[TR_FLAG_SIZE];       /*! アイテムフラグ / Artifact Flags */
+       std::string name;                       /*!< アーティファクト名(headerオフセット参照) / Name (offset) */
+    std::string text; /*!< アーティファクト解説(headerオフセット参照) / Text (offset) */
+       tval_type tval{};               /*!< ベースアイテム大項目ID / Artifact type */
+       OBJECT_SUBTYPE_VALUE sval{};    /*!< ベースアイテム小項目ID / Artifact sub type */
+       PARAMETER_VALUE pval{}; /*!< pval修正値 / Artifact extra info */
+       HIT_PROB to_h{};                        /*!< 命中ボーナス値 /  Bonus to hit */
+       HIT_POINT to_d{};               /*!< ダメージボーナス値 / Bonus to damage */
+       ARMOUR_CLASS to_a{};                    /*!< ACボーナス値 / Bonus to armor */
+       ARMOUR_CLASS ac{};                      /*!< 上書きベースAC値 / Base armor */
+       DICE_NUMBER dd{};
+       DICE_SID ds{};  /*!< ダイス値 / Damage when hits */
+       WEIGHT weight{};                /*!< 重量 / Weight */
+       PRICE cost{};                   /*!< 基本価格 / Artifact "cost" */
+       BIT_FLAGS flags[TR_FLAG_SIZE]{};       /*! アイテムフラグ / Artifact Flags */
        FlagGroup<TRG> gen_flags;               /*! アイテム生成フラグ / flags for generate */
-       DEPTH level;            /*! 基本生成階 / Artifact level */
-       RARITY rarity;          /*! レアリティ / Artifact rarity */
-       byte cur_num;           /*! 現在の生成数 / Number created (0 or 1) */
-       byte max_num;           /*! (未使用)最大生成数 / Unused (should be "1") */
-       FLOOR_IDX floor_id;      /*! アイテムを落としたフロアのID / Leaved on this location last time */
-       byte act_idx;           /*! 発動能力ID / Activative ability index */
+       DEPTH level{};          /*! 基本生成階 / Artifact level */
+       RARITY rarity{};                /*! レアリティ / Artifact rarity */
+       byte cur_num{};         /*! 現在の生成数 / Number created (0 or 1) */
+       byte max_num{};         /*! (未使用)最大生成数 / Unused (should be "1") */
+       FLOOR_IDX floor_id{};      /*! アイテムを落としたフロアのID / Leaved on this location last time */
+       byte act_idx{};         /*! 発動能力ID / Activative ability index */
 } artifact_type;
 
 extern artifact_type *a_info;
-extern char *a_name;
-extern char *a_text;
 extern ARTIFACT_IDX max_a_idx;
index f5e40b6..bc30f38 100644 (file)
@@ -3,6 +3,7 @@
 #include "monster-attack/monster-attack-effect.h"
 #include "monster-attack/monster-attack-types.h"
 #include "system/angband.h"
+#include <string>
 
 /*! モンスターが1ターンに攻撃する最大回数 (射撃を含む) / The maximum number of times a monster can attack in a turn (including SHOOT) */
 #define MAX_NUM_BLOWS 4
  *     - Damage Sides
  */
 typedef struct monster_blow {
-    rbm_type method;
-    rbe_type effect;
-    DICE_NUMBER d_dice;
-    DICE_SID d_side;
+    rbm_type method{};
+    rbe_type effect{};
+    DICE_NUMBER d_dice{};
+    DICE_SID d_side{};
 } monster_blow;
 
 /*
@@ -43,70 +44,70 @@ typedef struct monster_blow {
  */
 
 typedef struct monster_race {
-    STR_OFFSET name; /*!< 名前データのオフセット(日本語) /  Name offset(Japanese) */
+    std::string name; /*!< 名前データのオフセット(日本語) /  Name offset(Japanese) */
 #ifdef JP
-    STR_OFFSET E_name; /*!< 名前データのオフセット(英語) /  Name offset(English) */
+    std::string E_name; /*!< 名前データのオフセット(英語) /  Name offset(English) */
 #endif
-    STR_OFFSET text; /*!< 思い出テキストのオフセット / Lore text offset */
-    DICE_NUMBER hdice; /*!< HPのダイス数 / Creatures hit dice count */
-    DICE_SID hside; /*!< HPのダイス面数 / Creatures hit dice sides */
-    ARMOUR_CLASS ac; /*!< アーマークラス / Armour Class */
-    SLEEP_DEGREE sleep; /*!< 睡眠値 / Inactive counter (base) */
-    POSITION aaf; /*!< 感知範囲(1-100スクエア) / Area affect radius (1-100) */
-    SPEED speed; /*!< 加速(110で+0) / Speed (normally 110) */
-    EXP mexp; /*!< 殺害時基本経験値 / Exp value for kill */
-    BIT_FLAGS16 extra; /*!< 未使用 /  Unused (for now) */
-    RARITY freq_spell; /*!< 魔法&特殊能力仕様頻度(1/n) /  Spell frequency */
-    BIT_FLAGS flags1; /* Flags 1 (general) */
-    BIT_FLAGS flags2; /* Flags 2 (abilities) */
-    BIT_FLAGS flags3; /* Flags 3 (race/resist) */
-    BIT_FLAGS flags4; /* Flags 4 (inate/breath) */
-    BIT_FLAGS flags7; /* Flags 7 (movement related abilities) */
-    BIT_FLAGS flags8; /* Flags 8 (wilderness info) */
-    BIT_FLAGS flags9; /* Flags 9 (drops info) */
-    BIT_FLAGS flagsr; /* Flags R (resistances info) */
-    BIT_FLAGS a_ability_flags1; /* Activate Ability Flags 5 (normal spells) */
-    BIT_FLAGS a_ability_flags2; /* Activate Ability Flags 6 (special spells) */
-    BIT_FLAGS a_ability_flags3; /* Activate Ability Flags 7 (implementing) */
-    BIT_FLAGS a_ability_flags4; /* Activate Ability Flags 8 (implementing) */
-    monster_blow blow[MAX_NUM_BLOWS]; /* Up to four blows per round */
-    MONRACE_IDX reinforce_id[6];
-    DICE_NUMBER reinforce_dd[6];
-    DICE_SID reinforce_ds[6];
-    ARTIFACT_IDX artifact_id[4]; /* 特定アーティファクトドロップID */
-    RARITY artifact_rarity[4]; /* 特定アーティファクトレア度 */
-    PERCENTAGE artifact_percent[4]; /* 特定アーティファクトドロップ率 */
-    PERCENTAGE arena_ratio; /* モンスター闘技場の掛け金倍率修正値(%基準 / 0=100%) / The adjustment ratio for gambling monster */
-    MONRACE_IDX next_r_idx;
-    EXP next_exp;
-    DEPTH level; /* Level of creature */
-    RARITY rarity; /* Rarity of creature */
-    TERM_COLOR d_attr; /* Default monster attribute */
-    SYMBOL_CODE d_char; /* Default monster character */
-    TERM_COLOR x_attr; /* Desired monster attribute */
-    SYMBOL_CODE x_char; /* Desired monster character */
-    MONSTER_NUMBER max_num; /* Maximum population allowed per level */
-    MONSTER_NUMBER cur_num; /* Monster population on current level */
-    FLOOR_IDX floor_id; /* Location of unique monster */
-    MONSTER_NUMBER r_sights; /* Count sightings of this monster */
-    MONSTER_NUMBER r_deaths; /* Count deaths from this monster */
-    MONSTER_NUMBER r_pkills; /* Count visible monsters killed in this life */
-    MONSTER_NUMBER r_akills; /* Count all monsters killed in this life */
-    MONSTER_NUMBER r_tkills; /* Count monsters killed in all lives */
-    byte r_wake; /* Number of times woken up (?) */
-    byte r_ignore; /* Number of times ignored (?) */
+    std::string text; /*!< 思い出テキストのオフセット / Lore text offset */
+    DICE_NUMBER hdice{}; /*!< HPのダイス数 / Creatures hit dice count */
+    DICE_SID hside{}; /*!< HPのダイス面数 / Creatures hit dice sides */
+    ARMOUR_CLASS ac{}; /*!< アーマークラス / Armour Class */
+    SLEEP_DEGREE sleep{}; /*!< 睡眠値 / Inactive counter (base) */
+    POSITION aaf{}; /*!< 感知範囲(1-100スクエア) / Area affect radius (1-100) */
+    SPEED speed{}; /*!< 加速(110で+0) / Speed (normally 110) */
+    EXP mexp{}; /*!< 殺害時基本経験値 / Exp value for kill */
+    BIT_FLAGS16 extra{}; /*!< 未使用 /  Unused (for now) */
+    RARITY freq_spell{}; /*!< 魔法&特殊能力仕様頻度(1/n) /  Spell frequency */
+    BIT_FLAGS flags1{}; /* Flags 1 (general) */
+    BIT_FLAGS flags2{}; /* Flags 2 (abilities) */
+    BIT_FLAGS flags3{}; /* Flags 3 (race/resist) */
+    BIT_FLAGS flags4{}; /* Flags 4 (inate/breath) */
+    BIT_FLAGS flags7{}; /* Flags 7 (movement related abilities) */
+    BIT_FLAGS flags8{}; /* Flags 8 (wilderness info) */
+    BIT_FLAGS flags9{}; /* Flags 9 (drops info) */
+    BIT_FLAGS flagsr{}; /* Flags R (resistances info) */
+    BIT_FLAGS a_ability_flags1{}; /* Activate Ability Flags 5 (normal spells) */
+    BIT_FLAGS a_ability_flags2{}; /* Activate Ability Flags 6 (special spells) */
+    BIT_FLAGS a_ability_flags3{}; /* Activate Ability Flags 7 (implementing) */
+    BIT_FLAGS a_ability_flags4{}; /* Activate Ability Flags 8 (implementing) */
+    monster_blow blow[MAX_NUM_BLOWS]{}; /* Up to four blows per round */
+    MONRACE_IDX reinforce_id[6]{};
+    DICE_NUMBER reinforce_dd[6]{};
+    DICE_SID reinforce_ds[6]{};
+    ARTIFACT_IDX artifact_id[4]{}; /* 特定アーティファクトドロップID */
+    RARITY artifact_rarity[4]{}; /* 特定アーティファクトレア度 */
+    PERCENTAGE artifact_percent[4]{}; /* 特定アーティファクトドロップ率 */
+    PERCENTAGE arena_ratio{}; /* モンスター闘技場の掛け金倍率修正値(%基準 / 0=100%) / The adjustment ratio for gambling monster */
+    MONRACE_IDX next_r_idx{};
+    EXP next_exp{};
+    DEPTH level{}; /* Level of creature */
+    RARITY rarity{}; /* Rarity of creature */
+    TERM_COLOR d_attr{}; /* Default monster attribute */
+    SYMBOL_CODE d_char{}; /* Default monster character */
+    TERM_COLOR x_attr{}; /* Desired monster attribute */
+    SYMBOL_CODE x_char{}; /* Desired monster character */
+    MONSTER_NUMBER max_num{}; /* Maximum population allowed per level */
+    MONSTER_NUMBER cur_num{}; /* Monster population on current level */
+    FLOOR_IDX floor_id{}; /* Location of unique monster */
+    MONSTER_NUMBER r_sights{}; /* Count sightings of this monster */
+    MONSTER_NUMBER r_deaths{}; /* Count deaths from this monster */
+    MONSTER_NUMBER r_pkills{}; /* Count visible monsters killed in this life */
+    MONSTER_NUMBER r_akills{}; /* Count all monsters killed in this life */
+    MONSTER_NUMBER r_tkills{}; /* Count monsters killed in all lives */
+    byte r_wake{}; /* Number of times woken up (?) */
+    byte r_ignore{}; /* Number of times ignored (?) */
 #define MR1_EVOLUTION 0x01
-    byte r_xtra1; /* Something */
-    byte r_xtra2; /* Something (unused) */
-    ITEM_NUMBER r_drop_gold; /*!< これまでに撃破時に落とした財宝の数 / Max number of gold dropped at once */
-    ITEM_NUMBER r_drop_item; /*!< これまでに撃破時に落としたアイテムの数 / Max number of item dropped at once */
-    byte r_cast_spell; /* Max number of other spells seen */
-    byte r_blows[MAX_NUM_BLOWS]; /* Number of times each blow type was seen */
-    u32b r_flags1; /* Observed racial flags */
-    u32b r_flags2; /* Observed racial flags */
-    u32b r_flags3; /* Observed racial flags */
-    u32b r_flags4; /* Observed racial flags */
-    u32b r_flags5; /* Observed racial flags */
-    u32b r_flags6; /* Observed racial flags */
-    u32b r_flagsr; /* Observed racial resistance flags */
+    byte r_xtra1{}; /* Something */
+    byte r_xtra2{}; /* Something (unused) */
+    ITEM_NUMBER r_drop_gold{}; /*!< これまでに撃破時に落とした財宝の数 / Max number of gold dropped at once */
+    ITEM_NUMBER r_drop_item{}; /*!< これまでに撃破時に落としたアイテムの数 / Max number of item dropped at once */
+    byte r_cast_spell{}; /* Max number of other spells seen */
+    byte r_blows[MAX_NUM_BLOWS]{}; /* Number of times each blow type was seen */
+    u32b r_flags1{}; /* Observed racial flags */
+    u32b r_flags2{}; /* Observed racial flags */
+    u32b r_flags3{}; /* Observed racial flags */
+    u32b r_flags4{}; /* Observed racial flags */
+    u32b r_flags5{}; /* Observed racial flags */
+    u32b r_flags6{}; /* Observed racial flags */
+    u32b r_flagsr{}; /* Observed racial resistance flags */
 } monster_race;
index 3e4917e..e2544a2 100644 (file)
@@ -449,7 +449,7 @@ static concptr decide_target_floor(player_type *subject_ptr, eg_type *eg_ptr)
         return building[eg_ptr->f_ptr->subtype].name;
 
     if (has_flag(eg_ptr->f_ptr->flags, FF_ENTRANCE))
-        return format(_("%s(%d階相当)", "%s(level %d)"), d_text + d_info[eg_ptr->g_ptr->special].text, d_info[eg_ptr->g_ptr->special].mindepth);
+        return format(_("%s(%d階相当)", "%s(level %d)"), d_info[eg_ptr->g_ptr->special].text.c_str(), d_info[eg_ptr->g_ptr->special].mindepth);
 
     if (has_flag(eg_ptr->f_ptr->flags, FF_TOWN))
         return town_info[eg_ptr->g_ptr->special].name;
@@ -457,7 +457,7 @@ static concptr decide_target_floor(player_type *subject_ptr, eg_type *eg_ptr)
     if (subject_ptr->wild_mode && (eg_ptr->feat == feat_floor))
         return _("道", "road");
 
-    return f_name + eg_ptr->f_ptr->name;
+    return eg_ptr->f_ptr->name.c_str();
 }
 
 static void describe_grid_monster_all(eg_type *eg_ptr)
index 5079fad..7889481 100644 (file)
@@ -337,7 +337,7 @@ void display_monster_evolution(lore_type* lore_ptr)
 
     if (lore_ptr->r_ptr->next_r_idx) {
         hooked_roff(format(_("%^sは経験を積むと、", "%^s will evolve into "), Who::who(lore_ptr->msex)));
-        hook_c_roff(TERM_YELLOW, format("%s", r_name + r_info[lore_ptr->r_ptr->next_r_idx].name));
+        hook_c_roff(TERM_YELLOW, format("%s", r_info[lore_ptr->r_ptr->next_r_idx].name.c_str()));
 
         hooked_roff(_(format("に進化する。"), format(" when %s gets enough experience.  ", Who::who(lore_ptr->msex))));
     } else if (!(lore_ptr->r_ptr->flags1 & RF1_UNIQUE)) {
index 5df5966..7b92e6c 100644 (file)
@@ -58,7 +58,7 @@ void roff_top(MONRACE_IDX r_idx)
     }
 #endif
 
-    term_addstr(-1, TERM_WHITE, (r_name + r_ptr->name));
+    term_addstr(-1, TERM_WHITE, (r_ptr->name.c_str()));
 
     term_addstr(-1, TERM_WHITE, " ('");
     term_add_bigch(a1, c1);
@@ -521,16 +521,16 @@ static void display_monster_escort_contents(lore_type *lore_ptr)
 
         monster_race *rf_ptr = &r_info[lore_ptr->r_ptr->reinforce_id[n]];
         if (rf_ptr->flags1 & RF1_UNIQUE) {
-            hooked_roff(format(_("、%s", ", %s"), r_name + rf_ptr->name));
+            hooked_roff(format(_("、%s", ", %s"), rf_ptr->name.c_str()));
             continue;
         }
 
 #ifdef JP
-        hooked_roff(format("、 %dd%d 体の%s", lore_ptr->r_ptr->reinforce_dd[n], lore_ptr->r_ptr->reinforce_ds[n], r_name + rf_ptr->name));
+        hooked_roff(format("、 %dd%d 体の%s", lore_ptr->r_ptr->reinforce_dd[n], lore_ptr->r_ptr->reinforce_ds[n], rf_ptr->name.c_str()));
 #else
         bool plural = (lore_ptr->r_ptr->reinforce_dd[n] * lore_ptr->r_ptr->reinforce_ds[n] > 1);
         GAME_TEXT name[MAX_NLEN];
-        strcpy(name, r_name + rf_ptr->name);
+        strcpy(name, rf_ptr->name.c_str());
         if (plural)
             plural_aux(name);
         hooked_roff(format(",%dd%d %s", lore_ptr->r_ptr->reinforce_dd[n], lore_ptr->r_ptr->reinforce_ds[n], name));
index 72c3b0a..64aa81b 100644 (file)
@@ -189,7 +189,7 @@ void display_store(player_type *player_ptr)
         return;
     }
 
-    concptr store_name = (f_name + f_info[cur_store_feat].name);
+    concptr store_name = f_info[cur_store_feat].name.c_str();
     concptr owner_name = (ot_ptr->owner_name);
     concptr race_name = race_info[ot_ptr->owner_race].title;
     char buf[80];
index 6b43b17..2cfcb41 100644 (file)
@@ -114,7 +114,7 @@ static void print_monster_line(TERM_LEN x, TERM_LEN y, monster_type *m_ptr, int
 
     term_addstr(-1, TERM_WHITE, buf);
 
-    sprintf(buf, " %s ", r_name + r_ptr->name);
+    sprintf(buf, " %s ", r_ptr->name.c_str());
     term_addstr(-1, TERM_WHITE, buf);
 }
 
@@ -502,11 +502,11 @@ static void display_floor_item_list(player_type *player_ptr, const int y, const
             sprintf(line, _("(X:%03d Y:%03d) 奇妙な物体の足元のアイテム一覧", "Items at (%03d,%03d) under an odd object"), x, y);
         else {
             const monster_race *const r_ptr = &r_info[m_ptr->r_idx];
-            sprintf(line, _("(X:%03d Y:%03d) %sの足元の発見済みアイテム一覧", "Found items at (%03d,%03d) under %s"), x, y, (r_name + r_ptr->name));
+            sprintf(line, _("(X:%03d Y:%03d) %sの足元の発見済みアイテム一覧", "Found items at (%03d,%03d) under %s"), x, y, r_ptr->name.c_str());
         }
     } else {
         const feature_type *const f_ptr = &f_info[g_ptr->feat];
-        concptr fn = f_name + f_ptr->name;
+        concptr fn = f_ptr->name.c_str();
         char buf[512];
 
         if (has_flag(f_ptr->flags, FF_STORE) || (has_flag(f_ptr->flags, FF_BLDG) && !floor_ptr->inside_arena))
index b71ba52..2e6169f 100644 (file)
@@ -87,7 +87,7 @@ static void print_header(void)
 static bool make_fake_artifact(player_type *player_ptr, object_type *o_ptr, ARTIFACT_IDX name1)
 {
     artifact_type *a_ptr = &a_info[name1];
-    if (!a_ptr->name)
+    if (a_ptr->name.empty())
         return FALSE;
 
     OBJECT_IDX i = lookup_kind(a_ptr->tval, a_ptr->sval);
index b81feee..654a40d 100644 (file)
@@ -103,14 +103,14 @@ spoiler_output_status spoil_mon_desc(concptr fname, std::function<bool(const mon
     int n = 0;
     for (int i = 1; i < max_r_idx; i++) {
         monster_race *r_ptr = &r_info[i];
-        if (r_ptr->name)
+        if (!r_ptr->name.empty())
             who[n++] = (s16b)i;
     }
 
     ang_sort(&dummy, who, &why, n, ang_sort_comp_hook, ang_sort_swap_hook);
     for (int i = 0; i < n; i++) {
         monster_race *r_ptr = &r_info[who[i]];
-        concptr name = (r_name + r_ptr->name);
+        concptr name = r_ptr->name.c_str();
         if (filter_monster && !filter_monster(r_ptr))
             continue;
 
@@ -197,7 +197,7 @@ spoiler_output_status spoil_mon_info(concptr fname)
     int n = 0;
     for (int i = 1; i < max_r_idx; i++) {
         monster_race *r_ptr = &r_info[i];
-        if (r_ptr->name)
+        if (!r_ptr->name.empty())
             who[n++] = (s16b)i;
     }
 
@@ -215,7 +215,7 @@ spoiler_output_status spoil_mon_info(concptr fname)
 #endif
         }
 
-        sprintf(buf, _("%s/%s  (", "%s%s ("), (r_name + r_ptr->name), _(r_name + r_ptr->E_name, "")); /* ---)--- */
+        sprintf(buf, _("%s/%s  (", "%s%s ("), r_ptr->name.c_str(), _(r_ptr->E_name.c_str(), "")); /* ---)--- */
         spoil_out(buf);
         spoil_out(attr_to_text(r_ptr));
         sprintf(buf, " '%c')\n", r_ptr->d_char);
index d0614ba..e122f40 100644 (file)
@@ -156,7 +156,7 @@ void wiz_restore_monster_max_num()
     }
 
     monster_race *r_ptr = &r_info[r_idx];
-    if (!r_ptr->name) {
+    if (r_ptr->name.empty()) {
         msg_print("そのモンスターは存在しません。");
         msg_print(NULL);
         return;
@@ -179,8 +179,7 @@ void wiz_restore_monster_max_num()
     r_ptr->r_akills = 0;
 
     std::stringstream ss;
-    std::string name(r_name + r_ptr->name);
-    ss << name << _("の出現数を復元しました。", " can appear again now.");
+    ss << r_ptr->name << _("の出現数を復元しました。", " can appear again now.");
     msg_print(ss.str().c_str());
     msg_print(NULL);
 }
index 41cf3c7..31c6978 100644 (file)
@@ -651,7 +651,7 @@ WishResult do_cmd_wishing(player_type *caster_ptr, int prob, bool allow_art, boo
         int max_len = 0;
         for (KIND_OBJECT_IDX k = 1; k < max_k_idx; k++) {
             object_kind *k_ptr = &k_info[k];
-            if (!k_ptr->name)
+            if (k_ptr->name.empty())
                 continue;
 
             object_prep(caster_ptr, o_ptr, k);
@@ -678,10 +678,10 @@ WishResult do_cmd_wishing(player_type *caster_ptr, int prob, bool allow_art, boo
 
             for (EGO_IDX k = 1; k < max_e_idx; k++) {
                 ego_item_type *e_ptr = &e_info[k];
-                if (!e_ptr->name)
+                if (e_ptr->name.empty())
                     continue;
 
-                strcpy(o_name, (e_name + e_ptr->name));
+                strcpy(o_name, e_ptr->name.c_str());
 #ifndef JP
                 str_tolower(o_name);
 #endif
@@ -708,7 +708,7 @@ WishResult do_cmd_wishing(player_type *caster_ptr, int prob, bool allow_art, boo
         int mlen = 0;
         for (ARTIFACT_IDX i = 1; i < max_a_idx; i++) {
             artifact_type *a_ptr = &a_info[i];
-            if (!a_ptr->name)
+            if (a_ptr->name.empty())
                 continue;
 
             KIND_OBJECT_IDX k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
@@ -723,7 +723,7 @@ WishResult do_cmd_wishing(player_type *caster_ptr, int prob, bool allow_art, boo
             str_tolower(o_name);
 #endif
             a_str = a_desc;
-            strcpy(a_desc, a_name + a_ptr->name);
+            strcpy(a_desc, a_ptr->name.c_str());
 
             if (*a_str == '$')
                 a_str++;
@@ -759,7 +759,7 @@ WishResult do_cmd_wishing(player_type *caster_ptr, int prob, bool allow_art, boo
             if (cheat_xtra)
                 msg_format("Matching artifact No.%d %s(%s)", i, a_desc, _(&o_name[2], o_name));
 
-            std::vector<char *> l = { a_str, a_name + a_ptr->name, _(&o_name[2], o_name) };
+            std::vector<const char *> l = { a_str, a_ptr->name.c_str(), _(&o_name[2], o_name) };
             for (size_t c = 0; c < l.size(); c++) {
                 if (!strcmp(str, l.at(c))) {
                     len = strlen(l.at(c));
index 6102e7f..e752e0d 100644 (file)
@@ -145,12 +145,12 @@ static spoiler_output_status spoil_mon_evol(concptr fname)
             continue;
 
         r_ptr = &r_info[r_idx];
-        fprintf(spoiler_file, _("[%d]: %s (レベル%d, '%c')\n", "[%d]: %s (Level %d, '%c')\n"), r_idx, r_name + r_ptr->name, (int)r_ptr->level, r_ptr->d_char);
+        fprintf(spoiler_file, _("[%d]: %s (レベル%d, '%c')\n", "[%d]: %s (Level %d, '%c')\n"), r_idx, r_ptr->name.c_str(), (int)r_ptr->level, r_ptr->d_char);
         for (n = 1; r_ptr->next_exp; n++) {
             fprintf(spoiler_file, "%*s-(%ld)-> ", n * 2, "", (long int)r_ptr->next_exp);
             fprintf(spoiler_file, "[%d]: ", r_ptr->next_r_idx);
             r_ptr = &r_info[r_ptr->next_r_idx];
-            fprintf(spoiler_file, _("%s (レベル%d, '%c')\n", "%s (Level %d, '%c')\n"), r_name + r_ptr->name, (int)r_ptr->level, r_ptr->d_char);
+            fprintf(spoiler_file, _("%s (レベル%d, '%c')\n", "%s (Level %d, '%c')\n"), r_ptr->name.c_str(), (int)r_ptr->level, r_ptr->d_char);
         }
 
         fputc('\n', spoiler_file);
index f1578d9..692c307 100644 (file)
@@ -141,14 +141,14 @@ void process_world(player_type *player_ptr)
 
                 for (FEAT_IDX i = 1; i < max_f_idx; i++) {
                     feature_type *f_ptr = &f_info[i];
-                    if (!f_ptr->name)
+                    if (f_ptr->name.empty())
                         continue;
                     if (!has_flag(f_ptr->flags, FF_STORE))
                         continue;
 
                     if (f_ptr->subtype == n) {
                         if (cheat_xtra)
-                            msg_format(_("%sの店主をシャッフルします。", "Shuffle a Shopkeeper of %s."), f_name + f_ptr->name);
+                            msg_format(_("%sの店主をシャッフルします。", "Shuffle a Shopkeeper of %s."), f_ptr->name.c_str());
 
                         store_shuffle(player_ptr, n);
                         break;