diff --git a/Allure.cabal b/Allure.cabal
--- a/Allure.cabal
+++ b/Allure.cabal
@@ -2,11 +2,11 @@
 -- The package version. See the Haskell package versioning policy (PVP)
 -- for standards guiding when and how versions should be incremented.
 -- http://www.haskell.org/haskellwiki/Package_versioning_policy
--- PVP summary: +-+------- breaking API changes
---              | | +----- non-breaking API additions
---              | | |   +--- code changes with no API change
-version:        0.4.101.1
-synopsis:       Near-future Sci-Fi roguelike and tactical squad game
+-- PVP summary:+-+------- breaking API changes
+--             | | +----- non-breaking API additions
+--             | | | +--- code changes with no API change
+version:       0.5.0.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.
                See the wiki for design notes and contribute.
@@ -25,12 +25,11 @@
 bug-reports:   http://github.com/AllureOfTheStars/Allure/issues
 license:       AGPL-3
 license-file:  LICENSE
-tested-with:   GHC == 7.6, GHC == 7.8
+tested-with:   GHC == 7.6, GHC == 7.8, GHC == 7.10
 data-files:    GameDefinition/config.ui.default, GameDefinition/scores,
                GameDefinition/PLAYING.md, README.md, LICENSE, CREDITS,
                CHANGELOG.md
 extra-source-files: GameDefinition/MainMenu.ascii, Makefile
--- extra-doc-files: GameDefinition/screenshot.png
 author:        Andres Loeh, Mikolaj Konarski and others
 maintainer:    Mikolaj Konarski <mikolaj.konarski@funktory.com>
 category:      Game
@@ -63,7 +62,7 @@
                       Content.TileKind,
                       TieKnot,
                       Paths_Allure
-  build-depends:      LambdaHack >= 0.4.101.1 && < 0.5.1.0,
+  build-depends:      LambdaHack >= 0.5.0.0 && < 0.5.1.0,
                       template-haskell >= 2.6 && < 3,
 
                       base       >= 4       && < 5,
diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,8 +1,19 @@
+## [v0.5.0.0, aka 'Halfway through space'](https://github.com/AllureOfTheStars/Allure/compare/v0.4.101.0...v0.5.0.0)
+
+- let AI put excess items in shared stash and use them out of shared stash
+- let UI multiple items pickup routine put items that don't fit into equipment into shared stash, if possible, not into inventory pack
+- re-enable the ability to hear close, invisible foes
+- add a few more AI and autonomous henchmen tactics (CTRL-T)
+- keep difficulty setting over session restart
+- change some game start keybindings
+- replace the Duel game mode with the Raid game mode
+- various bugfixes, minor improvements and balancing
+
 ## [v0.4.101.1, aka 'Officially fun'](https://github.com/AllureOfTheStars/Allure/compare/v0.4.100.0...v0.4.101.1)
 
 - the game is now officially fun to play, with a seal of the Galactic Council
 - introduce unique boss monsters and unique artifact items
-- add animals that heal the player, in particular as a mid-game reset for HP
+- add robots that heal the player, in particular as a mid-game reset for HP
 - move spaceship airlock to level 10 and beef up spaceship crew
 - let AI gang up, attempt stealth and react to player aggressiveness
 - spawn actors fast, close to the enemy and in large numbers
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
@@ -3,7 +3,7 @@
 -- and is released under the terms of the GNU Affero General Public License.
 -- For license and copyright information, see the file LICENSE.
 --
--- | The default game key-command mapping to be used for UI. Can be overriden
+-- | The default game key-command mapping to be used for UI. Can be overridden
 -- via macros in the config file.
 module Client.UI.Content.KeyKind ( standardKeys ) where
 
@@ -28,11 +28,15 @@
 
       -- Main Menu, which apart of these includes a few extra commands
       [ ("CTRL-x", ([CmdMenu], GameExit))
-      , ("CTRL-u", ([CmdMenu], GameRestart "duel"))
+      , ("CTRL-r", ([CmdMenu], GameRestart "raid"))
       , ("CTRL-k", ([CmdMenu], GameRestart "skirmish"))
       , ("CTRL-m", ([CmdMenu], GameRestart "ambush"))
       , ("CTRL-b", ([CmdMenu], GameRestart "battle"))
-      , ("CTRL-n", ([CmdMenu], GameRestart "campaign"))
+      , ("CTRL-c", ([CmdMenu], GameRestart "campaign"))
+      , ("CTRL-i", ([CmdDebug], GameRestart "battle survival"))
+      , ("CTRL-f", ([CmdDebug], GameRestart "safari"))
+      , ("CTRL-u", ([CmdDebug], GameRestart "safari survival"))
+      , ("CTRL-e", ([CmdDebug], GameRestart "defense"))
       , ("CTRL-d", ([CmdMenu], GameDifficultyCycle))
 
       -- Movement and terrain alteration
@@ -193,11 +197,7 @@
       , ("RightButtonPress", ([CmdMouse], TgtPointerEnemy))
 
       -- Debug and others not to display in help screens
-      , ("CTRL-s", ([CmdDebug], GameSave))
-      , ("CTRL-i", ([CmdDebug], GameRestart "battle survival"))
-      , ("CTRL-f", ([CmdDebug], GameRestart "safari"))
-      , ("CTRL-r", ([CmdDebug], GameRestart "safari survival"))
-      , ("CTRL-e", ([CmdDebug], GameRestart "defense"))
+      , ("CTRL-S", ([CmdDebug], GameSave))
       , ("CTRL-semicolon", ([CmdInternal], MoveOnceToCursor))
       , ("CTRL-colon", ([CmdInternal], RunOnceToCursor))
       , ("CTRL-period", ([CmdInternal], ContinueToCursor))
diff --git a/GameDefinition/Content/CaveKind.hs b/GameDefinition/Content/CaveKind.hs
--- a/GameDefinition/Content/CaveKind.hs
+++ b/GameDefinition/Content/CaveKind.hs
@@ -21,9 +21,9 @@
   , validateSingle = validateSingleCaveKind
   , validateAll = validateAllCaveKind
   , content =
-      [rogue, arena, empty, noise, battle, skirmish, ambush, safari1, safari2, safari3, bridge, shallow2rogue, shallow2arena, shallow2empty, shallow1arena]
+      [rogue, arena, empty, noise, battle, skirmish, ambush, safari1, safari2, safari3, rogueLit, bridge, shallow2rogue, shallow2arena, shallow2empty, shallow1arena]
   }
