           # hit the end of the animation
           sprite.leftover_t = absolute_t - (anim.start_t + anim.duration)
           sprite.animations.shift()
-          do_next = true
+
+          if anim.remove_on_finish
+            remove = true
+          else
+            do_next = true
 
           if anim.lerp?
             for property in anim.lerp

      x: 10
      y: 10
      width: @block*10
      height: 150
    @mapping_dims =
      x: 10
      y: @record_dims.x+@record_dims.height+@block,

    @next_record_sprite =
      x: @record_dims.x + .5 * @block + .5
      y: @record_dims.y + .5 * @block + .5
      render: (sprite) =>
        @ctx.strokeStyle = 'white'
        @ctx.scale(sprite.scale, sprite.scale)
        @renderShape('square', @block*.625)
      scale: 1
      animations: []
    @sprites.push(@next_record_sprite)
  advanceNextRecordSprite: (count) ->
    width = @record_dims.width/@block
    x = @record_dims.x + (.5 + @record_sprites.length%width) * @block + .5
    y = @record_dims.y + (.5 + @record_sprites.length//width) * @block + .5

    if @record_sprites.length%width == 0
      # avoid diagonal flight
      @next_record_sprite.animations.push(
        duration: 75
        lerp: [
          {name: 'x', v1: @record_dims.x + .5*@block + @record_dims.width + .5}
          {name: 'scale', v0: 1, v1: 0}]
      )
      @next_record_sprite.animations.push(
        duration: 50
        set: [ {name: 'y', v: y}, {name: 'scale', v: 1} ]
        lerp: [ {name: 'x', v0: @record_dims.x - @block, v1: x} ]
      )

    else
      @next_record_sprite.animations.push(
        duration: 75
      )
      @next_record_sprite.animations.push(
        duration: 50
        lerp: [
          {name: 'x', v1: x},
          {name: 'y', v1: y}
        ]
      )


  addRecordSprite: (dir) ->
    height = @record_dims.height/@block
    width = @record_dims.width/@block

    sprite =
      x: @record_dims.x + (.5 + @record_sprites.length) * @block + .5
      y: @record_dims.y + .5 * @block + .5
