empserver/include/plane.h
Markus Armbruster 6564ff2240 Integrate air defense missions into interception
The ancients designed interception dead simple: when you overfly a
sector, you get intercepted by the sector owner.  Fine print
interception rules govern which planes intercept.

Then complexity got piled on top of it.

Chainsaw 2 added an extra interception by surface ship owners, in the
target sector only.

Chainsaw 3 added an extra interception by land unit owners, in the
target sector only (Empire 4 later merged this extra land unit
interception with the extra surface ship interception).

Chainsaw 3 added an entirely separate kind of interception: air
defense missions.  When you enter a sector in some air defense op
area, you get intercepted.  Fine print air defense rules govern which
planes intercept.  These rules differ significantly from the
interception fine print.

Additional complexity comes from these facts:

* Air defense mission interception happens in addition to non-mission
  interception.  You can boost your total interception by setting up
  air defense.  Which means you must set it up, or forgo an advantage.

* Air defense planes are not available for non-mission interception
  duty.  You need to decide on a split.

* In contrast to non-mission interception, interceptors flying air
  defense get intercepted.

Moreover, the air defense code breaks one of the plane code's design
assumptions, namely that just one plane sortie is active at a time.
The air defense sortie runs while the sortie it intercepts is in
progress.  This leads to two interceptions being active at the same
time: the one intercepting the original sortie, and the one
intercepting the air defense sortie.  The same plane can fly in both
interceptions, and damage received in the interception of the air
defense sortie is wiped out, triggering a seqno mismatch oops.

The previous commit already simplified non-mission interception: you
get intercepted by anyone who owns the sector, or a surface ship or a
land unit there, whether it's the target sector or not.

Now simplify mission interception, by merging air defense back into
ordinary interception: when you overfly a sector, you get intercepted
by anyone who owns the sector, or a surface ship or land unit there,
or has an air defense mission covering the sector.  That's all.  No
multiple interceptions, no separate air defense rules.

Remove air_defense().  Simplify ac_encounter() and sam_intercept()
accordingly; both lose their last parameter.

Change sam_intercept() and ac_intercept() to intercept in mission op
areas.  New parameter only_mission to suppress non-mission
interception.  Pass zero when the intercepting country owns the sector
or a surface ship or land unit in the sector.

ac_encounter() can't efficiently predict whether a country intercepts,
so it needs to call ac_intercept() unconditionally.  This kills the
optimization to collect interceptors only when needed; simplify
accordingly, replacing getilist() by getilists().
2009-02-01 17:14:39 +01:00

175 lines
6.3 KiB
C

