8 hours agoDon't include wands in quiver autofill/cycling master
advil [Fri, 27 Nov 2020 02:58:41 +0000]
Don't include wands in quiver autofill/cycling

This seems like it should eventually be configurable, but remove this
for now: it seems like it makes it too easy to waste wand charges.
(Possibly applies to misc evokers, abilities, as well?)

9 hours agoLet throwing ammo be quivered with a launcher
advil [Fri, 27 Nov 2020 01:07:56 +0000]
Let throwing ammo be quivered with a launcher

9 hours agoFix a build issue for cao
advil [Fri, 27 Nov 2020 01:02:52 +0000]
Fix a build issue for cao

`set::emplace` is not available on this compiler, apparently.

14 hours agoColourize beam damage descriptions in WebTiles
Nikolai Lavsky [Fri, 13 Nov 2020 20:55:19 +0000]
Colourize beam damage descriptions in WebTiles

As a followup to 930a2b7a, this commit colourizes beam damage
descriptions on the xv screen.

16 hours agoShow inert evokers in `V` menu (Lici)
advil [Thu, 26 Nov 2020 18:19:17 +0000]
Show inert evokers in `V` menu (Lici)

This restores previous behavior, and marks inert evokers as dark grey in
inventory menus in general (basically so that they'll show up that way
in `V`).  Not sure if there are other things that could be marked dark
grey following this, or if there's a convenient way to do that. But this
makes the appearance of `V` match the quiver menu.

17 hours agoRemove a debug message
advil [Thu, 26 Nov 2020 17:57:01 +0000]
Remove a debug message

17 hours agoFix a bunch of inscription logic errors
advil [Thu, 26 Nov 2020 17:54:23 +0000]
Fix a bunch of inscription logic errors

These were keeping every ammo not inscribed with =F from getting

17 hours agoFix cleave+reaching
advil [Thu, 26 Nov 2020 17:45:51 +0000]
Fix cleave+reaching

I had assumed this wasn't possible, but it is via Xom. This fix
prioritizes the reaching targeter over the cleave targeter.

18 hours agoGenerate a quickstart.txt
advil [Thu, 26 Nov 2020 16:04:28 +0000]
Generate a quickstart.txt

23cac7494c converted the quickstart guide to markdown, but at the time
of merge I don't think anyone fully realized that this was loaded
in-game. This fact has caused a bunch of havoc.

This commit generates a .txt by simply copying the md file, which should
eventually be substituted for better rendering. Two reasons for doing
this: (i) for in-game use, a .txt version would be better since we don't
have any markdown rendering in-game, and (ii) on some servers (perhaps
just CWZ) the .md file is not getting copied into the game data
directory, which is causing a ton of crashes. This could be fixed on the
server, but given (i) it also seems reasonable to fix it on our end.

31 hours agoFix an autofight / throw interaction (vt)
advil [Thu, 26 Nov 2020 03:37:22 +0000]
Fix an autofight / throw interaction (vt)

This simplifies this code path to only use the targeting in throw_it,
rather than adding an extra layer of targeting around
CMD_THROW_ITEM_NO_QUIVER. This layer was here for historical reasons and
everything seems to work fine without it. The specific bug this is
targeting is that because the action treated this as a case of
non-interactive targeting it would apply the autofight threshold.

This commit also fixes a bug where you could use `f` to fire ammo into
walls with portal projectile, probably causing a crash.

31 hours agoImprove handling of =f inscriptions
advil [Thu, 26 Nov 2020 03:12:55 +0000]
Improve handling of =f inscriptions

This commit allows =f to work beyond ammo, and still shows =f items in
the `Q`uiver menu (following previous behavior). Some cases of +f still
don't work.

31 hours agoBan missed net farming (Misc)
Nicholas Feinberg [Thu, 26 Nov 2020 03:04:12 +0000]
Ban missed net farming (Misc)

I'd forgotten about the case where nets miss you. Oops!

33 hours agoFix a potential crash while joining ru
advil [Thu, 26 Nov 2020 01:30:28 +0000]
Fix a potential crash while joining ru

This is a quick fix that I'm not sure is ideal, but what seems to be
happening is that your_talents can be triggered as a side effect of
messaging while joining a god, which then trips a Ru ASSERT before the
god is fully set up. Changing the order of calls in join_religion might
be better, but that sequence looks very delicate.

35 hours agoDon't mark newgame spells as useless
advil [Wed, 25 Nov 2020 23:54:22 +0000]
Don't mark newgame spells as useless

The player is not yet placed when they receive their initial spells, so
spell_uselessness_reason needs to be able to work in that case.

37 hours agoFix !f inscription checks (vt)
advil [Wed, 25 Nov 2020 21:16:20 +0000]
Fix !f inscription checks (vt)

This moves inscription checks to triggering; the earlier implementation
was only tested on a much older version of newquivers. This commit also
lets !f inscriptions work on any item that can be fired from quivers.

40 hours agoMore spell quivering fixes, this time for excursions
advil [Wed, 25 Nov 2020 18:59:00 +0000]
More spell quivering fixes, this time for excursions

81e999faa9 was specifically triggered by checking spell uselessness of a
quivered spell while doing levelgen. Crashes can also happen if this is
checked during an excursion. Before, none of this code would have a way
of being called, but when a spell is quivered on newquivers, this code
is used to figure out whether to gray out the spell, so it is triggered
by ui redraws as well as sending player info in webtiles. I've added
another sanity check to `spell_no_hostile_in_range`, but also just
headed this off at the outset in `spell_uselessness_reason`.

