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.7.0.0
+version:       0.7.1.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.
@@ -72,7 +72,7 @@
                       Content.TileKind,
                       TieKnot,
                       Paths_Allure
-  build-depends:      LambdaHack >= 0.7.0.0 && < 0.7.1.0,
+  build-depends:      LambdaHack >= 0.7.1.0 && < 0.7.2.0,
                       template-haskell >= 2.6,
 
                       async      >= 2,
diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+## [v0.7.1.0, aka 'Ancient troubles'](https://github.com/AllureOfTheStars/Allure/compare/v0.7.0.0...v0.7.1.0)
+
+- add amazing cave and item (actor, blast, organ) descriptions
+- package for Windows as an installer and also as zip archives
+- fix a crash from SDL frontend under some OpenGL drivers (no thread-safety)
+- add WWW address to the Main Menu, for other sites that may run our JS blob
+
 ## [v0.7.0.0, aka 'The dice are cast'](https://github.com/AllureOfTheStars/Allure/compare/v0.6.2.0...v0.7.0.0)
 
 - decouple tile searching from tile alteration
diff --git a/CREDITS b/CREDITS
--- a/CREDITS
+++ b/CREDITS
@@ -4,6 +4,7 @@
 Andres Loeh
 Mikolaj Konarski
 Krzysztof Pławski
+@Peritract
 
 
 Fonts 16x16x.fon, 8x8x.fon and 8x8xb.fon are are taken from
diff --git a/GameDefinition/Client/UI/Content/KeyKind.hs b/GameDefinition/Client/UI/Content/KeyKind.hs
--- a/GameDefinition/Client/UI/Content/KeyKind.hs
+++ b/GameDefinition/Client/UI/Content/KeyKind.hs
@@ -1,4 +1,5 @@
--- Copyright (c) 2008--2011 Andres Loeh, 2010--2017 Mikolaj Konarski
+-- Copyright (c) 2008--2011 Andres Loeh
+-- Copyright (c) 2010--2017 Mikolaj Konarski and others (see git history)
 -- This file is a part of the computer game Allure of the Stars
 -- and is released under the terms of the GNU Affero General Public License.
 -- For license and copyright information, see the file LICENSE.
diff --git a/GameDefinition/Content/CaveKind.hs b/GameDefinition/Content/CaveKind.hs
--- a/GameDefinition/Content/CaveKind.hs
+++ b/GameDefinition/Content/CaveKind.hs
@@ -1,4 +1,5 @@
--- Copyright (c) 2008--2011 Andres Loeh, 2010--2017 Mikolaj Konarski
+-- Copyright (c) 2008--2011 Andres Loeh
+-- Copyright (c) 2010--2017 Mikolaj Konarski and others (see git history)
 -- This file is a part of the computer game Allure of the Stars
 -- and is released under the terms of the GNU Affero General Public License.
 -- For license and copyright information, see the file LICENSE.
@@ -65,7 +66,7 @@
   , clegendLitTile  = "legendLit"
   , cescapeGroup    = Nothing
   , cstairFreq      = [("staircase lift", 100)]
-  , cdesc         = ""
+  , cdesc         = "Winding tunnels stretch into the dark."
   }
 rogue2 = rogue
   { cfreq         = [("deep random", 20)]
@@ -134,7 +135,7 @@
   , cdarkCorTile  = "labTrailLit"  -- let lab smoke give off light always
   , clitCorTile   = "labTrailLit"
   , cstairFreq    = [("staircase lift", 100)]
-  , cdesc         = "An experiment (or was it manufacturing?) had gone wrong here."
+  , cdesc         = "Shattered glassware and the sharp scent of spilt chemicals show that something terrible happened here."
   }
 empty = rogue
   { csymbol       = 'E'
diff --git a/GameDefinition/Content/ItemKind.hs b/GameDefinition/Content/ItemKind.hs
--- a/GameDefinition/Content/ItemKind.hs
+++ b/GameDefinition/Content/ItemKind.hs
@@ -1,4 +1,5 @@
--- Copyright (c) 2008--2011 Andres Loeh, 2010--2017 Mikolaj Konarski
+-- Copyright (c) 2008--2011 Andres Loeh
+-- Copyright (c) 2010--2017 Mikolaj Konarski and others (see git history)
 -- This file is a part of the computer game Allure of the Stars
 -- and is released under the terms of the GNU Affero General Public License.
 -- For license and copyright information, see the file LICENSE.
@@ -480,6 +481,7 @@
   , irarity  = [(6, 9), (10, 9)]
   , ieffects = [ Unique, ELabel "of Attraction", Impress, RefillCalm (-20)
                , OnSmash (Explode "pheromone") ]
+  -- , idesc    = ""
   }
 potion3 = potion
   { ieffects = [ RefillHP 5, DropItem 1 maxBound COrgan "poisoned"
@@ -539,6 +541,7 @@
                , Impress, RefillCalm (-60)
                , OnSmash (Explode "healing mist 2")
                , OnSmash (Explode "pheromone") ]
+  -- , idesc    = ""
   }
 
 -- * Non-exploding consumables, not specifically designed for throwing
@@ -742,6 +745,7 @@
                , Recharging (RefillHP 1) ]
                ++ ieffects necklace
   , ifeature = Durable : ifeature necklace
+  -- , idesc    = ""
   }
 necklace2 = necklace
   { ifreq    = [("treasure", 100)]  -- just too nasty to call it useful
@@ -789,6 +793,7 @@
                , Recharging (RefillCalm (-1)) ]  -- fake "hears something" :)
                ++ ieffects necklace
   , ifeature = Durable : ifeature necklace
+  -- , idesc    = ""
   }
 necklace8 = necklace
   { iaspects = [Timeout $ (1 `d` 3 + 3 - 1 `dl` 3) * 5]
@@ -903,6 +908,7 @@
   , ieffects = [ Unique, ELabel "of Rush"  -- no explosion, because Durable
                , EqpSlot EqpSlotAddSpeed ]
   , ifeature = Durable : ifeature ring
+  -- , idesc    = ""
   }
 ring7 = ring
   { ifreq    = [("useful", 10), ("ring of opportunity sniper", 1) ]
@@ -1106,6 +1112,7 @@
   , idamage  = toDmg $ 8 `d` 1
   , iaspects = iaspects hammer ++ [Timeout $ (1 `d` 2 + 3 - 1 `dl` 2) * 2]
   , ieffects = ieffects hammer ++ [Unique, Recharging $ Paralyze 10]
+  -- , idesc    = ""
   }
 hammerSpark = hammer
   { iname    = "Grand Smithhammer"
@@ -1115,6 +1122,7 @@
   , iaspects = iaspects hammer
                ++ [AddShine 3, Timeout $ (1 `d` 4 + 4 - 1 `dl` 4) * 2]
   , ieffects = ieffects hammer ++ [Unique, Recharging $ Explode "spark"]
+  -- , idesc    = ""
   }
 sword = ItemKind
   { isymbol  = symbolPolearm
diff --git a/GameDefinition/Content/ItemKindActor.hs b/GameDefinition/Content/ItemKindActor.hs
--- a/GameDefinition/Content/ItemKindActor.hs
+++ b/GameDefinition/Content/ItemKindActor.hs
@@ -1,4 +1,5 @@
--- Copyright (c) 2008--2011 Andres Loeh, 2010--2017 Mikolaj Konarski
+-- Copyright (c) 2008--2011 Andres Loeh
+-- Copyright (c) 2010--2017 Mikolaj Konarski and others (see git history)
 -- This file is a part of the computer game Allure of the Stars
 -- and is released under the terms of the GNU Affero General Public License.
 -- For license and copyright information, see the file LICENSE.
@@ -46,18 +47,26 @@
                , AddAbility AbAlter 2 ]
   , ieffects = []
   , ifeature = [Durable, Identified]
-  , idesc    = ""
+  , idesc    = "A hardened veteran of combat."
   , ikit     = [ ("fist", COrgan), ("foot", COrgan), ("eye 6", COrgan)
                , ("sapient brain", COrgan) ]
   }
 warrior2 = warrior
-  { iname    = "pilot" }
+  { iname    = "pilot"
+  -- , idesc    = ""
+  }
 warrior3 = warrior
-  { iname    = "engineer" }
+  { iname    = "engineer"
+  -- , idesc    = ""
+   }
 warrior4 = warrior
-  { iname    = "doctor" }
+  { iname    = "doctor"
+  -- , idesc    = ""
+  }
 warrior5 = warrior
