diff --git a/Allure.cabal b/Allure.cabal
--- a/Allure.cabal
+++ b/Allure.cabal
@@ -1,9 +1,9 @@
 cabal-version: >= 1.10
 name:          Allure
-version:       0.4.3
+version:       0.4.4
 license:       OtherLicense
 license-file:  LICENSE
-tested-with:   GHC == 7.2.2, GHC == 7.4
+tested-with:   GHC == 7.2.2, GHC == 7.4.1
 data-files:    LICENSE, CREDITS, PLAYING.md, README.md,
                config.default, config.bot, scores
 author:        Andres Loeh, Mikolaj Konarski and others
@@ -13,6 +13,9 @@
                The game is barely fun at this stage and not yet
                really Sci-Fi. See the wiki for design notes and contribute.
                .
+               New in this release are missiles flying for three turns
+               (by an old kosmikus' idea), visual feedback for targeting
+               and animations of combat and individual monster moves.
                Long term goals are high replayability and auto-balancing
                through procedural content generation and persistent content
                modification based on player behaviour.
@@ -41,7 +44,7 @@
                    ConfigDefault
   hs-source-dirs:  src
   other-modules:   Paths_Allure
-  build-depends:   LambdaHack >= 0.2.0   && < 0.2.1,
+  build-depends:   LambdaHack >= 0.2.1   && < 0.2.2,
                    template-haskell >= 2.6 && < 3,
                    ConfigFile >= 1.1.1   && < 2,
                    array      >= 0.3.0.3 && < 1,
@@ -60,6 +63,6 @@
                       BangPatterns, RecordWildCards, NamedFieldPuns
   other-extensions: CPP, QuasiQuotes
   ghc-options:     -Wall -fwarn-orphans -fwarn-tabs -fwarn-incomplete-uni-patterns -fwarn-incomplete-record-updates -fwarn-monomorphism-restriction -fwarn-unrecognised-pragmas
-  ghc-options:     -fno-warn-auto-orphans -fno-warn-implicit-prelude -fno-warn-unused-do-bind
+  ghc-options:     -fno-warn-auto-orphans -fno-warn-implicit-prelude
   ghc-options:     -fno-ignore-asserts -funbox-strict-fields
-  ghc-options:     -threaded
+  ghc-options:     -threaded -with-rtsopts=-C0.005
diff --git a/PLAYING.md b/PLAYING.md
--- a/PLAYING.md
+++ b/PLAYING.md
@@ -55,11 +55,8 @@
                 /|\       /|\
                1 2 3     b j n
 
-Shift and a movement key make the hero run in the indicated direction,
-until anything of interest is spotted. '5' and '.' skip a turn.
-(Note that If you are using the curses or vty frontends,
-numerical keypad may not work correctly depending on the versions
-of curses, terminfo and terminal emulators. Vi keys should work regardless.)
+SHIFT (or CTRL) and a movement key make the hero run in the indicated
+direction, until anything of interest is spotted. '5' and '.' skip a turn.
 Melee, searching for secret doors and opening closed doors can be done
 by bumping into a monster, a wall and a door, respectively.
 
@@ -67,22 +64,22 @@
 are specialized versions of 'a' and 'p', offering narrower default item choice.
 The commands that take player time are marked with a *.
 
-               key    command
-               <      ascend a level*
-               >      descend a level*
-               ?      display help
-               Q      quit without saving
-               X      save and exit the game
-               a      apply a consumable*
-               c      close a door*
-               d      drop an object*
-               g      get an object*
-               i      display inventory
-               p      project a projectile*
-               q      quaff a drink*
-               r      read a comm*
-               t      throw a missile*
-               z      zap a mechanism*
+               key     command
+               <       ascend a level*
+               >       descend a level*
+               ?       display help
+               Q       quit without saving
+               X       save and exit the game
+               a       apply a consumable*
+               c       close a door*
+               d       drop an object*
+               g       get an object*
+               i       display inventory
+               p       project a projectile*
+               q       quaff a drink*
+               r       read a comm*
+               t       throw a missile*
+               z       zap a mechanism*
 
 To make a ranged attack, you need to set your target first, using
 targeting mode. Note that the target, for the few commands that require any,
@@ -95,28 +92,29 @@
 than the selected hero). The targeting commands and all the less used
 commands are listed below. None of them takes hero time.
 
