diff --git a/Allure.cabal b/Allure.cabal
--- a/Allure.cabal
+++ b/Allure.cabal
@@ -5,7 +5,7 @@
 -- PVP summary:+-+------- breaking API changes
 --             | | +----- minor or non-breaking API additions
 --             | | | +--- code changes with no API change
-version:       0.6.1.0
+version:       0.6.2.0
 synopsis:      Near-future Sci-Fi roguelike and tactical squad game
 description:   Allure of the Stars
                is a near-future Sci-Fi roguelike and tactical squad game.
@@ -29,7 +29,7 @@
 bug-reports:   http://github.com/AllureOfTheStars/Allure/issues
 license:       AGPL-3
 license-file:  LICENSE
-tested-with:   GHC >= 7.10 && <= 8.2
+tested-with:   GHC >= 8.0 && <= 8.2
 data-files:    GameDefinition/config.ui.default,
                GameDefinition/fonts/16x16x.fon,
                GameDefinition/fonts/8x8xb.fon,
@@ -72,11 +72,11 @@
                       Content.TileKind,
                       TieKnot,
                       Paths_Allure
-  build-depends:      LambdaHack >= 0.6.1.0 && < 0.6.2.0,
+  build-depends:      LambdaHack >= 0.6.2.0 && < 0.6.3.0,
                       template-haskell >= 2.6,
 
                       async      >= 2,
-                      base       >= 4 && < 99,
+                      base       >= 4.9 && < 99,
                       containers >= 0.5.3.0,
                       enummapset-th >= 0.6.0.0,
                       filepath   >= 1.2.0.1,
@@ -85,10 +85,11 @@
 
   default-language:   Haskell2010
   default-extensions: MonoLocalBinds, ScopedTypeVariables, OverloadedStrings
-                      BangPatterns, RecordWildCards, NamedFieldPuns, MultiWayIf
+                      BangPatterns, RecordWildCards, NamedFieldPuns, MultiWayIf,
+                      StrictData
   other-extensions:   TemplateHaskell
-  ghc-options:        -Wall -fwarn-orphans -fwarn-tabs -fwarn-incomplete-uni-patterns -fwarn-incomplete-record-updates -fwarn-unrecognised-pragmas
-  ghc-options:        -fno-warn-implicit-prelude -fno-ignore-asserts -fexpose-all-unfoldings -fspecialise-aggressively
+  ghc-options:        -Wall -Wcompat -Worphans -Wincomplete-uni-patterns -Wincomplete-record-updates -Wimplicit-prelude -Wmissing-home-modules -Widentities
+  ghc-options:        -fno-ignore-asserts -fexpose-all-unfoldings -fspecialise-aggressively
   ghc-options:        -threaded -rtsopts
 
   if impl(ghcjs) {
@@ -103,7 +104,7 @@
     build-depends:    zlib >= 0.5.3.1
 -- The -A options makes it slightly faster, especially with short sessions:
     ghc-options:      "-with-rtsopts=-A99m -K1000K"
--- TODO: get back to -K1K when I can use pretty-1.1.3.4 (TH depends on an old one)
+-- TODO: get back to -K1K when I can use pretty-1.1.3.4 (TH depends on an old one), that is, when I can drop GHC 8.0.2 and older
   }
 
 test-suite test
@@ -128,7 +129,7 @@
   build-depends:      LambdaHack,
                       template-haskell >= 2.6,
 
-                      base       >= 4 && < 99,
+                      base       >= 4.9 && < 99,
                       containers >= 0.5.3.0,
                       enummapset-th >= 0.6.0.0,
                       filepath   >= 1.2.0.1,
@@ -137,10 +138,11 @@
 
   default-language:   Haskell2010
   default-extensions: MonoLocalBinds, ScopedTypeVariables, OverloadedStrings
-                      BangPatterns, RecordWildCards, NamedFieldPuns, MultiWayIf
+                      BangPatterns, RecordWildCards, NamedFieldPuns, MultiWayIf,
+                      StrictData
   other-extensions:   TemplateHaskell
-  ghc-options:        -Wall -fwarn-orphans -fwarn-tabs -fwarn-incomplete-uni-patterns -fwarn-incomplete-record-updates -fwarn-unrecognised-pragmas
-  ghc-options:        -fno-warn-implicit-prelude -fno-ignore-asserts -fexpose-all-unfoldings -fspecialise-aggressively
+  ghc-options:        -Wall -Wcompat -Worphans -Wincomplete-uni-patterns -Wincomplete-record-updates -Wimplicit-prelude -Wmissing-home-modules -Widentities
+  ghc-options:        -fno-ignore-asserts -fexpose-all-unfoldings -fspecialise-aggressively
   ghc-options:        -threaded -rtsopts
 
   if impl(ghcjs) {
@@ -151,5 +153,5 @@
   } else {
     build-depends:    zlib >= 0.5.3.1
     ghc-options:      "-with-rtsopts=-A99m -K1000K"
--- get back to -K1K when I can use pretty-1.1.3.4 (TH depends on an old one)
+-- TODO: get back to -K1K when I can use pretty-1.1.3.4 (TH depends on an old one), that is, when I can drop GHC 8.0.2 and older
   }
diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,23 @@
+## [v0.6.2.0, aka 'Zoom out'](https://github.com/LambdaHack/LambdaHack/compare/v0.6.1.0...v0.6.2.0)
+
+- make fireworks slower and so easier to spot
+- make rattlesnake deeper but more common
+- announce no effect of activation
+- describe original and current faction of an actor
+- highlight dominated actors
+- mark organs with comma instead of percent and gems with dollar
+- make the healing cave dangerous to prevent camping
+- slightly balance various content
+- by default move item the same as last time
+- often spawn between heroes and stairs going deeper
+- fix totalUsefulness computation for negative effects
+- fix abandoning distant enemy target despite no alternatives
+- fix slow pushing of actors
+- fix a crash when many actors run towards stairs
+- hotfix: Pass zoom keys through to the browser
+- help players find the info about changing the font size
+- depend on GHC >= 8.0 and new vector
+
 ## [v0.6.1.0, aka 'Breaking one rule at a time'](https://github.com/LambdaHack/LambdaHack/compare/v0.6.0.0...v0.6.1.0)
 
 - major engine bugfix: fix redrawing after window minimized and restored
diff --git a/GameDefinition/Content/CaveKind.hs b/GameDefinition/Content/CaveKind.hs
--- a/GameDefinition/Content/CaveKind.hs
+++ b/GameDefinition/Content/CaveKind.hs
@@ -52,8 +52,8 @@
   , chidden       = 7
   , cactorCoeff   = 130  -- the maze requires time to explore
   , cactorFreq    = [("monster", 50), ("animal", 25), ("robot", 25)]
-  , citemNum      = 5 * d 5
-  , citemFreq     = [("useful", 50), ("treasure", 50)]
+  , citemNum      = 6 * d 5
+  , citemFreq     = [("useful", 40), ("treasure", 60)]
   , cplaceFreq    = [("rogue", 100)]
   , cpassable     = False
   , cdefTile        = "fillerWall"
@@ -90,11 +90,12 @@
   , chidden       = 0
   , cactorCoeff   = 100
   , cactorFreq    = [("monster", 25), ("animal", 70), ("robot", 5)]
-  , citemNum      = 4 * d 5  -- few rooms
-  , citemFreq     = [("useful", 20), ("treasure", 30), ("any scroll", 50)]
+  , citemNum      = 5 * d 5  -- few rooms
+  , citemFreq     = [("useful", 20), ("treasure", 40), ("any scroll", 40)]
   , cplaceFreq    = [("arena", 100)]
   , cpassable     = True
   , cdefTile      = "arenaSetLit"
+  , cdarkCorTile  = "trailLit"  -- let trails give off light
   , clitCorTile   = "trailLit"
   }
 arena2 = arena
@@ -103,10 +104,9 @@
   , cdarkChance   = 41 + d 10  -- almost all rooms lit (1 in 10 dark)
   -- Trails provide enough light for fun stealth.
   , cnightChance  = 51  -- always night
-  , citemNum      = 6 * d 5  -- rare, so make it exciting
-  , citemFreq     = [("useful", 30), ("treasure", 70)] -- lives up to the name
+  , citemNum      = 7 * d 5  -- rare, so make it exciting
+  , citemFreq     = [("useful", 20), ("treasure", 80)] -- lives up to the name
   , cdefTile      = "arenaSetDark"
-  , cdarkCorTile  = "trailLit"  -- let trails give off light
   }
 laboratory = arena2
   { csymbol       = 'L'
@@ -122,11 +122,12 @@
   , cdoorChance   = 1
   , copenChance   = 1%2
   , chidden       = 7
-  , citemNum      = 6 * d 5  -- reward difficulty
-  , citemFreq     = [("useful", 20), ("treasure", 30), ("any vial", 50)]
+  , citemNum      = 7 * d 5  -- reward difficulty
+  , citemFreq     = [("useful", 20), ("treasure", 40), ("any vial", 40)]
   , cplaceFreq    = [("laboratory", 100)]
   , cpassable     = False
   , cdefTile      = "fillerWall"
+  , cdarkCorTile  = "labTrailLit"  -- let lab smoke give off light always
   , clitCorTile   = "labTrailLit"
   , cstairFreq    = [("staircase lift", 100)]
   }
@@ -148,7 +149,7 @@
   , chidden       = 0
   , cactorCoeff   = 80
   , cactorFreq    = [("monster", 25), ("animal", 5), ("robot", 70)]
-  , citemNum      = 4 * d 5  -- few rooms
+  , citemNum      = 5 * d 5  -- few rooms
   , cplaceFreq    = [("empty", 100)]
   , cpassable     = True
   , cdefTile      = "emptySet"
@@ -174,7 +175,7 @@
   , chidden       = 0
   , cactorCoeff   = 160  -- the maze requires time to explore
   , cactorFreq    = [("monster", 70), ("animal", 15), ("robot", 15)]