-  { iname    = "hacker" }
+  { iname    = "hacker"
+  -- , idesc    = ""
+  }
 
 scout = warrior
   { iname    = "scout"
@@ -66,11 +75,13 @@
                ++ [ ("add sight", CEqp)
                   , ("armor ranged", CEqp)
                   , ("add nocto 1", CInv) ]
+  -- , idesc    = ""
   }
 ranger = warrior
   { iname    = "ranger"
   , ifreq    = [("ranger hero", 100), ("mobile", 1)]
   , ikit     = ikit warrior ++ [("weak arrow", CInv), ("armor ranged", CEqp)]
+  -- , idesc    = ""
   }
 escapist = warrior
   { iname    = "escapist"
@@ -82,6 +93,7 @@
                   , ("flask", CInv)
                   , ("light source", CInv)
                   , ("blanket", CInv) ]
+  -- , idesc    = ""
   }
 ambusher = warrior
   { iname    = "ambusher"
@@ -90,25 +102,37 @@
                ++ [ ("ring of opportunity sniper", CEqp)
                   , ("light source", CEqp), ("wooden torch", CInv)
                   , ("weak arrow", CInv), ("any arrow", CSha), ("flask", CSha) ]
+  -- , idesc    = ""
   }
 soldier = warrior
   { iname    = "soldier"
   , ifreq    = [("soldier hero", 100), ("mobile", 1)]
   , ikit     = ikit warrior ++ [("starting weapon", CEqp)]
+  -- , idesc    = ""
   }
 
 civilian = warrior
   { iname    = "clerk"
   , ifreq    = [("civilian", 100), ("mobile", 1)]
-  , iflavour = zipPlain [BrBlack] }
+  , iflavour = zipPlain [BrBlack]
+  -- , idesc    = ""
+  }
 civilian2 = civilian
-  { iname    = "hairdresser" }
+  { iname    = "hairdresser"
+  -- , idesc    = ""
+  }
 civilian3 = civilian
-  { iname    = "lawyer" }
+  { iname    = "lawyer"
+  -- , idesc    = ""
+  }
 civilian4 = civilian
-  { iname    = "peddler" }
+  { iname    = "peddler"
+  -- , idesc    = ""
+  }
 civilian5 = civilian
-  { iname    = "tax collector" }
+  { iname    = "tax collector"
+  -- , idesc    = ""
+  }
 
 -- * Aliens
 
@@ -247,7 +271,7 @@
   , iaspects = [ AddMaxHP 12, AddMaxCalm 70, AddSpeed 24, AddNocto 2 ]
   , ieffects = []
   , ifeature = [Durable, Identified]
-  , idesc    = ""
+  , idesc    = "An opportunistic predator, feeding on carrion and the weak."
   , ikit     = [ ("small jaw", COrgan), ("eye 6", COrgan), ("nostril", COrgan)
                , ("animal brain", COrgan) ]
   }
@@ -270,7 +294,7 @@
       -- on either side, are just too frustrating.
   , ieffects = []
   , ifeature = [Durable, Identified]
-  , idesc    = ""
+  , idesc    = "It soars high above, searching for vulnerable prey."
   , ikit     = [ ("screeching beak", COrgan)  -- in reality it grunts and hisses
                , ("small claw", COrgan), ("eye 7", COrgan)
                , ("animal brain", COrgan) ]
@@ -289,7 +313,7 @@
                , AddAbility AbAlter (-2) ]  -- can't use stairs nor doors
   , ieffects = []
   , ifeature = [Durable, Identified]
-  , idesc    = ""
+  , idesc    = "Its only defence is the terrible stench."
   , ikit     = [ ("scent gland", COrgan)
                , ("small claw", COrgan), ("snout", COrgan)
                , ("nostril", COrgan), ("eye 3", COrgan)
@@ -309,7 +333,7 @@
                , AddAbility AbAlter (-2) ]  -- can't use stairs nor doors
   , ieffects = []
   , ifeature = [Durable, Identified]
-  , idesc    = ""
+  , idesc    = "When threatened, it rolls into a ball."
   , ikit     = [ ("hooked claw", COrgan), ("snout", COrgan)
                , ("armored skin", COrgan), ("armored skin", COrgan)
                , ("nostril", COrgan), ("eye 3", COrgan)
@@ -329,7 +353,7 @@
                , AddAbility AbAlter (-2) ]  -- can't use stairs nor doors
   , ieffects = []
   , ifeature = [Durable, Identified]
-  , idesc    = ""
+  , idesc    = "Numbing venom ensures that even the fastest prey has no escape."
   , ikit     = [ ("venom tooth", COrgan), ("small claw", COrgan)
                , ("eye 3", COrgan), ("nostril", COrgan)
                , ("animal brain", COrgan) ]
@@ -348,7 +372,7 @@
                , AddAbility AbAlter (-2) ]  -- can't use stairs nor doors
   , ieffects = []
   , ifeature = [Durable, Identified]
-  , idesc    = ""
+  , idesc    = "Beware its rattle - it serves as a warning of an agonising death."
   , ikit     = [ ("venom fang", COrgan)
                , ("eye 4", COrgan), ("nostril", COrgan)
                , ("animal brain", COrgan) ]
@@ -366,7 +390,7 @@
   , iaspects = [ AddMaxHP 41, AddMaxCalm 60, AddSpeed 18, AddNocto 2 ]
   , ieffects = []
   , ifeature = [Durable, Identified]
-  , idesc    = ""
+  , idesc    = "Larger and more aggressive than any other lizard."
   , ikit     = [ ("large tail", COrgan), ("jaw", COrgan)
                , ("hooked claw", COrgan), ("speed gland 4", COrgan)
                , ("armored skin", COrgan), ("eye 3", COrgan)
@@ -386,7 +410,7 @@
   , iaspects = [ AddMaxHP 20, AddMaxCalm 70, AddSpeed 32, AddNocto 2 ]
   , ieffects = []
   , ifeature = [Durable, Identified]
-  , idesc    = ""
+  , idesc    = "Skulking in the shadows, waiting for easy prey."
   , ikit     = [ ("jaw", COrgan), ("eye 6", COrgan), ("nostril", COrgan)
                , ("animal brain", COrgan) ]
   }
@@ -403,7 +427,7 @@
   , iaspects = [ AddMaxHP 41, AddMaxCalm 70, AddSpeed 18, AddNocto 2 ]
   , ieffects = []
   , ifeature = [Durable, Identified]
-  , idesc    = ""
+  , idesc    = "An armored predator from the dawn of time."
   , ikit     = [ ("large jaw", COrgan), ("large tail", COrgan)
                , ("small claw", COrgan)
                , ("armored skin", COrgan), ("eye 6", COrgan)
@@ -447,7 +471,7 @@
                , AddAbility AbAlter (-2) ]  -- can't use stairs nor doors
   , ieffects = []
   , ifeature = [Durable, Identified]
-  , idesc    = ""
+  , idesc    = "Every bee would die for the queen."
   , ikit     = [ ("bee sting", COrgan), ("vision 6", COrgan)
                , ("insect mortality", COrgan), ("animal brain", COrgan) ]
   }
@@ -466,7 +490,7 @@
                , AddArmorMelee 80, AddArmorRanged 40 ]
   , ieffects = []
   , ifeature = [Durable, Identified]
-  , idesc    = ""
+  , idesc    = "A vicious cloud of stings and hate."
   , ikit     = [ ("sting", COrgan), ("vision 8", COrgan)
                , ("insect mortality", COrgan), ("animal brain", COrgan) ]
   }
@@ -484,7 +508,7 @@
                , AddAbility AbWait 1, AddAbility AbMelee 1 ]
   , ieffects = []
   , ifeature = [Durable, Identified]
-  , idesc    = ""
+  , idesc    = "Each branch bears long, curved thorns."
   , ikit     = [("thorn", COrgan), ("armored skin", COrgan)]
   }
 
diff --git a/GameDefinition/Content/ItemKindBlast.hs b/GameDefinition/Content/ItemKindBlast.hs
--- a/GameDefinition/Content/ItemKindBlast.hs
+++ b/GameDefinition/Content/ItemKindBlast.hs
@@ -1,4 +1,5 @@
--- Copyright (c) 2008--2011 Andres Loeh, 2010--2017 Mikolaj Konarski
+-- Copyright (c) 2008--2011 Andres Loeh
+-- Copyright (c) 2010--2017 Mikolaj Konarski and others (see git history)
 -- This file is a part of the computer game Allure of the Stars
 -- and is released under the terms of the GNU Affero General Public License.
 -- For license and copyright information, see the file LICENSE.
@@ -92,7 +93,7 @@
                     $ toGroupName $ "firecracker" <+> tshow (n - 1)
                   | n > 2 ]
   , ifeature = [toVelocity 5, Fragile, Identified]
-  , idesc    = ""
+  , idesc    = "Scraps of burnt paper, covering little pockets of black powder, buffeted by colorful explosions."
   , ikit     = []
   }
 firecracker7 = firecracker 7
