anchor.diff:                    | Some(_) as x, None | None, (Some(_) as x) -> x
                     | Some(x), Some(y) -> Some(x + " and " + "y")
           }
  +    static member GetStr this = this.Str
  +    static member WithStr(this, v) = { this with Str = v }
  +    static member GetDex this = this.Dex
  +    static member WithDex(this, v) = { this with Dex = v }
  +    static member GetCon this = this.Con
  +    static member WithCon(this, v) = { this with Con = v }
  +    static member GetInt this = this.Int
  +    static member WithInt(this, v) = { this with Int = v }
  +    static member GetWis this = this.Wis
  +    static member WithWis(this, v) = { this with Wis = v }
  +    static member GetCha this = this.Cha
  +    static member WithCha(this, v) = { this with Cha = v }
       static member Empty = { Str = 0; Dex = 0; Con = 0; Int = 0; Wis = 0; Cha = 0; Special = None }
  +    static member Descriptors =
  +        [
  +            "Str", Stats.GetStr, Stats.WithStr
  +            "Dex", Stats.GetDex, Stats.WithDex
  +            "Con", Stats.GetCon, Stats.WithCon
  +            "Int", Stats.GetInt, Stats.WithInt
  +            "Wis", Stats.GetWis, Stats.WithWis
  +            "Cha", Stats.GetCha, Stats.WithCha
  +        ]
   type Race = string * Stats
   let races = [
       "Human", { Str = 1; Dex = 1; Con = 1; Int = 1; Wis = 1; Cha = 1; Special = None }
  
positive.code:             R.button [ClassName (if currentMeth = M3d6 then "selected" else ""); OnClick (fun _ -> pick M3d6)] [R.str "Roll 3d6"]
              R.button [ClassName (if currentMeth = M4d6k3 then "selected" else ""); OnClick (fun _ -> pick M4d6k3)] [R.str "Roll 4d6 drop lowest"]
              ]
  let statDisplay stats =
      let str = sprintf "Str %d\nDex %d\nCon %d\nInt %d\nWis %d\nCha %d%s" stats.Str stats.Dex stats.Con stats.Int stats.Wis stats.Cha (if stats.Special.IsSome then "\n" + stats.Special.Value else "")
      str.Split('\n') |> List.ofArray |> List.map (fun txt -> R.div [] [R.str txt])
  
  type AbstractDungeon() as this =
      inherit Component<obj, ADState>(obj())
      let init(prev) =
          let meth = if Option.isSome prev then prev.Value.statMethod else M3d6
          {
  
negative.code:         R.div [] [
              statMethodPicker this.state.statMethod (fun picked -> this.setState (init (Some { this.state with statMethod = picked })))
              R.div [] (List.append
                  (statDisplay (this.state.stats.Add(snd this.state.race)) (fun statSwapper -> this.setState { this.state with stats = (statSwapper this.state.stats) }))
                  [
                  racePicker this.state.race (fun picked -> this.setState { this.state with race = picked })
                  R.text [] [R.str descr]
  