From 76497abc926631ebfa6280f5f8bf4fb46960f1a1 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 12 May 2008 09:44:01 +0000 Subject: [PATCH] bugfix monsterfaction --- src/common/kernel/faction.c | 3 ++- src/common/kernel/faction.h | 2 +- src/common/kernel/save.c | 31 ++++++++++++++++++++++--------- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/common/kernel/faction.c b/src/common/kernel/faction.c index 699afd64c..e073677b6 100644 --- a/src/common/kernel/faction.c +++ b/src/common/kernel/faction.c @@ -341,7 +341,8 @@ set_alliance(faction * a, faction * b, int status) (*sfp)->status |= status; } -void renumber_faction(faction * f, int no) +void +renumber_faction(faction * f, int no) { if (f->subscription) { sql_print(("UPDATE subscriptions set faction='%s' where id=%u;\n", diff --git a/src/common/kernel/faction.h b/src/common/kernel/faction.h index a1cfd0232..21deb3f00 100644 --- a/src/common/kernel/faction.h +++ b/src/common/kernel/faction.h @@ -145,7 +145,7 @@ extern void remove_enemy(struct faction * f, struct faction * enemy); extern void write_faction_reference(const struct faction * f, struct storage * store); extern int read_faction_reference(struct faction ** f, struct storage * store); -void renumber_faction(faction * f, int no); +extern void renumber_faction(faction * f, int no); #ifdef SMART_INTERVALS extern void update_interval(struct faction * f, struct region * r); diff --git a/src/common/kernel/save.c b/src/common/kernel/save.c index 81a7533e9..3ea663eb3 100644 --- a/src/common/kernel/save.c +++ b/src/common/kernel/save.c @@ -1419,6 +1419,9 @@ readfaction(struct storage * store) #endif /* KARMA_MODULE */ f->flags = store->r_int(store); + if (f->no==0) { + f->flags |= FFL_NPC; + } a_read(store, &f->attribs); if (store->version>=CLAIM_VERSION) { @@ -1769,32 +1772,42 @@ readgame(const char * filename, int mode, int backup) store->close(store); /* Unaufgeloeste Zeiger initialisieren */ - log_info((1, "\n - Referenzen initialisieren...\n")); + log_info((1, "fixing unresolved references.\n")); resolve(); + log_info((1, "updating area information for lighthouses.\n")); for (r=regions;r;r=r->next) { if (r->flags & RF_LIGHTHOUSE) { building * b; for (b=r->buildings;b;b=b->next) update_lighthouse(b); } } - log_info((1, " - Regionen initialisieren & verbinden...\n")); + log_info((1, "marking factions as alive.\n")); for (f = factions; f; f = f->next) { - for (u = f->units; u; u = u->nextF) { - if (u->number>0) { - f->alive = 1; - break; + if (f->flags & FFL_NPC) { + f->alive = 1; + if (f->no==0) { + int no=666; + while (findfaction(no)) ++no; + log_warning(("renum(monsters, %d)\n", no)); + renumber_faction(f, no); + } + } else { + for (u = f->units; u; u = u->nextF) { + if (u->number>0) { + f->alive = 1; + break; + } } } } - if (findfaction(0)) { - findfaction(0)->alive = 1; - } if (loadplane || maxregions>=0) { remove_empty_factions(false); } + log_info((1, "Done loading turn %d.\n", turn)); return 0; } + int writegame(const char *filename, int mode) {