@@ -119,7 +120,7 @@
   -- Linger 10, because sometimes it takes 2 turns due to starting just
   -- before actor turn's end (e.g., via a necklace).
   , ifeature = [toLinger 10, Fragile, Identified]  -- 2 steps, 1 turn
-  , idesc    = ""
+  , idesc    = "A pleasant scent."
   , ikit     = []
   }
 pheromone = ItemKind
@@ -135,7 +136,7 @@
   , iaspects = []
   , ieffects = [Impress, RefillCalm (-10)]
   , ifeature = [toVelocity 10, Fragile, Identified]  -- 2 steps, 2 turns
-  , idesc    = ""
+  , idesc    = "A sharp, strong scent."
   , ikit     = []
   }
 mistCalming = ItemKind  -- unused
@@ -151,7 +152,7 @@
   , iaspects = []
   , ieffects = [RefillCalm 2]
   , ifeature = [toVelocity 5, Fragile, Identified]  -- 1 step, 1 turn
-  , idesc    = ""
+  , idesc    = "A soothing, gentle cloud."
   , ikit     = []
   }
 odorDistressing = ItemKind
@@ -167,7 +168,7 @@
   , iaspects = []
   , ieffects = [RefillCalm (-20)]
   , ifeature = [toLinger 10, Fragile, Identified]  -- 2 steps, 1 turn
-  , idesc    = ""
+  , idesc    = "It turns the stomach."
   , ikit     = []
   }
 mistHealing = ItemKind
@@ -183,7 +184,7 @@
   , iaspects = [AddShine 1]
   , ieffects = [RefillHP 2]
   , ifeature = [toVelocity 5, Fragile, Identified]  -- 1 step, 1 turn
-  , idesc    = ""
+  , idesc    = "It fills the air with light and life."
   , ikit     = []
   }
 mistHealing2 = ItemKind
@@ -199,7 +200,7 @@
   , iaspects = [AddShine 2]
   , ieffects = [RefillHP 4]
   , ifeature = [toVelocity 5, Fragile, Identified]  -- 1 step, 1 turn
-  , idesc    = ""
+  , idesc    = "At its touch, wounds close and bruises fade."
   , ikit     = []
   }
 mistWounding = ItemKind
@@ -215,7 +216,7 @@
   , iaspects = []
   , ieffects = [RefillHP (-2)]
   , ifeature = [toVelocity 5, Fragile, Identified]  -- 1 step, 1 turn
-  , idesc    = ""
+  , idesc    = "The air itself stings and itches."
   , ikit     = []
   }
 distortion = ItemKind
@@ -231,7 +232,7 @@
   , iaspects = []
   , ieffects = [Teleport $ 15 + 1 `d` 10]
   , ifeature = [toLinger 10, Fragile, Identified]  -- 2 steps, 1 turn
-  , idesc    = ""
+  , idesc    = "The air shifts oddly, as though light is being warped."
   , ikit     = []
   }
 glassPiece = ItemKind  -- when blowing up windows
@@ -247,7 +248,7 @@
   , iaspects = []
   , ieffects = [RefillHP (-1)]  -- high velocity, so can't do idamage
   , ifeature = [toLinger 20, Fragile, Identified]  -- 4 steps, 1 turn
-  , idesc    = ""
+  , idesc    = "Swift, sharp edges."
   , ikit     = []
   }
 smoke = ItemKind  -- when stuff burns out  -- unused
@@ -263,7 +264,7 @@
   , iaspects = []
   , ieffects = []
   , ifeature = [toVelocity 20, Fragile, Identified]  -- 4 steps, 2 turns
-  , idesc    = ""
+  , idesc    = "Twirling clouds of grey smoke."
   , ikit     = []
   }
 boilingWater = ItemKind
@@ -279,7 +280,7 @@
   , iaspects = []
   , ieffects = [Burn 1]
   , ifeature = [toVelocity 30, Fragile, Identified]  -- 6 steps, 2 turns
-  , idesc    = ""
+  , idesc    = "It bubbles and hisses."
   , ikit     = []
   }
 glue = ItemKind
@@ -295,7 +296,7 @@
   , iaspects = []
   , ieffects = [Paralyze 10]
   , ifeature = [toVelocity 20, Fragile, Identified]  -- 4 steps, 2 turns
-  , idesc    = ""
+  , idesc    = "Thick and clinging."
   , ikit     = []
   }
 singleSpark = ItemKind
@@ -311,7 +312,7 @@
   , iaspects = [AddShine 4]
   , ieffects = []
   , ifeature = [toLinger 5, Fragile, Identified]  -- 1 step, 1 turn
-  , idesc    = ""
+  , idesc    = "A glowing ember."
   , ikit     = []
   }
 spark = ItemKind
@@ -327,7 +328,7 @@
   , iaspects = [AddShine 4]
   , ieffects = [Burn 1]
   , ifeature = [toLinger 10, Fragile, Identified]  -- 2 steps, 1 turn
-  , idesc    = ""
+  , idesc    = "A flash of fire."
   , ikit     = []
   }
 
@@ -350,7 +351,7 @@
   , iaspects = []
   , ieffects = [toOrganActorTurn "strengthened" (3 + 1 `d` 3)]
   , ifeature = [toLinger 10, Fragile, Identified]
-  , idesc    = ""
+  , idesc    = "A thick rain of droplets."
   , ikit     = []
   }
 sparseShower = ItemKind
@@ -366,7 +367,7 @@
   , iaspects = []
   , ieffects = [toOrganGameTurn "weakened" (3 + 1 `d` 3)]
   , ifeature = [toLinger 10, Fragile, Identified]
-  , idesc    = ""
+  , idesc    = "Light droplets that cling to clothing."
   , ikit     = []
   }
 protectingBalmMelee = ItemKind
@@ -382,7 +383,7 @@
   , iaspects = []
   , ieffects = [toOrganActorTurn "protected from melee" (3 + 1 `d` 3)]
   , ifeature = [toLinger 10, Fragile, Identified]
-  , idesc    = ""
+  , idesc    = "A thick ointment that hardens the skin."
   , ikit     = []
   }
 protectingBalmRanged = ItemKind
@@ -398,7 +399,7 @@
   , iaspects = []
   , ieffects = [toOrganActorTurn "protected from ranged" (3 + 1 `d` 3)]
   , ifeature = [toLinger 10, Fragile, Identified]
-  , idesc    = ""
+  , idesc    = "Grease that protects from flying death."
   , ikit     = []
   }
 vulnerabilityBalm = ItemKind
@@ -431,7 +432,7 @@
   , ieffects = [toOrganActorTurn "resolute" (3 + 1 `d` 3)]
                  -- short enough duration that @calmEnough@ not a big problem
   , ifeature = [toLinger 10, Fragile, Identified]
-  , idesc    = ""
+  , idesc    = "A handful of honest earth, to strengthen the soul."
   , ikit     = []
   }
 hasteSpray = ItemKind
@@ -447,7 +448,7 @@
   , iaspects = []
   , ieffects = [toOrganActorTurn "hasted" (3 + 1 `d` 3)]
   , ifeature = [toLinger 10, Fragile, Identified]
-  , idesc    = ""
+  , idesc    = "A quick spurt."
   , ikit     = []
   }
 slownessMist = ItemKind
@@ -463,7 +464,7 @@
   , iaspects = []
   , ieffects = [toOrganGameTurn "slowed" (3 + 1 `d` 3)]
   , ifeature = [toVelocity 5, Fragile, Identified]  -- 1 step, 1 turn, mist
-  , idesc    = ""
+  , idesc    = "Clammy fog, making each movement an effort."
   , ikit     = []
   }
 eyeDrop = ItemKind
@@ -479,7 +480,7 @@
   , iaspects = []
   , ieffects = [toOrganActorTurn "far-sighted" (3 + 1 `d` 3)]
   , ifeature = [toLinger 10, Fragile, Identified]
-  , idesc    = ""
+  , idesc    = "Not to be taken orally."
   , ikit     = []
   }
 ironFiling = ItemKind
@@ -495,7 +496,7 @@
   , iaspects = []
   , ieffects = [toOrganActorTurn "blind" (10 + 1 `d` 10)]
   , ifeature = [toLinger 10, Fragile, Identified]
-  , idesc    = ""
+  , idesc    = "A shaving of bright metal."
   , ikit     = []
   }
 smellyDroplet = ItemKind
@@ -511,7 +512,7 @@
   , iaspects = []
   , ieffects = [toOrganActorTurn "keen-smelling" (3 + 1 `d` 3)]
   , ifeature = [toLinger 10, Fragile, Identified]