41 hours agoDon't crash on a spell uselessness check when entering zigs
advil [Wed, 25 Nov 2020 17:53:58 +0000]
Don't crash on a spell uselessness check when entering zigs

I'm still not sure of why exactly this is called when the player is out
of bounds while entering zigs, but it is, so handle this case a bit more
gracefully in general.

44 hours agoHandle randomization correctly in absolute zero targeter
advil [Tue, 24 Nov 2020 23:56:32 +0000]
Handle randomization correctly in absolute zero targeter

Before, I had assumed that this wasn't randomized. However, it is,
inside distance_iterator. So, this commit changes the targeter to show
AFF_MAYBE on the closest targets when there is more than one at the same
distance. The visual difference is a bit subtle, so it may be that this
will be confusing, but this still seems the best way to handle it.

44 hours agoLua api for targeted fire of spells, items, abilities
advil [Sat, 21 Nov 2020 19:05:20 +0000]
Lua api for targeted fire of spells, items, abilities

Before, these needed to be triggered by sending keys; this change uses
the actions API to directly trigger actions and supply a target where

This code is not extremely well tested...

44 hours agoSimplify and document the actions/quiver API somewhat
advil [Sat, 21 Nov 2020 18:48:08 +0000]
Simplify and document the actions/quiver API somewhat

Mixing shared_ptr and references was too confusing, with some awkward
pitfalls. Given that the whole point of action_cycler is to ensure
non-null, this commit just switches things over to use only shared_ptrs,
and makes explicit this (and cases where nullptr may be returned) in the
doc comments.

Also, a few other tweaks/fixes that I noticed along the way.

44 hours agoName some special numbers in autofight (PleasingFungus)
advil [Sat, 21 Nov 2020 04:45:07 +0000]
Name some special numbers in autofight (PleasingFungus)

44 hours agoRefactor and consolidate melee attacks
advil [Sat, 21 Nov 2020 03:44:57 +0000]
Refactor and consolidate melee attacks

This commit refactors melee attacks, including CMD_ATTACK_... and
reaching attacks, into a single action type. This action supports
targeting not just for reaching attacks but for regular melee attacks,
leading to a more uniform behavior (as well as allowing you to examine
enemies directly from an attack interface for all attack types). This
class supports all the bells and whistles of other action commands, e.g.
it will do noninteractive attacking if a target is pre-chosen. It's
currently not used in a quiver at all, but created on the fly as part of
an attack.

For backwards compatibility I have left the behavior of
CMD_EVOKE_WIELDED intact, but `v` is now bound to a new
CMD_PRIMARY_ATTACK that activates targeting for any wielded weapon, be
it regular, reaching, or ranged. Historically, there were various types
of things triggered with this key while wielded, but more recently `v`
is used almost entirely for reaching except for some special cases: two
artefacts (staff of olgreb and staff of dispater) as well as unusual
techniques like wielding a wand. Since all of these special cases now
can be accomplished via the quiver, it doesn't seem so necessary to keep
to the old scheme as a default. There's still unfortunately a bit of
scaffolding in the evoke code because of this compatibility issue, but
it's at least less intrusive.

Additional notes:
* targeter_cleave is upgraded to support changing aim, and used for
  `v` on axes.
* Rift targeting is simplified and now correctly shows range.
* Bump attacking is unchanged, i.e. doesn't use this code path.
* If someone's really bothered by having to quiver staff of olgreb's
  OTR ability to trigger it, they can rebind `v` back to
  CMD_EVOKE_WIELDED. `V` will also continue to work.
* It is still possible to use `V` to evoke a reaching weapon.

44 hours agoChange/improve some default quiver filling cases
advil [Fri, 20 Nov 2020 04:04:22 +0000]
Change/improve some default quiver filling cases

A bunch of issues that showed up in testing

* use invalid, rather than just empty, quivers for initialization cases.
  This autofills early game quivers more appropriately.
* on memorising a spell, fill an invalid quiver.
* when wielding a launcher, if that launcher has ammo fill the main
  quiver unconditionally. Previously I had only done this on an invalid
  quiver, but on testing I'm not sure that this would be the best
  general behavior. (And in tutorial 2, it definitely complicates things
  in a case that would be confusing for newer players.) The main case
  where this could be annoying is if a player wants to swap between
  ranged and melee weapons, but keep a spell or ability quivered.

44 hours agoDocumentation, tutorial updates
advil [Fri, 20 Nov 2020 03:43:08 +0000]
Documentation, tutorial updates

44 hours agoRefactor and improve some autofight checks
advil [Fri, 20 Nov 2020 02:42:08 +0000]
Refactor and improve some autofight checks

This commit slightly restructures how autofight is called, cleaning up
the code in and moving the hp/mp checks at least partly into
quiver::action (though still using clua bindings to perform the checks).
The main substantive change here is that the `automagic_stop` option now
works for quivered actions that consume mp similarly to how it worked on
old automagic.

44 hours agoChange the behavior of the CLUA_BINDINGS #define
advil [Thu, 19 Nov 2020 13:55:38 +0000]
Change the behavior of the CLUA_BINDINGS #define

