OSDN Git Service

既に忘れた何かの理由によって、長い事tabをスペース8文字にする設定で
[hengband/hengband.git] / src / load.c
index 294bccd..99a42b6 100644 (file)
@@ -295,10 +295,18 @@ static void rd_item(object_type *o_ptr)
 
        rd_byte(&o_ptr->marked);
 
-       /* Old flags */
-       rd_u32b(&o_ptr->art_flags1);
-       rd_u32b(&o_ptr->art_flags2);
-       rd_u32b(&o_ptr->art_flags3);
+       /* Object flags */
+       rd_u32b(&o_ptr->art_flags[0]);
+       rd_u32b(&o_ptr->art_flags[1]);
+       rd_u32b(&o_ptr->art_flags[2]);
+       if (h_older_than(1, 3, 0, 0)) o_ptr->art_flags[3] = 0L;
+       else rd_u32b(&o_ptr->art_flags[3]);
+
+       if (h_older_than(1, 3, 0, 0))
+       {
+               if (o_ptr->name2 == EGO_TELEPATHY)
+                       add_flag(o_ptr->art_flags, TR_TELEPATHY);
+       }
 
        if (z_older_than(11, 0, 11))
        {
@@ -306,8 +314,8 @@ static void rd_item(object_type *o_ptr)
                if (o_ptr->ident & 0x40)
                {
                        o_ptr->curse_flags |= TRC_CURSED;
-                       if (o_ptr->art_flags3 & 0x40000000L) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
-                       if (o_ptr->art_flags3 & 0x80000000L) o_ptr->curse_flags |= TRC_PERMA_CURSE;
+                       if (o_ptr->art_flags[2] & 0x40000000L) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
+                       if (o_ptr->art_flags[2] & 0x80000000L) o_ptr->curse_flags |= TRC_PERMA_CURSE;
                        if (o_ptr->name1)
                        {
                                artifact_type *a_ptr = &a_info[o_ptr->name1];
@@ -321,7 +329,7 @@ static void rd_item(object_type *o_ptr)
                                if (e_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
                        }
                }
-               o_ptr->art_flags3 &= (0x1FFFFFFFL);
+               o_ptr->art_flags[2] &= (0x1FFFFFFFL);
        }
        else
        {
@@ -341,12 +349,12 @@ static void rd_item(object_type *o_ptr)
                {
                        switch (o_ptr->xtra2 % 6)
                        {
-                       case 0: o_ptr->art_flags2 |= (TR2_SUST_STR); break;
-                       case 1: o_ptr->art_flags2 |= (TR2_SUST_INT); break;
-                       case 2: o_ptr->art_flags2 |= (TR2_SUST_WIS); break;
-                       case 3: o_ptr->art_flags2 |= (TR2_SUST_DEX); break;
-                       case 4: o_ptr->art_flags2 |= (TR2_SUST_CON); break;
-                       case 5: o_ptr->art_flags2 |= (TR2_SUST_CHR); break;
+                       case 0: add_flag(o_ptr->art_flags, TR_SUST_STR); break;
+                       case 1: add_flag(o_ptr->art_flags, TR_SUST_INT); break;
+                       case 2: add_flag(o_ptr->art_flags, TR_SUST_WIS); break;
+                       case 3: add_flag(o_ptr->art_flags, TR_SUST_DEX); break;
+                       case 4: add_flag(o_ptr->art_flags, TR_SUST_CON); break;
+                       case 5: add_flag(o_ptr->art_flags, TR_SUST_CHR); break;
                        }
                        o_ptr->xtra2 = 0;
                }
@@ -354,17 +362,17 @@ static void rd_item(object_type *o_ptr)
                {
                        switch (o_ptr->xtra2 % 11)
                        {
-                       case  0: o_ptr->art_flags2 |= (TR2_RES_BLIND);  break;
-                       case  1: o_ptr->art_flags2 |= (TR2_RES_CONF);   break;
-                       case  2: o_ptr->art_flags2 |= (TR2_RES_SOUND);  break;
-                       case  3: o_ptr->art_flags2 |= (TR2_RES_SHARDS); break;
-                       case  4: o_ptr->art_flags2 |= (TR2_RES_NETHER); break;
-                       case  5: o_ptr->art_flags2 |= (TR2_RES_NEXUS);  break;
-                       case  6: o_ptr->art_flags2 |= (TR2_RES_CHAOS);  break;
-                       case  7: o_ptr->art_flags2 |= (TR2_RES_DISEN);  break;
-                       case  8: o_ptr->art_flags2 |= (TR2_RES_POIS);   break;
-                       case  9: o_ptr->art_flags2 |= (TR2_RES_DARK);   break;
-                       case 10: o_ptr->art_flags2 |= (TR2_RES_LITE);   break;
+                       case  0: add_flag(o_ptr->art_flags, TR_RES_BLIND);  break;
+                       case  1: add_flag(o_ptr->art_flags, TR_RES_CONF);   break;
+                       case  2: add_flag(o_ptr->art_flags, TR_RES_SOUND);  break;
+                       case  3: add_flag(o_ptr->art_flags, TR_RES_SHARDS); break;
+                       case  4: add_flag(o_ptr->art_flags, TR_RES_NETHER); break;
+                       case  5: add_flag(o_ptr->art_flags, TR_RES_NEXUS);  break;
+                       case  6: add_flag(o_ptr->art_flags, TR_RES_CHAOS);  break;
+                       case  7: add_flag(o_ptr->art_flags, TR_RES_DISEN);  break;
+                       case  8: add_flag(o_ptr->art_flags, TR_RES_POIS);   break;
+                       case  9: add_flag(o_ptr->art_flags, TR_RES_DARK);   break;
+                       case 10: add_flag(o_ptr->art_flags, TR_RES_LITE);   break;
                        }
                        o_ptr->xtra2 = 0;
                }               
@@ -372,14 +380,14 @@ static void rd_item(object_type *o_ptr)
                {
                        switch (o_ptr->xtra2 % 8)
                        {
-                       case 0: o_ptr->art_flags3 |= (TR3_FEATHER);     break;
-                       case 1: o_ptr->art_flags3 |= (TR3_LITE);        break;
-                       case 2: o_ptr->art_flags3 |= (TR3_SEE_INVIS);   break;
-                       case 3: o_ptr->art_flags3 |= (TR3_WARNING);     break;
-                       case 4: o_ptr->art_flags3 |= (TR3_SLOW_DIGEST); break;
-                       case 5: o_ptr->art_flags3 |= (TR3_REGEN);       break;
-                       case 6: o_ptr->art_flags2 |= (TR2_FREE_ACT);    break;
-                       case 7: o_ptr->art_flags2 |= (TR2_HOLD_LIFE);   break;
+                       case 0: add_flag(o_ptr->art_flags, TR_FEATHER);     break;
+                       case 1: add_flag(o_ptr->art_flags, TR_LITE);        break;
+                       case 2: add_flag(o_ptr->art_flags, TR_SEE_INVIS);   break;
+                       case 3: add_flag(o_ptr->art_flags, TR_WARNING);     break;
+                       case 4: add_flag(o_ptr->art_flags, TR_SLOW_DIGEST); break;
+                       case 5: add_flag(o_ptr->art_flags, TR_REGEN);       break;
+                       case 6: add_flag(o_ptr->art_flags, TR_FREE_ACT);    break;
+                       case 7: add_flag(o_ptr->art_flags, TR_HOLD_LIFE);   break;
                        }
                        o_ptr->xtra2 = 0;
                }
@@ -412,6 +420,12 @@ static void rd_item(object_type *o_ptr)
        else
        {
                rd_byte(&o_ptr->xtra3);
+               if (h_older_than(1, 3, 0, 1))
+               {
+                       if (o_ptr->tval > TV_CAPTURE && o_ptr->xtra3 >= 1+96)
+                               o_ptr->xtra3 += -96 + MIN_SPECIAL_ESSENCE;
+               }
+
                rd_s16b(&o_ptr->xtra4);
                rd_s16b(&o_ptr->xtra5);
        }
@@ -422,15 +436,15 @@ static void rd_item(object_type *o_ptr)
                o_ptr->pval = 0;
        }
 
-        rd_byte(&o_ptr->feeling);
+       rd_byte(&o_ptr->feeling);
 
        /* Inscription */
-       rd_string(buf, 128);
+       rd_string(buf, sizeof(buf));
 
        /* Save the inscription */
        if (buf[0]) o_ptr->inscription = quark_add(buf);
 
-       rd_string(buf, 128);
+       rd_string(buf, sizeof(buf));
        if (buf[0]) o_ptr->art_name = quark_add(buf);
 
        /* The Python object */
@@ -448,10 +462,10 @@ static void rd_item(object_type *o_ptr)
 
        if (z_older_than(10, 4, 9))
        {
-               if (o_ptr->art_flags1 & TR1_MAGIC_MASTERY)
+               if (have_flag(o_ptr->art_flags, TR_MAGIC_MASTERY))
                {
-                       o_ptr->art_flags1 &= ~(TR1_MAGIC_MASTERY);
-                       o_ptr->art_flags3 |= (TR3_DEC_MANA);
+                       remove_flag(o_ptr->art_flags, TR_MAGIC_MASTERY);
+                       add_flag(o_ptr->art_flags, TR_DEC_MANA);
                }
        }
 
@@ -566,7 +580,7 @@ static void rd_monster(monster_type *m_ptr)
                rd_s16b(&m_ptr->target_x);
        }
 
