示例#1
0
    void DoAttack()
    {
        CombatEnemy enemy = combatQueue.FirstEnemy();

        if (enemy == null)
        {
            return;
        }

        int hitSkill = (int)statManager.DerivedPrecision();

        if (Random.Range(0, hitSkill) < Random.Range(0, enemy.Dodge()))
        {
            CombatBubbleSpawner.SpawnBubble(
                enemy.transform.position,
                "Missed!",
                CombatBubbleSpawner.BubbleTypes.Round,
                Color.gray
                );

            SoundsManager.PlayClip(MissSounds[Random.Range(0, MissSounds.Length)]);

            return;
        }

        int maxDamage = (int)statManager.DerivedDamage();

        int damage = Random.Range(maxDamage / 2, maxDamage);

        bool isCrit = Random.Range(0, 100) < statManager.GetValue(Stats.Critical);

        if (isCrit)
        {
            // TODO: Crit event
            damage *= 2;
        }

        CombatBubbleSpawner.SpawnBubble(
            enemy.transform.position,
            damage.ToString(),
            (isCrit ? CombatBubbleSpawner.BubbleTypes.Spiky : CombatBubbleSpawner.BubbleTypes.Round),
            (isCrit ? Color.red : Color.white)
            );

        SoundsManager.PlayClip(AttackSounds[Random.Range(0, AttackSounds.Length)]);

        enemy.TakeDamage(damage);
    }