2 * @brief 変愚蛮怒 v1.5.0以前の旧いセーブデータを読み込む処理
5 * @details 互換性を最大限に確保するため、基本的に関数分割は行わないものとする.
8 #include "load/old/load-v1-5-0.h"
9 #include "artifact/fixed-art-types.h"
10 #include "floor/floor-object.h"
11 #include "game-option/birth-options.h"
12 #include "grid/feature.h"
13 #include "grid/grid.h"
14 #include "grid/trap.h"
15 #include "load/angband-version-comparer.h"
16 #include "load/item/item-loader-factory.h"
17 #include "load/item/item-loader-version-types.h"
18 #include "load/load-util.h"
19 #include "load/monster/monster-loader-factory.h"
20 #include "load/old-feature-types.h"
21 #include "load/old/item-loader-savefile50.h"
22 #include "load/old/monster-loader-savefile50.h"
23 #include "mind/mind-weaponsmith.h"
24 #include "monster-floor/monster-move.h"
25 #include "monster-race/monster-race.h"
26 #include "monster-race/race-flags-resistance.h"
28 #include "monster-race/race-indice-types.h"
29 #include "monster/monster-flag-types.h"
30 #include "monster/monster-info.h"
31 #include "monster/monster-list.h"
32 #include "object-enchant/object-ego.h"
33 #include "object-enchant/old-ego-extra-values.h"
34 #include "object-enchant/tr-types.h"
35 #include "object-enchant/trc-types.h"
36 #include "object-enchant/trg-types.h"
37 #include "object/object-kind-hook.h"
38 #include "sv-definition/sv-armor-types.h"
39 #include "sv-definition/sv-lite-types.h"
40 #include "system/angband-exceptions.h"
41 #include "system/artifact-type-definition.h"
42 #include "system/baseitem-info.h"
43 #include "system/dungeon-info.h"
44 #include "system/floor-type-definition.h"
45 #include "system/grid-type-definition.h"
46 #include "system/item-entity.h"
47 #include "system/monster-race-info.h"
48 #include "system/player-type-definition.h"
49 #include "util/bit-flags-calculator.h"
50 #include "util/enum-converter.h"
51 #include "world/world-object.h"
52 #include "world/world.h"
54 /* Old hidden trap flag */
55 static const BIT_FLAGS CAVE_TRAP = 0x8000;
57 const int OLD_QUEST_WATER_CAVE = 18; // 湖の洞窟.
58 const int QUEST_OLD_CASTLE = 27; // 古い城.
59 const int QUEST_ROYAL_CRYPT = 28; // 王家の墓.
62 * @brief アイテムオブジェクト1件を読み込む / Read an object
63 * @param o_ptr アイテムオブジェクト読み取り先ポインタ
65 void rd_item_old(ItemEntity *o_ptr)
67 o_ptr->bi_id = rd_s16b();
69 o_ptr->iy = rd_byte();
70 o_ptr->ix = rd_byte();
72 const auto tval = i2enum<ItemKindType>(rd_byte());
73 const auto sval = rd_byte();
74 o_ptr->bi_key = BaseitemKey(tval, sval);
76 if (h_older_than(0, 4, 4)) {
77 if (tval == i2enum<ItemKindType>(100)) {
78 o_ptr->bi_key = BaseitemKey(ItemKindType::GOLD, sval);
80 if (tval == i2enum<ItemKindType>(98)) {
81 o_ptr->bi_key = BaseitemKey(ItemKindType::MUSIC_BOOK, sval);
83 if (tval == i2enum<ItemKindType>(110)) {
84 o_ptr->bi_key = BaseitemKey(ItemKindType::HISSATSU_BOOK, sval);
88 o_ptr->pval = rd_s16b();
89 o_ptr->discount = rd_byte();
90 o_ptr->number = rd_byte();
92 o_ptr->weight = rd_s16b();
94 o_ptr->fixed_artifact_idx = i2enum<FixedArtifactId>(rd_byte());
96 o_ptr->ego_idx = i2enum<EgoType>(rd_byte());
98 o_ptr->timeout = rd_s16b();
99 o_ptr->to_h = rd_s16b();
100 o_ptr->to_d = rd_s16b();
102 o_ptr->to_a = rd_s16b();
103 o_ptr->ac = rd_s16b();
104 o_ptr->dd = rd_byte();
106 o_ptr->ds = rd_byte();
108 o_ptr->ident = rd_byte();
109 rd_FlagGroup_bytes(o_ptr->marked, rd_byte, 1);
111 for (int i = 0, count = (h_older_than(1, 3, 0, 0) ? 3 : 4); i < count; i++) {
112 auto tmp32u = rd_u32b();
113 migrate_bitflag_to_flaggroup(o_ptr->art_flags, tmp32u, i * 32);
116 if (h_older_than(1, 3, 0, 0)) {
117 if (o_ptr->ego_idx == EgoType::TELEPATHY) {
118 o_ptr->art_flags.set(TR_TELEPATHY);
122 if (h_older_than(1, 0, 11)) {
123 // バージョン 1.0.11 以前は tr_type の 93, 94, 95 は現在と違い呪い等の別の用途で使用されていたので番号をハードコーディングする
124 o_ptr->curse_flags.clear();
125 if (o_ptr->ident & 0x40) {
126 o_ptr->curse_flags.set(CurseTraitType::CURSED);
127 if (o_ptr->art_flags.has(i2enum<tr_type>(94))) {
128 o_ptr->curse_flags.set(CurseTraitType::HEAVY_CURSE);
130 if (o_ptr->art_flags.has(i2enum<tr_type>(95))) {
131 o_ptr->curse_flags.set(CurseTraitType::PERMA_CURSE);
133 if (o_ptr->is_fixed_artifact()) {
134 const auto &artifact = o_ptr->get_fixed_artifact();
135 if (artifact.gen_flags.has(ItemGenerationTraitType::HEAVY_CURSE)) {
136 o_ptr->curse_flags.set(CurseTraitType::HEAVY_CURSE);
138 if (artifact.gen_flags.has(ItemGenerationTraitType::PERMA_CURSE)) {
139 o_ptr->curse_flags.set(CurseTraitType::PERMA_CURSE);
141 } else if (o_ptr->is_ego()) {
142 const auto &ego = o_ptr->get_ego();
143 if (ego.gen_flags.has(ItemGenerationTraitType::HEAVY_CURSE)) {
144 o_ptr->curse_flags.set(CurseTraitType::HEAVY_CURSE);
146 if (ego.gen_flags.has(ItemGenerationTraitType::PERMA_CURSE)) {
147 o_ptr->curse_flags.set(CurseTraitType::PERMA_CURSE);
151 o_ptr->art_flags.reset({ i2enum<tr_type>(93), i2enum<tr_type>(94), i2enum<tr_type>(95) });
153 auto tmp32u = rd_u32b();
154 migrate_bitflag_to_flaggroup(o_ptr->curse_flags, tmp32u);
157 o_ptr->held_m_idx = rd_s16b();
158 auto xtra1 = rd_byte(); // かつてエゴアイテムの情報を格納していた名残.
159 o_ptr->activation_id = i2enum<RandomArtActType>(rd_byte());
161 if (h_older_than(1, 0, 10)) {
162 if (xtra1 == enum2i<OldEgoType>(OldEgoType::XTRA_SUSTAIN)) {
163 switch (enum2i(o_ptr->activation_id) % 6) {
165 o_ptr->art_flags.set(TR_SUST_STR);
168 o_ptr->art_flags.set(TR_SUST_INT);
171 o_ptr->art_flags.set(TR_SUST_WIS);
174 o_ptr->art_flags.set(TR_SUST_DEX);
177 o_ptr->art_flags.set(TR_SUST_CON);
180 o_ptr->art_flags.set(TR_SUST_CHR);
183 o_ptr->activation_id = i2enum<RandomArtActType>(0);
184 } else if (xtra1 == enum2i<OldEgoType>(OldEgoType::XTRA_POWER)) {
185 switch (enum2i(o_ptr->activation_id) % 11) {
187 o_ptr->art_flags.set(TR_RES_BLIND);
190 o_ptr->art_flags.set(TR_RES_CONF);
193 o_ptr->art_flags.set(TR_RES_SOUND);
196 o_ptr->art_flags.set(TR_RES_SHARDS);
199 o_ptr->art_flags.set(TR_RES_NETHER);
202 o_ptr->art_flags.set(TR_RES_NEXUS);
205 o_ptr->art_flags.set(TR_RES_CHAOS);
208 o_ptr->art_flags.set(TR_RES_DISEN);
211 o_ptr->art_flags.set(TR_RES_POIS);
214 o_ptr->art_flags.set(TR_RES_DARK);
217 o_ptr->art_flags.set(TR_RES_LITE);
220 o_ptr->activation_id = i2enum<RandomArtActType>(0);
221 } else if (xtra1 == enum2i<OldEgoType>(OldEgoType::XTRA_ABILITY)) {
222 switch (enum2i(o_ptr->activation_id) % 8) {
224 o_ptr->art_flags.set(TR_LEVITATION);
227 o_ptr->art_flags.set(TR_LITE_1);
230 o_ptr->art_flags.set(TR_SEE_INVIS);
233 o_ptr->art_flags.set(TR_WARNING);
236 o_ptr->art_flags.set(TR_SLOW_DIGEST);
239 o_ptr->art_flags.set(TR_REGEN);
242 o_ptr->art_flags.set(TR_FREE_ACT);
245 o_ptr->art_flags.set(TR_HOLD_EXP);
248 o_ptr->activation_id = i2enum<RandomArtActType>(0);
254 if (h_older_than(0, 2, 3)) {
256 o_ptr->captured_monster_current_hp = 0;
257 o_ptr->smith_hit = 0;
258 o_ptr->smith_damage = 0;
259 o_ptr->captured_monster_max_hp = 0;
260 if (tval == ItemKindType::CHEST) {
261 o_ptr->chest_level = xtra1;
262 } else if (tval == ItemKindType::CAPTURE) {
263 o_ptr->captured_monster_speed = xtra1;
266 if (tval == ItemKindType::CAPTURE) {
267 const auto &r_ref = monraces_info[i2enum<MonsterRaceId>(o_ptr->pval)];
268 if (r_ref.misc_flags.has(MonsterMiscType::FORCE_MAXHP)) {
269 o_ptr->captured_monster_max_hp = maxroll(r_ref.hdice, r_ref.hside);
271 o_ptr->captured_monster_max_hp = damroll(r_ref.hdice, r_ref.hside);
273 if (ironman_nightmare) {
274 o_ptr->captured_monster_max_hp = std::min<short>(MONSTER_MAXHP, o_ptr->captured_monster_max_hp * 2L);
277 o_ptr->captured_monster_current_hp = o_ptr->captured_monster_max_hp;
280 auto xtra3 = rd_byte();
281 if (h_older_than(1, 3, 0, 1)) {
282 if (o_ptr->is_smith() && (xtra3 >= 1 + 96)) {
283 auto mes = _("古いバージョンで鍛冶師をプレイしたデータは読み込めません。", "The save data from playing a weaponsmith on versions older than v3.0.0 Aplha38 can't be read.");
284 throw SaveDataNotSupportedException(mes);
288 auto xtra4 = rd_s16b();
289 if (tval == ItemKindType::LITE) {
291 } else if (tval == ItemKindType::CAPTURE) {
292 o_ptr->captured_monster_current_hp = xtra4;
294 o_ptr->smith_hit = static_cast<byte>(xtra4 >> 8);
295 o_ptr->smith_damage = static_cast<byte>(xtra4 & 0x000f);
298 o_ptr->captured_monster_max_hp = rd_s16b();
301 if (h_older_than(1, 0, 5) && o_ptr->is_fuel()) {
302 o_ptr->fuel = o_ptr->pval;
306 o_ptr->feeling = rd_byte();
309 rd_string(buf, sizeof(buf));
311 o_ptr->inscription.emplace(buf);
314 rd_string(buf, sizeof(buf));
316 /*!< @todo 元々このif文には末尾に";"が付いていた、バグかもしれない */
318 o_ptr->randart_name.emplace(buf);
321 auto tmp32s = rd_s32b();
325 if ((o_ptr->bi_id >= 445) && (o_ptr->bi_id <= 479)) {
329 if (h_older_than(0, 4, 10) && (o_ptr->ego_idx == EgoType::TWILIGHT)) {
330 o_ptr->bi_id = lookup_baseitem_id({ ItemKindType::SOFT_ARMOR, SV_TWILIGHT_ROBE });
333 if (h_older_than(0, 4, 9)) {
334 if (o_ptr->art_flags.has(TR_MAGIC_MASTERY)) {
335 o_ptr->art_flags.reset(TR_MAGIC_MASTERY);
336 o_ptr->art_flags.set(TR_DEC_MANA);
340 if (o_ptr->is_fixed_artifact()) {
341 const auto &artifact = o_ptr->get_fixed_artifact();
342 if (artifact.name.empty()) {
343 o_ptr->fixed_artifact_idx = FixedArtifactId::NONE;
347 if (o_ptr->is_ego()) {
348 const auto &ego = o_ptr->get_ego();
349 if (ego.name.empty()) {
350 o_ptr->ego_idx = EgoType::NONE;
356 * @brief モンスターを読み込む / Read a monster
357 * @param player_ptr プレイヤーへの参照ポインタ
358 * @param m_ptr モンスター保存先ポインタ
360 void rd_monster_old(PlayerType *player_ptr, MonsterEntity *m_ptr)
362 m_ptr->r_idx = i2enum<MonsterRaceId>(rd_s16b());
364 if (h_older_than(1, 0, 12)) {
365 m_ptr->ap_r_idx = m_ptr->r_idx;
367 m_ptr->ap_r_idx = i2enum<MonsterRaceId>(rd_s16b());
370 if (h_older_than(1, 0, 14)) {
371 auto *r_ptr = &m_ptr->get_monrace();
373 m_ptr->sub_align = SUB_ALIGN_NEUTRAL;
374 if (r_ptr->kind_flags.has(MonsterKindType::EVIL)) {
375 m_ptr->sub_align |= SUB_ALIGN_EVIL;
377 if (r_ptr->kind_flags.has(MonsterKindType::GOOD)) {
378 m_ptr->sub_align |= SUB_ALIGN_GOOD;
381 m_ptr->sub_align = rd_byte();
384 m_ptr->fy = rd_byte();
385 m_ptr->fx = rd_byte();
386 m_ptr->current_floor_ptr = player_ptr->current_floor_ptr;
388 m_ptr->hp = rd_s16b();
389 m_ptr->maxhp = rd_s16b();
391 if (h_older_than(1, 0, 5)) {
392 m_ptr->max_maxhp = m_ptr->maxhp;
394 m_ptr->max_maxhp = rd_s16b();
396 if (h_older_than(2, 1, 2, 1)) {
397 m_ptr->dealt_damage = 0;
399 m_ptr->dealt_damage = rd_s32b();
402 m_ptr->mtimed[MTIMED_CSLEEP] = rd_s16b();
403 m_ptr->mspeed = rd_byte();
405 if (h_older_than(0, 4, 2)) {
406 m_ptr->energy_need = rd_byte();
408 m_ptr->energy_need = rd_s16b();
411 if (h_older_than(1, 0, 13)) {
412 m_ptr->energy_need = 100 - m_ptr->energy_need;
415 if (h_older_than(0, 0, 7)) {
416 m_ptr->mtimed[MTIMED_FAST] = 0;
417 m_ptr->mtimed[MTIMED_SLOW] = 0;
419 m_ptr->mtimed[MTIMED_FAST] = rd_byte();
420 m_ptr->mtimed[MTIMED_SLOW] = rd_byte();
423 m_ptr->mtimed[MTIMED_STUNNED] = rd_byte();
424 m_ptr->mtimed[MTIMED_CONFUSED] = rd_byte();
425 m_ptr->mtimed[MTIMED_MONFEAR] = rd_byte();
427 if (h_older_than(0, 0, 10)) {
429 } else if (h_older_than(0, 0, 11)) {
433 m_ptr->target_y = rd_s16b();
434 m_ptr->target_x = rd_s16b();
437 m_ptr->mtimed[MTIMED_INVULNER] = rd_byte();
439 auto tmp32u = rd_u32b();
440 migrate_bitflag_to_flaggroup(m_ptr->smart, tmp32u);
442 // 3.0.0Alpha10以前のSM_CLONED(ビット位置22)、SM_PET(23)、SM_FRIEDLY(28)をMFLAG2に移行する
443 // ビット位置の定義はなくなるので、ビット位置の値をハードコードする。
444 std::bitset<32> rd_bits_smart(tmp32u);
445 m_ptr->mflag2[MonsterConstantFlagType::CLONED] = rd_bits_smart[22];
446 m_ptr->mflag2[MonsterConstantFlagType::PET] = rd_bits_smart[23];
447 m_ptr->mflag2[MonsterConstantFlagType::FRIENDLY] = rd_bits_smart[28];
448 m_ptr->smart.reset(i2enum<MonsterSmartLearnType>(22)).reset(i2enum<MonsterSmartLearnType>(23)).reset(i2enum<MonsterSmartLearnType>(28));
450 if (h_older_than(0, 4, 5)) {
453 m_ptr->exp = rd_u32b();
456 if (h_older_than(0, 2, 2)) {
457 if (enum2i(m_ptr->r_idx) < 0) {
458 m_ptr->r_idx = i2enum<MonsterRaceId>(0 - enum2i(m_ptr->r_idx));
459 m_ptr->mflag2.set(MonsterConstantFlagType::KAGE);
462 auto tmp8u = rd_byte();
463 constexpr auto base = enum2i(MonsterConstantFlagType::KAGE);
464 migrate_bitflag_to_flaggroup(m_ptr->mflag2, tmp8u, base, 7);
467 if (h_older_than(1, 0, 12)) {
468 if (m_ptr->mflag2.has(MonsterConstantFlagType::KAGE)) {
469 m_ptr->ap_r_idx = MonsterRaceId::KAGE;
473 if (h_older_than(0, 1, 3)) {
474 m_ptr->nickname.clear();
477 rd_string(buf, sizeof(buf));
479 m_ptr->nickname = buf;
486 static void move_RF3_to_RFR(MonsterRaceInfo *r_ptr, BIT_FLAGS f3, const BIT_FLAGS rf3, const MonsterResistanceType rfr)
489 r_ptr->resistance_flags.set(rfr);
493 static void move_RF4_BR_to_RFR(MonsterRaceInfo *r_ptr, BIT_FLAGS f4, const BIT_FLAGS rf4_br, const MonsterResistanceType rfr)
496 r_ptr->resistance_flags.set(rfr);
501 * @brief モンスターの思い出を読み込む
502 * @param r_ptr モンスター種族情報への参照ポインタ
503 * @param r_idx モンスター種族ID
504 * @details 本来はr_idxからr_ptrを決定可能だが、互換性を優先するため元コードのままとする
506 void set_old_lore(MonsterRaceInfo *r_ptr, BIT_FLAGS f3, BIT_FLAGS f4, const MonsterRaceId r_idx)
508 r_ptr->r_resistance_flags.clear();
509 move_RF3_to_RFR(r_ptr, f3, RF3_IM_ACID, MonsterResistanceType::IMMUNE_ACID);
510 move_RF3_to_RFR(r_ptr, f3, RF3_IM_ELEC, MonsterResistanceType::IMMUNE_ELEC);
511 move_RF3_to_RFR(r_ptr, f3, RF3_IM_FIRE, MonsterResistanceType::IMMUNE_FIRE);
512 move_RF3_to_RFR(r_ptr, f3, RF3_IM_COLD, MonsterResistanceType::IMMUNE_COLD);
513 move_RF3_to_RFR(r_ptr, f3, RF3_IM_POIS, MonsterResistanceType::IMMUNE_POISON);
514 move_RF3_to_RFR(r_ptr, f3, RF3_RES_TELE, MonsterResistanceType::RESIST_TELEPORT);
515 move_RF3_to_RFR(r_ptr, f3, RF3_RES_NETH, MonsterResistanceType::RESIST_NETHER);
516 move_RF3_to_RFR(r_ptr, f3, RF3_RES_WATE, MonsterResistanceType::RESIST_WATER);
517 move_RF3_to_RFR(r_ptr, f3, RF3_RES_PLAS, MonsterResistanceType::RESIST_PLASMA);
518 move_RF3_to_RFR(r_ptr, f3, RF3_RES_NEXU, MonsterResistanceType::RESIST_NEXUS);
519 move_RF3_to_RFR(r_ptr, f3, RF3_RES_DISE, MonsterResistanceType::RESIST_DISENCHANT);
520 move_RF3_to_RFR(r_ptr, f3, RF3_RES_ALL, MonsterResistanceType::RESIST_ALL);
522 move_RF4_BR_to_RFR(r_ptr, f4, RF4_BR_LITE, MonsterResistanceType::RESIST_LITE);
523 move_RF4_BR_to_RFR(r_ptr, f4, RF4_BR_DARK, MonsterResistanceType::RESIST_DARK);
524 move_RF4_BR_to_RFR(r_ptr, f4, RF4_BR_SOUN, MonsterResistanceType::RESIST_SOUND);
525 move_RF4_BR_to_RFR(r_ptr, f4, RF4_BR_CHAO, MonsterResistanceType::RESIST_CHAOS);
526 move_RF4_BR_to_RFR(r_ptr, f4, RF4_BR_TIME, MonsterResistanceType::RESIST_TIME);
527 move_RF4_BR_to_RFR(r_ptr, f4, RF4_BR_INER, MonsterResistanceType::RESIST_INERTIA);
528 move_RF4_BR_to_RFR(r_ptr, f4, RF4_BR_GRAV, MonsterResistanceType::RESIST_GRAVITY);
529 move_RF4_BR_to_RFR(r_ptr, f4, RF4_BR_SHAR, MonsterResistanceType::RESIST_SHARDS);
530 move_RF4_BR_to_RFR(r_ptr, f4, RF4_BR_WALL, MonsterResistanceType::RESIST_FORCE);
532 if (f4 & RF4_BR_CONF) {
533 r_ptr->r_resistance_flags.set(MonsterResistanceType::NO_CONF);
536 if (r_idx == MonsterRaceId::STORMBRINGER) {
537 r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_CHAOS);
540 if (r_ptr->r_kind_flags.has(MonsterKindType::ORC)) {
541 r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_DARK);
546 * @brief ダンジョン情報を読み込む / Read the dungeon (old method)
547 * @param player_ptr プレイヤーへの参照ポインタ
549 * The monsters/objects must be loaded in the same order
550 * that they were stored, since the actual indexes matter.
552 errr rd_dungeon_old(PlayerType *player_ptr)
554 auto *floor_ptr = player_ptr->current_floor_ptr;
555 floor_ptr->dun_level = rd_s16b();
556 if (h_older_than(0, 3, 8)) {
557 floor_ptr->set_dungeon_index(DUNGEON_ANGBAND);
559 floor_ptr->set_dungeon_index(rd_byte());
562 floor_ptr->base_level = floor_ptr->dun_level;
563 floor_ptr->base_level = rd_s16b();
565 floor_ptr->num_repro = rd_s16b();
566 player_ptr->y = rd_s16b();
567 player_ptr->x = rd_s16b();
568 if (h_older_than(0, 3, 13) && !floor_ptr->dun_level && !floor_ptr->inside_arena) {
572 floor_ptr->height = rd_s16b();
573 floor_ptr->width = rd_s16b();
574 strip_bytes(2); /* max_panel_rows */
575 strip_bytes(2); /* max_panel_cols */
577 int ymax = floor_ptr->height;
578 int xmax = floor_ptr->width;
580 for (int x = 0, y = 0; y < ymax;) {
582 auto count = rd_byte();
583 if (h_older_than(0, 3, 6)) {
587 info &= ~(CAVE_LITE | CAVE_VIEW | CAVE_MNLT | CAVE_MNDK);
590 for (int i = count; i > 0; i--) {
592 g_ptr = &floor_ptr->grid_array[y][x];
603 for (int x = 0, y = 0; y < ymax;) {
604 auto count = rd_byte();
605 auto tmp8u = rd_byte();
606 for (int i = count; i > 0; i--) {
608 g_ptr = &floor_ptr->grid_array[y][x];
609 g_ptr->feat = (int16_t)tmp8u;
619 for (int x = 0, y = 0; y < ymax;) {
620 auto count = rd_byte();
621 auto tmp8u = rd_byte();
622 for (int i = count; i > 0; i--) {
624 g_ptr = &floor_ptr->grid_array[y][x];
625 g_ptr->mimic = (int16_t)tmp8u;
635 for (int x = 0, y = 0; y < ymax;) {
636 auto count = rd_byte();
637 auto tmp16s = rd_s16b();
638 for (int i = count; i > 0; i--) {
640 g_ptr = &floor_ptr->grid_array[y][x];
641 g_ptr->special = tmp16s;
651 if (h_older_than(1, 0, 99)) {
652 for (int y = 0; y < ymax; y++) {
653 for (int x = 0; x < xmax; x++) {
654 floor_ptr->grid_array[y][x].info &= ~(CAVE_MASK);
659 if (h_older_than(1, 1, 1, 0)) {
660 for (int y = 0; y < ymax; y++) {
661 for (int x = 0; x < xmax; x++) {
663 g_ptr = &floor_ptr->grid_array[y][x];
666 if (g_ptr->feat == OLD_FEAT_INVIS) {
667 g_ptr->feat = feat_floor;
668 g_ptr->info |= CAVE_TRAP;
671 /* Older than 1.1.1 */
672 if (g_ptr->feat == OLD_FEAT_MIRROR) {
673 g_ptr->feat = feat_floor;
674 g_ptr->info |= CAVE_OBJECT;
680 if (h_older_than(1, 3, 1, 0)) {
681 for (int y = 0; y < ymax; y++) {
682 for (int x = 0; x < xmax; x++) {
684 g_ptr = &floor_ptr->grid_array[y][x];
686 /* Old CAVE_IN_MIRROR flag */
687 if (g_ptr->info & CAVE_OBJECT) {
688 g_ptr->mimic = feat_mirror;
689 } else if ((g_ptr->feat == OLD_FEAT_RUNE_EXPLOSION) || (g_ptr->feat == OLD_FEAT_RUNE_PROTECTION)) {
690 g_ptr->info |= CAVE_OBJECT;
691 g_ptr->mimic = g_ptr->feat;
692 g_ptr->feat = feat_floor;
693 } else if (g_ptr->info & CAVE_TRAP) {
694 g_ptr->info &= ~CAVE_TRAP;
695 g_ptr->mimic = g_ptr->feat;
696 g_ptr->feat = choose_random_trap(floor_ptr);
697 } else if (g_ptr->feat == OLD_FEAT_INVIS) {
698 g_ptr->mimic = feat_floor;
699 g_ptr->feat = feat_trap_open;
705 /* Quest 18 was removed */
707 for (int y = 0; y < ymax; y++) {
708 for (int x = 0; x < xmax; x++) {
710 g_ptr = &floor_ptr->grid_array[y][x];
712 if ((g_ptr->special == OLD_QUEST_WATER_CAVE) && !floor_ptr->dun_level) {
713 if (g_ptr->feat == OLD_FEAT_QUEST_ENTER) {
714 g_ptr->feat = feat_tree;
716 } else if (g_ptr->feat == OLD_FEAT_BLDG_1) {
717 g_ptr->special = lite_town ? QUEST_OLD_CASTLE : QUEST_ROYAL_CRYPT;
719 } else if ((g_ptr->feat == OLD_FEAT_QUEST_EXIT) && (floor_ptr->quest_number == i2enum<QuestId>(OLD_QUEST_WATER_CAVE))) {
720 g_ptr->feat = feat_up_stair;
729 if (limit > MAX_FLOOR_ITEMS) {
730 load_note(format(_("アイテムの配列が大きすぎる(%d)!", "Too many (%d) object entries!"), limit));
734 auto item_loader = ItemLoaderFactory::create_loader();
735 for (int i = 1; i < limit; i++) {
736 OBJECT_IDX o_idx = o_pop(floor_ptr);
738 load_note(format(_("アイテム配置エラー (%d <> %d)", "Object allocation error (%d <> %d)"), i, o_idx));
742 auto &item = floor_ptr->o_list[o_idx];
743 item_loader->rd_item(&item);
744 auto &list = get_o_idx_list_contains(floor_ptr, o_idx);
745 list.add(floor_ptr, o_idx);
749 if (limit > MAX_FLOOR_MONSTERS) {
750 load_note(format(_("モンスターの配列が大きすぎる(%d)!", "Too many (%d) monster entries!"), limit));
754 auto monster_loader = MonsterLoaderFactory::create_loader(player_ptr);
755 for (int i = 1; i < limit; i++) {
756 auto m_idx = m_pop(floor_ptr);
758 load_note(format(_("モンスター配置エラー (%d <> %d)", "Monster allocation error (%d <> %d)"), i, m_idx));
762 auto m_ptr = &floor_ptr->m_list[m_idx];
763 monster_loader->rd_monster(m_ptr);
764 auto *g_ptr = &floor_ptr->grid_array[m_ptr->fy][m_ptr->fx];
765 g_ptr->m_idx = m_idx;
766 m_ptr->get_real_monrace().cur_num++;
769 if (h_older_than(0, 3, 13) && !floor_ptr->dun_level && !floor_ptr->inside_arena) {
770 w_ptr->character_dungeon = false;
772 w_ptr->character_dungeon = true;