private static string SelectEnemyToSpawn(SpawnData spawnData) { // Select enemy to spawn string enemyName; // Check if any of the arrays are empty (filled with 0's) bool isMeleeEmpty = Array.TrueForAll(spawnData.MeleeData, data => data.spawnChance == 0); bool isRangedEmpty = Array.TrueForAll(spawnData.RangedData, data => data.spawnChance == 0); // If neither is empty, then randomly choose an enemy from either list if (!isMeleeEmpty && !isRangedEmpty) { enemyName = Random.Range(0, 2) == 0 ? FindSuitableMeleeEnemy(spawnData) : FindSuitableRangedEnemy(spawnData); } else { // If melee is empty, then get an enemy from Ranged and viceversa. enemyName = isMeleeEmpty ? FindSuitableRangedEnemy(spawnData) : FindSuitableMeleeEnemy(spawnData); } return(enemyName); }
private static string GetRangedEnemyNameFromMovementProbability(SpawnData spawnData, EnemyType.RangedEnemyType enemyType) { RangedMovement rangedMovement = spawnData.RangedMovementProbability.rangedProbabilities.Find(movement => movement.enemyType == enemyType); RangedEnemyTypeToNameContainer nameContainer = spawnData.NameContainer.rangedEnemyTypeToNameContainer.Find(container => container.rangedEnemyType == enemyType); float randomValue = Random.value; string enemyName = randomValue < rangedMovement.rushChance ? nameContainer.rangedEnemyNames[0] : nameContainer.rangedEnemyNames[1]; return(enemyName); }
/// <summary> /// Spawns enemies. It should spawn 1 enemy on each half of the screen at random positions, every X seconds (GameManager). /// </summary> public void SpawnEnemies(SpawnData spawnData) { int randomSpawns = Random.Range(1, 1); for (int i = 0; i < randomSpawns; i++) { // Choose enemy string topEnemy = SelectEnemyToSpawn(spawnData); string bottomEnemy = SelectEnemyToSpawn(spawnData); // Spawn the enemies SpawnEnemy(topEnemy, SpawnEnemyTop); SpawnEnemy(bottomEnemy, SpawnEnemyBottom); } }
private static string FindSuitableRangedEnemy(SpawnData spawnData) { bool foundSuitableEnemy = false; string enemyName = ""; while (!foundSuitableEnemy) { int randomIndex = Random.Range(0, spawnData.RangedData.Length); if (spawnData.RangedData[randomIndex].spawnChance > 0) { enemyName = GetRangedEnemyNameFromMovementProbability(spawnData, spawnData.RangedData[randomIndex].enemyType); foundSuitableEnemy = true; } } return(enemyName); }
private static string GetMeleeEnemyNameFromMovementProbability(SpawnData spawnData, EnemyType.MeleeEnemyType enemyType) { string enemyName; MeleeMovement meleeMovement = spawnData.MeleeMovementProbability.meleeProbabilities.Find(movement => movement.enemyType == enemyType); MeleeEnemyTypeToNameContainer nameContainer = spawnData.NameContainer.meleeEnemyTypeToNameContainer.Find(container => container.meleeEnemyType == enemyType); float randomValue = Random.value; if (randomValue < meleeMovement.rushChance) { // Rushing enemy enemyName = nameContainer.meleeEnemyNames[0]; } else { float increment = meleeMovement.flankChance + meleeMovement.rushChance; enemyName = randomValue < increment ? nameContainer.meleeEnemyNames[1] : nameContainer.meleeEnemyNames[2]; } return(enemyName); }
private void GetSpawnDataFromDifficulty() { MeleeEnemySpawnData[] meleeSpawnData = meleeDifficulty.meleeDifficultyLevels[difficultyLevel].meleeEnemySpawnData; RangedEnemySpawnData[] rangedSpawnData = rangedDifficulty.rangedDifficultyLevels[difficultyLevel].rangedEnemySpawnData; _spawnData = new SpawnData(meleeSpawnData, rangedSpawnData, meleeMovementProbability, rangedMovementProbability, enemyNamesContainer); }