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); }
IEnumerator RunSkillEffects(SkillEffects effects, TerasCalcs source, TerasCalcs target, SkillTarget targetedAt) { // stat boosting if (effects.Boosts != null) { if (targetedAt == SkillTarget.self) { source.ApplyBoost(effects.Boosts); } else { target.ApplyBoost(effects.Boosts); } } //Status condition if (effects.Status != ConditionID.none) { target.SetStatus(effects.Status); } //Volotile status condition if (effects.VolotileStatus != ConditionID.none) { target.SetVolotileStatus(effects.VolotileStatus); } yield return(ShowStatusChanges(source)); yield return(ShowStatusChanges(target)); }
// 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 ShowStatusChanges(TerasCalcs teras) { while (teras.StatusChanges.Count > 0) { var message = teras.StatusChanges.Dequeue(); yield return(dialogBox.TypeDialog(message)); } }
// sets name, level and health bar public void setData(TerasCalcs teras) { _teras = teras; nameText.text = _teras._baseTeras.Name; levelText.text = "Level: " + _teras.Level; HealthBar.setHealth((float)_teras.Health / _teras.CalculateMaxHealthStat); }
IEnumerator SwitchTeras(TerasCalcs nextTeras) { if (playerUnit.teras.Health > 0) { yield return(dialogBox.TypeDialog($"Return {playerUnit.teras._baseTeras.Name}")); playerUnit.FaintAnim(); yield return(new WaitForSeconds(2f)); } // setup player playerUnit.Setup(nextTeras); // set skills of player dialogBox.SetSkillNames(nextTeras.Skills); yield return(StartCoroutine(dialogBox.TypeDialog($"Fight {nextTeras._baseTeras.Name}!"))); state = BattleState.RunningTurn; }
// sets name, level and health bar public void setData(TerasCalcs teras) { _teras = teras; nameText.text = teras._baseTeras.Name; levelText.text = "Level: " + teras.Level; HealthBar.setHealth((float)teras.Health / teras.CalculateMaxHealthStat); StatusColors = new Dictionary <ConditionID, Color>() { { ConditionID.poison, poisonClr }, { ConditionID.paralysis, paralyzeClr }, { ConditionID.burn, burnClr }, { ConditionID.sleep, sleepClr }, }; SetStatusText(); _teras.OnStatusChange += SetStatusText; }
// sets images for enemy or player teras public void Setup(TerasCalcs terasSetup) { teras = terasSetup; // set image if (isPlayerUnit) { image.sprite = teras._baseTeras.BackSprite; } else { image.sprite = teras._baseTeras.FrontSprite; } image.color = originalColor; hud.setData(terasSetup); EnterToBattleAnim(); }
// When the object is created sets up UI for battle public void StartBattle(TerasParty PLAYER, TerasCalcs WILD_TERAS) { playersParty = PLAYER; wild = WILD_TERAS; StartCoroutine(SetupBattle()); }