This commit changes things so that what gets compiled out by removing
this define is only the ability to run clua from the rc file and macros.
Default clua bindings in dat/clua are called, as are all hooks etc.
(Most will be unable to do anything, but this would allow someone to set
a default value for any hooks in dat/clua code.)

*Motivation.* The main use case for this that I can think of is
security: a security-conscious server admin may prefer their users to
not be able to run clua in their rc file. However, this use case has
been severely broken for some time, because the following were also
disabled by undefining this variable: autofight, stash tracker
annotation, delay interruption, kill annotation, and a few other minor
things.  Realistically no one is going to want to play modern crawl
without at least the first two of these.  Because of the (potential)
security application, I don't want to remove it entirely, but if it is
going to be usable for that, it needed some work.

In addition, the existence of this #define required anyone implementing
a clua binding to get the preprocessor setup right, and if they really
wanted to do that, to test on two builds (one of which required editing
the Makefile). Nearly every dev comment I can find about CLUA_BINDINGS
going back to 2011 is basically asking why it exists. So this commit
is an attempt to provide some value.

One awkwardness: there is a bunch of lua code in
dat/defaults/autopickup_exceptions.txt. Because this is treated as an rc
file, it will error (and not work) on a non-user-clua build. This is all
a bit hypothetical now but possibly it would be better for this code to
be implemented in a dat/clua file rather than a default rc include.

44 hours agoDon't show item letters for actions in quiver
advil [Tue, 17 Nov 2020 00:42:57 +0000]
Don't show item letters for actions in quiver

I had these in as an extension of previous behavior for ammo, but in
practice I've found the letters more confusing than helpful. If people
do want these, it could go back in.

44 hours agoadd CMD_AUTOFIRE to `p`
advil [Tue, 17 Nov 2020 00:37:56 +0000]
add CMD_AUTOFIRE to `p`

I'm not sure `p` is the best choice, and it really doesn't stand for
anything relevant, but there was some consensus that people wanted a
thing besides shift-tab. So try this for now.

44 hours agoFix a tag upgrade issue
advil [Mon, 16 Nov 2020 19:35:21 +0000]
Fix a tag upgrade issue

44 hours agoLet staff of olgreb use the static targeter when needed
advil [Mon, 16 Nov 2020 19:21:07 +0000]
Let staff of olgreb use the static targeter when needed

44 hours agoFirst-pass implementation for quivering abilities
advil [Mon, 16 Nov 2020 14:41:24 +0000]
First-pass implementation for quivering abilities

There's a lot of idiosyncracy in the ability list, but this commit gets
the main points and works for everything I've tested directly. Probably
further tweaking is required for some special cases, and this may
require some iteration with actual player testing to really shake out
the use cases. (And the ability code is a mess, a lot more stuff could
be dataified...)

Main TODO: non-targeted abilities use the "untargeted cast" interface
when [f]iring from the quiver, but several of these would benefit from a
static targeter. (For the ones that affect the player, which is most of
them, there's not much difference, but these could still use the
self-targeted static targeter when firing.)

44 hours agoUpdate some options text for quivering-related changes
advil [Sun, 15 Nov 2020 21:51:45 +0000]
Update some options text for quivering-related changes

44 hours agoAllow quivering evokable unrands
advil [Sun, 15 Nov 2020 21:40:30 +0000]
Allow quivering evokable unrands

There are only three of these, and two are not common at all, but it's
actually pretty useful for olgreb. Because of the unrand API, this
implementation is a bit hacky, but with only a few items I'm not
currently excited about writing a more general API for some of this

44 hours agoImplement target preselection for artefacts
advil [Sun, 15 Nov 2020 19:18:51 +0000]
Implement target preselection for artefacts

There is only one artefact that currently needs this, the staff of
dispater. This finishes out the API for allowing target preselection for
everything that can be triggered via `evoke_item`.

44 hours agoImplement quivering/firing misc evocables
advil [Sun, 15 Nov 2020 18:45:16 +0000]
Implement quivering/firing misc evocables

I'm not entirely sure how useful this will be, because you usually want
to intersperse firing these with doing other things that also might be
in the quiver. But, it is straightforward to implement, and the targeted
ones needed to handle target selection anyways.

44 hours agoSome tweaks around quiver mp usage
advil [Sun, 15 Nov 2020 16:39:16 +0000]
Some tweaks around quiver mp usage

This is mostly scaffolding; to get this to work well needs another
refactor I think.

44 hours agoFix a bunch of shadow warnings
advil [Sun, 15 Nov 2020 03:36:09 +0000]
Fix a bunch of shadow warnings

44 hours agoFix some lingering grd instances, other issues
advil [Sun, 15 Nov 2020 01:46:31 +0000]
Fix some lingering grd instances, other issues

(following a rebase against master)

44 hours agoTweak autofight_throw behavior and clarify comments
advil [Thu, 8 Oct 2020 14:08:41 +0000]
Tweak autofight_throw behavior and clarify comments

This is an incremental improvement that more closely matches previous
behavior for this option; it lets hit_closest move the player with a
disabled quiver. However, I do think that many autofight options need a
rethink for generalized quivering that I haven't yet done, so there may
be further changes. (One obvious issue: autofight_throw=true and
hit_closest_nomove have pretty weird behavior if what is quivered is not
an attack.)

Holding off on full documentation updates until the fate of these
options is more settled.

44 hours agoImprove target selection for explosions/clouds
advil [Wed, 7 Oct 2020 17:02:53 +0000]
Improve target selection for explosions/clouds