-               key    command
-               ESC    cancel action
-               RET    accept choice
-               SPACE  clear messages
-               TAB    cycle among heroes on level
-               *      target monster
-               /      target location
-               D      dump current configuration
-               P      display previous messages
-               V      display game version
-               [      target next shallower level
-               ]      target next deeper level
-               {      target 10 levels shallower
-               }      target 10 levels deeper
-               0--9   select a hero anywhere in the spaceship (gtk only)
+               key     command
+               ESC     cancel action
+               RET     accept choice
+               SPACE   clear messages
+               TAB     cycle among heroes on level
+               *       target monster
+               /       target location
+               D       dump current configuration
+               P       display previous messages
+               V       display game version
+               [       target next shallower level
+               ]       target next deeper level
+               {       target 10 levels shallower
+               }       target 10 levels deeper
+               0--9    select a hero anywhere in the spaceship
 
-There are also some debug and cheat keys. Use at your own peril!
+There are also some debug and cheat keys, all entered with the CTRL
+key modifier. Use at your own peril!
 
-               key    command
-               O      toggle "omniscience"
-               I      inform about level meta-data
-               R      rotate display modes
+               key     command
+               CTRL-o  toggle "omniscience"
+               CTRL-i  inform about level meta-data
+               CTRL-r  rotate vision modes (effective next turn)
 
 
 Monsters
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -23,12 +23,21 @@
 and run 'cabal install' from the main directory.
 
 
-Compatibility note
-------------------
+Compatibility notes
+-------------------
 
 The current code was tested with GHC 7.2.2 and several pre-release versions
 of GHC 7.4. A [few tweaks] [7] are needed to compile with 7.0
 and some more are needed for 6.12.
+
+If you are using the curses or vty frontends,
+numerical keypad may not work correctly depending on the versions
+of curses, terminfo and terminal emulators.
+Selecting heroes via number keys or SHIFT-keypad keys is disabled
+with curses, because CTRL-keypad for running does not work there,
+so the numbers produced by the keypad have to be used. With vty on xterm,
+CTRL-direction keys seem to work OK, but on rxvt they do not.
+Vi keys (ykuhlbjn) should work everywhere regardless. Gtk works fine, too.
 
 
 Further information
diff --git a/config.default b/config.default
--- a/config.default
+++ b/config.default
@@ -22,18 +22,20 @@
 ; braceright:   TgtAscend (-10)
 ; slash: TgtFloor
 ; asterisk: TgtEnemy
+; plus: EpsIncr True
+; minus: EpsIncr False
 ; Tab: HeroCycle
 ; ;
 ; ; Items.
 ; g: Pickup
 ; d: Drop
 ; i: Inventory
-; a: Apply { verb = "apply", object = "consumable", syms = "!?" }
-; p: Project { verb = "project", object = "projectile", syms = "/|" }
+; a: Apply { verb = "apply", object = "consumable", syms = "!?,_~" }
+; p: Project { verb = "project", object = "missile", syms = "-}{" }
 ; q: Apply { verb = "quaff", object = "drink", syms = "!" }
-; r: Apply { verb = "read", object = "comm", syms = "?" }
-; z: Project { verb = "zap", object = "mechanism", syms = "/" }
-; t: Project { verb = "throw", object = "missile", syms = "|" }
+; r: Apply { verb = "read", object = "tablet", syms = "?" }
+; z: Project { verb = "zap", object = "mechanism", syms = "-" }
+; t: Project { verb = "throw", object = "projectile", syms = "}{" }
 ; ;
 ; ; Saving or ending the game.
 ; X: GameSave
@@ -95,7 +97,7 @@
 ; period: KP_Begin
 
 ; [monsters]
-; smellTimeout: 1000
+; smellTimeout: 100
 
 ; [ui]
 ; font: Terminus,Monospace normal normal normal normal 12
diff --git a/scores b/scores
Binary files a/scores and b/scores differ
diff --git a/src/Content/ActorKind.hs b/src/Content/ActorKind.hs
--- a/src/Content/ActorKind.hs
+++ b/src/Content/ActorKind.hs
@@ -10,6 +10,7 @@
 import qualified Game.LambdaHack.Content as Content
 import Game.LambdaHack.Content.ActorKind
 import Game.LambdaHack.Random
+import Game.LambdaHack.Time
 
 cdefs :: Content.CDefs ActorKind
 cdefs = Content.CDefs
@@ -18,9 +19,9 @@
   , getFreq = afreq
   , validate = avalidate
   , content =
-      [hero, eye, fastEye, nose]
+      [hero, projectile, eye, fastEye, nose]
   }
