short lnd_land; /* pointer to transporting unit */
unsigned char lnd_nland;
short lnd_access; /* Last tick mob was updated (MOB_ACCESS) */
- float lnd_att; /* attack multiplier */
- float lnd_def; /* defense multiplier */
- int lnd_vul; /* vulnerability (0-100) */
- int lnd_spd; /* speed */
- int lnd_vis; /* visibility */
int lnd_spy; /* Seeing distance */
int lnd_rad; /* reaction radius */
- int lnd_frg; /* firing range */
- int lnd_acc; /* firing accuracy */
- int lnd_dam; /* # of guns firing */
int lnd_ammo; /* firing ammu used per shot */
- int lnd_aaf; /* aa fire */
unsigned char lnd_fuelc; /* fuel capacity */
unsigned char lnd_fuelu; /* fuel used per 10 mob */
unsigned char lnd_maxlight; /* maximum number of xlight planes */
extern int l_acc(struct lchrstr *, int);
extern int l_dam(struct lchrstr *, int);
extern int l_aaf(struct lchrstr *, int);
+extern float lnd_att(struct lndstr *);
+extern float lnd_def(struct lndstr *);
+extern int lnd_vul(struct lndstr *);
+extern int lnd_spd(struct lndstr *);
+extern int lnd_vis(struct lndstr *);
+extern int lnd_frg(struct lndstr *);
+extern int lnd_acc(struct lndstr *);
+extern int lnd_dam(struct lndstr *);
+extern int lnd_aaf(struct lndstr *);
extern int lnd_fire(struct lndstr *);
extern double lnd_fire_range(struct lndstr *);
struct lndstr land;
struct emp_qelem *qp;
int unitno;
- int ignore, flak, hitchance;
+ int ignore, aaf, flak, hitchance;
struct plist *plp;
int nukedam;
int nunits;
if (unitno < 0)
continue;
- flak = (int)(techfact(land.lnd_tech, land.lnd_aaf) * 3.0);
+ aaf = lnd_aaf(&land);
+ flak = (int)(techfact(land.lnd_tech, aaf) * 3.0);
if (flak) {
PR(land.lnd_own,
"Flak! Firing flak guns from unit %s (aa rating %d)\n",
- prland(&land), land.lnd_aaf);
+ prland(&land), aaf);
if (pinflak_planedamage(&plp->plane, plp->pcp, land.lnd_own, flak))
continue;
}
pr(" %d", land.lnd_item[I_RAD]);
break;
case 28:
- pr(" %1.2f", land.lnd_att);
+ pr(" %1.2f", lnd_att(&land));
break;
case 29:
- pr(" %1.2f", land.lnd_def);
+ pr(" %1.2f", lnd_def(&land));
break;
case 30:
- pr(" %d", land.lnd_vul);
+ pr(" %d", lnd_vul(&land));
break;
case 31:
- pr(" %d", land.lnd_spd);
+ pr(" %d", lnd_spd(&land));
break;
case 32:
- pr(" %d", land.lnd_vis);
+ pr(" %d", lnd_vis(&land));
break;
case 33:
pr(" %d", land.lnd_spy);
pr(" %d", land.lnd_rad);
break;
case 35:
- pr(" %d", land.lnd_frg);
+ pr(" %d", lnd_frg(&land));
break;
case 36:
- pr(" %d", land.lnd_acc);
+ pr(" %d", lnd_acc(&land));
break;
case 37:
- pr(" %d", land.lnd_dam);
+ pr(" %d", lnd_dam(&land));
break;
case 38:
pr(" %d", land.lnd_ammo);
break;
case 39:
- pr(" %d", land.lnd_aaf);
+ pr(" %d", lnd_aaf(&land));
break;
case 40:
pr(" %d", land.lnd_item[I_UW]);
if (!(chance(LND_SPY_DETECT_CHANCE(lp->lnd_effic))))
continue;
}
- vrange = ldround((lp->lnd_vis * range) / 20.0, 1);
+ vrange = ldround((lnd_vis(lp) * range) / 20.0, 1);
dist = mapdist(lp->lnd_x, lp->lnd_y,
lookland->lnd_x, lookland->lnd_y);
if (dist > vrange)
pr("%4d %-16.16s ", land.lnd_uid, lchr[(int)land.lnd_type].l_name);
prxy("%4d,%-4d", land.lnd_x, land.lnd_y, player->cnum);
pr(" %3d%% %3d %1.1f %1.1f %3d ",
- land.lnd_effic, land.lnd_tech, land.lnd_att, land.lnd_def,
- land.lnd_vul);
+ land.lnd_effic, land.lnd_tech, lnd_att(&land), lnd_def(&land),
+ lnd_vul(&land));
pr("%2d %2d %2d %2d ",
- land.lnd_spd, land.lnd_vis, land.lnd_spy, land.lnd_rad);
+ lnd_spd(&land), lnd_vis(&land), land.lnd_spy, land.lnd_rad);
pr("%2d %2d %2d %2d %2d ",
- land.lnd_frg,
- land.lnd_acc, land.lnd_dam, land.lnd_ammo, land.lnd_aaf);
+ lnd_frg(&land),
+ lnd_acc(&land), lnd_dam(&land), land.lnd_ammo, lnd_aaf(&land));
pr("\n");
}
if (nunits == 0) {
if (item.land.lnd_own != player->cnum)
continue;
- if (fland.lnd_dam == 0) {
+ if (lchr[fland.lnd_type].l_dam == 0) {
pr("Unit %d cannot fire!\n", fland.lnd_uid);
continue;
}
fx = fland.lnd_x;
fy = fland.lnd_y;
- if (fland.lnd_dam == 0) {
+ if (lchr[fland.lnd_type].l_dam == 0) {
pr("Unit %d cannot fire!\n", fland.lnd_uid);
continue;
}
continue;
}
if (target == targ_ship) {
- if (chance(fland.lnd_acc / 100.0))
+ if (chance(lnd_acc(&fland) / 100.0))
dam = ldround(dam / 2.0, 1);
}
} else {
{
return LND_AAF(lcp->l_aaf, MAX(0, tech - lcp->l_tech));
}
+
+float
+lnd_att(struct lndstr *lp)
+{
+ return l_att(lchr + lp->lnd_type, lp->lnd_tech);
+}
+
+float
+lnd_def(struct lndstr *lp)
+{
+ return l_def(lchr + lp->lnd_type, lp->lnd_tech);
+}
+
+int
+lnd_vul(struct lndstr *lp)
+{
+ return l_vul(lchr + lp->lnd_type, lp->lnd_tech);
+}
+
+int
+lnd_spd(struct lndstr *lp)
+{
+ return l_spd(lchr + lp->lnd_type, lp->lnd_tech);
+}
+
+int
+lnd_vis(struct lndstr *lp)
+{
+ return lchr[lp->lnd_type].l_vis;
+}
+
+int
+lnd_frg(struct lndstr *lp)
+{
+ return l_frg(lchr + lp->lnd_type, lp->lnd_tech);
+}
+
+int
+lnd_acc(struct lndstr *lp)
+{
+ return l_acc(lchr + lp->lnd_type, lp->lnd_tech);
+}
+
+int
+lnd_dam(struct lndstr *lp)
+{
+ return l_dam(lchr + lp->lnd_type, lp->lnd_tech);
+}
+
+int
+lnd_aaf(struct lndstr *lp)
+{
+ return l_aaf(lchr + lp->lnd_type, lp->lnd_tech);
+}
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 *);
+static void *nsc_lnd_att(struct valstr *, natid, void *);
+static void *nsc_lnd_def(struct valstr *, natid, void *);
+static void *nsc_lnd_vul(struct valstr *, natid, void *);
+static void *nsc_lnd_spd(struct valstr *, natid, void *);
+static void *nsc_lnd_vis(struct valstr *, natid, void *);
+static void *nsc_lnd_frg(struct valstr *, natid, void *);
+static void *nsc_lnd_acc(struct valstr *, natid, void *);
+static void *nsc_lnd_dam(struct valstr *, natid, void *);
+static void *nsc_lnd_aaf(struct valstr *, natid, void *);
/* Ugly hack to improve legibility by avoid long lines */
#define fldoff(fld) offsetof(CURSTR, fld)
{"land", fldoff(lnd_land), NSC_SHORT, 0, NULL, EF_BAD, 0},
{"nland", fldoff(lnd_nland), NSC_UCHAR, 0, NULL, EF_BAD, NSC_EXTRA},
{"access", fldoff(lnd_access), NSC_SHORT, 0, NULL, EF_BAD, 0},
- {"att", fldoff(lnd_att), NSC_FLOAT, 0, NULL, EF_BAD, NSC_EXTRA},
- {"def", fldoff(lnd_def), NSC_FLOAT, 0, NULL, EF_BAD, NSC_EXTRA},
- {"vul", fldoff(lnd_vul), NSC_INT, 0, NULL, EF_BAD, NSC_EXTRA},
- {"spd", fldoff(lnd_spd), NSC_INT, 0, NULL, EF_BAD, NSC_EXTRA},
- {"vis", fldoff(lnd_vis), NSC_INT, 0, NULL, EF_BAD, NSC_EXTRA},
{"spy", fldoff(lnd_spy), NSC_INT, 0, NULL, EF_BAD, NSC_EXTRA},
{"rmax", fldoff(lnd_rad), NSC_INT, 0, NULL, EF_BAD, NSC_EXTRA},
- {"frg", fldoff(lnd_frg), NSC_INT, 0, NULL, EF_BAD, NSC_EXTRA},
- {"acc", fldoff(lnd_acc), NSC_INT, 0, NULL, EF_BAD, NSC_EXTRA},
- {"dam", fldoff(lnd_dam), NSC_INT, 0, NULL, EF_BAD, NSC_EXTRA},
{"ammo", fldoff(lnd_ammo), NSC_INT, 0, NULL, EF_BAD, NSC_EXTRA},
- {"aaf", fldoff(lnd_aaf), NSC_INT, 0, NULL, EF_BAD, NSC_EXTRA},
{"fuelc", fldoff(lnd_fuelc), NSC_UCHAR, 0, NULL, EF_BAD, NSC_EXTRA},
{"fuelu", fldoff(lnd_fuelu), NSC_UCHAR, 0, NULL, EF_BAD, NSC_EXTRA},
{"maxlight", fldoff(lnd_maxlight), NSC_UCHAR, 0, NULL,
EF_BAD, NSC_EXTRA},
{"timestamp", fldoff(lnd_timestamp), NSC_TIME, 0, NULL,
EF_BAD, NSC_EXTRA},
+ {"att", 0, NSC_DOUBLE, 0, nsc_lnd_att, EF_BAD, NSC_EXTRA},
+ {"def", 0, NSC_DOUBLE, 0, nsc_lnd_def, EF_BAD, NSC_EXTRA},
+ {"vul", 0, NSC_LONG, 0, nsc_lnd_vul, EF_BAD, NSC_EXTRA},
+ {"spd", 0, NSC_LONG, 0, nsc_lnd_spd, EF_BAD, NSC_EXTRA},
+ {"vis", 0, NSC_LONG, 0, nsc_lnd_vis, EF_BAD, NSC_EXTRA},
+ {"frg", 0, NSC_LONG, 0, nsc_lnd_frg, EF_BAD, NSC_EXTRA},
+ {"acc", 0, NSC_LONG, 0, nsc_lnd_acc, EF_BAD, NSC_EXTRA},
+ {"dam", 0, NSC_LONG, 0, nsc_lnd_dam, EF_BAD, NSC_EXTRA},
+ {"aaf", 0, NSC_LONG, 0, nsc_lnd_aaf, EF_BAD, NSC_EXTRA},
{NULL, 0, NSC_NOTYPE, 0, NULL, EF_BAD, 0}
#undef CURSTR
};
val->val_as.lng = pln_att(ptr);
return NULL;
}
+
+static void *
+nsc_lnd_att(struct valstr *val, natid cnum, void *ptr)
+{
+ val->val_as.dbl = lnd_att(ptr);
+ return NULL;
+}
+
+static void *
+nsc_lnd_def(struct valstr *val, natid cnum, void *ptr)
+{
+ val->val_as.dbl = lnd_def(ptr);
+ return NULL;
+}
+
+static void *
+nsc_lnd_vul(struct valstr *val, natid cnum, void *ptr)
+{
+ val->val_as.lng = lnd_vul(ptr);
+ return NULL;
+}
+
+static void *
+nsc_lnd_spd(struct valstr *val, natid cnum, void *ptr)
+{
+ val->val_as.lng = lnd_spd(ptr);
+ return NULL;
+}
+
+static void *
+nsc_lnd_vis(struct valstr *val, natid cnum, void *ptr)
+{
+ val->val_as.lng = lnd_vis(ptr);
+ return NULL;
+}
+
+static void *
+nsc_lnd_frg(struct valstr *val, natid cnum, void *ptr)
+{
+ val->val_as.lng = lnd_frg(ptr);
+ return NULL;
+}
+
+static void *
+nsc_lnd_acc(struct valstr *val, natid cnum, void *ptr)
+{
+ val->val_as.lng = lnd_acc(ptr);
+ return NULL;
+}
+
+static void *
+nsc_lnd_dam(struct valstr *val, natid cnum, void *ptr)
+{
+ val->val_as.lng = lnd_dam(ptr);
+ return NULL;
+}
+
+static void *
+nsc_lnd_aaf(struct valstr *val, natid cnum, void *ptr)
+{
+ val->val_as.lng = lnd_aaf(ptr);
+ return NULL;
+}
struct lndstr land;
struct lchrstr *lcp;
double flak, total, ngun;
- int gun;
+ int aaf, gun;
int rel;
struct plist *plp;
natid plane_owner;
if (land.lnd_own == 0 || land.lnd_own == plane_owner)
continue;
lcp = &lchr[(int)land.lnd_type];
- if ((lcp->l_flags & L_FLAK) == 0 || land.lnd_aaf == 0)
+ aaf = lnd_aaf(&land);
+ if ((lcp->l_flags & L_FLAK) == 0 || aaf == 0)
continue;
if (land.lnd_ship >= 0 || land.lnd_land >= 0)
continue;
rel = getrel(getnatp(land.lnd_own), plane_owner);
if (rel > HOSTILE)
continue;
- flak = land.lnd_aaf * 1.5 * land.lnd_effic / 100.0;
+ flak = aaf * 1.5 * land.lnd_effic / 100.0;
ngun += flak;
total += techfact(land.lnd_tech, flak * 2.0);
nats[land.lnd_own] = 1;
}
PR(land.lnd_own, "firing flak guns from unit %s (aa rating %d)\n",
- prland(&land), land.lnd_aaf);
+ prland(&land), aaf);
from = land.lnd_own;
}
damage_factor = m / (m + lp->lnd_harden);
/* vulnerable units take more damage */
- damage_factor *= lp->lnd_vul / 100.0;
+ damage_factor *= lnd_vul(lp) / 100.0;
land_damage(lp, ldround(damage_factor * dam, 1));
}
return -1;
if (lp->lnd_item[I_MILIT] == 0)
return -1;
- guns = lp->lnd_dam;
+ guns = lnd_dam(lp);
guns = MIN(guns, lp->lnd_item[I_GUN]);
if (guns == 0)
return -1;
double
lnd_fire_range(struct lndstr *lp)
{
- return effrange(lp->lnd_frg, lp->lnd_tech);
+ return effrange(lnd_frg(lp), lp->lnd_tech);
}
int
return 1;
men = lp->lnd_item[I_MILIT];
- value = men * lp->lnd_att * lp->lnd_effic / 100.0;
+ value = men * lnd_att(lp) * lp->lnd_effic / 100.0;
switch (combat_mode) {
case A_ATTACK:
!(lcp->l_flags & L_MARINE))
return men;
- value = men * lp->lnd_def * lp->lnd_effic / 100.0;
+ value = men * lnd_def(lp) * lp->lnd_effic / 100.0;
value *= ((double)land_mob_max + lp->lnd_harden) / land_mob_max;
/* If there are military on the unit, you get at least a 1
intelligence_report(int destination, struct lndstr *lp, int spy,
char *mess)
{
- struct lchrstr *lcp;
+ int vis = lnd_vis(lp);
char buf1[80], buf2[80], buf3[80];
if (destination == 0)
if (lp->lnd_own == 0)
return;
- lcp = &lchr[(int)lp->lnd_type];
-
memset(buf1, 0, sizeof(buf1));
memset(buf2, 0, sizeof(buf2));
memset(buf3, 0, sizeof(buf3));
- if (chance((spy + lp->lnd_vis) / 10.0)) {
+ if (chance((spy + vis) / 10.0)) {
if (destination == player->cnum)
pr("%s %s", mess, prland(lp));
else
sprintf(buf1, "%s %s", mess, prland(lp));
- if (chance((spy + lp->lnd_vis) / 20.0)) {
+ if (chance((spy + vis) / 20.0)) {
if (destination == player->cnum)
pr(" (eff %d, mil %d",
roundintby(lp->lnd_effic, 5),
roundintby(lp->lnd_effic, 5),
roundintby(lp->lnd_item[I_MILIT], 10));
- if (chance((spy + lp->lnd_vis) / 20.0)) {
+ if (chance((spy + vis) / 20.0)) {
int t;
t = lp->lnd_tech - 20 + roll(40);
t = MAX(t, 0);
getsect(lp->lnd_x, lp->lnd_y, §);
return (int)((lp->lnd_effic / 100.0) *
- (10 + dchr[sect.sct_type].d_dstr * 2 + lp->lnd_spd / 2.0
- - lp->lnd_vis));
+ (10 + dchr[sect.sct_type].d_dstr * 2 + lnd_spd(lp) / 2.0
+ - lnd_vis(lp)));
}
static int
{
double effspd;
- effspd = lp->lnd_spd;
+ effspd = lnd_spd(lp);
if (lchr[(int)lp->lnd_type].l_flags & L_SUPPLY)
effspd *= lp->lnd_effic * 0.01;
nreport(land.lnd_own, N_FIRE_BACK, victim, 1);
else
nreport(land.lnd_own, N_FIRE_L_ATTACK, victim, 1);
- if (roll(100) < land.lnd_acc)
+ if (roll(100) < lnd_acc(&land))
dam2 /= 2;
dam += dam2;
if (land.lnd_own != attacker)
tlev = 0;
lp->lnd_tech = tlev;
- lp->lnd_att = l_att(lcp, tlev);
- lp->lnd_def = l_def(lcp, tlev);
- lp->lnd_vul = l_vul(lcp, tlev);
- lp->lnd_spd = l_spd(lcp, tlev);
- lp->lnd_vis = lcp->l_vis;
lp->lnd_spy = lcp->l_spy;
lp->lnd_rad = lcp->l_rad;
- lp->lnd_frg = l_frg(lcp, tlev);
- lp->lnd_acc = l_acc(lcp, tlev);
- lp->lnd_dam = l_dam(lcp, tlev);
lp->lnd_ammo = lcp->l_ammo;
- lp->lnd_aaf = lcp->l_aaf;
lp->lnd_fuelc = lcp->l_fuelc;
lp->lnd_fuelu = lcp->l_fuelu;
lp->lnd_maxlight = lcp->l_nxlight;
continue;
if (sect.sct_type == SCT_WATER) {
- if (chance(lp->lnd_acc / 100.0))
+ if (chance(lnd_acc(lp) / 100.0))
dam2 = ldround(dam2 / 2.0, 1);
}
dam += dam2;