For spells like fireball, this lets shift-tab use indirect targeting at
the edge of range. (Similar to how automagic behaved.)

44 hours agoImprove messaging for confused ammo firing
advil [Wed, 7 Oct 2020 17:00:35 +0000]
Improve messaging for confused ammo firing

This prints an error message, similar to spell uselessness reasons.

44 hours agoRefactor a few casting checks
advil [Wed, 7 Oct 2020 15:50:12 +0000]
Refactor a few casting checks

Because MP is decremented before your_spells is called for regular
casting, the error messaging in the targeter was showing low MP messages
in wrong cases. This handles some casting-general checks differently
than other uselessness checks so that they can be consistently performed
in cast_a_spell, and therefore ignored within your_spells. It also
removes one existing messy unwind case that worked around this. The
situation is still a bit of a mess though.

44 hours agoFix temp on several uselessness checks
advil [Fri, 2 Oct 2020 16:21:38 +0000]
Fix temp on several uselessness checks

Also switch capitalization so it conforms to everything else.

44 hours agoAdd a simplified uselessness check for passwall
advil [Fri, 2 Oct 2020 16:18:15 +0000]
Add a simplified uselessness check for passwall

Doing the real thing is not practical, but we can at least check if the
player is adjacent to something that could be passed.

44 hours agoImprove uselessness checks for corpse rot
advil [Fri, 2 Oct 2020 15:21:15 +0000]
Improve uselessness checks for corpse rot

