short pln_radius; /* mission radius */
/* end of part matching struct empobj */
unsigned char pln_range; /* total distance, not radius */
- unsigned char pln_range_max; /* max range for this plane */
short pln_ship; /* pointer to carrier */
short pln_land; /* pointer to carrier */
- int pln_att; /* plane air-air attack/defense values */
- int pln_def;
- int pln_acc;
- int pln_load;
- int pln_fuel; /* (unused) */
signed char pln_harden; /* for missiles */
signed char pln_nuketype; /* type of nuclear armament (if any) */
signed char pln_flags; /* State of the plane */
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/subs/aircombat.c */
extern void ac_combat_headers(natid, natid);
}
}
ncp = &nchr[nuke.nuk_type];
- if (pl.pln_load < ncp->n_weight) {
+ if (pln_load(&pl) < ncp->n_weight) {
pr("A %s cannot carry %s devices!\n",
plc->pl_name, ncp->n_name);
return RET_FAIL;
natid plane_owner;
int dam;
- dam = ac_flak_dam(flak, pp->pln_def, pcp->pl_flags);
+ dam = ac_flak_dam(flak, pln_def(pp), pcp->pl_flags);
disp = 0;
plane_owner = pp->pln_own;
eff = pp->pln_effic;
plane.pln_opy = 0;
plane.pln_radius = 0;
plane.pln_range = UCHAR_MAX; /* will be adjusted by pln_set_tech() */
- plane.pln_range_max = plane.pln_range;
plane.pln_wing = 0;
plane.pln_ship = -1;
plane.pln_land = -1;
pr("No satellites there!\n");
return RET_FAIL;
}
- if (msl_hit(pp, plane.pln_def, EF_PLANE, N_SAT_KILL, N_SAT_KILL,
+ if (msl_hit(pp, pln_def(&plane), EF_PLANE, N_SAT_KILL, N_SAT_KILL,
prplane(&plane), sx, sy, plane.pln_own)) {
dam = pln_damage(pp, sx, sy, 'p', &nukedam, 1);
oldown = plane.pln_own;
pr(" %d", plane.pln_tech);
break;
case 8:
- pr(" %d", plane.pln_att);
+ pr(" %d", pln_att(&plane));
break;
case 9:
- pr(" %d", plane.pln_def);
+ pr(" %d", pln_def(&plane));
break;
case 10:
- pr(" %d", plane.pln_acc);
+ pr(" %d", pln_acc(&plane));
break;
case 11:
pr(" %d", plane.pln_range);
break;
case 12:
- pr(" %d", plane.pln_range_max);
+ pr(" %d", pln_range_max(&plane));
break;
case 13:
- pr(" %d", plane.pln_load);
+ pr(" %d", pln_load(&plane));
break;
case 14:
pr(" %d", plchr[(int)plane.pln_type].pl_fuel);
prxy("%4d,%-4d", plane.pln_x, plane.pln_y, player->cnum);
pr(" %1.1s %c%3d%% %3d %3d %4d %3d %3d",
&plane.pln_wing, plane.pln_off ? '!' : ' ', plane.pln_effic,
- plane.pln_mobil, plane.pln_def, plane.pln_tech,
+ plane.pln_mobil, pln_def(&plane), plane.pln_tech,
plane.pln_range, plane.pln_harden);
if (plane.pln_ship >= 0)
pr("%5dS", plane.pln_ship);
pr(" %3d%% %4d %3d %3d %3d %3d %4d %4d",
plane.pln_effic,
plane.pln_tech,
- plane.pln_att,
- plane.pln_def,
- plane.pln_acc,
- plane.pln_range_max, plane.pln_load,
+ pln_att(&plane),
+ pln_def(&plane),
+ pln_acc(&plane),
+ pln_range_max(&plane), pln_load(&plane),
plchr[(int)plane.pln_type].pl_fuel);
pr("\n");
}
{
struct nstr_item np;
struct plnstr plane;
- int i;
+ int i, rmax;
char *p;
char buf[1024];
return RET_SYN;
if (!p || (i = atoi(p)) < 0)
continue;
- plane.pln_range = (plane.pln_range_max < i) ?
- plane.pln_range_max : i;
+ rmax = pln_range_max(&plane);
+ plane.pln_range = MIN(rmax, i);
pr("Plane %d range changed to %d\n",
plane.pln_uid, plane.pln_range);
pcp = ip->pcp;
if (!(pcp->pl_flags & P_A)) /* if it isn't an ASW plane */
continue;
- range = (int)techfact(pp->pln_tech, (100.0 - pp->pln_acc) / 10.0);
+ range = (int)techfact(pp->pln_tech, (100.0 - pln_acc(pp)) / 10.0);
for (i = 0; getship(i, &s); i++) {
targ = &s;
if (targ->shp_own == pp->pln_own || targ->shp_own == 0)
#include "product.h"
static void *nsc_ver(struct valstr *, natid, void *);
+static void *nsc_pln_att(struct valstr *, natid, void *);
+static void *nsc_pln_def(struct valstr *, natid, void *);
/* Ugly hack to improve legibility by avoid long lines */
#define fldoff(fld) offsetof(CURSTR, fld)
{"range", fldoff(pln_range), NSC_UCHAR, 0, NULL, EF_BAD, 0},
{"ship", fldoff(pln_ship), NSC_SHORT, 0, NULL, EF_BAD, 0},
{"land", fldoff(pln_land), NSC_SHORT, 0, NULL, EF_BAD, 0},
- {"att", fldoff(pln_att), NSC_INT, 0, NULL, EF_BAD, NSC_EXTRA},
- {"def", fldoff(pln_def), NSC_INT, 0, NULL, EF_BAD, NSC_EXTRA},
{"harden", fldoff(pln_harden), NSC_CHAR, 0, NULL, EF_BAD, 0},
{"nuketype", fldoff(pln_nuketype), NSC_CHAR, 0, NULL, EF_BAD, 0},
{"flags", fldoff(pln_flags), NSC_CHAR, 0, NULL,
{"timestamp", fldoff(pln_timestamp), NSC_TIME, 0, NULL,
EF_BAD, NSC_EXTRA},
{"theta", fldoff(pln_theta), NSC_FLOAT, 0, NULL, EF_BAD, 0},
+ {"att", 0, NSC_LONG, 0, nsc_pln_att, EF_BAD, NSC_EXTRA},
+ {"def", 0, NSC_LONG, 0, nsc_pln_def, EF_BAD, NSC_EXTRA},
{NULL, 0, NSC_NOTYPE, 0, NULL, EF_BAD, 0}
#undef CURSTR
};
val->val_as.sym.get = NULL;
return kp->km_data;
}
+
+static void *
+nsc_pln_def(struct valstr *val, natid cnum, void *ptr)
+{
+ val->val_as.lng = pln_def(ptr);;
+ return NULL;
+}
+
+static void *
+nsc_pln_att(struct valstr *val, natid cnum, void *ptr)
+{
+ val->val_as.lng = pln_att(ptr);
+ return NULL;
+}
{
return PLN_LOAD(pcp->pl_load, MAX(0, tech - pcp->pl_tech));
}
+
+int
+pln_att(struct plnstr *pp)
+{
+ return pl_att(plchr + pp->pln_type, pp->pln_tech);
+}
+
+int
+pln_def(struct plnstr *pp)
+{
+ return pl_def(plchr + pp->pln_type, pp->pln_tech);
+}
+
+int
+pln_acc(struct plnstr *pp)
+{
+ return pl_acc(plchr + pp->pln_type, pp->pln_tech);
+}
+
+int
+pln_range_max(struct plnstr *pp)
+{
+ return pl_range(plchr + pp->pln_type, pp->pln_tech);
+}
+
+int
+pln_load(struct plnstr *pp)
+{
+ return pl_load(plchr + pp->pln_type, pp->pln_tech);
+}
PR(def_own, " %3.3s #%-4d %3.3s #%-4d",
dp->pcp->pl_name,
dp->plane.pln_uid, ap->pcp->pl_name, ap->plane.pln_uid);
- if (ap->plane.pln_att == 0) {
- att = ap->plane.pln_def * ap->plane.pln_effic / 100;
- att = MAX(att, ap->pcp->pl_def / 2);
- } else {
- att = ap->plane.pln_att * ap->plane.pln_effic / 100;
- att = MAX(att, ap->pcp->pl_att / 2);
- }
+ att = pln_att(&ap->plane);
+ if (att == 0)
+ att = pln_def(&ap->plane);
+ att = att * ap->plane.pln_effic / 100;
+ att = MAX(att, ap->pcp->pl_def / 2);
- def = dp->plane.pln_def * dp->plane.pln_effic / 100;
+ def = pln_def(&dp->plane) * dp->plane.pln_effic / 100;
def = MAX(def, dp->pcp->pl_def / 2);
if ((ap->pcp->pl_flags & P_F) && ap->bombs != 0)
for (qp = list->q_forw; qp != list; qp = next) {
next = qp->q_forw;
plp = (struct plist *)qp;
- n = ac_flak_dam(guns, plp->plane.pln_def, plp->pcp->pl_flags);
+ n = ac_flak_dam(guns, pln_def(&plp->plane), plp->pcp->pl_flags);
ac_planedamage(plp, from, n, 0, 2, 1, msg);
}
}
{
struct plchrstr *pcp;
struct plnstr *pp;
- int needed;
+ int load, needed;
struct lndstr land;
struct shpstr ship;
struct sctstr sect;
item[I_PETROL] -= pcp->pl_fuel;
rval = 0;
if (!(flags & P_F)) {
+ load = pln_load(pp);
itype = I_NONE;
needed = 0;
switch (mission) {
case 'p':
if (pp->pln_nuketype == -1) {
itype = I_SHELL;
- needed = pp->pln_load;
+ needed = load;
}
break;
case 't':
if ((pcp->pl_flags & P_C) == 0 || ip == 0)
break;
itype = ip->i_uid;
- needed = (pp->pln_load * 2) / ip->i_lbs;
+ needed = (load * 2) / ip->i_lbs;
break;
case 'd':
if ((pcp->pl_flags & P_C) == 0 || ip == 0)
break;
itype = ip->i_uid;
- needed = (pp->pln_load * 2) / ip->i_lbs;
+ needed = (load * 2) / ip->i_lbs;
break;
case 'a':
if ((pcp->pl_flags & (P_V | P_C)) == 0)
break;
itype = I_MILIT;
- needed = pp->pln_load / ip->i_lbs;
+ needed = load / ip->i_lbs;
break;
case 'n':
if (pp->pln_nuketype == -1)
rval = -1;
break;
case 'i': /* missile interception */
- if (pp->pln_load) {
+ if (load) {
itype = I_SHELL;
- needed = pp->pln_load;
+ needed = load;
}
break;
default:
{
struct plchrstr *pcp;
struct plnstr *pp;
- int needed;
+ int load, needed;
struct lndstr land;
struct shpstr ship;
struct sctstr sect;
item[I_PETROL] -= pcp->pl_fuel;
rval = 0;
if ((flags & P_F) == 0) {
+ load = pln_load(pp);
itype = I_NONE;
needed = 0;
switch (mission) {
case 'p':
if (pp->pln_nuketype == -1) {
itype = I_SHELL;
- needed = pp->pln_load;
+ needed = load;
}
break;
case 't':
if ((pcp->pl_flags & P_C) == 0 || ip == 0)
break;
itype = ip->i_uid;
- needed = (pp->pln_load * 2) / ip->i_lbs;
+ needed = (load * 2) / ip->i_lbs;
break;
case 'm':
if ((pcp->pl_flags & P_MINE) == 0)
break;
itype = I_SHELL;
- needed = (pp->pln_load * 2) / ip->i_lbs;
+ needed = (load * 2) / ip->i_lbs;
break;
case 'a':
if ((pcp->pl_flags & (P_V | P_C)) == 0)
break;
itype = I_MILIT;
- needed = pp->pln_load / ip->i_lbs;
+ needed = load / ip->i_lbs;
break;
case 'n':
if (pp->pln_nuketype == -1)
if (!(pcp->pl_flags & P_SWEEP)) /* if it isn't an sweep plane */
continue;
- if (chance((100.0 - pp->pln_acc) / 100.0)) {
+ if (chance((100.0 - pln_acc(pp)) / 100.0)) {
pr("Sweep! in %s\n",
xyas(sect.sct_x, sect.sct_y, pp->pln_own));
mines_there--;
struct plchrstr *pcp = plchr + pp->pln_type;
double tfact = (double)(pp->pln_tech - pcp->pl_tech) /
(pp->pln_tech - pcp->pl_tech / 2);
- int acc = pp->pln_acc;
+ int acc = pln_acc(pp);
int hitchance;
if (type == EF_SHIP) {
{
struct nukstr nuke;
struct plchrstr *pcp = plchr + pp->pln_type;
- int i;
+ int load, i;
int hitroll;
int dam = 0;
int aim;
}
*nukedamp = 0;
- if (!pp->pln_load) /* e.g. ab, blowing up on launch pad */
+ load = pln_load(pp);
+ if (!load) /* e.g. ab, blowing up on launch pad */
return 0;
- i = roll(pp->pln_load) + 1;
- if (i > pp->pln_load)
- i = pp->pln_load;
+ i = roll(load) + 1;
+ if (i > load)
+ i = load;
if (pcp->pl_flags & P_M) {
if (pcp->pl_flags & P_MAR)
} else if (pcp->pl_flags & P_T)
pinbomber = 1;
- aim = 100 - pp->pln_acc;
+ aim = pln_acc(pp);
if (type == 's') {
- if (pinbomber) {
- aim = pp->pln_acc;
- effective = 0;
- }
- aim += 30;
+ effective = !pinbomber;
+ aim = 30 + (pinbomber ? aim : 100 - aim);
} else {
- if (!pinbomber) {
- effective = 0;
- }
+ effective = pinbomber;
+ aim = 100 - aim;
}
+
while (i--) {
dam += roll(6);
hitroll = roll(100);
if ((flags & P_F) || (flags & P_ESC))
cost /= 2;
- return ldround(cost * dist / pp->pln_range_max + 5, 1);
+ return ldround(cost * dist / pln_range_max(pp) + 5, 1);
}
/*
pln_set_tech(struct plnstr *pp, int tlev)
{
struct plchrstr *pcp = plchr + pp->pln_type;
- int limited_range = pp->pln_range < pp->pln_range_max;
+ int limited_range = pp->pln_range < pln_range_max(pp);
+ int range_max;
if (CANT_HAPPEN(tlev < pcp->pl_tech))
tlev = pcp->pl_tech;
-
pp->pln_tech = tlev;
- pp->pln_att = pl_att(pcp, tlev);
- pp->pln_def = pl_def(pcp, tlev);
- pp->pln_acc = pl_acc(pcp, tlev);
- pp->pln_range_max = pl_range(pcp, tlev);
- pp->pln_load = pl_load(pcp, tlev);
-
- if (!limited_range || pp->pln_range > pp->pln_range_max)
- pp->pln_range = pp->pln_range_max;
+
+ range_max = pln_range_max(pp);
+ if (!limited_range || pp->pln_range > range_max)
+ pp->pln_range = range_max;
}