-rogue,        arena, empty, noise, battle, skirmish, ambush, safari1, safari2, safari3, bridge, shallow2rogue, shallow2arena, shallow2empty, shallow1arena :: CaveKind
+rogue,        arena, empty, noise, battle, skirmish, ambush, safari1, safari2, safari3, rogueLit, bridge, shallow2rogue, shallow2arena, shallow2empty, shallow1arena :: CaveKind
 
 rogue = CaveKind
   { csymbol       = 'R'
@@ -111,7 +111,7 @@
   , cauxConnects  = 0
   , cmaxVoid      = 0
   , chidden       = 1000
-  , cactorCoeff   = 150  -- the maze requires time to explore
+  , cactorCoeff   = 160  -- the maze requires time to explore
   , cactorFreq    = [("alien", 70), ("animal", 15), ("robot", 15)]
   , citemNum      = 12 * d 2  -- an incentive to explore the labyrinth
   , cpassable     = True
@@ -188,20 +188,29 @@
 safari1 = ambush {cfreq = [("caveSafari1", 1)]}
 safari2 = battle {cfreq = [("caveSafari2", 1)]}
 safari3 = skirmish {cfreq = [("caveSafari3", 1)]}
-bridge = rogue
+rogueLit = rogue
+  { csymbol       = 'S'
+  , cname         = "Triton City Sewers"
+  , cfreq         = [("caveRogueLit", 1)]
+  , cdarkChance   = 0
+  , cmaxVoid      = 1%10
+  , cactorCoeff   = 1000  -- deep level with no eqp, so slow spawning
+  , cactorFreq    = [("animal", 50), ("robot", 50)]
+  , citemNum      = 30 * d 2  -- just one level, hard enemies, treasure
+  , citemFreq     = [("useful", 33), ("gem", 33), ("currency", 33)]
+  , cdarkCorTile  = "emergency walkway"
+  , clitCorTile   = "emergency walkway"
+  }
+bridge = rogueLit
   { csymbol       = 'B'
   , cname         = "Captain's bridge"
   , cfreq         = [("caveBridge", 1)]
   , cgrid         = DiceXY (d 2 + 1) 2
   , cminPlaceSize = DiceXY 10 7
   , cmaxPlaceSize = DiceXY 40 14
-  , cdarkChance   = 0
-  , cmaxVoid      = 1%10
   , cactorFreq    = []  -- safe, nothing spawns
   , citemNum      = 15 * d 2  -- lure them in with loot
-  , citemFreq     = filter ((/= "treasure") . fst) $ citemFreq arena
-  , cdarkCorTile  = "emergency walkway"
-  , clitCorTile   = "emergency walkway"
+  , citemFreq     = filter ((/= "treasure") . fst) $ citemFreq rogue
   }
 shallow2rogue = rogue
   { cfreq         = [("shallow random 2", 50)]
@@ -228,5 +237,11 @@
   , cminPlaceSize = DiceXY (2 * d 2 + 3) 3
   , cactorCoeff   = 3  -- mostly immobile actors anyway
   , cactorFreq    = [("animal", 8), ("robot", 2), ("immobile robot", 90)]
+      -- The medbot faucets on lvl 1 act like HP resets. They are needed to avoid
+      -- cascading failure, if the particular starting conditions were
+      -- very hard. The items are not reset, even if the are bad, which provides
+      -- enough of a continuity. The faucets on lvl 1 are not OP and can't be
+      -- abused, because they spawn less and less often and they don't heal over
+      -- max HP.
   , couterFenceTile = "oriels fence"
   }
diff --git a/GameDefinition/Content/ItemKind.hs b/GameDefinition/Content/ItemKind.hs
--- a/GameDefinition/Content/ItemKind.hs
+++ b/GameDefinition/Content/ItemKind.hs
@@ -127,7 +127,7 @@
   , iweight  = 4000
   , iaspects = [AddHurtRanged (d 2 + dl 5 |*| 20)]
   , ieffects = [Hurt (4 * d 1), PullActor (ThrowMod 200 50)]
-  , ifeature = []
+  , ifeature = [Identified]
   , idesc    = "A display piece harking back to the Earth's oceanic tourism hayday. The cruel, barbed head lodges in its victim so painfully that the weakest tug of the thin line sends the victim flying."
   , ikit     = []
   }
@@ -276,7 +276,7 @@
   , iweight  = 30
   , iaspects = [ Unique
                , Periodic
-               , Timeout $ d 3 + 3 - dl 3 |*| 10
+               , Timeout $ 1 + d 2
                , AddArmorMelee $ 2 + d 3
                , AddArmorRanged $ 2 + d 3 ]
   , ieffects = [Recharging (RefillCalm 1)]
@@ -393,26 +393,28 @@
   }
 ring1 = ring
   { irarity  = [(10, 2)]
-  , iaspects = [AddSpeed $ d 2, AddMaxHP $ dl 5 - 5 - d 5]
+  , iaspects = [AddSpeed $ 1 + d 2, AddMaxHP $ dl 7 - 7 - d 7]
   , ieffects = [Explode "distortion"]  -- strong magic
   , ifeature = ifeature ring ++ [EqpSlot EqpSlotAddSpeed ""]
   }
 ring2 = ring
