(laun, launch_as, launch_missile, launch_sat): When an argument is
bad, do not loop prompting, just fail. That's what the vast majority of commands do. (launch_as, launch_missile, launch_sat): Don't zap the target argument. If the target is given as argument, launch all missiles at that target. Previously, missiles after the first prompted for another target.
This commit is contained in:
parent
011fa326d7
commit
ad10ee5649
1 changed files with 99 additions and 104 deletions
|
@ -65,7 +65,7 @@ laun(void)
|
|||
struct sctstr sect;
|
||||
int sublaunch;
|
||||
struct plchrstr *pcp;
|
||||
int rel;
|
||||
int rel, retval, gone;
|
||||
struct natstr *natp;
|
||||
|
||||
if (!snxtitem(&nstr, EF_PLANE, player->argp[1]))
|
||||
|
@ -145,28 +145,32 @@ laun(void)
|
|||
xyas(plane.pln_x, plane.pln_y, player->cnum),
|
||||
plane.pln_range, plane.pln_effic);
|
||||
if (!(pcp->pl_flags & P_O)) {
|
||||
if (launch_missile(&plane, sublaunch) < 0)
|
||||
continue;
|
||||
retval = launch_missile(&plane, sublaunch);
|
||||
gone = 1;
|
||||
} else if ((pcp->pl_flags & (P_M | P_O)) == (P_M | P_O)) {
|
||||
if (launch_as(&plane) < 0) /* anti-sat */
|
||||
continue;
|
||||
retval = launch_as(&plane);
|
||||
gone = 1;
|
||||
} else { /* satellites */
|
||||
if (launch_sat(&plane, sublaunch) < 0)
|
||||
continue;
|
||||
retval = launch_sat(&plane, sublaunch);
|
||||
gone = !(plane.pln_flags & PLN_LAUNCHED);
|
||||
}
|
||||
if (retval != RET_OK)
|
||||
return retval;
|
||||
if (gone) {
|
||||
makelost(EF_PLANE, plane.pln_own, plane.pln_uid, plane.pln_x,
|
||||
plane.pln_y);
|
||||
plane.pln_own = 0;
|
||||
putplane(plane.pln_uid, &plane);
|
||||
}
|
||||
makelost(EF_PLANE, plane.pln_own, plane.pln_uid, plane.pln_x,
|
||||
plane.pln_y);
|
||||
plane.pln_own = 0;
|
||||
putplane(plane.pln_uid, &plane);
|
||||
}
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Launch an anti-sat weapon.
|
||||
* Return -1 on failure, 0 on success (even if missile explodes).
|
||||
* Launch anti-sat weapon PP.
|
||||
* Return RET_OK if launched (even when missile explodes),
|
||||
* else RET_SYN or RET_FAIL.
|
||||
*/
|
||||
|
||||
static int
|
||||
launch_as(struct plnstr *pp)
|
||||
{
|
||||
|
@ -180,24 +184,20 @@ launch_as(struct plnstr *pp)
|
|||
|
||||
if (msl_equip(pp) < 0) {
|
||||
pr("%s not enough petrol or shells!\n", prplane(pp));
|
||||
return -1;
|
||||
return RET_FAIL;
|
||||
}
|
||||
for (;;) {
|
||||
cp = getstarg(player->argp[2], "Target sector? ", buf);
|
||||
if (!check_plane_ok(pp))
|
||||
return -1;
|
||||
player->argp[2] = 0;
|
||||
if (!cp || !*cp)
|
||||
return -1;
|
||||
if (!sarg_xy(cp, &sx, &sy)) {
|
||||
pr("Bad sector designation; try again!\n");
|
||||
continue;
|
||||
}
|
||||
if (mapdist(pp->pln_x, pp->pln_y, sx, sy) > pp->pln_range) {
|
||||
pr("Range too great; try again!\n");
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
cp = getstarg(player->argp[2], "Target sector? ", buf);
|
||||
if (!check_plane_ok(pp))
|
||||
return RET_FAIL;
|
||||
if (!cp || !*cp)
|
||||
return RET_SYN;
|
||||
if (!sarg_xy(cp, &sx, &sy)) {
|
||||
pr("Bad sector designation!\n");
|
||||
return RET_SYN;
|
||||
}
|
||||
if (mapdist(pp->pln_x, pp->pln_y, sx, sy) > pp->pln_range) {
|
||||
pr("Range too great!\n");
|
||||
return RET_FAIL;
|
||||
}
|
||||
goodtarget = 0;
|
||||
snxtitem_dist(&ni, EF_PLANE, sx, sy, 0);
|
||||
|
@ -211,7 +211,7 @@ launch_as(struct plnstr *pp)
|
|||
}
|
||||
if (!goodtarget) {
|
||||
pr("No satellites there!\n");
|
||||
return -1;
|
||||
return RET_FAIL;
|
||||
}
|
||||
if (msl_hit(pp, plane.pln_def, EF_PLANE, N_SAT_KILL, N_SAT_KILL,
|
||||
prplane(&plane), sx, sy, plane.pln_own)) {
|
||||
|
@ -227,12 +227,14 @@ launch_as(struct plnstr *pp)
|
|||
if (!plane.pln_own)
|
||||
mpr(oldown, "Satellite shot down\n");
|
||||
}
|
||||
return 0;
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Launch a missile
|
||||
* Return -1 on failure, 0 on success (even if missile explodes).
|
||||
* Launch missile PP.
|
||||
* If SUBLAUNCH, it's sub-launched.
|
||||
* Return RET_OK if launched (even when missile explodes),
|
||||
* else RET_SYN or RET_FAIL.
|
||||
*/
|
||||
static int
|
||||
launch_missile(struct plnstr *pp, int sublaunch)
|
||||
|
@ -249,54 +251,50 @@ launch_missile(struct plnstr *pp, int sublaunch)
|
|||
struct natstr *natp;
|
||||
s_char buf[1024];
|
||||
|
||||
for (;;) {
|
||||
if (pcp->pl_flags & P_MAR)
|
||||
cp = getstarg(player->argp[2], "Target ship? ", buf);
|
||||
else
|
||||
cp = getstarg(player->argp[2], "Target sector? ", buf);
|
||||
player->argp[2] = 0;
|
||||
if (!cp || !*cp)
|
||||
return -1;
|
||||
if (!check_plane_ok(pp))
|
||||
return -1;
|
||||
if (opt_PINPOINTMISSILE && sarg_type(cp) == NS_LIST) {
|
||||
if (!(pcp->pl_flags & P_MAR)) {
|
||||
pr("Missile not designed to attack ships!\n");
|
||||
continue;
|
||||
}
|
||||
n = atoi(cp);
|
||||
if ((n < 0) || !getship(n, &target_ship) ||
|
||||
!target_ship.shp_own) {
|
||||
pr("Bad ship number; try again!\n");
|
||||
continue;
|
||||
}
|
||||
sx = target_ship.shp_x;
|
||||
sy = target_ship.shp_y;
|
||||
mcp = &mchr[(int)target_ship.shp_type];
|
||||
if (mcp->m_flags & M_SUB) {
|
||||
pr("Bad ship number; try again!\n");
|
||||
continue;
|
||||
}
|
||||
} /* not PINPOINTMISSILE for ships */
|
||||
else if (!sarg_xy(cp, &sx, &sy)) {
|
||||
pr("That's no good! try again!\n");
|
||||
continue;
|
||||
} else if (opt_PINPOINTMISSILE) {
|
||||
if (pcp->pl_flags & P_MAR) {
|
||||
pr("Missile designed to attack ships!\n");
|
||||
continue;
|
||||
}
|
||||
if (pcp->pl_flags & P_MAR)
|
||||
cp = getstarg(player->argp[2], "Target ship? ", buf);
|
||||
else
|
||||
cp = getstarg(player->argp[2], "Target sector? ", buf);
|
||||
if (!cp || !*cp)
|
||||
return RET_SYN;
|
||||
if (!check_plane_ok(pp))
|
||||
return RET_FAIL;
|
||||
if (opt_PINPOINTMISSILE && sarg_type(cp) == NS_LIST) {
|
||||
if (!(pcp->pl_flags & P_MAR)) {
|
||||
pr("Missile not designed to attack ships!\n");
|
||||
return RET_FAIL;
|
||||
}
|
||||
/* end PINPOINTMISSILE */
|
||||
if (mapdist(pp->pln_x, pp->pln_y, sx, sy) > pp->pln_range) {
|
||||
pr("Range too great; try again!\n");
|
||||
continue;
|
||||
n = atoi(cp);
|
||||
if ((n < 0) || !getship(n, &target_ship) ||
|
||||
!target_ship.shp_own) {
|
||||
pr("Bad ship number!\n");
|
||||
return RET_FAIL;
|
||||
}
|
||||
break;
|
||||
sx = target_ship.shp_x;
|
||||
sy = target_ship.shp_y;
|
||||
mcp = &mchr[(int)target_ship.shp_type];
|
||||
if (mcp->m_flags & M_SUB) {
|
||||
pr("Bad ship number!\n");
|
||||
return RET_FAIL;
|
||||
}
|
||||
} /* not PINPOINTMISSILE for ships */
|
||||
else if (!sarg_xy(cp, &sx, &sy)) {
|
||||
pr("Not a sector!\n");
|
||||
return RET_FAIL;
|
||||
} else if (opt_PINPOINTMISSILE) {
|
||||
if (pcp->pl_flags & P_MAR) {
|
||||
pr("Missile designed to attack ships!\n");
|
||||
return RET_FAIL;
|
||||
}
|
||||
}
|
||||
/* end PINPOINTMISSILE */
|
||||
if (mapdist(pp->pln_x, pp->pln_y, sx, sy) > pp->pln_range) {
|
||||
pr("Range too great; try again!\n");
|
||||
return RET_FAIL;
|
||||
}
|
||||
if (msl_equip(pp) < 0) {
|
||||
pr("%s not enough shells!\n", prplane(pp));
|
||||
return -1;
|
||||
return RET_FAIL;
|
||||
}
|
||||
if (opt_PINPOINTMISSILE == 0 || !(pcp->pl_flags & P_MAR)) {
|
||||
getsect(sx, sy, §);
|
||||
|
@ -309,7 +307,7 @@ launch_missile(struct plnstr *pp, int sublaunch)
|
|||
pr_beep();
|
||||
pr("Kaboom!!!\n");
|
||||
pr("Missile monitoring officer destroys RV before detonation.\n");
|
||||
return 0;
|
||||
return RET_OK;
|
||||
}
|
||||
}
|
||||
if (!msl_hit(pp, SECT_HARDTARGET, EF_SECTOR, N_SCT_MISS,
|
||||
|
@ -318,7 +316,7 @@ launch_missile(struct plnstr *pp, int sublaunch)
|
|||
dam = pln_damage(pp, sect.sct_x, sect.sct_y, 's', &nukedam, 0);
|
||||
collateral_damage(sect.sct_x, sect.sct_y, dam, 0);
|
||||
*/
|
||||
return 0;
|
||||
return RET_OK;
|
||||
}
|
||||
dam = pln_damage(pp, sect.sct_x, sect.sct_y, 's', &nukedam, 1);
|
||||
if (!nukedam) {
|
||||
|
@ -349,7 +347,7 @@ launch_missile(struct plnstr *pp, int sublaunch)
|
|||
dam = pln_damage(pp,target_ship.shp_x,target_ship.shp_y,'p',&nukedam, 0);
|
||||
collateral_damage(target_ship.shp_x, target_ship.shp_y, dam, 0);
|
||||
*/
|
||||
return 0;
|
||||
return RET_OK;
|
||||
}
|
||||
dam =
|
||||
pln_damage(pp, target_ship.shp_x, target_ship.shp_y, 'p',
|
||||
|
@ -365,12 +363,13 @@ launch_missile(struct plnstr *pp, int sublaunch)
|
|||
pr("%s sunk!\n", prship(&target_ship));
|
||||
}
|
||||
/* end PINPOINTMISSILE */
|
||||
return 0;
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Launch a satellite.
|
||||
* Return -1 on error, 0 on success (even if the satellite fails).
|
||||
* Return RET_OK if launched (even when satellite fails),
|
||||
* else RET_SYN or RET_FAIL.
|
||||
*/
|
||||
static int
|
||||
launch_sat(struct plnstr *pp, int sublaunch)
|
||||
|
@ -385,28 +384,24 @@ launch_sat(struct plnstr *pp, int sublaunch)
|
|||
s_char buf[1024];
|
||||
|
||||
pr("\n");
|
||||
while (1) {
|
||||
cp = getstarg(player->argp[2], "Target sector? ", buf);
|
||||
if (!check_plane_ok(pp))
|
||||
return -1;
|
||||
player->argp[2] = 0;
|
||||
if (!cp || !*cp)
|
||||
return -1;
|
||||
if (!sarg_xy(cp, &sx, &sy)) {
|
||||
pr("Bad sector designation; try again!\n");
|
||||
continue;
|
||||
}
|
||||
if ((dist = mapdist(pp->pln_x, pp->pln_y, sx, sy)) > pp->pln_range) {
|
||||
pr("Range too great; try again!\n");
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
cp = getstarg(player->argp[2], "Target sector? ", buf);
|
||||
if (!check_plane_ok(pp))
|
||||
return RET_FAIL;
|
||||
if (!cp || !*cp)
|
||||
return RET_SYN;
|
||||
if (!sarg_xy(cp, &sx, &sy)) {
|
||||
pr("Bad sector designation!\n");
|
||||
return RET_SYN;
|
||||
}
|
||||
if ((dist = mapdist(pp->pln_x, pp->pln_y, sx, sy)) > pp->pln_range) {
|
||||
pr("Range too great; try again!\n");
|
||||
return RET_FAIL;
|
||||
}
|
||||
p = getstring("Geostationary orbit? ", buf);
|
||||
if (p == 0)
|
||||
return -1;
|
||||
return RET_SYN;
|
||||
if (!check_plane_ok(pp))
|
||||
return -1;
|
||||
return RET_FAIL;
|
||||
pp->pln_theta = 0;
|
||||
pp->pln_flags |= PLN_SYNCHRONOUS;
|
||||
if (*p == 0 || *p == 'n')
|
||||
|
@ -416,7 +411,7 @@ launch_sat(struct plnstr *pp, int sublaunch)
|
|||
pr("KABOOOOM! Range safety officer detonates booster!\n");
|
||||
makelost(EF_PLANE, pp->pln_own, pp->pln_uid, pp->pln_x, pp->pln_y);
|
||||
pp->pln_own = 0;
|
||||
return 0;
|
||||
return RET_OK;
|
||||
}
|
||||
i = pp->pln_tech + pp->pln_effic;
|
||||
if (chance(1.0 - (i / (i + 50.0)))) {
|
||||
|
@ -428,7 +423,7 @@ launch_sat(struct plnstr *pp, int sublaunch)
|
|||
nreport(player->cnum, N_LAUNCH, 0, 1);
|
||||
pr("%s positioned over %s", prplane(pp), xyas(sx, sy, player->cnum));
|
||||
if (msl_intercept(sx, sy, pp->pln_own, pcp->pl_def, sublaunch, P_O, 0)) {
|
||||
return 0;
|
||||
return RET_OK;
|
||||
}
|
||||
pp->pln_x = sx;
|
||||
pp->pln_y = sy;
|
||||
|
@ -436,5 +431,5 @@ launch_sat(struct plnstr *pp, int sublaunch)
|
|||
pp->pln_mobil = (pp->pln_mobil > dist) ? (pp->pln_mobil - dist) : 0;
|
||||
putplane(pp->pln_uid, pp);
|
||||
pr(", will be ready for use in %d time units\n", plane_mob_max - pp->pln_mobil);
|
||||
return -1;
|
||||
return RET_OK;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue