-#if 0
/*
* This function determines if the version of the savefile
- * currently being read is older than version "x.y.z".
+ * currently being read is older than version "major.minor.patch.extra".
*/
-static bool older_than(byte x, byte y, byte z)
+static bool h_older_than(byte major, byte minor, byte patch, byte extra)
{
/* Much older, or much more recent */
- if (sf_major < x) return (TRUE);
- if (sf_major > x) return (FALSE);
+ if (h_ver_major < major) return (TRUE);
+ if (h_ver_major > major) return (FALSE);
/* Distinctly older, or distinctly more recent */
- if (sf_minor < y) return (TRUE);
- if (sf_minor > y) return (FALSE);
+ if (h_ver_minor < minor) return (TRUE);
+ if (h_ver_minor > minor) return (FALSE);
+
+ /* Barely older, or barely more recent */
+ if (h_ver_patch < patch) return (TRUE);
+ if (h_ver_patch > patch) return (FALSE);
/* Barely older, or barely more recent */
- if (sf_patch < z) return (TRUE);
- if (sf_patch > z) return (FALSE);
+ if (h_ver_extra < extra) return (TRUE);
+ if (h_ver_extra > extra) return (FALSE);
/* Identical versions */
return (FALSE);
}
-#endif
+
/*
* The above function, adapted for Zangband
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 (z_older_than(11, 0, 11))
{
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];
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
{
{
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;
}
{
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;
}
{
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;
}
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);
}
o_ptr->pval = 0;
}
- /* Feeling - from 2.3.1, "savefile version 1" */
- if (sf_version >= 1)
- {
- rd_byte(&o_ptr->feeling);
- }
+ rd_byte(&o_ptr->feeling);
/* Inscription */
- rd_string(buf, 128);
-
- /* If this savefile is old, maybe we need to translate the feeling */
- if (sf_version < 1)
- {
- byte i;
-
- for (i = 0; i <= FEEL_MAX; i++)
- {
- if (game_inscriptions[i] == NULL)
- {
- continue;
- }
-
- if (streq(buf, game_inscriptions[i]))
- {
- o_ptr->feeling = i;
- buf[0] = 0;
- break;
- }
- }
- }
+ 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 */
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);
}
}
rd_s16b(&m_ptr->target_x);
}
- /* Monster invulnerability introduced from 2.3.2+ */
- if (sf_version < 2)
- m_ptr->invulner = 0;
- else
- 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);
}
else
{
- rd_string(buf, 128);
+ rd_string(buf, sizeof(buf));
if (buf[0]) m_ptr->nickname = quark_add(buf);
}
rd_u16b(&c);
- if (c & 0x0002) wizard = TRUE;
+ if (c & 0x0002) p_ptr->wizard = TRUE;
cheat_peek = (c & 0x0100) ? TRUE : FALSE;
cheat_hear = (c & 0x0200) ? TRUE : FALSE;
char buf[64];
/* Strip name */
- rd_string(buf, 64);
+ rd_string(buf, sizeof(buf));
/* Strip old data */
strip_bytes(60);
/*
* Save quick start data
*/
-void load_quick_start()
+static void load_quick_start(void)
{
byte tmp8u;
int i;
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);
byte tmp8u;
s16b tmp16s;
- rd_string(player_name, 32);
+ rd_string(player_name, sizeof(player_name));
- rd_string(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(history[i], 60);
+ rd_string(p_ptr->history[i], sizeof(p_ptr->history[i]));
}
/* Class/Race/Seikaku/Gender/Spells */
rd_s16b(&p_ptr->lev);
- for (i = 0; i < 64; i++) rd_s16b(&spell_exp[i]);
+ for (i = 0; i < 64; i++) rd_s16b(&p_ptr->spell_exp[i]);
if ((p_ptr->pclass == CLASS_SORCERER) && z_older_than(10, 4, 2))
{
- for (i = 0; i < 64; i++) spell_exp[i] = 1600;
+ for (i = 0; i < 64; i++) p_ptr->spell_exp[i] = 1600;
}
if (z_older_than(10, 3, 6))
- for (i = 0; i < 5; i++) for (j = 0; j < 60; j++) rd_s16b(&weapon_exp[i][j]);
+ for (i = 0; i < 5; i++) for (j = 0; j < 60; j++) rd_s16b(&p_ptr->weapon_exp[i][j]);
else
- for (i = 0; i < 5; i++) for (j = 0; j < 64; j++) rd_s16b(&weapon_exp[i][j]);
- for (i = 0; i < 10; i++) rd_s16b(&skill_exp[i]);
+ for (i = 0; i < 5; i++) for (j = 0; j < 64; j++) rd_s16b(&p_ptr->weapon_exp[i][j]);
+ for (i = 0; i < 10; i++) rd_s16b(&p_ptr->skill_exp[i]);
if (z_older_than(10, 4, 1))
{
- if (p_ptr->pclass != CLASS_BEASTMASTER) skill_exp[GINOU_RIDING] /= 2;
- skill_exp[GINOU_RIDING] = MIN(skill_exp[GINOU_RIDING], s_info[p_ptr->pclass].s_max[GINOU_RIDING]);
+ if (p_ptr->pclass != CLASS_BEASTMASTER) p_ptr->skill_exp[GINOU_RIDING] /= 2;
+ p_ptr->skill_exp[GINOU_RIDING] = MIN(p_ptr->skill_exp[GINOU_RIDING], s_info[p_ptr->pclass].s_max[GINOU_RIDING]);
}
if (z_older_than(10, 3, 14))
{
{
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;
{
for (i = 0; i < OLD_MAX_MANE; i++)
{
- mane_spell[i] = -1;
- mane_dam[i] = 0;
+ p_ptr->mane_spell[i] = -1;
+ p_ptr->mane_dam[i] = 0;
}
- mane_num = 0;
+ p_ptr->mane_num = 0;
}
else if (z_older_than(10, 2, 3))
{
}
for (i = 0; i < MAX_MANE; i++)
{
- mane_spell[i] = -1;
- mane_dam[i] = 0;
+ p_ptr->mane_spell[i] = -1;
+ p_ptr->mane_dam[i] = 0;
}
rd_s16b(&tmp16s);
- mane_num = 0;
+ p_ptr->mane_num = 0;
}
else
{
for (i = 0; i < MAX_MANE; i++)
{
- rd_s16b(&mane_spell[i]);
- rd_s16b(&mane_dam[i]);
+ rd_s16b(&p_ptr->mane_spell[i]);
+ rd_s16b(&p_ptr->mane_dam[i]);
}
- rd_s16b(&mane_num);
+ rd_s16b(&p_ptr->mane_num);
}
if (z_older_than(10, 0, 3))
rd_s16b(&p_ptr->tim_mimic);
rd_s16b(&p_ptr->tim_sh_fire);
}
- /* rd_s16b(&p_ptr->tim_sh_holy); nanka */
- /* rd_s16b(&p_ptr->tim_eyeeye); nanka */
+
+ if (z_older_than(11, 0, 99))
+ {
+ p_ptr->tim_sh_holy = 0;
+ p_ptr->tim_eyeeye = 0;
+ }
+ else
+ {
+ rd_s16b(&p_ptr->tim_sh_holy);
+ rd_s16b(&p_ptr->tim_eyeeye);
+ }
/* by henkma */
if ( z_older_than(11,0,3) ){
if (tmp8u) p_ptr->action = ACTION_LEARN;
}
rd_byte((byte *)&preserve_mode);
- rd_byte((byte *)&wait_report_score);
+ rd_byte((byte *)&p_ptr->wait_report_score);
/* Future use */
for (i = 0; i < 48; i++) rd_byte(&tmp8u);
/* Special stuff */
- rd_u16b(&panic_save);
- rd_u16b(&total_winner);
- rd_u16b(&noscore);
+ rd_u16b(&p_ptr->panic_save);
+ rd_u16b(&p_ptr->total_winner);
+ rd_u16b(&p_ptr->noscore);
/* Read "death" */
rd_byte(&tmp8u);
- death = tmp8u;
+ p_ptr->is_dead = tmp8u;
/* Read "feeling" */
rd_byte(&tmp8u);
for (i = 0; i < num; i++)
{
/* Read the message */
- rd_string(buf, 128);
+ rd_string(buf, sizeof(buf));
/* Save the message */
message_add(buf);
/* Access the cave */
c_ptr = &cave[y][x];
- if (c_ptr->feat == FEAT_INVIS)
- {
- c_ptr->feat = FEAT_FLOOR;
- c_ptr->info |= CAVE_TRAP;
- }
-
/* Extract "feat" */
c_ptr->feat = tmp8u;
}
}
+ /* 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_IN_MIRROR;
+ }
+ }
+ }
+
/*** Run length decoding ***/
/* Load the dungeon data */
/* Mention the savefile version */
+ note(format(
#ifdef JP
-note(format("¥Ð¡¼¥¸¥ç¥ó %d.%d.%d ¤Î¥»¡¼¥Ö¡¦¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥ÉÃæ...",
+ "¥Ð¡¼¥¸¥ç¥ó %d.%d.%d ¤Î¥»¡¼¥Ö¡¦¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥ÉÃæ...",
#else
- note(format("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 */
v_check = 0L;
x_check = 0L;
-#if SAVEFILE_VERSION
/* Read the version number of the savefile */
- rd_u32b(&sf_version);
-#endif /* SAVEFILE_VERSION */
+ /* 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_xtra);
+ rd_u32b(&sf_system);
/* Time of savefile creation */
rd_u32b(&sf_when);
if (munchkin_death)
{
/* Mark savefile */
- noscore |= 0x0001;
+ p_ptr->noscore |= 0x0001;
}
/* Then the "messages" */
/* Read the player_hp array */
for (i = 0; i < tmp16u; i++)
{
- rd_s16b(&player_hp[i]);
+ rd_s16b(&p_ptr->player_hp[i]);
}
/* Important -- Initialize the sex */
cp_ptr = &class_info[p_ptr->pclass];
ap_ptr = &seikaku_info[p_ptr->pseikaku];
- if(z_older_than(10, 2, 2) && (p_ptr->pclass == CLASS_BEASTMASTER) && !death)
+ if(z_older_than(10, 2, 2) && (p_ptr->pclass == CLASS_BEASTMASTER) && !p_ptr->is_dead)
{
p_ptr->hitdie = rp_ptr->r_mhp + cp_ptr->c_mhp + ap_ptr->a_mhp;
do_cmd_rerate(FALSE);
}
- if(z_older_than(10, 3, 2) && (p_ptr->pclass == CLASS_ARCHER) && !death)
+ if(z_older_than(10, 3, 2) && (p_ptr->pclass == CLASS_ARCHER) && !p_ptr->is_dead)
{
p_ptr->hitdie = rp_ptr->r_mhp + cp_ptr->c_mhp + ap_ptr->a_mhp;
do_cmd_rerate(FALSE);
}
- if(z_older_than(10, 2, 6) && (p_ptr->pclass == CLASS_SORCERER) && !death)
+ if(z_older_than(10, 2, 6) && (p_ptr->pclass == CLASS_SORCERER) && !p_ptr->is_dead)
{
p_ptr->hitdie = rp_ptr->r_mhp/2 + cp_ptr->c_mhp + ap_ptr->a_mhp;
do_cmd_rerate(FALSE);
}
- if(z_older_than(10, 4, 7) && (p_ptr->pclass == CLASS_BLUE_MAGE) && !death)
+ if(z_older_than(10, 4, 7) && (p_ptr->pclass == CLASS_BLUE_MAGE) && !p_ptr->is_dead)
{
p_ptr->hitdie = rp_ptr->r_mhp + cp_ptr->c_mhp + ap_ptr->a_mhp;
do_cmd_rerate(FALSE);
/* Read spell info */
- rd_u32b(&spell_learned1);
- rd_u32b(&spell_learned2);
- rd_u32b(&spell_worked1);
- rd_u32b(&spell_worked2);
- rd_u32b(&spell_forgotten1);
- rd_u32b(&spell_forgotten2);
+ rd_u32b(&p_ptr->spell_learned1);
+ rd_u32b(&p_ptr->spell_learned2);
+ rd_u32b(&p_ptr->spell_worked1);
+ rd_u32b(&p_ptr->spell_worked2);
+ rd_u32b(&p_ptr->spell_forgotten1);
+ rd_u32b(&p_ptr->spell_forgotten2);
if (z_older_than(10,0,5))
{
{
/* Count known spells */
if ((i < 32) ?
- (spell_learned1 & (1L << i)) :
- (spell_learned2 & (1L << (i - 32))))
+ (p_ptr->spell_learned1 & (1L << i)) :
+ (p_ptr->spell_learned2 & (1L << (i - 32))))
{
p_ptr->learned_spells++;
}
for (i = 0; i < 64; i++)
{
- rd_byte(&spell_order[i]);
+ rd_byte(&p_ptr->spell_order[i]);
}
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);
}
- if (death)
+ if (p_ptr->is_dead)
{
for (i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++)
{
/* I'm not dead yet... */
- if (!death)
+ if (!p_ptr->is_dead)
{
/* Dead players have no dungeon */
#ifdef JP