private void AddDamageToTarget(Poring poring, Poring targetPoring, float damage) { if (EffectOnHit != null) { InstantiateParticleEffect.CreateFx(EffectOnHit, targetPoring.transform.localPosition); } foreach (var s in StrongerList) { if (targetPoring.CheckHasStatus(s.Status)) { damage *= s.DamageMultiple; } } bool isAlive = targetPoring.TakeDamage(poring, damage); if (isAlive) { isAlive = targetPoring.OnReceiverEffect(SetEffectOwnerIdAndDamage(poring)); } if (!isAlive) { targetPoring.Behavior.Respawn(); } }
public override OnDefenseSkillResult OnDefense(Poring attacker, Poring poring, FaceDice faceDice) { if (faceDice == ActiveOnType && CurrentCD <= 0) { // Debug.LogError($"{poring.name} : {this.name}!!"); float damage = 0; switch (DefenseType) { case DefenseTypeResult.None: damage = 0; break; case DefenseTypeResult.Counter: damage = (DamageType == DamageType.PAtk) ? poring.Property.CurrentPAtk : poring.Property.CurrentMAtk; damage *= poring.GetBlessingBuff(); EffectReceiver maximizePower = poring.GetStatus(SkillStatus.MaximizePower); damage *= (maximizePower != null) ? maximizePower.Damage : 1; if (attacker.Node != poring.Node) { DefenseType = DefenseTypeResult.None; damage = 0; } if (poring.CheckHasStatus(SkillStatus.Blind)) { damage = 0; } break; case DefenseTypeResult.Dodge: damage = 0; break; } return(new OnDefenseSkillResult() { Type = DefenseType, DamageType = DamageType, EffectStatusResults = SetEffectOwnerIdAndDamage(poring), DamageResult = damage, EffectOnSelf = EffectOnSelf, EffectOnTarget = EffectOnHit, }); } else { return(new OnDefenseSkillResult() { Type = DefenseTypeResult.None, DamageType = DamageType, EffectStatusResults = new List <EffectReceiver>(), DamageResult = 0 }); } }
private bool CheckingEnableButtonByStatus(Poring poring) { // Skip turn. SkillStatus condition = SkillStatus.Sleep | SkillStatus.Freeze | SkillStatus.Stun; if (poring.CheckHasStatus(condition)) { return(false); } // Can't move. condition = SkillStatus.Root; if (poring.CheckHasStatus(condition)) { RollDiceBtn.gameObject.SetActive(false); if (!CancelSkillBtn.gameObject.activeInHierarchy) { SkipBtn.gameObject.SetActive(true); } } return(true); }
private void SetSkillsEvent(List <BaseSkill> skillList, Poring poring, int index) { BaseSkill ultimateSkill = poring.Property.UltimateSkill; UltimateSkillBtn.GetComponentInChildren <Text>().text = ultimateSkill.name; UltimateSkillBtn.GetComponent <SkillDetail>().SetDetail(ultimateSkill, poring); UltimateSkillBtn.onClick.RemoveAllListeners(); UltimateSkillBtn.onClick.AddListener(() => { SetActivePanel(false, currentPoring.Node.TileProperty.Type); ChangeModeToSelectTarget(ultimateSkill, poring, index); }); BtnGroup.ForEach(group => { group.BtnObject.onClick.RemoveAllListeners(); group.BtnObject.gameObject.SetActive(false); }); for (int i = 0; i < skillList.Count; i++) { ButtonGroup group = BtnGroup[i]; BaseSkill skill = skillList[i]; skill.CurrentCD--; group.BtnName.text = skill.name; group.BtnObject.gameObject.SetActive(true); var skillDetail = group.BtnObject.gameObject.GetComponent <SkillDetail>(); skillDetail.SetDetail(skill, poring); group.BtnObject.interactable = (skill.CurrentCD <= 0 && skill.SkillMode == SkillMode.Activate); if (skill.MoveToTarget && poring.CheckHasStatus(SkillStatus.Root)) { group.BtnObject.interactable = false; } group.BtnObject.onClick.AddListener(() => { BtnGroup.ForEach(g => { g.BtnObject.interactable = false; }); UltimateSkillBtn.interactable = false; SetActivePanel(false, currentPoring.Node.TileProperty.Type); ChangeModeToSelectTarget(skill, poring, index); }); } }
public bool AddPoring(Poring poring) { poring.transform.position = transform.position; poring.Node = this; porings.Add(poring); if (porings.Count > 1 && porings[0].CheckHasStatus(SkillStatus.Ambursh) && !poring.CheckHasStatus(SkillStatus.Ambursh)) { porings[0].Animator.Play("Skill"); float damage = porings[0].Property.CurrentPAtk; damage *= porings[0].GetBlessingBuff(); EffectReceiver maximizePower = poring.GetStatus(SkillStatus.MaximizePower); damage *= (maximizePower != null) ? maximizePower.Damage : 1; if (porings[0].CheckHasStatus(SkillStatus.Blind)) { damage = 0; } poring.TakeDamage(porings[0], damage, porings[0].Property.NormalAttackEffect); } TileProperty.OnEnter(poring, this); List <EffectReceiver> effectsResult = new List <EffectReceiver>(); for (int i = 0; i < effectsOnTile.Count; i++) { BaseEffectOnTile baseFx = effectsOnTile[i]; List <EffectReceiver> listEffect = baseFx.OnEnter(this); effectsResult.AddRange(listEffect); } bool isAlive = poring.OnReceiverEffect(effectsResult); if (!isAlive) { return(false); } foreach (var fx in effectsResult) { SkillStatus e = SkillStatus.Freeze | SkillStatus.Root | SkillStatus.Sleep | SkillStatus.Stun; if (fx.Status.CheckHasStatus(e)) { return(false); } } return(true); }
private void SkillEffectActivate(Poring poring, Poring targetPoring = null, Node targetNode = null) { float damageResult = (DamageType == DamageType.PAtk) ? poring.Property.CurrentPAtk : poring.Property.CurrentMAtk; damageResult *= poring.GetBlessingBuff(); EffectReceiver maximizePower = poring.GetStatus(SkillStatus.MaximizePower); damageResult *= (maximizePower != null) ? maximizePower.Damage : 1; damageResult *= DamageMultiple; if (poring.CheckHasStatus(SkillStatus.Blind) && targetNode == null) { damageResult = 0; } PrototypeGameMode.Instance.StartCoroutine(WaitForAnimation(poring, damageResult, targetPoring, targetNode)); }
public override OnAttackSkillResult OnAttack(Poring poring, FaceDice faceDice) { EffectReceiver maximizePowerDef; if (faceDice == ActiveOnType && CurrentCD <= 0) { CurrentCD = TurnCD; float damage = 0; switch (AttackType) { case AttackTypeResult.None: damage = 0; break; case AttackTypeResult.Double: damage = (DamageType == DamageType.PAtk) ? poring.Property.CurrentPAtk : poring.Property.CurrentMAtk; damage *= poring.GetBlessingBuff(); maximizePowerDef = poring.GetStatus(SkillStatus.MaximizePower); damage *= (maximizePowerDef != null) ? maximizePowerDef.Damage : 1; break; case AttackTypeResult.PowerUp: damage = (DamageType == DamageType.PAtk) ? poring.Property.CurrentPAtk : poring.Property.CurrentMAtk; damage *= poring.GetBlessingBuff(); damage *= 2; maximizePowerDef = poring.GetStatus(SkillStatus.MaximizePower); damage *= (maximizePowerDef != null) ? maximizePowerDef.Damage : 1; break; case AttackTypeResult.Enchant: damage = (DamageType == DamageType.PAtk) ? poring.Property.CurrentPAtk : poring.Property.CurrentMAtk; damage *= poring.GetBlessingBuff(); maximizePowerDef = poring.GetStatus(SkillStatus.MaximizePower); damage *= (maximizePowerDef != null) ? maximizePowerDef.Damage : 1; break; } if (poring.CheckHasStatus(SkillStatus.Blind)) { damage = 0; } return(new OnAttackSkillResult() { Type = AttackType, DamageType = DamageType, EffectStatusResults = SetEffectOwnerIdAndDamage(poring), DamageResult = damage, EffectOnSelf = EffectOnSelf, EffectOnTarget = EffectOnHit, }); } else { return(new OnAttackSkillResult() { Type = AttackTypeResult.None, DamageType = DamageType, EffectStatusResults = new List <EffectReceiver>(), DamageResult = 0 }); } }
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; } }