diff --git a/src/common/gamecode/laws.c b/src/common/gamecode/laws.c index 3372f7904..673acc8b7 100644 --- a/src/common/gamecode/laws.c +++ b/src/common/gamecode/laws.c @@ -2620,14 +2620,15 @@ renumber_factions(void) } } for (rp=renum;rp;rp=rp->next) { - a_remove(&rp->faction->attribs, rp->attrib); - if (updatelog) fprintf(updatelog, "renum %s %s\n", itoa36(rp->faction->no), itoa36(rp->want)); + f = rp->faction; + a_remove(&f->attribs, rp->attrib); + if (updatelog) fprintf(updatelog, "renum %s %s\n", itoa36(f->no), itoa36(rp->want)); if (f->subscription) fprintf(sqlstream, "UPDATE subscriptions set faction='%s' where " "subscription=%u;\n", itoa36(rp->want), f->subscription); - rp->faction->no = rp->want; + f->no = rp->want; register_faction_id(rp->want); - fset(rp->faction, FF_NEWID); + fset(f, FF_NEWID); } while (renum) { rp = renum->next; diff --git a/src/common/kernel/save.c b/src/common/kernel/save.c index 9356e47d0..6e3f93dae 100644 --- a/src/common/kernel/save.c +++ b/src/common/kernel/save.c @@ -187,6 +187,18 @@ typedef struct mapnode { static mapnode * subscriptions[HASHSIZE]; +static const char * +dbrace(const struct race * rc) +{ + static char zText[32]; + unsigned char * zPtr = (unsigned char*)zText; + strcpy(zText, LOC(find_locale("en"), rc_name(rc, 0))); + while (*zPtr) { + *zPtr = (unsigned char)toupper(*(int*)zPtr); + ++zPtr; + } + return zText; +} void convertunique(faction * f) { @@ -216,7 +228,11 @@ convertunique(faction * f) } mnode = subscriptions[f->no%HASHSIZE]; while (mnode!=NULL && mnode->fno!=f->no) mnode = mnode->next; - f->subscription = mnode->subscription; + if (mnode) f->subscription = mnode->subscription; + else { + log_printf("No subscription: faction %s email %s pass %s race %s\n", + itoa36(f->no), f->email, f->override, dbrace(f->race)); + } } #endif @@ -1459,7 +1475,7 @@ curse_read(attrib * a, FILE * f) { int cspellid; if (global.data_version < CURSE_NO_VERSION) { fscanf(f, "%d %d %d %d %d %d ",&cspellid, &c->flag, &c->duration, - &c->vigour, &mageid, &c->effect); + &c->vigour, &mageid, &c->effect.i); c->no = newunitid(); } else { fscanf(f, "%d %d %d %d %d %d %d ", &c->no, &cspellid, &c->flag, @@ -2048,9 +2064,6 @@ readfaction(FILE * F) while (f->attribs) a_remove(&f->attribs, f->attribs); } f->subscription = ri(F); -#ifdef CONVERT_DBLINK - convertunique(f); -#endif #ifdef ALLIANCES if (global.data_version>=ALLIANCES_VERSION) { int allianceid = rid(F); @@ -2095,6 +2108,9 @@ readfaction(FILE * F) f->race = rc_find(buf); assert(f->race); } +#ifdef CONVERT_DBLINK + convertunique(f); +#endif f->magiegebiet = (magic_t)ri(F); if (!playerrace(f->race)) { f->lastorders = turn+1;