forked from github/server
WIP: refactor allies api
This commit is contained in:
parent
5ab7c8cc65
commit
0ac3dc5ead
4 changed files with 77 additions and 61 deletions
|
@ -1018,20 +1018,35 @@ static void cr_output_unit_compat(FILE * F, const faction * f,
|
||||||
cr_output_unit(&strm, f, u, mode);
|
cr_output_unit(&strm, f, u, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
|
static void print_ally(const faction *f, faction *af, int status,
|
||||||
|
struct ally *sf, FILE *F) {
|
||||||
|
if (af) {
|
||||||
|
int mode = alliedgroup(NULL, f, af, sf, HELP_ALL);
|
||||||
|
if (mode != 0 && status > 0) {
|
||||||
|
fprintf(F, "ALLIANZ %d\n", af->no);
|
||||||
|
fprintf(F, "\"%s\";Parteiname\n", af->name);
|
||||||
|
fprintf(F, "%d;Status\n", status & HELP_ALL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct print_ally_s {
|
||||||
|
const faction *f;
|
||||||
|
FILE *F;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void print_ally_cb(struct ally *sf, faction *af, int status, void *udata) {
|
||||||
|
struct print_ally_s *data = (struct print_ally_s *)udata;
|
||||||
|
print_ally(data->f, af, status, sf, data->F);
|
||||||
|
}
|
||||||
|
|
||||||
/* prints allies */
|
/* prints allies */
|
||||||
static void show_allies_cr(FILE * F, const faction * f, const ally * sf)
|
static void show_allies_cr(FILE * F, const faction * f, struct ally * sf)
|
||||||
{
|
{
|
||||||
for (; sf; sf = sf->next)
|
struct print_ally_s data;
|
||||||
if (sf->faction) {
|
data.F = F;
|
||||||
int mode = alliedgroup(NULL, f, sf->faction, sf, HELP_ALL);
|
data.f = f;
|
||||||
if (mode != 0 && sf->status > 0) {
|
allies_walk(sf, print_ally_cb, &data);
|
||||||
fprintf(F, "ALLIANZ %d\n", sf->faction->no);
|
|
||||||
fprintf(F, "\"%s\";Parteiname\n", sf->faction->name);
|
|
||||||
fprintf(F, "%d;Status\n", sf->status & HELP_ALL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* prints allies */
|
/* prints allies */
|
||||||
|
|
|
@ -20,6 +20,20 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
typedef struct ally {
|
||||||
|
struct ally *next;
|
||||||
|
struct faction *faction;
|
||||||
|
int status;
|
||||||
|
} ally;
|
||||||
|
|
||||||
|
void allies_walk(struct ally *allies, cb_allies_walk callback, void *udata);
|
||||||
|
{
|
||||||
|
ally *al;
|
||||||
|
for (al = allies; al; al = al->next) {
|
||||||
|
callback(allies, al->faction, al->status, udata);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void read_allies(gamedata * data, faction *f)
|
void read_allies(gamedata * data, faction *f)
|
||||||
{
|
{
|
||||||
ally **sfp = &f->allies;
|
ally **sfp = &f->allies;
|
||||||
|
@ -196,7 +210,8 @@ static int AllianceRestricted(void)
|
||||||
|
|
||||||
int
|
int
|
||||||
alliedgroup(const struct plane *pl, const struct faction *f,
|
alliedgroup(const struct plane *pl, const struct faction *f,
|
||||||
const struct faction *f2, const struct ally *sf, int mode)
|
const struct faction *f2,
|
||||||
|
const struct ally *sf, int mode)
|
||||||
{
|
{
|
||||||
if (!(faction_alive(f) && faction_alive(f2))) {
|
if (!(faction_alive(f) && faction_alive(f2))) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -28,19 +28,18 @@ extern "C" {
|
||||||
struct faction;
|
struct faction;
|
||||||
struct gamedata;
|
struct gamedata;
|
||||||
struct unit;
|
struct unit;
|
||||||
|
struct ally;
|
||||||
|
|
||||||
extern struct attrib_type at_npcfaction;
|
extern struct attrib_type at_npcfaction;
|
||||||
|
|
||||||
typedef struct ally {
|
|
||||||
struct ally *next;
|
|
||||||
struct faction *faction;
|
|
||||||
int status;
|
|
||||||
} ally;
|
|
||||||
|
|
||||||
void read_allies(struct gamedata * data, struct faction *f);
|
void read_allies(struct gamedata * data, struct faction *f);
|
||||||
ally * ally_find(ally *al, const struct faction *f);
|
typedef void (*cb_allies_walk)(struct ally *, struct faction *, int, void *);
|
||||||
ally * ally_add(ally **al_p, struct faction *f);
|
void allies_walk(struct ally *allies, cb_allies_walk callback, void *udata);
|
||||||
void ally_remove(ally **al_p, struct faction *f);
|
struct ally* ally_find(struct ally*al, const struct faction *f);
|
||||||
|
void ally_set(struct ally**al_p, struct faction *f, int status);
|
||||||
|
int ally_get(struct ally *al, struct faction *f);
|
||||||
|
struct ally* ally_add(struct ally**al_p, struct faction *f);
|
||||||
|
void ally_remove(struct ally**al_p, struct faction *f);
|
||||||
|
|
||||||
int AllianceAuto(void); /* flags that allied factions get automatically */
|
int AllianceAuto(void); /* flags that allied factions get automatically */
|
||||||
int HelpMask(void); /* flags restricted to allied factions */
|
int HelpMask(void); /* flags restricted to allied factions */
|
||||||
|
@ -49,7 +48,7 @@ extern "C" {
|
||||||
int alliedfaction(const struct plane *pl, const struct faction *f,
|
int alliedfaction(const struct plane *pl, const struct faction *f,
|
||||||
const struct faction *f2, int mode);
|
const struct faction *f2, int mode);
|
||||||
int alliedgroup(const struct plane *pl, const struct faction *f,
|
int alliedgroup(const struct plane *pl, const struct faction *f,
|
||||||
const struct faction *f2, const struct ally *sf, int mode);
|
const struct faction *f2, const struct ally*sf, int mode);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
63
src/laws.c
63
src/laws.c
|
@ -1292,10 +1292,11 @@ void quit(void)
|
||||||
int ally_cmd(unit * u, struct order *ord)
|
int ally_cmd(unit * u, struct order *ord)
|
||||||
{
|
{
|
||||||
char token[128];
|
char token[128];
|
||||||
ally *sf, **sfp;
|
struct ally **sfp;
|
||||||
faction *f;
|
faction *f;
|
||||||
int keyword, not_kw;
|
int keyword, not_kw;
|
||||||
const char *s;
|
const char *s;
|
||||||
|
int sf_status;
|
||||||
|
|
||||||
init_order_depr(ord);
|
init_order_depr(ord);
|
||||||
f = getfaction();
|
f = getfaction();
|
||||||
|
@ -1319,28 +1320,17 @@ int ally_cmd(unit * u, struct order *ord)
|
||||||
sfp = &u->faction->allies;
|
sfp = &u->faction->allies;
|
||||||
if (fval(u, UFL_GROUP)) {
|
if (fval(u, UFL_GROUP)) {
|
||||||
attrib *a = a_find(u->attribs, &at_group);
|
attrib *a = a_find(u->attribs, &at_group);
|
||||||
if (a)
|
if (a) {
|
||||||
sfp = &((group *)a->data.v)->allies;
|
sfp = &((group *)a->data.v)->allies;
|
||||||
}
|
}
|
||||||
for (sf = *sfp; sf; sf = sf->next)
|
}
|
||||||
if (sf->faction == f)
|
|
||||||
break; /* Gleich die passende raussuchen, wenn vorhanden */
|
|
||||||
|
|
||||||
not_kw = getparam(u->faction->locale); /* HELFE partei [modus] NICHT */
|
not_kw = getparam(u->faction->locale); /* HELFE partei [modus] NICHT */
|
||||||
|
|
||||||
if (!sf) {
|
sf_status = ally_get(*sfp, f);
|
||||||
if (keyword == P_NOT || not_kw == P_NOT) {
|
|
||||||
/* Wir helfen der Partei gar nicht... */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
sf = ally_add(sfp, f);
|
|
||||||
sf->status = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch (keyword) {
|
switch (keyword) {
|
||||||
case P_NOT:
|
case P_NOT:
|
||||||
sf->status = 0;
|
sf_status = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NOPARAM:
|
case NOPARAM:
|
||||||
|
@ -1348,60 +1338,57 @@ int ally_cmd(unit * u, struct order *ord)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case P_ANY:
|
case P_ANY:
|
||||||
if (not_kw == P_NOT)
|
sf_status = (not_kw == P_NOT) ? 0 : HELP_ALL;
|
||||||
sf->status = 0;
|
|
||||||
else
|
|
||||||
sf->status = HELP_ALL;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case P_TRAVEL:
|
case P_TRAVEL:
|
||||||
if (not_kw == P_NOT)
|
if (not_kw == P_NOT) {
|
||||||
sf->status = sf->status & (HELP_ALL - HELP_TRAVEL);
|
sf_status = sf_status & (HELP_ALL - HELP_TRAVEL);
|
||||||
else
|
}
|
||||||
sf->status = sf->status | HELP_TRAVEL;
|
else {
|
||||||
|
sf_status |= HELP_TRAVEL;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case P_GIVE:
|
case P_GIVE:
|
||||||
if (not_kw == P_NOT)
|
if (not_kw == P_NOT)
|
||||||
sf->status = sf->status & (HELP_ALL - HELP_GIVE);
|
sf_status &= (HELP_ALL - HELP_GIVE);
|
||||||
else
|
else
|
||||||
sf->status = sf->status | HELP_GIVE;
|
sf_status |= HELP_GIVE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case P_MONEY:
|
case P_MONEY:
|
||||||
if (not_kw == P_NOT)
|
if (not_kw == P_NOT)
|
||||||
sf->status = sf->status & (HELP_ALL - HELP_MONEY);
|
sf_status &= (HELP_ALL - HELP_MONEY);
|
||||||
else
|
else
|
||||||
sf->status = sf->status | HELP_MONEY;
|
sf_status |= HELP_MONEY;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case P_FIGHT:
|
case P_FIGHT:
|
||||||
if (not_kw == P_NOT)
|
if (not_kw == P_NOT)
|
||||||
sf->status = sf->status & (HELP_ALL - HELP_FIGHT);
|
sf_status &= (HELP_ALL - HELP_FIGHT);
|
||||||
else
|
else
|
||||||
sf->status = sf->status | HELP_FIGHT;
|
sf_status |= HELP_FIGHT;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case P_FACTIONSTEALTH:
|
case P_FACTIONSTEALTH:
|
||||||
if (not_kw == P_NOT)
|
if (not_kw == P_NOT)
|
||||||
sf->status = sf->status & (HELP_ALL - HELP_FSTEALTH);
|
sf_status &= (HELP_ALL - HELP_FSTEALTH);
|
||||||
else
|
else
|
||||||
sf->status = sf->status | HELP_FSTEALTH;
|
sf_status |= HELP_FSTEALTH;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case P_GUARD:
|
case P_GUARD:
|
||||||
if (not_kw == P_NOT)
|
if (not_kw == P_NOT)
|
||||||
sf->status = sf->status & (HELP_ALL - HELP_GUARD);
|
sf_status &= (HELP_ALL - HELP_GUARD);
|
||||||
else
|
else
|
||||||
sf->status = sf->status | HELP_GUARD;
|
sf_status |= HELP_GUARD;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
sf->status &= HelpMask();
|
sf_status &= HelpMask();
|
||||||
|
ally_set(sfp, f, sf_status);
|
||||||
|
|
||||||
if (sf->status == 0) { /* Alle HELPs geloescht */
|
|
||||||
removelist(sfp, sf);
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue