public IEnumerator Attack(ICombatant receiver, WeaponHitSeverity severity) { var attackComplete = false; var onComplete = new Action(() => { attackComplete = true; }); _animator.AttackConnectedSignal.AddOnce(() => { var connection = new WeaponHitConnection(severity, receiver); AttackConnectedSignal.Dispatch(connection); }); _animator.AttackCompleteSignal.AddOnce(onComplete); State = CombatantState.Attacking; while (!attackComplete) { yield return(new WaitForEndOfFrame()); } State = CombatantState.CombatReady; }
public override IEnumerator SpecialAttack(FightPhase phase, MapDimensions dimensions, CombatantView receiverView, WeaponHitSeverity severity) { var receiver = phase.Receiver; var shoveEffects = phase.Effects.ReceiverEffects.OfType <Shove>().ToList(); if (shoveEffects.Any()) { Action <WeaponHitConnection> hitConnectedCallback = null; hitConnectedCallback = hit => { var destination = shoveEffects.First().GetDestination(receiver); var worldDestination = dimensions.GetWorldPositionForGridPosition(destination); var theirTransform = receiverView.transform; theirTransform .DOMove(worldDestination, 0.3f) .SetEase(Ease.OutCubic) .Play(); AttackConnectedSignal.RemoveListener(hitConnectedCallback); }; AttackConnectedSignal.AddListener(hitConnectedCallback); } yield return(StartCoroutine(Attack(receiver, severity))); }
public override IEnumerator SpecialAttack(FightPhase phase, MapDimensions dimensions, CombatantView receiverView, WeaponHitSeverity severity) { var receiver = phase.Receiver; var didAdvance = phase.Effects.ReceiverEffects.OfType <Advance>().Any(); if (!didAdvance) { yield return(StartCoroutine(Attack(receiver, severity))); yield break; } var attacker = phase.Initiator; var distance = MathUtils.ManhattanDistance(attacker.Position, receiver.Position); var windupClip = distance > 1 ? _farAdvanceAnimationClips[Facing] : _windupAnimationClips[Facing]; var advanceClip = _advanceAnimationClips[Facing]; _combatantAnimator.enabled = false; yield return(StartCoroutine(PlayClip(windupClip))); var advanceClipDuration = ((1000 / advanceClip.fps) * advanceClip.frames.Length / 1000); var destination = receiverView.transform.position; transform .DOMove(destination, advanceClipDuration) .SetEase(Ease.OutCubic) .Play(); yield return(StartCoroutine(PlayClip(advanceClip))); _combatantAnimator.enabled = true; }
public WeaponHitConnection(WeaponHitSeverity severity, ICombatant combatant) { Severity = severity; Combatant = combatant; }
public virtual IEnumerator SpecialAttack(FightPhase phase, MapDimensions dimensions, CombatantView receiverView, WeaponHitSeverity severity) { throw new InvalidOperationException("Combatant: " + CombatantId + " has no special attack."); }