fix: alliance-crash when leader faction died

This commit is contained in:
Enno Rehling 2009-11-05 04:14:48 +00:00
parent 250e086eb1
commit cb88302668
6 changed files with 27 additions and 19 deletions

View File

@ -944,10 +944,11 @@ show_alliances_cr(FILE * F, const faction * f)
{
if (f->alliance) {
alliance * al = f->alliance;
assert(al->leader);
faction * lead = alliance_get_leader(al);
assert(lead);
fprintf(F, "ALLIANCE %d\n", al->id);
fprintf(F, "\"%s\";name\n", al->name);
fprintf(F, "%d;leader\n", al->leader->no);
fprintf(F, "%d;leader\n", lead->no);
}
}

View File

@ -1618,7 +1618,8 @@ name_cmd(unit * u, struct order * ord)
case P_ALLIANCE:
if (foreign==false && u->faction->alliance) {
alliance * al = u->faction->alliance;
if (al->leader==u->faction) {
faction * lead = alliance_get_leader(al);
if (lead==u->faction) {
s = &al->name;
}
}

View File

@ -2074,7 +2074,7 @@ report_plaintext(const char * filename, report_context * ctx, const char * chars
}
}
if (f->alliance) {
m = msg_message("nr_alliance", "leader name id", f->alliance->leader, f->alliance->name, f->alliance->id);
m = msg_message("nr_alliance", "leader name id", alliance_get_leader(f->alliance), f->alliance->name, f->alliance->id);
nr_render(m, f->locale, buf, sizeof(buf), f);
msg_release(m);
centre(F, buf, true);

View File

@ -89,9 +89,15 @@ typedef struct alliance_transaction {
static struct alliance_transaction * transactions[ALLIANCE_MAX];
static faction * alliance_leader(const alliance * al)
faction *
alliance_get_leader(alliance * al)
{
return al->leader;
if (!al->_leader) {
if (al->members) {
al->_leader = al->members->data;
}
}
return al->_leader;
}
// static alliance_transaction **
@ -166,7 +172,7 @@ perform_kick(void)
alliance_transaction * ta = *tap;
alliance * al = ta->u->faction->alliance;
if (al && alliance_leader(al)==ta->u->faction) {
if (al && alliance_get_leader(al)==ta->u->faction) {
faction * f;
init_tokens(ta->ord);
skip_token();
@ -237,14 +243,14 @@ perform_transfer(void)
alliance_transaction * ta = *tap;
alliance * al = ta->u->faction->alliance;
if (al && alliance_leader(al)==ta->u->faction) {
if (al && alliance_get_leader(al)==ta->u->faction) {
faction * f;
init_tokens(ta->ord);
skip_token();
skip_token();
f = getfaction();
if (f && f->alliance==al) {
al->leader = f;
al->_leader = f;
}
}
*tap = ta->next;
@ -390,11 +396,11 @@ setalliance(struct faction * f, alliance * al)
flistp = &flist->next;
}
if (f->alliance->leader==f) {
if (f->alliance->_leader==f) {
if (f->alliance->members) {
f->alliance->leader = f->alliance->members->data;
f->alliance->_leader = f->alliance->members->data;
} else {
f->alliance->leader = NULL;
f->alliance->_leader = NULL;
}
}
}
@ -410,8 +416,8 @@ setalliance(struct faction * f, alliance * al)
}
*flistp = flist;
flist->next = NULL;
if (al->leader==NULL) {
al->leader = f;
if (al->_leader==NULL) {
al->_leader = f;
}
flist = NULL;
}

View File

@ -36,7 +36,7 @@ enum {
typedef struct alliance {
struct alliance * next;
struct faction * leader;
struct faction * _leader;
struct faction_list * members;
unsigned int flags;
int id;
@ -49,7 +49,7 @@ extern alliance * makealliance(int id, const char * name);
extern const char * alliancename(const struct alliance * al);
extern void setalliance(struct faction * f, alliance * al);
void free_alliance(struct alliance * al);
extern struct faction * alliance_get_leader(struct alliance * al);
extern void alliance_cmd(void);
void alliance_setname(alliance * self, const char * name);

View File

@ -563,7 +563,7 @@ read_alliances(struct storage * store)
store->r_str_buf(store, aname, sizeof(aname));
al = makealliance(id, aname);
if (store->version>=ALLIANCELEADER_VERSION) {
read_reference(&al->leader, store, read_faction_reference, resolve_faction);
read_reference(&al->_leader, store, read_faction_reference, resolve_faction);
id = store->r_id(store);
} else{
store->r_str_buf(store, pbuf, sizeof(pbuf));
@ -577,11 +577,11 @@ write_alliances(struct storage * store)
{
alliance * al = alliances;
while (al) {
if (al->leader) {
if (al->_leader) {
store->w_id(store, al->id);
store->w_str(store, al->name);
if (store->version>=ALLIANCELEADER_VERSION) {
write_faction_reference(al->leader, store);
write_faction_reference(al->_leader, store);
}
store->w_brk(store);
}