2001-01-25 10:37:55 +01:00
|
|
|
|
/* vi: set ts=2:
|
|
|
|
|
*
|
|
|
|
|
* Eressea PB(E)M host Copyright (C) 1998-2000
|
|
|
|
|
* Christian Schlittchen (corwin@amber.kn-bremen.de)
|
|
|
|
|
* Katja Zedel (katze@felidae.kn-bremen.de)
|
|
|
|
|
* Henning Peters (faroul@beyond.kn-bremen.de)
|
|
|
|
|
* Enno Rehling (enno@eressea-pbem.de)
|
|
|
|
|
* Ingo Wilken (Ingo.Wilken@informatik.uni-oldenburg.de)
|
|
|
|
|
*
|
|
|
|
|
* This program may not be used, modified or distributed without
|
|
|
|
|
* prior permission by the authors of Eressea.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifndef BATTLE_H
|
|
|
|
|
#define BATTLE_H
|
|
|
|
|
|
2001-02-14 10:17:56 +01:00
|
|
|
|
/** new code defines **/
|
|
|
|
|
#define FAST_GETUNITROW
|
|
|
|
|
|
|
|
|
|
/** more defines **/
|
2001-01-25 10:37:55 +01:00
|
|
|
|
#define FS_ENEMY 1
|
|
|
|
|
#define FS_HELP 2
|
|
|
|
|
|
2001-02-14 10:17:56 +01:00
|
|
|
|
/***** Verteidigungslinien.
|
|
|
|
|
* Eressea hat 4 Verteidigungslinien. 1 ist vorn, 5. enth<EFBFBD>lt Summen
|
|
|
|
|
*/
|
|
|
|
|
#define NUMROWS 5
|
2001-01-25 10:37:55 +01:00
|
|
|
|
#define SUM_ROW 0
|
|
|
|
|
#define FIGHT_ROW 1
|
|
|
|
|
#define BEHIND_ROW 2
|
|
|
|
|
#define AVOID_ROW 3
|
|
|
|
|
#define FLEE_ROW 4
|
|
|
|
|
#define LAST_ROW (NUMROWS-1)
|
|
|
|
|
#define FIRST_ROW FIGHT_ROW
|
|
|
|
|
|
|
|
|
|
typedef struct bfaction {
|
|
|
|
|
struct bfaction * next;
|
|
|
|
|
struct side * sides;
|
|
|
|
|
struct faction *faction;
|
|
|
|
|
int lastturn; /* last time this struct faction was involved in combat */
|
|
|
|
|
boolean attacker;
|
|
|
|
|
} bfaction;
|
|
|
|
|
|
|
|
|
|
typedef struct battle {
|
|
|
|
|
cvector leaders;
|
|
|
|
|
struct region *region;
|
|
|
|
|
struct plane *plane;
|
|
|
|
|
bfaction * factions;
|
|
|
|
|
int nfactions;
|
|
|
|
|
cvector fighters;
|
|
|
|
|
cvector sides;
|
|
|
|
|
cvector meffects;
|
|
|
|
|
int max_tactics;
|
|
|
|
|
int turn;
|
|
|
|
|
boolean has_tactics_turn;
|
|
|
|
|
int keeploot;
|
|
|
|
|
boolean reelarrow;
|
2001-02-14 10:17:56 +01:00
|
|
|
|
int dh;
|
|
|
|
|
int alive;
|
2001-01-25 10:37:55 +01:00
|
|
|
|
boolean small;
|
2001-02-14 10:17:56 +01:00
|
|
|
|
#ifdef FAST_GETUNITROW
|
|
|
|
|
boolean nonblockers;
|
|
|
|
|
#endif
|
2001-01-25 10:37:55 +01:00
|
|
|
|
} battle;
|
|
|
|
|
|
|
|
|
|
typedef struct tactics {
|
|
|
|
|
cvector fighters;
|
|
|
|
|
int value;
|
|
|
|
|
} tactics;
|
|
|
|
|
|
|
|
|
|
typedef struct side {
|
|
|
|
|
struct tactics leader; /* der beste Taktiker des Heeres */
|
|
|
|
|
struct side * nextF; /* n<>chstes Heer der gleichen Partei */
|
|
|
|
|
struct battle * battle;
|
|
|
|
|
struct bfaction * bf; /* Die Partei, die hier k<>mpft */
|
|
|
|
|
const struct group * group;
|
2001-02-14 02:38:51 +01:00
|
|
|
|
# define E_ENEMY 1
|
|
|
|
|
# define E_ATTACKING 2
|
|
|
|
|
int enemy[128];
|
2001-01-25 10:37:55 +01:00
|
|
|
|
cvector fighters; /* vector der Einheiten dieser Fraktion */
|
|
|
|
|
int index; /* Eintrag der Fraktion in b->matrix/b->enemies */
|
|
|
|
|
int size[NUMROWS]; /* Anzahl Personen in Reihe X. 0 = Summe */
|
|
|
|
|
int nonblockers[NUMROWS]; /* Anzahl nichtblockierender K<>mpfer, z.B. Schattenritter. */
|
|
|
|
|
int alive; /* Die Partei hat den Kampf verlassen */
|
2001-12-10 01:13:39 +01:00
|
|
|
|
int removed; /* stoned */
|
2001-01-25 10:37:55 +01:00
|
|
|
|
int flee;
|
|
|
|
|
int dead;
|
|
|
|
|
int casualties;
|
|
|
|
|
int healed;
|
|
|
|
|
boolean dh;
|
|
|
|
|
boolean stealth; /* Die Einheiten sind getarnt */
|
2001-12-10 01:13:39 +01:00
|
|
|
|
const struct faction *stealthfaction;
|
2001-01-25 10:37:55 +01:00
|
|
|
|
} side;
|
|
|
|
|
|
|
|
|
|
typedef struct weapon {
|
|
|
|
|
int count, used;
|
|
|
|
|
const struct weapon_type * type;
|
Zu Anfang des Kampfes wählt jeder Kämpfer aus seinem Arsenal zwei Waffen
aus: Seine beste Fernampfwaffe und seine beste Nahkampfwaffe.
Welches die beste Waffe ist, ist nicht immer einleuchtend, und an dieser
Stelle macht der Server eine Vereinfachung - er wählt die Waffe, bei der der
Angriffswert plus dem Verteidigungswert am größten ist.
** Wenn eine Einheit an der Reihe ist, wird geprüft:
1. Ist die Einheit ein Magier, so zaubert sie.
2. Ist die Einheit damit beschäftigt, eine Waffe nachzuladen, so tut sie das.
3. Steht die Einheit in einer der hinteren Reihen, attackiert sie, so
vorhanden, mit der Fernkampfwaffe.
4. Steht die Einheit in der vorderen Kampfreihe, so attackiert sie mit
derjenigen Waffe von beiden, in der ihr Talent am höchsten ist.
** Wird eine Einheit angegriffen, so gilt:
1. Handelt es sich um einen Angriff durch einen Nahkämpfer, so verteidigt
sie sich mit ihrer Nahkampfwaffe oder Waffenlosem Kampf.
2. Handelt es sich um eine Attacke durch einen Fernkämpfer, so verteidigt
sie sich mit dem halben Talent ihrer besten Waffe.
2002-10-04 23:25:16 +02:00
|
|
|
|
int attackskill : 8;
|
|
|
|
|
int defenseskill : 8;
|
2001-01-25 10:37:55 +01:00
|
|
|
|
} weapon;
|
|
|
|
|
|
|
|
|
|
/*** fighter::person::flags ***/
|
|
|
|
|
#define FL_TIRED 1
|
|
|
|
|
#define FL_DAZZLED 2 /* durch Untote oder D<>monen eingesch<63>chtert */
|
|
|
|
|
#define FL_PANICED 4
|
|
|
|
|
#define FL_HERO 8 /* Helden fliehen nie */
|
|
|
|
|
#define FL_SLEEPING 16
|
|
|
|
|
#define FL_STUNNED 32 /* eine Runde keinen Angriff */
|
|
|
|
|
|
|
|
|
|
/*** fighter::flags ***/
|
|
|
|
|
#define FIG_ATTACKED 1
|
|
|
|
|
#define FIG_NOLOOT 2
|
|
|
|
|
|
|
|
|
|
typedef unsigned char armor_t;
|
|
|
|
|
enum {
|
|
|
|
|
#ifdef COMPATIBILITY
|
|
|
|
|
AR_MAGICAL,
|
|
|
|
|
#endif
|
|
|
|
|
AR_PLATE,
|
|
|
|
|
AR_CHAIN,
|
|
|
|
|
AR_RUSTY_CHAIN,
|
|
|
|
|
AR_SHIELD,
|
|
|
|
|
AR_RUSTY_SHIELD,
|
|
|
|
|
AR_EOGSHIELD,
|
|
|
|
|
AR_EOGCHAIN,
|
|
|
|
|
AR_MAX,
|
|
|
|
|
AR_NONE
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef struct fighter {
|
|
|
|
|
struct side *side;
|
|
|
|
|
struct unit *unit; /* Die Einheit, die hier k<>mpft */
|
|
|
|
|
struct building *building; /* Geb<65>ude, in dem die Einheit evtl. steht */
|
|
|
|
|
status_t status; /* Kampfstatus */
|
|
|
|
|
struct weapon * weapons;
|
|
|
|
|
int armor[AR_MAX]; /* Anzahl R<>stungen jeden Typs */
|
|
|
|
|
int alive; /* Anzahl der noch nicht Toten in der Einheit */
|
|
|
|
|
int fighting; /* Anzahl der K<>mpfer in der aktuellen Runde */
|
|
|
|
|
int removed; /* Anzahl Kaempfer, die nicht tot sind, aber
|
|
|
|
|
aus dem Kampf raus sind (zB weil sie
|
|
|
|
|
versteinert wurden). Diese werden auch
|
|
|
|
|
in alive noch mitgez<EFBFBD>hlt! */
|
|
|
|
|
int magic; /* Magietalent der Einheit */
|
|
|
|
|
int horses; /* Anzahl brauchbarer Pferde der Einheit */
|
|
|
|
|
int elvenhorses; /* Anzahl brauchbarer Elfenpferde der Einheit */
|
|
|
|
|
struct item * loot;
|
|
|
|
|
int catmsg; /* Merkt sich, ob Katapultmessage schon generiert. */
|
|
|
|
|
struct person {
|
|
|
|
|
int attack : 8; /* (Magie) Attackenbonus der Personen */
|
|
|
|
|
int defence : 8; /* (Magie) Paradenbonus der Personen */
|
|
|
|
|
int damage : 8; /* (Magie) Schadensbonus der Personen im Nahkampf */
|
|
|
|
|
int damage_rear : 8; /* (Magie) Schadensbonus der Personen im Fernkampf */
|
|
|
|
|
int hp : 16; /* Trefferpunkte der Personen */
|
|
|
|
|
int flags : 8; /* (Magie) Diverse Flags auf K<>mpfern */
|
|
|
|
|
int speed : 8; /* (Magie) Geschwindigkeitsmultiplkator. */
|
|
|
|
|
int reload : 4; /* Anzahl Runden, die die Waffe x noch laden muss.
|
|
|
|
|
* dahinter steckt ein array[RL_MAX] wenn er min. eine hat. */
|
|
|
|
|
int last_action : 8; /* In welcher Runde haben wir zuletzt etwas getan */
|
Zu Anfang des Kampfes wählt jeder Kämpfer aus seinem Arsenal zwei Waffen
aus: Seine beste Fernampfwaffe und seine beste Nahkampfwaffe.
Welches die beste Waffe ist, ist nicht immer einleuchtend, und an dieser
Stelle macht der Server eine Vereinfachung - er wählt die Waffe, bei der der
Angriffswert plus dem Verteidigungswert am größten ist.
** Wenn eine Einheit an der Reihe ist, wird geprüft:
1. Ist die Einheit ein Magier, so zaubert sie.
2. Ist die Einheit damit beschäftigt, eine Waffe nachzuladen, so tut sie das.
3. Steht die Einheit in einer der hinteren Reihen, attackiert sie, so
vorhanden, mit der Fernkampfwaffe.
4. Steht die Einheit in der vorderen Kampfreihe, so attackiert sie mit
derjenigen Waffe von beiden, in der ihr Talent am höchsten ist.
** Wird eine Einheit angegriffen, so gilt:
1. Handelt es sich um einen Angriff durch einen Nahkämpfer, so verteidigt
sie sich mit ihrer Nahkampfwaffe oder Waffenlosem Kampf.
2. Handelt es sich um eine Attacke durch einen Fernkämpfer, so verteidigt
sie sich mit dem halben Talent ihrer besten Waffe.
2002-10-04 23:25:16 +02:00
|
|
|
|
struct weapon * missile; /* missile weapon */
|
|
|
|
|
struct weapon * melee; /* melee weapon */
|
2001-01-25 10:37:55 +01:00
|
|
|
|
} * person;
|
|
|
|
|
int flags;
|
2001-03-04 19:41:27 +01:00
|
|
|
|
struct {
|
|
|
|
|
int number; /* number of people who have flown */
|
|
|
|
|
int hp; /* accumulated hp of fleeing people */
|
|
|
|
|
struct region *region; /* destination of fleeing people */
|
|
|
|
|
struct item * items; /* items they take */
|
|
|
|
|
} run;
|
2001-01-25 10:37:55 +01:00
|
|
|
|
int action_counter; /* number of active actions the struct unit did in the fight */
|
2001-02-18 13:11:32 +01:00
|
|
|
|
#ifdef SHOW_KILLS
|
|
|
|
|
int kills;
|
|
|
|
|
int hits;
|
|
|
|
|
#endif
|
2001-02-14 10:17:56 +01:00
|
|
|
|
#ifdef FAST_GETUNITROW
|
|
|
|
|
struct {
|
|
|
|
|
int alive;
|
|
|
|
|
int cached;
|
|
|
|
|
} row;
|
|
|
|
|
#endif
|
2001-01-25 10:37:55 +01:00
|
|
|
|
} fighter;
|
|
|
|
|
|
|
|
|
|
typedef struct troop {
|
|
|
|
|
struct fighter *fighter;
|
|
|
|
|
int index;
|
|
|
|
|
} troop;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* schilde */
|
|
|
|
|
|
|
|
|
|
enum {
|
|
|
|
|
SHIELD_REDUCE,
|
|
|
|
|
SHIELD_ARMOR,
|
|
|
|
|
SHIELD_WIND,
|
|
|
|
|
SHIELD_BLOCK,
|
|
|
|
|
SHIELD_MAX
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef struct meffect {
|
|
|
|
|
fighter *magician; /* Der Zauberer, der den Schild gezaubert hat */
|
|
|
|
|
int typ; /* Wirkungsweise des Schilds */
|
|
|
|
|
int effect;
|
|
|
|
|
int duration;
|
|
|
|
|
} meffect;
|
|
|
|
|
|
|
|
|
|
extern const troop no_troop;
|
|
|
|
|
|
|
|
|
|
extern void do_battle(void);
|
|
|
|
|
|
|
|
|
|
/* for combar spells and special attacks */
|
|
|
|
|
extern int damage_unit(struct unit *u, const char *dam, boolean armor, boolean magic);
|
2002-04-07 02:44:01 +02:00
|
|
|
|
extern troop select_enemy(struct battle * b, struct fighter * af, int minrow, int maxrow);
|
|
|
|
|
extern int count_enemies(struct battle * b, struct side * as, int mask, int minrow, int maxrow);
|
2001-01-25 10:37:55 +01:00
|
|
|
|
extern boolean terminate(troop dt, troop at, int type, const char *damage, boolean missile);
|
|
|
|
|
extern void battlemsg(battle * b, struct unit * u, const char * s);
|
|
|
|
|
extern void battlerecord(battle * b, const char *s);
|
|
|
|
|
extern int hits(troop at, troop dt, weapon * awp);
|
|
|
|
|
extern void damage_building(struct battle *b, struct building *bldg, int damage_abs);
|
|
|
|
|
extern struct cvector * fighters(struct battle *b, struct fighter *af, int minrow, int maxrow, int mask);
|
|
|
|
|
extern int countallies(struct side * as);
|
2001-02-14 21:09:49 +01:00
|
|
|
|
extern int get_unitrow(struct fighter * af);
|
2001-01-25 10:37:55 +01:00
|
|
|
|
extern boolean helping(struct side * as, struct side * ds);
|
|
|
|
|
extern void rmtroop(struct troop dt);
|
2001-04-22 20:14:07 +02:00
|
|
|
|
extern void rmfighter(fighter *df, int i);
|
2001-01-25 10:37:55 +01:00
|
|
|
|
extern struct region * fleeregion(const struct unit * u);
|
|
|
|
|
extern boolean enemy (const struct side * a, const struct side * b);
|
|
|
|
|
extern struct troop select_corpse(struct battle * b, struct fighter * af);
|
|
|
|
|
extern fighter * make_fighter(struct battle * b, struct unit * u, boolean attack);
|
2002-03-09 14:51:14 +01:00
|
|
|
|
extern int statusrow(int status);
|
2002-03-09 16:16:35 +01:00
|
|
|
|
extern void flee(const troop dt);
|
|
|
|
|
extern void drain_exp(struct unit *u, int d);
|
2001-01-25 10:37:55 +01:00
|
|
|
|
|
|
|
|
|
#endif
|