2022-04-03 16:15:24 -04:00

89 lines
2.5 KiB
C#

#nullable enable
using System;
using System.Collections;
using NaughtyAttributes;
using UnityEngine;
using Random = UnityEngine.Random;
public class Arena : MonoBehaviour {
[Serializable]
struct GladiatorEntrance {
public Vector2 position;
public Vector2 direction;
}
[SerializeField] [Required]
GameFlowManager gameFlowManager = null!;
//TODO Add some kind of "MinLength(1)" attribute
[SerializeField]
GladiatorEntrance[] spawners = null!;
[SerializeField] [Required]
ArenaStats stats = null!;
[SerializeField] [Required]
GameObject entityPrefab = null!;
[field: SerializeField] [field: Required]
public Transform gladiatorParent { get; private set; } = null!;
[field: SerializeField] [field: Required]
public Transform minionParent { get; private set; } = null!;
[field: SerializeField] [field: Required]
public Transform graveyard { get; private set; } = null!;
SafeZone safeZone = null!;
[field: SerializeField]int currWaveSize = 0;
void Awake() => safeZone = GetComponentInChildren<SafeZone>();
void Start() => StartCoroutine(SpawnEnemies());
void SpawnEnemy(int spawnerIndex) {
if (!gameFlowManager.CanDoAction)
return;
var gladiator = Instantiate(entityPrefab, gladiatorParent).GetComponent<Gladiator>();
gladiator.arena = this;
float randFloat = Random.Range(0.1f, 0.5f);
Vector2 offset = new Vector2(randFloat, randFloat);
gladiator.transform.position = spawners[spawnerIndex].position + offset;
gladiator.direction = spawners[spawnerIndex].direction;
gladiator.gameFlowManager = gameFlowManager;
}
IEnumerator SpawnEnemies() {
yield return new WaitForSeconds(stats.initWaitToSpawn);
currWaveSize = stats.initWaveSize;
int currentSpawner = 0;
int amountSpawned = 0;
int wave = 1;
while(true){
while (amountSpawned < currWaveSize) {
currentSpawner = Random.Range(0, spawners.Length);
SpawnEnemy(currentSpawner);
amountSpawned++;
}
if(wave++ >= stats.increaseWaveStep){
if((currWaveSize += stats.waveIncrease) > stats.maxWaveSize) currWaveSize=stats.maxWaveSize;
}
amountSpawned = 0;
yield return new WaitForSeconds(stats.secondsBetweenSpawners);
}
}
public Vector3 GetMoatExtents(){
return safeZone.GetMoatExtents();
}
#if UNITY_EDITOR
void OnDrawGizmosSelected() {
Gizmos.color = Color.blue;
foreach (GladiatorEntrance entrance in spawners) {
Gizmos.DrawWireCube(entrance.position, Vector3.one);
Gizmos.DrawLine(entrance.position, entrance.position + entrance.direction);
}
}
#endif
}