Fix fire not to disclose retreat and wipe out target shell use

multifire() clobbered any changes to the target ship or sector made by
defend().  This let the target fire back for free.

multifire() retreated the target ship before reporting its location to
the player.  This disclosed its new location.

Fix by damaging and retreating the target after calling defend().
This commit is contained in:
Markus Armbruster 2008-05-04 21:58:29 +02:00
parent aae77430bf
commit fe5b26658d

View file

@ -443,8 +443,6 @@ multifire(void)
case targ_sub: case targ_sub:
pr_beep(); pr_beep();
pr("Kawhomp!!!\n"); pr("Kawhomp!!!\n");
if (vship.shp_rflags & RET_DCHRGED)
retreat_ship(&vship, 'd');
break; break;
default: default:
pr_beep(); pr_beep();
@ -470,18 +468,11 @@ multifire(void)
player->cnum, xyas(x, y, vict), dam); player->cnum, xyas(x, y, vict), dam);
pr("Shells hit sector %s for %d damage.\n", pr("Shells hit sector %s for %d damage.\n",
xyas(x, y, player->cnum), dam); xyas(x, y, player->cnum), dam);
if (target != targ_bogus)
sectdamage(&vsect, dam);
break; break;
case targ_ship: case targ_ship:
nreport(player->cnum, N_SHP_SHELL, vict, 1); nreport(player->cnum, N_SHP_SHELL, vict, 1);
/* fall through */ /* fall through */
default: default:
if ((target != targ_sub) ||
((vship.shp_rflags & RET_DCHRGED) == 0))
check_retreat_and_do_shipdamage(&vship, dam);
else
shipdamage(&vship, dam);
if (vict) { if (vict) {
wu(0, vict, wu(0, vict,
"Country #%d shelled %s in %s for %d damage.\n", "Country #%d shelled %s in %s for %d damage.\n",
@ -491,10 +482,6 @@ multifire(void)
pr("Shells hit %s in %s for %d damage.\n", pr("Shells hit %s in %s for %d damage.\n",
prsub(&vship), prsub(&vship),
xyas(vship.shp_x, vship.shp_y, player->cnum), dam); xyas(vship.shp_x, vship.shp_y, player->cnum), dam);
if (vship.shp_effic < SHIP_MINEFF)
pr("%s sunk!\n", prsub(&vship));
break; break;
} }
/* Ok, now, check if we had a bogus target. If so, /* Ok, now, check if we had a bogus target. If so,
@ -509,9 +496,19 @@ multifire(void)
totaldefdam = defend(&fired, &defended, attgp, vict, &ndefending); totaldefdam = defend(&fired, &defended, attgp, vict, &ndefending);
switch (target) { switch (target) {
case targ_land: case targ_land:
getsect(x, y, &vsect);
sectdamage(&vsect, dam);
putsect(&vsect); putsect(&vsect);
break; break;
default: default:
getship(vshipno, &vship);
check_retreat_and_do_shipdamage(&vship, dam);
if (vship.shp_effic < SHIP_MINEFF)
pr("%s sunk!\n", prsub(&vship));
else if (target == targ_sub
&& (vship.shp_rflags & RET_DCHRGED)
&& !(vship.shp_rflags & RET_INJURED))
retreat_ship(&vship, 'd');
putship(vship.shp_uid, &vship); putship(vship.shp_uid, &vship);
break; break;
} }