Success was previously only checked after the fact; this refactors
things so that the spell is correctly marked as currently useless if
there are no nearby corpses. (It might be nice to also mark corpses that
would be affected in the targeter, but I won't get to that right now.)

44 hours agoClean up some necromancy preconditions
advil [Fri, 2 Oct 2020 02:45:22 +0000]
Clean up some necromancy preconditions

This adds actual uselessness checks for animate skeleton, animate dead,
and simulacrum, as well as improves code reuse for their static

This commit also changes the behavior of static targeters so that they
always start on the player. Not sure this is generally right...

44 hours agoRemove some debug code
advil [Fri, 2 Oct 2020 02:43:55 +0000]
Remove some debug code

44 hours agoSimplify launching?
advil [Thu, 1 Oct 2020 00:26:00 +0000]
Simplify launching?

This gives launchers their own quiver that stably retains the last
quivered ammo for that launcher, so that the main quiver slot can hold
something else.

tldr: tab(/v) always attacks with the main weapon if possible (/aims
with the main weapon for non-melee). Shift-tab(/f) always fires the
quivered action (/aims the quivered action). You still use the main
quiver to change the launcher ammo where relevant. (Which is pretty much
only for slings.)

Associated changes in detail:

* tab always fires a wielded launcher (as long as its quiver is not
  empty). After this change, tab is much closer to a "primary attack"
  button triggering whatever is wielded, and you have to work at it to
  get tab (as opposed to shift-tab) to fire the main quiver. (This can
  still happen if you wield a non-weapon, probably, or by messing with
  autofight settings.)
* launchers can be fired using v even if the main quiver has something
  else, similar to reaching weapons. This is kind of odd, but doing
  this as another case of CMD_EVOKE_WIELDED allowed me to reuse a
  bunch of code and also allowed me not to complicate the lua interface
  beyond what was already there for reaching.
* quivering relevant ammo in the main quiver sets it for the launcher.
  This currently the only way to change the launcher quiver. Quivering
  nothing also force-clears the launcher quiver.
* wielding a launcher autoswitches only the launcher quiver to the
  correct ammo. (Vestiges of old quiver code still track what was last
  used and select that, but this matters only for slings. More of the
  old quiver code has been removed.)
* if the quivers are different, the launcher ammo is displayed to the
  right of the wielded weapon name (potentially overwriting some of it).
  If they are the same, only the main quiver version is shown. (In this
  case, tab and shift-tab have identical results -- but shift-tab will
  only fire a launcher if that launcher's ammo is showing in the main

This is, perhaps, a step to having a full "primary action" slot
(associated by default with whatever is wielded, but where anything
could be quivered) and a secondary action slot corresponding to the
current regular quiver.

44 hours agoFix various issues with firing disabled spells
advil [Tue, 22 Sep 2020 20:32:21 +0000]
Fix various issues with firing disabled spells

This fixes an initialization bug that affected quiver cycling with
disabled spells, and smooths out a number of UI issues:

* For spells that can trigger the targeter while disabled, it generally
  prints the spell_uselessness_reason error message in the initial
  targeting prompt, which makes the situation much clearer. (There are
  still many spells that can't trigger the targeter while disabled under
  at least some circumstances, e.g. sandblast with 0 stones.)
* Currently useless spells are shown in dark grey in the targeter.
* Currently useless spells never try to find a default target if they
  can get to the targeter. (Instead the cursor starts positioned on the
* When autofiring disabled spells, it now prints the disabling reason
  rather than the default autofight error (which is sometimes fairly

44 hours agoDon't wipe out top_prompt in UIDirectionChooserView
advil [Tue, 22 Sep 2020 18:52:09 +0000]
Don't wipe out top_prompt in UIDirectionChooserView

This looks like it would have handled fire_target_behaviour correctly,
but it always cleared the prompt for the stock behaviour object that is
used in places besides throwing.

44 hours agoTweak static targeting for a bunch of self-targeted spells
advil [Mon, 21 Sep 2020 16:02:06 +0000]
Tweak static targeting for a bunch of self-targeted spells

This could possibly be simplified by adding a spflag for these? I
decided against reusing selfench for all these cases because its meaning
is a bit overloaded. Though I am not entirely sure why transmutation
spells that are self-targeted are never marked as selfench.

44 hours agoAdd a (static) targeter for frozen ramparts
advil [Mon, 21 Sep 2020 15:57:24 +0000]
Add a (static) targeter for frozen ramparts

This was the main missing complex positional targeter, unless I've
missed something. A little tricky to get exactly right.

44 hours agoImproved confused throwing from quiver
advil [Mon, 21 Sep 2020 02:53:44 +0000]
Improved confused throwing from quiver

This treats confused throwing as untargeted in the UI, so you get a
chance to abort from `f`, and it works with quiver cycling. Also,
explicitly indicate that it is different in the quiver description.

44 hours agoAdd static targeters for most untargeted spells
advil [Sun, 20 Sep 2020 20:45:52 +0000]
Add static targeters for most untargeted spells

Targeters serve two roles: aiming, and telling the player what will
happen once they trigger the action. This is especially brought out with
the revamped fire interface, which shows a targeter for any action, with
a default empty looking-around targeter as a fallback -- this UI works a
lot better if it's actually showing what to do. For many spells this is
exceedingly boring, but for some of the more exotic positional spells I
think it's actually a huge improvement for new players to be able to see
these. In some cases these targeters provide information that was
previously hard to calculate despite being deterministic, with two
standouts being the absolute zero target, and the animate skeleton
target. (If this is bad, then these spells should be randomized when
there are multiple enemies/corpses at the same distance, not

By default static targeters are not shown for `z`, but there's an option
that lets you force them even there.  No doubt they'd be kind of
annoying to long-time players but this is pretty useful information for
someone who doesn't have every spell memorized.  They are always used
for `Z` casting, and in the fire interface.

Still some cases missing.

44 hours agoImprove handling of disabled actions when cycling fire
advil [Sun, 20 Sep 2020 00:04:54 +0000]
Improve handling of disabled actions when cycling fire

In some cases, depending on the details of the action, disabled actions
can't get to a direction chooser at all (case: sandblast with 0 stones),
and so cycling to them in the fire prompt would exit the prompt.  This
just skips them for UI consistency. You can still force quiver them, and
they may still exit the prompt when doing so (depends on the action).

44 hours agoRe-implement tossing
advil [Sat, 19 Sep 2020 22:28:36 +0000]
Re-implement tossing

Tossing was temporarily impossible after throwing get refactored
entirely into the fire system. This adds an action type for tossing that
is not used unless items are force-quivered. It is currently not
possible to toss items that can be otherwise quivered, including wands.

This allows quivering items for tossing. There was some discussion
in ##crawl-dev on whether this was a good idea, and I'm not sure it is;
but as long as there is tossing at all, there is no reason to make it
impossible to do via the quiver (and in fact with the current API, that
would be more work rather than less). I don't particularly want to take
a stand on whether tossing is a good idea in the first place as part of
this commit series, so I leave things as they were.

44 hours agoRevamp fire interface to fully handle fire actions
advil [Sat, 19 Sep 2020 18:04:21 +0000]
Revamp fire interface to fully handle fire actions

This commit wraps the various ways of triggering a direction chooser in
yet another layer of api that handles cycling between and selection of
arbitrary actions. The challenge here is that there are many ways to
trigger a direction chooser, which may involve extremely idiosyncratic
setup that is not controlled internal to the direction chooser. So, to
switch from e.g. a firestorm targeter to an iceblast wand targer is
something that simply can't be done inside the direction chooser UI
without some kind of extremely major rewrite. Instead, what this does is
rebuild the custom targeter for each action while cycling in a way that
looks like a seamless UI to the player.

In the long run, there may be ways of gradually refactoring bits and
pieces of code to make this less painful. For example, if every action
were only called via the quiver::action api, then the intervening could
could be slimmed down quite a bit, with most messaging etc refactored
into actions. But, this is not practical to do all at once.  I have
however done this for throwing as a kind of prototype, since this was
basically the simplest case. (But, there's still more
refactoring/simplification to do even there.)

For untargeted spells, right now in the fire interface you basically
just get a variant of the "just looking" targeter. However, I think
there are better things to do for many of these spells that will come in
a future commit.

44 hours agoQuiet beam messages by default
advil [Fri, 18 Sep 2020 12:53:49 +0000]
Quiet beam messages by default

I should have done this years ago.

44 hours agoRemove "quiver unavailable"
advil [Wed, 16 Sep 2020 00:31:53 +0000]
Remove "quiver unavailable"

Now, just show the quivered element grayed out.

44 hours agoAdjust newquiver save compat behavior
advil [Wed, 16 Sep 2020 00:20:20 +0000]
Adjust newquiver save compat behavior

Now loads the previously quivered ammo.

44 hours agoAdd a custom quiver display for sandblast
advil [Tue, 15 Sep 2020 23:48:42 +0000]
Add a custom quiver display for sandblast

Also, generalize some sandblast code, and only show item count in the
message window if the spell is not quivered.

44 hours agoFirst-pass menu for generalized quivering
advil [Tue, 15 Sep 2020 15:41:55 +0000]
First-pass menu for generalized quivering

This is probably still missing all sorts of bells and whistles, but it
provides a quiver selection menu that covers the basics for the `Q`
menu, as well as selecting items from the fire interface.

44 hours agoClean up evoke checks a bit
advil [Mon, 14 Sep 2020 14:57:02 +0000]
Clean up evoke checks a bit

Move more checks into evoke_check, and use it more widely (including for
quivering wands).

This handles zigfigs and reaching slightly differently than in the past;
while berserk (etc) V is now possible if either of these are in play,
but will only show the currently enabled items in the menu.

44 hours agoImprovements to fire order and display
advil [Mon, 14 Sep 2020 14:05:52 +0000]
Improvements to fire order and display

Refactored the initial implementation of find_next to be more general
and clean, and improved a bunch of is_enabled checks and messaging.

44 hours agoImprove autotargeting for various quivered spells
advil [Sun, 13 Sep 2020 18:02:08 +0000]
Improve autotargeting for various quivered spells

This is the direction chooser's smart autotargeting for most spells on
top of (or in some cases instead of) autofight target selection. There
are a few cases where it is necessary to drop to manual targeting, but
for the most part this allows sensible shift-tab behavior for various
complicated spells like LRD, cloud spells, etc. The simple_targeting
option applies if set.

There's still a somewhat involved division of labor between autofight
target selection and the direction chooser, where afaict the main
difference is that the former prioritizes closer targets, and the latter
prioritizes previous targets if there any, and then closest targets.
Possibly this could all be simplified into one thing? But for now
autofight handles messaging in a useful way for all sorts of error

44 hours agoSkip digging for quiver
advil [Sun, 13 Sep 2020 13:20:50 +0000]
Skip digging for quiver

There's no use for this that I can think of, and it has a bad
interaction with default autotargeting.

44 hours agoTrigger untargeted actions directly on autofire
advil [Sun, 13 Sep 2020 01:13:12 +0000]
Trigger untargeted actions directly on autofire

That is, bypass all the convoluted lua stuff when a target is not

Some of these may do better with an error if there is no foe, but this
new blanket behavior behavior matches the regular cast behavior so it's
a bit closer to what you would expect. Some interesting cases to think
about: blink, berserk (not yet implemented), foxfire, conjure flame,
irradiate. More fine-grained logic needed..

44 hours agoSimplify default shift-tab behavior
advil [Sun, 13 Sep 2020 00:53:21 +0000]
Simplify default shift-tab behavior

The previous behavior was to use the quiver only when not in melee range
(and not wielding a launcher). This new behavior seems more appropriate
for the wider range of quiver options now available, including actions
that are untargeted: it simply always triggers the action on shift-tab.
The previous behavior is still present and bindable.  It might be nice
to have better in-game customization of this because I'm not sure
there's one default that really does make sense across all action types.

This is bolted on in a somewhat hacky way to existing autotarget code. A
better refactor might be to extract only the targeting code from
autofight, and have actions use that directly to find a target only when

44 hours agoAllow quivering wands
advil [Sat, 12 Sep 2020 23:13:14 +0000]
Allow quivering wands

This was relatively straightforward to implement, given all the previous
infrastructure. However, it is once again ui-incomplete; you can quiver
wands from the Q menu but only using *.

Another obvious issue (that will apply to some spells as well) is that
the fire targeter doesn't handle custom hitfuncs, e.g. for iceblast.

44 hours agoUpdate docs for quiver miscast severity option
advil [Sat, 12 Sep 2020 23:07:35 +0000]
Update docs for quiver miscast severity option

44 hours agoDon't quiver dangerous spells by default
advil [Sat, 12 Sep 2020 22:14:36 +0000]
Don't quiver dangerous spells by default

This adds an option to let you control the miscast severity threshold
for this check, defaulting to no dangerous spells. (I'm not sure if any
book starts might have their starting spell excluded with this default,
so it may need some tweaking.)

Also, removes an annoying dprf.

44 hours agoImplement quivering spells
advil [Sat, 12 Sep 2020 17:16:37 +0000]
Implement quivering spells

This provides a much better interface to spell firing than automagic.
This commit is *not* ui-complete: while quivering spells via cycle and
cycle under `f` should be fully implemented, I have not yet worked on
the `Q` menu or the menus from `f`, which both still only let you quiver

Some notes
* book starts will autoquiver a spell if that's first in the fire order.
* there's still a lot of legacy code that I don't understand well enough
  to have fully removed. TBD.
* I've left in the legacy serialization code for the ammo history, which
  definitely needs some revisiting. Actions are now serialized as a prop
  though, in a much simpler way.
* some polishing TODOs remain, and this is a complicated enough change
  that this commit may still lead to unexpected behavior. (E.g. I'm 80%
  certain there's no tricky way for felids to fire ammo with this new
* no options yet affect this, it may be desirable to tweak fire_order.

44 hours agoLet beam spells target test statues without Z
advil [Sat, 12 Sep 2020 16:34:48 +0000]
Let beam spells target test statues without Z

44 hours agoDon't let browser eat shift-tab in webtiles
advil [Sat, 12 Sep 2020 02:50:29 +0000]
Don't let browser eat shift-tab in webtiles

44 hours agoRefactor and generalize quivering
advil [Fri, 28 Aug 2020 19:46:25 +0000]
Refactor and generalize quivering

This commit rewrites the quiver to be both more usable and more general,
cleaning up a lot of ncient and hard-to-understand logic.
The basic idea is that what gets quivered is a quiver::action, and this
is stored directly. This class abstracts over many of the details of
what kind of action it is, paving the way for some interesting future
commits. Right now, though, the system just reimplements the old quiver
functionality involving ammo.

I was not able to fully eliminate the old player_quiver, but the
descendent class (quiver::history) is much simpler and used basically
for tracking what was last quivered of any ammo type. Right now, it
still handles serialization as well, and inventory changes. Most of the
weirdest stuff is cleaned up, hopefully.

There may be some logic changes (because old quiver logic was quite
convoluted and I don't necessarily understand everything it did). One
that I do know of is that throwing ammo won't auto-quiver when you run
out of launcher ammo.

44 hours agoRename a quiver enum
advil [Mon, 10 Aug 2020 16:28:54 +0000]
Rename a quiver enum

44 hours agoRudimentary API for programmatic targeting
advil [Mon, 3 Aug 2020 19:57:52 +0000]
Rudimentary API for programmatic targeting

Many commands implicitly take a target as an argument, and collect that
argument only via the interactive direction chooser. Because of this,
the only way to script these commands (e.g. in autofight.lua) is to send
commands to the interactive direction chooser interface. As the
direction chooser has become more widgetified, this has become heavier
and heavier to do, leading to noticeable lag in autofire. At the same
time, interacting with this UI programmatically has long been a source
of hard-to-solve bugs and brittleness. For these reasons, this commit
adds a first pass implementation of supplying a target directly to such
commands, and uses it for autofire and autoreach. On the c++ side, there
is now a non-interactive way of calling the direction chooser that still
uses all the error checking and messaging. On the lua side, there is a
way of supplying (so far, just a few) commands directly with a
player-relative coordinate. This commit leaves automagic untouched (and
regular melee combat doesn't use the direction chooser).

2 days agoImprove net traps
Nicholas Feinberg [Wed, 25 Nov 2020 02:37:53 +0000]
Improve net traps

Prior to this commit, net traps would fire exactly once, launching a
net that the player could use. After this, they'd be destroyed. This
encouraged the player to intentionally and methodically step on net
traps to 'disarm' them and to get net traps for their own use. Not
particularly interesting or fun gameplay!

Instead, make net traps permanent, and make their nets always mulch.
This will make life a bit harder for players in some places (Zot,
Tomb), but we can always adjust trap frequency as appropriate.

2 days agoRework player spell accuracy display
Nicholas Feinberg [Wed, 25 Nov 2020 01:47:06 +0000]
Rework player spell accuracy display

It didn't work - the approximation was too crude. We pretended we
were only rolling a random number once (for to-hit), but we actually
rolled target EV 3 times as well - and more rolls if the target had

We now try to simulate most of that (though not rMsl). It seems like
even in the worst likely cases (high-accuracy spells against a haloed
high-EV target), we only run about 150k iterations, which is very fast
locally. This produces much more accurate results.

The correct solution is to simplify the beam accuracy calculations,
as we have with melee/ranged attack accuracy, but that's a larger
task than I want to attempt this close to feature freeze.

2 days agoRename greater mummies to royal mummies (gressup)
Nicholas Feinberg [Wed, 25 Nov 2020 02:14:49 +0000]
Rename greater mummies to royal mummies (gressup)

The great crusade against greatness continues. 'Greater' is a pretty
vague and generic descriptor when the existing lore (the monster description)
already calls these terrifying creatures 'ancient pharoahs'. It's also
annoyingly close to the name of 'guardian mummies', which shows up in
the same place! Let's differentiate a bit.

You may call these "mummyrajas" if you prefer.

2 days agoDon't show the zot clock in Abyss
Nicholas Feinberg [Wed, 25 Nov 2020 02:03:06 +0000]
Don't show the zot clock in Abyss

Or on the orb run or wherever else it might be disabled, even if
always_show_zot is on.

2 days agoFix for hep games that get soft-locked in abyss
advil [Tue, 24 Nov 2020 18:00:24 +0000]
Fix for hep games that get soft-locked in abyss

Under some poorly understood circumstances, hep ancestors can drop
weapons in the abyss, and when they do, sometimes (???) these items can
form a stack. The former just causes annoying errors, but the latter
will trigger a crash any time `abyss_morph` is triggered. With
relatively deterministic rng these days, that will soft-lock the game in
the abyss; I think in the past when this happened you could just reload
and end up with a different rng state by doing some stuff in the ui, and
then if you were lucky the crash wouldn't replicate).

This commit fixes the symptoms by clearing the buggy items during
abyss_morph. More crashlogs won't really help at this point, there are
plenty and still no one has figured out how to replicate this crash.

3 days agoAdd a killer klown kast message (zipskins)
Nicholas Feinberg [Tue, 24 Nov 2020 01:14:34 +0000]
Add a killer klown kast message (zipskins)

3 days agoDescribe marshlight in monster (vt)
Nicholas Feinberg [Tue, 24 Nov 2020 01:10:55 +0000]
Describe marshlight in monster (vt)

3 days agoDon't claim fireballs can miss (lici)
Nicholas Feinberg [Tue, 24 Nov 2020 01:06:58 +0000]
Don't claim fireballs can miss (lici)

3 days agoRemove an unused function
Nicholas Feinberg [Tue, 24 Nov 2020 01:04:51 +0000]
Remove an unused function

5 days agoShow spell to-hit % in the targeter
Nicholas Feinberg [Sat, 21 Nov 2020 21:40:51 +0000]
Show spell to-hit % in the targeter

This is a fairly crude approximation, but I think it should be
relatively correct. It's nice to have a basic sense of how likely
you are to hit, for both players and devs - balance is a lot harder
without real accuracy numbers!

5 days agoMake lighting affects beams more like attacks
Nicholas Feinberg [Sat, 21 Nov 2020 21:24:24 +0000]
Make lighting affects beams more like attacks

Lighting effects (accuracy bonuses from haloes and penalties from
umbrae) were applied before the to-hit roll for beams and before the
roll for melee & ranged attacks, meaning that they had roughly half
the effect on beams that they did on attacks. This doubles their
effect on beams to be more consistent with attacks. Players will see
better results with wands and spells under TSO and worse results
trying to hit anything near a profane servitor with spells.

6 days agoHalve distortion banish weight (hellmonk)
Nicholas Feinberg [Sat, 21 Nov 2020 01:15:20 +0000]
Halve distortion banish weight (hellmonk)

From 14964f1db53dd4 :

    ...if the new distortion becomes too strong with a 10% banish
    these numbers can be further adjusted.

6 days agoRemove invocation removal
advil [Fri, 20 Nov 2020 21:22:17 +0000]
Remove invocation removal

on switching gods. Also remove some vestigial code.

7 days agoReplace tloc -Tele with -Move
Nicholas Feinberg [Fri, 20 Nov 2020 05:40:35 +0000]
Replace tloc -Tele with -Move

-Tele was a cute downside for translocation spells, which are often
about escape. However, it was sometimes quite advantageous: players
faced with an undesirable teleport trap could memorize a tloc spell
and miscast it to pass through. Funny, but not very entertaining

So, replace -Tele with -Move, completely preventing the player from
moving (ala treeform + dimensional anchor) for a short period.
Seems much more commonly relevant, and significantly less likely to
encourage boring play patterns.

7 days agoIncrease marshlight cast frequency
Nicholas Feinberg [Thu, 19 Nov 2020 16:13:57 +0000]
Increase marshlight cast frequency

Since it's really the only thing will-o-the-wisps do, they can afford
to cast their spell closer to 1/4 times instead of 1/6.

7 days agoSlow goliath frogs down a bit
Nicholas Feinberg [Thu, 19 Nov 2020 16:12:21 +0000]
Slow goliath frogs down a bit

They've been consistently more lethal than intended. Going from
speed 14 to speed 12 should reduce damage & corrosion, as wel as
giving players more ways to escape their terrifying anuran wrath.

7 days agoFix spriggan druids not casting Awaken Forest (Lici)
gammafunk [Thu, 19 Nov 2020 11:55:16 +0000]
Fix spriggan druids not casting Awaken Forest (Lici)

Broken in c03f2b59, the original logic inverted in that batch of fixes
was in fact correct. Spriggan druids had the spell, but would never try
to cast it before this fix.

8 days agoReword the demigod description (monkeytor)
advil [Thu, 19 Nov 2020 01:20:25 +0000]
Reword the demigod description (monkeytor)

wow, yeah.

8 days agoFix some problems in a vault
gammafunk [Wed, 18 Nov 2020 15:00:28 +0000]
Fix some problems in a vault

The newly introduced gammafunk_indiana_jones was fairly spoilery, since
you couldn't see much into the vault. Vaults that don't fully reveal
their contents to the outside will always have some amount of spoilers,
but this vault didn't telegraph what the player would face, which
includes Zot traps at later depths. Allow peering well into the vault
from outside the runed door by turning some strategically chosen walls
into floor (or possibly Zot traps at the right depth).

Additionally the internal layout was very closed, making it very easy to
fighting the first wave of monsters 1v1. Add some randomized floor to
the switchback walls. Also turn the last door into a clear one so the
player can see the full contents of the treasure room before deciding to
fight any boulder beetles. Finally, use an inner wall of rock that we
can decorate with thematic wall tiles, behind which we use stone to
prevent easy digging. Also use decorative floor tiles to match the

9 days agoTurn monster explosions into fineffs
Nicholas Feinberg [Wed, 18 Nov 2020 06:30:26 +0000]
Turn monster explosions into fineffs

Explosions firing immediately causes a pretty classic set of issues -
we're invalidating the old state of the world in surprising ways. For
example, if a ball lightning explodes and kills an attacker midway
through the resolution of a multi-target attack (e.g. a javelin toss),
the game just has no way to figure out how to resolve the rest of the
attack afterward - it can't generate new ranged_attacks without the
original attacker, so it just crashes.

Instead, let's wait until the *end* of any ongoing melee attacks or
beams before triggering death explosions. The timing here is slightly
different for attack-triggered fineffs - we trigger them a little later
now melee attacks, in - but hopefully that's ok.

Overall, this code is very bad and probably buggy. I'm sorry.

9 days agoConstify torment_player agent
Nicholas Feinberg [Wed, 18 Nov 2020 05:17:57 +0000]
Constify torment_player agent

9 days agoConstify petrify agent
Nicholas Feinberg [Wed, 18 Nov 2020 05:16:51 +0000]
Constify petrify agent

9 days agoConstify banish agent
Nicholas Feinberg [Wed, 18 Nov 2020 05:16:10 +0000]
Constify banish agent