From 5e3ce7ad4d4d844e7f38dff5e832d48c17fae8e7 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 26 Jun 2012 20:29:32 -0700 Subject: [PATCH] export more battle functions for e4 combat alliances have lists of diplomatic relations (enemies) --- src/kernel/alliance.h | 3 ++ src/kernel/battle.c | 81 +++++++++++++++++++++++++++++++------------ src/kernel/battle.h | 11 ++++-- src/kernel/config.h | 2 ++ src/kernel/faction.h | 2 +- src/kernel/types.h | 4 --- 6 files changed, 72 insertions(+), 31 deletions(-) diff --git a/src/kernel/alliance.h b/src/kernel/alliance.h index a97227ab0..04871c50a 100644 --- a/src/kernel/alliance.h +++ b/src/kernel/alliance.h @@ -40,6 +40,8 @@ extern "C" { #define ALF_NON_ALLIED (1<<0) /* this alliance is just a default for a non-allied faction */ +#define ALLY_ENEMY (1<<0) + typedef struct alliance { struct alliance *next; struct faction *_leader; @@ -47,6 +49,7 @@ extern "C" { unsigned int flags; int id; char *name; + struct ally *allies; } alliance; extern alliance *alliances; diff --git a/src/kernel/battle.c b/src/kernel/battle.c index 662c797c7..8dfd2357e 100644 --- a/src/kernel/battle.c +++ b/src/kernel/battle.c @@ -3137,6 +3137,45 @@ static int weapon_weight(const weapon * w, bool missile) return 0; } +side * get_side(battle * b, const const unit * u) +{ + side * s; + for (s = b->sides; s != b->sides + b->nsides; ++s) { + if (s->faction==u->faction) { + fighter * fig; + for (fig=s->fighters;fig;fig=fig->next) { + if (fig->unit==u) { + return s; + } + } + } + } + return 0; +} + +side * find_side(battle * b, const faction * f, const group * g, int flags, const faction * stealthfaction) +{ + side * s; + static int rule_anon_battle = -1; + + if (rule_anon_battle < 0) { + rule_anon_battle = get_param_int(global.parameters, "rules.stealth.anon_battle", 1); + } + for (s = b->sides; s != b->sides + b->nsides; ++s) { + if (s->faction == f && s->group == g) { + int s1flags = flags | SIDE_HASGUARDS; + int s2flags = s->flags | SIDE_HASGUARDS; + if (rule_anon_battle && s->stealthfaction != stealthfaction) { + continue; + } + if (s1flags == s2flags) { + return s; + } + } + } + return 0; +} + fighter *make_fighter(battle * b, unit * u, side * s1, bool attack) { #define WMAX 20 @@ -3147,9 +3186,7 @@ fighter *make_fighter(battle * b, unit * u, side * s1, bool attack) region *r = b->region; item *itm; fighter *fig = NULL; - int i, tactics = eff_skill(u, SK_TACTICS, r); - side *s2; - int h; + int h, i, tactics = eff_skill(u, SK_TACTICS, r); int berserk; int strongmen; int speeded = 0, speed = 1; @@ -3159,14 +3196,8 @@ fighter *make_fighter(battle * b, unit * u, side * s1, bool attack) const attrib *a = a_find(u->attribs, &at_otherfaction); const faction *stealthfaction = a ? get_otherfaction(a) : NULL; unsigned int flags = 0; - static int rule_anon_battle = -1; assert(u->number); - - if (rule_anon_battle < 0) { - rule_anon_battle = - get_param_int(global.parameters, "rules.stealth.anon_battle", 1); - } if (fval(u, UFL_ANON_FACTION) != 0) flags |= SIDE_STEALTH; if (!(AllianceAuto() & HELP_FIGHT) && fval(u, UFL_GROUP)) { @@ -3180,20 +3211,7 @@ fighter *make_fighter(battle * b, unit * u, side * s1, bool attack) return NULL; } if (s1 == NULL) { - for (s2 = b->sides; s2 != b->sides + b->nsides; ++s2) { - if (s2->faction == u->faction && s2->group == g) { - int s1flags = flags | SIDE_HASGUARDS; - int s2flags = s2->flags | SIDE_HASGUARDS; - if (rule_anon_battle && s2->stealthfaction != stealthfaction) { - continue; - } - if (s1flags == s2flags) { - s1 = s2; - break; - } - } - } - + s1 = find_side(b, u->faction, g, flags, stealthfaction); /* aliances are moved out of make_fighter and will be handled later */ if (!s1) { s1 = make_side(b, u->faction, g, flags, stealthfaction); @@ -3459,6 +3477,23 @@ fighter *make_fighter(battle * b, unit * u, side * s1, bool attack) return fig; } +fighter * get_fighter(battle * b, const struct unit * u) +{ + side * s; + + for (s = b->sides; s != b->sides + b->nsides; ++s) { + fighter *fig; + if (s->faction == u->faction) { + for (fig = s->fighters; fig; fig = fig->next) { + if (fig->unit == u) { + return fig; + } + } + } + } + return 0; +} + static int join_battle(battle * b, unit * u, bool attack, fighter ** cp) { side *s; diff --git a/src/kernel/battle.h b/src/kernel/battle.h index 59ced0967..eb854caeb 100644 --- a/src/kernel/battle.h +++ b/src/kernel/battle.h @@ -114,9 +114,6 @@ extern "C" { } fast; } battle; - void battle_init(battle * b); - void battle_free(battle * b); - typedef struct weapon { int count, used; const struct weapon_type *type; @@ -208,6 +205,14 @@ extern "C" { extern const troop no_troop; + /* BEGIN battle interface */ + void battle_init(battle * b); + void battle_free(battle * b); + side * find_side(battle * b, const struct faction * f, const struct group * g, int flags, const struct faction * stealthfaction); + side * get_side(battle * b, const struct unit * u); + fighter * get_fighter(battle * b, const struct unit * u); + /* END battle interface */ + extern void do_battle(struct region *r); /* for combat spells and special attacks */ diff --git a/src/kernel/config.h b/src/kernel/config.h index 559bcae2d..4a3531444 100644 --- a/src/kernel/config.h +++ b/src/kernel/config.h @@ -119,6 +119,8 @@ extern "C" { int status; } ally; + ally * ally_find(const ally *al, const struct faction *f); + void remove_empty_units_in_region(struct region *r); void remove_empty_units(void); void remove_empty_factions(void); diff --git a/src/kernel/faction.h b/src/kernel/faction.h index e68cf8bcd..cc7239e82 100644 --- a/src/kernel/faction.h +++ b/src/kernel/faction.h @@ -125,7 +125,7 @@ extern "C" { extern void set_alliance(struct faction *a, struct faction *b, int status); extern int get_alliance(const struct faction *a, const struct faction *b); - extern struct alliance *f_get_alliance(const struct faction *a); + extern struct alliance *f_get_alliance(const struct faction *f); extern void write_faction_reference(const struct faction *f, struct storage *store); diff --git a/src/kernel/types.h b/src/kernel/types.h index ed895bfdd..130d576a0 100644 --- a/src/kernel/types.h +++ b/src/kernel/types.h @@ -394,10 +394,6 @@ typedef enum { /* ------------------------------------------------------------- */ /* Prototypen */ -#define ALLIED_TAX 1 -#define ALLIED_NOBLOCK 2 -#define ALLIED_HELP 4 - /* alle vierstelligen zahlen: */ #define MAX_UNIT_NR (36*36*36*36-1) #define MAX_CONTAINER_NR (36*36*36*36-1)