OSDN Git Service

Revert "Revert "Merge branch 'master' of git.osdn.net:/gitroot/hengband/hengband""
[hengbandforosx/hengbandosx.git] / src / load / load-v1-5-0.c
1 /*!
2  * @brief 馬鹿馬鹿蛮怒 v1.5.0以前の旧いセーブデータを読み込む処理
3  * @date 2020/07/04
4  * @author Hourier
5  * @details 互換性を最大限に確保するため、基本的に関数分割は行わないものとする.
6  */
7
8 #include "load/load-v1-5-0.h"
9 #include "cmd-item/cmd-smith.h"
10 #include "dungeon/dungeon.h"
11 #include "grid/grid.h"
12 #include "grid/trap.h"
13 #include "game-option/birth-options.h"
14 #include "load/angband-version-comparer.h"
15 #include "load/item-loader.h"
16 #include "load/load-util.h"
17 #include "load/monster-loader.h"
18 #include "load/old-feature-types.h"
19 #include "mind/mind-weaponsmith.h"
20 #include "monster-floor/monster-move.h"
21 #include "monster-race/monster-race.h"
22 #include "monster-race/race-flags-resistance.h"
23 #include "monster-race/race-flags1.h"
24 #include "monster-race/race-flags3.h"
25 #include "monster-race/race-indice-types.h"
26 #include "monster/monster-flag-types.h"
27 #include "monster/monster-info.h"
28 #include "monster/monster-list.h"
29 #include "object-enchant/object-ego.h"
30 #include "object-enchant/old-ego-extra-values.h"
31 #include "object-enchant/tr-types.h"
32 #include "object-enchant/trc-types.h"
33 #include "object-enchant/trg-types.h"
34 #include "object-hook/hook-checker.h"
35 #include "object-hook/hook-enchant.h"
36 #include "object/object-kind-hook.h"
37 #include "sv-definition/sv-armor-types.h"
38 #include "sv-definition/sv-lite-types.h"
39 #include "system/artifact-type-definition.h"
40 #include "system/floor-type-definition.h"
41 #include "system/object-type-definition.h"
42 #include "util/bit-flags-calculator.h"
43 #include "util/quarks.h"
44 #include "world/world-object.h"
45 #include "world/world.h"
46
47 /* Old hidden trap flag */
48 static const BIT_FLAGS CAVE_TRAP = 0x8000;
49
50 const int OLD_QUEST_WATER_CAVE = 18; // 湖の洞窟.
51 const int QUEST_OLD_CASTLE = 27; // 古い城.
52 const int QUEST_ROYAL_CRYPT = 28; // 王家の墓.
53
54 /*!
55  * @brief アイテムオブジェクト1件を読み込む / Read an object
56  * @param o_ptr アイテムオブジェクト読み取り先ポインタ
57  * @return なし
58  */
59 void rd_item_old(player_type *player_ptr, object_type *o_ptr)
60 {
61     rd_s16b(&o_ptr->k_idx);
62
63     byte tmp8u;
64     rd_byte(&tmp8u);
65     o_ptr->iy = (POSITION)tmp8u;
66     rd_byte(&tmp8u);
67     o_ptr->ix = (POSITION)tmp8u;
68
69     /* Type/Subtype */
70     rd_byte(&tmp8u);
71     o_ptr->tval = tmp8u;
72     rd_byte(&tmp8u);
73     o_ptr->sval = tmp8u;
74
75     if (z_older_than(10, 4, 4)) {
76         if (o_ptr->tval == 100)
77             o_ptr->tval = TV_GOLD;
78         if (o_ptr->tval == 98)
79             o_ptr->tval = TV_MUSIC_BOOK;
80         if (o_ptr->tval == 110)
81             o_ptr->tval = TV_HISSATSU_BOOK;
82     }
83
84     rd_s16b(&o_ptr->pval);
85     rd_byte(&o_ptr->discount);
86     rd_byte(&tmp8u);
87     o_ptr->number = (ITEM_NUMBER)tmp8u;
88
89     s16b tmp16s;
90     rd_s16b(&tmp16s);
91     o_ptr->weight = tmp16s;
92
93     rd_byte(&tmp8u);
94     o_ptr->name1 = tmp8u;
95
96     rd_byte(&tmp8u);
97     o_ptr->name2 = tmp8u;
98
99     rd_s16b(&o_ptr->timeout);
100     rd_s16b(&o_ptr->to_h);
101     rd_s16b(&tmp16s);
102     o_ptr->to_d = tmp16s;
103
104     rd_s16b(&o_ptr->to_a);
105     rd_s16b(&o_ptr->ac);
106     rd_byte(&tmp8u);
107     o_ptr->dd = tmp8u;
108
109     rd_byte(&tmp8u);
110     o_ptr->ds = tmp8u;
111
112     rd_byte(&o_ptr->ident);
113     rd_byte(&o_ptr->marked);
114     rd_u32b(&o_ptr->art_flags[0]);
115     rd_u32b(&o_ptr->art_flags[1]);
116     rd_u32b(&o_ptr->art_flags[2]);
117     if (h_older_than(1, 3, 0, 0))
118         o_ptr->art_flags[3] = 0L;
119     else
120         rd_u32b(&o_ptr->art_flags[3]);
121
122     if (h_older_than(1, 3, 0, 0)) {
123         if (o_ptr->name2 == EGO_TELEPATHY)
124             add_flag(o_ptr->art_flags, TR_TELEPATHY);
125     }
126
127     if (z_older_than(11, 0, 11)) {
128         o_ptr->curse_flags = 0L;
129         if (o_ptr->ident & 0x40) {
130             o_ptr->curse_flags |= TRC_CURSED;
131             if (o_ptr->art_flags[2] & 0x40000000L)
132                 o_ptr->curse_flags |= TRC_HEAVY_CURSE;
133             if (o_ptr->art_flags[2] & 0x80000000L)
134                 o_ptr->curse_flags |= TRC_PERMA_CURSE;
135             if (object_is_fixed_artifact(o_ptr)) {
136                 artifact_type *a_ptr = &a_info[o_ptr->name1];
137                 if (a_ptr->gen_flags & (TRG_HEAVY_CURSE))
138                     o_ptr->curse_flags |= TRC_HEAVY_CURSE;
139                 if (a_ptr->gen_flags & (TRG_PERMA_CURSE))
140                     o_ptr->curse_flags |= TRC_PERMA_CURSE;
141             } else if (object_is_ego(o_ptr)) {
142                 ego_item_type *e_ptr = &e_info[o_ptr->name2];
143                 if (e_ptr->gen_flags & (TRG_HEAVY_CURSE))
144                     o_ptr->curse_flags |= TRC_HEAVY_CURSE;
145                 if (e_ptr->gen_flags & (TRG_PERMA_CURSE))
146                     o_ptr->curse_flags |= TRC_PERMA_CURSE;
147             }
148         }
149         o_ptr->art_flags[2] &= (0x1FFFFFFFL);
150     } else {
151         rd_u32b(&o_ptr->curse_flags);
152     }
153
154     rd_s16b(&o_ptr->held_m_idx);
155     rd_byte(&o_ptr->xtra1);
156     rd_byte(&o_ptr->xtra2);
157
158     if (z_older_than(11, 0, 10)) {
159         if (o_ptr->xtra1 == EGO_XTRA_SUSTAIN) {
160             switch (o_ptr->xtra2 % 6) {
161             case 0:
162                 add_flag(o_ptr->art_flags, TR_SUST_STR);
163                 break;
164             case 1:
165                 add_flag(o_ptr->art_flags, TR_SUST_INT);
166                 break;
167             case 2:
168                 add_flag(o_ptr->art_flags, TR_SUST_WIS);
169                 break;
170             case 3:
171                 add_flag(o_ptr->art_flags, TR_SUST_DEX);
172                 break;
173             case 4:
174                 add_flag(o_ptr->art_flags, TR_SUST_CON);
175                 break;
176             case 5:
177                 add_flag(o_ptr->art_flags, TR_SUST_CHR);
178                 break;
179             }
180             o_ptr->xtra2 = 0;
181         } else if (o_ptr->xtra1 == EGO_XTRA_POWER) {
182             switch (o_ptr->xtra2 % 11) {
183             case 0:
184                 add_flag(o_ptr->art_flags, TR_RES_BLIND);
185                 break;
186             case 1:
187                 add_flag(o_ptr->art_flags, TR_RES_CONF);
188                 break;
189             case 2:
190                 add_flag(o_ptr->art_flags, TR_RES_SOUND);
191                 break;
192             case 3:
193                 add_flag(o_ptr->art_flags, TR_RES_SHARDS);
194                 break;
195             case 4:
196                 add_flag(o_ptr->art_flags, TR_RES_NETHER);
197                 break;
198             case 5:
199                 add_flag(o_ptr->art_flags, TR_RES_NEXUS);
200                 break;
201             case 6:
202                 add_flag(o_ptr->art_flags, TR_RES_CHAOS);
203                 break;
204             case 7:
205                 add_flag(o_ptr->art_flags, TR_RES_DISEN);
206                 break;
207             case 8:
208                 add_flag(o_ptr->art_flags, TR_RES_POIS);
209                 break;
210             case 9:
211                 add_flag(o_ptr->art_flags, TR_RES_DARK);
212                 break;
213             case 10:
214                 add_flag(o_ptr->art_flags, TR_RES_LITE);
215                 break;
216             }
217             o_ptr->xtra2 = 0;
218         } else if (o_ptr->xtra1 == EGO_XTRA_ABILITY) {
219             switch (o_ptr->xtra2 % 8) {
220             case 0:
221                 add_flag(o_ptr->art_flags, TR_LEVITATION);
222                 break;
223             case 1:
224                 add_flag(o_ptr->art_flags, TR_LITE_1);
225                 break;
226             case 2:
227                 add_flag(o_ptr->art_flags, TR_SEE_INVIS);
228                 break;
229             case 3:
230                 add_flag(o_ptr->art_flags, TR_WARNING);
231                 break;
232             case 4:
233                 add_flag(o_ptr->art_flags, TR_SLOW_DIGEST);
234                 break;
235             case 5:
236                 add_flag(o_ptr->art_flags, TR_REGEN);
237                 break;
238             case 6:
239                 add_flag(o_ptr->art_flags, TR_FREE_ACT);
240                 break;
241             case 7:
242                 add_flag(o_ptr->art_flags, TR_HOLD_EXP);
243                 break;
244             }
245             o_ptr->xtra2 = 0;
246         }
247         o_ptr->xtra1 = 0;
248     }
249
250     if (z_older_than(10, 2, 3)) {
251         o_ptr->xtra3 = 0;
252         o_ptr->xtra4 = 0;
253         o_ptr->xtra5 = 0;
254         if ((o_ptr->tval == TV_CHEST) || (o_ptr->tval == TV_CAPTURE)) {
255             o_ptr->xtra3 = o_ptr->xtra1;
256             o_ptr->xtra1 = 0;
257         }
258         if (o_ptr->tval == TV_CAPTURE) {
259             if (r_info[o_ptr->pval].flags1 & RF1_FORCE_MAXHP)
260                 o_ptr->xtra5 = maxroll(r_info[o_ptr->pval].hdice, r_info[o_ptr->pval].hside);
261             else
262                 o_ptr->xtra5 = damroll(r_info[o_ptr->pval].hdice, r_info[o_ptr->pval].hside);
263             if (ironman_nightmare) {
264                 o_ptr->xtra5 = (s16b)MIN(30000, o_ptr->xtra5 * 2L);
265             }
266             o_ptr->xtra4 = o_ptr->xtra5;
267         }
268     } else {
269         rd_byte(&o_ptr->xtra3);
270         if (h_older_than(1, 3, 0, 1)) {
271             if (object_is_smith(player_ptr, o_ptr) && o_ptr->xtra3 >= 1 + 96)
272                 o_ptr->xtra3 += -96 + MIN_SPECIAL_ESSENCE;
273         }
274
275         rd_s16b(&o_ptr->xtra4);
276         rd_s16b(&o_ptr->xtra5);
277     }
278
279     if (z_older_than(11, 0, 5)
280         && (((o_ptr->tval == TV_LITE) && ((o_ptr->sval == SV_LITE_TORCH) || (o_ptr->sval == SV_LITE_LANTERN))) || (o_ptr->tval == TV_FLASK))) {
281         o_ptr->xtra4 = o_ptr->pval;
282         o_ptr->pval = 0;
283     }
284
285     rd_byte(&o_ptr->feeling);
286
287     char buf[128];
288     rd_string(buf, sizeof(buf));
289     if (buf[0])
290         o_ptr->inscription = quark_add(buf);
291
292     rd_string(buf, sizeof(buf));
293
294     /* todo 元々このif文には末尾に";"が付いていた、バグかもしれない */
295     if (buf[0])
296         o_ptr->art_name = quark_add(buf);
297     {
298         s32b tmp32s;
299
300         rd_s32b(&tmp32s);
301         strip_bytes(tmp32s);
302     }
303
304     if ((o_ptr->k_idx >= 445) && (o_ptr->k_idx <= 479))
305         return;
306
307     if (z_older_than(10, 4, 10) && (o_ptr->name2 == EGO_YOIYAMI))
308         o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
309
310     if (z_older_than(10, 4, 9)) {
311         if (have_flag(o_ptr->art_flags, TR_MAGIC_MASTERY)) {
312             remove_flag(o_ptr->art_flags, TR_MAGIC_MASTERY);
313             add_flag(o_ptr->art_flags, TR_DEC_MANA);
314         }
315     }
316
317     if (object_is_fixed_artifact(o_ptr)) {
318         artifact_type *a_ptr;
319         a_ptr = &a_info[o_ptr->name1];
320         if (!a_ptr->name)
321             o_ptr->name1 = 0;
322     }
323
324     if (object_is_ego(o_ptr)) {
325         ego_item_type *e_ptr;
326         e_ptr = &e_info[o_ptr->name2];
327         if (!e_ptr->name)
328             o_ptr->name2 = 0;
329     }
330 }
331
332 /*!
333  * @brief モンスターを読み込む / Read a monster
334  * @param player_ptr プレーヤーへの参照ポインタ
335  * @param m_ptr モンスター保存先ポインタ
336  * @return なし
337  */
338 void rd_monster_old(player_type *player_ptr, monster_type *m_ptr)
339 {
340     rd_s16b(&m_ptr->r_idx);
341
342     if (z_older_than(11, 0, 12))
343         m_ptr->ap_r_idx = m_ptr->r_idx;
344     else
345         rd_s16b(&m_ptr->ap_r_idx);
346
347     if (z_older_than(11, 0, 14)) {
348         monster_race *r_ptr = &r_info[m_ptr->r_idx];
349
350         m_ptr->sub_align = SUB_ALIGN_NEUTRAL;
351         if (r_ptr->flags3 & RF3_EVIL)
352             m_ptr->sub_align |= SUB_ALIGN_EVIL;
353         if (r_ptr->flags3 & RF3_GOOD)
354             m_ptr->sub_align |= SUB_ALIGN_GOOD;
355     } else
356         rd_byte(&m_ptr->sub_align);
357
358     byte tmp8u;
359     rd_byte(&tmp8u);
360     m_ptr->fy = (POSITION)tmp8u;
361     rd_byte(&tmp8u);
362     m_ptr->fx = (POSITION)tmp8u;
363     m_ptr->current_floor_ptr = player_ptr->current_floor_ptr;
364
365     s16b tmp16s;
366     rd_s16b(&tmp16s);
367     m_ptr->hp = tmp16s;
368     rd_s16b(&tmp16s);
369     m_ptr->maxhp = tmp16s;
370
371     if (z_older_than(11, 0, 5)) {
372         m_ptr->max_maxhp = m_ptr->maxhp;
373     } else {
374         rd_s16b(&tmp16s);
375         m_ptr->max_maxhp = (HIT_POINT)tmp16s;
376     }
377     if (h_older_than(2, 1, 2, 1)) {
378         m_ptr->dealt_damage = 0;
379     } else {
380         rd_s32b(&m_ptr->dealt_damage);
381     }
382
383     rd_s16b(&m_ptr->mtimed[MTIMED_CSLEEP]);
384     rd_byte(&tmp8u);
385     m_ptr->mspeed = tmp8u;
386
387     if (z_older_than(10, 4, 2)) {
388         rd_byte(&tmp8u);
389         m_ptr->energy_need = (s16b)tmp8u;
390     } else
391         rd_s16b(&m_ptr->energy_need);
392
393     if (z_older_than(11, 0, 13))
394         m_ptr->energy_need = 100 - m_ptr->energy_need;
395
396     if (z_older_than(10, 0, 7)) {
397         m_ptr->mtimed[MTIMED_FAST] = 0;
398         m_ptr->mtimed[MTIMED_SLOW] = 0;
399     } else {
400         rd_byte(&tmp8u);
401         m_ptr->mtimed[MTIMED_FAST] = (s16b)tmp8u;
402         rd_byte(&tmp8u);
403         m_ptr->mtimed[MTIMED_SLOW] = (s16b)tmp8u;
404     }
405
406     rd_byte(&tmp8u);
407     m_ptr->mtimed[MTIMED_STUNNED] = (s16b)tmp8u;
408     rd_byte(&tmp8u);
409     m_ptr->mtimed[MTIMED_CONFUSED] = (s16b)tmp8u;
410     rd_byte(&tmp8u);
411     m_ptr->mtimed[MTIMED_MONFEAR] = (s16b)tmp8u;
412
413     if (z_older_than(10, 0, 10)) {
414         reset_target(m_ptr);
415     } else if (z_older_than(10, 0, 11)) {
416         rd_s16b(&tmp16s);
417         reset_target(m_ptr);
418     } else {
419         rd_s16b(&tmp16s);
420         m_ptr->target_y = (POSITION)tmp16s;
421         rd_s16b(&tmp16s);
422         m_ptr->target_x = (POSITION)tmp16s;
423     }
424
425     rd_byte(&tmp8u);
426     m_ptr->mtimed[MTIMED_INVULNER] = (s16b)tmp8u;
427
428     if (!(current_world_ptr->z_major == 2 && current_world_ptr->z_minor == 0 && current_world_ptr->z_patch == 6))
429         rd_u32b(&m_ptr->smart);
430     else
431         m_ptr->smart = 0;
432
433     u32b tmp32u;
434     if (z_older_than(10, 4, 5)) {
435         m_ptr->exp = 0;
436     } else {
437         rd_u32b(&tmp32u);
438         m_ptr->exp = tmp32u;
439     }
440
441     if (z_older_than(10, 2, 2)) {
442         if (m_ptr->r_idx < 0) {
443             m_ptr->r_idx = (0 - m_ptr->r_idx);
444             m_ptr->mflag2 |= MFLAG2_KAGE;
445         }
446     } else {
447         rd_byte(&m_ptr->mflag2);
448     }
449
450     if (z_older_than(11, 0, 12)) {
451         if (m_ptr->mflag2 & MFLAG2_KAGE)
452             m_ptr->ap_r_idx = MON_KAGE;
453     }
454
455     if (z_older_than(10, 1, 3)) {
456         m_ptr->nickname = 0;
457     } else {
458         char buf[128];
459         rd_string(buf, sizeof(buf));
460         if (buf[0])
461             m_ptr->nickname = quark_add(buf);
462     }
463
464     rd_byte(&tmp8u);
465 }
466
467 static void move_RF3_to_RFR(monster_race *r_ptr, const BIT_FLAGS rf3, const BIT_FLAGS rfr)
468 {
469     if (r_ptr->r_flags3 & rf3) {
470         r_ptr->r_flags3 &= ~rf3;
471         r_ptr->r_flagsr |= rfr;
472     }
473 }
474
475 static void move_RF4_BR_to_RFR(monster_race *r_ptr, const BIT_FLAGS rf4_br, const BIT_FLAGS rfr)
476 {
477     if (r_ptr->r_flags4 & rf4_br)
478         r_ptr->r_flagsr |= rfr;
479 }
480
481 /*!
482  * @brief モンスターの思い出を読み込む
483  * @param r_ptr モンスター種族情報への参照ポインタ
484  * @param r_idx モンスター種族ID
485  * @details 本来はr_idxからr_ptrを決定可能だが、互換性を優先するため元コードのままとする
486  */
487 void set_old_lore(monster_race *r_ptr, const MONRACE_IDX r_idx)
488 {
489     r_ptr->r_flagsr = 0L;
490     move_RF3_to_RFR(r_ptr, RF3_IM_ACID, RFR_IM_ACID);
491     move_RF3_to_RFR(r_ptr, RF3_IM_ELEC, RFR_IM_ELEC);
492     move_RF3_to_RFR(r_ptr, RF3_IM_FIRE, RFR_IM_FIRE);
493     move_RF3_to_RFR(r_ptr, RF3_IM_COLD, RFR_IM_COLD);
494     move_RF3_to_RFR(r_ptr, RF3_IM_POIS, RFR_IM_POIS);
495     move_RF3_to_RFR(r_ptr, RF3_RES_TELE, RFR_RES_TELE);
496     move_RF3_to_RFR(r_ptr, RF3_RES_NETH, RFR_RES_NETH);
497     move_RF3_to_RFR(r_ptr, RF3_RES_WATE, RFR_RES_WATE);
498     move_RF3_to_RFR(r_ptr, RF3_RES_PLAS, RFR_RES_PLAS);
499     move_RF3_to_RFR(r_ptr, RF3_RES_NEXU, RFR_RES_NEXU);
500     move_RF3_to_RFR(r_ptr, RF3_RES_DISE, RFR_RES_DISE);
501     move_RF3_to_RFR(r_ptr, RF3_RES_ALL, RFR_RES_ALL);
502
503     move_RF4_BR_to_RFR(r_ptr, RF4_BR_LITE, RFR_RES_LITE);
504     move_RF4_BR_to_RFR(r_ptr, RF4_BR_DARK, RFR_RES_DARK);
505     move_RF4_BR_to_RFR(r_ptr, RF4_BR_SOUN, RFR_RES_SOUN);
506     move_RF4_BR_to_RFR(r_ptr, RF4_BR_CHAO, RFR_RES_CHAO);
507     move_RF4_BR_to_RFR(r_ptr, RF4_BR_TIME, RFR_RES_TIME);
508     move_RF4_BR_to_RFR(r_ptr, RF4_BR_INER, RFR_RES_INER);
509     move_RF4_BR_to_RFR(r_ptr, RF4_BR_GRAV, RFR_RES_GRAV);
510     move_RF4_BR_to_RFR(r_ptr, RF4_BR_SHAR, RFR_RES_SHAR);
511     move_RF4_BR_to_RFR(r_ptr, RF4_BR_WALL, RFR_RES_WALL);
512
513     if (r_ptr->r_flags4 & RF4_BR_CONF)
514         r_ptr->r_flags3 |= RF3_NO_CONF;
515
516     if (r_idx == MON_STORMBRINGER)
517         r_ptr->r_flagsr |= RFR_RES_CHAO;
518
519     if (r_ptr->r_flags3 & RF3_ORC)
520         r_ptr->r_flagsr |= RFR_RES_DARK;
521 }
522
523 /*!
524  * @brief ダンジョン情報を読み込む / Read the dungeon (old method)
525  * @param player_ptr プレーヤーへの参照ポインタ
526  * @return なし
527  * @details
528  * The monsters/objects must be loaded in the same order
529  * that they were stored, since the actual indexes matter.
530  */
531 errr rd_dungeon_old(player_type *player_ptr)
532 {
533     s16b tmp16s;
534     rd_s16b(&tmp16s);
535     floor_type *floor_ptr = player_ptr->current_floor_ptr;
536     floor_ptr->dun_level = (DEPTH)tmp16s;
537     if (z_older_than(10, 3, 8))
538         player_ptr->dungeon_idx = DUNGEON_ANGBAND;
539     else {
540         byte tmp8u;
541         rd_byte(&tmp8u);
542         player_ptr->dungeon_idx = (IDX)tmp8u;
543     }
544
545     floor_ptr->base_level = floor_ptr->dun_level;
546     rd_s16b(&tmp16s);
547     floor_ptr->base_level = (DEPTH)tmp16s;
548
549     rd_s16b(&tmp16s);
550     floor_ptr->num_repro = (MONSTER_NUMBER)tmp16s;
551     rd_s16b(&tmp16s);
552     player_ptr->y = (POSITION)tmp16s;
553     rd_s16b(&tmp16s);
554     player_ptr->x = (POSITION)tmp16s;
555     if (z_older_than(10, 3, 13) && !floor_ptr->dun_level && !floor_ptr->inside_arena) {
556         player_ptr->y = 33;
557         player_ptr->x = 131;
558     }
559     rd_s16b(&tmp16s);
560     floor_ptr->height = (POSITION)tmp16s;
561     rd_s16b(&tmp16s);
562     floor_ptr->width = (POSITION)tmp16s;
563     rd_s16b(&tmp16s); /* max_panel_rows */
564     rd_s16b(&tmp16s); /* max_panel_cols */
565
566     int ymax = floor_ptr->height;
567     int xmax = floor_ptr->width;
568
569     for (int x = 0, y = 0; y < ymax;) {
570         u16b info;
571         byte count;
572         rd_byte(&count);
573         if (z_older_than(10, 3, 6)) {
574             byte tmp8u;
575             rd_byte(&tmp8u);
576             info = (u16b)tmp8u;
577         } else {
578             rd_u16b(&info);
579             info &= ~(CAVE_LITE | CAVE_VIEW | CAVE_MNLT | CAVE_MNDK);
580         }
581
582         for (int i = count; i > 0; i--) {
583             grid_type *g_ptr;
584             g_ptr = &floor_ptr->grid_array[y][x];
585             g_ptr->info = info;
586             if (++x >= xmax) {
587                 x = 0;
588                 if (++y >= ymax)
589                     break;
590             }
591         }
592     }
593
594     for (int x = 0, y = 0; y < ymax;) {
595         byte count;
596         rd_byte(&count);
597         byte tmp8u;
598         rd_byte(&tmp8u);
599         for (int i = count; i > 0; i--) {
600             grid_type *g_ptr;
601             g_ptr = &floor_ptr->grid_array[y][x];
602             g_ptr->feat = (s16b)tmp8u;
603             if (++x >= xmax) {
604                 x = 0;
605                 if (++y >= ymax)
606                     break;
607             }
608         }
609     }
610
611     for (int x = 0, y = 0; y < ymax;) {
612         byte count;
613         rd_byte(&count);
614         byte tmp8u;
615         rd_byte(&tmp8u);
616         for (int i = count; i > 0; i--) {
617             grid_type *g_ptr;
618             g_ptr = &floor_ptr->grid_array[y][x];
619             g_ptr->mimic = (s16b)tmp8u;
620             if (++x >= xmax) {
621                 x = 0;
622                 if (++y >= ymax)
623                     break;
624             }
625         }
626     }
627
628     for (int x = 0, y = 0; y < ymax;) {
629         byte count;
630         rd_byte(&count);
631         rd_s16b(&tmp16s);
632         for (int i = count; i > 0; i--) {
633             grid_type *g_ptr;
634             g_ptr = &floor_ptr->grid_array[y][x];
635             g_ptr->special = tmp16s;
636             if (++x >= xmax) {
637                 x = 0;
638                 if (++y >= ymax)
639                     break;
640             }
641         }
642     }
643
644     if (z_older_than(11, 0, 99)) {
645         for (int y = 0; y < ymax; y++) {
646             for (int x = 0; x < xmax; x++) {
647                 floor_ptr->grid_array[y][x].info &= ~(CAVE_MASK);
648             }
649         }
650     }
651
652     if (h_older_than(1, 1, 1, 0)) {
653         for (int y = 0; y < ymax; y++) {
654             for (int x = 0; x < xmax; x++) {
655                 grid_type *g_ptr;
656                 g_ptr = &floor_ptr->grid_array[y][x];
657
658                 /* Very old */
659                 if (g_ptr->feat == OLD_FEAT_INVIS) {
660                     g_ptr->feat = feat_floor;
661                     g_ptr->info |= CAVE_TRAP;
662                 }
663
664                 /* Older than 1.1.1 */
665                 if (g_ptr->feat == OLD_FEAT_MIRROR) {
666                     g_ptr->feat = feat_floor;
667                     g_ptr->info |= CAVE_OBJECT;
668                 }
669             }
670         }
671     }
672
673     if (h_older_than(1, 3, 1, 0)) {
674         for (int y = 0; y < ymax; y++) {
675             for (int x = 0; x < xmax; x++) {
676                 grid_type *g_ptr;
677                 g_ptr = &floor_ptr->grid_array[y][x];
678
679                 /* Old CAVE_IN_MIRROR flag */
680                 if (g_ptr->info & CAVE_OBJECT) {
681                     g_ptr->mimic = feat_mirror;
682                 } else if ((g_ptr->feat == OLD_FEAT_MINOR_GLYPH) || (g_ptr->feat == OLD_FEAT_GLYPH)) {
683                     g_ptr->info |= CAVE_OBJECT;
684                     g_ptr->mimic = g_ptr->feat;
685                     g_ptr->feat = feat_floor;
686                 } else if (g_ptr->info & CAVE_TRAP) {
687                     g_ptr->info &= ~CAVE_TRAP;
688                     g_ptr->mimic = g_ptr->feat;
689                     g_ptr->feat = choose_random_trap(player_ptr);
690                 } else if (g_ptr->feat == OLD_FEAT_INVIS) {
691                     g_ptr->mimic = feat_floor;
692                     g_ptr->feat = feat_trap_open;
693                 }
694             }
695         }
696     }
697
698     /* Quest 18 was removed */
699     if (!vanilla_town) {
700         for (int y = 0; y < ymax; y++) {
701             for (int x = 0; x < xmax; x++) {
702                 grid_type *g_ptr;
703                 g_ptr = &floor_ptr->grid_array[y][x];
704
705                 if ((g_ptr->special == OLD_QUEST_WATER_CAVE) && !floor_ptr->dun_level) {
706                     if (g_ptr->feat == OLD_FEAT_QUEST_ENTER) {
707                         g_ptr->feat = feat_tree;
708                         g_ptr->special = 0;
709                     } else if (g_ptr->feat == OLD_FEAT_BLDG_1) {
710                         g_ptr->special = lite_town ? QUEST_OLD_CASTLE : QUEST_ROYAL_CRYPT;
711                     }
712                 } else if ((g_ptr->feat == OLD_FEAT_QUEST_EXIT) && (floor_ptr->inside_quest == OLD_QUEST_WATER_CAVE)) {
713                     g_ptr->feat = feat_up_stair;
714                     g_ptr->special = 0;
715                 }
716             }
717         }
718     }
719
720     u16b limit;
721     rd_u16b(&limit);
722     if (limit > current_world_ptr->max_o_idx) {
723         load_note(format(_("アイテムの配列が大きすぎる(%d)!", "Too many (%d) object entries!"), limit));
724         return (151);
725     }
726
727     for (int i = 1; i < limit; i++) {
728         OBJECT_IDX o_idx = o_pop(floor_ptr);
729         if (i != o_idx) {
730             load_note(format(_("アイテム配置エラー (%d <> %d)", "Object allocation error (%d <> %d)"), i, o_idx));
731             return (152);
732         }
733
734         object_type *o_ptr;
735         o_ptr = &floor_ptr->o_list[o_idx];
736         rd_item(player_ptr, o_ptr);
737         if (object_is_held_monster(o_ptr)) {
738             monster_type *m_ptr;
739             m_ptr = &floor_ptr->m_list[o_ptr->held_m_idx];
740             o_ptr->next_o_idx = m_ptr->hold_o_idx;
741             m_ptr->hold_o_idx = o_idx;
742             continue;
743         }
744
745         grid_type *g_ptr;
746         g_ptr = &floor_ptr->grid_array[o_ptr->iy][o_ptr->ix];
747         o_ptr->next_o_idx = g_ptr->o_idx;
748         g_ptr->o_idx = o_idx;
749     }
750
751     rd_u16b(&limit);
752     if (limit > current_world_ptr->max_m_idx) {
753         load_note(format(_("モンスターの配列が大きすぎる(%d)!", "Too many (%d) monster entries!"), limit));
754         return (161);
755     }
756
757     for (int i = 1; i < limit; i++) {
758         MONSTER_IDX m_idx;
759         monster_type *m_ptr;
760         m_idx = m_pop(floor_ptr);
761         if (i != m_idx) {
762             load_note(format(_("モンスター配置エラー (%d <> %d)", "Monster allocation error (%d <> %d)"), i, m_idx));
763             return (162);
764         }
765
766         m_ptr = &floor_ptr->m_list[m_idx];
767         rd_monster(player_ptr, m_ptr);
768         grid_type *g_ptr;
769         g_ptr = &floor_ptr->grid_array[m_ptr->fy][m_ptr->fx];
770         g_ptr->m_idx = m_idx;
771         real_r_ptr(m_ptr)->cur_num++;
772     }
773
774     if (z_older_than(10, 3, 13) && !floor_ptr->dun_level && !floor_ptr->inside_arena)
775         current_world_ptr->character_dungeon = FALSE;
776     else
777         current_world_ptr->character_dungeon = TRUE;
778
779     return 0;
780 }