11 months agoUpdate changelog 0.24.1
Aidan Holm [Sun, 22 Mar 2020 04:13:16 +0000]
Update changelog

12 months agoDisable lua load(), loadstring() bytcode loading
Aidan Holm [Sun, 16 Feb 2020 05:34:42 +0000]
Disable lua load(), loadstring() bytcode loading

(cherry picked from commit fc522ff6eb1bbb85e3de60c60a45762571e48c28)

12 months agoDisable lua bytecode loading
Aidan Holm [Thu, 13 Feb 2020 13:31:55 +0000]
Disable lua bytecode loading

(cherry picked from commit 768f60da87a3fa0b5561da5ade9309577c176d04)

14 months agoFix ally warning prompt for irradiate
advil [Sun, 15 Dec 2019 20:12:20 +0000]
Fix ally warning prompt for irradiate

This prompt should trigger for monsters that are not protected by
fedhas, rather than players that are not protected by fedhas.

(cherry picked from commit ea9b1ad378ae3a1e765560b0b078223cd5c41919)

14 months agoFocus arena text input widget automatically
advil [Sun, 15 Dec 2019 19:45:59 +0000]
Focus arena text input widget automatically

(cherry picked from commit e69d3d42356f77db088fef4ee351afb86e1179a2)

14 months agoFix a cherry-picking issue
advil [Sun, 15 Dec 2019 19:44:15 +0000]
Fix a cherry-picking issue

14 months agoFix a missing !
advil [Sat, 14 Dec 2019 22:09:31 +0000]
Fix a missing !

(cherry picked from commit 84510d0c19a9303d166f32dd068585292d40d299)

14 months agoVarious improvements to seed selection
advil [Thu, 12 Dec 2019 22:26:08 +0000]
Various improvements to seed selection

This started just as an attempt to get the seed input dialog to be
focused on game start, but that led to various other issues:
* [enter] only begins the game when seed selection or the begin game
  button are selected.
* ctrl-v now works for pasting.
* the [enter] button is disabled when there is no valid seed (rather
  than acting like esc in that case)
* full pregen button is reenabled offline, there is still demand.
* hotkeys -, p, and d now work when the seed input box is focused.
* hotkeys -, p, d now cause the seed input box to become focused.
* a bug (I think) where hotkeys always preempt other events, even if
  their handler returns false, is fixed. (I could be misunderstanding
  the intent here, as this looked semi-purposeful -- but this doesn't
  seem like the behavior that would be intended.)
* other formatting / wording tweaks.

Main remaining issues that I know of:
* clicking enter while - or d buttons are selected (via tab) in
  webtiles still starts the game if it can; in local tiles it does
  nothing. This seems to be because clicking on a button in webtiles
  doesn't change the focus.
* in all platforms, hitting [esc] while anything is focused defocuses
  it. This is most weird in the seed input box, on tiles/webtiles, where
  players won't have been as likely to navigate the ui with keys, and so
  will be expecting [esc] to cancel.
* webtiles could use some visual tweaking
* if you hit esc from the species menus after seed selection, it returns
  to the main menu instead of seed selection.
* It's posible this ui should give some clearer indication that entering
  0 will actually start a different game type than anything else.

(cherry picked from commit 406d6369f5b89184d34c52227ab302006457ed54)

14 months agoFix (?) a race condition with ui state syncing
advil [Thu, 12 Dec 2019 22:18:27 +0000]
Fix (?) a race condition with ui state syncing

When starting up the game and opening the seed selection dialog, the
game fills in a seed and attempts to sync that to the js client. If the
js client doesn't receive and process that message fast enough, it will
send a sync message to the game with a blank text field; in my local
setup these actually cross paths and things end up in an inconsistent
state: the game thinks the field is empty, but there is still a number
showing on the client side. (If the player does more things in the UI
that number will be resynced, so it is only on immediately pressing
enter that there is buggy behavior.)

This fix is very brute-force, and I'm not sure it'll really get all the
cases. I'm generally worried that this syncing mechanism can have
race-cases like this beyond just the game start, and also it seems like
the possibility of messages crossing paths might need to be dealt with
more consistently.

(cherry picked from commit b77388520f1f6db06d4e54859c6dedf52ed2be55)

14 months agoDon't crash when checking if fedhas protects player from igniting
advil [Wed, 11 Dec 2019 19:38:33 +0000]
Don't crash when checking if fedhas protects player from igniting

act->as_monster() returns nullptr for the player, so some check like
this needs to happen. Not immediately sure if clouds under the player
should return 0 or a negative value, this goes with negative.

(cherry picked from commit 56a5b498927223add9570b1fadc9b95db20dc7d8)

14 months agoFix message replay at main menu
advil [Tue, 10 Dec 2019 04:18:05 +0000]
Fix message replay at main menu

This is sort of a quick fix. e48d713e changed the behavior of
split_string so that it parsed '' into a single segment '', where before
it would turn '' into an empty segments list. The old behavior
implicitly prevented the log replay from filling the buffer with many
empty lines. This commit fixes the issue by restoring the old behavior
just for log replays, and doesn't address the question of why these
empty log messages are there in the first place.

(cherry picked from commit fa4545f1593f0dcd21c3228b01f41cab69631961)

14 months agoAdd missing SUBST to gammafunk_ghost_icy
James Buck [Sun, 1 Dec 2019 19:40:56 +0000]
Add missing SUBST to gammafunk_ghost_icy

Fixes an ugly green tile when placed in Lair.

(cherry picked from commit 6f1b5d974a44747ffb209147c242f7ed48965911)

