diff --git a/Allure.cabal b/Allure.cabal
--- a/Allure.cabal
+++ b/Allure.cabal
@@ -5,13 +5,13 @@
 -- PVP summary:+-+------- breaking API changes
 --             | | +----- minor or non-breaking API additions
 --             | | | +--- code changes with no API change
-version:       0.8.1.2
+version:       0.8.3.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. Binaries and the game manual
-               are available at the homepage, where you can also
-               try the game out in the browser:
-               <http://allureofthestars.com/play>
+               are available at homepage, where you can also
+               try the game out in the browser at
+               <http://allureofthestars.com/play>.
                (It runs fastest on Chrome. Keyboard commands and savefiles
                are supported only on recent enough versions of browsers.
                Mouse should work everywhere.)
@@ -79,7 +79,7 @@
                       Implementation.MonadServerImplementation,
                       Implementation.TieKnot,
                       Paths_Allure
-  build-depends:      LambdaHack >= 0.8.1.0 && < 0.8.2.0,
+  build-depends:      LambdaHack >= 0.8.3.0 && < 0.8.4.0,
                       template-haskell >= 2.6,
 
                       async      >= 2,
diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,13 @@
+## [v0.8.3.0](https://github.com/AllureOfTheStars/Allure/compare/v0.8.1.2...v0.8.3.0)
+
+- Add a hack to run SDL2 on the main thread, fixing the OS X crash
+- Warn visually when impressed and Calm running low, risking domination
+- Display actor as red when low Calm and impressed or when low HP
+- Fix, complete and fine tune UI, AI and server skill and weapon checks
+- Fix a bug where item aspects look different to clients than to the server
+- Change the requirements for the main menu ASCII art
+- Tweak loot and terrain a tiny bit
+
 ## [v0.8.1.2](https://github.com/AllureOfTheStars/Allure/compare/v0.8.1.1...v0.8.1.2)
 
 - Fix typos detected by lintian
diff --git a/CREDITS b/CREDITS
--- a/CREDITS
+++ b/CREDITS
@@ -5,6 +5,7 @@
 Mikolaj Konarski
 Krzysztof Pławski
 @Peritract
+Pablo Reszczynski
 
 
 Fonts 16x16x.fon, 8x8x.fon and 8x8xb.fon are are taken from
diff --git a/GameDefinition/Content/CaveKind.hs b/GameDefinition/Content/CaveKind.hs
--- a/GameDefinition/Content/CaveKind.hs
+++ b/GameDefinition/Content/CaveKind.hs
@@ -140,8 +140,8 @@
   { csymbol       = 'E'
   , cname         = "Construction site"
   , cfreq         = [("caveEmpty", 1)]
-  , cgrid         = DiceXY 1 1
-  , cminPlaceSize = DiceXY 12 12
+  , cgrid         = DiceXY 2 2
+  , cminPlaceSize = DiceXY 12 9
   , cmaxPlaceSize = DiceXY 48 32  -- favour large rooms
   , cdarkChance   = 1 `d` 100 + 1 `dL` 100
   , cnightChance  = 0  -- always day
@@ -254,7 +254,7 @@
   , cdesc         = "The black sky outside sucks light through the oriels."
   }
 emptyExit = empty
