Esempio n. 1
0
    // 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;
        }
    }
Esempio n. 2
0
    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);
    }
Esempio n. 4
0
    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!"));
        }
    }