anchor.diff:                           Entity.ClickEvent ==> msg (fieldMsg selection)])
   
           override this.Channel (_, field) =
  -            [Simulants.FieldAvatar.Avatar.ChangeEvent =|> fun evt -> msg (UpdateAvatar (evt.Data.Value :?> Avatar))
  +            [field.SelectEvent => cmd PlayFieldSong
  +             Simulants.FieldAvatar.Avatar.ChangeEvent =|> fun evt -> msg (UpdateAvatar (evt.Data.Value :?> Avatar))
                field.UpdateEvent => msg UpdateDialog
                field.UpdateEvent => msg UpdatePortal
                field.UpdateEvent => msg UpdateSensor
  
positive.code:         | Interact
  
      type [<NoComparison>] FieldCommand =
          | PlaySound of int64 * single * Sound AssetTag
          | PlaySong of int * single * Song AssetTag
          | FadeOutSong of int
          | MoveAvatar of Vector2
          | UpdateEye
          | Nop
  
      type Screen with
  
negative.code:                     | None -> just field
                  | Some dialog -> interactDialog dialog field
  
          override this.Command (field, command, _, world) =
  
              match command with
              | UpdateEye ->
                  let world = World.setEyeCenter field.Avatar.Center world
                  just world
  
              | PlayFieldSong ->
                  match data.Value.Fields.TryGetValue field.FieldType with
                  | (true, fieldData) ->
                      match fieldData.FieldSongOpt with
                      | Some fieldSong -> withCmd (PlaySong (Constants.Audio.DefaultFadeOutMs, Constants.Audio.DefaultSongVolume, fieldSong)) world
                      | None -> just world
                  | (false, _) -> just world
  
              | MoveAvatar position ->
                  let positionOffset = position - Constants.Field.AvatarBottomInset
  