diff --git a/src/buildno.h b/src/buildno.h index a8118b327..a0d2bfde8 100644 --- a/src/buildno.h +++ b/src/buildno.h @@ -1,3 +1,3 @@ #define VERSION_MAJOR 3 #define VERSION_MINOR 5 -#define VERSION_BUILD 4 +#define VERSION_BUILD 5 diff --git a/src/kernel/save.c b/src/kernel/save.c index 114126b0c..9f6021b65 100644 --- a/src/kernel/save.c +++ b/src/kernel/save.c @@ -1165,6 +1165,9 @@ faction *readfaction(struct gamedata * data) } READ_INT(data->store, &f->subscription); + if (data->version >= SPELL_LEVEL_VERSION) { + READ_INT(data->store, &f->max_spelllevel); + } if (alliances || data->version >= OWNER_2_VERSION) { int allianceid; READ_INT(data->store, &allianceid); @@ -1294,6 +1297,9 @@ void writefaction(struct gamedata *data, const faction * f) write_faction_reference(f, data->store); WRITE_INT(data->store, f->subscription); +#if RELEASE_VERSION >= SPELL_LEVEL_VERSION + WRITE_INT(data->store, f->max_spelllevel); +#endif if (f->alliance) { WRITE_INT(data->store, f->alliance->id); if (f->alliance->flags & ALF_NON_ALLIED) { @@ -1348,6 +1354,14 @@ void writefaction(struct gamedata *data, const faction * f) write_spellbook(f->spellbook, data->store); } +static int cb_sb_maxlevel(spellbook_entry *sbe, void *cbdata) { + faction *f = (faction *)cbdata; + if (sbe->level > f->max_spelllevel) { + f->max_spelllevel = sbe->level; + } + return 0; +} + int readgame(const char *filename, int backup) { int n, p, nread; @@ -1648,26 +1662,33 @@ int readgame(const char *filename, int backup) } else { for (u = f->units; u; u = u->nextF) { - sc_mage *mage = get_mage(u); - if (mage) { - faction *f = u->faction; - int skl = effskill(u, SK_MAGIC); - if (f->magiegebiet == M_GRAY) { - log_error("faction %s had magic=gray, fixing (%s)\n", factionname(f), magic_school[mage->magietyp]); - f->magiegebiet = mage->magietyp; - } - if (f->max_spelllevel < skl) { - f->max_spelllevel = skl; - } - if (mage->spellcount < 0) { - mage->spellcount = 0; + if (global.data_version < SPELL_LEVEL_VERSION) { + sc_mage *mage = get_mage(u); + if (mage) { + faction *f = u->faction; + int skl = effskill(u, SK_MAGIC); + if (f->magiegebiet == M_GRAY) { + log_error("faction %s had magic=gray, fixing (%s)\n", factionname(f), magic_school[mage->magietyp]); + f->magiegebiet = mage->magietyp; + } + if (f->max_spelllevel < skl) { + f->max_spelllevel = skl; + } + if (mage->spellcount < 0) { + mage->spellcount = 0; + } } } if (u->number > 0) { f->alive = true; - break; + if (global.data_version >= SPELL_LEVEL_VERSION) { + break; + } } } + if (global.data_version < SPELL_LEVEL_VERSION) { + spellbook_foreach(f->spellbook, cb_sb_maxlevel, f); + } } } if (loadplane || maxregions >= 0) { diff --git a/src/kernel/version.h b/src/kernel/version.h index 430628157..a32cfbe96 100644 --- a/src/kernel/version.h +++ b/src/kernel/version.h @@ -30,8 +30,9 @@ #define AUTO_RACENAME_VERSION 345 /* NPC units with name==NULL will automatically get their race for a name */ #define JSON_REPORT_VERSION 346 /* bit 3 in f->options flags the json report */ #define EXPLICIT_CURSE_ISNEW_VERSION 347 /* CURSE_ISNEW is not reset in read/write, but in age() */ +#define SPELL_LEVEL_VERSION 348 /* f->max_spelllevel gets stored, not calculated */ -#define RELEASE_VERSION EXPLICIT_CURSE_ISNEW_VERSION /* current datafile */ +#define RELEASE_VERSION SPELL_LEVEL_VERSION /* current datafile */ #define MIN_VERSION INTPAK_VERSION /* minimal datafile we support */ #define MAX_VERSION RELEASE_VERSION /* change this if we can need to read the future datafile, and we can do so */