diff --git a/app/lib/LoadingScreen.coffee b/app/lib/LoadingScreen.coffee
index b3993a435..aff6f53e6 100644
--- a/app/lib/LoadingScreen.coffee
+++ b/app/lib/LoadingScreen.coffee
@@ -96,4 +96,4 @@ module.exports = class LoadingScreen extends CocoClass
   
   destroy: ->
     @stage.canvas = null
-    super() 
\ No newline at end of file
+    super()
\ No newline at end of file
diff --git a/app/lib/surface/CastingScreen.coffee b/app/lib/surface/CastingScreen.coffee
new file mode 100644
index 000000000..8b00a1df8
--- /dev/null
+++ b/app/lib/surface/CastingScreen.coffee
@@ -0,0 +1,48 @@
+CocoClass = require 'lib/CocoClass'
+
+module.exports = class CastingScreen extends CocoClass
+  subscriptions:
+    'tome:cast-spells': 'onCastingBegins'
+    'god:new-world-created': 'onCastingEnds'
+
+  constructor: (options) ->
+    super()
+    options ?= {}
+    @camera = options.camera
+    @layer = options.layer
+    console.error @toString(), "needs a camera." unless @camera
+    console.error @toString(), "needs a layer." unless @layer
+    @build()
+    
+  onCastingBegins: ->
+    @show()
+    
+  onCastingEnds: ->
+    @hide()
+
+  toString: -> "<CastingScreen>"
+
+  build: ->
+    @dimLayer = new createjs.Container()
+    @dimLayer.mouseEnabled = @dimLayer.mouseChildren = false
+    @dimLayer.layerIndex = -11
+    @dimLayer.addChild @dimScreen = new createjs.Shape()
+    @dimScreen.graphics.beginFill("rgba(0,0,0,0.5)").rect 0, 0, @camera.canvasWidth, @camera.canvasHeight
+    @dimLayer.cache 0, 0, @camera.canvasWidth, @camera.canvasHeight
+    @dimLayer.alpha = 0
+    @layer.addChild @dimLayer
+
+  show: ->
+    return if @on
+    @on = true
+    
+    @dimLayer.alpha = 0
+    createjs.Tween.removeTweens @dimLayer
+    createjs.Tween.get(@dimLayer).to({alpha:1}, 500)
+
+  hide: ->
+    return unless @on
+    @on = false
+    
+    createjs.Tween.removeTweens @dimLayer
+    createjs.Tween.get(@dimLayer).to({alpha:0}, 500)
diff --git a/app/lib/surface/CocoSprite.coffee b/app/lib/surface/CocoSprite.coffee
index 2565fe99c..28447644e 100644
--- a/app/lib/surface/CocoSprite.coffee
+++ b/app/lib/surface/CocoSprite.coffee
@@ -157,6 +157,14 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
   show: ->
     @hiding = false
     @updateAlpha()
+    
+  stop: ->
+    @imageObject?.stop?()
+    mark.stop() for name, mark of @marks
+    
+  play: ->
+    @imageObject?.play?()
+    mark.play() for name, mark of @marks
 
   update: ->
     # Gets the sprite to reflect what the current state of the thangs and surface are
diff --git a/app/lib/surface/Mark.coffee b/app/lib/surface/Mark.coffee
index 313531ef1..b0ba2ec78 100644
--- a/app/lib/surface/Mark.coffee
+++ b/app/lib/surface/Mark.coffee
@@ -174,3 +174,7 @@ module.exports = class Mark extends CocoClass
     @mark.scaleX = @mark.scaleY = Math.min 1, scale
     if @name in ['selection', 'target', 'repair']
       @mark.scaleY *= @camera.y2x  # code applies perspective
+
+  stop: -> @markSprite?.stop()
+  play: -> @markSprite?.play()
+
diff --git a/app/lib/surface/SpriteBoss.coffee b/app/lib/surface/SpriteBoss.coffee
index f6acd4da2..7358b25a9 100644
--- a/app/lib/surface/SpriteBoss.coffee
+++ b/app/lib/surface/SpriteBoss.coffee
@@ -20,6 +20,7 @@ module.exports = class SpriteBoss extends CocoClass
     'level-lock-select': 'onSetLockSelect'
     'level:restarted': 'onLevelRestarted'
     'god:new-world-created': 'onNewWorld'