14 months agoHandle HUPs better in lua interpreter
advil [Mon, 2 Dec 2019 15:42:55 +0000]
Handle HUPs better in lua interpreter

Previously, this code ran in a tight loop if a hup was received, because
the input function always returned immediately. This led to stuck
high-cpu processes and crashes when a webtiles client disconnected, or
when an ssh connection was lost, while the lua interpreter was running.
This commit should simply break the loop on this case. It's possible it
would be even safer to not do a repl loop at all on empty input for
online games...

(cherry picked from commit 28950d1e3277c9363f914e90e2e9ef2b59c677d1)

14 months agoUse targeter_radius hitfuncs for friendly fire checks
Edgar A. Bering IV [Mon, 25 Nov 2019 20:55:02 +0000]
Use targeter_radius hitfuncs for friendly fire checks

This replaces the helper function _irradiate_is_safe

(cherry picked from commit abb5cbb05e130d4e0c105c3b22ee7b6a9a278392)

14 months agoGeneralize and rename targeter_los
Edgar A. Bering IV [Mon, 25 Nov 2019 20:04:20 +0000]
Generalize and rename targeter_los

Rename it to the more accurately descriptive targeter_radius, and
include a constructor parameter for specifying a range minimum to
exclude an inner radius.

(cherry picked from commit 8bd92b5b85697d897d72bf35a9936d6845bbbd7a)

14 months agoDon't crash in the ignite poison cloud tracer
Edgar A. Bering IV [Mon, 2 Dec 2019 05:43:05 +0000]
Don't crash in the ignite poison cloud tracer

Only check Fedhas protection from clouds for players; monster Fedhas
worshippers clouds will hurt plants. Only relevant for player ghosts.

(cherry picked from commit 0bb11aece907eb65d20ffc285a7080bd3143b47c)

14 months agoFix monster ranged attack logic for some wands
gammafunk [Sun, 1 Dec 2019 04:27:47 +0000]
Fix monster ranged attack logic for some wands

Monsters learned how to use wands of clouds, iceblast, and scattershot
in 0.24, but the logic to determine whether monsters have ranged attacks
was not updated. This logic is used for player sensing nearby danger and
some aspects of monster movement; monsters were able to use these wands
before this commit.

(cherry picked from commit 8d00908bc72baec4790d6a7aa9345dd3008c639f)