-  { iaspects = [AddMaxHP $ 10 + dl 10, AddMaxCalm $ dl 5 - 20 - d 5]
+  { irarity  = [(10, 5)]
+  , iaspects = [AddMaxHP $ 10 + dl 10, AddMaxCalm $ dl 5 - 20 - d 5]
   , ifeature = ifeature ring ++ [EqpSlot EqpSlotAddMaxHP ""]
   }
 ring3 = ring
-  { iaspects = [AddMaxCalm $ 15 + dl 15]
+  { irarity  = [(10, 5)]
+  , iaspects = [AddMaxCalm $ 29 + dl 10]
   , ifeature = ifeature ring ++ [EqpSlot EqpSlotAddMaxCalm ""]
   , idesc    = "Cold, solid to the touch, perfectly round, engraved with solemn, strangely comforting, worn out words."
   }
 ring4 = ring
-  { irarity  = [(3, 6), (10, 6)]
+  { irarity  = [(3, 3), (10, 5)]
   , iaspects = [AddHurtMelee $ d 5 + dl 5 |*| 3, AddMaxHP $ dl 3 - 5 - d 3]
   , ifeature = ifeature ring ++ [EqpSlot EqpSlotAddHurtMelee ""]
   }
 ring5 = ring  -- by the time it's found, probably no space in eqp
-  { irarity  = [(5, 0), (10, 1)]
+  { irarity  = [(5, 0), (10, 2)]
   , iaspects = [AddLight $ d 2]
   , ieffects = [Explode "distortion"]  -- strong magic
   , ifeature = ifeature ring ++ [EqpSlot EqpSlotAddLight ""]
@@ -500,8 +502,7 @@
                , OnSmash (OneOf [ Explode "healing mist 2"
                                 , Explode "calming mist"
                                 , Explode "distressing odor"
-                                , Explode "distortion"  -- outlier, OK
-                                , Explode "smelly droplet"
+                                , Explode "eye drop"
                                 , Explode "blast 20" ]) ]
   }
 potion7 = potion
@@ -981,7 +982,7 @@
 gem = ItemKind
   { isymbol  = symbolGem
   , iname    = "gem"
-  , ifreq    = [("treasure", 100), ("gem", 1)]
+  , ifreq    = [("treasure", 100), ("gem", 100)]
   , iflavour = zipPlain $ delete BrYellow brightCol  -- natural, so not fancy
   , icount   = 1
   , irarity  = []
@@ -1016,7 +1017,7 @@
 currency = ItemKind
   { isymbol  = symbolGold
   , iname    = "gold grain"
-  , ifreq    = [("treasure", 100), ("currency", 1)]
+  , ifreq    = [("treasure", 100), ("currency", 100)]
   , iflavour = zipPlain [BrYellow]
   , icount   = 10 + d 20 + dl 20
   , irarity  = [(1, 25), (10, 10)]
diff --git a/GameDefinition/Content/ItemKindActor.hs b/GameDefinition/Content/ItemKindActor.hs
--- a/GameDefinition/Content/ItemKindActor.hs
+++ b/GameDefinition/Content/ItemKindActor.hs
@@ -58,9 +58,9 @@
   , ifreq    = [("sniper", 100), ("mobile", 1)]
   , ikit     = ikit warrior
                ++ [ ("ring of opportunity sniper", CEqp)
-                  , ("any arrow", CInv), ("any arrow", CInv)
+                  , ("any arrow", CSha), ("any arrow", CInv)
                   , ("any arrow", CInv), ("any arrow", CInv)
-                  , ("flask", CInv), ("light source", CInv)
+                  , ("flask", CInv), ("light source", CSha)
                   , ("light source", CInv), ("light source", CInv) ]
   }
 
@@ -127,7 +127,7 @@
   , ieffects = []
   , ifeature = [Durable, Identified]
   , idesc    = "A blind, slimy mass of clawing, stinging and burning. You'd think it's powerless, but as soon as it touches your trembling body, it's always one step ahead."
-  , ikit     = [ ("nostril", COrgan), ("claw", COrgan)
+  , ikit     = [ ("nostril", COrgan), ("small claw", COrgan)
                , ("tentacle", COrgan), ("tentacle", COrgan)
                , ("thorn", COrgan), ("sting", COrgan)
                , ("sapient brain", COrgan) ]
@@ -149,7 +149,7 @@
   , idesc    = "It moves in sudden jerks and never makes a noise. Speaks in hard objects hurled at deadly speeds."
   , ikit     = [ ("speed gland 4", COrgan)
                , ("eye 7", COrgan)
-               , ("any arrow", CInv), ("any arrow", CInv)
+               , ("any arrow", CSha), ("any arrow", CInv)
                , ("any arrow", CInv), ("any arrow", CInv)
                , ("sapient brain", COrgan) ]
   }
@@ -212,7 +212,7 @@
   , ifeature = [Durable, Identified]
   , idesc    = ""
   , ikit     = [ ("screeching beak", COrgan)  -- in reality it grunts and hisses
-               , ("claw", COrgan), ("eye 6", COrgan)
+               , ("small claw", COrgan), ("eye 6", COrgan)
                , ("animal brain", COrgan) ]
   }
 skunk = ItemKind
@@ -243,7 +243,7 @@
   , irarity  = [(1, 5)]
   , iverbHit = "thud"
   , iweight  = 80000
-  , iaspects = [ AddMaxHP 30, AddMaxCalm 30, AddSpeed 18
+  , iaspects = [ AddMaxHP 20, AddMaxCalm 30, AddSpeed 17
                , AddSkills $ EM.singleton AbAlter (-1) ]
   , ieffects = []
   , ifeature = [Durable, Identified]
@@ -267,7 +267,7 @@
   , ifeature = [Durable, Identified]
   , idesc    = ""
   , ikit     = [ ("venom tooth", COrgan), ("small claw", COrgan)
-               , ("eye 5", COrgan), ("nostril", COrgan)
+               , ("eye 2", COrgan), ("nostril", COrgan)
                , ("animal brain", COrgan) ]
   }
 rattlesnake = ItemKind
@@ -276,7 +276,7 @@
   , ifreq    = [("animal", 100), ("horror", 100), ("mobile animal", 100)]
   , iflavour = zipPlain [Brown]
   , icount   = 1
-  , irarity  = [(3, 3), (10, 5)]
+  , irarity  = [(4, 1), (10, 7)]
   , iverbHit = "thud"
   , iweight  = 80000
   , iaspects = [ AddMaxHP 25, AddMaxCalm 60, AddSpeed 15
@@ -285,7 +285,7 @@
   , ifeature = [Durable, Identified]
   , idesc    = ""
   , ikit     = [ ("venom fang", COrgan)
-               , ("eye 5", COrgan), ("nostril", COrgan)
+               , ("eye 3", COrgan), ("nostril", COrgan)
                , ("animal brain", COrgan) ]
   }
 komodoDragon = ItemKind  -- bad hearing; regeneration makes it very powerful
@@ -346,7 +346,7 @@
   , ifreq    = [("animal", 100), ("mobile", 1)]
   , iflavour = zipPlain [Brown]
   , icount   = 1
-  , irarity  = [(1 * 10/12, 1000), (2 * 10/12, 0)]  -- unique
+  , irarity  = [(1 * 10/12, 1000000), (2 * 10/12, 0)]  -- unique
   , iverbHit = "thud"
   , iweight  = 80000
   , iaspects = [ Unique, AddMaxHP 90, AddMaxCalm 60, AddSpeed 25
@@ -368,7 +368,7 @@
   , ifreq    = [("animal", 100), ("horror", 100)]
   , iflavour = zipPlain [Brown]
   , icount   = 1
-  , irarity  = [(1, 3), (10, 6)]
+  , irarity  = [(1, 2), (10, 4)]
   , iverbHit = "thud"
   , iweight  = 1000
   , iaspects = [ AddMaxHP 8, AddMaxCalm 60, AddSpeed 30
@@ -385,7 +385,7 @@
   , ifreq    = [("animal", 100), ("horror", 100), ("mobile animal", 100)]
   , iflavour = zipPlain [Magenta]
   , icount   = 1
-  , irarity  = [(5, 1), (10, 10)]
+  , irarity  = [(5, 1), (10, 8)]
   , iverbHit = "thud"
   , iweight  = 1000
   , iaspects = [ AddMaxHP 8, AddMaxCalm 60, AddSpeed 30
@@ -400,7 +400,7 @@
 thornbush = ItemKind
   { isymbol  = 't'
   , iname    = "thornbush"
-  , ifreq    = [("animal", 100)]
+  , ifreq    = [("animal", 50)]
   , iflavour = zipPlain [Brown]
   , icount   = 1
   , irarity  = [(1, 3)]
@@ -639,7 +639,7 @@
                , ("construction robot", 100) ]
   , iflavour = zipPlain [BrRed]
   , icount   = 1
-  , irarity  = [(5, 1), (10, 10)]
+  , irarity  = [(6, 0), (10, 10)]
   , iverbHit = "thud"
   , iweight  = 800000
   , iaspects = [ AddMaxHP 41, AddMaxCalm 60, AddSpeed 20
@@ -649,7 +649,7 @@
   , idesc    = "Heavy multi-purpose construction robot. Excels at discharging, dismantling and demolition."
   , ikit     = [ ("large jaw", COrgan), ("small claw", COrgan), ("spotlight", COrgan)
                , ("construction hooter", CInv)
-               , ("armored skin", COrgan), ("eye 5", COrgan)
+               , ("armored skin", COrgan), ("eye 4", COrgan)
                , ("robot brain", COrgan) ]
   }
 cleanerRobot = ItemKind
diff --git a/GameDefinition/Content/ItemKindOrgan.hs b/GameDefinition/Content/ItemKindOrgan.hs
--- a/GameDefinition/Content/ItemKindOrgan.hs
+++ b/GameDefinition/Content/ItemKindOrgan.hs
@@ -166,7 +166,7 @@
   , icount   = 1
   , iverbHit = "sting"
   , iaspects = [AddArmorMelee 90, AddArmorRanged 90]
-  , ieffects = [Burn $ 2 * d 1, Paralyze 10, RefillHP 5]
+  , ieffects = [Burn $ 2 * d 1, Paralyze 3, RefillHP 5]
   , ifeature = [Identified]  -- not Durable
   , idesc    = "Painful, but beneficial."
   }
@@ -176,7 +176,7 @@
   , icount   = 1
   , iverbHit = "sting"
   , iaspects = [Timeout $ 1 + d 5]
-  , ieffects = [Burn $ 1 * d 1, Recharging (Paralyze 3)]
+  , ieffects = [Burn $ 2 * d 1, Recharging (Paralyze 2)]
   , idesc    = "Painful, debilitating and harmful."
   }
 venomTooth = fist
@@ -223,9 +223,9 @@
 liveWire = fist
   { iname    = "live wire"
   , ifreq    = [("live wire", 100)]
-  , icount   = 2
+  , icount   = 1
   , iverbHit = "shock"
-  , iaspects = [Timeout $ 5 + d 5]
+  , iaspects = [Timeout $ 3 + d 3]
   , ieffects = [ Hurt (1 * d 1)
                , Recharging (DropItem COrgan "temporary conditions" True)
                , Recharging $ RefillHP (-2)
@@ -292,7 +292,7 @@
   , ifreq    = [("nostril", 100)]
   , icount   = 2
   , iverbHit = "snuff"
-  , iaspects = [AddSmell 2]
+  , iaspects = [AddSmell 1]  -- times 2, from icount
   , idesc    = ""
   }
 
@@ -355,7 +355,7 @@
 scentGland = armoredSkin  -- TODO: cone attack, 3m away, project? apply?
   { iname    = "scent gland"
   , ifreq    = [("scent gland", 100)]
-  , icount   = 2
+  , icount   = 1
   , iverbHit = "spray at"
   , iaspects = [Periodic, Timeout $ 10 + d 2 |*| 5 ]
   , ieffects = [ Recharging (Explode "distressing odor")
diff --git a/GameDefinition/Content/ModeKind.hs b/GameDefinition/Content/ModeKind.hs
--- a/GameDefinition/Content/ModeKind.hs
+++ b/GameDefinition/Content/ModeKind.hs
@@ -22,12 +22,12 @@
   , validateSingle = validateSingleModeKind
   , validateAll = validateAllModeKind
   , content =
-      [campaign, duel, skirmish, ambush, battle, battleSurvival, safari, safariSurvival, pvp, coop, defense, screensaver]
+      [campaign, raid, skirmish, ambush, battle, battleSurvival, safari, safariSurvival, pvp, coop, defense, screensaver]
   }
-campaign,        duel, skirmish, ambush, battle, battleSurvival, safari, safariSurvival, pvp, coop, defense, screensaver :: ModeKind
+campaign,        raid, skirmish, ambush, battle, battleSurvival, safari, safariSurvival, pvp, coop, defense, screensaver :: ModeKind
 
 campaign = ModeKind
-  { msymbol = 'n'
+  { msymbol = 'c'
   , mname   = "campaign"
   , mfreq   = [("campaign", 1)]
   , mroster = rosterCampaign
@@ -35,13 +35,13 @@
   , mdesc   = "You got stranded looting the blasted bridge of a once luxurious cruise liner. Your current plan is to fight through, gathering your spoils, to the shuttle airlock somewhere among the giant spaceship's uppermost decks. There are animal cries down below and ominous silence up above."
   }
 
-duel = ModeKind
-  { msymbol = 'u'
-  , mname   = "duel"
-  , mfreq   = [("duel", 1)]
-  , mroster = rosterDuel
-  , mcaves  = cavesSkirmish
-  , mdesc   = "Let's settle the argument about this noble lady outside, in the woody biosphere behind the saloon."
+raid = ModeKind
+  { msymbol = 'r'
+  , mname   = "raid"
+  , mfreq   = [("raid", 1)]
+  , mroster = rosterRaid
+  , mcaves  = cavesRaid
+  , mdesc   = "The Triton City sewers need purging. The first person to break through to the other end will be paid 100 gold grains. Please don't fight."
   }
 
 skirmish = ModeKind
@@ -50,7 +50,7 @@
   , mfreq   = [("skirmish", 1)]
   , mroster = rosterSkirmish
   , mcaves  = cavesSkirmish
-  , mdesc   = "You owe restorative surgery to one of our crew: if we win, we take all you have; if you win, you take our old giant spaceship (if you still want it when you see it)."
+  , mdesc   = "You cheated. Come alone to the woody biosphere behind the saloon at noon, if you dare. The winner takes all the spoils, including the keys and the papers of the decrepit giant spaceship."
   }
 
 ambush = ModeKind
@@ -90,7 +90,7 @@
   }
 
 safariSurvival = ModeKind
-  { msymbol = 'n'
+  { msymbol = 'u'
   , mname   = "safari survival"
   , mfreq   = [("safari survival", 1)]
   , mroster = rosterSafariSurvival
@@ -127,17 +127,18 @@
 
 screensaver = safari
   { mname   = "safari screensaver"
-  , mfreq   = [("screensaver", 1), ("starting", 1)]
+  , mfreq   = [("starting", 1)]
   , mroster = rosterSafari
       { rosterList = (head (rosterList rosterSafari))
                        -- changing leader by client needed, because of TFollow
-                       {fleaderMode = LeaderAI $ AutoLeader True False}
+                       -- changing level by client enabled for UI
+                       {fleaderMode = LeaderAI $ AutoLeader False False}
                      : tail (rosterList rosterSafari)
       }
   }
 
 
-rosterCampaign, rosterDuel, rosterSkirmish, rosterAmbush, rosterBattle, rosterBattleSurvival, rosterSafari, rosterSafariSurvival, rosterPvP, rosterCoop, rosterDefense :: Roster
+rosterCampaign, rosterRaid, rosterSkirmish, rosterAmbush, rosterBattle, rosterBattleSurvival, rosterSafari, rosterSafariSurvival, rosterPvP, rosterCoop, rosterDefense :: Roster
 
 rosterCampaign = Roster
   { rosterList = [ playerHero
@@ -147,35 +148,43 @@
   , rosterEnemy = [ ("Spacefarer Crew", "Alien Hierarchy")
                   , ("Spacefarer Crew", "Animal Kingdom")
                   , ("Spacefarer Crew", "Robot Anarchy") ]
- , rosterAlly = [ ("Alien Hierarchy", "Animal Kingdom")
-                , ("Alien Hierarchy", "Robot Anarchy")
-                , ("Robot Anarchy", "Animal Kingdom") ] }
+  , rosterAlly = [ ("Alien Hierarchy", "Animal Kingdom")
+                 , ("Alien Hierarchy", "Robot Anarchy")
+                 , ("Robot Anarchy", "Animal Kingdom") ] }
 
-rosterDuel = Roster
+rosterRaid = Roster
   { rosterList = [ playerHero { fname = "Spacefarer Crew"
-                              , fhiCondPoly = hiDweller
+                              , fhiCondPoly = hiRaid
                               , fentryLevel = 4
                               , finitialActors = 1 }
                  , playerAntiHero { fname = "Red Collars"
-                                  , fhiCondPoly = hiDweller
+                                  , fhiCondPoly = hiRaid
                                   , fentryLevel = 4
                                   , finitialActors = 1 }
-                 , playerHorror ]
-  , rosterEnemy = [ ("Spacefarer Crew", "Red Collars")
-                  , ("Spacefarer Crew", "Horror Den")
-                  , ("Red Collars", "Horror Den") ]
-  , rosterAlly = [] }
+                 , playerAnimal { fentryLevel = 4
+                                , finitialActors = 1 }
+                 , playerRobot { fentryLevel = 4
+                               , finitialActors = 1 } ]
+  , rosterEnemy = [ ("Spacefarer Crew", "Animal Kingdom")
+                  , ("Spacefarer Crew", "Robot Anarchy")
+                  , ("Red Collars", "Animal Kingdom")
+                  , ("Red Collars", "Robot Anarchy") ]
+  , rosterAlly = [("Robot Anarchy", "Animal Kingdom")] }
 
-rosterSkirmish = rosterDuel
+rosterSkirmish = Roster
   { rosterList = [ playerHero { fname = "Spacefarer Crew"
                               , fhiCondPoly = hiDweller
                               , fentryLevel = 4 }
                  , playerAntiHero { fname = "Red Collars"
                                   , fhiCondPoly = hiDweller
                                   , fentryLevel = 4 }
-                 , playerHorror ] }
+                 , playerHorror ]
+  , rosterEnemy = [ ("Spacefarer Crew", "Red Collars")
+                  , ("Spacefarer Crew", "Horror Den")
+                  , ("Red Collars", "Horror Den") ]
+  , rosterAlly = [] }
 
-rosterAmbush = rosterDuel
+rosterAmbush = rosterSkirmish
   { rosterList = [ playerSniper { fname = "Spacefarer Crew"
                                 , fhiCondPoly = hiDweller
                                 , fentryLevel = 7
@@ -301,8 +310,8 @@
   { rosterList = [ playerAntiHero { fname = "Coral" }
                  , playerAntiHero { fname = "Amber"
                                   , fleaderMode = LeaderNull }
-                 , playerAntiHero { fname = "Green" }
                  , playerAnimal { fhasUI = True }
+                 , playerAnimal
                  , playerMonster { fname = "Alien Hierarchy"
                                  , finitialActors = 3 }
                  , playerMonster { fname = "Leaderless Alien Hierarchy"
@@ -310,15 +319,8 @@
                                  , fleaderMode = LeaderNull }
                  , playerRobot ]
   , rosterEnemy = [ ("Coral", "Alien Hierarchy")
-                  , ("Amber", "Alien Hierarchy")
-                  , ("Animal Kingdom", "Leaderless Alien Hierarchy") ]
-  , rosterAlly = [ ("Coral", "Amber")
-                 , ("Coral", "Green")
-                 , ("Amber", "Green")
-                 , ("Green", "Animal Kingdom")
-                 , ("Green", "Robot Anarchy")
-                 , ("Green", "Alien Hierarchy")
-                 , ("Green", "Leaderless Alien Hierarchy") ] }
+                  , ("Amber", "Alien Hierarchy") ]
+  , rosterAlly = [ ("Coral", "Amber") ] }
 
 rosterDefense = rosterCampaign
   { rosterList = [ playerAntiHero
@@ -326,7 +328,7 @@
                  , playerAnimal
                  , playerRobot ] }
 
-cavesCampaign, cavesSkirmish, cavesAmbush, cavesBattle, cavesSafari :: Caves
+cavesCampaign, cavesRaid, cavesSkirmish, cavesAmbush, cavesBattle, cavesSafari :: Caves
 
 cavesCampaign = IM.fromList
                 $ [(1, ("shallow random 1", Nothing))]
@@ -337,6 +339,8 @@
                   ++ [(10, ("caveEmpty", Just False))]
                   ++ [(11, ("campaign random", Nothing))]
                   ++ [(12, ("caveNoise", Nothing))]
+
+cavesRaid = IM.fromList [(4, ("caveRogueLit", Just True))]
 
 cavesSkirmish = IM.fromList [(4, ("caveSkirmish", Nothing))]
 
diff --git a/GameDefinition/Content/ModeKindPlayer.hs b/GameDefinition/Content/ModeKindPlayer.hs
--- a/GameDefinition/Content/ModeKindPlayer.hs
+++ b/GameDefinition/Content/ModeKindPlayer.hs
@@ -11,10 +11,9 @@
   , playerAnimal, playerMobileAnimal
   , playerRobot, playerMobileRobot
   , playerHorror
-  , hiHero, hiDweller
+  , hiHero, hiDweller, hiRaid
   ) where
 
-import qualified Data.EnumMap.Strict as EM
 import Data.List
 
 import Game.LambdaHack.Common.Ability
@@ -113,7 +112,7 @@
   , fhasGender = False
   , ftactic = TRoam  -- can't pick up, so no point exploring
   , fentryLevel = 3
-  , finitialActors = 2 + d 2
+  , finitialActors = 2 + d 2  -- many, because no spawning
   , fleaderMode = LeaderNull
   , fhasUI = False
   }
@@ -130,10 +129,9 @@
   , fhiCondPoly = hiDweller
   , fhasNumbers = False
   , fhasGender = False
-  , ftactic = TRoam  -- TODO: TFollow
-                        -- coordinated via net, follow alien leader
+  , ftactic = TRoam  -- TODO:TFollow -- coordinated via net, follow alien leader
   , fentryLevel = 3
-  , finitialActors = 2 + d 2
+  , finitialActors = 2 + d 2  -- many, because no spawning
   , fleaderMode = LeaderNull
   , fhasUI = False
   }
@@ -166,7 +164,7 @@
 victoryOutcomes :: [Outcome]
 victoryOutcomes = [Conquer, Escape]
 
-hiHero, hiDweller :: HiCondPoly
+hiHero, hiDweller, hiRaid :: HiCondPoly
 
 -- Heroes rejoice in loot.
 hiHero = [ ( [(HiLoot, 1)]
@@ -187,12 +185,8 @@
               , [minBound..maxBound] \\ victoryOutcomes )
             ]
 
-minusTen, meleeAdjacent, _meleeAndRanged :: Skills
-
--- To make sure only a lot of weak items can override move-only-leader, etc.
-minusTen = EM.fromList $ zip [minBound..maxBound] [-10, -10..]
-
-meleeAdjacent = EM.delete AbWait $ EM.delete AbMelee minusTen
-
--- Melee and reaction fire.
-_meleeAndRanged = EM.delete AbProject $ meleeAdjacent
+hiRaid = [ ( [(HiLoot, 1)]
+           , [minBound..maxBound] )
+         , ( [(HiConst, 100)]
+           , victoryOutcomes )
+         ]
diff --git a/GameDefinition/Content/PlaceKind.hs b/GameDefinition/Content/PlaceKind.hs
--- a/GameDefinition/Content/PlaceKind.hs
+++ b/GameDefinition/Content/PlaceKind.hs
@@ -24,7 +24,7 @@
 rect = PlaceKind  -- Valid for any nonempty area, hence low frequency.
   { psymbol  = 'r'
   , pname    = "room"
-  , pfreq    = [("rogue", 70), ("ambush", 8), ("noise", 40)]
+  , pfreq    = [("rogue", 70), ("ambush", 8), ("noise", 80)]
   , prarity  = [(1, 10), (10, 8)]
   , pcover   = CStretch
   , pfence   = FWall
@@ -34,7 +34,7 @@
 ruin = PlaceKind
   { psymbol  = 'R'
   , pname    = "ruin"
-  , pfreq    = [("ambush", 17), ("battle", 100), ("noise", 20)]
+  , pfreq    = [("ambush", 17), ("battle", 100), ("noise", 40)]
   , prarity  = [(1, 10), (10, 20)]
   , pcover   = CStretch
   , pfence   = FWall
diff --git a/GameDefinition/Content/TileKind.hs b/GameDefinition/Content/TileKind.hs
--- a/GameDefinition/Content/TileKind.hs
+++ b/GameDefinition/Content/TileKind.hs
@@ -30,26 +30,24 @@
   }
 wall,        wallCache, hardRock, doorlessWall, oriel, pillar, lampPost, burningBush, bush, tree, wallSuspect, doorClosed, doorOpen, stairsUp, stairsDown, escapeUp, escapeDown, liftUp, lift, liftDown, unknown, floorCorridorLit, floorActorLit, floorItemLit, floorActorItemLit, floorArenaShade, floorRedLit, floorBlueLit, floorGreenLit :: TileKind
 
+oriel = TileKind
+  { tsymbol  = '\''
+  , tname    = "oriel"
+  , tfreq    = [("oriels fence", 4)]
+  , tcolor   = White
+  , tcolor2  = Black
+  , tfeature = [Dark, Impenetrable]
+  }
 wall = TileKind
   { tsymbol  = '#'
   , tname    = "granite wall"
-  , tfreq    = [ ("fillerWall", 1), ("cachable", 70)
-               , ("legendLit", 100), ("legendDark", 100)
+  , tfreq    = [ ("fillerWall", 1), ("legendLit", 100), ("legendDark", 100)
+               , ("cachable", 70)
                , ("noiseSet", 100), ("battleSet", 250) ]
   , tcolor   = BrWhite
   , tcolor2  = defFG
   , tfeature = [HideAs "suspect wall"]
   }
-wallCache = TileKind
-  { tsymbol  = '&'
-  , tname    = "cache"
-  , tfreq    = [ ("cachable", 30)
-               , ("legendLit", 100), ("legendDark", 100) ]
-  , tcolor   = BrWhite
-  , tcolor2  = defFG
-  , tfeature = [ Cause $ IK.CreateItem CGround "useful" IK.TimerNone
-               , ChangeTo "cachable" ]
-  }
 hardRock = TileKind
   { tsymbol  = '#'
   , tname    = "outer hull"
@@ -66,14 +64,6 @@
   , tcolor2  = defFG
   , tfeature = []
   }
-oriel = TileKind
-  { tsymbol  = '\''
-  , tname    = "oriel"
-  , tfreq    = [("oriels fence", 4)]
-  , tcolor   = White
-  , tcolor2  = Black
-  , tfeature = [Dark, Impenetrable]
-  }
 pillar = TileKind
   { tsymbol  = 'O'
   , tname    = "rock"
@@ -82,6 +72,16 @@
   , tcolor   = BrWhite
   , tcolor2  = defFG
   , tfeature = []
+  }
+wallCache = TileKind
+  { tsymbol  = '&'
+  , tname    = "cache"
+  , tfreq    = [ ("cachable", 30)
+               , ("legendLit", 100), ("legendDark", 100) ]
+  , tcolor   = BrWhite
+  , tcolor2  = defFG
+  , tfeature = [ Cause $ IK.CreateItem CGround "useful" IK.TimerNone
+               , ChangeTo "cachable" ]
   }
 lampPost = TileKind
   { tsymbol  = 'O'
diff --git a/GameDefinition/Main.hs b/GameDefinition/Main.hs
--- a/GameDefinition/Main.hs
+++ b/GameDefinition/Main.hs
@@ -4,6 +4,7 @@
 -- For license and copyright information, see the file LICENSE.
 --
 -- | The main source code file of Allure of the Stars.
+-- Module "TieKnot" is separated to make it usable in tests.
 module Main ( main ) where
 
 import System.Environment (getArgs)
diff --git a/GameDefinition/PLAYING.md b/GameDefinition/PLAYING.md
--- a/GameDefinition/PLAYING.md
+++ b/GameDefinition/PLAYING.md
@@ -22,7 +22,7 @@
 ------
 
 The heroes are marked on the map with symbols `@` and `1` through `9`.
-Their goal is to explore an old, warped, once luxurious, space liner,
+Their goal is to explore a warped, old, once luxurious space liner,
 battle the horrors within, gather as much gold and precious gems
 as possible, and escape to tell the tale.
 
@@ -30,7 +30,7 @@
 and his attributes are displayed at the bottommost status line,
 which in its most complex form may look as follows.
 
-    *@12 Adventurer  4d1+5% Calm: 20/60 HP: 33/50 Target: basilisk  [**___]
+    *@12 Adventurer  4d1+5% Calm: 20/60 HP: 33/50 Target: basilisk  [**__]
 
 The line starts with the list of party members (unless there's only one member)
 and the shortened name of the team. Clicking on the list selects heroes and
@@ -95,7 +95,7 @@
                  /|\            /|\            /|\
                 1 2 3          j k l          b j n
 
-In aiming mode (KEYPAD_* or \) the same keys (or the middle and right
+In aiming mode (`KEYPAD_*` or `\`) the same keys (or the middle and right
 mouse buttons) move the crosshair (the white box). In normal mode,
 `SHIFT` (or `CTRL`) and a movement key make the current party leader
 run in the indicated direction, until anything of interest is spotted.
@@ -109,8 +109,8 @@
 Few commands other than movement, 'g'etting an item from the floor,
 'a'pplying an item and 'f'linging an item are necessary for casual play.
 Some are provided only as specialized versions of the more general
-commands or as building blocks for more complex convenience macros,
-e.g., the autoexplore command (key `X`) could be defined
+commands or as building blocks for more complex convenience macros.
+E.g., the autoexplore command (key `X`) could be defined
 by the player as a macro using `CTRL-?`, `CTRL-.` and `V`.
 
 The following minimal command set lets you accomplish almost anything
@@ -133,12 +133,11 @@
         ESC             cancel action, open Main Menu
 
 The only activity not possible with the commands above is the management
-of non-leader party members. The defaults should usually suffice,
-especially if your non-leader heroes can only melee or wait
-and none have found the equipment that enables opportunity fire.
-If there's a need, you can manually set party tactics with `CTRL-T`
-and you can assign individual targets to party members
-using the aiming and targeting commands listed below.
+of non-leader party members. You don't need it, unless your non-leader actors
+can move or fire opportunistically (via innate skills or rare equipment).
+If really needed, you can manually set party tactics with `CTRL-T`
+and you can assign individual targets to party members using the aiming
+and targeting commands listed below.
 
         keys            command
         KEYPAD_* or \   aim at an enemy
@@ -167,7 +166,7 @@
 Commands for saving and exiting the current game, starting a new game, etc.,
 are listed in the Main Menu, brought up by the `ESC` key.
 Game difficulty setting affects hitpoints at birth for any actors
-of any UI-using faction. For a person new to roguelikes, the Duel scenario
+of any UI-using faction. For a person new to roguelikes, the Raid scenario
 offers a gentle introduction. The subsequent game modes gradually introduce
 squad combat, stealth, opportunity fire, asymmetric battles and more.
 
@@ -222,10 +221,11 @@
 your score is based on the gold and precious gems you've plundered.
 In the latter case, your score is based on the number of turns you spent
 overcoming your foes (the quicker the victory, the better; the slower
-the demise, the better). Bonus points, based on the number of heroes
-that were lost, are awarded if you win.
+the demise, the better). Bonus points, based on the number of heroes lost,
+are awarded if you win.
 
-If all your heroes fall, you will invariably see a new foolhardy party
-of adventurers clamoring to be led into the spaceship. They start
+When all your heroes fall, you are going to invariably see a new foolhardy
+party of adventurers clamoring to be led into the spaceship. They start
 their conquest from a new entrance, with no experience and no equipment,
-and new, undaunted enemies bar their way. Lead them to fame, wealth and glory!
+and new, undaunted enemies bar their way. Lead the new hopeful explorers
+to fame, wealth and glory!
diff --git a/GameDefinition/config.ui.default b/GameDefinition/config.ui.default
--- a/GameDefinition/config.ui.default
+++ b/GameDefinition/config.ui.default
@@ -36,9 +36,10 @@
 movementViKeys_hjklyubn = False
 movementLaptopKeys_uk8o79jl = True
 ; Monospace fonts that have fixed size regardless of boldness (on some OSes)
-font = "Terminus,DejaVu Sans Mono,Consolas,Courier New,Liberation Mono,Courier,FreeMono,Monospace normal normal normal normal 16"
-;font = "Terminus,DejaVu Sans Mono,Consolas,Courier New,Liberation Mono,Courier,FreeMono,Monospace normal normal normal normal 20"
+font = "Terminus,DejaVu Sans Mono,Consolas,Courier New,Liberation Mono,Courier,FreeMono,Monospace normal normal normal normal 14"
+;font = "Terminus,DejaVu Sans Mono,Consolas,Courier New,Liberation Mono,Courier,FreeMono,Monospace normal normal normal normal 18"
 colorIsBold = True
+; New historyMax takes effect after removal of savefiles.
 historyMax = 5000
 maxFps = 30
 noAnim = False
diff --git a/GameDefinition/scores b/GameDefinition/scores
Binary files a/GameDefinition/scores and b/GameDefinition/scores differ
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,7 @@
 #
 
 # All xc* tests assume a profiling build (for stack traces).
-# See the install-debug target below or .travis.yml.prof.
+# See the install-debug target below.
 
 install-debug:
 	cabal install --enable-library-profiling --enable-executable-profiling --ghc-options="-fprof-auto-calls" --disable-optimization
@@ -18,68 +18,74 @@
 	dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --dumpInitRngs
 
 xcfrontendCampaign:
-	dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode campaign --difficulty 1
+	dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame 1 --maxFps 60 --dumpInitRngs --automateAll --gameMode campaign
 
+xcfrontendRaid:
+	dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame 5 --maxFps 60 --dumpInitRngs --automateAll --gameMode raid
+
 xcfrontendSkirmish:
-	dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode skirmish
+	dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame 5 --maxFps 60 --dumpInitRngs --automateAll --gameMode skirmish
 
 xcfrontendAmbush:
-	dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode ambush
+	dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame 5 --maxFps 60 --dumpInitRngs --automateAll --gameMode ambush
 
 xcfrontendBattle:
-	dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode battle --difficulty 2
+	dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame 2 --maxFps 60 --dumpInitRngs --automateAll --gameMode battle
 
 xcfrontendBattleSurvival:
-	dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode "battle survival" --difficulty 8
+	dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame 8 --maxFps 60 --dumpInitRngs --automateAll --gameMode "battle survival"
 
 xcfrontendSafari:
-	dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode safari --difficulty 2
+	dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame 2 --maxFps 60 --dumpInitRngs --automateAll --gameMode safari
 
 xcfrontendSafariSurvival:
-	dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode "safari survival" --difficulty 8
+	dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame 8 --maxFps 60 --dumpInitRngs --automateAll --gameMode "safari survival"
 
 xcfrontendDefense:
-	dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode defense --difficulty 9
+	dist/build/Allure/Allure +RTS -xc -RTS --dbgMsgSer --savePrefix test --newGame 9 --maxFps 60 --dumpInitRngs --automateAll --gameMode defense
 
 
 play:
 	dist/build/Allure/Allure --dbgMsgSer --dumpInitRngs
 
 frontendCampaign:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode campaign --difficulty 1
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 1 --maxFps 60 --dumpInitRngs --automateAll --gameMode campaign
 
+frontendRaid:
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --maxFps 60 --dumpInitRngs --automateAll --gameMode raid
+
 frontendSkirmish:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode skirmish
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --maxFps 60 --dumpInitRngs --automateAll --gameMode skirmish
 
 frontendAmbush:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode ambush
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --maxFps 60 --dumpInitRngs --automateAll --gameMode ambush
 
 frontendBattle:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode battle --difficulty 2
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --maxFps 60 --dumpInitRngs --automateAll --gameMode battle
 
 frontendBattleSurvival:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode "battle survival" --difficulty 8
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 8 --maxFps 60 --dumpInitRngs --automateAll --gameMode "battle survival"
 
 frontendSafari:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode safari --difficulty 2
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --maxFps 60 --dumpInitRngs --automateAll --gameMode safari
 
 frontendSafariSurvival:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode "safari survival" --difficulty 8
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 8 --maxFps 60 --dumpInitRngs --automateAll --gameMode "safari survival"
 
 frontendDefense:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 60 --dumpInitRngs --automateAll --gameMode defense --difficulty 9
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 9 --maxFps 60 --dumpInitRngs --automateAll --gameMode defense
 
 benchCampaign:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfter 60 --automateAll --keepAutomated --gameMode campaign --difficulty 1 --setDungeonRng 42 --setMainRng 42 +RTS -N1 -RTS
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 1 --noDelay --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfter 60 --automateAll --keepAutomated --gameMode campaign --setDungeonRng 42 --setMainRng 42 +RTS -N1 -RTS
 
 benchBattle:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfter 60 --automateAll --keepAutomated --gameMode battle --difficulty 2 --setDungeonRng 42 --setMainRng 42 +RTS -N1 -RTS
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --noDelay --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfter 60 --automateAll --keepAutomated --gameMode battle --setDungeonRng 42 --setMainRng 42 +RTS -N1 -RTS
 
 benchFrontendCampaign:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 100000 --benchmark --stopAfter 60 --automateAll --keepAutomated --gameMode campaign --difficulty 1 --setDungeonRng 42 --setMainRng 42 +RTS -N1 -RTS
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 1 --maxFps 100000 --benchmark --stopAfter 60 --automateAll --keepAutomated --gameMode campaign --setDungeonRng 42 --setMainRng 42 +RTS -N1 -RTS
 
 benchFrontendBattle:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 100000 --benchmark --stopAfter 60 --automateAll --keepAutomated --gameMode battle --difficulty 2 --setDungeonRng 42 --setMainRng 42 +RTS -N1 -RTS
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --maxFps 100000 --benchmark --stopAfter 60 --automateAll --keepAutomated --gameMode battle --setDungeonRng 42 --setMainRng 42 +RTS -N1 -RTS
 
 benchNull: benchCampaign benchBattle
 
@@ -100,89 +106,97 @@
 
 test-short: test-short-new test-short-load
 
-test-medium: testCampaign-medium testSkirmish-medium testAmbush-medium testBattle-medium testBattleSurvival-medium testSafari-medium testSafariSurvival-medium testPvP-medium testCoop-medium testDefense-medium
+test-medium: testCampaign-medium testRaid-medium testSkirmish-medium testAmbush-medium testBattle-medium testBattleSurvival-medium testSafari-medium testSafariSurvival-medium testPvP-medium testCoop-medium testDefense-medium
 
-test-medium-no-safari: testCampaign-medium testSkirmish-medium testAmbush-medium testBattle-medium testBattleSurvival-medium testPvP-medium testCoop-medium testDefense-medium
+test-medium-no-safari: testCampaign-medium testRaid-medium testSkirmish-medium testAmbush-medium testBattle-medium testBattleSurvival-medium testPvP-medium testCoop-medium testDefense-medium
 
-test-long: testCampaign-long testSkirmish-medium testAmbush-medium testBattle-long testBattleSurvival-long testSafari-long testSafariSurvival-long testPvP-medium testDefense-long
+test-long: testCampaign-long testRaid-medium testSkirmish-medium testAmbush-medium testBattle-long testBattleSurvival-long testSafari-long testSafariSurvival-long testPvP-medium testDefense-long
 
-test-long-no-safari: testCampaign-long testSkirmish-medium testAmbush-medium testBattle-long testBattleSurvival-long testPvP-medium testDefense-long
+test-long-no-safari: testCampaign-long testRaid-medium testSkirmish-medium testAmbush-medium testBattle-long testBattleSurvival-long testPvP-medium testDefense-long
 
 testCampaign-long:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 500 --dumpInitRngs --automateAll --keepAutomated --gameMode campaign --difficulty 1 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 1 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 500 --dumpInitRngs --automateAll --keepAutomated --gameMode campaign > /tmp/stdtest.log
 
 testCampaign-medium:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 400 --dumpInitRngs --automateAll --keepAutomated --gameMode campaign --difficulty 1 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 1 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 400 --dumpInitRngs --automateAll --keepAutomated --gameMode campaign > /tmp/stdtest.log
 
+testRaid-long:
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --maxFps 100000 --frontendStd --benchmark --stopAfter 60 --dumpInitRngs --automateAll --keepAutomated --gameMode raid > /tmp/stdtest.log
+
+testRaid-medium:
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --maxFps 100000 --frontendStd --benchmark --stopAfter 30 --dumpInitRngs --automateAll --keepAutomated --gameMode raid > /tmp/stdtest.log
+
 testSkirmish-long:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 100000 --frontendStd --benchmark --stopAfter 60 --dumpInitRngs --automateAll --keepAutomated --gameMode skirmish > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --maxFps 100000 --frontendStd --benchmark --stopAfter 60 --dumpInitRngs --automateAll --keepAutomated --gameMode skirmish > /tmp/stdtest.log
 
 testSkirmish-medium:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --maxFps 100000 --frontendStd --benchmark --stopAfter 30 --dumpInitRngs --automateAll --keepAutomated --gameMode skirmish > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --maxFps 100000 --frontendStd --benchmark --stopAfter 30 --dumpInitRngs --automateAll --keepAutomated --gameMode skirmish > /tmp/stdtest.log
 
 testAmbush-long:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 60 --dumpInitRngs --automateAll --keepAutomated --gameMode ambush > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 60 --dumpInitRngs --automateAll --keepAutomated --gameMode ambush > /tmp/stdtest.log
 
 testAmbush-medium:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 30 --dumpInitRngs --automateAll --keepAutomated --gameMode ambush > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 30 --dumpInitRngs --automateAll --keepAutomated --gameMode ambush > /tmp/stdtest.log
 
 testBattle-long:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 100 --dumpInitRngs --automateAll --keepAutomated --gameMode battle --difficulty 2 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 100 --dumpInitRngs --automateAll --keepAutomated --gameMode battle > /tmp/stdtest.log
 
 testBattle-medium:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 50 --dumpInitRngs --automateAll --keepAutomated --gameMode battle --difficulty 2 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 50 --dumpInitRngs --automateAll --keepAutomated --gameMode battle > /tmp/stdtest.log
 
 testBattleSurvival-long:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 100 --dumpInitRngs --automateAll --keepAutomated --gameMode "battle survival" --difficulty 8 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 8 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 100 --dumpInitRngs --automateAll --keepAutomated --gameMode "battle survival" > /tmp/stdtest.log
 
 testBattleSurvival-medium:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 50 --dumpInitRngs --automateAll --keepAutomated --gameMode "battle survival" --difficulty 8 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 8 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 50 --dumpInitRngs --automateAll --keepAutomated --gameMode "battle survival" > /tmp/stdtest.log
 
 testSafari-long:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 250 --dumpInitRngs --automateAll --keepAutomated --gameMode safari --difficulty 2 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 250 --dumpInitRngs --automateAll --keepAutomated --gameMode safari > /tmp/stdtest.log
 
 testSafari-medium:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 200 --dumpInitRngs --automateAll --keepAutomated --gameMode safari --difficulty 2 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 200 --dumpInitRngs --automateAll --keepAutomated --gameMode safari > /tmp/stdtest.log
 
 testSafariSurvival-long:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 250 --dumpInitRngs --automateAll --keepAutomated --gameMode "safari survival" --difficulty 8 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 8 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 250 --dumpInitRngs --automateAll --keepAutomated --gameMode "safari survival" > /tmp/stdtest.log
 
 testSafariSurvival-medium:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 200 --dumpInitRngs --automateAll --keepAutomated --gameMode "safari survival" --difficulty 8 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 8 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 200 --dumpInitRngs --automateAll --keepAutomated --gameMode "safari survival" > /tmp/stdtest.log
 
 
 testPvP-long:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 60 --dumpInitRngs --automateAll --keepAutomated --gameMode PvP > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 60 --dumpInitRngs --automateAll --keepAutomated --gameMode PvP > /tmp/stdtest.log
 
 testPvP-medium:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 30 --dumpInitRngs --automateAll --keepAutomated --gameMode PvP > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 5 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 30 --dumpInitRngs --automateAll --keepAutomated --gameMode PvP > /tmp/stdtest.log
 
 testCoop-long:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 500 --dumpInitRngs --automateAll --keepAutomated --gameMode Coop --difficulty 2 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 500 --dumpInitRngs --automateAll --keepAutomated --gameMode Coop > /tmp/stdtest.log
 
 testCoop-medium:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 300 --dumpInitRngs --automateAll --keepAutomated --gameMode Coop --difficulty 2 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 2 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 300 --dumpInitRngs --automateAll --keepAutomated --gameMode Coop > /tmp/stdtest.log
 
 testDefense-long:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 500 --dumpInitRngs --automateAll --keepAutomated --gameMode defense --difficulty 9 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 9 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 500 --dumpInitRngs --automateAll --keepAutomated --gameMode defense > /tmp/stdtest.log
 
 testDefense-medium:
-	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 300 --dumpInitRngs --automateAll --keepAutomated --gameMode defense --difficulty 9 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix test --newGame 9 --noDelay --noAnim --maxFps 100000 --frontendStd --benchmark --stopAfter 300 --dumpInitRngs --automateAll --keepAutomated --gameMode defense > /tmp/stdtest.log
 
 test-short-new:
-	dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix campaign --dumpInitRngs --automateAll --keepAutomated --gameMode campaign --frontendStd --stopAfter 2 > /tmp/stdtest.log
-	dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix skirmish --dumpInitRngs --automateAll --keepAutomated --gameMode skirmish --frontendStd --stopAfter 2 > /tmp/stdtest.log
-	dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix ambush --dumpInitRngs --automateAll --keepAutomated --gameMode ambush --frontendStd --stopAfter 2 > /tmp/stdtest.log
-	dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix battle --dumpInitRngs --automateAll --keepAutomated --gameMode battle --frontendStd --stopAfter 2 > /tmp/stdtest.log
-	dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix battleSurvival --dumpInitRngs --automateAll --keepAutomated --gameMode "battle survival" --frontendStd --stopAfter 2 > /tmp/stdtest.log
-	dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix safari --dumpInitRngs --automateAll --keepAutomated --gameMode safari --frontendStd --stopAfter 2 > /tmp/stdtest.log
-	dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix safariSurvival --dumpInitRngs --automateAll --keepAutomated --gameMode "safari survival" --frontendStd --stopAfter 2 > /tmp/stdtest.log
-	dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix PvP --dumpInitRngs --automateAll --keepAutomated --gameMode PvP --frontendStd --stopAfter 2 > /tmp/stdtest.log
-	dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix Coop --dumpInitRngs --automateAll --keepAutomated --gameMode Coop --frontendStd --stopAfter 2 > /tmp/stdtest.log
-	dist/build/Allure/Allure --dbgMsgSer --newGame --savePrefix defense --dumpInitRngs --automateAll --keepAutomated --gameMode defense --frontendStd --stopAfter 2 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix campaign --dumpInitRngs --automateAll --keepAutomated --gameMode campaign --frontendStd --stopAfter 2 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix raid --dumpInitRngs --automateAll --keepAutomated --gameMode raid --frontendStd --stopAfter 2 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix skirmish --dumpInitRngs --automateAll --keepAutomated --gameMode skirmish --frontendStd --stopAfter 2 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix ambush --dumpInitRngs --automateAll --keepAutomated --gameMode ambush --frontendStd --stopAfter 2 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix battle --dumpInitRngs --automateAll --keepAutomated --gameMode battle --frontendStd --stopAfter 2 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix battleSurvival --dumpInitRngs --automateAll --keepAutomated --gameMode "battle survival" --frontendStd --stopAfter 2 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix safari --dumpInitRngs --automateAll --keepAutomated --gameMode safari --frontendStd --stopAfter 2 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix safariSurvival --dumpInitRngs --automateAll --keepAutomated --gameMode "safari survival" --frontendStd --stopAfter 2 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix PvP --dumpInitRngs --automateAll --keepAutomated --gameMode PvP --frontendStd --stopAfter 2 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix Coop --dumpInitRngs --automateAll --keepAutomated --gameMode Coop --frontendStd --stopAfter 2 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --newGame 5 --savePrefix defense --dumpInitRngs --automateAll --keepAutomated --gameMode defense --frontendStd --stopAfter 2 > /tmp/stdtest.log
 
 test-short-load:
 	dist/build/Allure/Allure --dbgMsgSer --savePrefix campaign --dumpInitRngs --automateAll --keepAutomated --gameMode campaign --frontendStd --stopAfter 2 > /tmp/stdtest.log
+	dist/build/Allure/Allure --dbgMsgSer --savePrefix raid --dumpInitRngs --automateAll --keepAutomated --gameMode raid --frontendStd --stopAfter 2 > /tmp/stdtest.log
 	dist/build/Allure/Allure --dbgMsgSer --savePrefix skirmish --dumpInitRngs --automateAll --keepAutomated --gameMode skirmish --frontendStd --stopAfter 2 > /tmp/stdtest.log
 	dist/build/Allure/Allure --dbgMsgSer --savePrefix ambush --dumpInitRngs --automateAll --keepAutomated --gameMode ambush --frontendStd --stopAfter 2 > /tmp/stdtest.log
 	dist/build/Allure/Allure --dbgMsgSer --savePrefix battle --dumpInitRngs --automateAll --keepAutomated --gameMode battle --frontendStd --stopAfter 2 > /tmp/stdtest.log
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
 and tactical squad game. Have a look at [PLAYING.md](GameDefinition/PLAYING.md)
 or jump straight into the fray.
 
-![gameplay screenshot](GameDefinition/screenshot.png?raw=true)
+![gameplay screenshot](https://raw.githubusercontent.com/AllureOfTheStars/media/master/screenshot/campaign3.png)
 
 The game is written in [Haskell] [1] using the [LambdaHack] [10]
 roguelike game engine. Long-term goals of the project are high
@@ -19,7 +19,7 @@
 Pre-compiled game binaries for some platforms are available through
 the [release page] [11] and from the [Nix Packages Collection] [12].
 To manually install a binary archive, make sure you have the GTK
-libraries suite on your system, unpack the LambdaHack archive
+libraries suite on your system, unpack the Allure archive
 and run the executable in the unpacked directory.
 
 On Windows, if you don't already have GTK installed (e.g., for the GIMP
@@ -70,6 +70,7 @@
 The latest official version of the game can be downloaded,
 compiled and installed automatically by Cabal from [Hackage] [3] as follows
 
+    cabal update
     cabal install gtk2hs-buildtools
     cabal install Allure --force-reinstalls
 
diff --git a/test/test.hs b/test/test.hs
--- a/test/test.hs
+++ b/test/test.hs
@@ -2,5 +2,5 @@
 
 main :: IO ()
 main =
-  tieKnot $ tail $ words "dist/build/LambdaHack/LambdaHack --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfter 6 --automateAll --gameMode campaign --setDungeonRng 42 --setMainRng 42"
-  -- tieKnot $ tail $ words "dist/build/LambdaHack/LambdaHack --dbgMsgSer --savePrefix test --newGame --noDelay --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfter 6 --automateAll --gameMode battle --setDungeonRng 42 --setMainRng 42"
+  tieKnot $ tail $ words "dist/build/LambdaHack/LambdaHack --dbgMsgSer --savePrefix test --newGame 2 --noDelay --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfter 6 --automateAll --keepAutomated --gameMode campaign --setDungeonRng 42 --setMainRng 42"
+  -- tieKnot $ tail $ words "dist/build/LambdaHack/LambdaHack --dbgMsgSer --savePrefix test --newGame 2 --noDelay --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfter 6 --automateAll --keepAutomated --gameMode battle --setDungeonRng 42 --setMainRng 42"