/*
* Empire - A multi-player, client/server Internet based war game.
* Copyright (C) 1986-2008, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* ---
*
* See files README, COPYING and CREDITS in the root of the source
* tree for related information and legal notices. It is expected
* that future projects/authors will amend these files as needed.
*
* ---
*
* plane.h: Definitions for planes and plane types
*
* Known contributors to this file:
* Dave Pare, 1986
* Ken Stevens, 1995
* Steve McClure, 1998
* Markus Armbruster, 2004-2008
*/
#ifndef PLANE_H
#define PLANE_H
#include <time.h>
#include "queue.h"
#include "types.h"
#define PLN_TYPE_MAX 46
#define PLANE_MINEFF 10
struct plnstr {
/* initial part must match struct empobj */
short ef_type;
short pln_uid; /* plane unit id */
unsigned pln_seqno;
time_t pln_timestamp; /* Last time this plane was touched */
natid pln_own; /* owning country */
coord pln_x; /* plane x-y */
coord pln_y;
signed char pln_type; /* index in plchr[] */
signed char pln_effic; /* actually "training" */
signed char pln_mobil; /* plane mobility */
unsigned char pln_off; /* repairs stopped? */
short pln_tech; /* plane's tech level */
char pln_wing; /* like fleet */
coord pln_opx; /* Op sector coords */
coord pln_opy; /* Op sector coords */
short pln_mission; /* mission code */
short pln_radius; /* mission radius */
/* end of part matching struct empobj */
unsigned char pln_range; /* total distance, not radius */
short pln_ship; /* pointer to carrier */
short pln_land; /* pointer to carrier */
signed char pln_harden; /* for missiles */
signed char pln_flags; /* State of the plane */
short pln_access; /* Last tick mob was updated (MOB_ACCESS) */
float pln_theta; /* position in orbital sine wave */
};
#define PLN_LAUNCHED bit(0) /* Flying (satellite: in orbit) */
#define PLN_SYNCHRONOUS bit(1) /* A satellite in geo-synchronous orbit */
#define PLN_AIRBURST bit(2) /* Airburst the nuke we're armed with */
struct plchrstr {
char *pl_name; /* full name of type of plane */
int pl_lcm; /* costs to build */
int pl_hcm;
int pl_cost;
int pl_tech; /* tech needed to build */
int pl_acc; /* bombing accuracy (higher the better) */
int pl_load; /* bomb load, also for carrying cargo */
int pl_att; /* air-air attack/defense strengths */
int pl_def;
int pl_range; /* how many sectors it can fly */
int pl_crew; /* number of mil to crew it */
int pl_fuel; /* fuel consumption */
int pl_stealth; /* how stealthy is it? */
int pl_flags; /* description of capability */
signed char pl_type; /* index in plchr[] */
};
#define P_B bit(0) /* bombing factor only for bombing */
#define P_T bit(1) /* tactical bombing ability */
#define P_F bit(2) /* interceptor/escort */
#define P_C bit(3) /* bombing factor for transport only */
#define P_V bit(4) /* vtol ability */
#define P_M bit(5) /* missile, used only once, can't be intercepted */
#define P_L bit(6) /* light plane, lands on carriers */
#define P_S bit(7) /* Spy ability */
#define P_I bit(8) /* Imaging ability (advanced spying) */
#define P_O bit(9) /* Orbital ability (a satellite) */
#define P_X bit(10) /* Stealth ability */
#define P_N bit(11) /* Nuclear RV interceptor (abm) */
#define P_H bit(12) /* Half stealthy */
#define P_E bit(13) /* extra light */
#define P_K bit(14) /* chopper */
#define P_A bit(15) /* ASW (Anti-Sub Warfare) */
#define P_P bit(16) /* paradropping */
#define P_ESC bit(17) /* escort */
#define P_MINE bit(18) /* can lay mines */
#define P_SWEEP bit(19) /* can sweep mines */
#define P_MAR bit(20) /* missile can hit ships */
#define PM_R bit(0) /* Recon mission */
#define PM_S bit(1) /* Mine-sweeping mission */
/* internal to "fly" module -- really shouldn't be here */
struct plist {
struct emp_qelem queue; /* list of planes */
int bombs; /* bombs carried for bombing mission */
int misc; /* amount of random item being transported */
struct plchrstr *pcp; /* pointer to desc of plane */
struct plnstr plane; /* struct plane */
};
#define getplane(n, p) ef_read(EF_PLANE, (n), (p))
#define putplane(n, p) ef_write(EF_PLANE, (n), (p))
#define getplanep(n) ((struct plnstr *)ef_ptr(EF_PLANE, (n)))
extern struct plchrstr plchr[PLN_TYPE_MAX + 2];
struct shiplist {
short uid;
struct shiplist *next;
};
/* Work required for building 100% */
#define PLN_BLD_WORK(lcm, hcm) (20 + (lcm) + 2 * (hcm))
extern int pl_att(struct plchrstr *, int);
extern int pl_def(struct plchrstr *, int);
extern int pl_acc(struct plchrstr *, int);
extern int pl_range(struct plchrstr *, int);
extern int pl_load(struct plchrstr *, int);
extern int pln_att(struct plnstr *);
extern int pln_def(struct plnstr *);
extern int pln_acc(struct plnstr *);
extern int pln_range_max(struct plnstr *);
extern int pln_load(struct plnstr *);
/* src/lib/common/cargo.c */
extern void pln_carrier_change(struct plnstr *, int, int, int);
extern int pln_first_on_ship(struct shpstr *);
extern int pln_first_on_land(struct lndstr *);
extern int pln_next_on_unit(int);
/* src/lib/subs/aircombat.c */
extern int ac_flak_dam(int, int, int);
extern void ac_encounter(struct emp_qelem *, struct emp_qelem *, coord,
coord, char *, int);
/* src/lib/subs/aswplnsubs.c */
extern int on_shiplist(short, struct shiplist *);
extern void add_shiplist(short, struct shiplist **);
extern void free_shiplist(struct shiplist **);
extern void print_shiplist(struct shiplist *);
#endif