-  { cname         = "Shuttle servicing area"
+  { cname         = "Shuttle servicing level"
   , cfreq         = [("caveEmptyExit", 1)]
   , cdefTile      = "emptyExitSet"
   , cdarkCorTile  = "transport route"
diff --git a/GameDefinition/Content/ItemKind.hs b/GameDefinition/Content/ItemKind.hs
--- a/GameDefinition/Content/ItemKind.hs
+++ b/GameDefinition/Content/ItemKind.hs
@@ -244,7 +244,8 @@
 light1 = ItemKind
   { isymbol  = symbolLight
   , iname    = "torch"
-  , ifreq    = [("common item", 100), ("light source", 100), ("wooden torch", 1)]
+  , ifreq    = [ ("common item", 100), ("light source", 100)
+               , ("wooden torch", 1) ]
   , iflavour = zipPlain [Brown]
   , icount   = 1 `dL` 4
   , irarity  = [(1, 15)]
@@ -256,7 +257,7 @@
   , ieffects = [Burn 1]
   , ifeature = [Lobable, Equipable, EqpSlot EqpSlotLightSource]
                  -- not Fragile; reusable flare
-  , idesc    = "A torch improvised with cloth soaked in tar on a stick."
+  , idesc    = "A puttering torch improvised with polymer sheets soaked in lubricant on a stick."
   , ikit     = []
   }
 light2 = ItemKind
@@ -272,7 +273,7 @@
   , iaspects = [AddShine 3, AddSight (-1)]
   , ieffects = [Burn 1, Paralyze 6, OnSmash (Explode "burning oil 3")]
   , ifeature = [Lobable, Fragile, Equipable, EqpSlot EqpSlotLightSource ]
-  , idesc    = "A sizable restaurant glass lamp filled with plant oil feeding a wick."
+  , idesc    = "A sizable restaurant glass lamp filled with plant oil feeding a slender wick."
   , ikit     = []
   }
 light3 = ItemKind
@@ -1458,7 +1459,7 @@
 gem5 = gem1
   { isymbol  = symbolSpecial
   , iname    = "stimpack"
-  , ifreq    = [ ("treasure", 100), ("gem", 25), ("any jewelry", 25)
+  , ifreq    = [ ("treasure", 100), ("gem", 25), ("any jewelry", 10)
                , ("valuable", 100) ]
   , iflavour = zipPlain [BrYellow]
   , irarity  = [(1, 40), (10, 40)]
diff --git a/GameDefinition/Content/ItemKindBlast.hs b/GameDefinition/Content/ItemKindBlast.hs
--- a/GameDefinition/Content/ItemKindBlast.hs
+++ b/GameDefinition/Content/ItemKindBlast.hs
@@ -755,7 +755,7 @@
   , iaspects = []
   , ieffects = [toOrganGood "resolute" (5 + 1 `d` 2), DropBestWeapon]
   , ifeature = [toVelocity 5, Fragile, Blast]  -- 1 step, 1 turn
-  , idesc    = "The fitful holographic clip shows a couple that laughs, watches in silence Saturn's rings through a huge window, throws treats to a little rhino frolicking in reduced gravity, runs through corridors wearing alien masks in a mock chase. An exited female voice proclaims: \"...safety and security, comfort, imagination...for each of your senses...robot servants...personalized life support zones...\""
+  , idesc    = "The fitful holographic clip shows a couple that laughs, watches in silence Saturn's rings through a huge window, throws treats to a little rhino frolicking in reduced gravity, runs through corridors wearing alien masks in a mock chase. An exited female voice proclaims: \"...safety, security and comfort...for each of your senses...personalized life support zones...robot servants...guessing your every wish...\""
   , ikit     = []
   }
 outerAdHologram = cruiseAdHologram
diff --git a/GameDefinition/Content/RuleKind.hs b/GameDefinition/Content/RuleKind.hs
--- a/GameDefinition/Content/RuleKind.hs
+++ b/GameDefinition/Content/RuleKind.hs
@@ -50,17 +50,10 @@
   -- The keybindings overwrite places marked with left curly brace signs.
   -- This sign is forbidden anywhere else in the picture.
   -- The picture and the whole main menu is displayed dull white on black.
-  --
-  -- The picture should be exactly 60 rows by 110 columns,
-  -- but only the middle rectangle of 24 rows by 80 columns is partially
-  -- overwritten with UI information and the curly brace signs are allowed
-  -- only there. So, the rectangle is 15 characters distant from the left
-  -- and 18 from top. For screen sizes larger than 60 by 100,
-  -- the picture is centered and padded with spaces, so it makes sense
-  -- for some or all of the picture borders to be spaces, as well.
-  -- If the screen is smaller than 60 by 100, borders of the picture
-  -- are cut off. Minimal screes size is 24 by 80 and the picture
-  -- should look well at this size, as well.
+  -- The glyphs, or at least the character cells, are perfect squares.
+  -- The picture should be exactly 45 rows by 80 columns.
+  -- For larger screen sizes, the picture is centered and padded with spaces,
+  -- so it makes sense for some or all of the picture borders to be spaces.
   , rmainMenuArt = $(do
       let path = "GameDefinition/MainMenu.ascii"
       qAddDependentFile path
diff --git a/GameDefinition/Content/TileKind.hs b/GameDefinition/Content/TileKind.hs
--- a/GameDefinition/Content/TileKind.hs
+++ b/GameDefinition/Content/TileKind.hs
@@ -24,11 +24,11 @@
   [unknown, unknownOuterFence, basicOuterFence, wall, wallSuspect, wallObscured, wallObscuredDefaced, wallObscuredFrescoed, pillar, pillarCache, lampPost, signboardUnread, signboardRead, tree, treeBurnt, treeBurning, rubble, rubbleSpice, doorTrapped, doorClosed, stairsUp, stairsTrappedUp, stairsOutdoorUp, stairsGatedUp, stairsDown, stairsTrappedDown, stairsOutdoorDown, stairsGatedDown, escapeUp, escapeDown, escapeOutdoorDown, wallGlass, wallGlassSpice, pillarIce, pulpit, bush, bushBurnt, bushBurning, floorFog, floorFogDark, floorSmoke, floorSmokeDark, doorOpen, floorCorridor, floorArena, floorNoise, floorDirt, floorDirtSpice, floorActor, floorActorItem, floorRed, floorBlue, floorGreen, floorBrown, floorArenaShade ]
   ++ map makeDarkColor ldarkColorable
   -- Allure-specific
-  ++ [oriel, outerHullWall, doorlessWall, machineWall, wallObscuredSafety, wallObscured3dBillboard, rock, pillarCache2, stairsLiftUp, stairsLiftTrappedUp, stairsLiftDown, stairsLiftTrappedDown, escapeSpaceshipDown, floorWindow]
+  ++ [oriel, outerHullWall, doorlessWall, machineWall, rubbleSpiceBurning, wallObscuredSafety, wallObscured3dBillboard, rock, pillarCache2, stairsLiftUp, stairsLiftTrappedUp, stairsLiftDown, stairsLiftTrappedDown, escapeSpaceshipDown, floorWindow]
 
 unknown,    unknownOuterFence, basicOuterFence, wall, wallSuspect, wallObscured, wallObscuredDefaced, wallObscuredFrescoed, pillar, pillarCache, lampPost, signboardUnread, signboardRead, tree, treeBurnt, treeBurning, rubble, rubbleSpice, doorTrapped, doorClosed, stairsUp, stairsTrappedUp, stairsOutdoorUp, stairsGatedUp, stairsDown, stairsTrappedDown, stairsOutdoorDown, stairsGatedDown, escapeUp, escapeDown, escapeOutdoorDown, wallGlass, wallGlassSpice, pillarIce, pulpit, bush, bushBurnt, bushBurning, floorFog, floorFogDark, floorSmoke, floorSmokeDark, doorOpen, floorCorridor, floorArena, floorNoise, floorDirt, floorDirtSpice, floorActor, floorActorItem, floorRed, floorBlue, floorGreen, floorBrown, floorArenaShade :: TileKind
 -- Allure-specific
-oriel,       outerHullWall, doorlessWall, machineWall, wallObscuredSafety, wallObscured3dBillboard, rock, pillarCache2, stairsLiftUp, stairsLiftTrappedUp, stairsLiftDown, stairsLiftTrappedDown, escapeSpaceshipDown, floorWindow :: TileKind
+oriel,       outerHullWall, doorlessWall, machineWall, rubbleSpiceBurning, wallObscuredSafety, wallObscured3dBillboard, rock, pillarCache2, stairsLiftUp, stairsLiftTrappedUp, stairsLiftDown, stairsLiftTrappedDown, escapeSpaceshipDown, floorWindow :: TileKind
 
 ldarkColorable :: [TileKind]
 ldarkColorable = [tree, bush, floorCorridor, floorArena, floorNoise, floorDirt, floorDirtSpice, floorActor, floorActorItem, floorWindow]
@@ -90,7 +90,7 @@
   , tname    = "wall"
   , tfreq    = [ ("fillerWall", 1), ("legendLit", 100), ("legendDark", 100)
                , ("cachable deposit", 80), ("cachable jewelry", 80)
-               , ("stair terminal", 100)
+               , ("stair terminal", 30)
                , ("battleSet", 250), ("rectWindowsOver_%_Lit", 80) ]
   , tcolor   = BrWhite
   , tcolor2  = defFG
@@ -106,7 +106,7 @@
   , talter   = 2
   , tfeature = [ RevealAs "trapped door"
                , ObscureAs "obscured wall"
-                ]
+               ]
   }
 wallObscured = TileKind
   { tsymbol  = '#'
@@ -117,7 +117,6 @@
   , talter   = 5
   , tfeature = [ Embed "scratch on wall"
                , HideAs "suspect wall"
-
                ]
   }
 wallObscuredDefaced = TileKind
@@ -129,7 +128,6 @@
   , talter   = 5
   , tfeature = [ Embed "obscene pictogram"
                , HideAs "suspect wall"
-
                ]
   }
 wallObscuredFrescoed = TileKind
