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); }