-hero,        eye, fastEye, nose :: ActorKind
+hero,        projectile, eye, fastEye, nose :: ActorKind
 
 hero = ActorKind
   { asymbol = '@'
@@ -28,24 +29,37 @@
   , afreq   = [("hero", 1)]  -- Does not appear randomly in the dungeon.
   , acolor  = BrWhite  -- Heroes white, monsters colorful.
   , ahp     = RollDice 60 1
-  , aspeed  = 10
+  , aspeed  = toSpeed 2
   , asight  = True
   , asmell  = False
   , aiq     = 13  -- Can see hidden doors, when he is under alien control.
-  , aregen  = 5000
+  , aregen  = 500
   }
 
+projectile = ActorKind  -- includes homing missiles
+  { asymbol = '*'
+  , aname   = "projectile"
+  , afreq   = [("projectile", 1)]  -- Does not appear randomly in the dungeon.
+  , acolor  = BrWhite
+  , ahp     = RollDice 0 0
+  , aspeed  = toSpeed 0
+  , asight  = False
+  , asmell  = False
+  , aiq     = 0
+  , aregen  = maxBound
+  }
+
 eye = ActorKind
   { asymbol = 'r'
   , aname   = "deranged household robot"
   , afreq   = [("monster", 60), ("summon", 50)]
   , acolor  = BrYellow
   , ahp     = RollDice 3 4
-  , aspeed  = 10
+  , aspeed  = toSpeed 2
   , asight  = True
   , asmell  = False
   , aiq     = 8
-  , aregen  = 1000
+  , aregen  = 100
   }
 fastEye = ActorKind
   { asymbol = 'm'
@@ -53,11 +67,11 @@
   , afreq   = [("monster", 15)]
   , acolor  = BrMagenta
   , ahp     = RollDice 1 4
-  , aspeed  = 5
+  , aspeed  = toSpeed 4
   , asight  = True
   , asmell  = False
   , aiq     = 12
-  , aregen  = 50  -- Regenerates fast (at max HP most of the time!).
+  , aregen  = 5  -- Regenerates fast (at max HP most of the time!).
   }
 nose = ActorKind
   { asymbol = 'h'
@@ -65,9 +79,9 @@
   , afreq   = [("monster", 20), ("summon", 100)]
   , acolor  = Green
   , ahp     = RollDice 7 2
-  , aspeed  = 11
+  , aspeed  = toSpeed 1.8
   , asight  = False
   , asmell  = True
   , aiq     = 0
-  , aregen  = 1000
+  , aregen  = 100
   }
diff --git a/src/Content/CaveKind.hs b/src/Content/CaveKind.hs
--- a/src/Content/CaveKind.hs
+++ b/src/Content/CaveKind.hs
@@ -41,8 +41,12 @@
   , copenChance   = 1%10
   , chiddenChance = 1%5
   , citemNum      = RollDice 5 2
-  , cdefTile      = "fillerWall"
-  , ccorTile      = "darkCorridor"
+  , cdefaultTile    = "fillerWall"
+  , ccorridorTile   = "darkCorridor"
+  , cfillerTile     = "fillerWall"
+  , cdarkLegendTile = "darkLegend"
+  , clitLegendTile  = "litLegend"
+  , chiddenTile     = "hidden"
   }
 arena = rogue
   { csymbol       = 'A'
@@ -54,8 +58,8 @@
   , cvoidChance   = 1%3
   , cnonVoidMin   = 2
   , citemNum      = RollDice 3 2  -- few rooms
-  , cdefTile      = "floorArenaLit"
-  , ccorTile      = "path"
+  , cdefaultTile  = "floorArenaLit"
+  , ccorridorTile = "path"
   }
 empty = rogue
   { csymbol       = '.'
@@ -69,8 +73,8 @@
   , cnonVoidMin   = 1
   , cminStairDist = 50
   , citemNum      = RollDice 6 2  -- whole floor strewn with treasure
-  , cdefTile      = "floorRoomLit"
-  , ccorTile      = "floorRoomLit"
+  , cdefaultTile  = "floorRoomLit"
+  , ccorridorTile = "floorRoomLit"
   }
 noise = rogue
   { csymbol       = '!'
@@ -82,6 +86,6 @@
   , cvoidChance   = 0
   , cnonVoidMin   = 0
   , citemNum      = RollDice 3 2  -- few rooms
-  , cdefTile      = "noiseSet"
-  , ccorTile      = "path"
+  , cdefaultTile  = "noiseSet"
+  , ccorridorTile = "path"
   }
