public override void Do(IGiveDamage giveDamage) { var gimmick = giveDamage.Root.GetComponent <IPoolableComponent>(); Assert.IsNotNull(gimmick, $"{giveDamage.Root}に{typeof(IPoolableComponent)}がありませんでした"); gimmick.Return(); }
/// <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); } }
public override void Do(IGiveDamage giveDamage) { giveDamage.Damager.AbnormalConditionController.Attach(this.type); }
public abstract void Do(IGiveDamage giveDamage);
/// <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 )); }