14 months agoFix chat keeping focus trapped after hiding (#12140)
Aidan Holm [Sun, 1 Dec 2019 02:32:33 +0000]
Fix chat keeping focus trapped after hiding (#12140)

When spectating with chat activated, the player quitting/dying/exiting
caused the chat input to be hidden, which did not deactivate the focus
trap. This fix uses a MutationObserver, which does require IE10; AFAIK,
the previously supported minimum was IE9, but we shall see if anyone
complains first..

(cherry picked from commit 17f9c9cab5b70c2fbdce88e9027720949a09c2dd)

14 months agoFix minimized chat not being expandable via click
Aidan Holm [Sun, 1 Dec 2019 02:06:00 +0000]
Fix minimized chat not being expandable via click

Caused by over-eager click event filtering; turns out the minimized chat window
is a totally separate element (#chat_hidden).

(cherry picked from commit c6a9f38f4bce2adf366ca66427b23b7c307ad563)

14 months agoFix webtiles chat stuck focus issue
Aidan Holm [Sun, 1 Dec 2019 00:43:45 +0000]
Fix webtiles chat stuck focus issue

When clicking the chat input, document.activeElement has already been updated by the time the focusin event is received, so the focus trap
stores the chat input as the previously focused element; when it is
deactivated, it will then refocus the chat input.

The focus-trap docs refer to a setReturnFocus option, but this doesn't
seem to work as intended. Disabling return focus fixes this for now.
Unfortunately this means that entering and exiting chat from a UI with
focusable elements (e.g. seed selection) will lose the currently focused
element, until a workaround is implemented.

(cherry picked from commit b8371ea956574c3798225ec4015b0c9505db3d8c)

14 months agoFix "Found item" messages not being coloued correctly (gammafunk)
Aidan Holm [Tue, 26 Nov 2019 11:43:26 +0000]
Fix "Found item" messages not being coloued correctly (gammafunk)

This was caused by mpr() not supporting formatted_strings, which were
being silently converted to plain std::strings, discarding all colour

(cherry picked from commit dbf363a7764abcd79cc012143a4f204229082a87)

14 months agoDon't trap monsters in Zig pillars (AliasTheSpectator)
gammafunk [Tue, 26 Nov 2019 07:49:09 +0000]
Don't trap monsters in Zig pillars (AliasTheSpectator)

The Ziggurat pillar vault ziggurat_pillar_centre_drop places monsters
behind fully opaque walls, providing a teleport trap to release them.
This no longer works with LOS requirements for trap triggering, so make
the vault always have transparent rock or stone windows. I've also
modified the vault substitutions so that the windows will always be
diggable when the rest of the vault is.

(cherry picked from commit 4c60e79141c362d90068ce56f7018348256c8d36)

14 months agoFix spell colors for Divine Exegesis
gammafunk [Mon, 25 Nov 2019 21:32:46 +0000]
Fix spell colors for Divine Exegesis

No longer show spells listed by Divine Exegesis as dark grey if they
couldn't be memorized due to spell level restrictions, since the ability
doesn't care about spell levels.

(cherry picked from commit d145f35b4e071570abe9dff875ce09804f884578)

14 months agoTidy up a bit
Aidan Holm [Tue, 27 Aug 2019 12:14:04 +0000]
Tidy up a bit

(cherry picked from commit 1a393a3f05271601a7d6f5d18438597f594db9b8)

14 months agoSimplify some local tiles code
Aidan Holm [Tue, 27 Aug 2019 09:13:34 +0000]
Simplify some local tiles code

(cherry picked from commit 4f669b765a44df2c1888f215f5ccde2da8f8374e)

14 months agoShow sprint help for sprint menu help button (GH #1203)
Aidan Holm [Mon, 25 Nov 2019 14:39:53 +0000]
Show sprint help for sprint menu help button (GH #1203)

This handler is only called for the tutorial and sprint menus, and the
tutorial lacks a help button, hence the assertion.
'6' is the hotkey for the sprint section. Blegh.

(cherry picked from commit 529652008a4adedbed46c2b26b014631be9c642a)

14 months agoFix webtiles chat not responding to mouseclicks (12136)
Aidan Holm [Mon, 25 Nov 2019 13:07:33 +0000]
Fix webtiles chat not responding to mouseclicks (12136)

Predictably, the focus-trap library was responsible here, along with
some over-eager trapping of events. Thankfully the focus-trap has a very
useful allowOutsideClick hook which does exactly what we want; pass
through click events to attached handlers under certain conditions.

Separately, we also need to not capture all events if the focus is
outside the popup; this allows exiting the chat window with the escape
key when a popup is open. Regrettably, the focus-trap library does not
provide onPause/onUnpause hooks to facilitate this, but we can make do.

(cherry picked from commit f1674c61360c266cf470448cb2ae6259cf1b7514)

14 months agoDeclare a global function
gammafunk [Sun, 24 Nov 2019 20:42:35 +0000]
Declare a global function

This was apparently omitted in the artefact code perfomance improvements
made in ca9b7906.

(cherry picked from commit 836c352ace4d39d726197b908be75f2febd678b1)

14 months agoDon't crash when right clicking in local tiles
advil [Fri, 22 Nov 2019 22:21:55 +0000]
Don't crash when right clicking in local tiles

I don't understand the circumstances under which this event is getting
sent, but just ignoring it seems to work.

Resolves #1210

(cherry picked from commit 16436c44074e9082562cfcee73d1d1bc152798b7)

14 months agoUse yaml.safe_load instead of load
Istvan Marko [Tue, 19 Nov 2019 18:00:51 +0000]
Use yaml.safe_load instead of load

PyYAML'S yaml.load is insecure and it is deprecated in 5.1. Some
distributions even disable it, making it difficult to build DCSS on
them. Use the recommended safe_load instead.

(cherry picked from commit b55e97dba554816f0fcaa2f52a95877982986072)

14 months agoFix mouse click not working in skill menu (12133)
Aidan Holm [Thu, 21 Nov 2019 00:32:40 +0000]
Fix mouse click not working in skill menu (12133)

The event handler was being called with a CK_MOUSE_CLICK dummy key sent
from UISkillMenu::on_event(), delivered directly to the skill menu via
Widget::on_event(). This meant that the event did not bubble, and would
not be caught by a handler attached to the skill menu parent.

(cherry picked from commit b7fd73da8f169dc02e4d0dbf877393933d0015e7)

14 months agoFix input_dialog key binds on webtiles (kitchen_ace)
Aidan Holm [Wed, 20 Nov 2019 04:12:11 +0000]
Fix input_dialog key binds on webtiles (kitchen_ace)

(cherry picked from commit 0c4bda3fdf999f6b8d2f0fa444c84e0f6b9e87a5)

14 months agoGrammar fixup
Aidan Holm [Wed, 20 Nov 2019 02:58:05 +0000]
Grammar fixup

(cherry picked from commit 11d28fe0fd3366dd7b4314d08d9b6f016b46f3be)

14 months agoUse textbox widget for msgwin_get_line() popup
Aidan Holm [Fri, 15 Nov 2019 06:12:32 +0000]
Use textbox widget for msgwin_get_line() popup

(cherry picked from commit 7faa4cee5b48fe1cab8932755258a0367ea4fd6a)

14 months agoFix hotkey binding encoding on webtiles client
Aidan Holm [Thu, 14 Nov 2019 08:53:32 +0000]
Fix hotkey binding encoding on webtiles client

On the crawl server, all key events are encoded as integers; HTML/JS
does not provide a way to map a keydown event to an ascii keycode (while
crawl does a whole lot of rather strange mapping, the keys we care about
and wish to bind as hotkeys are almost all within a-zA-Z0-9). This
makes complete sense because a key and a character are separate
things, but it does mean some extra conversion is required.

This commit adds ui.utf8_from_key_value() and ui.key_value_from_utf8();
these convert a key value name string, such as "D" or "Enter" to/from an
integer that the crawl server recognizes.

(cherry picked from commit 0541610ab625f32ac745ac150d43fef24e90efd7)

14 months agoRemove unneeded focus
Aidan Holm [Thu, 14 Nov 2019 09:06:09 +0000]
Remove unneeded focus

(cherry picked from commit b6c28e0f30efabea064df3500255a0f899db8500)

14 months agoAdd textbox paste from clipboard function
Aidan Holm [Thu, 14 Nov 2019 04:09:59 +0000]
Add textbox paste from clipboard function

(cherry picked from commit ce263d24b725d9bf8605765226b68618b794a676)

14 months agoFix focus traps breaking webtiles chat
Aidan Holm [Tue, 12 Nov 2019 18:11:14 +0000]
Fix focus traps breaking webtiles chat

Focus traps on the top-level popup prevent the chat box from being
focused. To fix this, when showing the chat, we enter a new focus trap,
and leave it when returning to the game. This is complicated by the fact
that the chat JS is effectively non-modifiable (not in game_data), so we
attach to the focusin event. You can tab around within the chat popup;
the focus-trap class prevents nested traps when doing so.

(cherry picked from commit f2554d85d009e6431b42bf65d4e14391a8a02958)

14 months agoImprove focus rendering for webtiles watchers
Aidan Holm [Mon, 11 Nov 2019 19:52:34 +0000]
Improve focus rendering for webtiles watchers

On watching clients, don't use focus traps, and disable all focusable
input elements. Since we can no longer rely on the input focus, we add a
style-focused class to take its place on watching clients. This produces
a much better experience when spectating.

(cherry picked from commit afe43dc842c9a2f5cbec7d4473338335296d3b66)

14 months agoRemove unnecessary set_focused_widget() calls
Aidan Holm [Mon, 11 Nov 2019 17:45:38 +0000]
Remove unnecessary set_focused_widget() calls

(cherry picked from commit 1c8e11a9600d10921adc622ec2e7bcc151665ae6)

14 months agoRemove unused headers
Aidan Holm [Fri, 8 Nov 2019 05:31:32 +0000]
Remove unused headers

(cherry picked from commit f460fa4231fb31e12da24d17bf442f33ac66cc0d)

14 months agoMake webtiles seed selection dialog scrollable
Aidan Holm [Thu, 7 Nov 2019 11:14:12 +0000]
Make webtiles seed selection dialog scrollable

(cherry picked from commit 40106efd0cfcd863ef9e1c621f019c64e9c6bb7f)

14 months agoSmall refactor of event handlers
Aidan Holm [Thu, 7 Nov 2019 05:28:43 +0000]
Small refactor of event handlers

(cherry picked from commit 1855e6e8d2b4897be28aec268642c81a241ee6d8)

14 months agoExtract MenuButton focus-on-hover behaviour
Aidan Holm [Wed, 6 Nov 2019 13:55:09 +0000]
Extract MenuButton focus-on-hover behaviour

Previously, buttons would take input focus when hovered. Now, this only
happens for buttons within OuterMenus, and it is the OuterMenu which
adds the event handlers for this. This makes MenuButtons much nicer to
use outside of OuterMenus, and they will probably be moved into

Since they can be hovered without being focused, some additional
rendering code is needed.

(cherry picked from commit cd842479fad1df28664aea90207f1144d4808e5f)

14 months agoUse textbox for arena UI
Aidan Holm [Wed, 6 Nov 2019 13:52:30 +0000]
Use textbox for arena UI

(cherry picked from commit da5b7fe257c27089b8fbaae514cf2b58bda161bb)

14 months agoRefactor menu button activation handling
Aidan Holm [Wed, 6 Nov 2019 12:42:40 +0000]
Refactor menu button activation handling

This adds an ActivateEvent and a corresponding on_activate_event()
helper. Activate events are emitted when a button (and, in the
future, other widgets?) is activated by clicking, pressing its hotkey,
or pressing space/enter while it has input focus. Activate events
bubble, so you can add a handler to the button itself, or to a
higher-level container containing many buttons within it.

(cherry picked from commit 0ead14ac9503ed7d949cd5e3ee12e91b11ded561)

14 months agoRefactor event delivery
Aidan Holm [Wed, 6 Nov 2019 12:44:32 +0000]
Refactor event delivery

This commit attempts to make event delivery more centralized, by moving
most calls to widget->on_event() to a single function responsible for
event delivery up and down the widget layout. This should make event
propagation easier to understand.

(cherry picked from commit b87a47e8d26d4386b92e23caad741a5c8bc2a6d1)

14 months agoAdd ui-specific event class
Aidan Holm [Tue, 15 Oct 2019 13:09:41 +0000]
Add ui-specific event class

Mostly necessitated by the need to add an event target member.

Different event types are now implemented as subclasses. Unfortunately
this means downcasting via static_cast<> in some cases, although the new
on_foo_event() handlers remove that need by passing a derived event.

I'm not too sure about the Event::Type::Foo verbosity... otherwise, it's
mostly a net improvement. In C++20 you can do `using enum Event::Type;`
which might help, when we get C++20.

(cherry picked from commit 2c8c973532bfc2b9ecbd7f59c5ed8358304c9ddf)

14 months agoAdd event handler helper functions
Aidan Holm [Wed, 6 Nov 2019 01:55:17 +0000]
Add event handler helper functions

This commit hides the ugly event handler slots mechanism, adding clearly
named event handler helpers that, in the case of on_keydown_event,
removes the need to check the event type.

(cherry picked from commit 65a924605436f0f80ad29b65c3f7d9c230610638)

14 months agoSync all widget state on layout push
Aidan Holm [Wed, 6 Nov 2019 00:05:48 +0000]
Sync all widget state on layout push

Initial widget state is often set before pushing the new layout, causing
sync messages that are discarded by the webtiles client (since the
corresponding layout HTML has not been created). In order for these
widgets to have the correct state on webtiles clients, the state must be
resent on push.

(cherry picked from commit 52f71b681cfe4e1bd636d5d98e5b4560c32c7274)

14 months agoAdd focus sync
Aidan Holm [Sun, 10 Nov 2019 12:28:34 +0000]
Add focus sync

Mostly straightforward. One caveat is that widgets require a sync-id to
have their focus state synced correctly, even if they have no other data
that can be synced. A console warning will be issued if you tab to such
an element, so manual testing during development should catch any
missing ids.

(cherry picked from commit 78f1d665fd21e7a9096b76c753277adbc2ae1f69)

14 months agoProtect against network races with popup generation IDs
Aidan Holm [Mon, 11 Nov 2019 16:51:36 +0000]
Protect against network races with popup generation IDs

This commit adds a simple mechanism intended to ensure that widget sync
messages are always delivered to the correct widget. Widget layouts /
popups have a generation id, which is an increasing integer that never
repeats. Sync messages include the current client/server generation ID,
which is used to discard invalid messages on the other end.

Sync messages for widgets / elements not on the top layout / popup are
discarded. One reason for discarding these is that 1) on the server,
while getting the generation ID of the top layout is easy, getting the
generation ID of an arbitrary layer would require more API changes; and
2) it's unlikely for these to be generated on the webtiles client. While
it's quite easy to change the state of any widget given a pointer on the
server, discarding these messages should not cause any issues, as the
entire set of syncable widgets are resynced on layout push/pop.

An example of how a sync message could be sent to the wrong widget
without a mechanism like this in place:
1) Client changes widget state, e.g. textbox contents
2) Simultaneously, server pops layout
3) Server receives widget state from client for previous layout