@@ -141,7 +139,6 @@
   , talter   = 5
   , tfeature = [ Embed "subtle fresco"
                , HideAs "suspect wall"
-
                ]  -- a bit beneficial, but AI would loop if allowed to trigger
                   -- so no @ConsideredByAI@
   }
@@ -185,7 +182,6 @@
   , talter   = 5
   , tfeature = [ ConsideredByAI  -- changes after use, so safe for AI
                , RevealAs "signboard"  -- to display as hidden
-
                ]
   }
 signboardRead = TileKind
@@ -216,7 +212,7 @@
   }
 treeBurning = tree
   { tname    = "burning tree"
-  , tfreq    = [("zooSet", 70), ("tree with fire", 70)]
+  , tfreq    = [("zooSet", 40), ("tree with fire", 70)]
   , tcolor   = BrRed
   , tcolor2  = Red
   , talter   = 5
@@ -241,9 +237,9 @@
 rubbleSpice = TileKind
   { tsymbol  = '&'
   , tname    = "rubble pile"
-  , tfreq    = [ ("smokeClumpOver_f_Lit", 1), ("emptySet", 1)
-               , ("emptyExitSet", 1), ("noiseSet", 10), ("zooSet", 100)
-               , ("ambushSet", 20) ]
+  , tfreq    = [ ("rubbleSpice", 1), ("smokeClumpOver_f_Lit", 1)
+               , ("emptySet", 1), ("emptyExitSet", 1), ("noiseSet", 9)
+               , ("zooSet", 100), ("ambushSet", 18), ("stair terminal", 30) ]
   , tcolor   = BrYellow
   , tcolor2  = Brown
   , talter   = 4  -- boss can dig through
@@ -413,7 +409,7 @@
   }
 bushBurning = bush
   { tname    = "burning bush"
-  , tfreq    = [("ambushSet", 40), ("zooSet", 300), ("bush with fire", 30)]
+  , tfreq    = [("ambushSet", 40), ("zooSet", 290), ("bush with fire", 30)]
   , tcolor   = BrRed
   , tcolor2  = Red
   , talter   = 5
@@ -545,6 +541,8 @@
 
 -- ** Not walkable
 
+-- *** Not clear
+
 oriel = TileKind
   { tsymbol  = '%'  -- story-wise it's transparent, hence the symbol
   , tname    = "oriel"
@@ -567,15 +565,16 @@
   , talter   = 100
   , tfeature = [HideAs "fillerWall"]
   }
-machineWall = TileKind
-  { tsymbol  = '%'
-  , tname    = "hardware rack"
-  , tfreq    = [ ("noiseSet", 35), ("emptyExitSet", 7)
-               , ("doorlessWallOver_#", 80) ]
-  , tcolor   = White
-  , tcolor2  = BrBlack
-  , talter   = 100
-  , tfeature = [Spice, Clear]
+rubbleSpiceBurning = TileKind
+  { tsymbol  = '&'
+  , tname    = "burning installation"
+  , tfreq    = [ ("smokeClumpOver_f_Lit", 1), ("emptySet", 1)
+               , ("emptyExitSet", 1), ("noiseSet", 1)
+               , ("ambushSet", 2), ("zooSet", 40), ("stair terminal", 40) ]
+  , tcolor   = BrRed
+  , tcolor2  = Red
+  , talter   = 4  -- boss can dig through
+  , tfeature = [Spice, OpenTo "rubbleSpice", Embed "big fire"]
   }
 wallObscuredSafety = TileKind
   { tsymbol  = '#'
@@ -586,7 +585,6 @@
   , talter   = 5
   , tfeature = [ Embed "ruined first aid kit"
                , HideAs "suspect wall"
-
                ]
   }
 wallObscured3dBillboard = TileKind
@@ -598,7 +596,6 @@
   , talter   = 5
   , tfeature = [ Embed "3D display"
                , HideAs "suspect wall"
-
                ]
   }
 rock = pillar
@@ -656,6 +653,19 @@
   , tcolor   = defFG
   , tcolor2  = defFG
   , tfeature = Embed "black starry sky" : tfeature floorCorridor
+  }
+
+-- *** Clear
+
+machineWall = TileKind
+  { tsymbol  = '%'
+  , tname    = "hardware rack"
+  , tfreq    = [ ("noiseSet", 35), ("emptyExitSet", 6)
+               , ("doorlessWallOver_#", 80) ]
+  , tcolor   = White
+  , tcolor2  = BrBlack
+  , talter   = 100
+  , tfeature = [Spice, Clear]
   }
 
 -- ** Walkable
diff --git a/GameDefinition/Implementation/MonadClientImplementation.hs b/GameDefinition/Implementation/MonadClientImplementation.hs
--- a/GameDefinition/Implementation/MonadClientImplementation.hs
+++ b/GameDefinition/Implementation/MonadClientImplementation.hs
@@ -25,7 +25,6 @@
 
 import           Game.LambdaHack.Atomic (MonadStateWrite (..), putState)
 import           Game.LambdaHack.Client
-import           Game.LambdaHack.Client.ClientOptions
 import           Game.LambdaHack.Client.HandleAtomicM
 import           Game.LambdaHack.Client.HandleResponseM
 import           Game.LambdaHack.Client.LoopM
diff --git a/GameDefinition/Implementation/MonadServerImplementation.hs b/GameDefinition/Implementation/MonadServerImplementation.hs
--- a/GameDefinition/Implementation/MonadServerImplementation.hs
+++ b/GameDefinition/Implementation/MonadServerImplementation.hs
@@ -83,7 +83,7 @@
   chanSaveServer = SerImplementation $ gets serToSave
   liftIO         = SerImplementation . IO.liftIO
 
-instance MonadServerReadRequest SerImplementation where
+instance MonadServerComm SerImplementation where
   {-# INLINE getsDict #-}
   getsDict   f = SerImplementation $ gets $ f . serDict
   {-# INLINE modifyDict #-}
diff --git a/GameDefinition/Main.hs b/GameDefinition/Main.hs
--- a/GameDefinition/Main.hs
+++ b/GameDefinition/Main.hs
@@ -14,6 +14,7 @@
 
 import Game.LambdaHack.Common.Prelude
 
+import           Control.Concurrent
 import           Control.Concurrent.Async
 import qualified Control.Exception as Ex
 import qualified Options.Applicative as OA
@@ -25,9 +26,9 @@
 import qualified System.IO as SIO
 
 import Game.LambdaHack.Common.File (tryCreateDir)
-import Game.LambdaHack.Common.Misc
 #endif
 
+import Game.LambdaHack.Common.Misc
 import Game.LambdaHack.Server (serverOptionsPI)
 
 import Implementation.TieKnot
@@ -36,9 +37,14 @@
 -- run the game and handle exit.
 main :: IO ()
 main = do
+  -- This may be broken with JS and also bloats the outcome file, so disabled.
 #ifndef USE_JSFILE
-  -- For the case when the game is started not on a console.
-  -- This is broken with JS and also bloats the outcome file.
+  -- Special case hack, when the game is started not on a console.
+  -- Without this, any attempt to output on stdout crashes a Windows exe
+  -- (at least on Windows Vista) launched from the desktop or start menu.
+  -- This is very crude and results in the inability to, e.g., process
+  -- the output of @--help@ through a unix pipe. However, this should be
+  -- effective on all Windows version, without the need to test all.
   isTerminal <- SIO.hIsTerminalDevice SIO.stdout
   unless isTerminal $ do
     dataDir <- appDataDir
@@ -47,12 +53,23 @@
     fstderr <- SIO.openFile (dataDir </> "stderr.txt") SIO.WriteMode
     GHC.IO.Handle.hDuplicateTo fstdout SIO.stdout
     GHC.IO.Handle.hDuplicateTo fstderr SIO.stderr
+  let fillWorkaround =
+        -- Set up void workaround if nothing specific required.
+        void $ tryPutMVar workaroundOnMainThreadMVar $ return ()
 #endif
   -- Fail here, not inside server code, so that savefiles are not removed,
   -- because they are not the source of the failure.
   !serverOptions <- OA.execParser serverOptionsPI
   -- Avoid the bound thread that would slow down the communication.
   a <- async $ tieKnot serverOptions
+#ifndef USE_JSFILE
+               `Ex.finally` fillWorkaround
+  -- Run a (possibly void) workaround. It's needed for architectures/frontends
+  -- that need to perform some actions on the main thread
+  -- (not just any bound thread), e.g., newer OS X drawing with SDL2.
+  workaround <- takeMVar workaroundOnMainThreadMVar
+  workaround
+#endif
   resOrEx <- waitCatch a
   let unwrapEx e =
 #if MIN_VERSION_async(2,2,1)
diff --git a/GameDefinition/MainMenu.ascii b/GameDefinition/MainMenu.ascii
--- a/GameDefinition/MainMenu.ascii
+++ b/GameDefinition/MainMenu.ascii
@@ -1,60 +1,45 @@
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-               ... jiii;.LGEDEi.  . .   .    .   ;KEKEGLLGEDt                :tfL:,ittjjjjfffff               
-               .. tii;,iGEWDL;    .      .  .    . fEDEDGfLDDG              . Lf.;itjjjfffLLLLf               
-               .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    <allureofthestars.com>  .  ;jDEEGLGEDt      ,t :itjjffLG  WKWWWWE                
-               jtii: GEf;                                ,iGDEDGGEDt.   tt :itjjffLG  GWEWWWKE                
-               jtii: GGj;   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{.fGDEDGLDDt  tt :itjfffLG   KKKWWWEL                
-               jtti. GDj,   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{  DLDEDGLDD.tj :itjjffLD   LWDKWWWD                 
-               jtti  GDj,   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{   ELDEDGL.jj :itjjffLD   jKDEWWWEL                 
-               jtti  GGf,   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{    ELDEE.ff::itjjffLG   fKEDKWKKD                  
-               ftti  LGt:   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{     ELE.Lf: ijjjffLG   tEEDEWKWG                   
-               fjjt.,jGf,   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{     ,K:Gf,.ijjtffLD..tjEDGDKKWEE                   
-               tti;,i;GL.   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{     .:ftt itiiffLGDGDDDGLDKGKfE                    
-               Ltjt;, jLj   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{     :Lf;iitjifLLGfDDLijGEKEKDE..                   
-               Lffjif.Lft   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{  .,:LL;,ijjfffLGLGLLLGDKKEELK . .                  
-               ffjt iiGfj;  {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{...:LL;;ijffffLGDEKKKKKEEKDj.......                 
-               .Lffj:j fDi  {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{:::fL;,itjfffLGLGDEEDEKDGtK..........               
-               . Lfffifiif  {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{,.Lf;.ijjfffLL,,Lfijjt,E,::..........               
-               .  fffj:i;t;                              .tfj,.tjjfffLL;ijfLGGGGGLjt;,::......                
-               .. Lfffjjiii,                       ...  :LL;,,tjjfffLL;;;;iiiiiiii,;;;,:::::..                
-               .. LfffijijjLfi;                   ,:::,ffj,j;tjffffLG;;;;;;;;;;;;;;;;;,,:::::..               
-               ... LLLff,i;jGLLLL                   LiLt:::tjjffffLG:,,,,,,,,,;;;;,,,,::.......               
-               .Version X.X.X (frontend: xxx, engine: LambdaHack X.X.X) ,,,,,,,,,,,:::::..    .               
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
-                                                                                                              
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+... jiii;.LGEDEi.  . .   .    .   ;KEKEGLLGEDt                :tfL:,ittjjjjfffff
+.. tii;,iGEWDL;    .      .  .    . fEDEDGfLDDG              . Lf.;itjjjfffLLLLf
+.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    <allureofthestars.com>  .  ;jDEEGLGEDt      ,t :itjjffLG  WKWWWWE 
+jtii: GEf;                                ,iGDEDGGEDt.   tt :itjjffLG  GWEWWWKE 
+jtii: GGj;   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{.fGDEDGLDDt  tt :itjfffLG   KKKWWWEL 
+jtti. GDj,   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{  DLDEDGLDD.tj :itjjffLD   LWDKWWWD  
+jtti  GDj,   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{   ELDEDGL.jj :itjjffLD   jKDEWWWEL  
+jtti  GGf,   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{    ELDEE.ff::itjjffLG   fKEDKWKKD   
+ftti  LGt:   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{     ELE.Lf: ijjjffLG   tEEDEWKWG    
+fjjt.,jGf,   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{     ,K:Gf,.ijjtffLD..tjEDGDKKWEE    
+tti;,i;GL.   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{     .:ftt itiiffLGDGDDDGLDKGKfE     
+Ltjt;, jLj   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{     :Lf;iitjifLLGfDDLijGEKEKDE..    
+Lffjif.Lft   {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{  .,:LL;,ijjfffLGLGLLLGDKKEELK . .   
+ffjt iiGfj;  {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{...:LL;;ijffffLGDEKKKKKEEKDj.......  
+.Lffj:j fDi  {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{:::fL;,itjfffLGLGDEEDEKDGtK..........
+. Lfffifiif  {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{,.Lf;.ijjfffLL,,Lfijjt,E,::..........
+.  fffj:i;t;                              .tfj,.tjjfffLL;ijfLGGGGGLjt;,::...... 
+.. Lfffjjiii,                       ...  :LL;,,tjjfffLL;;;;iiiiiiii,;;;,:::::.. 
+.. LfffijijjLfi;                   ,:::,ffj,j;tjffffLG;;;;;;;;;;;;;;;;;,,:::::..
+... LLLff,i;jGLLLL                   LiLt:::tjjffffLG:,,,,,,,,,;;;;,,,,::.......
+.Version X.X.X (frontend: xxx, engine: LambdaHack X.X.X) ,,,,,,,,,,,:::::..    .
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
+                                                                                
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -89,7 +89,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 --logPriority 4 --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 2000 --automateAll --keepAutomated --gameMode battle --setDungeonRng 7 --setMainRng 7
 
 benchCrawl:
 	dist/build/Allure/Allure --dbgMsgSer --logPriority 4 --newGame 1 --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfterFrames 7000 --automateAll --keepAutomated --gameMode crawl --setDungeonRng 0 --setMainRng 0
@@ -227,11 +227,18 @@
 	cp COPYLEFT AllureOfTheStars
 	cp CREDITS AllureOfTheStars
 
-build-binary: build-binary-common
+build-binary-ubuntu: build-binary-common
 	cp AllureOfTheStarsInstall/bin/Allure 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
+
+build-binary-macosx: build-binary-common
+	cp AllureOfTheStarsInstall/bin/Allure AllureOfTheStars
+	dist/build/Allure/Allure --version > /dev/null; \
+	LH_VERSION=$$(cat ~/.Allure/stdout.txt); \
+	OS_VERSION=$$(sw_vers -productVersion); \
+	tar -czf Allure_$${LH_VERSION}_macosx-$${OS_VERSION}-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
@@ -7,8 +7,8 @@
 
 Allure of the Stars is a near-future Sci-Fi roguelike[2]
 and tactical squad game. Binaries and the game manual
-are available at the homepage[6], where you can also
-try the game out in the browser: http://allureofthestars.com/play
+are available at homepage[6], where you can also
+try the game out in the browser at http://allureofthestars.com/play.
 (It runs fastest on Chrome. Keyboard commands and savefiles
 are supported only on recent enough versions of browsers.
 Mouse should work everywhere.)
@@ -40,16 +40,19 @@
 you may prefer to use a native binary for your architecture, if it exists.
 
 Pre-compiled game binaries are available through
-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.
+the release page[11] (and, for Windows, continuously from AppVeyor[18]).
+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 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.
+(e.g., libsdl2-2.0-0, libsdl2-ttf-2.0-0 on Ubuntu).
+On Mac OS X, you need SDL2 installed, e.g.,
+from [libsdlorg](https://www.libsdl.org/download-2.0.php).
+For Windows, the SDL2 and all other needed libraries are already
+contained in the game's binary archive.
+Note that Windows binaries no longer work on Windows XP, since Cygwin
+and MSYS2 dropped support for XP.
 
 
 Screen and keyboard configuration
@@ -104,9 +107,9 @@
     cabal update
     cabal install Allure
 
-For a newer version, install a matching LambdaHack library snapshot
-from a development branch, download the game source from github[5]
-and run `cabal install` from the main directory.
+For a newer version, install a matching LambdaHack library snapshot,
+clone the game source from github[5] and run `cabal install`
+from the main directory.
 
 
 Testing and debugging
@@ -192,7 +195,7 @@
 
 
 [10]: http://github.com/LambdaHack/LambdaHack
-[11]: https://github.com/AllureOfTheStars/Allure/releases/latest
+[11]: https://github.com/AllureOfTheStars/Allure/releases
 [15]: https://github.com/ghcjs/ghcjs
 [16]: https://www.npmjs.com/package/google-closure-compiler
 [18]: https://ci.appveyor.com/project/Mikolaj/allure/build/artifacts
