예제 #1
0
        public static AttackPackage CreateNewPackage(AttackPackage template)
        {
            var hashID = System.Guid.NewGuid().GetHashCode();

            template._hashID = hashID;
            return(template);
        }
        public virtual AttackResult ReceiveAttack(AttackPackage attack)
        {
            if (attacksFreqTimer.ContainsKey(attack._hashID) ||
                attack._attackType == AttackType.Null ||
                attack._faction == this.Faction)
            {
                return(AttackResult.Failed);
            }

            attacksFreqTimer.Add(attack._hashID, attack._attackRate);
            StartCoroutine(RemoveTimer(attack._hashID));


            var result = new AttackResult
            {
                _attackable    = this,
                _attackSuccess = true,
                _finalDamage   = attack._hitPointDamage,
                _finalFatigue  = attack._enduranceDamage,
                _isWeakspot    = _isWeakSpot
            };

            ApplyDamageMultiplier(ref result, attack);

            RaiseOnHit(attack, result);
            return(result);
        }
        protected virtual void ApplyDamageMultiplier(ref AttackResult result, AttackPackage attack)
        {
            switch (attack._attackType)
            {
            case AttackType.Melee:
                result._finalDamage *= _meleeDamageMultiplier;
                break;

            case AttackType.Range:
                result._finalDamage *= _rangeDamageMultiplier;
                break;

            case AttackType.ChargedMelee:
                result._finalDamage *= _meleeChargeDamageMultiplier;
                break;

            case AttackType.ChargedRange:
                result._finalDamage *= _rangeChargeDamageMultiplier;
                break;

            case AttackType.Float:
                result._finalDamage *= _floatBladeDamageMultiplier;
                break;
            }
        }
        public bool Hover()
        {
            if (State != KnifeState.Flying)
            {
                return(false);
            }

            piercing = false;
            State    = KnifeState.Hover;

            _attackMove     = floatAttack;
            _defaultType    = AttackType.Float;
            _baseAttackRate = floatAttackRate;
            Activate(AttackPackage.CreateNewPackage(), _attackMove);

            if (flyingVFX)
            {
                flyingVFX.SetParent(null);
            }

            if (chargeFlyingEffect)
            {
                chargeFlyingEffect.StopDraw();
            }

            return(true);
        }
예제 #5
0
        public void StartAttack()
        {
            var obj = Instantiate(_wavePrefab).GetComponent <BaseWeapon>();

            obj.Activate(AttackPackage.CreateNewPackage(), null);
            obj.transform.position = _attackPoint.position;
        }
예제 #6
0
 private void HandleSwordOnHit(IAttackable attackable, AttackResult result, AttackPackage attack)
 {
     if (attack._move != null && result._isWeakspot)
     {
         TimeManager.Instance.FrozenFrame(attack._move.FrameFrozen);
         //ShakeScreen.Instance.Shake(attack._move.ScreenShakeParam);
     }
 }
예제 #7
0
        public static AttackPackage CreateNewPackage()
        {
            var hashID  = System.Guid.NewGuid().GetHashCode();
            var package =
                new AttackPackage(hashID, 0, 0, 0, 0, 0, false, AttackType.Null, Faction.Null, Vector2.zero, "", "", null);

            return(package);
        }
예제 #8
0
        public override void Activate(AttackPackage attack, AttackMove move)
        {
            base.Activate(attack, move);

            if (_triggerBox)
            {
                _triggerBox.enabled = true;
            }
        }
예제 #9
0
        public virtual void Launch()
        {
            if (_launchEffect != null)
            {
                _launchEffect.Play();
            }

            var projectile = GetProjectile();

            projectile.Activate(AttackPackage.CreateNewPackage(), _move);
        }
        protected override void ApplyDamageMultiplier(ref AttackResult result, AttackPackage attack)
        {
            base.ApplyDamageMultiplier(ref result, attack);

            if (_isWeakSpot &&
                attack._attackType != AttackType.Null &&
                attack._attackType != AttackType.StuckNDraw &&
                attack._attackType != AttackType.Float)
            {
                ApplyComboDamage(ref result, attack);
            }
        }
        private AttackPackage CreateNewPackage(AttackType type, AttackMove move)
        {
            var package = AttackPackage.CreateNewPackage();

            package._hitPointDamage.Base  = _baseHitPointDamage;
            package._enduranceDamage.Base = _baseEnduranceDamage;
            package._attackType           = type;
            package._faction = Faction.Player;
            package          = move.Process(package);

            return(package);
        }