(cherry picked from commit 69b4fc02efa929aaff49b9682e010410307d5275)

14 months agoAdd generic webtiles UI state syncing
Aidan Holm [Sat, 2 Nov 2019 16:30:40 +0000]
Add generic webtiles UI state syncing

This commit adds an improved widget state synchronization system.
Widgets now have a sync_id property. If set to a non-empty string,
widgets' state will be synchronized automatically in both directions,
which should allow phasing out the clunky ui_state_change() sync

Note: the currently focused widget is not yet synchronized.
(cherry picked from commit 465f1a91d031cc9f700b956f91cd76fb14240db0)

14 months agoImprove seed generation UI
Aidan Holm [Sun, 20 Oct 2019 15:29:33 +0000]
Improve seed generation UI

This commit improves the seed generation UI, using the new text entry
and checkbox widgets, as well as the new focus system. UI state is not
yet synchronized between webtiles and server.

This commit also adds a HTML implementation; previously, the CRT
emulation system was being used.

(cherry picked from commit 04990682366a68322ca1d3d07e67342333e0509d)

14 months agoAdd widget focus cycling
Aidan Holm [Sun, 20 Oct 2019 15:47:08 +0000]
Add widget focus cycling

This implements a more versatile input focus layer for local tiles and
console. Widgets can now be focusable or not, depending on derived
type. On UI hierarchy change, a DFS is performed of all widgets and all
focusable widgets are collected into an array, which is then used for
cycling between focusable elements.

