RiftMayhem/Assets/Scripts/RiftSystem/RiftRaiding/RiftRaidEnemySpawner.cs
2025-02-21 18:35:51 +00:00

124 lines
4.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RiftRaidEnemySpawner : MonoBehaviour
{
[Header("ZoneData:")]
[SerializeField] private ZoneData zoneData;
[Header("Events:")]
[SerializeField] private GameEvent onMultiJobBonusRetrievedEvent;
[Header("Listeners:")]
[SerializeField] private GameEventListener_Float experienceOnDeath;
[SerializeField] private GameEventListener onMapReady;
[Header("Enemies:")]
[SerializeField] private List<GameObject> enemyPrefabs = new List<GameObject>();
[Header("Boss Prefabs:")]
[SerializeField] private List<GameObject> bossPrefabs = new List<GameObject>();
[Header("Spawnpoint Variations:")]
[SerializeField] private List<Transform> spawnpoints = new List<Transform>();
[Header("Boss Spawnpoint")]
[SerializeField] private Transform bossSpawnpoint;
[Header("CloseRiftReward Spawnpoint")]
[SerializeField] private Transform closeRiftRewardSpawnpoint;
UnitDifficultySettings unitDifficultySettings;
UnitDifficultySetter unitDifficultySetter;
GameObject spawnedEnemy;
int spawnpointIndex;
int totalEnemies;
bool rewardSent = false;
public Dictionary<int, int> enemyType_Quantity;
private List<int[]> keyValuePairs = new List<int[]>();
private void Awake()
{
enemyType_Quantity = new Dictionary<int, int>();
for (int i = 0; i < zoneData.possibleEnemies.Count; i++)
{
enemyType_Quantity.Add((int)zoneData.possibleEnemies[i], Random.Range(GameConstants.GameBalancing.GetMinimumQuantityByEnemyID(zoneData.possibleEnemies[i]), GameConstants.GameBalancing.GetMaximumQuantityByEnemyID(zoneData.possibleEnemies[i])));
}
unitDifficultySettings = GameDifficultyController.Instance.GetCurrentDifficultySettings();
experienceOnDeath.Response.AddListener(CountTowardsCompletion);
onMapReady.Response.AddListener(StartSpawnEnemies);
}
private void StartSpawnEnemies()
{
StartCoroutine(SpawnEnemies());
}
IEnumerator SpawnEnemies()
{
keyValuePairs.Clear();
foreach (KeyValuePair<int, int> entry in enemyType_Quantity)
{
keyValuePairs.Add(new int[]
{
entry.Key,
entry.Value
});
}
yield return null;
for (int i = 0; i < keyValuePairs.Count; i++)
{
spawnpointIndex = i;
spawnpointIndex %= spawnpoints.Count;
for (int j = 0; j < keyValuePairs[i][1]; j++)
{
spawnedEnemy = Instantiate(enemyPrefabs[keyValuePairs[i][0]], spawnpoints[spawnpointIndex].position, spawnpoints[spawnpointIndex].rotation);
totalEnemies++;
unitDifficultySetter = spawnedEnemy.GetComponentInChildren<UnitDifficultySetter>(true);
unitDifficultySetter.InitializeUnitDifficulty(unitDifficultySettings);
yield return null;
}
}
spawnedEnemy = Instantiate(bossPrefabs[Random.Range(0, bossPrefabs.Count)], bossSpawnpoint.position, bossSpawnpoint.rotation);
totalEnemies++;
unitDifficultySetter = spawnedEnemy.GetComponentInChildren<UnitDifficultySetter>(true);
unitDifficultySetter.InitializeUnitDifficulty(unitDifficultySettings);
yield return null;
spawnedEnemy = Instantiate(bossPrefabs[Random.Range(0, bossPrefabs.Count)], bossSpawnpoint.position, bossSpawnpoint.rotation);
totalEnemies++;
unitDifficultySetter = spawnedEnemy.GetComponentInChildren<UnitDifficultySetter>(true);
unitDifficultySetter.InitializeUnitDifficulty(unitDifficultySettings);
yield return null;
spawnedEnemy = Instantiate(bossPrefabs[Random.Range(0, bossPrefabs.Count)], bossSpawnpoint.position, bossSpawnpoint.rotation);
totalEnemies++;
unitDifficultySetter = spawnedEnemy.GetComponentInChildren<UnitDifficultySetter>(true);
unitDifficultySetter.InitializeUnitDifficulty(unitDifficultySettings);
yield return new WaitForSeconds(0.5f);
}
private void CountTowardsCompletion(float exp)
{
totalEnemies--;
if (totalEnemies <= 0 && !rewardSent)
{
onMultiJobBonusRetrievedEvent.Raise();
rewardSent = true;
}
}
}