OSDN Git Service

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