This commit adjusts keyboard event delivery. The keyboard event (key up
or down) is delivered first to the focused widget, which has a chance to
handle the event and stop propagation. Next, tab, shift+tab, and esc are
handled; if one of these keys is pressed, propagation stops. Otherwise,
propagation continues upwards.

Input focus on webtiles is decoupled from input focus on the server.
The current plan is that the webtiles implementation for a given UI
layout will have corresponding focusable HTML elements, and that UI
state, including focus, will be synchronized in both directions.

(cherry picked from commit 74bebdfac3747af50d9a3f9b5f37a8cfc6fe2f0b)

14 months agoMake shift-tab work on unix console
Aidan Holm [Tue, 12 Nov 2019 18:38:47 +0000]
Make shift-tab work on unix console

(cherry picked from commit b7d4c039f093f35cea01aaab65a09d486e2345b6)

14 months agoMove controller event handlers to popup widgets
Aidan Holm [Sun, 20 Oct 2019 08:37:49 +0000]
Move controller event handlers to popup widgets

(cherry picked from commit c9420b3d7306d2fe15162b3a3f03550baa8cb979)

14 months agoAdd widget internal child tracking
Aidan Holm [Tue, 15 Oct 2019 17:31:29 +0000]
Add widget internal child tracking

It's not uncommon for non-container widgets to have internal children as
an implementation detail, invisible to the code using the non-container
widget. This new API requires such internal children to be explicitly
marked as such, allowing the UI system to enumerate them.

for_each_internal_child() iterates over internal children, and the
somewhat verbose for_each_child_including_internal() iterates first over
internal widgets, and then over all children. These new APIs are added
because widget users will not expect to see internal non-child widgets
they did not add when iterating over a widget.

(cherry picked from commit 37c931e5a9199ec5fd557ec42d052aca8941ee18)

14 months agoImprove Widget::for_each_child() helper
Aidan Holm [Tue, 15 Oct 2019 16:50:39 +0000]
Improve Widget::for_each_child() helper

Previously, it only worked on containers, so if you only had a Widget*
you had to use a dynamic_pointer_cast and an if statement: ugly. Now
regular non-container widgets just do nothing by default. It's also been
given a clearer name.

(cherry picked from commit 383bcb09255ea9126ae4c84041fab406ed0a1fe1)

14 months agoRemove Layout::add_event_filter() API
Aidan Holm [Tue, 15 Oct 2019 14:30:11 +0000]
Remove Layout::add_event_filter() API

(cherry picked from commit c74a01a412d251ce939c627290dfa96d0ea3f5b7)

14 months agoUse new hotkey API
Aidan Holm [Tue, 15 Oct 2019 14:16:24 +0000]
Use new hotkey API

(cherry picked from commit 74dbbd1b814af887991b7ec45d9a6617290de827)

14 months agoAdd hotkey event handling support
Aidan Holm [Tue, 15 Oct 2019 14:13:16 +0000]
Add hotkey event handling support

The purpose of this hotkey handling API is to be more explicit about the
purpose of individual event handlers, replacing the add_event_filter()
API. Hotkey handlers are only called for keydown events, before all
other handlers get a chance to run.

