Ejemplo n.º 1
0
        public override void Do(IGiveDamage giveDamage)
        {
            var gimmick = giveDamage.Root.GetComponent <IPoolableComponent>();

            Assert.IsNotNull(gimmick, $"{giveDamage.Root}に{typeof(IPoolableComponent)}がありませんでした");

            gimmick.Return();
        }
Ejemplo n.º 2
0
        /// <summary>
        /// ダメージを与える
        /// </summary>
        public static void GiveDamage(this IGiveDamage self, Actor target)
        {
            // 貫通できる回数が0の場合はダメージを与えられない
            if (self.CurrentPenetrationCount == 0)
            {
                return;
            }

            if (self.Owner == target)
            {
                return;
            }

            if (!self.IncludeTags.Contains(target.tag))
            {
                return;
            }

            if (target.StatusController.IsInfinity(self.GiveDamageObject))
            {
                return;
            }

            var generationSource = self.GiveDamageCollider.ClosestPoint(target.CachedTransform.position);
            var damageResult     = Calculator.GetDamageOnActor(self, target, generationSource);

            target.StatusController.TakeDamage(damageResult);
            target.Movement.SetGravity(Calculator.GetKnockbackPower(target, self.KnockbackDirection, self.KnockbackPower, target.StatusController.KnockbackResistance, self.KnockbackLimit));
            target.StatusController.AddInfinityStatus(self.GiveDamageObject, self.InfinitySeconds);

            var effect = self.EffectPrefab.Rent();

            effect.transform.position = generationSource;

            var selfPosition   = self.transform.position;
            var targetPosition = target.CachedTransform.position;
            var direction      = (new Vector2(targetPosition.x, targetPosition.y) - new Vector2(selfPosition.x, selfPosition.y)).GetHorizontalDirection();

            foreach (var i in effect.GetComponentsInChildren <ISyncDirection>())
            {
                i.Sync(direction);
            }

            self.CurrentPenetrationCount--;

            foreach (var a in self.AdditionalEffects)
            {
                a.Do(self);
            }
        }
Ejemplo n.º 3
0
 public override void Do(IGiveDamage giveDamage)
 {
     giveDamage.Damager.AbnormalConditionController.Attach(this.type);
 }
 public abstract void Do(IGiveDamage giveDamage);
Ejemplo n.º 5
0
        /// <summary>
        /// <see cref="Actor"/>と<see cref="Actor"/>とのダメージ計算をして返す
        /// </summary>
        public static DamageResult GetDamageOnActor(IGiveDamage giveDamage, Actor target, Vector2 generationSource)
        {
            var attacker = giveDamage.Owner;
            var attackerItemModifierEffect = attacker.StatusController.ItemModifierEffect;
            var targetItemModifierEffect   = target.StatusController.ItemModifierEffect;
            var damage = giveDamage.DamagePower;

            // アクセサリーの効果分ダメージが上昇する
            var damageUpRate = attackerItemModifierEffect.GetPercent(Constants.ItemModifierType.GiveDamageUpRate);

            if (giveDamage.WeaponType == Constants.WeaponType.Melee)
            {
                damageUpRate += attackerItemModifierEffect.GetPercent(Constants.ItemModifierType.GiveDamageUpRateMeleeOnly);
            }
            var damageUp =
                Mathf.FloorToInt(damage * damageUpRate) +
                attackerItemModifierEffect.Get(Constants.ItemModifierType.GiveDamageUpFixed);

            // 攻撃した武器に修飾がある場合はダメージが上昇する
            var instanceWeapon = giveDamage.InstanceWeapon;

            if (instanceWeapon != null)
            {
                var rateValue  = 0.0f;
                var fixedValue = 0;
                foreach (var i in instanceWeapon.Modifiers)
                {
                    if (i.Type == Constants.ItemModifierType.WeaponDamageUpRate)
                    {
                        rateValue += i.Amount / 100.0f;
                    }
                    if (i.Type == Constants.ItemModifierType.WeaponDamageUpFixed)
                    {
                        fixedValue += i.Amount;
                    }
                }

                damageUp += Mathf.FloorToInt(damage * rateValue) + fixedValue;
            }

            // アクセサリーの効果分ダメージが減少する
            var damageDownRate = targetItemModifierEffect.GetPercent(Constants.ItemModifierType.TakeDamageDownRate);
            var damageDown     =
                Mathf.FloorToInt(damage * damageDownRate) +
                targetItemModifierEffect.Get(Constants.ItemModifierType.TakeDamageDownFixed);

            damage = damage + damageUp - damageDown;

            // クリティカルヒットの場合はダメージが上昇
            var criticalRate = giveDamage.CriticalRate + attackerItemModifierEffect.GetPercent(Constants.ItemModifierType.CriticalUpRate);
            var isCritical   = criticalRate.Lottery();

            if (isCritical)
            {
                damage = Mathf.FloorToInt(damage * 1.5f);
            }

            // 延焼の状態異常にかかっている場合は半減する
            if (attacker.AbnormalConditionController.Contains(Constants.AbnormalStatus.FireSpread))
            {
                damage = Mathf.FloorToInt(damage * 0.5f);
            }

            // 詰み防止
            if (damage <= 0)
            {
                damage = 1;
            }

            return(new DamageResult(
                       attacker,
                       target,
                       damage,
                       generationSource,
                       Constants.DamageSource.Actor,
                       isCritical
                       ));
        }