anchor.diff:              let obs = observe TickEventAddress characterAddress |> until (DeselectEventAddress ->>- gameplayAddress)
               snd <| runDesyncAssumingCascade desync obs world
   
  -        static let runCharacterAction characterAddress gameplayAddress newActionDescriptor world =
  +        static let runCharacterAction characterAddress newActionDescriptor gameplayAddress world =
               // NOTE: currently just implements attack
               let desync = desync {
                   do! updateEntity characterAddress (Entity.setActivityState <| Action newActionDescriptor)
  
positive.code:                 | NoTurn -> NoTurn
              else NoTurn
  
          static let determinePlayerTurnFromDetailNavigation gameplayAddress direction world =
              let (field, player, enemies) = getParticipants gameplayAddress world
              if not <| anyTurnsInProgress2 player enemies then
                  let occupationMapWithEnemies = OccupationMap.makeFromFieldTilesAndCharacters field.FieldMapNp.FieldTiles enemies
                  determineCharacterTurnFromDirection direction occupationMapWithEnemies player enemies
              else NoTurn
  
          static let determinePlayerTurnFromInput gameplayAddress playerInput world =
              match playerInput with
              | TouchInput touchPosition -> determinePlayerTurnFromTouch gameplayAddress touchPosition world
              | DetailInput direction -> determinePlayerTurnFromDetailNavigation gameplayAddress direction world
              | NoInput -> NoTurn
  
          static let determinePlayerTurn gameplayAddress world =
  
negative.code:                 enemies
                  []
  
          static let runCharacterReaction initiatorAddress actionDescriptor gameplayAddress world =
              // TODO: implement animations
              let initiator = World.getEntity initiatorAddress world
              if actionDescriptor.ActionTicks = ActionTicksMax then
                  let reactor = getCharacterInDirection initiator.Position initiator.CharacterAnimationState.Direction gameplayAddress world
                  let reactorAddress = getCharacterAddress reactor gameplayAddress
                  let reactorDamage = initiator.PowerBuff * 5.0f - reactor.ShieldBuff |> int
                  let reactorHitPoints = reactor.HitPoints - reactorDamage
                  let reactor = Entity.setHitPoints reactorHitPoints reactor
  