diff --git a/src/Content/ItemKind.hs b/src/Content/ItemKind.hs
--- a/src/Content/ItemKind.hs
+++ b/src/Content/ItemKind.hs
@@ -6,6 +6,8 @@
 -- | Weapons and treasure for Allure of the Stars.
 module Content.ItemKind ( cdefs ) where
 
+import qualified Data.List as L
+
 import Game.LambdaHack.Color
 import qualified Game.LambdaHack.Content as Content
 import Game.LambdaHack.Effect
@@ -20,14 +22,37 @@
   , getFreq = ifreq
   , validate = ivalidate
   , content =
-      [necklace, dart, gem1, gem2, gem3, gold, javelin, potion1, potion2, potion3, ring, scroll1, scroll2, scroll3, sword, wand, fist, foot, tentacle, weight]
+      [necklace, dart, gem1, gem2, gem3, gold, javelin, kitchenKnife, potion1, potion2, potion3, ring, scroll1, scroll2, scroll3, sword, wand, fist, foot, tentacle, weight]
   }
-necklace,        dart, gem1, gem2, gem3, gold, javelin, potion1, potion2, potion3, ring, scroll1, scroll2, scroll3, sword, wand, fist, foot, tentacle, weight :: ItemKind
+necklace,        dart, gem1, gem2, gem3, gold, javelin, kitchenKnife, potion1, potion2, potion3, ring, scroll1, scroll2, scroll3, sword, wand, fist, foot, tentacle, weight :: ItemKind
 
 gem, potion, scroll :: ItemKind  -- generic templates
 
 -- rollDeep (aDb, xDy) = rollDice aDb + lvl * rollDice xDy / depth
 
+{- Item group symbols (from Angband, only as an informal convention for now):
+
+! potion, flask, concoction, bottle, jar, vial, canister
+? scroll, book, note, tablet, remote
+, food
+- magical wand, magical rod, transmitter, pistol, rifle
+_ magical staff, scanner
+= ring
+" necklace
+$ gold, gem
+~ light, tool
+/ polearm
+| edged weapon
+\ hafted weapon
+} launcher
+{ projectile
+( clothes
+[ torso armour
+] misc. armour
+) shield
+
+-}
+
 necklace = ItemKind
   { isymbol  = '"'
   , iname    = "necklace"
@@ -37,29 +62,35 @@
   , icount   = intToDeep 1
   , ipower   = (RollDice 2 3, RollDice 1 10)
   , iverbApply   = "tear down"
-  , iverbProject = "throw"
+  , iverbProject = "cast"
+  , iweight  = 30
+  , itoThrow = -50  -- not dense enough
   }
 dart = ItemKind