-  , citemNum      = 6 * d 5  -- an incentive to explore the labyrinth
+  , citemNum      = 7 * d 5  -- an incentive to explore the labyrinth
   , cpassable     = True
   , cplaceFreq    = [("noise", 100)]
   , cdefTile      = "noiseSet"
@@ -186,7 +187,7 @@
   { cname         = "Power distribution hub"
   , cfreq         = [("caveNoise2", 1)]
   , cnightChance  = 51  -- easier variant, but looks sinister
-  , citemNum      = 12 * d 5  -- an incentive to explore the final labyrinth
+  , citemNum      = 13 * d 5  -- an incentive to explore the final labyrinth
   , cplaceFreq    = [("noise", 1), ("mine", 99)]
   , cstairFreq    = [("gated staircase", 100)]
   }
@@ -196,8 +197,9 @@
   , cfreq         = [("caveBridge", 1)]
   , cdarkChance   = 0  -- all rooms lit, for a gentle start
   , cextraStairs  = 1
-  , cactorFreq    = []  -- safe, nothing spawns
-  , citemNum      = 8 * d 5  -- lure them in with loot
+  , cactorCoeff   = 200  -- it's quite deep already, so spawn slowly
+  , cactorFreq    = [("animal", 100)]
+  , citemNum      = 9 * d 5  -- lure them in with loot
   , citemFreq     = filter ((/= "treasure") . fst) $ citemFreq rogue
   }
 shallow2rogue = rogue
@@ -221,8 +223,8 @@
 shallow1empty = shallow2empty  -- TODO: replace some rooms with oriels?
   { cname         = "Outermost deck"
   , cfreq         = [("outermost", 100)]
-  , cactorCoeff   = 5  -- shallower than LH, so less immediate actors, so boost
-  , cactorFreq    = [("animal", 4), ("robot", 1), ("immobile robot", 95)]
+  , cactorCoeff   = 4  -- shallower than LH, so less immediate actors, so boost
+  , cactorFreq    = [("animal", 5), ("robot", 5), ("immobile robot", 90)]
       -- The medbot faucets on lvl 1 act like HP resets. Needed to avoid
       -- cascading failure, if the particular starting conditions were
       -- very hard. Items are not reset, even if they are bad, which provides
@@ -244,7 +246,7 @@
   , cfreq         = [("caveRaid", 1)]
   , cdarkChance   = 0  -- all rooms lit, for a gentle start
   , cmaxVoid      = 1%10
-  , cactorCoeff   = 1000  -- deep level with no kit, so slow spawning
+  , cactorCoeff   = 500  -- deep level with no kit, so slow spawning
   , cactorFreq    = [("animal", 50), ("robot", 50)]
   , citemNum      = 6 * d 8  -- just one level, hard enemies, treasure
   , citemFreq     = [("useful", 33), ("gem", 33), ("currency", 33)]
diff --git a/GameDefinition/Content/ItemKind.hs b/GameDefinition/Content/ItemKind.hs
--- a/GameDefinition/Content/ItemKind.hs
+++ b/GameDefinition/Content/ItemKind.hs
@@ -52,14 +52,14 @@
 
 -- * Item group symbols, from Angband and variants
 
-symbolProjectile, _symbolLauncher, symbolLight, symbolTool, symbolGem, symbolGold, symbolNecklace, symbolRing, symbolPotion, symbolFlask, symbolScroll, symbolTorsoArmor, symbolMiscArmor, _symbolClothes, symbolShield, symbolPolearm, symbolEdged, symbolHafted, symbolWand, _symbolStaff, _symbolFood :: Char
+symbolProjectile, _symbolLauncher, symbolLight, symbolTool, symbolSpecial, symbolGold, symbolNecklace, symbolRing, symbolPotion, symbolFlask, symbolScroll, symbolTorsoArmor, symbolMiscArmor, _symbolClothes, symbolShield, symbolPolearm, symbolEdged, symbolHafted, symbolWand, _symbolStaff, symbolFood :: Char
 
 symbolProjectile = '{'
 _symbolLauncher  = '}'
 symbolLight      = '('
 symbolTool       = ')'
-symbolGem        = '*'
-symbolGold       = '$'
+symbolSpecial    = '*'  -- don't overuse, because it clashes with projectiles
+symbolGold       = '$'  -- also gems
 symbolNecklace   = '"'
 symbolRing       = '='
 symbolPotion     = '!'  -- concoction, bottle, jar, vial, canister
@@ -74,7 +74,7 @@
 symbolHafted     = '\\'
 symbolWand       = '-'  -- magical rod, transmitter, pistol, rifle
 _symbolStaff     = '_'  -- scanner
-_symbolFood      = ','  -- distinct from floor, because middle dots used
+symbolFood       = ','  -- also body part; distinct from floor: not middle dot
 
 -- * Thrown weapons
 
@@ -375,7 +375,7 @@
   { irarity  = [(10, 2)]
   , ieffects = [ ELabel "of smelly concoction"
                , toOrganActorTurn "keen-smelling" (40 + d 10)
-               , DetectActor 5
+               , DetectActor 10
                , OnSmash (Explode "smelly droplet") ]
   }
 flask11 = flask
@@ -486,8 +486,9 @@
   , ieffects = [ RefillHP 10, DropItem 1 maxBound COrgan "poisoned"
                , OnSmash (Explode "healing mist 2") ]
   }
