Fix #H4411: Targeting detected monster through wall with fireball

Fireball and cone of cold could target detected monsters
through a wall when cast at skilled or higher.  This allowed
eg. targeting the Wiz from outside his tower.

Use walk_path to determine the actual location where the
spell will hit, so trying to cast through a wall will
make the explosion happen at the nearest empty space.
This commit is contained in:
Pasi Kallinen
2016-06-20 09:11:52 +03:00
parent 1cad5efe17
commit 3eb919d5ab

View File

@@ -43,6 +43,7 @@ STATIC_DCL int NDECL(throwspell);
STATIC_DCL void NDECL(cast_protection);
STATIC_DCL void FDECL(spell_backfire, (int));
STATIC_DCL const char *FDECL(spelltypemnemonic, (int));
STATIC_DCL boolean FDECL(spell_hurtle_step, (genericptr_t, int, int));
/* The roles[] table lists the role-specific values for tuning
* percent_success().
@@ -1180,11 +1181,23 @@ boolean atme;
return 1;
}
STATIC_OVL boolean
spell_hurtle_step(arg, x, y)
genericptr_t arg;
int x, y;
{
if (!isok(x,y)) return FALSE;
if (!ZAP_POS(levl[x][y].typ)
&& !(IS_DOOR(levl[x][y].typ) && (levl[x][y].doormask & D_ISOPEN)))
return FALSE;
return TRUE;
}
/* Choose location where spell takes effect. */
STATIC_OVL int
throwspell()
{
coord cc;
coord cc, uc;
struct monst *mtmp;
if (u.uinwater) {
@@ -1217,6 +1230,11 @@ throwspell()
return 0;
}
uc.x = u.ux;
uc.y = u.uy;
walk_path(&uc, &cc, spell_hurtle_step, NULL);
u.dx = cc.x;
u.dy = cc.y;
return 1;