Note: hotkey handlers get called for *all* keydown events, due to the
large number of handlers that have switch statements.

(cherry picked from commit 50eff3ad4f5e4f6737a577a63fea86ae2ad86e9f)

14 months agoAdd text entry widget
Aidan Holm [Mon, 14 Oct 2019 10:50:58 +0000]
Add text entry widget

This commit adds a rudimentary textbox widget. It is single-line only,
and does not support text selection or, indeed, most of the niceties of
regular OS/toolkit-provided textboxes. That can come later.

This widget has an inner LineReader class, which is a gutted version of
the line_reader class, permitting independent modification. line_reader,
meanwhile, will hopefully eventually be removed as more and more UI
layouts are widgified.

(cherry picked from commit 5d773dd3d052f2bc08b082897ba04df49c1af4b6)

14 months agoAdd checkbox widget
Aidan Holm [Mon, 14 Oct 2019 10:05:43 +0000]
Add checkbox widget

This adds a rudimentary checkbox widget. Currently, hovered checkboxes
and checkboxes with input focus are visually indistinguishable.

(cherry picked from commit ab78da221fa1b9451d5ca4ac54dbd13a930acf34)

14 months agoAdd improved console cursor positioning API
Aidan Holm [Sat, 14 Sep 2019 11:46:59 +0000]
Add improved console cursor positioning API

Widgets may wish to show the console cursor at a particular position,
e.g. a focused text entry widget should indicate the current cursor
position. However, the cursor position is also changed while rendering
widgets in general, and widgets have no control over the order in which
they are rendered, by design.

This API allows a widget to explicitly request, for one render cycle,
that the on-screen cursor be positioned in a given position. The UI
framework will then move the cursor to that position after rendering,
just before the screen is updated.

(cherry picked from commit fe7bffbe7c1604ddcfcd931e99c0c8208fc9c33b)

14 months agoRename MouseEvent -> wm_mouse_event
Aidan Holm [Tue, 15 Oct 2019 11:55:08 +0000]
Rename MouseEvent -> wm_mouse_event

Partially for consistency with the other wm_event types, but also
because I want to use MouseEvent as a derived type of a new ui-layer
specific Event class, without having to worry about changing all the
cruft left over in tilereg-*

(cherry picked from commit 66650a8186066d2a30ae5780ec2bacc2d68c9076)

14 months agoRefactor widget hover path handling
Aidan Holm [Sat, 12 Oct 2019 17:07:18 +0000]
Refactor widget hover path handling

This commit moves the hover path inside the UIRoot struct, which avoids
the undefined destruction order of statically-allocated instances. I'm
not sure that this was ever an issue in practice, but UB is UB, and in
any case the code is cleaner now.

This also fixes an issue when setting a widget's parent did not update
the hover path. Now, the hover path is truncated if the widget has no
parent, and recalculated afresh (delivering mousein/out events) if it is
part of the top layout.

Finally, this commit renames prev_hover_path to hover_path, which makes
much of the code using it easier to read.

(cherry picked from commit f485fd5ed05ab4e97859faad62a503df372877c5)

14 months agoExtract UI debug drawing code
Aidan Holm [Sat, 12 Oct 2019 12:12:25 +0000]
Extract UI debug drawing code

This is purely a method extraction and shouldn't have any functionality

(cherry picked from commit 87cb31babd3cdada52313f8dbeb2c968b880096c)

14 months agoMake box alignment members protected
Aidan Holm [Sat, 19 Oct 2019 13:27:36 +0000]
Make box alignment members protected

This is necessary since changing box alignment should force a
recalculation of the box's size. This was never an issue because noone
was changing box alignments after showing the box, but it's better to
have proper encapsulation.

(n.b. this includes manual resolution that seems to be the result of
cf1ca852f132f9e22f and 59b909255dd7 differing.)

(cherry picked from commit 8dd68223145be564f3ce92c52fe6d7a1868a2c1d)

14 months agoClean up and ui.h
Aidan Holm [Tue, 29 Oct 2019 17:12:26 +0000]
Clean up and ui.h

(cherry picked from commit eeaa2dc6835b9c2d899a8896209ccbf754ac75fd)

14 months agoFix more compiler warnings
Aidan Holm [Tue, 29 Oct 2019 16:05:34 +0000]
Fix more compiler warnings

This adds most of -Wextra, except for a few exceptions.

(cherry picked from commit 1d1f32e58f75fa36788bb27e290c3b65a3c923e7)

14 months agoAdd const
Aidan Holm [Sat, 2 Nov 2019 14:22:59 +0000]
Add const

(cherry picked from commit fb64b488804424fe9583ec8df19cca1a5d1930fe)

14 months agoFix enum + non-enum mixing in ?: expressions
Aidan Holm [Wed, 30 Oct 2019 09:06:26 +0000]
Fix enum + non-enum mixing in ?: expressions

(cherry picked from commit 5069e0ce05547132ce43a5db23b7d99929ab555d)

14 months agoRemove hacky function pointer casts
Aidan Holm [Tue, 29 Oct 2019 14:27:19 +0000]
Remove hacky function pointer casts

(cherry picked from commit 0d431de4183deb7c076f9bf1209f7108cca532c2)

14 months agoAdd UNUSED(...) macro
Aidan Holm [Mon, 28 Oct 2019 17:13:09 +0000]
Add UNUSED(...) macro

This allows use with parameter packs, and also allows specifying
multiple arguments, e.g: UNUSED(arg1, arg2);

