diff --git a/src/common/gamecode/creport.c b/src/common/gamecode/creport.c index 5345e5341..4e3c7f539 100644 --- a/src/common/gamecode/creport.c +++ b/src/common/gamecode/creport.c @@ -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); } } diff --git a/src/common/gamecode/laws.c b/src/common/gamecode/laws.c index 25c14c7fb..e30969c91 100644 --- a/src/common/gamecode/laws.c +++ b/src/common/gamecode/laws.c @@ -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; } } diff --git a/src/common/gamecode/report.c b/src/common/gamecode/report.c index 59b72407d..e289ca5be 100644 --- a/src/common/gamecode/report.c +++ b/src/common/gamecode/report.c @@ -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); diff --git a/src/common/kernel/alliance.c b/src/common/kernel/alliance.c index 296b55dd5..80d8a203f 100644 --- a/src/common/kernel/alliance.c +++ b/src/common/kernel/alliance.c @@ -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; } diff --git a/src/common/kernel/alliance.h b/src/common/kernel/alliance.h index 45928f6b2..f3b09c941 100644 --- a/src/common/kernel/alliance.h +++ b/src/common/kernel/alliance.h @@ -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); diff --git a/src/common/kernel/save.c b/src/common/kernel/save.c index f49b47fee..1587c5a26 100644 --- a/src/common/kernel/save.c +++ b/src/common/kernel/save.c @@ -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); }