예제 #12
0
        public void ChargedMeleeAttack(float chargedPercent)
        {
            var package = AttackPackage.CreateNewPackage();

            package._faction              = Faction.Player;
            package._attackType           = AttackType.ChargedMelee;
            package._hitPointDamage.Base  = _state._hitPointDamage;
            package._enduranceDamage.Base = _state._enduranceDamage;
            package._chargedPercent.Base  = chargedPercent;
            OnRaisingAttack?.Invoke(sword, chargedMeleeMove);

            sword.Activate(package, chargedMeleeMove);

            _audio.clip = _normalMeleeSFX.PickRandom();
            _audio.Play();
        }
        public bool Withdraw()
        {
            if (State == KnifeState.InSheath || State == KnifeState.Returning)
            {
                return(false);
            }

            transform.parent = null;
            State            = KnifeState.Returning;

            _attackMove     = piercing ? chargedAttack : normalAttack;
            _defaultType    = piercing ? AttackType.ChargedRange : AttackType.Range;
            _baseAttackRate = normalAttackRate;
            Activate(AttackPackage.CreateNewPackage(), _attackMove);

            if (stuckOn != null)
            {
                Vector2 toStuckOn = (stuckOn as Component).transform.position - this.transform.position;
                toStuckOn = toStuckOn.normalized * PullingForce;
                if (stuckOn.TryPullOut(this.gameObject, ref toStuckOn))
                {
                    var direction = sheath.transform.position - this.transform.position;
                    direction    = DirectionalHelper.NormalizeHorizonalDirection(direction);
                    _defaultType = AttackType.StuckNDraw;
                    TryAttack(stuckAttack, direction);
                }

                stuckOn = null;
            }

            Returning();


            if (flyingVFX)
            {
                flyingVFX.SetParent(this.transform);
                flyingVFX.position = transform.position;
                flyingVFX.rotation = transform.rotation;
            }

            if (chargeFlyingEffect && piercing)
            {
                chargeFlyingEffect.StartDraw();
            }

            return(true);
        }
        protected virtual void ApplyComboDamage(ref AttackResult result, AttackPackage attack)
        {
            switch (attack._attackType)
            {
            case AttackType.Melee:
            case AttackType.ChargedMelee:
                _state._currentMeleeComboTimes++;
                break;

            case AttackType.Range:
            case AttackType.ChargedRange:
                _state._currentRangeComboTimes++;
                break;
            }

            var totalComboTimes  = _state._currentMeleeComboTimes + _state._currentRangeComboTimes;
            var totalComboDamage =
                _state._currentMeleeComboTimes * _state._meleeComboAdditiveDamage +
                _state._currentRangeComboTimes * _state._rangeComboAdditiveDamage;

            _state._currentComboInterval = _state._comboMaxInterval;
            if (totalComboTimes > _state._comboMaxTimes)
            {
                RaiseComboExceeded(
                    _state._currentMeleeComboTimes,
                    _state._currentRangeComboTimes,
                    result._finalDamage,
                    totalComboDamage);

                _state._currentMeleeComboTimes = 0;
                _state._currentRangeComboTimes = 0;
                _state._currentComboInterval   = 0;
            }
            else
            {
                RaiseComboRaise(
                    _state._currentMeleeComboTimes,
                    _state._currentRangeComboTimes,
                    result._finalDamage,
                    totalComboDamage);
            }

            result._finalDamage += totalComboDamage;
        }
        public bool Launch(Vector3 direction, bool isPiercing = false)
        {
            if (State != KnifeState.InSheath)
            {
                return(false);
            }

            piercing = isPiercing;
            State    = KnifeState.Flying;

            transform.position = sheath.LaunchPosition.position;
            transform.right    = direction;

            _attackMove     = isPiercing ? chargedAttack : normalAttack;
            _defaultType    = isPiercing ? AttackType.ChargedRange : AttackType.Range;
            _baseAttackRate = normalAttackRate;
            Activate(AttackPackage.CreateNewPackage(), _attackMove);

            if (flyingVFX)
            {
                flyingVFX.SetParent(this.transform);
                flyingVFX.position = transform.position;
                flyingVFX.rotation = transform.rotation;

                List <ParticleSystem> particles = new List <ParticleSystem>();
                flyingVFX.GetComponentsInChildren(particles);

                foreach (var particle in particles)
                {
                    particle.Play();
                }
            }

            if (chargeFlyingEffect && piercing)
            {
                chargeFlyingEffect.StartDraw();
            }

            return(true);
        }
예제 #16
0
        public void MeleeAttack()
        {
            var package = AttackPackage.CreateNewPackage();

            package._faction              = Faction.Player;
            package._attackType           = AttackType.Melee;
            package._hitPointDamage.Base  = _state._hitPointDamage;
            package._enduranceDamage.Base = _state._enduranceDamage;
            OnRaisingAttack?.Invoke(sword, meleeMove);

            sword.Activate(package, meleeMove);

            if (_currentAttackEffect)
            {
                return;
            }
            _currentAttackEffect = Instantiate(_attackEffectPrefab);
            _currentAttackEffect.transform.SetParent(sword.transform);
            _currentAttackEffect.transform.localPosition = Vector3.zero;

            _audio.clip = _normalMeleeSFX.PickRandom();
            _audio.Play();
        }
 public override void Activate(AttackPackage attack, AttackMove move)
 {
     base.Activate(attack, move);
     this.transform.localScale = Vector3.zero;
 }
예제 #18
0
 protected void RaiseOnHit(AttackPackage attack, AttackResult result)
 {
     OnHit?.Invoke(attack, result);
     _onHit.Invoke();
 }