+    'tome:cast-spells': 'onCastSpells'
 
   constructor: (@options) ->
     super()
@@ -205,6 +206,14 @@ module.exports = class SpriteBoss extends CocoClass
 
   onNewWorld: (e) ->
     @world = @options.world = e.world
+    sprite.imageObject.play() for thangID, sprite of @sprites
+    @selectionMark?.play()
+    @targetMark?.play()
+    
+  onCastSpells: ->
+    sprite.imageObject.stop() for thangID, sprite of @sprites
+    @selectionMark?.stop()
+    @targetMark?.stop()
 
   # Selection
 
diff --git a/app/lib/surface/Surface.coffee b/app/lib/surface/Surface.coffee
index 0b558b9a1..ee435a149 100644
--- a/app/lib/surface/Surface.coffee
+++ b/app/lib/surface/Surface.coffee
@@ -8,6 +8,7 @@ CameraBorder = require './CameraBorder'
 Layer = require './Layer'
 Letterbox = require './Letterbox'
 Dimmer = require './Dimmer'
+CastingScreen = require './CastingScreen'
 DebugDisplay = require './DebugDisplay'
 CoordinateDisplay = require './CoordinateDisplay'
 SpriteBoss = require './SpriteBoss'
@@ -88,6 +89,7 @@ module.exports = Surface = class Surface extends CocoClass
     @spriteBoss.destroy()
     @chooser?.destroy()
     @dimmer?.destroy()
+    @castingScreen?.destroy()
     @stage.clear()
     @musicPlayer?.destroy()
     @stage.removeAllChildren()
@@ -299,11 +301,18 @@ module.exports = Surface = class Surface extends CocoClass
     @lastFrame = @currentFrame
 
   onCastSpells: (event) ->
+    @casting = true
+    @wasPlayingWhenCastingBegan = @playing
+    Backbone.Mediator.publish 'level-set-playing', { playing: false }
+    
     createjs.Tween.removeTweens(@surfaceLayer)
     createjs.Tween.get(@surfaceLayer).to({alpha:0.9}, 1000, createjs.Ease.getPowOut(4.0))
 
   onNewWorld: (event) ->
     return unless event.world.name is @world.name
+    @casting = false
+    Backbone.Mediator.publish 'level-set-playing', { playing: @wasPlayingWhenCastingBegan }
+    
     fastForwardTo = null
     if @playing
       fastForwardTo = Math.min event.world.firstChangedFrame, @currentFrame
@@ -340,6 +349,7 @@ module.exports = Surface = class Surface extends CocoClass
     @surfaceLayer.addChild @cameraBorder = new CameraBorder bounds: @camera.bounds
     @screenLayer.addChild new Letterbox canvasWidth: canvasWidth, canvasHeight: canvasHeight
     @spriteBoss = new SpriteBoss camera: @camera, surfaceLayer: @surfaceLayer, surfaceTextLayer: @surfaceTextLayer, world: @world, thangTypes: @options.thangTypes, choosing: @options.choosing, navigateToSelection: @options.navigateToSelection, showInvisible: @options.showInvisible
+    @castingScreen ?= new CastingScreen camera: @camera, layer: @screenLayer
     @stage.enableMouseOver(10)
     @stage.addEventListener 'stagemousemove', @onMouseMove
     @stage.addEventListener 'stagemousedown', @onMouseDown
@@ -497,7 +507,7 @@ module.exports = Surface = class Surface extends CocoClass
   updateState: (frameChanged) ->
     # world state must have been restored in @updateSpriteSounds
     @camera.updateZoom()
-    @spriteBoss.update frameChanged
+    @spriteBoss.update frameChanged unless @casting
     @dimmer?.setSprites @spriteBoss.sprites
 
   drawCurrentFrame: (e) ->
@@ -508,6 +518,7 @@ module.exports = Surface = class Surface extends CocoClass
 
   updatePaths: ->
     return unless @options.paths
+    return if @casting
     @hidePaths()
     selectedThang = @spriteBoss.selectedSprite?.thang
     return if @world.showPaths is 'never'