-  , idesc    = ""
+  , idesc    = "A viscous lump that stains the skin."
   , ikit     = []
   }
 eyeShine = ItemKind
@@ -527,7 +528,7 @@
   , iaspects = []
   , ieffects = [toOrganActorTurn "shiny-eyed" (3 + 1 `d` 3)]
   , ifeature = [toLinger 10, Fragile, Identified]
-  , idesc    = ""
+  , idesc    = "They almost glow in the dark."
   , ikit     = []
   }
 
@@ -546,7 +547,7 @@
   , iaspects = []
   , ieffects = [toOrganActorTurn "drunk" (3 + 1 `d` 3)]
   , ifeature = [toLinger 10, Fragile, Identified]
-  , idesc    = ""
+  , idesc    = "It burns in the best way."
   , ikit     = []
   }
 waste = ItemKind
@@ -562,7 +563,7 @@
   , iaspects = []
   , ieffects = [Burn 1]
   , ifeature = [toLinger 10, Fragile, Identified]
-  , idesc    = ""
+  , idesc    = "Sodden and foul-smelling."
   , ikit     = []
   }
 youthSprinkle = ItemKind
@@ -578,7 +579,7 @@
   , iaspects = []
   , ieffects = [toOrganNone "regenerating"]
   , ifeature = [toLinger 10, Fragile, Identified]
-  , idesc    = ""
+  , idesc    = "Bright and smelling of the Spring."
   , ikit     = []
   }
 poisonCloud = ItemKind
@@ -594,7 +595,7 @@
   , iaspects = []
   , ieffects = [toOrganNone "poisoned"]
   , ifeature = [toVelocity 10, Fragile, Identified]  -- 2 steps, 2 turns
-  , idesc    = ""
+  , idesc    = "Choking gas that stings the eyes."
   , ikit     = []
   }
 mistAntiSlow = ItemKind
@@ -610,7 +611,7 @@
   , iaspects = []
   , ieffects = [DropItem 1 1 COrgan "slowed"]
   , ifeature = [toVelocity 5, Fragile, Identified]  -- 1 step, 1 turn
-  , idesc    = ""
+  , idesc    = "A cleansing rain."
   , ikit     = []
   }
 mistAntidote = ItemKind
@@ -626,6 +627,6 @@
   , iaspects = []
   , ieffects = [DropItem 1 maxBound COrgan "poisoned"]
   , ifeature = [toVelocity 5, Fragile, Identified]  -- 1 step, 1 turn
-  , idesc    = ""
+  , idesc    = "Washes away death's dew."
   , ikit     = []
   }
diff --git a/GameDefinition/Content/ItemKindEmbed.hs b/GameDefinition/Content/ItemKindEmbed.hs
--- a/GameDefinition/Content/ItemKindEmbed.hs
+++ b/GameDefinition/Content/ItemKindEmbed.hs
@@ -1,4 +1,5 @@
--- Copyright (c) 2008--2011 Andres Loeh, 2010--2017 Mikolaj Konarski
+-- Copyright (c) 2008--2011 Andres Loeh
+-- Copyright (c) 2010--2017 Mikolaj Konarski and others (see git history)
 -- This file is a part of the computer game Allure of the Stars
 -- and is released under the terms of the GNU Affero General Public License.
 -- For license and copyright information, see the file LICENSE.
@@ -37,7 +38,7 @@
   , iaspects = []
   , ieffects = [Ascend True]
   , ifeature = [Identified, Durable]
-  , idesc    = ""
+  , idesc    = "Stairs that rise towards escape."
   , ikit     = []
   }
 stairsDown = stairsUp
@@ -45,12 +46,14 @@
   , iname    = "staircase down"
   , ifreq    = [("staircase down", 1)]
   , ieffects = [Ascend False]
+  , idesc    = ""
   }
 escape = stairsUp
   { iname    = "escape"
   , ifreq    = [("escape", 1)]
   , iflavour = zipPlain [BrYellow]
   , ieffects = [Escape]
+  , idesc    = ""
   }
 terrainCache = stairsUp
   { isymbol  = 'O'
@@ -58,6 +61,7 @@
   , ifreq    = [("terrain cache", 1)]
   , iflavour = zipPlain [BrYellow]
   , ieffects = [CreateItem CGround "useful" TimerNone]
+  , idesc    = "Glittering gold, just waiting to be taken."
   }
 terrainCacheTrap = ItemKind
   { isymbol  = '^'
@@ -75,7 +79,7 @@
                       , ELabel "", ELabel "", ELabel ""
                       , ELabel "", ELabel "" ]]
   , ifeature = [Identified]  -- not Durable, springs at most once
-  , idesc    = ""
+  , idesc    = "It's a trap!"
   , ikit     = []
   }
 signboardExit = ItemKind
@@ -91,7 +95,7 @@
   , iaspects = []
   , ieffects = [DetectExit 100]
   , ifeature = [Identified, Durable]
-  , idesc    = ""
+  , idesc    = "A battered sign, carved by unknown hands."
   , ikit     = []
   }
 signboardMap = signboardExit
@@ -112,7 +116,7 @@
   , iaspects = []
   , ieffects = [Burn 1, Explode "single spark"]
   , ifeature = [Identified, Durable]
-  , idesc    = ""
+  , idesc    = "A few small logs, burning brightly."
   , ikit     = []
   }
 fireBig = fireSmall
@@ -122,7 +126,7 @@
   , ieffects = [ Burn 2, Explode "spark"
                , CreateItem CInv "wooden torch" TimerNone ]
   , ifeature = [Identified, Durable]
-  , idesc    = ""
+  , idesc    = "Glowing with light and warmth."
   , ikit     = []
   }
 frost = ItemKind
@@ -140,7 +144,7 @@
                , RefillCalm 20  -- cold reason
                , PushActor (ThrowMod 200 50) ]  -- slippery ice
   , ifeature = [Identified, Durable]
-  , idesc    = ""
+  , idesc    = "Intricate patterns of shining ice."
   , ikit     = []
   }
 rubble = ItemKind
@@ -160,7 +164,7 @@
                       , ELabel "", ELabel "", ELabel ""
                       , ELabel "", ELabel "", ELabel "" ]]
   , ifeature = [Identified, Durable]
-  , idesc    = ""
+  , idesc    = "Broken chunks of rock and glass."
   , ikit     = []
   }
 staircaseTrapUp = ItemKind
@@ -176,7 +180,7 @@
   , iaspects = []
   , ieffects = [Temporary "be caught in an updraft", Teleport 5]
   , ifeature = [Identified]  -- not Durable, springs at most once
-  , idesc    = ""
+  , idesc    = "A hidden spring, to help the unwary soar."
   , ikit     = []
   }
 -- Needs to be separate from staircaseTrapUp, to make sure the item is
@@ -186,6 +190,7 @@
   { ifreq    = [("staircase trap down", 1)]
   , ieffects = [ Temporary "tumble down the stairwell"
                , toOrganActorTurn "drunk" (20 + 1 `d` 5) ]
+  , idesc    = "A treacherous slab, to teach those who are too proud."
   }
 doorwayTrap = ItemKind
   { isymbol  = '^'
@@ -202,7 +207,7 @@
                       , toOrganActorTurn "slowed" (20 + 1 `d` 5)
                       , toOrganActorTurn "weakened" (20 + 1 `d` 5) ]]
   , ifeature = [Identified]  -- not Durable, springs at most once
-  , idesc    = ""
+  , idesc    = "Just turn the handle..."
   , ikit     = []
   }
 obscenePictograms = ItemKind
@@ -241,7 +246,7 @@
                , Recharging $ toOrganActorTurn "far-sighted" (3 + 1 `d` 3)
                , Recharging $ toOrganActorTurn "keen-smelling" (3 + 1 `d` 3) ]
   , ifeature = [Identified, Durable]
-  , idesc    = ""
+  , idesc    = "Expensive yet tasteful."
   , ikit     = []
   }
 scratchOnWall = ItemKind
@@ -257,7 +262,7 @@
   , iaspects = []
   , ieffects = [Temporary "start making sense of the scratches", DetectHidden 3]
   , ifeature = [Identified, Durable]
-  , idesc    = ""
+  , idesc    = "A seemingly random series of scratches, carved deep into the wall."
   , ikit     = []
   }
 pulpit = ItemKind
diff --git a/GameDefinition/Content/ItemKindOrgan.hs b/GameDefinition/Content/ItemKindOrgan.hs
--- a/GameDefinition/Content/ItemKindOrgan.hs
+++ b/GameDefinition/Content/ItemKindOrgan.hs
@@ -1,4 +1,5 @@
--- Copyright (c) 2008--2011 Andres Loeh, 2010--2017 Mikolaj Konarski
+-- Copyright (c) 2008--2011 Andres Loeh
+-- Copyright (c) 2010--2017 Mikolaj Konarski and others (see git history)
 -- This file is a part of the computer game Allure of the Stars
 -- and is released under the terms of the GNU Affero General Public License.
 -- For license and copyright information, see the file LICENSE.
