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:
parent
aae77430bf
commit
fe5b26658d
1 changed files with 10 additions and 13 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue