/// <summary> /// Go to the next letter /// </summary> public void NextLetter() { // If the word is completed, start a new word if (_wordController.IsCompleted()) { SetNextWord(); return; } // Spawn more enemies for the next letter var numLettersObtained = _wordController.GetNumberObtainedLetters(); var numEnemies = Mathf.Pow(_expoBase, numLettersObtained); // Spawn real letter enemy var nextLetter = _wordController.GetNextLetter(); _enemyController.CreateEnemy(nextLetter); var unobtainedLetters = _wordController.GetUnobtainedLetters(); // Spawn dud letter enemies for (int i = 1; i < numEnemies; ++i) { char randomLetter; do { randomLetter = (char)Random.Range((float)'A', 'Z'); } while (randomLetter == nextLetter || unobtainedLetters.Contains(randomLetter)); _enemyController.CreateEnemy(randomLetter); } }
/// <summary> /// Shoots at an enemy /// </summary> private void Shoot() { // If the particle system is already playing, don't shoot again if (_gunParticle.isPlaying) { return; } // Show the particle _gunParticle.Play(); // Play the sound _soundController.PlaySFX(_soundController.Gunshot); // Note: Using Vector3.back, as our characters are technically backward. // TODO: Maybe adjust characters to go forward instead. NavMesh issue? var shootPos = transform.position + Vector3.back + Vector3.up; var enemyLayer = LayerMask.NameToLayer("Enemy"); var layerMask = 1 << enemyLayer; // Check if our shotgun spread hit any enemies var colliders = Physics.OverlapSphere(shootPos, _shotgunScatterRange, layerMask); if (colliders.Length == 0) { return; } // Enemies were hit! var enemies = colliders.Select(c => c.GetComponent <Enemy>()).ToList(); // If we hit any enemies if (enemies.Count > 0) { // Play the enemy hurt sound _soundController.PlaySFX(_soundController.EnemyHurt); } // While we have enemies left... while (enemies.Count > 0) { try { // If any of the enemies are the next letter var foundEnemy = enemies.First(e => e.Letter == _wordController.GetNextLetter()); // We obtained the letter! _wordController.ObtainLetter(); // Play the sound _soundController.PlaySFX(_soundController.GainPoints); // Increment the score! _scoreController.Score += _scoreController.ScorePerLetterIncrement * _wordController.GetNumberObtainedLetters(); // Remove the enemy from the listing enemies.Remove(foundEnemy); // Destroy the enemy _enemyController.DestroyEnemy(foundEnemy); // Go to the next letter! _gameController.NextLetter(); } catch { // Otherwise, penalty for the enemies left var numEnemies = enemies.Count; // Play the sound _soundController.PlaySFX(_soundController.LosePoints); // Decrement the score! _scoreController.Score -= _scoreController.ScoreDecrementPerBadEnemy * _wordController.GetNumberObtainedLetters(); // Destroy the enemies _enemyController.DestroyEnemies(enemies); enemies.Clear(); } } }