-potion5 = potion
-  { ieffects = [ OneOf [ RefillHP 10, RefillHP 5, Burn 5
+potion5 = potion  -- needs to be common to show at least a portion of effects
+  { irarity  = [(1, 30), (10, 15)]
+  , ieffects = [ OneOf [ RefillHP 10, RefillHP 5, Burn 5
                        , toOrganActorTurn "strengthened" (20 + d 5) ]
                , OnSmash (OneOf [ Explode "dense shower"
                                 , Explode "sparse shower"
@@ -496,8 +497,8 @@
                                 , Explode "red paint"
                                 , Explode "blast 10" ]) ]
   }
-potion6 = potion
-  { irarity  = [(3, 2), (10, 5)]
+potion6 = potion  -- needs to be common to show at least a portion of effects
+  { irarity  = [(1, 5), (10, 20)]
   , ieffects = [ Impress
                , OneOf [ RefillCalm (-60)
                        , RefillHP 20, RefillHP 10, Burn 10
@@ -561,23 +562,24 @@
   }
 scroll2 = scroll
   { irarity  = [(1, 2)]
-  , ieffects = [ ELabel "of greed", Teleport 20, DetectItem 10
+  , ieffects = [ ELabel "of greed", Teleport 20, DetectItem 20
                , RefillCalm (-100) ]
   }
 scroll3 = scroll
   { irarity  = [(1, 4), (10, 2)]
   , ieffects = [Ascend True]
   }
-scroll4 = scroll
-  { ieffects = [OneOf [ Teleport 5, RefillCalm 5, InsertMove 5
-                      , DetectActor 10, DetectItem 10 ]]
+scroll4 = scroll  -- needs to be common to show at least a portion of effects
+  { irarity  = [(1, 40), (10, 20)]
+  , ieffects = [OneOf [ Teleport 5, RefillCalm 5, InsertMove 5
+                      , DetectActor 20, DetectItem 20 ]]
   }
-scroll5 = scroll
-  { irarity  = [(10, 14)]
+scroll5 = scroll  -- needs to be common to show at least a portion of effects
+  { irarity  = [(10, 30)]
   , ieffects = [ Impress
                , OneOf [ Teleport 20, Ascend False, Ascend True
                        , Summon "hero" 1, Summon "mobile animal" 2
-                       , Detect 20, RefillCalm (-100)
+                       , Detect 40, RefillCalm (-100)
                        , CreateItem CGround "useful" TimerNone ] ]
   }
 scroll6 = scroll
@@ -591,7 +593,8 @@
   , ieffects = [InsertMove $ 1 + d 2 + dl 2]
   }
 scroll9 = scroll
-  { ieffects = [ELabel "of scientific explanation", Identify]
+  { irarity  = [(1, 30)]
+  , ieffects = [ELabel "of scientific explanation", Identify]
   }
 scroll10 = scroll
   { irarity  = [(10, 20)]
@@ -605,10 +608,10 @@
   }
 scroll12 = scroll
   { irarity  = [(1, 9), (10, 4)]
-  , ieffects = [DetectHidden 10]
+  , ieffects = [DetectHidden 20]
   }
 scroll13 = scroll
-  { ieffects = [ELabel "of acute hearing", DetectActor 7]
+  { ieffects = [ELabel "of acute hearing", DetectActor 20]
   }
 
 -- * Assorted tools
@@ -646,7 +649,7 @@
   , ikit     = []
   }
 seeingItem = ItemKind
-  { isymbol  = '%'
+  { isymbol  = symbolFood
   , iname    = "visual sensor"
   , ifreq    = [("useful", 100)]
   , iflavour = zipPlain [Red]
@@ -742,7 +745,7 @@
 necklace3 = necklace
   { iaspects = [Timeout $ d 3 + 4 - dl 3 |*| 5]
   , ieffects = [ ELabel "of fearful listening"
-               , Recharging (DetectActor 10)
+               , Recharging (DetectActor 20)
                , Recharging (RefillCalm (-20)) ]
                ++ ieffects necklace
   }
@@ -1036,7 +1039,7 @@
   , ifreq    = [("useful", 100), ("starting weapon", 100)]
   , iflavour = zipPlain [BrCyan]
   , icount   = 1
-  , irarity  = [(1, 40), (5, 1)]
+  , irarity  = [(3 * 10/12, 50), (4 * 10/12, 1)]
   , iverbHit = "stab"
   , iweight  = 1000
   , idamage  = toDmg $ 6 * d 1
@@ -1124,7 +1127,7 @@
   , irarity  = [(5, 1), (10, 6)]
   , iaspects = [Timeout $ d 4 + 5 - dl 4 |*| 2]
   , ieffects = ieffects sword
-               ++ [Unique, Recharging Impress, Recharging (DetectActor 3)]
+               ++ [Unique, Recharging Impress, Recharging (DetectActor 5)]
   }
 swordNullify = sword
   { isymbol  = symbolEdged
@@ -1196,7 +1199,7 @@
 -- * Treasure
 
 gem = ItemKind
-  { isymbol  = symbolGem
+  { isymbol  = symbolGold
   , iname    = "gem"
   , ifreq    = [("treasure", 100), ("gem", 100)]
   , iflavour = zipPlain $ delete BrYellow brightCol  -- natural, so not fancy
@@ -1214,19 +1217,20 @@
   , ikit     = []
   }
 gem1 = gem
-  { irarity  = [(3, 0), (10, 12)]
+  { irarity  = [(3, 0), (10, 24)]
   }
 gem2 = gem
-  { irarity  = [(5, 0), (10, 14)]
+  { irarity  = [(5, 0), (10, 28)]
   }
 gem3 = gem
-  { irarity  = [(7, 0), (10, 16)]
+  { irarity  = [(7, 0), (10, 32)]
   }
 gem4 = gem
-  { irarity  = [(9, 0), (10, 50)]
+  { irarity  = [(9, 0), (10, 100)]
   }
 gem5 = gem
-  { iname    = "stimpack"
+  { isymbol  = symbolSpecial
+  , iname    = "stimpack"
   , iflavour = zipPlain [BrYellow]
   , irarity  = [(1, 40), (10, 40)]
   , iaspects = []
diff --git a/GameDefinition/Content/ItemKindActor.hs b/GameDefinition/Content/ItemKindActor.hs
--- a/GameDefinition/Content/ItemKindActor.hs
+++ b/GameDefinition/Content/ItemKindActor.hs
@@ -339,7 +339,7 @@
   , ifreq    = [("animal", 100), ("mobile", 1), ("mobile animal", 100)]
   , iflavour = zipPlain [Brown]
   , icount   = 1
-  , irarity  = [(4, 1), (10, 7)]
+  , irarity  = [(5, 1), (10, 12)]
   , iverbHit = "thud"
   , iweight  = 80000
   , idamage  = toDmg 0
@@ -472,10 +472,10 @@
 thornbush = ItemKind
   { isymbol  = 't'
   , iname    = "thornbush"
-  , ifreq    = [("animal", 50), ("immobile animal", 100)]
+  , ifreq    = [("animal", 20), ("immobile animal", 30)]
   , iflavour = zipPlain [Brown]
   , icount   = 1
-  , irarity  = [(1, 2)]
+  , irarity  = [(1, 10)]
   , iverbHit = "thud"
   , iweight  = 80000
   , idamage  = toDmg 0
@@ -495,10 +495,10 @@
 razorwireFence = ItemKind
   { isymbol  = 'f'
   , iname    = "razorwire fence"
-  , ifreq    = [("robot", 50), ("immobile robot", 50)]
+  , ifreq    = [("robot", 10), ("immobile robot", 10)]
   , iflavour = zipPlain [Cyan]
   , icount   = 1
-  , irarity  = [(3 * 10/12, 0), (4 * 10/12, 2)]
+  , irarity  = [(3 * 10/12, 0), (4 * 10/12, 10)]  -- quickly vanishes at depth
   , iverbHit = "thud"
   , iweight  = 80000
   , idamage  = toDmg 0
@@ -513,10 +513,10 @@
 electricFence = ItemKind
   { isymbol  = 'f'
   , iname    = "electric fence"
-  , ifreq    = [("robot", 50), ("immobile robot", 50)]
+  , ifreq    = [("robot", 10), ("immobile robot", 10)]
   , iflavour = zipPlain [Blue]
   , icount   = 1
-  , irarity  = [(3 * 10/12, 0), (4 * 10/12, 2)]
+  , irarity  = [(3 * 10/12, 0), (4 * 10/12, 10)]
   , iverbHit = "thud"
   , iweight  = 80000
   , idamage  = toDmg 0
@@ -531,10 +531,10 @@
 activeFence = ItemKind
   { isymbol  = 'f'
   , iname    = "active fence"
-  , ifreq    = [("robot", 50), ("immobile robot", 50)]
+  , ifreq    = [("robot", 30), ("immobile robot", 30)]
   , iflavour = zipPlain [Red]
   , icount   = 1
-  , irarity  = [(5 * 10/12, 0), (6 * 10/12, 2)]
+  , irarity  = [(5 * 10/12, 0), (6 * 10/12, 3)]
   , iverbHit = "thud"
   , iweight  = 80000
   , idamage  = toDmg 0
@@ -550,10 +550,10 @@
 steamFaucet = ItemKind
   { isymbol  = 'f'
   , iname    = "steam faucet"
-  , ifreq    = [("robot", 50), ("immobile robot", 90)]
+  , ifreq    = [("robot", 30), ("immobile robot", 50)]
   , iflavour = zipPlain [BrBlue]
   , icount   = 1
-  , irarity  = [(5, 2)]
+  , irarity  = [(1, 3), (5 * 10/12, 3)]
   , iverbHit = "thud"
   , iweight  = 80000
   , idamage  = toDmg 0
@@ -568,10 +568,10 @@
 biogasFaucet = ItemKind
   { isymbol  = 'f'
   , iname    = "biogas faucet"
-  , ifreq    = [("robot", 50), ("immobile robot", 120)]
+  , ifreq    = [("robot", 10), ("immobile robot", 30)]
   , iflavour = zipPlain [BrGreen]
   , icount   = 1
-  , irarity  = [(5, 2)]
+  , irarity  = [(1, 10), (5 * 10/12, 10)]
   , iverbHit = "thud"
   , iweight  = 80000
   , idamage  = toDmg 0
@@ -586,10 +586,10 @@
 medbotFaucet = ItemKind
   { isymbol  = 'f'
   , iname    = "nano medbot faucet"
-  , ifreq    = [("robot", 50), ("immobile robot", 270)]
+  , ifreq    = [("robot", 10), ("immobile robot", 90)]
   , iflavour = zipPlain [BrYellow]
   , icount   = 1
-  , irarity  = [(5, 2)]
+  , irarity  = [(1, 10), (5 * 10/12, 10)]
   , iverbHit = "thud"
   , iweight  = 80000
   , idamage  = toDmg 0
diff --git a/GameDefinition/Content/ItemKindBlast.hs b/GameDefinition/Content/ItemKindBlast.hs
--- a/GameDefinition/Content/ItemKindBlast.hs
+++ b/GameDefinition/Content/ItemKindBlast.hs
@@ -88,11 +88,10 @@
   , iaspects = [AddShine $ intToDice $ n `div` 2]
   , ieffects = [ RefillCalm (-1) | n >= 5 ]
                ++ [ DropBestWeapon | n >= 5]
-               ++ [ OnSmash (Explode $ toGroupName
-                             $ "firecracker" <+> tshow (n - 1))
+               ++ [ OnSmash $ Explode
+                    $ toGroupName $ "firecracker" <+> tshow (n - 1)
                   | n > 2 ]
-  , ifeature = [ ToThrow $ ThrowMod (5 + 3 * n) (10 + 100 `div` n)
-               , Fragile, Identified ]
+  , ifeature = [toVelocity 5, Fragile, Identified]
   , idesc    = ""
   , ikit     = []
   }
@@ -143,7 +142,7 @@
   { isymbol  = '`'
   , iname    = "mist"
   , ifreq    = [("calming mist", 1)]
-  , iflavour = zipFancy [White]
+  , iflavour = zipFancy [BrGreen]
   , icount   = 8
   , irarity  = [(1, 1)]
   , iverbHit = "sooth"
@@ -175,7 +174,7 @@
   { isymbol  = '`'
   , iname    = "mist"  -- powerful, so slow and narrow
   , ifreq    = [("healing mist", 1)]
-  , iflavour = zipFancy [White]
+  , iflavour = zipFancy [BrGreen]
   , icount   = 8
   , irarity  = [(1, 1)]
   , iverbHit = "revitalize"
@@ -191,7 +190,7 @@
   { isymbol  = '`'
   , iname    = "mist"
   , ifreq    = [("healing mist 2", 1)]
-  , iflavour = zipFancy [White]
+  , iflavour = zipFancy [BrGreen]
   , icount   = 8
   , irarity  = [(1, 1)]
   , iverbHit = "revitalize"
@@ -207,7 +206,7 @@
   { isymbol  = '`'
   , iname    = "mist"
   , ifreq    = [("wounding mist", 1)]
-  , iflavour = zipFancy [White]
+  , iflavour = zipFancy [BrRed]
   , icount   = 8
   , irarity  = [(1, 1)]
   , iverbHit = "devitalize"
@@ -287,7 +286,7 @@
   { isymbol  = '*'
   , iname    = "hoof glue"
   , ifreq    = [("glue", 1)]
-  , iflavour = zipPlain [BrYellow]
+  , iflavour = zipPlain [Cyan]
   , icount   = 16
   , irarity  = [(1, 1)]
   , iverbHit = "glue"
@@ -303,7 +302,7 @@
   { isymbol  = '`'
   , iname    = "single spark"
   , ifreq    = [("single spark", 1)]
-  , iflavour = zipPlain [BrYellow]
+  , iflavour = zipPlain [BrWhite]
   , icount   = 1
   , irarity  = [(1, 1)]
   , iverbHit = "spark"
@@ -319,7 +318,7 @@
   { isymbol  = '`'
   , iname    = "spark"
   , ifreq    = [("spark", 1)]
-  , iflavour = zipPlain [BrYellow]
+  , iflavour = zipPlain [BrWhite]
   , icount   = 16
   , irarity  = [(1, 1)]
   , iverbHit = "scorch"
@@ -342,7 +341,7 @@
   { isymbol  = '`'
   , iname    = "dense shower"
   , ifreq    = [("dense shower", 1)]
-  , iflavour = zipFancy [Red]
+  , iflavour = zipFancy [Green]
   , icount   = 16
   , irarity  = [(1, 1)]
   , iverbHit = "strengthen"
@@ -358,7 +357,7 @@
   { isymbol  = '`'
   , iname    = "sparse shower"
   , ifreq    = [("sparse shower", 1)]
-  , iflavour = zipFancy [Blue]
+  , iflavour = zipFancy [Red]
   , icount   = 16
   , irarity  = [(1, 1)]
   , iverbHit = "weaken"
@@ -439,7 +438,7 @@
   { isymbol  = '`'
   , iname    = "haste spray"
   , ifreq    = [("haste spray", 1)]
-  , iflavour = zipPlain [BrRed]
+  , iflavour = zipPlain [BrYellow]
   , icount   = 16
   , irarity  = [(1, 1)]
   , iverbHit = "haste"
@@ -471,7 +470,7 @@
   { isymbol  = '`'
   , iname    = "eye drop"
   , ifreq    = [("eye drop", 1)]
-  , iflavour = zipPlain [BrGreen]
+  , iflavour = zipPlain [BrCyan]
   , icount   = 16
   , irarity  = [(1, 1)]
   , iverbHit = "cleanse"
@@ -519,7 +518,7 @@
   { isymbol  = '`'
   , iname    = "eye shine"
   , ifreq    = [("eye shine", 1)]
-  , iflavour = zipPlain [BrRed]
+  , iflavour = zipPlain [Cyan]
   , icount   = 16
   , irarity  = [(1, 1)]
   , iverbHit = "smear"
@@ -586,7 +585,7 @@
   { isymbol  = '`'
   , iname    = "poison cloud"
   , ifreq    = [("poison cloud", 1)]
-  , iflavour = zipPlain [Green]
+  , iflavour = zipPlain [BrMagenta]
   , icount   = 16
   , irarity  = [(1, 1)]
   , iverbHit = "poison"
@@ -602,7 +601,7 @@
   { isymbol  = '`'
   , iname    = "mist"
   , ifreq    = [("anti-slow mist", 1)]
-  , iflavour = zipPlain [BrRed]
+  , iflavour = zipPlain [BrYellow]
   , icount   = 8
   , irarity  = [(1, 1)]
   , iverbHit = "propel"
diff --git a/GameDefinition/Content/ItemKindOrgan.hs b/GameDefinition/Content/ItemKindOrgan.hs
--- a/GameDefinition/Content/ItemKindOrgan.hs
+++ b/GameDefinition/Content/ItemKindOrgan.hs
@@ -34,7 +34,7 @@
 -- * Human weapon organs
 
 fist = ItemKind
-  { isymbol  = '%'
+  { isymbol  = ','
   , iname    = "fist"
   , ifreq    = [("fist", 100)]
   , iflavour = zipPlain [Red]
@@ -133,8 +133,7 @@
   , ifreq    = [("thorn", 100)]
   , icount   = 2 + d 3
   , iverbHit = "impale"
-  , idamage  = toDmg $ 1 * d 1
-  , ieffects = [RefillHP (-2)]
+  , idamage  = toDmg $ 1 * d 3
   , ifeature = [Identified, Meleeable]  -- not Durable
   , idesc    = ""
   }
@@ -230,7 +229,7 @@
 -- * Armor organs
 
 armoredSkin = ItemKind
-  { isymbol  = '%'
+  { isymbol  = ','
   , iname    = "armored skin"
   , ifreq    = [("armored skin", 100)]
   , iflavour = zipPlain [Red]
diff --git a/GameDefinition/Content/ModeKind.hs b/GameDefinition/Content/ModeKind.hs
--- a/GameDefinition/Content/ModeKind.hs
+++ b/GameDefinition/Content/ModeKind.hs
@@ -335,10 +335,8 @@
                  , ( playerMonster
                    , [] )
                  , ( playerAnimal
-                   , -- Fun from the start to avoid empty initial level:
-                     [ (3, 5 + d 2, "animal")  -- many, because no spawning
-                     -- Optional huge battle at the end:
-                     , (12, 100, "mobile animal") ] )
+                   , -- Optional huge battle at the end:
+                     [(12, 100, "mobile animal")] )
                  , ( playerRobot
                    , [] ) ]  -- gentle introduction
   , rosterEnemy = [ ("Spacefarer", "Alien Hierarchy")
diff --git a/GameDefinition/Content/PlaceKind.hs b/GameDefinition/Content/PlaceKind.hs
--- a/GameDefinition/Content/PlaceKind.hs
+++ b/GameDefinition/Content/PlaceKind.hs
@@ -727,8 +727,8 @@
 cells = PlaceKind
   { psymbol  = '#'
   , pname    = "cells"
-  , pfreq    = [ ("rogue", 50), ("arena", 50), (" laboratory", 50)
-               , ("empty", 50), ("noise", 50) ]
+  , pfreq    = [ ("rogue", 20), ("arena", 20), (" laboratory", 20)
+               , ("empty", 20), ("noise", 20), ("zoo", 200) ]
   , prarity  = [(1, 10), (10, 10)]
   , pcover   = CReflect
   , pfence   = FWall
@@ -738,8 +738,9 @@
                ]
   , poverride = []
   }
-cells2 = cells
-  { pfreq = ("zoo", 400) : pfreq cells
+cells2 = cells  -- this one is distinct enough from others
+  { pfreq    = [ ("rogue", 50), ("arena", 50), (" laboratory", 50)
+               , ("empty", 50), ("noise", 50), ("zoo", 500) ]
   , ptopLeft = [ "··#"
                , "··#"
                , "##·"
@@ -752,15 +753,13 @@
                ]
   }
 cells4 = cells
-  { pfreq = ("zoo", 400) : pfreq cells
-  , ptopLeft = [ "··#"
+  { ptopLeft = [ "··#"
                , "·##"
                , "#··"
                ]
   }
 cells5 = cells
-  { pfreq = ("zoo", 400) : pfreq cells
-  , ptopLeft = [ "··#"
+  { ptopLeft = [ "··#"
                , "·#·"
                , "##·"
                ]
diff --git a/GameDefinition/Content/RuleKind.hs b/GameDefinition/Content/RuleKind.hs
--- a/GameDefinition/Content/RuleKind.hs
+++ b/GameDefinition/Content/RuleKind.hs
@@ -68,6 +68,6 @@
   , rfirstDeathEnds = False
   , rwriteSaveClips = 1000
   , rleadLevelClips = 50
-  , rscoresFile = "scores"
+  , rscoresFile = "Allure.scores"
   , rnearby = 20
   }
diff --git a/GameDefinition/PLAYING.md b/GameDefinition/PLAYING.md
--- a/GameDefinition/PLAYING.md
+++ b/GameDefinition/PLAYING.md
@@ -17,7 +17,12 @@
 at this stage of game development, but the game is already playable
 and winnable. Contributions are welcome.
 
+If the game window is too large for your screen or you experience
+other technical issues, please consult
+[README.md](https://github.com/AllureOfTheStars/Allure/blob/master/README.md)
+or describe your problem on gitter or the issue tracker.
 
+
 Heroes
 ------
 
@@ -190,8 +195,8 @@
 as explained in section [Heroes](#heroes) above.
 
 Commands for saving and exiting the current game, starting a new game,
-setting options for the current game and challenges for the next game, etc.,
-are listed in the Main Menu, brought up by the `ESC` key.
+configuring convenience settings for the current game and challenges
+for the next game are listed in the Main Menu, brought up by the `ESC` key.
 Game difficulty, from the challenges menu, determines
 hitpoints at birth for any actor of any UI-using faction.
 The "lone wolf" challenge mode reduces player's starting actors to exactly
@@ -212,7 +217,6 @@
 along a single staircase and also of guarding staircases against
 enemies from other levels or, inversely, avoiding the staircases.
 
-
 Monsters
 --------
 
@@ -261,8 +265,11 @@
 The displayed figures are rounded, but the game internally keeps track
 of minute fractions of HP.
 
+The stress of combat drains Calm, gradually limiting the use of items and,
+if Calm reaches zero and the actor is sufficiently impressed by his foes,
+making him defect and surrender to their domination.
 Whenever the monster's or hero's hit points reach zero, the combatant dies.
-When the last hero dies, the scenario ends in defeat.
+When the last hero dies or is dominated, the scenario ends in defeat.
 
 
 On Winning and Dying
diff --git a/GameDefinition/TieKnot.hs b/GameDefinition/TieKnot.hs
--- a/GameDefinition/TieKnot.hs
+++ b/GameDefinition/TieKnot.hs
@@ -67,7 +67,7 @@
         let (r, _) = R.randomR (0, length l - 1) initialGen
         in case splitAt r l of
           (pre, i : post) -> pre ++ boostItem i : post
-          _ -> assert `failure` l
+          _ -> error $  "" `showFailure` l
       boostedItems = boostList Content.ItemKind.items
       cdefsItem =
         Content.ItemKind.cdefs
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -142,7 +142,7 @@
 	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 7 --noAnim --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 60 --dumpInitRngs --automateAll --keepAutomated --gameMode "battle survival" 2> /tmp/teletypetest.log
 
 testDefense-medium:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 9 --noAnim --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 500 --dumpInitRngs --automateAll --keepAutomated --gameMode defense 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 9 --noAnim --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 300 --dumpInitRngs --automateAll --keepAutomated --gameMode defense 2> /tmp/teletypetest.log
 
 test-short-new:
 	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 5 --savePrefix raid --dumpInitRngs --automateAll --keepAutomated --gameMode raid --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
diff --git a/test/test.hs b/test/test.hs
--- a/test/test.hs
+++ b/test/test.hs
@@ -1,3 +1,7 @@
+import Prelude ()
+
+import Game.LambdaHack.Common.Prelude
+
 import TieKnot
 
 main :: IO ()
