10 months agoAdd a missing TAG_MAJOR_VERSION check 0.50.1 0.50.4
Kate [Thu, 2 Apr 2020 19:28:53 +0000]
Add a missing TAG_MAJOR_VERSION check

10 months agoFix stray commas in chardump notes for dungeon features
Nikolai Lavsky [Wed, 1 Apr 2020 22:05:20 +0000]
Fix stray commas in chardump notes for dungeon features

After c225cfcd, notes for dungeon features end in a comma instead
of a full stop.

For example, "60174 | Depths:2 | Found a sacrificial altar of Ru,"

10 months agoUpdate
Andrew York [Wed, 1 Apr 2020 20:15:39 +0000]

Add "Absolute Zero" to the list of spells Vehumet supports (and therefore, can gift, right?)

10 months agoTweak staff of Olgreb description (#1334)
nlavsky [Wed, 1 Apr 2020 19:34:05 +0000]
Tweak staff of Olgreb description (#1334)

As a followup to 234afa57, this commit replaces an outdated reference
to multiple evocable spells with a reference to OTR.

10 months agoUpdate the changelog
gammafunk [Tue, 31 Mar 2020 00:27:03 +0000]
Update the changelog

Through 0.25-a0-696-g42a9e46d90.

10 months agoFix grammar in a spell description (Goratrix)
gammafunk [Mon, 30 Mar 2020 20:20:50 +0000]
Fix grammar in a spell description (Goratrix)

For Frozen Ramparts, fix a sentence and rephrase the description of how
only one wall affects a monster at a time.

10 months agoUpdate the Frozen Ramparts description
gammafunk [Mon, 30 Mar 2020 08:04:10 +0000]
Update the Frozen Ramparts description

Give some more basic details about how the damage works.

10 months agoReduce the range and damage of Frozen Ramparts
gammafunk [Mon, 30 Mar 2020 07:04:23 +0000]
Reduce the range and damage of Frozen Ramparts

This spell's current radius of 3 can create a quite large number of
squares in typical use cases: 9 in corridors and potentially much more
than this when used at junctions of multiple paths. Reduce the radius of
effect to 2, which still gives plenty of affected squares.

Also reduce the portion of the damage affected by spellpower by 20%. At
a max spellpower of 50, it will slightly exceed the damage of Freeze.
These changes will bring the damage per cast a bit more in line for a
single school, level 3 spell.

10 months agoUse a spell range lookup instead of a constant
gammafunk [Mon, 30 Mar 2020 07:01:22 +0000]
Use a spell range lookup instead of a constant

All of the relevant code already has access to the spell range lookup
function, so use this instead of an additional constant that could get
out of sync with the spell data.

10 months agoMake Frozen Ramparts damage awaken monsters
Kate [Mon, 30 Mar 2020 18:07:21 +0000]
Make Frozen Ramparts damage awaken monsters

10 months agoCheck holiness before casting dispel undead
Umer Shaikh [Mon, 30 Mar 2020 15:05:06 +0000]
Check holiness before casting dispel undead

Commit 3b7ae84e64 removed SPELL_DISPEL_UNDEAD from monsters and replaced
it with SPELL_DISPEL_UNDEAD_RANGE, but forgot to update the case in
_ms_waste_of_time accordingly. This resulted in monsters attempting to
cast dispel undead on non-undead creatures; before they never thought
that was worth trying. This commit restores the check.

10 months agoAdjust the staff of Olgreb
Kate [Mon, 24 Feb 2020 22:40:41 +0000]
Adjust the staff of Olgreb

Give it a chance to deal poison arrow-flavoured damage on hit (similar to
regular enhancer staves but only checking evocations skill), and remove its
chance of casting Venom Bolt on top of OTR when manually evoked.

10 months agoRework staves of poison
Kate [Sat, 22 Feb 2020 23:10:05 +0000]
Rework staves of poison

Give them the same type of resistible damage-on-hit effect as other evoker
staves, instead of just a weak skill-based chance to inflict poisoning.

10 months agoConsider magical staves and pain weapons to be wizardly for Trog conducts
Kate [Sun, 16 Feb 2020 00:10:35 +0000]
Consider magical staves and pain weapons to be wizardly for Trog conducts

Pain-branded weapons and evoker staves were technically permitted under Trog,
but very unlikely to be useful unless converting with the relevant skills
already trained, which resulted in awkward edge-cases for some types of
acquirement or chances of offering nearly-useless items.

Instead add a stricter conduct preventing their use, resulting in piety loss or
penance for making attacks with magical staves (including the various unrand
staves) or pain weapons, or for evoking their abilities.

10 months agoRework the phial of floods
Kate [Mon, 24 Feb 2020 21:50:22 +0000]
Rework the phial of floods

The combination of high direct damage and summoned water elementals made it
substantially more powerful than a lot of other evokers. Remove its very
powerful summons, but keep their effect of applying temporary silence by
applying a "waterlogged" enchantment to enemies within the flooding area.

10 months agoRemove staves of power
Kate [Sat, 22 Feb 2020 23:09:54 +0000]
Remove staves of power

Their effect was already provided by a ring type, and is a lot less desirable
on a weapon-slot item - staves of wizardry could likewise potentially also be
removed or reworked.

10 months agoRemove crystal balls of energy
Kate [Sat, 15 Feb 2020 22:04:57 +0000]
Remove crystal balls of energy

Their design was very messy and they were ultimately mostly a trap for
unspoiled players. Their complicated but potentially powerful effect is much
more appropriate to an unrand than to a regular evoker, and so still exists in
a similar form on the staff of Wucad Mu.

10 months agoRemove lamps of fire
Kate [Wed, 12 Feb 2020 22:57:59 +0000]
Remove lamps of fire

Of the multiple types of direct-damage-based evokers (lamp of fire, lightning
rod, and now tremorstones), their effect was the most underwhelming - the
complicated targeter made them difficult to use reliably and the wand of clouds
also has a similar but simpler effect.

10 months agoRemove sacks of spiders
Kate [Wed, 12 Feb 2020 19:27:51 +0000]
Remove sacks of spiders

Between boxes of beasts, sacks of spiders and phantom mirrors there were a
large number of consumable summon-based evokers, resulting in increased
inventory load for most characters. Although the sack does have the web effect,
overall it's a much less interesting set of summoned creatures than the others.

10 months agoRemove fans of gales
Kate [Wed, 12 Feb 2020 19:08:14 +0000]
Remove fans of gales

Miscellaneous evocable items are currently a very overloaded item type, with
many items that are worth every character carrying once found, as well as a
lot of duplicated effects. This results in lots of inventory slots being
dedicated to evokers, a worse interface when picking items, and a lot of
uninteresting choices between similar items. Narrowing down the list of evokers
substantially will allow them to have a smaller number of distinct effects,
without taking up so much inventory load.

The fan of gales AoE knockback is a very niche escape effect, and isn't really
interesting enough to dedicate an item to - it falls into the category of
evokers that end up always being carried around even though in practice it's
only quite rarely useful.

11 months agoRemove force_article parameter from thing_do_grammar()
Aidan Holm [Sun, 29 Mar 2020 07:39:54 +0000]
Remove force_article parameter from thing_do_grammar()

The only cases where this was non-false was when using feat_is_trap();
when this evaluates to true, the description passed to thing_do_grammar()
started with a lower-case letter, so the feat_is_trap() check was

11 months agoRemove add_stop parameter from thing_do_grammar()
Aidan Holm [Sun, 29 Mar 2020 07:38:34 +0000]
Remove add_stop parameter from thing_do_grammar()

11 months agoRemove add_stop parameter from feature_description()
Aidan Holm [Sun, 29 Mar 2020 07:17:54 +0000]
Remove add_stop parameter from feature_description()

11 months agoRemove add_stop parameter from feature_description_at()
Aidan Holm [Sun, 29 Mar 2020 07:01:57 +0000]
Remove add_stop parameter from feature_description_at()

11 months agoExtract god_speaker() function
Aidan Holm [Sun, 29 Mar 2020 06:46:39 +0000]
Extract god_speaker() function

The name of the god will need to be substituted in via the i18n system,
so that different languages can change the word order.

11 months agoAdd an effect flash for Absolute Zero
gammafunk [Wed, 25 Mar 2020 06:43:47 +0000]
Add an effect flash for Absolute Zero

Flash the screen light cyan upon successful cast. It would be neat to
have a more custom animation that centered on the target, but this flash
will do for now.

11 months agoAllow Absolute Zero to target tentacles
gammafunk [Sat, 28 Mar 2020 05:20:20 +0000]
Allow Absolute Zero to target tentacles

Otherwise it can't affect things like eldritch tentacles, which seems
odd. This will leave blocks of ice where the tentacle or tentacle
segment died, but this seems fine. Firewood and allied and neutral
monsters are still excluded, as before.

11 months agoAdd range scaling for Absolute Zero
gammafunk [Wed, 25 Mar 2020 06:30:28 +0000]
Add range scaling for Absolute Zero

Replace the spellpower-scaled noise reduction with a spell range that
scales with spellpower. The range scales from 1 at power 0 to 7 with max
power, with the range typically being 5 when the spell is first
castable. This is a more natural way to scale the strength of the effect
with spellpower, and gives some reasonable incentive to train more Ice or
use spellpower enhancers.

Instead of scaling the noise, give the spell a casting noise of 9 and an
effect noise of 25, which is still quite loud.

11 months agoFix two bugs for Absolute Zero
gammafunk [Wed, 25 Mar 2020 06:27:45 +0000]
Fix two bugs for Absolute Zero

Don't crash when using 'Z' with no monster in LOS. Also properly
consider monster invisibility for messaging and attack prompts when such
a monster is targeted by the spell.

11 months agoAbsolute Zero, a replacement spell for Glaciate.
hellmonk [Thu, 19 Mar 2020 03:37:48 +0000]
Absolute Zero, a replacement spell for Glaciate.

This level 9 ice spell targets the enemy nearest the player (breaking
ties randomly and skipping firewood and tentacles) and instantly kills
it, turning it into an ice block. Because it always targets and kills
the closest monster, range and damage scaling with spellpower don't
work. Instead, noise decreases as spellpower increases, from an
ear-shattering 40 at zero power to 0 at maximum power (the spell also
always makes 4 noise at the player's location).

This is one of the glaciate replacement proposals that's been kicked
around on discord etc. Motivation for the change is that all four of the
level 9 direct damage spells are large aoe spells, and of the four,
glaciate seems to be the worst from both power level and interface
perspectives. Also, ice is supposed to be the least blasty school I
think? This spell is effectively single target damage, so there's some
overlap with lcs and friends, but it's somewhat different in function.

Some concerns with this spell: it's very feast-or-famine in terms of
effect. Really good against Cerebov, horrible against packs of any
significant size. If it's too good in the good situations, it could be
nerfed by lowering the range or by adding a second school (probably
hexes?); given the other effects available at levels 8 and 9 I don't
anticipate absolute zero being op. It's much harder to buff the spell if
it's too weak, and imo it's important that the new spell be at least as
good as glaciate, preferably a bit better. It's also possible that this
type of instant death effect will just lead to fundamentally bad
gameplay, but that's to be decided by playtesting. Finally, replacing
glaciate with absolute zero will nerf megazig characters. I don't
consider megazigs a 'real' part of the game but that's probably worth

Commiter's Note: A subsequent commit will adjust this spell to replace
the spellpower-scaled noise reduction with a scaling spell range from 1
to 7, with the spell typically having range 5 when it's first castable.
Depending on how this feels in practice, we may later change the spell
to have a fixed but smaller range of 5, possibly restoring the noise
reduction so that spellpower is still relevant.

I wrapped commit comment lines and ran checkwhite within this commit.

11 months agoExtract known items menu to extract-known-items
Aidan Holm [Sat, 28 Mar 2020 18:00:07 +0000]
Extract known items menu to

11 months agoAdd server chroot migration scripts
Aidan Holm [Sun, 23 Feb 2020 15:28:28 +0000]
Add server chroot migration scripts

This adds some scripts for migrating aging server chroots to newer
ubuntu images.

Checkwhite change is needed since some inline patches require tabs.

11 months agoAdd missing mypy.ini (alexjurkiewicz)
Aidan Holm [Sat, 28 Mar 2020 13:08:11 +0000]
Add missing mypy.ini (alexjurkiewicz)

11 months agoDon't make splash noises during level generation
advil [Fri, 27 Mar 2020 21:50:48 +0000]
Don't make splash noises during level generation

This fixes one part of
The other part is trickier.

It's possible that everything to MSGCH_SOUND should be suppressed during
level generation?

11 months agoFix a piercing + omnireflection crash
advil [Thu, 26 Mar 2020 19:16:49 +0000]
Fix a piercing + omnireflection crash

If a piercing ranged attack is reflected by warlocks mirror, kills the
thrower, and then hits a monster after that, the game would crash,
because the attacker is invalid. This fix lets the piercing ammo
continue without crashing by using YOU_FAULTLESS as the attacker in
this case.

It isn't quite right, since the to-hit is now calculated based on a fake
YOU_FAULTLESS rather than a monster that the beam/ranged_attack objects
no longer has access to. I can see a couple of possibilities; we could
just make a copy of the monster (extremely heavy), we could somehow only
clean up the monster with a fineff (tricky to implement), or rewrite
this code to defer dead monster cleanup until the end of monster
handling (also tricky to implement, but probably how I would do this if
writing all of this code from scratch -- this would have avoided many,
many bugs over the years). I can't see any simpler options than these
right now.

Another change might be to have the ammo vanish when the monster dies,
on the premise that piercing is a magic effect that requires the thrower
to be focusing.

11 months agoDon't let a reaching weapon override M_PREFER_RANGED
advil [Thu, 26 Mar 2020 19:13:48 +0000]
Don't let a reaching weapon override M_PREFER_RANGED

This mainly affects merfolk javelineers. Because the reaching check
unconditionally succeeded as long as the monster is at reaching
distance, javelineers with a reaching weapon would prefer that weapon,
never using their ammo. This is in contrast to how regular melee weapons

11 months agoPrevent felid revival in isolated Gauntlet areas
gammafunk [Wed, 25 Mar 2020 19:46:07 +0000]
Prevent felid revival in isolated Gauntlet areas

Courtesy of a reddit report forwarded to me by amalloy,
gammafunk_gauntlet_branching had an isolated area felids can revive
into, since it's not flagged no_tele_into:

I've added some of the usual lava and statue decorations to this area.
Additionally I've flagged this and some similar areas in
gammafunk_gauntlet_one_two_three as no_tele_into. Although felids now
can't revive into these areas due to the lava, might as well be extra
careful in case we add weird new lava-swimming species or forms. I've
checked the other Gauntlet maps, and they have no isolated areas, hence
don't need updating.

11 months agoProperly apply effect noise for Frozen Ramparts
gammafunk [Wed, 25 Mar 2020 06:45:31 +0000]
Properly apply effect noise for Frozen Ramparts

Before we made the effect noise only at the player's position in
addition to the casting noise at this same position. Instead apply the 8
effect noise at each affected wall position, which is where the effects
take place.

Also tweak the casting message to simply refer to ice instead of
icicles, since the spell no longer has the latter theme.

11 months agoMake indestructible vault trees unaffected by tornado (#12141)
Kate [Mon, 23 Mar 2020 20:38:09 +0000]
Make indestructible vault trees unaffected by tornado (#12141)

11 months agoAdjust spawn locations of D:1 monsters
gammafunk [Mon, 23 Mar 2020 06:20:25 +0000]
Adjust spawn locations of D:1 monsters

Some vaults are small and place transparent rock, which means level
generation monsters can spawn in LOS of players. Although a very large
majority of these situations can be survived, it's not great to have such
a monster onslaught from turn 1. The function _zap_los_monsters() deals
with this by removing monsters that spawn with line of fire, but this
both reduces monster count and doesn't handle monsters that have
line-of-sight. Extending said function to line-of-sight would further
remove monsters, so a better approach is to prune D:1 monster spawn
locations without pruning the monsters themselves.

This commit introduces PROX_AWAY_FROM_DUNGEON_ENTRANCE and applies it to
level monster spawn locations on D:1. Any D:1 level monsters will not
choose a spawn location within LOS distance of the player, choosing
another location instead. This is just a strict distance check, not
considering actual line-of-site to the player, to avoid situations where
a monsters are very close to the starting position of the player, but
just around a corner or door in the starting vault. This change doesn't
handle monsters from any vaults that happen to generate too close. That
would very rarely be an issue, and we leave _zap_los_monsters() in place
to handle this reasonably. Objstat runs before and after this change
confirm that D:1 monster counts and XP are not affected by this change.

Now players who get the infamously small
scummos_arrival_simple_fountains, recreated here for your viewing
pleasure, can be glad they'll no longer be potentially surrounded by a
swarm of instantly awakened monsters:


If there are concerns about D:1 being easier, we might look into
providing some more interesting difficulty by adding some spicy rare
spawns to the D:1 monster table.

11 months agoRework trap placement in a Volcano map (SFR)
gammafunk [Sun, 22 Mar 2020 18:05:29 +0000]
Rework trap placement in a Volcano map (SFR)

The map volcano_village placed an alarm trap in a mandatory passage near
the start of the map. Move this to an area before the guaranteed loot
room so that the player has more of a decision for triggering the traps.
Also reglyph the map and rework monster placement a little; it was
attempting to place a monster glyph that isn't defined, since the
"villager" set for the fiery_guardians() function only makes two monster

11 months agoAdd zombie hornet tile
Goratrix [Sat, 21 Mar 2020 12:56:08 +0000]
Add zombie hornet tile

11 months agoUse single-line style for Python imports
Aidan Holm [Sun, 22 Mar 2020 06:37:46 +0000]
Use single-line style for Python imports

11 months agoFix lint / type errors for
Aidan Holm [Sun, 22 Mar 2020 06:15:26 +0000]
Fix lint / type errors for

11 months agoAdd some test cases for cookie authentication
Aidan Holm [Sat, 14 Mar 2020 06:38:38 +0000]
Add some test cases for cookie authentication

11 months agoExtract cookie authentication logic to its own file
Aidan Holm [Tue, 10 Mar 2020 12:30:06 +0000]
Extract cookie authentication logic to its own file

11 months agoRefactor with a context manager
Aidan Holm [Sat, 7 Mar 2020 15:36:48 +0000]
Refactor with a context manager

11 months agoFix lint errors
Aidan Holm [Sat, 7 Mar 2020 15:14:09 +0000]
Fix lint errors

11 months agoAdd requirements.txt tools, formatting, and linting
Aidan Holm [Sun, 1 Mar 2020 13:55:32 +0000]
Add requirements.txt tools, formatting, and linting

This commit adds a simplified build setup for the webserver project.
User and developer dependencies are specified in and
compiled to version-pinned dependency lists in requirements/.

This commit also adds some basic linting and formatting tools. All
formatting warnings are disabled, and should be enabled one by one as
the code is organized. I've also thrown in pytest and coverage, although
I haven't set them up yet.

11 months agoSimplify and rebalance Frozen Ramparts
gammafunk [Sun, 22 Mar 2020 01:42:56 +0000]
Simplify and rebalance Frozen Ramparts

This spell nicely fills the gap left by the removal of Throw Frost, but
it suffers from being a mashup of two ideas: mine was a wall-oriented
positional spell and ebering's was a spell to slow monsters in some
interesting way. The former idea is relatively straightforward for a
damage spell, but slowing monsters has the potential pitfall of
introducing too much kiting. There's room for a spell that does both,
but this is harder to balance for the low-level spell we're going for.
Right now the slowing aspect of Ramparts isn't interesting, and the
spell is very strong while being in the strongest starting book in the

This commit simplifies and rebalances the spell by removing the slow
movement monster debuff and making the damage pure BEAM_COLD. Hence
Ramparts is no longer partly resistable, but it will slow cold-blooded
things like hydras. I think a mass-freeze spell that uses walls is
interesting and reasonably balanced at level 3.

I've also tweaked the damage message to include damage punctuation and
to always use singular "wall" in the message. Many players aren't aware
that only one wall can ever effect a monster regardless of how many icy
walls are adjacent. Incidentally, this is also true of slimy walls
burning monsters, but the player *can* be affected by multiple such
walls. Monsters, they're dirty cheaters!

11 months agoRemove open() call with both read and write modes
Aidan Holm [Sat, 21 Mar 2020 13:02:21 +0000]
Remove open() call with both read and write modes

Doesn't work on Python 3.

11 months agoFix str/bytes issues
Aidan Holm [Sat, 21 Mar 2020 11:04:34 +0000]
Fix str/bytes issues

11 months agoAdd type hints
Aidan Holm [Sat, 21 Mar 2020 11:04:14 +0000]
Add type hints

11 months agoConvert exception indexing to py3-compatible code
Aidan Holm [Sat, 21 Mar 2020 11:03:19 +0000]
Convert exception indexing to py3-compatible code

11 months agoMark scarves of rMsl useless with innate rMsl (#11157)
Kate [Sat, 21 Mar 2020 01:48:19 +0000]
Mark scarves of rMsl useless with innate rMsl (#11157)

11 months agoFix recasting after Divine Exegesis (AliasTheSpectator)
gammafunk [Fri, 20 Mar 2020 22:26:19 +0000]
Fix recasting after Divine Exegesis (AliasTheSpectator)

It's possible to cast a spell under Sif's Divine Exegesis and then use
the spellcasting interface to recast the spell using the '.' key even
when the spell isn't memorized. Spells cast this way don't get the
benefits of Divine Exegesis, so this bug only lets you save spell levels
by casting unmemorized spells you'd otherwise already be able to cast.

This commit fixes the spellcasting UI to properly unset the value of the
last cast spell if it isn't memorized before the spell prompt is made,
preventing the exploit.

11 months agoFix randart weapon names (12228)
Goratrix [Fri, 20 Mar 2020 19:40:02 +0000]
Fix randart weapon names (12228)

Missing end of line, probably caused by the recent commits
that reorganized the lookup files.

11 months agoAdded room for tactics to vaults in simple.des
Byrel Mitchell [Fri, 20 Mar 2020 14:48:41 +0000]
Added room for tactics to vaults in simple.des

This file is also intended as a tutorial of sorts for reading vaults, so I attempted to keep changes I made as syntactically simple as possible. This was most impactful in some of the large vaults (eg erik_arrival_triangle_huge) which needed the first few rooms marked no_monster_gen; I made the entire vault no_monster_gen rather than introduce a KMASK in such cases to retain their syntactic simplicity.

Vault list:
minmay_arrival_wavy_path: Single path, single exit vault. I moved the entrance to the center of the wavy path and added second exit symmetrical to the first.

matt_arrival_spirals: Two of the three starting locations could have you trapped by a randomly generated monster. Adding no_monster_gen allows the player to get to the main corridor, with multiple exits, prior to finding monsters.

lemuel_arrival_funnel: The island in the center of this vault had a 1:8 chance of being removed. In that case, this vauls was single-path, single-exit. I removed that possibility from the SUBST list.

minmay_arrival_pointy: Single path, single exit. I added a corridor between the points, which should allow you some tactical flexibility.

dpeg_arrival_radiant: This had a change to generate a single exit; I changed it to guaranteeing two. I also fixed what appeared to be a typo making the top-right path have two chances to be closed off, instead of one like the rest of the paths.

dpeg_arrival_tiny_i/j/k: These have the potential (or guaranteed for k) for the left end of the path to be blocked off by mapgen (making it single exit.) I added an escape hatch in case that happened.

dpeg_arrival_windows_large_door: Single-exit room. I added a door to the back side of the room as well.

erik_arrival_triangle_small/medium/large/huge: All of these have the potential for a monster to be generated in one of the first 3 rooms, before you have any interconnectivity or options. I marked these vaults as no_monster_gen; possibly they should be moved out of this file and a KMASK applied to just the first 3 rooms.

minmay_arrival_plants_in_alcoves: Single path, single exit. I added an island made of plants/fungus/bushes/trees to the center.

noname_arrival_rooms_in_the_neighbourhood: This one was single-exit rooms, and was missing the SHUFFLE statement to make it possible to spawn in each room. I added a second exit to each room and the SHUFFLE statement, and moved it to small.des since the header was too long for simple.des.

onia_arrival_mini_spirals: This one had 4 paths with no interconnection and a single exit. I added a door connecting two of the paths and marked it as no_monster_gen to avoid a monster spawning in one of the initial spirals.

zelgadis_glass_arrival_small: This has guaranteed islands outside of the spiral. I added no_monster_gen to avoid monsters spawning and blocking the initial spiral.

dpeg_arrival_snail: Single path, single exit. I added a door to allow the player to generate a pillar in the center of the spiral while maintaining the current auto-explore spiral path.

ncdulo_halloftheorcs: Single exit room into the rest of the vault with monster_gen on. I added a second exit to the room (facing the same direction to give the player a similar first time experience.)

tarquinn_simple_flora_water_a: Single path, single exit. I removed the tree that kept you from walking around it.

tarquinn_simple_flora_water_c: Each side is single path, single exit unless pool_fixup creates a shallow water path across. I added a second exit to each side (and eliminated a meaningless A in the second subst.)

tarquinn_simple_flora_water_e: Single exit room. I added two more exits.

saegor_arrival_simple_d: Single exit room, and no handy way to add an exit without changing the aesthetics. I added an escape hatch instead.

scummos_arrival_gate: Single path into a single exit room. I added pillars of shallow water and lava to the sides of the path.

lightli_molten_gateway: Single exit room, and no handy way to add an exit without changing the aesthetics. I added an escape hatch instead.

mrwooster_arrival_statue_1/2/3: Open alcove design. I added a couple statues to the center to give the player something to work with tactically.

wheals_arrival_linesprint: Single path, single exit. I added a door connecting two parts of the 'line-sprint'.

wheals_arrival_shading: Room with a single exit. I added a couple islands.

lightli_arrival_flooded_house: Single path, single exit. I added a second exit.

giann_wishing_wells: This vault had a single exit with a plain antechamber; not much you could do aside from retreat to one of the sides. I added a couple more entrances to the antechamber.

psy_arrival_conway: This vault actually had two shallow water exits (one toward the top and one toward the bottom) which could be used for pretty interesting tactics. However, it's not clear without fully exploring which of the 4 alcoves are dead ends and which have a path, which makes this spoilery. I added a third path across which ensures that no matter which way you run, you'll find a path before you have to commit to an alcove.

psy_arrival_dodecagon: This vault had a 50% chance to be a single exit room. I added a second guaranteed exit.

psy_arrival_heroes: This was a single exit room. I added a couple more hero statues which could be used as pillars or chokepoints as needed.

wander_arrival_desolate: This vault is essentially just empty space. Odds are that this will be fine, since D:1 mapgen will probably put multiple entrances to it, but that's dependent on the current choice of map generator for D:1. Just in case, I added an escape hatch. I also applied the 'desolate' floor tiling to the features (arch, fountains, dungeon-exit, and escape hatch.)

wander_arrival_chamber: Single exit room. I added two more exits.

11 months agoAdd more kinds of divine favor
RojjaCebolla [Wed, 18 Mar 2020 09:56:26 +0000]
Add more kinds of divine favor

tired of seeing Foo's Supremacy on items!

11 months agoBritish Spelling corrections
klorpa [Thu, 19 Mar 2020 18:06:49 +0000]
British Spelling corrections

Most important are the corrections to the manual and options guide, the
monster shouts, and the database descriptions. This commit also corrects
a variety of comments in the codebase.

[ Committer's note: Closes #1321 ]

11 months agoAdd a player ghost door_vault variant
gammafunk [Fri, 20 Mar 2020 03:54:33 +0000]
Add a player ghost door_vault variant

This door vault places multiple player ghosts, 7.5 on-average and up to
10. This will make an extra challenging yet rare door vault variant
that's sure to delight fans of gammafunk_ghost_cemetary. Accompanying
the ghost are 8 and 9 spawns, similarly to what is done for the original
door vault.

It uses the same common setup function as other door vaults, hence
places multiple loot items, but additionally places two more specialized
loot items that more aggressively upgrade in quality with depth, as it
done for other challenging ghost vaults. There is a ghost room variant
for Vaults to go along with variants for this branch added in prior

The weight of these variants is 2 both because they're extra challenging
and to keep placement less than the main door vaults.

11 months agoSome tweaks to reverse_door_vault
gammafunk [Fri, 20 Mar 2020 03:41:28 +0000]
Some tweaks to reverse_door_vault

This variant of door_vault is unique in that it places a single upstairs
in an enclosed area, with the doors revealing this area fully. I've
modified it to use the common door vault setup function, so now it
places appropriate loot. I don't change the levels of placement, since
this one isn't interchangeable with the other variants.

The monster set and count are fine, since it only uses 8 and 9 spawns in
the same numbers as door_vault. Due to presence of a staircase, this
vault in its current form will always be less prone to killing people.
Hence I'll probably revamp it to add traps and/or specialized monster

11 months agoRevamp not_door_vault_due
gammafunk [Fri, 20 Mar 2020 03:16:07 +0000]
Revamp not_door_vault_due

This "elephant" door vault variant placed normal and dire elephants, but
notably placed a single hellephant. Unfortunately, non-demonic elephants
are not challenging through the range of this vault's placement, and a
single hellephant does make up for this. So rather than leaving this as
an easier door vault variant, I've revamped the monster set to focus on
its hellish and demonic themes. I've also brought its level placement in
line with the other door vault variants to reduce spoilers.

The new monster set includes hell hogs and hell hounds for Dungeon, a
chaotic theme for Elf and Zot, and a mix of hell knights, hellions and
balrugs for other branches. At least one hellephant is always present,
and additional ones are added, scaling with depth of placement, up to 4
guaranteed hellephants in Geh and Dis.

As I've done for the other door vault variants, the common setup
function is used, which adds appropriate loot. There is also now a
version of this vault for the Vaults branch.

11 months agoSome tweaks to not_door_vault_mu
gammafunk [Fri, 20 Mar 2020 00:48:15 +0000]
Some tweaks to not_door_vault_mu

Make this whimsical version of door_vault place over the same range as
the actual door_vault. This way there aren't spoilers as to which
branches can give you an easy door vault. Use the shared setup function,
which also means we place loot. These vaults place late in the game and
this variant is weight 1, so some free loot in exchange for the bravery
of opening a door vault is fine. Finally, add a variant for Vaults
branch as an "empty" room.

11 months agoRevamp door_vault
gammafunk [Fri, 20 Mar 2020 02:27:48 +0000]
Revamp door_vault

This is one of the great spoiler vaults that we allow to remain in the
game, but the vault could use some improvements. Expand its placement a
little to include D:13-14 instead of just D:$. Subsequent commits will
reduce the number of spoilers it does have by giving it and its
look-alike variants the same placement, for the most part. That way, no
matter where you open door vault, you may discover an 8 and 9 spawn zoo,
a hellephant zoo, or just a room full of lovely butterflies!

Tweak the monster sets to have uniformly difficult branch-specific
monsters together with end-level branch spawns at somewhat higher
weight. Before this change, the monster lists had individual weaker
monsters in addition to a high-weight normal branch spawn entry, which
is redundant. I've also made the nasty spawns more memorable, with
attention given to the top-tier branch-unique monsters.

Finally, this commit adds a common setup function for all door vault
variants to set loot and door markers and glyphs. Door vault was
notorious for not placing loot, making it purely an exercise in XP gain.
The addition of on-average 8 good items makes the decision to open a
door vault feel less silly.

11 months agoTweak placement of a ghost vault
gammafunk [Fri, 20 Mar 2020 00:42:16 +0000]
Tweak placement of a ghost vault

The vault gammafunk_ghost_crypt places ordinary liches in Dungeon, which
are scary but comparable to other out-of-depth spawns for the branch,
hence it doesn't need down-weighting there. Also allow it to place from
D:13-D:15 instead of just D:15.

11 months agoAdd the new octopode loading image to webtiles
Goratrix [Thu, 19 Mar 2020 15:48:11 +0000]
Add the new octopode loading image to webtiles

Commit ee0576305db0a1a64f1e85ae863a749289b8fd71
added the new image to local tiles, but not to webtiles.
I used commit da47cbf8c3a56b00bc71d06f4eb5fa7dc4a1203e
as a template for this.

11 months agoTypoFixes
klorpa [Thu, 19 Mar 2020 16:57:02 +0000]

11 months agoFix spelling in god descriptions
Goratrix [Thu, 19 Mar 2020 15:15:26 +0000]
Fix spelling in god descriptions

Correct spelling of 'worshiper' -> 'worshipper' in Sif Muna
and Fedhas descriptions, consistent elsewhere in the game.

11 months agoRefactor init_user to be asynchronous
advil [Wed, 18 Mar 2020 19:43:24 +0000]
Refactor init_user to be asynchronous

This code calls a script via a subprocess. On CAO, this script takes
about 600ms to run on average for new users, and so was triggering
timeouts on nearly every new user (potentially on logins as well),
presumably blocking the server as well. This refactors things so that
the exit condition is checked and handled in a callback rather than in
the same function after the subprocess returns. (This code be cleaner in
pure python 3, but I couldn't get any of those solutions to fully work
with the needed backwards compatibility.)

11 months agoFix a bytes/str issue (I think)
advil [Wed, 18 Mar 2020 01:34:49 +0000]
Fix a bytes/str issue (I think)

I think this will pop up with any wrapper scripts, like save upgrades. I
haven't been able to test this hypothesis because I don't have a local
dgamelaunch-config setup to test it in, and the scripts are fairly

11 months agoDon't print to stderr
Alex Jurkiewicz [Wed, 4 Mar 2020 22:02:46 +0000]
Don't print to stderr

This just messes up ordering of output, eg

11 months agoRefactor
Alex Jurkiewicz [Wed, 4 Mar 2020 21:58:51 +0000]

* Simplify main program flow
* Type functions

11 months agoAdd retry support to
Alex Jurkiewicz [Wed, 4 Mar 2020 21:52:22 +0000]
Add retry support to

11 months agoSmall spelling and grammar fixes
Goratrix [Sun, 1 Mar 2020 16:40:13 +0000]
Small spelling and grammar fixes

1. Rattle-Snake -> Rattlesnake
2. rembered -> remembered
3. make capitalization consistent to the rest of the text and correct singular:
'A Ballistomycete release spores' -> 'A ballistomycete releases spores'

11 months agoCorrect transparency in shortened scarf tiles
Goratrix [Sun, 1 Mar 2020 20:37:01 +0000]
Correct transparency in shortened scarf tiles

Deleted transparent pixels had RGB values white instead of black,
causing slightly larger files.

11 months agoShortened versions of scarf tiles (#12210)
Goratrix [Sun, 1 Mar 2020 16:36:45 +0000]
Shortened versions of scarf tiles (#12210)

Some of the current scarf tiles are too long and obstruct the body armor
underneath. This commit makes all of them the same length, which is
2 pixels shorter than the current shortest ones.

11 months agoCorrect spelling (ByrelMitchell)
Edgar A. Bering IV [Wed, 18 Mar 2020 00:39:48 +0000]
Correct spelling (ByrelMitchell)

11 months agoAdded a few more strings for random item name generation
theJollySin [Sat, 29 Feb 2020 15:07:05 +0000]
Added a few more strings for random item name generation

11 months agoAlphabetizing some random item word lists
theJollySin [Sat, 29 Feb 2020 01:00:11 +0000]
Alphabetizing some random item word lists

11 months agoAdd a workaround for the LoggerAdapter py35 bug
advil [Wed, 18 Mar 2020 00:26:31 +0000]
Add a workaround for the LoggerAdapter py35 bug

It seems that many typical server configurations at the time of commit
are likely to have python 3.5 (thanks to alexjurkiewicz for
investigating), so an actual workaround is probably a good idea.

11 months agoFixes comment about Trog paralysis protection.
Byrel Mitchell [Tue, 25 Feb 2020 13:47:00 +0000]
Fixes comment about Trog paralysis protection.

passive_t::extend_berserk is available at 0 stars of piety, so there's no minimum protection level.

11 months agoAdd a comment about the LoggerAdapter chaining issue
advil [Tue, 17 Mar 2020 23:11:58 +0000]
Add a comment about the LoggerAdapter chaining issue

11 months agoOverride a mypy error for backwards-compat code
advil [Tue, 17 Mar 2020 21:50:09 +0000]
Override a mypy error for backwards-compat code

11 months agoUpdate some webtiles stat colouring
Kate [Tue, 17 Mar 2020 19:57:54 +0000]
Update some webtiles stat colouring

It appears that the AC boost from the Demonspawn icemail mutation doesn't have
support for being highlighted in webtiles, but otherwise this should now be
back in sync with console colouring.

11 months agoDo admin check with a decorator
advil [Tue, 17 Mar 2020 15:19:27 +0000]
Do admin check with a decorator

Will make it less likely that the check ever gets broken, also now
handles logging again.

11 months agoSimplify admin announce code
Aidan Holm [Tue, 17 Mar 2020 14:34:49 +0000]
Simplify admin announce code

Apart from the fact that this is less code, it's also more obviously
correct, with less state to manage.

11 months agoA player ghost level for Ziggurats
gammafunk [Mon, 16 Mar 2020 18:31:28 +0000]
A player ghost level for Ziggurats

This commit adds a player ghost monster set for Zigs that places ghosts
of players who've died in a Zig. The rest of the monsters have suitable
undead theme:

* soul eaters for LOS-wide HP drain and spectral warriors to remove MR
  (moderate weight decreasing with depth).
* deep elf death mages and ghost crabs to heal their fellow undead
  (flat, low weight).
* shadow dragons for ranged and melee draining as well as trampling
  (flat, low weight).
* eidolons for af_slow and revenants for dispel undead (increasing up to
  a moderate weight).
* black suns for more dispel undead and slowing as well as antimagic
  (flat, low weight).
* curse skulls and curse toes for torment and bogging players down with
  summons (flat, low weight).

This gives a nice mix that's light on ghosts in early depths but ramps
up to 5 or more by halfway through the Zig. The player ghost set
replaces the "draining" monster set, since draining monsters are well
represented by this new one along with the Tartarus and Crypt sets. This
set remains at weight 2 to keep the frequency of "undead" floors from
being too high.

TODO: The Zig permastore bones file we ship has 45 ghosts, which is
already over the max of 20 we allow for adding new ghosts. Since a
server's permastore can thus only replace ghosts and won't grow past 45,
and since the non-permastore bones file is even smaller, player ghost
Zig levels are likely to see repeated ghosts. This is especially true of
mega Zigs, where monster counts of 650+ mean that a given ghost will be
repeated 12 times on-average. It might be good to have a higher limit
for the Zig bones files specifically, and to perhaps save XL27
characters that die in extended branches in the Zig file. This is
especially the case since we aren't currently using these extended
ghosts, although that's a separate issue to address.

11 months agoTweak the logging fix
advil [Mon, 16 Mar 2020 15:26:59 +0000]
Tweak the logging fix

getLogger always succeeds, so a try...except block wasn't the way to go.

11 months agoSuppress most access logging for tornado >= 3
advil [Mon, 16 Mar 2020 15:18:21 +0000]
Suppress most access logging for tornado >= 3

There was code to do this that worked for Tornado 2.4, but it needed to
updated for later versions which have a more sophisticated logging
setup. This hides the flood of `200 GET` messages that are involved in a
normal connection.

11 months agoProperly set the admin flag in the WebTiles client
gammafunk [Mon, 16 Mar 2020 06:43:10 +0000]
Properly set the admin flag in the WebTiles client

Some testing code was leftover from debugging the client-side portion of
the new admin panel such that all users saw this panel regardless of
actual admin status. The user admin check was properly handled in the
WebTiles server, so no non-admins could successfully use the message
facility. This bug just affected the visibility of the panel in the
client lobby.

11 months agoFix the ancient tornado compat code
advil [Mon, 16 Mar 2020 04:33:55 +0000]
Fix the ancient tornado compat code

I'm not clear on why this is necessary. Also, remove some debug code.

11 months agoFix an import
advil [Mon, 16 Mar 2020 04:03:46 +0000]
Fix an import

Avoid unneeded lazy implicit loading

11 months agoMove admin panel fully into client.html
advil [Mon, 16 Mar 2020 02:54:51 +0000]
Move admin panel fully into client.html

It turns out this may need to be manually copied, incorporate it back
into client.html.

11 months agoRemove some debug code
advil [Mon, 16 Mar 2020 01:27:22 +0000]
Remove some debug code

11 months agocheckwhite new file
advil [Mon, 16 Mar 2020 01:23:57 +0000]
checkwhite new file

11 months agoAdd a rudimentary serverwide announce facility to webtiles
advil [Mon, 16 Mar 2020 01:18:43 +0000]
Add a rudimentary serverwide announce facility to webtiles

This lets DGL admin users make server-wide announcements, e.g. if the
server is going to shut down. The announcement appears both in game logs
and in the chat window. The facility is pretty basic, but functional,
and is designed with the intent that it would be *extremely* rarely

Some questions:

* should the admin panel remain part of client.html?
* Is DGL admin the right permissions level?
* what else should be added to the new admin panel?
* is announcing to both the game and chat too much?
* will this work with ssh games? (I think so?)

11 months agoFix another bytes/string issue in a callback
advil [Mon, 16 Mar 2020 01:07:51 +0000]
Fix another bytes/string issue in a callback

11 months agoA few cleanups to tornado compatibility code (aidanh)
advil [Sun, 15 Mar 2020 16:57:57 +0000]
A few cleanups to tornado compatibility code (aidanh)

11 months agocheckwhite
advil [Sun, 15 Mar 2020 16:36:23 +0000]