Boomerangs can hit multiple monsters
The number of monsters it can hit depends on the enchantment.
This commit is contained in:
@@ -1576,6 +1576,7 @@ water elementals move slightly more slowly
|
|||||||
the "totally digested" instadeath timer is much faster
|
the "totally digested" instadeath timer is much faster
|
||||||
slow monster effects are more effective against faster enemies
|
slow monster effects are more effective against faster enemies
|
||||||
light-spell is clerical, if playing a priest
|
light-spell is clerical, if playing a priest
|
||||||
|
boomerang can hit multiple monsters
|
||||||
|
|
||||||
|
|
||||||
Fixes to 3.7.0-x General Problems Exposed Via git Repository
|
Fixes to 3.7.0-x General Problems Exposed Via git Repository
|
||||||
|
|||||||
@@ -829,6 +829,7 @@ extern void hurtle(int, int, int, boolean);
|
|||||||
extern void mhurtle(struct monst *, int, int, int) NONNULLARG1;
|
extern void mhurtle(struct monst *, int, int, int) NONNULLARG1;
|
||||||
extern boolean harmless_missile(struct obj *) NONNULLARG1;
|
extern boolean harmless_missile(struct obj *) NONNULLARG1;
|
||||||
extern boolean throwing_weapon(struct obj *) NONNULLARG1;
|
extern boolean throwing_weapon(struct obj *) NONNULLARG1;
|
||||||
|
extern boolean throwit_mon_hit(struct obj *, struct monst *) NONNULLARG1;
|
||||||
extern void throwit(struct obj *, long, boolean, struct obj *) NONNULLARG1;
|
extern void throwit(struct obj *, long, boolean, struct obj *) NONNULLARG1;
|
||||||
extern int omon_adj(struct monst *, struct obj *, boolean) NONNULLPTRS;
|
extern int omon_adj(struct monst *, struct obj *, boolean) NONNULLPTRS;
|
||||||
extern boolean should_mulch_missile(struct obj *);
|
extern boolean should_mulch_missile(struct obj *);
|
||||||
|
|||||||
+34
-21
@@ -1474,6 +1474,37 @@ swallowit(struct obj *obj)
|
|||||||
throwit_return(TRUE);
|
throwit_return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* thrown object hits a monster.
|
||||||
|
mon may be NULL.
|
||||||
|
returns TRUE if shopkeeper caught the object.
|
||||||
|
may delete object, clearing gt.thrownobj */
|
||||||
|
boolean
|
||||||
|
throwit_mon_hit(struct obj *obj, struct monst *mon)
|
||||||
|
{
|
||||||
|
if (mon) {
|
||||||
|
boolean obj_gone;
|
||||||
|
|
||||||
|
if (mon->isshk && obj->where == OBJ_MINVENT && obj->ocarry == mon) {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
(void) snuff_candle(obj);
|
||||||
|
gn.notonhead = (gb.bhitpos.x != mon->mx || gb.bhitpos.y != mon->my);
|
||||||
|
obj_gone = thitmonst(mon, obj);
|
||||||
|
/* Monster may have been tamed; this frees old mon [obsolete] */
|
||||||
|
mon = m_at(gb.bhitpos.x, gb.bhitpos.y);
|
||||||
|
|
||||||
|
/* [perhaps this should be moved into thitmonst or hmon] */
|
||||||
|
if (mon && mon->isshk
|
||||||
|
&& (!inside_shop(u.ux, u.uy)
|
||||||
|
|| !strchr(in_rooms(mon->mx, mon->my, SHOPBASE), *u.ushops)))
|
||||||
|
hot_pursuit(mon);
|
||||||
|
|
||||||
|
if (obj_gone)
|
||||||
|
gt.thrownobj = (struct obj *) 0;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* throw an object, NB: obj may be consumed in the process */
|
/* throw an object, NB: obj may be consumed in the process */
|
||||||
void
|
void
|
||||||
throwit(
|
throwit(
|
||||||
@@ -1661,27 +1692,9 @@ throwit(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mon) {
|
if (throwit_mon_hit(obj, mon)) {
|
||||||
boolean obj_gone;
|
throwit_return(TRUE); /* alert shk caught it */
|
||||||
|
return;
|
||||||
if (mon->isshk && obj->where == OBJ_MINVENT && obj->ocarry == mon) {
|
|
||||||
throwit_return(TRUE); /* alert shk caught it */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
(void) snuff_candle(obj);
|
|
||||||
gn.notonhead = (gb.bhitpos.x != mon->mx || gb.bhitpos.y != mon->my);
|
|
||||||
obj_gone = thitmonst(mon, obj);
|
|
||||||
/* Monster may have been tamed; this frees old mon [obsolete] */
|
|
||||||
mon = m_at(gb.bhitpos.x, gb.bhitpos.y);
|
|
||||||
|
|
||||||
/* [perhaps this should be moved into thitmonst or hmon] */
|
|
||||||
if (mon && mon->isshk
|
|
||||||
&& (!inside_shop(u.ux, u.uy)
|
|
||||||
|| !strchr(in_rooms(mon->mx, mon->my, SHOPBASE), *u.ushops)))
|
|
||||||
hot_pursuit(mon);
|
|
||||||
|
|
||||||
if (obj_gone)
|
|
||||||
gt.thrownobj = (struct obj *) 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gt.thrownobj) {
|
if (!gt.thrownobj) {
|
||||||
|
|||||||
@@ -4139,6 +4139,7 @@ boomhit(struct obj *obj, coordxy dx, coordxy dy)
|
|||||||
int boom; /* showsym[] index */
|
int boom; /* showsym[] index */
|
||||||
struct monst *mtmp;
|
struct monst *mtmp;
|
||||||
boolean counterclockwise = URIGHTY; /* ULEFTY => clockwise */
|
boolean counterclockwise = URIGHTY; /* ULEFTY => clockwise */
|
||||||
|
int nhits = (obj->spe + 1);
|
||||||
|
|
||||||
/* counterclockwise traversal patterns, from @ to 1 then on through to 9
|
/* counterclockwise traversal patterns, from @ to 1 then on through to 9
|
||||||
* ..........................54.................................
|
* ..........................54.................................
|
||||||
@@ -4173,8 +4174,12 @@ boomhit(struct obj *obj, coordxy dx, coordxy dy)
|
|||||||
}
|
}
|
||||||
if ((mtmp = m_at(gb.bhitpos.x, gb.bhitpos.y)) != 0) {
|
if ((mtmp = m_at(gb.bhitpos.x, gb.bhitpos.y)) != 0) {
|
||||||
m_respond(mtmp);
|
m_respond(mtmp);
|
||||||
tmp_at(DISP_END, 0);
|
if (nhits-- < 0) {
|
||||||
return mtmp;
|
tmp_at(DISP_END, 0);
|
||||||
|
return mtmp;
|
||||||
|
} else if (throwit_mon_hit(obj, mtmp) || !gt.thrownobj) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!ZAP_POS(levl[gb.bhitpos.x][gb.bhitpos.y].typ)
|
if (!ZAP_POS(levl[gb.bhitpos.x][gb.bhitpos.y].typ)
|
||||||
|| closed_door(gb.bhitpos.x, gb.bhitpos.y)) {
|
|| closed_door(gb.bhitpos.x, gb.bhitpos.y)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user