-  { isymbol  = '|'
+  { isymbol  = '{'
   , iname    = "billiard ball"
   , ifreq    = [("dng", 30)]
-  , iflavour = zipPlain [Cyan]
+  , iflavour = zipPlain [BrWhite]
   , ieffect  = Wound (RollDice 1 1)
   , icount   = (RollDice 3 3, RollDice 0 0)
   , ipower   = intToDeep 0
-  , iverbApply   = "snap"
-  , iverbProject = "throw"
+  , iverbApply   = "splinter"
+  , iverbProject = "hurl"
+  , iweight  = 50
+  , itoThrow = 0  -- a cheap dart
   }
 gem = ItemKind
-  { isymbol  = '*'
+  { isymbol  = '$'
   , iname    = "precious gem"
   , ifreq    = [("dng", 20)]       -- x3, but rare on shallow levels
-  , iflavour = zipPlain brightCol  -- natural, so not fancy
+  , iflavour = zipPlain $ L.delete BrYellow brightCol  -- natural, so not fancy
   , ieffect  = NoEffect
   , icount   = intToDeep 0
   , ipower   = intToDeep 0
   , iverbApply   = "crush"
-  , iverbProject = "throw"
+  , iverbProject = "toss"
+  , iweight  = 50
+  , itoThrow = 0
   }
 gem1 = gem
   { icount   = (RollDice 0 0, RollDice 1 1)  -- appears on max depth
@@ -79,22 +110,39 @@
   , icount   = (RollDice 0 0, RollDice 10 10)
   , ipower   = intToDeep 0
   , iverbApply   = "grind"
-  , iverbProject = "throw"
+  , iverbProject = "toss"
+  , iweight  = 31
+  , itoThrow = 0
   }
 javelin = ItemKind
-  { isymbol  = '|'
-  , iname    = "kitchen knife"
+  { isymbol  = '{'
+  , iname    = "javelin"
   , ifreq    = [("dng", 30)]
   , iflavour = zipPlain [Brown]
   , ieffect  = Wound (RollDice 1 2)
-  , icount   = (RollDice 0 0, RollDice 2 2)
+  , icount   = (RollDice 0 0, RollDice 1 1)
   , ipower   = (RollDice 1 1, RollDice 2 2)
   , iverbApply   = "break up"
+  , iverbProject = "hurl"
+  , iweight  = 2000
+  , itoThrow = 0  -- cheap but deadly
+  }
+kitchenKnife = ItemKind
+  { isymbol  = '{'
+  , iname    = "kitchen knife"
+  , ifreq    = [("dng", 30)]
+  , iflavour = zipPlain [BrCyan]
+  , ieffect  = Wound (RollDice 1 1)
+  , icount   = (RollDice 0 0, RollDice 1 2)
+  , ipower   = (RollDice 0 0, RollDice 1 2)
+  , iverbApply   = "bend"
   , iverbProject = "throw"
+  , iweight  = 200
+  , itoThrow = -50  -- too flexible and the handle causes air resistance
   }
 potion = ItemKind
   { isymbol  = '!'
-  , iname    = "concoction"
+  , iname    = "vial"
   , ifreq    = [("dng", 15)]
   , iflavour = zipFancy stdCol
   , ieffect  = NoEffect
@@ -102,6 +150,8 @@
   , ipower   = intToDeep 0
   , iverbApply   = "gulp down"
   , iverbProject = "lob"
+  , iweight  = 200
+  , itoThrow = -50  -- oily, bad grip
   }
 potion1 = potion
   { ifreq    = [("dng", 5)]
@@ -125,18 +175,22 @@
   , icount   = intToDeep 1
   , ipower   = (RollDice 1 6, RollDice 3 2)
   , iverbApply   = "squeeze down"
-  , iverbProject = "throw"
+  , iverbProject = "toss"
+  , iweight  = 15
+  , itoThrow = 0
   }
 scroll = ItemKind
   { isymbol  = '?'
-  , iname    = "comm tablet"
+  , iname    = "tablet"
   , ifreq    = [("dng", 6)]
   , iflavour = zipFancy darkCol  -- arcane and old
   , ieffect  = NoEffect
   , icount   = intToDeep 1
   , ipower   = intToDeep 0
   , iverbApply   = "dial"
-  , iverbProject = "throw"
+  , iverbProject = "lob"
+  , iweight  = 700
+  , itoThrow = -25  -- bad grip
   }
 scroll1 = scroll
   { ieffect  = SummonFriend
@@ -149,19 +203,21 @@
   { ieffect  = Descend
   }
 sword = ItemKind
-  { isymbol  = ')'
+  { isymbol  = '/'
   , iname    = "sharpened pipe"
   , ifreq    = [("dng", 60)]
-  , iflavour = zipPlain [BrCyan]
+  , iflavour = zipPlain [Cyan]
   , ieffect  = Wound (RollDice 3 1)
   , icount   = intToDeep 1
   , ipower   = (RollDice 1 2, RollDice 4 2)
   , iverbApply   = "hit"
   , iverbProject = "heave"
+  , iweight  = 3000
+  , itoThrow = -25  -- bad grip
   }
 wand = ItemKind
-  { isymbol  = '/'
-  , iname    = "transmitter"
+  { isymbol  = '-'
+  , iname    = "injector"
   , ifreq    = [("dng", 15)]
   , iflavour = zipFancy [BrRed]
   , ieffect  = Dominate
@@ -169,6 +225,8 @@
   , ipower   = intToDeep 0
   , iverbApply   = "snap"
   , iverbProject = "zap"
+  , iweight  = 300
+  , itoThrow = 25  -- jet
   }
 fist = sword
   { isymbol  = '@'
diff --git a/src/Content/RuleKind.hs b/src/Content/RuleKind.hs
--- a/src/Content/RuleKind.hs
+++ b/src/Content/RuleKind.hs
@@ -37,4 +37,6 @@
   , rtitle         = "Allure of the Stars"
   , rpathsDataFile = Self.getDataFileName
   , rpathsVersion  = Self.version
+  , ritemMelee     = "/|\\"
+  , ritemProject   = "!?,-~}{"
   }
