Apply a wielded polearm with fire-command
Wield a polearm and use 'f'ire to automatically hit with it, if there's a single valid target. With fireassist-option, will swapweapon to a polearm. This only applies if quiver is empty and autoquiver is off.
This commit is contained in:
23
src/apply.c
23
src/apply.c
@@ -30,7 +30,6 @@ static void use_stone(struct obj *);
|
||||
static int set_trap(void); /* occupation callback */
|
||||
static int use_whip(struct obj *);
|
||||
static void display_polearm_positions(int);
|
||||
static int use_pole(struct obj *);
|
||||
static int use_cream_pie(struct obj *);
|
||||
static int jelly_ok(struct obj *);
|
||||
static int use_royal_jelly(struct obj *);
|
||||
@@ -3076,8 +3075,8 @@ display_polearm_positions(int state)
|
||||
}
|
||||
|
||||
/* Distance attacks by pole-weapons */
|
||||
static int
|
||||
use_pole(struct obj *obj)
|
||||
int
|
||||
use_pole(struct obj *obj, boolean autohit)
|
||||
{
|
||||
const char thump[] = "Thump! Your blow bounces harmlessly off the %s.";
|
||||
int res = 0, typ, max_range, min_range, glyph;
|
||||
@@ -3125,7 +3124,8 @@ use_pole(struct obj *obj)
|
||||
g.polearm_range_max = max_range;
|
||||
|
||||
/* Prompt for a location */
|
||||
pline(where_to_hit);
|
||||
if (!autohit)
|
||||
pline(where_to_hit);
|
||||
cc.x = u.ux;
|
||||
cc.y = u.uy;
|
||||
if (!find_poleable_mon(&cc, min_range, max_range) && hitm
|
||||
@@ -3135,16 +3135,21 @@ use_pole(struct obj *obj)
|
||||
cc.x = hitm->mx;
|
||||
cc.y = hitm->my;
|
||||
}
|
||||
getpos_sethilite(display_polearm_positions, get_valid_polearm_position);
|
||||
if (getpos(&cc, TRUE, "the spot to hit") < 0)
|
||||
return res; /* ESC; uses turn iff polearm became wielded */
|
||||
if (!autohit) {
|
||||
getpos_sethilite(display_polearm_positions, get_valid_polearm_position);
|
||||
if (getpos(&cc, TRUE, "the spot to hit") < 0)
|
||||
return res; /* ESC; uses turn iff polearm became wielded */
|
||||
}
|
||||
|
||||
glyph = glyph_at(cc.x, cc.y);
|
||||
if (distu(cc.x, cc.y) > max_range) {
|
||||
pline("Too far!");
|
||||
return res;
|
||||
} else if (distu(cc.x, cc.y) < min_range) {
|
||||
pline("Too close!");
|
||||
if (autohit && cc.x == u.ux && cc.y == u.uy)
|
||||
pline("Don't know what to hit.");
|
||||
else
|
||||
pline("Too close!");
|
||||
return res;
|
||||
} else if (!cansee(cc.x, cc.y) && !glyph_is_poleable(glyph)) {
|
||||
You(cant_see_spot);
|
||||
@@ -3948,7 +3953,7 @@ doapply(void)
|
||||
default:
|
||||
/* Pole-weapons can strike at a distance */
|
||||
if (is_pole(obj)) {
|
||||
res = use_pole(obj);
|
||||
res = use_pole(obj, FALSE);
|
||||
break;
|
||||
} else if (is_pick(obj) || is_axe(obj)) {
|
||||
res = use_pick_axe(obj);
|
||||
|
||||
@@ -417,7 +417,7 @@ find_launcher(struct obj *ammo)
|
||||
return (struct obj *)0;
|
||||
}
|
||||
|
||||
/* f command -- fire: throw from the quiver */
|
||||
/* f command -- fire: throw from the quiver or use wielded polearm */
|
||||
int
|
||||
dofire(void)
|
||||
{
|
||||
@@ -445,8 +445,21 @@ dofire(void)
|
||||
if (!flags.autoquiver) {
|
||||
if (uwep && AutoReturn(uwep, uwep->owornmask))
|
||||
obj = uwep;
|
||||
else
|
||||
You("have no ammunition readied.");
|
||||
else {
|
||||
/* if we're wielding a polearm, apply it */
|
||||
if (uwep && is_pole(uwep))
|
||||
return use_pole(uwep, TRUE);
|
||||
else if (iflags.fireassist
|
||||
&& uswapwep && is_pole(uswapwep)
|
||||
&& !(uswapwep->cursed && uswapwep->bknown)) {
|
||||
/* we have a known not-cursed polearm as swap weapon.
|
||||
swap to it and retry */
|
||||
cmdq_add_ec(doswapweapon);
|
||||
cmdq_add_ec(dofire);
|
||||
return 0;
|
||||
} else
|
||||
You("have no ammunition readied.");
|
||||
}
|
||||
} else {
|
||||
autoquiver();
|
||||
if ((obj = uquiver) == 0)
|
||||
|
||||
Reference in New Issue
Block a user