Jason Durand 01 45f76762fb Merge remote-tracking branch 'origin/dev' into jason
# Conflicts:
#	Assets/Scripts/Arena.cs
#	Assets/Scripts/Entity.cs
2022-04-03 18:24:40 -04:00

112 lines
3.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;
[SerializeField] AudioSource waveSource;
[SerializeField] AudioClip[] waveSounds;
[HideInInspector] public SoundManager soundManager;
void Awake() {
safeZone = GetComponentInChildren<SafeZone>();
soundManager = FindObjectOfType<SoundManager>();
}
void Start() => gameFlowManager.stateChanged += OnGameFlowStateChanged;
void OnDestroy() => gameFlowManager.stateChanged -= OnGameFlowStateChanged;
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) {
soundManager.PlaySound(waveSource, waveSounds, randomPitch: true, createTempSourceIfBusy: 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();
}
void OnGameFlowStateChanged(BaseState oldState, BaseState newState) {
if (oldState is GameFlowManager.StartFlowState && newState is GameFlowManager.GameplayFlowState)
StartCoroutine(SpawnEnemies());
}
#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
}