@@ -46,7 +47,7 @@
   , iaspects = []
   , ieffects = []
   , ifeature = [Durable, Identified, Meleeable]
-  , idesc    = ""
+  , idesc    = "Simple but effective."
   , ikit     = []
   }
 foot = fist
@@ -54,7 +55,7 @@
   , ifreq    = [("foot", 50)]
   , iverbHit = "kick"
   , idamage  = toDmg $ 4 `d` 1
-  , idesc    = ""
+  , idesc    = "A weapon you can still use if disarmed."
   }
 
 -- * Universal weapon organs
@@ -67,14 +68,14 @@
   , idamage  = toDmg $ 2 `d` 1
   , iaspects = [Timeout $ 4 + 1 `d` 4]
   , ieffects = [Recharging (toOrganGameTurn "slowed" 2)]
-  , idesc    = ""
+  , idesc    = "A curved talon."
   }
 smallClaw = fist
   { iname    = "small claw"
   , ifreq    = [("small claw", 50)]
   , iverbHit = "slash"
   , idamage  = toDmg $ 2 `d` 1
-  , idesc    = ""
+  , idesc    = "A pearly spike."
   }
 snout = fist
   { iname    = "snout"
@@ -82,7 +83,7 @@
   , icount   = 1
   , iverbHit = "bite"
   , idamage  = toDmg $ 2 `d` 1
-  , idesc    = ""
+  , idesc    = "Sensitive and wide-nostrilled."
   }
 smallJaw = fist
   { iname    = "small jaw"
@@ -90,7 +91,7 @@
   , icount   = 1
   , iverbHit = "rip"
   , idamage  = toDmg $ 3 `d` 1
-  , idesc    = ""
+  , idesc    = "Filled with small, even teeth."
   }
 jaw = fist
   { iname    = "jaw"
@@ -98,7 +99,7 @@
   , icount   = 1
   , iverbHit = "rip"
   , idamage  = toDmg $ 5 `d` 1
-  , idesc    = ""
+  , idesc    = "Delivers a powerful bite."
   }
 largeJaw = fist
   { iname    = "large jaw"
@@ -106,7 +107,7 @@
   , icount   = 1
   , iverbHit = "crush"
   , idamage  = toDmg $ 10 `d` 1
-  , idesc    = ""
+  , idesc    = "Enough to swallow anything in a single gulp."
   }
 horn = fist
   { iname    = "horn"
@@ -115,7 +116,7 @@
   , iverbHit = "impale"
   , idamage  = toDmg $ 6 `d` 1
   , iaspects = [AddHurtMelee 20]
-  , idesc    = ""
+  , idesc    = "Sharp and solid, for defence or attack."
   }
 
 -- * Special weapon organs
@@ -126,7 +127,7 @@
   , icount   = 4
   , iverbHit = "slap"
   , idamage  = toDmg $ 4 `d` 1
-  , idesc    = ""
+  , idesc    = "Damp and dextrous."
   }
 thorn = fist
   { iname    = "thorn"
@@ -135,7 +136,7 @@
   , iverbHit = "impale"
   , idamage  = toDmg $ 1 `d` 3
   , ifeature = [Identified, Meleeable]  -- not Durable
-  , idesc    = ""
+  , idesc    = "Sharp yet brittle."
   }
 boilingFissure = fist
   { iname    = "fissure"
@@ -154,6 +155,7 @@
   , icount   = 3 + 1 `d` 3
   , idamage  = toDmg $ 2 `d` 1
   , ieffects = [toOrganGameTurn "weakened" (2 + 1 `d` 2)]
+  , idesc    = ""
   }
 sulfurFissure = boilingFissure
   { iname    = "fissure"
@@ -161,6 +163,7 @@
   , icount   = 2 + 1 `d` 2
   , idamage  = toDmg 0
   , ieffects = [RefillHP 5]
+  , idesc    = ""
   }
 beeSting = fist
   { iname    = "bee sting"
@@ -191,7 +194,7 @@
   , idamage  = toDmg $ 2 `d` 1
   , iaspects = [Timeout $ 5 + 1 `d` 3]
   , ieffects = [Recharging (toOrganGameTurn "slowed" (3 + 1 `d` 3))]
-  , idesc    = ""
+  , idesc    = "A chilling numbness spreads from its bite."
   }
 venomFang = fist
   { iname    = "venom fang"
@@ -201,7 +204,7 @@
   , idamage  = toDmg $ 2 `d` 1
   , iaspects = [Timeout $ 7 + 1 `d` 5]
   , ieffects = [Recharging (toOrganNone "poisoned")]
-  , idesc    = ""
+  , idesc    = "Dripping with deadly venom."
   }
 screechingBeak = fist
   { iname    = "screeching beak"
@@ -211,7 +214,7 @@
   , idamage  = toDmg $ 2 `d` 1
   , iaspects = [Timeout $ 5 + 1 `d` 5]
   , ieffects = [Recharging $ Summon "scavenger" $ 1 + 1 `dl` 2]
-  , idesc    = ""
+  , idesc    = "Both a weapon and a beacon, calling more scavengers to the meal."
   }
 largeTail = fist
   { iname    = "large tail"
@@ -221,7 +224,7 @@
   , idamage  = toDmg $ 6 `d` 1
   , iaspects = [Timeout $ 1 + 1 `d` 3, AddHurtMelee 20]
   , ieffects = [Recharging (PushActor (ThrowMod 400 25))]
-  , idesc    = ""
+  , idesc    = "Slow but heavy."
   }
 
 -- Non-weapons
@@ -241,7 +244,7 @@
   , iaspects = [AddArmorMelee 30, AddArmorRanged 15]
   , ieffects = []
   , ifeature = [Durable, Identified]
-  , idesc    = ""
+  , idesc    = "Homemade armour is just as good."
   , ikit     = []
   }
 
@@ -254,7 +257,7 @@
   , icount   = 2
   , iverbHit = "glare at"
   , iaspects = [AddSight (intToDice n)]
-  , idesc    = ""
+  , idesc    = "A piercing stare."
   }
 eye2 = eye 2
 eye3 = eye 3
diff --git a/GameDefinition/Content/ItemKindTemporary.hs b/GameDefinition/Content/ItemKindTemporary.hs
--- a/GameDefinition/Content/ItemKindTemporary.hs
+++ b/GameDefinition/Content/ItemKindTemporary.hs
@@ -1,4 +1,5 @@
--- Copyright (c) 2008--2011 Andres Loeh, 2010--2017 Mikolaj Konarski
+-- Copyright (c) 2008--2011 Andres Loeh
+-- Copyright (c) 2010--2017 Mikolaj Konarski and others (see git history)
 -- This file is a part of the computer game Allure of the Stars
 -- and is released under the terms of the GNU Affero General Public License.
 -- For license and copyright information, see the file LICENSE.
@@ -47,7 +48,7 @@
                , Recharging $ tmpNoLonger name
                , OnSmash $ tmpNoLonger name ]
   , ifeature = [Identified, Fragile, Durable]  -- hack: destroy on drop
-  , idesc    = ""
+  , idesc    = ""  -- no description needed; stats are enough
   , ikit     = []
   }
 
diff --git a/GameDefinition/Content/ModeKind.hs b/GameDefinition/Content/ModeKind.hs
--- a/GameDefinition/Content/ModeKind.hs
+++ b/GameDefinition/Content/ModeKind.hs
@@ -1,4 +1,5 @@
--- Copyright (c) 2008--2011 Andres Loeh, 2010--2017 Mikolaj Konarski
+-- Copyright (c) 2008--2011 Andres Loeh
+-- Copyright (c) 2010--2017 Mikolaj Konarski and others (see git history)
 -- This file is a part of the computer game Allure of the Stars
 -- and is released under the terms of the GNU Affero General Public License.
 -- For license and copyright information, see the file LICENSE.
diff --git a/GameDefinition/Content/ModeKindPlayer.hs b/GameDefinition/Content/ModeKindPlayer.hs
--- a/GameDefinition/Content/ModeKindPlayer.hs
+++ b/GameDefinition/Content/ModeKindPlayer.hs
@@ -1,4 +1,5 @@
--- Copyright (c) 2008--2011 Andres Loeh, 2010--2017 Mikolaj Konarski
+-- Copyright (c) 2008--2011 Andres Loeh
+-- Copyright (c) 2010--2017 Mikolaj Konarski and others (see git history)
 -- This file is a part of the computer game Allure of the Stars
 -- and is released under the terms of the GNU Affero General Public License.
 -- For license and copyright information, see the file LICENSE.