(cherry picked from commit 359a7de824d59a8570e344af70a95a07d7f0ffce)

14 months agoRemove/mark unused parameters
Aidan Holm [Mon, 28 Oct 2019 17:37:03 +0000]
Remove/mark unused parameters

This commit transitively removes unused parameter from all over crawl.
If the unused parameters look like they're part of an interface, I've
left them as is, but commented out the parameter name. In general, if
I'm less confident that a parameter is intentionally ignored, i've
marked it with UNUSED().

One pain point is that crawl has a lot of conditional compilation, and
variables are sometimes only used by one ifdef branch. I've still used
UNUSED in these cases, but it's less than ideal.

(cherry picked from commit 2bcd1f60b15c4f835d8039e1fa6d19b48a22fba2)

14 months agoFix run_layout() clearing default focus
Aidan Holm [Fri, 15 Nov 2019 08:27:10 +0000]
Fix run_layout() clearing default focus

By default, the child widget of the popup widget is focused;
run_layout's initial_focus parameter broke this default.

(cherry picked from commit 2289b3b9f1a4f6f8b33f7df10aecc12507d38266)

14 months agoFix string_wrap removing trailing empty segments
Aidan Holm [Fri, 15 Nov 2019 07:58:54 +0000]
Fix string_wrap removing trailing empty segments

This was causing a trailing newline in text widgets to not be rendered
properly on console.

(cherry picked from commit e48d713e8bde5c57c59b9077ad3ca8c67b8efc89)

14 months agoSet initially focused widget from run_layout()
Aidan Holm [Fri, 15 Nov 2019 06:10:57 +0000]
Set initially focused widget from run_layout()

(cherry picked from commit 264caf7d7f08638135c9b9b5753b28d2c36de3b1)

14 months agoAdd support for formatted_string + string
Aidan Holm [Thu, 14 Nov 2019 14:10:45 +0000]
Add support for formatted_string + string

(cherry picked from commit bfa96ce22d6f4c892eb90aaa2dea5c0f3bb67583)

14 months agoAdd support for formatted_string += string
Aidan Holm [Tue, 1 Oct 2019 05:36:49 +0000]
Add support for formatted_string += string

(cherry picked from commit e1e9d9662a75368f4bba3adc967af03f207a9b36)

14 months agoVarious refactoring to make expensive calls less likely
advil [Wed, 20 Nov 2019 02:45:25 +0000]
Various refactoring to make expensive calls less likely

This is all in code paths that are involved in monster movement, so code
that is called very frequently. Calls that check enchantments in
particular seem to be disproportionately bad.

(cherry picked from commit 166592d65c21614684b86ca9484fb135f3dd0f45)

14 months agoFix a wizmode / test crash on randbooks
advil [Wed, 20 Nov 2019 01:26:16 +0000]
Fix a wizmode / test crash on randbooks

(cherry picked from commit 514c71c9f14b3275e8342042a4ef37f9b996f77e)

14 months agoRefactor habitability checks around monster flight
advil [Tue, 19 Nov 2019 23:53:22 +0000]
Refactor habitability checks around monster flight

The airborne() call is quite heavy, given how many varied things it must
check. This commit refactors habitability checks to only ever check
airborne() if all other tests have failed, and if the terrain is
actually one that would be saved by flight.

(cherry picked from commit 94313f71df4b4792b899a44b858a16a250ab68ab)

14 months agoClean up some heavy-handed artefact code
advil [Tue, 19 Nov 2019 22:32:34 +0000]
Clean up some heavy-handed artefact code

Any time you checked an artefact property, the old code made an entire
copy of the CrawlHashTables for both the artefact props and its known
state. Because artefact properties are checked frequently when monsters
are carrying them (mostly in case they have flight), this could lead to
heavy world_reacts on some levels, e.g. Vaults 5. This was particularly
noticeable with step from time on a debug build.

(cherry picked from commit ca9b790695f0bee32fb71c69a11dacf3b665df05)

14 months agoPrevent an information leak with Mara Illusions (11946)
Edgar A. Bering IV [Sun, 8 Dec 2019 18:35:00 +0000]
Prevent an information leak with Mara Illusions (11946)

(cherry picked from commit 5ba6e9ada16797e38ebf773bfe057bf1f432a73a)

14 months agoCorrect Flay status light colour (12147)
Edgar A. Bering IV [Sun, 8 Dec 2019 18:14:58 +0000]
Correct Flay status light colour (12147)

The cause was an unintentional fallthrough.

(cherry picked from commit 87e124ad65c51983cfcc357e8c2db44e86412c69)

14 months agoClarify Heal Other description (12128)
Edgar A. Bering IV [Sun, 8 Dec 2019 17:28:54 +0000]
Clarify Heal Other description (12128)

(cherry picked from commit 0af21f4d7ad5d0c7b665f779d1e15c6a321d9d99)

14 months agoFix summoner highligting for console in webtiles builds
Edgar A. Bering IV [Sun, 8 Dec 2019 17:19:03 +0000]
Fix summoner highligting for console in webtiles builds

(cherry picked from commit a1f8d6e4d92ce74c149891564e00fdbcd882dfa1)

15 months agoFix various small alignment issues
Aidan Holm [Wed, 20 Nov 2019 06:33:17 +0000]
Fix various small alignment issues

Switchers with scrollers inside them generally need to have align_x set
to stretch, so that the scrollbar will be flush against the right-hand
side of the screen on local tiles.

(cherry picked from commit 59b909255dd71bbd27e2bd0f467befc772dac075)

15 months agoUse consistent desc/quote switch text
Aidan Holm [Wed, 20 Nov 2019 06:32:05 +0000]
Use consistent desc/quote switch text

