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:
Pasi Kallinen
2021-12-29 19:40:23 +02:00
parent 3536ede5bd
commit fa41d5fe66
6 changed files with 38 additions and 14 deletions

View File

@@ -799,6 +799,7 @@ If your wielded weapon has the throw-and-return property, your quiver
is empty, and
.op autoquiver
is false, you will throw that wielded weapon instead of filling the quiver.
This will also automatically use a polearm if wielded.
If
.op fireassist
is true, firing will automatically try to wield a launcher (for example,
@@ -1244,7 +1245,8 @@ You can set the
.op paranoid_confirmation:quit
option to require a response of \f(CRyes\fP instead.
.lp "#fire "
Fire ammunition from quiver, possibly autowielding a launcher.
Fire ammunition from quiver, possibly autowielding a launcher,
or hit with a wielded polearm.
Default key is \(oqf\(cq.
.lp "#force "
Force a lock.

View File

@@ -896,6 +896,7 @@ computer pick something appropriate if {\it autoquiver\/} is true.
If your wielded weapon has the throw-and-return property, your quiver
is empty, and {\it autoquiver\/}
is false, you will throw that wielded weapon instead of filling the quiver.
This will also automatically use a polearm if wielded.
If {\it fireassist\/} is true, firing will automatically try to wield a launcher
(for example, a bow or a sling) matching the ammo in the quiver; this might
take multiple turns, and get interrupted by a monster.
@@ -1348,7 +1349,8 @@ You can set the
option to require a response of ``{\tt yes}'' instead.
%.lp
\item[\tb{\#fire}]
Fire ammunition from quiver, possibly autowielding a launcher.
Fire ammunition from quiver, possibly autowielding a launcher,
or hit with a wielded polearm.
Default key is `{\tt f}'.
%.lp
\item[\tb{\#force}]

View File

@@ -725,6 +725,7 @@ apply runmode delay to multiturn actions, not just running
if a giant carrying a boulder was on ice that melted, it could be killed
twice, first by drowning, then by boulder filling the resulting pool
when it dropped inventory before being removed from the map
allow fire-command to automatically use a polearm, if wielding it
Fixes to 3.7.0-x Problems that Were Exposed Via git Repository

View File

@@ -52,6 +52,7 @@ extern boolean catch_lit(struct obj *);
extern void use_unicorn_horn(struct obj **);
extern boolean tinnable(struct obj *);
extern void reset_trapset(void);
extern int use_pole(struct obj *, boolean);
extern void fig_transform(union any *, long);
extern int unfixable_trouble_count(boolean);

View File

@@ -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);

View File

@@ -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)