using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
///
/// This is attached to an empty game object in the battle scene. This class
/// manages all aspects of the battle that occurs.
///
public class BattleManager : MonoBehaviour {
// The locations where enemies may appear within the scene.
public GameObject[] EnemySpawnPoints;
// The enemies that may be placed on the spawn points
public GameObject[] EnemyPrefabs;
// When enemies are placed they slide into place based on the curve
public AnimationCurve SpawnAnimationCurve;
// Reference to the actions that a player may perform
public CanvasGroup theButtons;
// The number of enemies in the scene
private int enemyCount;
// This enumeration defines the components of a turn
enum BattlePhase
{
PlayerAttack,
EnemyAttack
}
// Track which phase of the turn we are on
private BattlePhase phase;
// Use this for initialization
void Start () {
// Calculate how many enemies will be in the scene (battle)
enemyCount = Random.Range(1, EnemySpawnPoints.Length);
// Spawn the enemies in
StartCoroutine(SpawnEnemies());
// Set the beginning battle phase - player always has initiative in this game
phase = BattlePhase.PlayerAttack;
}
void Update()
{
// Control the display of the player action buttons. Only show when it is the
// player's turn
if (phase == BattlePhase.PlayerAttack)
{
theButtons.alpha = 1;
theButtons.interactable = true;
theButtons.blocksRaycasts = true;
}
else
{
theButtons.alpha = 0;
theButtons.interactable = false;
theButtons.blocksRaycasts = false;
}
}
///
/// A player action. This action leaves the battle scene and returns to the world.
///
public void RunAway()
{
GameState.justExitedBattle = true;
NavigationManager.NavigateTo("Overworld");
}
///
/// This method creates enemies from the prefabs and calls the method
/// that moves the enemies to the spawn points.
///
///
IEnumerator SpawnEnemies()
{
// Spawn enemies in over time
for (int i = 0; i < enemyCount; i++)
{
var newEnemy = (GameObject)Instantiate(EnemyPrefabs[0]);
newEnemy.transform.position = new Vector3(10, -1, 0);
yield return StartCoroutine(MoveCharacterToPoint(EnemySpawnPoints[i], newEnemy));
newEnemy.transform.parent = EnemySpawnPoints[i].transform;
}
}
///
/// Moves the character into position using an animation that slides the char into place.
///
///
///
///
IEnumerator MoveCharacterToPoint(GameObject destination, GameObject character)
{
float timer = 0f;
var StartPosition = character.transform.position;
if (SpawnAnimationCurve.length > 0)
{
while (timer < SpawnAnimationCurve.keys[SpawnAnimationCurve.length - 1].time)
{
character.transform.position = Vector3.Lerp(StartPosition, destination.transform.position, SpawnAnimationCurve.Evaluate(timer));
timer += Time.deltaTime;
yield return new WaitForEndOfFrame();
}
}
else
{
character.transform.position = destination.transform.position;
}
}
}