private OnDefenseSkillResult CalculateDefenderDiceResult(Poring attacker, Poring poring) { OnDefenseSkillResult result = new OnDefenseSkillResult(DefenseTypeResult.None, DamageType.PAtk, 0); FaceDice faceDice = poring.Property.DeffensiveDices[0].GetDiceFace(poring.DeffensiveResultList[0]); poring.Property.SkillList.ForEach(skill => { var subResult = skill.OnDefense(attacker, poring, faceDice); if (subResult.Type != DefenseTypeResult.None) { result = subResult; } }); return(result); }
private IEnumerator WaitForDiceResult() { yield return(new WaitUntil(() => Poring.OffensiveResultList.Count > 0 && Poring.Target.DeffensiveResultList.Count > 0)); TurnFaceTo(Poring.Target.transform.position); hasAttack = true; OnAttackSkillResult attackerDiceResult = CalculateAtackerDiceResult(Poring); OnDefenseSkillResult defenderDiceResult = CalculateDefenderDiceResult(Poring, Poring.Target); EffectReceiver maximizePower; switch (defenderDiceResult.Type) { case DefenseTypeResult.None: break; case DefenseTypeResult.Counter: Poring.Target.Animator.Play("Skill"); yield return(waitSecond); maximizePower = Poring.Target.GetStatus(SkillStatus.MaximizePower); defenderDiceResult.DamageResult *= (maximizePower != null) ? maximizePower.Damage : 1; Poring.Property.CurrentHp -= defenderDiceResult.DamageResult; if (defenderDiceResult.EffectOnTarget != null) { InstantiateParticleEffect.CreateFx(defenderDiceResult.EffectOnTarget, Poring.transform.localPosition); } if (Poring.TakeDamage(Poring.Target, defenderDiceResult.DamageResult)) { yield return(waitSecond); Poring.OnReceiverEffect(defenderDiceResult.EffectStatusResults); if (!Poring.Target.Behavior.hasAttack && Poring.Node == Poring.Target.Node) { Poring.Target.Target = Poring; Poring.Target.Behavior.AttackTarget(); yield break; } else { Poring.Target.Behavior.hasAttack = hasAttack = false; Poring.Target.Target = Poring.Target = null; m_gameMode.CurrentGameState = eStateGameMode.EndTurn; yield break; } } else { yield return(waitSecond); Poring.Behavior.Respawn(); Poring.Target.Behavior.hasAttack = hasAttack = false; Poring.Target.Target = Poring.Target = null; m_gameMode.CurrentGameState = eStateGameMode.EndTurn; yield break; } case DefenseTypeResult.Dodge: break; } float damageResult = AdaptiveDamageCalculate(Poring); damageResult = AdaptiveDefenseCalculate(damageResult, Poring.Target); maximizePower = Poring.GetStatus(SkillStatus.MaximizePower); damageResult *= (maximizePower != null) ? maximizePower.Damage : 1; Poring.Animator.Play("Skill"); yield return(waitSecond); switch (attackerDiceResult.Type) { case AttackTypeResult.None: break; case AttackTypeResult.Double: case AttackTypeResult.PowerUp: case AttackTypeResult.Enchant: InstantiateParticleEffect.CreateFx(attackerDiceResult.EffectOnTarget, Poring.Target.transform.localPosition); Poring.Target.OnReceiverEffect(attackerDiceResult.EffectStatusResults); break; } if (damageResult != 0 && Poring.Property.NormalAttackEffect != null) { InstantiateParticleEffect.CreateFx(Poring.Property.NormalAttackEffect, Poring.Target.transform.position); } if (Poring.Target.TakeDamage(Poring, damageResult)) // alive { yield return(waitSecond); if (!Poring.Target.Behavior.hasAttack && Poring.Node == Poring.Target.Node && !Poring.Target.CheckHasStatus(SkillStatus.Freeze | SkillStatus.Sleep | SkillStatus.Stun) && // target is not freeze, sleep, stun !Poring.CheckHasStatus(SkillStatus.Ambursh)) // Attacker is not ambursh { Poring.Target.Target = Poring; Poring.Target.Behavior.AttackTarget(); } else { Poring.Target.Behavior.hasAttack = hasAttack = false; Poring.Target.Target = Poring.Target = null; m_gameMode.CurrentGameState = eStateGameMode.EndTurn; } } else // die { yield return(waitSecond); Poring.Target.Behavior.Respawn(); Poring.Target.Behavior.hasAttack = hasAttack = false; Poring.Target.Target = Poring.Target = null; m_gameMode.CurrentGameState = eStateGameMode.EndTurn; } }