diff --git a/GameDefinition/Content/PlaceKind.hs b/GameDefinition/Content/PlaceKind.hs
--- a/GameDefinition/Content/PlaceKind.hs
+++ b/GameDefinition/Content/PlaceKind.hs
@@ -1,4 +1,5 @@
--- Copyright (c) 2008--2011 Andres Loeh, 2010--2017 Mikolaj Konarski
+-- Copyright (c) 2008--2011 Andres Loeh
+-- Copyright (c) 2010--2017 Mikolaj Konarski and others (see git history)
 -- This file is a part of the computer game Allure of the Stars
 -- and is released under the terms of the GNU Affero General Public License.
 -- For license and copyright information, see the file LICENSE.
diff --git a/GameDefinition/Content/RuleKind.hs b/GameDefinition/Content/RuleKind.hs
--- a/GameDefinition/Content/RuleKind.hs
+++ b/GameDefinition/Content/RuleKind.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE TemplateHaskell #-}
--- Copyright (c) 2008--2011 Andres Loeh, 2010--2017 Mikolaj Konarski
+-- Copyright (c) 2008--2011 Andres Loeh
+-- Copyright (c) 2010--2017 Mikolaj Konarski and others (see git history)
 -- This file is a part of the computer game Allure of the Stars
 -- and is released under the terms of the GNU Affero General Public License.
 -- For license and copyright information, see the file LICENSE.
diff --git a/GameDefinition/Content/TileKind.hs b/GameDefinition/Content/TileKind.hs
--- a/GameDefinition/Content/TileKind.hs
+++ b/GameDefinition/Content/TileKind.hs
@@ -1,4 +1,5 @@
--- Copyright (c) 2008--2011 Andres Loeh, 2010--2017 Mikolaj Konarski
+-- Copyright (c) 2008--2011 Andres Loeh
+-- Copyright (c) 2010--2017 Mikolaj Konarski and others (see git history)
 -- This file is a part of the computer game Allure of the Stars
 -- and is released under the terms of the GNU Affero General Public License.
 -- For license and copyright information, see the file LICENSE.
diff --git a/GameDefinition/Main.hs b/GameDefinition/Main.hs
--- a/GameDefinition/Main.hs
+++ b/GameDefinition/Main.hs
@@ -1,4 +1,5 @@
--- Copyright (c) 2008--2011 Andres Loeh, 2010--2017 Mikolaj Konarski
+-- Copyright (c) 2008--2011 Andres Loeh
+-- Copyright (c) 2010--2017 Mikolaj Konarski and others (see git history)
 -- This file is a part of the computer game Allure of the Stars
 -- and is released under the terms of the GNU Affero General Public License.
 -- For license and copyright information, see the file LICENSE.
@@ -18,8 +19,11 @@
 import qualified GHC.IO.Handle as GHC.IO.Handle
 import qualified Options.Applicative as OA
 import           System.Exit
+import           System.FilePath
 import qualified System.IO as SIO
 
+import Game.LambdaHack.Common.File (tryCreateDir)
+import Game.LambdaHack.Common.Misc
 import Game.LambdaHack.Server (serverOptionsPI)
 import TieKnot
 
@@ -30,8 +34,10 @@
   -- For the case when the game is started not on a console.
   isTerminal <- SIO.hIsTerminalDevice SIO.stdout
   unless isTerminal $ do
-    fstdout <- SIO.openFile "stdout.txt" SIO.WriteMode
-    fstderr <- SIO.openFile "stderr.txt" SIO.WriteMode
+    dataDir <- appDataDir
+    tryCreateDir dataDir
+    fstdout <- SIO.openFile (dataDir </> "stdout.txt") SIO.WriteMode
+    fstderr <- SIO.openFile (dataDir </> "stderr.txt") SIO.WriteMode
     GHC.IO.Handle.hDuplicateTo fstdout SIO.stdout
     GHC.IO.Handle.hDuplicateTo fstderr SIO.stderr
   serverOptions <- OA.execParser serverOptionsPI
diff --git a/GameDefinition/MainMenu.ascii b/GameDefinition/MainMenu.ascii
--- a/GameDefinition/MainMenu.ascii
+++ b/GameDefinition/MainMenu.ascii
@@ -3,7 +3,7 @@
 .tti;, GDKLt,        . . .    . .   ,itLDEGLLGED.           :.fi.;ttjjfffLEWW#DL
 .tti;::GELti    Allure of the Stars  .KtGDEDLfGEDt        ...j;:;ttjjffLD#WWW#Kf
 .tti;.jGDt                  .  .  ..   ,LDEDLfGEDt      ...t.:itjjfffL WWWWW#K;
