life easier (or rather, possible) for dump_savegame. Should not break saves (let me know if they do).
Fixed dump_savegame bug reading TAG_LEVEL. Handle lua map_markers (by skipping over them) – requires format change and minor version bump.
Consolidated YOU_MINOR_VERSION, LEVEL_MINOR_VERSION, GHOST_MINOR_VERSION into a single TAG_MINOR_VERSION, because otherwise versions can't be passed into data structures being deserialized (because they may be contained in both you and ghost, for example).
Clean out old code that pretends to restore other major versions, and some duplicate code that pretends level loading and general tagged file loading are different. (Left ghosts alone because they really do do something different, slightly)
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@4420 c06c8d41-db1a-0410-9941-cceddc491573
AM7QPHDAWNXHLUEVUHVRHG2RO2DOIEFFU4GV3DCIROW6O5HW7H4AC
QYDFLJPRJ3GKULPAMHDSTR4JFASE5T45FPQYXJ25PWVN77KFKPGAC
RMVGTHY7VMJLFSJATGJFUDGJPEORZO2MU3VDHHVQZ7MVWVBSRQKAC
OUA4BNCB2VW27DYSSWKIO6LUYWGODL26O4OKH4QTC3MJ5GA2DM6AC
5B5DP5S6A6LQMKZYVLQAEMHQZWFWYDHPCKQGRNSCNNYIBQYZ6BIQC
3II6B6W4PVF3OD6LIZVK4HH4NOS3VDS52XYB52SUJWAMATF6ZIBAC
JMGFP3NPBN3IMFWC2T42UERZBAU3SPCTJ4SOJ5WL6WRUNB6BPKIQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
52J7CYVAW3QCUEWA5OKWPDGOP6JZR5NJSE3JDLZFBCR7B6LH5ASAC
UKN6HTZXDUUOWKNWNKWPHKGUGL474JIAQN5JU3DM3DU26WGMNP4AC
U6OTXM3JN7SGPVIGQ5F6NR2I7J5V7KOWFQ7AVNNRQQDNLBEDMYFQC
FS4MVTH4EEEECLEAO2FTNK5CLF2PHFYO2JZHC2YEOKYLWXRDRU6AC
CGYTZT5QWIEGYKUOLOK7MFXSLJKLYRZONER5ZCDZO5XYWSLG475QC
L4RYVF46EQKMVOEADGRG4WMPVTQ6NNFGYMU4SHAH6XJIKWVHT77QC
IVVTHLTTLOP5TSULXJWUSSXHOKYWVU3OWKYVK45A7RIB6V34MYQAC
GQL5SIGBHLU3FMCE54XVGLRY5AZHRM6DUEB722REA2DPLGJSN6EQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
W5VEC2PBIM5DMU5233HOWAZUEPTGWJRZZIA3H35YYQQW6BTP6XUAC
7AMQN7MITMXBNVDAK5VOXTQ4TZIAOD6ZLOFJG7GQMBTY23Y2BKSAC
6GT5JAWOIIL4SQ5MWIID6ZVO3KKQFWDQDZNVFHZ6DNK5QCBXJ4UAC
L3DRKFURVDCV3EJKGG6GVVQX3D5MZPICTVOKNOD3LGM2PECBA7PQC
T4IH76FA5TWHFOZUJFHLQXQJENJHWTUZZP4EGNA7D4GTZY7D4ZKAC
RBAGQ2PB7V5YAM5KSHSZR2E3MLKDSRVM5XYGI2TIXP5QMVBOQHDQC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
MOT3YZFRY3JG2MH3GN2VD6IY3IJSAXJUXMXS222TXWKRFCENOCDQC
Z262AMUK447BTC7MVOPQQ3NZTQXQOE5JODNHXN3IU7WL4ABSW5YQC
6L4EP4ZRWWYLT55PD5KTTJON5J2JB5VV5MWNHF5VPZQZ5BKEYZ4QC
XYBPIU6AQ77EID4VNOMI7KQZULZI4VBZHHIGBRYO7QRJVCODEKYAC
5ASC3STDYCNLZFEBN6UTMUCGDETHBR2OCBZCF5VIAZ5RRWLOTDYQC
// 1: starting version
// 2: append piety_hysteresis to TAG_YOU
// 3: add quiver info.
#define YOU_MINOR_VERSION 3
static bool determine_ghost_version( FILE *ghostFile,
char &majorVersion, char &minorVersion );
static void restore_ghost_version( FILE *ghostFile, char major, char minor );
static void restore_version( FILE *restoreFile,
char majorVersion, char minorVersion );
static bool determine_level_version( FILE *levelFile,
char &majorVersion, char &minorVersion );
static void restore_level_version( FILE *levelFile,
char majorVersion, char minorVersion );
static bool determine_ghost_version( FILE *ghostFile,
char &majorVersion, char &minorVersion );
static void restore_ghost_version( FILE *ghostFile,
char majorVersion, char minorVersion );
static void restore_tagged_file( FILE *restoreFile, int fileType,
char minorVersion );
static void load_ghost();
static void write_tagged_file( FILE *dataFile, char majorVersion,
char minorVersion, int fileType,
bool extended_version = false )
static void _write_tagged_file( FILE *outf, int fileType,
bool extended_version = false )
if (!determine_version(charf, majorVersion, minorVersion))
end(-1, false, "\nSavefile appears to be invalid.\n");
char majorVersion;
char minorVersion;
std::string reason;
if (!_get_and_validate_version(charf, majorVersion, minorVersion, &reason))
end(-1, false, "\nSave file is invalid. %s\n", reason.c_str());
static bool determine_version( FILE *restoreFile,
char &majorVersion, char &minorVersion )
static bool _get_and_validate_version(FILE *restoreFile, char &major, char &minor,
std::string* reason)
if (majorVersion == SAVE_MAJOR_VERSION)
return true;
return false; // if it's not 0, no idea
}
static void restore_version( FILE *restoreFile,
char majorVersion, char minorVersion )
{
// assuming the following check can be removed once we can read all
// savefile versions.
if (majorVersion != SAVE_MAJOR_VERSION)
if (major != TAG_MAJOR_VERSION)
end(-1, false, "\nSorry, this release cannot read a v%d.%d savefile.\n",
majorVersion, minorVersion);
*reason = make_stringf("Major version mismatch: %d (want %d).", major, TAG_MAJOR_VERSION);
return false;
case SAVE_MAJOR_VERSION:
restore_tagged_file(restoreFile, TAGTYPE_PLAYER, minorVersion);
break;
default:
break;
*reason = make_stringf("Minor version mismatch: %d (want <= %d).", minor, TAG_MINOR_VERSION);
return false;
}
static bool determine_level_version( FILE *levelFile,
char &majorVersion, char &minorVersion )
{
// read first two bytes.
char buf[2];
if (read2(levelFile, buf, 2) != 2)
return false; // empty file?
// otherwise, read version and validate.
majorVersion = buf[0];
minorVersion = buf[1];
if (majorVersion == SAVE_MAJOR_VERSION)
return true;
return false; // if its not SAVE_MAJOR_VERSION, no idea
static void restore_level_version( FILE *levelFile,
char majorVersion, char minorVersion )
{
// assuming the following check can be removed once we can read all
// savefile versions.
if (majorVersion != SAVE_MAJOR_VERSION)
{
end(-1, false,
"\nSorry, this release cannot read a v%d.%d level file.\n",
majorVersion, minorVersion);
}
switch(majorVersion)
{
case SAVE_MAJOR_VERSION:
restore_tagged_file(levelFile, TAGTYPE_LEVEL, minorVersion);
break;
default:
break;
}
}