This code is pretty heavily duplicated from describe_monsters().

For reasons unknown, show_description() does not show quotes at all on

(cherry picked from commit 260bac964ef5a57233285e543ba45b982b7937de)

15 months agoClarify and correct Vampire status info (12121, 12035)
Edgar A. Bering IV [Sat, 16 Nov 2019 20:12:44 +0000]
Clarify and correct Vampire status info (12121, 12035)

Also, Closes #1202.

(cherry picked from commit 8addd88b5995984596cee7f8f35d07ef5e0f88ef)

15 months agoDismiss most summons on attitude change (12082)
Edgar A. Bering IV [Sat, 16 Nov 2019 18:27:39 +0000]
Dismiss most summons on attitude change (12082)

For the most part, creating hostile summons is a bad thing for a player;
however, there are some exceptions that led to degenerate behavior.
Guardian Golem which has no attack and any of the stationary summons
(SLS and Fedhas' summons) could be made hostile in order to block
monsters indefinitely.

This commit changes the behavior in the following way:

- True summons are dismissed on attack. The exception is demons from
  Summon Greater Demon, which turn hostile.
- "Summons" that are M_CONJURED (fulminant prisms, ball lightning, fire
  fire vortices, other spell proxies) take damage but retain
- Fake summons (snakes, undead, malign gateway tentatcle) become hostile
  on hit. This will need to be re-evaluated if stationary or attackless
  undead get added.

(cherry picked from commit 3db639d13e93f4103d016ee07f42f40a6b7d3ffe)

15 months agoRemove old flavor messaging from fedhas_altar_decomposition (12106)
advil [Wed, 13 Nov 2019 16:54:48 +0000]
Remove old flavor messaging from fedhas_altar_decomposition (12106)

This vault seems ok without it, at least if one is fine with trapped
monsters. Could just be removed entirely, perhaps?

(cherry picked from commit 33052ceff86b7b066b619b27ec6327cf883604bb)

15 months agoRun GDB from /usr/local/bin on OSX
Alex Jurkiewicz [Sat, 2 Feb 2019 00:25:50 +0000]
Run GDB from /usr/local/bin on OSX

[Committer's note: Closes #987]

(cherry picked from commit 4073cf80fb89cbf380539eab6ea495c3f1859f43)

15 months agoRun gdb at lower priority
Alex Jurkiewicz [Thu, 24 Jan 2019 02:37:14 +0000]
Run gdb at lower priority

Will help manage load for online servers

(cherry picked from commit 3c6720d1ae39a58c91f2b52e1651f9ac591d1e79)

15 months agoMake the game check the floor when emergency eating
Umer Shaikh [Thu, 24 Oct 2019 04:02:24 +0000]
Make the game check the floor when emergency eating

Currently if the player is about to starve to death, they will
automatically eat from their inventory if they have food available.
Since the player can now eat directly from the floor, this commit
extends that check to seeing if there is anything available to eat on
the floor.

This is an edge case and not likely to matter often, but it's good to
have consistent and unsurprising behaviour. I take it the intention of
commit 2474f45a (which added forced eating when starving) was just about
eating rather than starving, if it's possible, and that nothing special
about the location of the food in inventory was intended; if that's
right, this commit updates behaviour to be in line with that intention.
As a player I wouldn't expect location of the food to matter, only that
the game is kindly not letting me starve from inattention to my hunger
state; if that's the general player expectation, then this commit also
makes the behaviour less surprising.

(cherry picked from commit 9e23508adf36c1290c92846b216cbe27eed3003f)

15 months agoCorrectly cap duration for Fedhas summons
gammafunk [Wed, 13 Nov 2019 06:19:17 +0000]
Correctly cap duration for Fedhas summons

The enchantment degree for the abjuration enchant is supposed to range
from 1 to 6, but the checks on this for monster placement code aren't
applied when non-spells set up the monster data. Code implementing
non-spell abilities that create summons must itself enforce the degree
cap, otherwise it can create permanent allies.

This commit adds this degree cap to the Fedhas abilities. It took invocations
of over 15 to achieve abjuration degrees above 6. Hence it wasn't
'free' to get permanent allies before this commit, but we want the
allies to be temporary ones all the same.

This change means that duration is maxed out at 15 invocations to 190
turns on-average, however the abilities continue to scale with past 15
invocations through increases to the allies' HD.

(cherry picked from commit fcdb843264535c9358a1b1e39c3620b2ab8f735a)

15 months agoRemove edge cases from Fedhas protection
Edgar A. Bering IV [Sun, 10 Nov 2019 19:16:00 +0000]
Remove edge cases from Fedhas protection

This commit extends Fedhas protection to piercing attacks done by all
allies. Fedhas summons also worship Fedhas, so can shoot through plants.
Other summons do not, but will shoot through briars because they "can be
shot through". The result is players killing their own briars with a
lightning spire or similar.

The narrowest fix is to have Fedhas only protect briars from non-Fedhas
allies, but the result of that approach is a thicket of special cases.

This commit also extends Fedhas protection to ballistomycete spores
(which had previously been excepted for reasons involving the old spore
network system) and snaplasher vines (the remaining exception, which
wasn't described anywhere).

(cherry picked from commit 20dcb12bf15515568615a96e136b5140ae3000c2)

15 months agoFix overenthusiastic nullptr find-replace
Aidan Holm [Sun, 10 Nov 2019 15:45:40 +0000]
Fix overenthusiastic nullptr find-replace

(cherry picked from commit 23bb404d27bdc0d5d3b28a696726741ca1515249)