-jtti,iLDLt                            .  ;jDEEGLGEDt      ,t :itjjffLG  WKWWWWE
+jtti,iLDLt    <allureofthestars.com>  .  ;jDEEGLGEDt      ,t :itjjffLG  WKWWWWE
 jtii: GEf;                                ,iGDEDGGEDt.   tt :itjjffLG  GWEWWWKE
 jtii: GGj;   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{.fGDEDGLDDt  tt :itjfffLG   KKKWWWEL
 jtti. GDj,   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{  DLDEDGLDD.tj :itjjffLD   LWDKWWWD
diff --git a/GameDefinition/TieKnot.hs b/GameDefinition/TieKnot.hs
--- a/GameDefinition/TieKnot.hs
+++ b/GameDefinition/TieKnot.hs
@@ -1,4 +1,5 @@
--- Copyright (c) 2008--2011 Andres Loeh, 2010--2017 Mikolaj Konarski
+-- Copyright (c) 2008--2011 Andres Loeh
+-- Copyright (c) 2010--2017 Mikolaj Konarski and others (see git history)
 -- This file is a part of the computer game Allure of the Stars
 -- and is released under the terms of the GNU Affero General Public License.
 -- For license and copyright information, see the file LICENSE.
diff --git a/GameDefinition/config.ui.default b/GameDefinition/config.ui.default
--- a/GameDefinition/config.ui.default
+++ b/GameDefinition/config.ui.default
@@ -1,4 +1,5 @@
-; Copyright (c) 2008--2011 Andres Loeh, 2010--2017 Mikolaj Konarski
+; Copyright (c) 2008--2011 Andres Loeh
+; Copyright (c) 2010--2017 Mikolaj Konarski and others (see git history)
 ; This file is a part of the computer game Allure of the Stars
 ; and is released under the terms of the GNU Affero General Public License.
 ; For license and copyright information, see the file LICENSE.
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -1,11 +1,12 @@
-# Copyright (c) 2008--2011 Andres Loeh, 2010--2017 Mikolaj Konarski
+# Copyright (c) 2008--2011 Andres Loeh
+# Copyright (c) 2010--2017 Mikolaj Konarski and others (see git history)
 # This file is a part of the computer game Allure of the Stars
 # and is released under the terms of the GNU Affero General Public License.
 # For license and copyright information, see the file LICENSE.
 #
 
 play:
-	dist/build/Allure/Allure --dbgMsgSer --dumpInitRngs
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --dumpInitRngs
 
 configure-debug:
 	cabal configure --enable-profiling --profiling-detail=all-functions -fwith_expensive_assertions --disable-optimization
@@ -23,83 +24,81 @@
 	ccjs dist/build/Allure/Allure.jsexe/all.js --compilation_level=ADVANCED_OPTIMIZATIONS --isolation_mode=IIFE --assume_function_wrapper --jscomp_off="*" --externs=node > ../allureofthestars.github.io/play/allure.all.js
 
 frontendRaid:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix test --newGame 5 --dumpInitRngs --automateAll --gameMode raid
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix test --newGame 5 --dumpInitRngs --automateAll --gameMode raid
 
 frontendBrawl:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix test --newGame 5 --dumpInitRngs --automateAll --gameMode brawl
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix test --newGame 5 --dumpInitRngs --automateAll --gameMode brawl
 
 frontendShootout:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix test --newGame 5 --dumpInitRngs --automateAll --gameMode shootout
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix test --newGame 5 --dumpInitRngs --automateAll --gameMode shootout
 
 frontendEscape:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix test --newGame 3 --dumpInitRngs --automateAll --gameMode escape
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix test --newGame 3 --dumpInitRngs --automateAll --gameMode escape
 
 frontendZoo:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix test --newGame 2 --dumpInitRngs --automateAll --gameMode zoo
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix test --newGame 2 --dumpInitRngs --automateAll --gameMode zoo
 
 frontendAmbush:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix test --newGame 5 --dumpInitRngs --automateAll --gameMode ambush
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix test --newGame 5 --dumpInitRngs --automateAll --gameMode ambush
 
 frontendCrawl:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix test --newGame 1 --dumpInitRngs --automateAll --gameMode crawl
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix test --newGame 1 --dumpInitRngs --automateAll --gameMode crawl
 
 frontendSafari:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix test --newGame 2 --dumpInitRngs --automateAll --gameMode safari
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix test --newGame 2 --dumpInitRngs --automateAll --gameMode safari
 
 frontendSafariSurvival:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix test --newGame 5 --dumpInitRngs --automateAll --gameMode "safari survival"
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix test --newGame 5 --dumpInitRngs --automateAll --gameMode "safari survival"
 
 frontendBattle:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix test --newGame 5 --dumpInitRngs --automateAll --gameMode battle
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix test --newGame 5 --dumpInitRngs --automateAll --gameMode battle
 
 frontendBattleSurvival:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix test --newGame 5 --dumpInitRngs --automateAll --gameMode "battle survival"
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix test --newGame 5 --dumpInitRngs --automateAll --gameMode "battle survival"
 
 frontendDefense:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix test --newGame 9 --dumpInitRngs --automateAll --gameMode defense
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix test --newGame 9 --dumpInitRngs --automateAll --gameMode defense
 
 
 benchMemoryAnim:
-	dist/build/Allure/Allure --dbgMsgSer --newGame 1 --maxFps 100000 --benchmark --stopAfterFrames 33000 --automateAll --keepAutomated --gameMode crawl --setDungeonRng 120 --setMainRng 47 --frontendNull --noAnim +RTS -s -A1M -RTS
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --newGame 1 --maxFps 100000 --benchmark --stopAfterFrames 33000 --automateAll --keepAutomated --gameMode crawl --setDungeonRng 120 --setMainRng 47 --frontendNull --noAnim +RTS -s -A1M -RTS
 
 benchBattle:
-	dist/build/Allure/Allure --dbgMsgSer --newGame 3 --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfterFrames 1500 --automateAll --keepAutomated --gameMode battle --setDungeonRng 7 --setMainRng 7
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --newGame 3 --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfterFrames 1500 --automateAll --keepAutomated --gameMode battle --setDungeonRng 7 --setMainRng 7
 
 benchAnimBattle:
-	dist/build/Allure/Allure --dbgMsgSer --newGame 3 --maxFps 100000 --frontendNull --benchmark --stopAfterFrames 7000 --automateAll --keepAutomated --gameMode battle --setDungeonRng 7 --setMainRng 7
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --newGame 3 --maxFps 100000 --frontendNull --benchmark --stopAfterFrames 7000 --automateAll --keepAutomated --gameMode battle --setDungeonRng 7 --setMainRng 7
 
 benchFrontendBattle:
-	dist/build/Allure/Allure --dbgMsgSer --newGame 3 --noAnim --maxFps 100000 --benchmark --stopAfterFrames 1500 --automateAll --keepAutomated --gameMode battle --setDungeonRng 7 --setMainRng 7
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --newGame 3 --noAnim --maxFps 100000 --benchmark --stopAfterFrames 1500 --automateAll --keepAutomated --gameMode battle --setDungeonRng 7 --setMainRng 7
 
 benchCrawl:
-	dist/build/Allure/Allure --dbgMsgSer --newGame 1 --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfterFrames 7000 --automateAll --keepAutomated --gameMode crawl --setDungeonRng 0 --setMainRng 0
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --newGame 1 --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfterFrames 7000 --automateAll --keepAutomated --gameMode crawl --setDungeonRng 0 --setMainRng 0
 
 benchFrontendCrawl:
-	dist/build/Allure/Allure --dbgMsgSer --newGame 1 --noAnim --maxFps 100000 --benchmark --stopAfterFrames 7000 --automateAll --keepAutomated --gameMode crawl --setDungeonRng 0 --setMainRng 0
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --newGame 1 --noAnim --maxFps 100000 --benchmark --stopAfterFrames 7000 --automateAll --keepAutomated --gameMode crawl --setDungeonRng 0 --setMainRng 0
 
 benchNull: benchBattle benchAnimBattle benchCrawl
 
 bench: benchBattle benchAnimBattle benchFrontendBattle benchCrawl benchFrontendCrawl
 
 nativeBenchCrawl:
-	dist/build/Allure/Allure		   --dbgMsgSer --newGame 2 --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfterFrames 2000 --automateAll --keepAutomated --gameMode crawl --setDungeonRng 0 --setMainRng 0
+	dist/build/Allure/Allure		   --dbgMsgSer --logPriority 4 --newGame 2 --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfterFrames 2000 --automateAll --keepAutomated --gameMode crawl --setDungeonRng 0 --setMainRng 0
 
 nativeBenchBattle:
-	dist/build/Allure/Allure		   --dbgMsgSer --newGame 3 --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfterFrames 1000 --automateAll --keepAutomated --gameMode battle --setDungeonRng 0 --setMainRng 0
+	dist/build/Allure/Allure		   --dbgMsgSer --logPriority 4 --newGame 3 --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfterFrames 1000 --automateAll --keepAutomated --gameMode battle --setDungeonRng 0 --setMainRng 0
 
 nativeBench: nativeBenchBattle nativeBenchCrawl
 
 nodeBenchCrawl:
-	node dist/build/Allure/Allure.jsexe/all.js --dbgMsgSer --newGame 2 --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfterFrames 2000 --automateAll --keepAutomated --gameMode crawl --setDungeonRng 0 --setMainRng 0
+	node dist/build/Allure/Allure.jsexe/all.js --dbgMsgSer --logPriority 4 --newGame 2 --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfterFrames 2000 --automateAll --keepAutomated --gameMode crawl --setDungeonRng 0 --setMainRng 0
 
 nodeBenchBattle:
-	node dist/build/Allure/Allure.jsexe/all.js --dbgMsgSer --newGame 3 --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfterFrames 1000 --automateAll --keepAutomated --gameMode battle --setDungeonRng 0 --setMainRng 0
+	node dist/build/Allure/Allure.jsexe/all.js --dbgMsgSer --logPriority 4 --newGame 3 --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfterFrames 1000 --automateAll --keepAutomated --gameMode battle --setDungeonRng 0 --setMainRng 0
 
 nodeBench: nodeBenchBattle nodeBenchCrawl
 
 
-test-travis-short: test-short
-
 test-travis: test-short test-medium benchNull
 
 test: test-short test-medium benchNull
@@ -109,69 +108,73 @@
 test-medium: testRaid-medium testBrawl-medium testShootout-medium testEscape-medium testZoo-medium testAmbush-medium testCrawl-medium testSafari-medium testSafariSurvival-medium testBattle-medium testBattleSurvival-medium
 
 testRaid-medium:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 5 --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 20 --dumpInitRngs --automateAll --keepAutomated --gameMode raid 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 5 --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 20 --dumpInitRngs --automateAll --keepAutomated --gameMode raid 2> /tmp/teletypetest.log
 
 testBrawl-medium:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 5 --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 20 --dumpInitRngs --automateAll --keepAutomated --gameMode brawl 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 5 --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 20 --dumpInitRngs --automateAll --keepAutomated --gameMode brawl 2> /tmp/teletypetest.log
 
 testShootout-medium:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 5 --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 20 --dumpInitRngs --automateAll --keepAutomated --gameMode shootout 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 5 --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 20 --dumpInitRngs --automateAll --keepAutomated --gameMode shootout 2> /tmp/teletypetest.log
 
 testEscape-medium:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 3 --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 40 --dumpInitRngs --automateAll --keepAutomated --gameMode escape 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 3 --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 40 --dumpInitRngs --automateAll --keepAutomated --gameMode escape 2> /tmp/teletypetest.log
 
 testZoo-medium:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 2 --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 100 --dumpInitRngs --automateAll --keepAutomated --gameMode zoo 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 2 --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 100 --dumpInitRngs --automateAll --keepAutomated --gameMode zoo 2> /tmp/teletypetest.log
 
 testAmbush-medium:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 5 --noAnim --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 20 --dumpInitRngs --automateAll --keepAutomated --gameMode ambush 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 5 --noAnim --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 20 --dumpInitRngs --automateAll --keepAutomated --gameMode ambush 2> /tmp/teletypetest.log
 
 testCrawl-medium:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 1 --noAnim --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 200 --dumpInitRngs --automateAll --keepAutomated --gameMode crawl 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 1 --noAnim --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 200 --dumpInitRngs --automateAll --keepAutomated --gameMode crawl 2> /tmp/teletypetest.log
 
 testSafari-medium:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 2 --noAnim --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 100 --dumpInitRngs --automateAll --keepAutomated --gameMode safari 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 2 --noAnim --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 100 --dumpInitRngs --automateAll --keepAutomated --gameMode safari 2> /tmp/teletypetest.log
 
 testSafariSurvival-medium:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 8 --noAnim --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 60 --dumpInitRngs --automateAll --keepAutomated --gameMode "safari survival" 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 8 --noAnim --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 60 --dumpInitRngs --automateAll --keepAutomated --gameMode "safari survival" 2> /tmp/teletypetest.log
 
 testBattle-medium:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 3 --noAnim --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 20 --dumpInitRngs --automateAll --keepAutomated --gameMode battle 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 3 --noAnim --maxFps 100000 --frontendTeletype --benchmark --stopAfterSeconds 20 --dumpInitRngs --automateAll --keepAutomated --gameMode battle 2> /tmp/teletypetest.log
 
 testBattleSurvival-medium:
-	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
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --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 300 --dumpInitRngs --automateAll --keepAutomated --gameMode defense 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --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
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 5 --savePrefix brawl --dumpInitRngs --automateAll --keepAutomated --gameMode brawl --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 5 --savePrefix shootout --dumpInitRngs --automateAll --keepAutomated --gameMode shootout --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 5 --savePrefix escape --dumpInitRngs --automateAll --keepAutomated --gameMode escape --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 5 --savePrefix zoo --dumpInitRngs --automateAll --keepAutomated --gameMode zoo --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 5 --savePrefix ambush --dumpInitRngs --automateAll --keepAutomated --gameMode ambush --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 5 --savePrefix crawl --dumpInitRngs --automateAll --keepAutomated --gameMode crawl --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 5 --savePrefix safari --dumpInitRngs --automateAll --keepAutomated --gameMode safari --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 5 --savePrefix safariSurvival --dumpInitRngs --automateAll --keepAutomated --gameMode "safari survival" --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 5 --savePrefix battle --dumpInitRngs --automateAll --keepAutomated --gameMode battle --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --newGame 5 --savePrefix battleSurvival --dumpInitRngs --automateAll --keepAutomated --gameMode "battle survival" --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 5 --savePrefix raid --dumpInitRngs --automateAll --keepAutomated --gameMode raid --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 5 --savePrefix brawl --dumpInitRngs --automateAll --keepAutomated --gameMode brawl --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 5 --savePrefix shootout --dumpInitRngs --automateAll --keepAutomated --gameMode shootout --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 5 --savePrefix escape --dumpInitRngs --automateAll --keepAutomated --gameMode escape --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 5 --savePrefix zoo --dumpInitRngs --automateAll --keepAutomated --gameMode zoo --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 5 --savePrefix ambush --dumpInitRngs --automateAll --keepAutomated --gameMode ambush --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 5 --savePrefix crawl --dumpInitRngs --automateAll --keepAutomated --gameMode crawl --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 5 --savePrefix safari --dumpInitRngs --automateAll --keepAutomated --gameMode safari --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 5 --savePrefix safariSurvival --dumpInitRngs --automateAll --keepAutomated --gameMode "safari survival" --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 5 --savePrefix battle --dumpInitRngs --automateAll --keepAutomated --gameMode battle --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --newGame 5 --savePrefix battleSurvival --dumpInitRngs --automateAll --keepAutomated --gameMode "battle survival" --frontendTeletype --stopAfterSeconds 2 2> /tmp/teletypetest.log
 
 # "--setDungeonRng 0 --setMainRng 0" is needed for determinism relative to seed
 # generated before game save
 test-short-load:
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix raid --dumpInitRngs --automateAll --keepAutomated --gameMode raid --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix brawl --dumpInitRngs --automateAll --keepAutomated --gameMode brawl --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix shootout --dumpInitRngs --automateAll --keepAutomated --gameMode shootouti --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix escape --dumpInitRngs --automateAll --keepAutomated --gameMode escape --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix zoo --dumpInitRngs --automateAll --keepAutomated --gameMode zoo --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix ambush --dumpInitRngs --automateAll --keepAutomated --gameMode ambush --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix crawl --dumpInitRngs --automateAll --keepAutomated --gameMode crawl --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix safari --dumpInitRngs --automateAll --keepAutomated --gameMode safari --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix safariSurvival --dumpInitRngs --automateAll --keepAutomated --gameMode "safari survival" --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix battle --dumpInitRngs --automateAll --keepAutomated --gameMode battle --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
-	dist/build/Allure/Allure --dbgMsgSer --boostRandomItem --savePrefix battleSurvival --dumpInitRngs --automateAll --keepAutomated --gameMode "battle survival" --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix raid --dumpInitRngs --automateAll --keepAutomated --gameMode raid --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix brawl --dumpInitRngs --automateAll --keepAutomated --gameMode brawl --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix shootout --dumpInitRngs --automateAll --keepAutomated --gameMode shootouti --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix escape --dumpInitRngs --automateAll --keepAutomated --gameMode escape --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix zoo --dumpInitRngs --automateAll --keepAutomated --gameMode zoo --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix ambush --dumpInitRngs --automateAll --keepAutomated --gameMode ambush --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix crawl --dumpInitRngs --automateAll --keepAutomated --gameMode crawl --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix safari --dumpInitRngs --automateAll --keepAutomated --gameMode safari --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix safariSurvival --dumpInitRngs --automateAll --keepAutomated --gameMode "safari survival" --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix battle --dumpInitRngs --automateAll --keepAutomated --gameMode battle --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
+	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --boostRandomItem --savePrefix battleSurvival --dumpInitRngs --automateAll --keepAutomated --gameMode "battle survival" --frontendTeletype --stopAfterSeconds 2 --setDungeonRng 0 --setMainRng 0 2> /tmp/teletypetest.log
 
+
+version:
+	dist/build/Allure/Allure --version
+
 #in LambdaHack/
 # cabal install --disable-library-profiling --disable-profiling --disable-documentation -f-release
 
@@ -197,7 +200,9 @@
 
 build-binary: build-binary-common
 	cp AllureOfTheStarsInstall/bin/Allure AllureOfTheStars
-	tar -czf Allure_x_ubuntu-16.04-amd64.tar.gz AllureOfTheStars
+	dist/build/Allure/Allure --version > /dev/null; \
+	LH_VERSION=$$(cat ~/.Allure/stdout.txt); \
+	tar -czf Allure_$${LH_VERSION}_ubuntu-16.04-amd64.tar.gz AllureOfTheStars
 
 new-build-dev:
 	cabal new-build --datadir=. --disable-optimization -j1 all
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -40,14 +40,16 @@
 you may prefer to use a native binary for your architecture, if it exists.
 
 Pre-compiled game binaries for some platforms are available through
-the release page[11] and from AppVeyor (Windows 32bit[17] and Windows 64bit[18];
-note that these no longer work on Windows XP, since Cygwin and MSYS2
-dropped support for XP). To use a pre-compiled binary archive,
+the release page[11] (and continuously from AppVeyor[18]).
+Note that Windows binaries no longer work on Windows XP, since Cygwin
+and MSYS2 dropped support for XP). To use a pre-compiled binary archive,
 unpack it and run the executable in the unpacked directory.
+Or use program shortcuts from the installer, if available.
 
-On Linux, make sure you have the SDL2 libraries suite installed on your system
-(e.g., libsdl2, libsdl2-ttf). For Windows, the SDL2 and all other needed
-libraries are already contained in the game's binary archive.
+On Linux, make sure you have the SDL2 libraries installed on your system
+(e.g., libsdl2-2.0-0, libsdl2-ttf-2.0-0 on Ubuntu; also libdw1).
+For Windows, the SDL2 and all other needed libraries are already contained
+in the game's binary archive.
 
 
 Screen and keyboard configuration
@@ -174,7 +176,8 @@
 Copyright
 ---------
 
-Copyright (c) 2008--2011 Andres Loeh, 2010--2017 Mikolaj Konarski
+Copyright (c) 2008--2011 Andres Loeh
+Copyright (c) 2010--2017 Mikolaj Konarski and others (see git history)
 
 Allure of the Stars is free software: you can redistribute it and/or modify
 it under the terms of the GNU Affero General Public License as published by
@@ -205,5 +208,4 @@
 [11]: https://github.com/AllureOfTheStars/Allure/releases/latest
 [15]: https://github.com/ghcjs/ghcjs
 [16]: https://www.npmjs.com/package/google-closure-compiler
-[17]: https://ci.appveyor.com/project/Mikolaj/allure-hpt6r/build/artifacts
 [18]: https://ci.appveyor.com/project/Mikolaj/allure/build/artifacts