-        rd_byte(&m_ptr->invulner);
+       rd_byte(&m_ptr->invulner);
 
        if (!(z_major == 2 && z_minor == 0 && z_patch == 6))
                rd_u32b(&m_ptr->smart);
@@ -603,7 +617,7 @@ static void rd_monster(monster_type *m_ptr)
        }
        else
        {
-               rd_string(buf, 128);
+               rd_string(buf, sizeof(buf));
                if (buf[0]) m_ptr->nickname = quark_add(buf);
        }
 
@@ -951,6 +965,7 @@ static void rd_options(void)
        cheat_xtra = (c & 0x0800) ? TRUE : FALSE;
        cheat_know = (c & 0x1000) ? TRUE : FALSE;
        cheat_live = (c & 0x2000) ? TRUE : FALSE;
+       cheat_save = (c & 0x4000) ? TRUE : FALSE;
 
        rd_byte((byte *)&autosave_l);
        rd_byte((byte *)&autosave_t);
@@ -1071,7 +1086,7 @@ static void rd_ghost(void)
        char buf[64];
 
        /* Strip name */
-       rd_string(buf, 64);
+       rd_string(buf, sizeof(buf));
 
        /* Strip old data */
        strip_bytes(60);
@@ -1114,7 +1129,7 @@ static void load_quick_start(void)
 
        for (i = 0; i < 8; i++) rd_s16b(&previous_char.vir_types[i]);
 
