anchor.diff:      revealed: (int * int) Set
       eventGen: (int * int) -> string option
       messages: (int*int*string) list
  +    goal: int * int
  +    points: int
  +    steps: int
     }
   
   let rec newReveals maze direction position =
  
positive.code:   R.div [ClassName "shell"] [
      R.div [] [
        R.div [] [
          R.h2 [] [R.str "Use the arrow keys to move around the dungeon until you find something interesting"]
          ]
        R.form [] [
          R.label [HtmlFor "algorithmSelector"] [R.str "Maze generation algorithm"]
          R.select [Id "algorithmSelector"; ValueStr (Algorithm.Render model.algorithm); OnSelect(fun e -> debugmenow e); OnChange(fun e -> dispatch <| SwitchAlgorithm((((e.target |> unbox<obj>)?value) |> unbox string |> Algorithm.Parse)))] (
  
negative.code:     let maze = model.mazeGenerator()
      let xdim, ydim = Maze.dimensions maze
      let revealed = [Left;Right;Up;Down] |> List.collect (fun d -> newReveals maze d (0,0)) |> Set.ofList
      let r = new Random()
      let goal =
        match (r.Next(xdim), r.Next(ydim)) with
        | (0,0) -> (xdim-1, ydim-1) // never want goal in start position, so just pick opposite corner in this rare case. Could recur instead but why bother?
        | x,y -> x,y
      { model with maze = Some(maze); currentPosition = (0,0); messages = []; revealed = revealed; eventGen = eventsFor maze (xdim * ydim / 5); goal = goal; steps = 0 }, []
    | Move(dir) ->
      let boundsCheck maze (x, y) =
        let w, h = Maze.dimensions maze
  