// function to highlight skills and update skill details public void UpdateSkillSelection(int selectedSkill, SkillCalc skill) { // highlight selected skill for (int i = 0; i < skillText.Count; i++) { if (i == selectedSkill) { skillText[i].color = highletedColor; } else { skillText[i].color = Color.black; } } // update skill details useLeftText.text = $"Use Left: {skill.UseLeft}/{skill.baseSkill.UseLeft}"; elementText.text = skill.baseSkill.SkillElement.ToString(); // visual feedback for player that has no use left if (skill.UseLeft == 0) { useLeftText.color = Color.red; } else { useLeftText.color = Color.black; } }
bool CheckAccHit(SkillCalc skill, TerasCalcs source, TerasCalcs target) { if (skill.baseSkill.AlwaysHit == true) { return(true); } float skillAccuracy = skill.baseSkill.Accuracy; int accuracy = source.BoostStats[Stat.accuracy]; int evasion = target.BoostStats[Stat.evasion]; var boostValues = new float[] { 1f, 4f / 3f, 5f / 3f, 2f, 7f / 3f, 8f / 3f, 3f }; if (accuracy > 0) { skillAccuracy *= boostValues[accuracy]; } else { skillAccuracy /= boostValues[-accuracy]; } if (evasion > 0) { skillAccuracy /= boostValues[evasion]; } else { skillAccuracy *= boostValues[-evasion]; } return(UnityEngine.Random.Range(1, 101) <= skillAccuracy); }
// Function to take damage public DamageDetails TakeDamage(SkillCalc skill, TerasCalcs attacker) { // check for critical hit float critical = 1f; if (Random.value * 100f <= 6.25) { critical = 2f; } // check element effectiveness float element = ElementEffectiveness.GetEffectiveness(skill.baseSkill.SkillElement, attacker._baseTeras.FirstElement) * ElementEffectiveness.GetEffectiveness(skill.baseSkill.SkillElement, attacker._baseTeras.SecondElement); // set details of damage var DMG_Details = new DamageDetails() { Critical = critical, ElementEffectiveness = element, Fainted = false }; // calculate damage float modifiers = 1 * element * critical; float a = (2 * attacker.level + 10) / 250f; float d = a * skill.baseSkill.Damage * ((float)attacker._baseTeras.Attack / _baseTeras.Defense); int damage = Mathf.FloorToInt(d * modifiers); // substract health this.Health -= damage; UpdateHP(damage); return(DMG_Details); }
IEnumerator RunSkill(BattleUnit source, BattleUnit target, SkillCalc skill) { bool canMove = source.teras.OnBeforeMove(); if (!canMove) { yield return(ShowStatusChanges(source.teras)); yield return(source.Hud.UpdateHP()); yield break; } skill.UseLeft--; yield return(dialogBox.TypeDialog($"{source.teras._baseTeras.Name} used {skill.baseSkill.Name}!")); if (CheckAccHit(skill, source.teras, target.teras) == true) { source.AttackAnim(); yield return(new WaitForSeconds(1f)); target.GetHitAnim(); // Check for status condition if (skill.baseSkill.Category == SkillCategory.Status) { yield return(RunSkillEffects(skill.baseSkill.Effects, source.teras, target.teras, skill.baseSkill.SkillTarget)); } // if its not a damaging move deal damage if (skill.baseSkill.Category.CompareTo(SkillCategory.Status) <= 0) { var damageDetails = target.teras.TakeDamage(skill, source.teras); yield return(target.Hud.UpdateHP()); yield return(ShowDamageDetails(damageDetails)); } if (skill.baseSkill.SecondaryEffects != null && skill.baseSkill.SecondaryEffects.Count > 0 && target.teras.Health > 0) { foreach (var secondary in skill.baseSkill.SecondaryEffects) { var random = UnityEngine.Random.Range(1, 101); if (random <= secondary.Chance) { yield return(RunSkillEffects(secondary, source.teras, target.teras, secondary.Target)); } } } // if the opposing teras fainted make battle over event true to end battle if (target.teras.Health <= 0) { yield return(dialogBox.TypeDialog($"{target.teras._baseTeras.Name} fainted!")); target.FaintAnim(); yield return(new WaitForSeconds(2f)); CheckBattleOver(target); } } else { yield return(dialogBox.TypeDialog($"{source.teras._baseTeras.Name} missed its attack!")); } }