-       for (i = 0; i < 4; i++) rd_string(previous_char.history[i], 60);
+       for (i = 0; i < 4; i++) rd_string(previous_char.history[i], sizeof(previous_char.history[i]));
 
        rd_byte(&previous_char.quests);
 
@@ -1132,15 +1147,15 @@ static void rd_extra(void)
        byte tmp8u;
        s16b tmp16s;
 
-       rd_string(player_name, 32);
+       rd_string(player_name, sizeof(player_name));
 
-       rd_string(p_ptr->died_from, 80);
+       rd_string(p_ptr->died_from, sizeof(p_ptr->died_from));
 
        load_quick_start();
 
        for (i = 0; i < 4; i++)
        {
-               rd_string(p_ptr->history[i], 60);
+               rd_string(p_ptr->history[i], sizeof(p_ptr->history[i]));
        }
 
        /* Class/Race/Seikaku/Gender/Spells */
@@ -1208,6 +1223,16 @@ static void rd_extra(void)
        {
                for (i = 0; i < 108; i++) rd_s32b(&p_ptr->magic_num1[i]);
                for (i = 0; i < 108; i++) rd_byte(&p_ptr->magic_num2[i]);
+               if (h_older_than(1, 3, 0, 1))
+               {
+                       if (p_ptr->pclass == CLASS_SMITH)
+                       {
+                               p_ptr->magic_num1[TR_ES_ATTACK] = p_ptr->magic_num1[96];
+                               p_ptr->magic_num1[96] = 0;
+                               p_ptr->magic_num1[TR_ES_AC] = p_ptr->magic_num1[97];
+                               p_ptr->magic_num1[97] = 0;
+                       }
+               }
        }
        if ((p_ptr->pclass == CLASS_BARD) && p_ptr->magic_num1[0]) p_ptr->action = ACTION_SING;
 
@@ -1379,16 +1404,16 @@ note(format("
        }
        else
        {
-                byte max = (byte)max_d_idx;
+               byte max = (byte)max_d_idx;
 
-                rd_byte(&max);
+               rd_byte(&max);
 
-                for(i = 0; i < max; i++)
+               for(i = 0; i < max; i++)
                {
-                        rd_s16b(&max_dlv[i]);
+                       rd_s16b(&max_dlv[i]);
                        if (max_dlv[i] > d_info[i].maxdepth) max_dlv[i] = d_info[i].maxdepth;
                }
-        }
+       }
 
        /* Repair maximum player level XXX XXX XXX */
        if (p_ptr->max_plv < p_ptr->lev) p_ptr->max_plv = p_ptr->lev;
