anchor.diff:                      | 0L -> (model, [SpecialCharacter1 (sourceIndex, targetIndex, specialType)])
                       | 40L -> (model, [SpecialCharacter2 (sourceIndex, targetIndex, specialType)])
                       | 55L -> (model, [SpecialCharacter3 (sourceIndex, targetIndex, specialType)])
  -                    | _ when
  -                        CharacterModel.getAnimationFinished time source &&
  -                        CharacterModel.getAnimationFinished time target ->
  -                        // TODO: extract this to SpecialCharacter4?
  -                        let target = BattleModel.getCharacter targetIndex model
  -                        if target.IsHealthy then
  -                            let model = BattleModel.updateCurrentCommandOpt (constant None) model
  -                            (model, [PoiseCharacter sourceIndex; PoiseCharacter targetIndex])
  -                        else
  -                            let woundCommand = CurrentCommand.make time (ActionCommand.make Wound sourceIndex (Some targetIndex))
  -                            let model = BattleModel.updateCurrentCommandOpt (constant (Some woundCommand)) model
  -                            (model, [PoiseCharacter sourceIndex])
  -                    | _ -> (model, [])
  -                let model =
  -                    if Simulants.BattleSpecialMovement.GetExists world then
  -                        let tags = Simulants.BattleSpecialMovement.GetEffectTags world
  -                        match Map.tryFind "Tag" tags with
  -                        | Some tag -> BattleModel.updateCharacter (CharacterModel.updateCenter (constant tag.Position)) sourceIndex model
  -                        | None -> model
  -                    else model
  +                    | _ ->
  +                        if CharacterModel.getAnimationFinished time source && CharacterModel.getAnimationFinished time target
  +                        then (model, [SpecialCharacter4 (sourceIndex, targetIndex, specialType)])
  +                        else (model, [])
  +                let (model, msgs) = (model, msgs @ [SpecialCharacterAmbient (sourceIndex, targetIndex, specialType)])
                   withMsgs model msgs
               | None ->
                   let model = BattleModel.updateCurrentCommandOpt (constant None) model
                   withMsgs model [ResetCharacter sourceIndex; PoiseCharacter sourceIndex]
   
  -        static let tickConsume consumable sourceIndex (targetIndexOpt : CharacterIndex option) time timeLocal model (_ : World) =
  +        static let tickConsume consumable sourceIndex (targetIndexOpt : CharacterIndex option) time timeLocal model =
               match targetIndexOpt with
               | Some targetIndex ->
                   let target = BattleModel.getCharacter targetIndex model
  
positive.code:                 withMsg model PoiseCharacters
              | _ -> just model
  
          static let rec tickCurrentCommand time currentCommand model world =
              let timeLocal = time - currentCommand.TimeStart
              match currentCommand.ActionCommand.Action with
              | Attack ->
                  let source = currentCommand.ActionCommand.Source
                  let targetOpt = currentCommand.ActionCommand.TargetOpt
                  tickAttack source targetOpt time timeLocal model world
              | Consume consumable ->
                  let source = currentCommand.ActionCommand.Source
                  let targetOpt = currentCommand.ActionCommand.TargetOpt
                  tickConsume consumable source targetOpt time timeLocal model world
              | Special specialType ->
                  let source = currentCommand.ActionCommand.Source
                  let targetOpt = currentCommand.ActionCommand.TargetOpt
                  tickSpecial specialType source targetOpt time timeLocal model world
              | Wound ->
                  match currentCommand.ActionCommand.TargetOpt with
                  | Some target ->
                      let (model, signal) = tickWound target time model world
                      match model.CurrentCommandOpt with
                      | Some _ ->
                          // just keep ticking wound...
  
negative.code:                     let sigs = if cancelled then Command (DisplayCancel targetIndex) :: sigs else sigs
                      let sigs = if hitPointsChange <> 0 then Command (DisplayHitPointsChange (targetIndex, hitPointsChange)) :: sigs else sigs
                      withSigs model sigs
                  | None -> just model
  
              | SpecialCharacter4 (sourceIndex, targetIndex, _) ->
                  let time = World.getTickTime world
                  let target = BattleModel.getCharacter targetIndex model
                  if target.IsHealthy then
                      let model = BattleModel.updateCurrentCommandOpt (constant None) model
                      withMsgs model [PoiseCharacter sourceIndex; PoiseCharacter targetIndex]
                  else
                      let woundCommand = CurrentCommand.make time (ActionCommand.make Wound sourceIndex (Some targetIndex))
                      let model = BattleModel.updateCurrentCommandOpt (constant (Some woundCommand)) model
                      withMsgs model [PoiseCharacter sourceIndex]
                      
              | SpecialCharacterAmbient (sourceIndex, _, _) ->
                  if Simulants.BattleSpecialMovement.GetExists world then
                      let model =
                          let tags = Simulants.BattleSpecialMovement.GetEffectTags world
                          match Map.tryFind "Tag" tags with
                          | Some tag -> BattleModel.updateCharacter (CharacterModel.updateCenter (constant tag.Position)) sourceIndex model
                          | None -> model
                      just model
                  else just model
  
              | ConsumeCharacter1 (consumable, sourceIndex) ->
                  let time = World.getTickTime world
  