unsigned char sct_defense; /* Defensive value of a sector */
};
-enum d_navigation {
- NAV_NONE, /* ships can't navigate */
- NAVOK, /* ships can always navigate */
- NAV_02, /* requires 2% effic to navigate */
- NAV_CANAL, /* requires 2% effic to navigate and M_CANAL capability */
- NAV_60 /* requires 60% effic to navigate */
-};
-
struct dchrstr {
unsigned char d_uid;
char d_mnem; /* map symbol */
/* Work required for building 100% */
#define SHP_BLD_WORK(lcm, hcm) (20 + (lcm) + 2 * (hcm))
- /* return codes from shp_check_nav */
-#define CN_NAVIGABLE 0
-#define CN_LANDLOCKED 1
-#define CN_CONSTRUCTION 2
-#define CN_ERROR -1
-
enum {
SHP_AIROPS_EFF = 50, /* min. efficiency for air ops */
SHP_TORP_SHELLS = 3 /* number of shells used by a torpedo */
extern void shp_sel(struct nstr_item *, struct emp_qelem *);
extern void shp_nav(struct emp_qelem *, double *, double *, int *, natid);
extern int shp_sweep(struct emp_qelem *, int, int, natid);
-extern int shp_check_nav(struct sctstr *, struct shpstr *);
+extern enum d_navigation shp_check_nav(struct shpstr *, struct sctstr *);
extern int sect_has_dock(struct sctstr *);
extern int shp_hardtarget(struct shpstr *);
extern int shp_nav_one_sector(struct emp_qelem *, int, natid, int);
typedef unsigned char natid; /* NSC_NATID must match this */
typedef short coord;
+enum d_navigation {
+ NAV_NONE, /* ships can't navigate */
+ NAVOK, /* ships can always navigate */
+ NAV_02, /* requires 2% effic to navigate */
+ NAV_CANAL, /* requires 2% effic to navigate and M_CANAL capability */
+ NAV_60 /* requires 60% effic to navigate */
+};
+
struct bp;
struct emp_qelem;
struct empobj;
}
getsect(sp->shp_x, sp->shp_y, §);
- switch (shp_check_nav(§, sp)) {
- case CN_CONSTRUCTION:
+ switch (shp_check_nav(sp, §)) {
+ case NAV_02:
+ case NAV_60:
wu(0, sp->shp_own,
"%s %s,\nbut was caught in a construction zone, and couldn't retreat!\n",
prship(sp), conditions[findcondition(code)].desc[orig]);
if (!orig)
putship(sp->shp_uid, sp);
return 0;
- case CN_LANDLOCKED:
+ case NAV_NONE:
+ case NAV_CANAL:
wu(0, sp->shp_own,
"%s %s,\nbut was landlocked, and couldn't retreat!\n",
prship(sp), conditions[findcondition(code)].desc[orig]);
if (!orig)
putship(sp->shp_uid, sp);
return 0;
- case CN_NAVIGABLE:
+ case NAVOK:
break;
- case CN_ERROR:
default:
+ CANT_REACH();
wu(0, sp->shp_own,
"%s %s,\nbut was subject to an empire error, and couldn't retreat!\n",
prship(sp), conditions[findcondition(code)].desc[orig]);
mobcost = shp_mobcost(sp);
getsect(newx, newy, §);
- if (shp_check_nav(§, sp) != CN_NAVIGABLE ||
+ if (shp_check_nav(sp, §) != NAVOK ||
(sect.sct_own
&& relations_with(sect.sct_own, sp->shp_own) < FRIENDLY)) {
wu(0, sp->shp_own, "%s %s,\nbut could not retreat to %s!\n",
shp_stays(actor, "was sucked into the sky by a strange looking spaceship", mlp); /* heh -KHS */
continue;
}
- switch (shp_check_nav(§, sp)) {
- case CN_CONSTRUCTION:
+ switch (shp_check_nav(sp, §)) {
+ case NAV_02:
+ case NAV_60:
shp_stays(actor, "is caught in a construction zone", mlp);
continue;
- case CN_LANDLOCKED:
+ case NAV_NONE:
+ case NAV_CANAL:
shp_stays(actor, "is landlocked", mlp);
continue;
- case CN_NAVIGABLE:
+ case NAVOK:
break;
- case CN_ERROR:
default:
+ CANT_REACH();
shp_stays(actor, "was just swallowed by a big green worm", mlp);
continue;
}
free(mlp);
}
-int
-shp_check_nav(struct sctstr *sect, struct shpstr *shp)
+/*
+ * Can SP navigate in SECTP?
+ * Sector ownership is *not* considered!
+ * Return NAVOK when yes.
+ * Return NAV_02 when it could if the sector was at least 2% efficient.
+ * Return NAV_60 when it could if the sector was at least 60% efficient.
+ * Return NAV_CANAL when it lacks capability M_CANAL.
+ * Return NAV_NONE when this sector type isn't navigable at all.
+ */
+enum d_navigation
+shp_check_nav(struct shpstr *sp, struct sctstr *sectp)
{
- switch (dchr[sect->sct_type].d_nav) {
+ switch (dchr[sectp->sct_type].d_nav) {
case NAVOK:
break;
case NAV_CANAL:
- if (mchr[(int)shp->shp_type].m_flags & M_CANAL) {
- if (sect->sct_effic < 2)
- return CN_CONSTRUCTION;
+ if (mchr[sp->shp_type].m_flags & M_CANAL) {
+ if (sectp->sct_effic < 2)
+ return NAV_02;
} else
- return CN_LANDLOCKED;
+ return NAV_CANAL;
break;
case NAV_02:
- if (sect->sct_effic < 2)
- return CN_CONSTRUCTION;
+ if (sectp->sct_effic < 2)
+ return NAV_02;
break;
case NAV_60:
- if (sect->sct_effic < 60)
- return CN_CONSTRUCTION;
+ if (sectp->sct_effic < 60)
+ return NAV_60;
break;
default:
- return CN_LANDLOCKED;
+ CANT_REACH();
+ case NAV_NONE:
+ return NAV_NONE;
}
- return CN_NAVIGABLE;
+ return NAVOK;
}
int
newx = xnorm(mlp->unit.ship.shp_x + dx);
newy = ynorm(mlp->unit.ship.shp_y + dy);
getsect(newx, newy, §);
- navigate = shp_check_nav(§, &mlp->unit.ship);
- if (navigate != CN_NAVIGABLE ||
+ navigate = shp_check_nav(&mlp->unit.ship, §);
+ if (navigate != NAVOK ||
(sect.sct_own
&& relations_with(sect.sct_own, actor) < FRIENDLY)) {
- if (dchr[sect.sct_type].d_nav == NAV_CANAL &&
- !(((struct mchrstr *)mlp->chrp)->m_flags & M_CANAL) &&
- navigate == CN_LANDLOCKED)
+ if (navigate == NAV_CANAL)
sprintf(dp,
"is too large to fit into the canal system at %s",
xyas(newx, newy, actor));
fe->num, cname(fe->own));
error = 1;
}
- if ((shp_check_nav(sectp, sp) == CN_LANDLOCKED) &&
- (dchr[sectp->sct_type].d_nav == NAV_CANAL)) {
+ if (shp_check_nav(sp, sectp) == NAV_CANAL) {
wu(0, fltp->own,
"Your ship #%d (%s) is too big to fit through the canal.\n",
fe->num, cname(fe->own));
return 0;
sp = getshipp(fltp->leader);
sectp = getsectp(fltp->x, fltp->y);
- if (shp_check_nav(sectp, sp) != CN_NAVIGABLE)
+ if (shp_check_nav(sp, sectp) != NAVOK)
wu(0, fltp->own, "Your fleet lead by %d is trapped by land.\n",
fltp->leader);
sp = getshipp(fltp->leader);