@@ -1814,7 +1839,7 @@ static void rd_messages(void)
        for (i = 0; i < num; i++)
        {
                /* Read the message */
-               rd_string(buf, 128);
+               rd_string(buf, sizeof(buf));
 
                /* Save the message */
                message_add(buf);
@@ -1823,6 +1848,9 @@ static void rd_messages(void)
 
 
 
+/* Old hidden trap flag */
+#define CAVE_TRAP       0x8000
+
 /*
  * Read the dungeon
  *
@@ -1844,7 +1872,7 @@ static errr rd_dungeon(void)
 
        /* Header info */
        rd_s16b(&dun_level);
-        if (z_older_than(10, 3, 8)) dungeon_type = DUNGEON_ANGBAND;
+       if (z_older_than(10, 3, 8)) dungeon_type = DUNGEON_ANGBAND;
        else rd_byte(&dungeon_type);
 
        /* Set the base level for old versions */
@@ -1877,12 +1905,22 @@ static errr rd_dungeon(void)
        /* Load the dungeon data */
        for (x = y = 0; y < ymax; )
        {
+               u16b info;
+
                /* Grab RLE info */
                rd_byte(&count);
                if (z_older_than(10,3,6))
+               {
                        rd_byte(&tmp8u);
+                       info = (u16b)tmp8u;
+               }
                else
-                       rd_s16b(&tmp16s);
+               {
+                       rd_u16b(&info);
+
+                       /* Decline invalid flags */
+                       info &= ~(CAVE_LITE | CAVE_VIEW | CAVE_MNLT);
+               }
 
                /* Apply the RLE info */
                for (i = count; i > 0; i--)
@@ -1891,9 +1929,7 @@ static errr rd_dungeon(void)
                        c_ptr = &cave[y][x];
 
                        /* Extract "info" */
-                       if (z_older_than(10,3,6))
-                               c_ptr->info = tmp8u;
-                       else c_ptr->info = tmp16s;
+                       c_ptr->info = info;
 
                        /* Advance/Wrap */
                        if (++x >= xmax)
@@ -1938,36 +1974,6 @@ static errr rd_dungeon(void)
                }
        }
 
-        /* Convert cave data */
-        if (z_older_than(11, 0, 99))
-        {
-                for (y = 0; y < ymax; y++) for (x = 0; x < xmax; x++)
-                {
-                       /* Wipe old unused flags */
-                       cave[y][x].info &= ~(CAVE_MASK);
-                }
-        }
-
-        if (h_older_than(1, 1, 1, 0))
-        {
-                for (y = 0; y < ymax; y++) for (x = 0; x < xmax; x++)
-                {
-                        /* Very old */
-                        if (c_ptr->feat == FEAT_INVIS)
-                        {
-                                c_ptr->feat = FEAT_FLOOR;
-                                c_ptr->info |= CAVE_TRAP;
-                        }
-                
-                        /* Older than 1.1.1 */
-                        if (c_ptr->feat == FEAT_MIRROR)
-                        {
-                                c_ptr->feat = FEAT_FLOOR;
-                                c_ptr->info |= CAVE_IN_MIRROR;
-                        }
-                }
-        }
-
        /*** Run length decoding ***/
 
        /* Load the dungeon data */
@@ -2028,6 +2034,85 @@ static errr rd_dungeon(void)
                }
        }
 
