示例#1
0
        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;
        }
示例#2
0
        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)));
        }
示例#3
0
        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;
        }
示例#4
0
 public WeaponHitConnection(WeaponHitSeverity severity, ICombatant combatant)
 {
     Severity  = severity;
     Combatant = combatant;
 }
示例#5
0
 public virtual IEnumerator SpecialAttack(FightPhase phase, MapDimensions dimensions, CombatantView receiverView, WeaponHitSeverity severity)
 {
     throw new InvalidOperationException("Combatant: " + CombatantId + " has no special attack.");
 }