Beispiel #1
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);
    }
Beispiel #2
0
    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);
    }
Beispiel #4
0
 IEnumerator ShowStatusChanges(TerasCalcs teras)
 {
     while (teras.StatusChanges.Count > 0)
     {
         var message = teras.StatusChanges.Dequeue();
         yield return(dialogBox.TypeDialog(message));
     }
 }
Beispiel #5
0
    // 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);
    }
Beispiel #6
0
    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;
    }
Beispiel #7
0
    // 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();
    }
Beispiel #9
0
 // 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());
 }