+       /* Convert cave data */
+       if (z_older_than(11, 0, 99))
+       {
+               for (y = 0; y < ymax; y++) for (x = 0; x < xmax; x++)
+               {
+                       /* Wipe old unused flags */
+                       cave[y][x].info &= ~(CAVE_MASK);
+               }
+       }
+
+       if (h_older_than(1, 1, 1, 0))
+       {
+               for (y = 0; y < ymax; y++) for (x = 0; x < xmax; x++)
+               {
+                       /* Access the cave */
+                       c_ptr = &cave[y][x];
+
+                       /* Very old */
+                       if (c_ptr->feat == FEAT_INVIS)
+                       {
+                               c_ptr->feat = FEAT_FLOOR;
+                               c_ptr->info |= CAVE_TRAP;
+                       }
+               
+                       /* Older than 1.1.1 */
+                       if (c_ptr->feat == FEAT_MIRROR)
+                       {
+                               c_ptr->feat = FEAT_FLOOR;
+                               c_ptr->info |= CAVE_OBJECT;
+                       }
+               }
+       }
+
+       if (h_older_than(1, 3, 1, 0))
+       {
+               for (y = 0; y < ymax; y++) for (x = 0; x < xmax; x++)
+               {
+                       /* Access the cave */
+                       c_ptr = &cave[y][x];
+
+                       /* Old CAVE_IN_MIRROR flag */
+                       if (c_ptr->info & CAVE_OBJECT)
+                       {
+                               c_ptr->mimic = FEAT_MIRROR;
+                       }
+
+                       /* Runes will be mimics and flags */
+                       else if (c_ptr->feat == FEAT_MINOR_GLYPH ||
+                                c_ptr->feat == FEAT_GLYPH)
+                       {
+                               c_ptr->info |= CAVE_OBJECT;
+                               c_ptr->mimic = c_ptr->feat;
+                               c_ptr->feat = FEAT_FLOOR;
+                       }
+
+                       /* Hidden traps will be trap terrains mimicing floor */
+                       else if (c_ptr->info & CAVE_TRAP)
+                       {
+                               c_ptr->info &= ~CAVE_TRAP;
+                               c_ptr->mimic = c_ptr->feat;
+                               c_ptr->feat = choose_random_trap();
+                       }
+
+                       /* Another hidden trap */
+                       else if (c_ptr->feat == FEAT_INVIS)
+                       {
+                               c_ptr->mimic = FEAT_FLOOR;
+                               c_ptr->feat = FEAT_TRAP_OPEN;
+                       }
+
+                       /* Hidden doors will be closed doors mimicing wall */
+                       else if (c_ptr->feat == FEAT_SECRET)
+                       {
+                               place_closed_door(y, x);
+                               c_ptr->mimic = FEAT_WALL_EXTRA;
+                       }
+               }
+       }
+
        /*** Objects ***/
 
        /* Read the item count */
@@ -2208,13 +2293,13 @@ static errr rd_savefile_new_aux(void)
 
 
        /* Mention the savefile version */
-        note(format(
+       note(format(
 #ifdef JP
-                     "¥Ð¡¼¥¸¥ç¥ó %d.%d.%d ¤Î¥»¡¼¥Ö¡¦¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥ÉÃæ...",
+                    "¥Ð¡¼¥¸¥ç¥ó %d.%d.%d ¤Î¥»¡¼¥Ö¡¦¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥ÉÃæ...",
 #else
-                     "Loading a %d.%d.%d savefile...",
+                    "Loading a %d.%d.%d savefile...",
 #endif
-                     (z_major > 9) ? z_major - 10 : z_major, z_minor, z_patch));
+                    (z_major > 9) ? z_major - 10 : z_major, z_minor, z_patch));
 
 
        /* Strip the version bytes */
@@ -2229,11 +2314,11 @@ static errr rd_savefile_new_aux(void)
        x_check = 0L;
 
        /* Read the version number of the savefile */
-        /* Old savefile will be version 0.0.0.3 */
-        rd_byte(&h_ver_extra);
-        rd_byte(&h_ver_patch);
-        rd_byte(&h_ver_minor);
-        rd_byte(&h_ver_major);
+       /* Old savefile will be version 0.0.0.3 */
+       rd_byte(&h_ver_extra);
+       rd_byte(&h_ver_patch);
+       rd_byte(&h_ver_minor);
+       rd_byte(&h_ver_major);
 
        /* Operating system info */
        rd_u32b(&sf_system);
@@ -2273,18 +2358,6 @@ if (arg_fiddle) note("
        if (arg_fiddle) note("Loaded Option Flags");
 #endif
 
-       /*
-        * Munchkin players are marked
-        *
-        * XXX - should be replaced with a better method,
-        * after the new scorefile-handling is implemented.
-        */
-       if (munchkin_death)
-       {
-               /* Mark savefile */
-               p_ptr->noscore |= 0x0001;
-       }
-
        /* Then the "messages" */
        rd_messages();
 #ifdef JP
@@ -2807,7 +2880,7 @@ note("
        if (!z_older_than(11, 0, 9))
        {
                char buf[SCREEN_BUF_SIZE];
-               rd_string(buf, SCREEN_BUF_SIZE);
+               rd_string(buf, sizeof(buf));
                if (buf[0]) screen_dump = string_make(buf);
        }