float critPower = 3f; // times stronger IEnumerator DestroyBlock(SelectionControllerDidDestroyBlock onDestroy) { if (blockHealth == null) { Reset(); yield break; } while (blockHealth.currentHealth > 0) { _isDestroyingBlck = true; if (currentPos == null || selectedPos == null || block == null || blockHealth == null || !currentPos.Equals(selectedPos)) { Reset(); yield break; } bool crit = UnityEngine.Random.Range(0f, 100f) > (100 - critChance); float dmg = crit ? damage * critPower : damage; DamagePopup.Create(selection.transform.position, dmg, crit, null); blockHealth.ModifyHealth(-dmg); yield return(new WaitForSeconds(attackSpeed)); } if (onDestroy != null && block != null && currentPos != null && selectedPos != null && currentPos.Equals(selectedPos)) { onDestroy.Invoke(); } _isDestroyingBlck = false; Reset(); }
void StartDestroyingSelectedBlock(SelectionControllerDidDestroyBlock onDestroy) { if (selectedPos == null || block == null || blockHealth == null) { Reset(); return; } else if (currentPos == null) { currentPos = selectedPos; startedAt = DateTime.Now; blockHealth.SetCurrentHealth(Block.GetMaxHealth(block.Value)); StartCoroutine(DestroyBlock(onDestroy)); } else if (currentPos.Equals(selectedPos)) { return; } else { currentPos = selectedPos; startedAt = DateTime.Now; blockHealth.SetCurrentHealth(Block.GetMaxHealth(block.Value)); StartCoroutine(DestroyBlock(onDestroy)); } }