skeleton-wars/Assets/TurnManagerScript.cs
2016-10-30 13:57:48 +01:00

181 lines
4.4 KiB
C#

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
public struct direction {
public int x;
public int y;
}
public struct position {
public int row;
public int column;
public position(int r, int c) {
this.row = r;
this.column = c;
}
}
public class TurnManagerScript : MonoBehaviour {
public int turnNum = 0;
public int playerNum = 2;
public int iaNum = 0;
public bool inTurn = true;
public List<List<GameObject> > unitList;
public int[,] terrain;
public GameObject[,] unitMap;
public Vector2 mapSize;
public int actualPlayer;
private int actualNumChars;
private int actualNumFinishedChars;
// Use this for initialization
void Start () {
//Estamos en turno
inTurn = true;
actualPlayer = 0;
actualNumChars = 1;//charList [actualPlayer].Count;
// Characters that have finished its actions
actualNumFinishedChars = 0;
}
// Update is called once per frame
void Update () {
if (actualNumFinishedChars == actualNumChars) {
changeTeam ((actualPlayer + 1) % playerNum);
}
}
// Attack position (i,j) -> row i, column j
void execute(Action<GameObject> act, int i, int j) {
GameObject c = unitMap [i, j];
act (c);
}
void attack(int i, int j, params int[] altParams ) {
}
void attackRange (int i, int j, int k, int l, params int[] altParams ) {
}
public bool canMoveTo(GameObject go, int i, int j) {
UnitBehaviour ub = go.GetComponent<UnitBehaviour> ();
int ra = ub.remainingActions;
int pi = (int)go.transform.position.z;
int pj = (int)go.transform.position.x;
Vector2 diff = new Vector2(Math.Abs(pi - i), Math.Abs(pj - j));
if ((diff.x+diff.y) < ub.stepLength && ra > 0 && terrain [j, i] == 0)
return true;
else
return false;
}
public void moveTo(GameObject go, int i, int j) {
UnitBehaviour ub = go.GetComponent<UnitBehaviour> ();
int pi = (int)go.transform.position.z;
int pj = (int)go.transform.position.x;
List<position> movement = getPathBFS (pi, pj, i, j);
//TODO: MOVEMENT
ub.moveAct ();
if (ub.remainingActions == 0)
actualNumFinishedChars += 1;
//Move the unit
go.transform.position = new Vector3 (j, 0, i);
//Update matrices
unitMap.SetValue(null, pi, pj);
unitMap.SetValue(go, i, j);
}
void changeTeam (int newTeam) {
actualPlayer = newTeam;
//actualNumChars = charList [actualPlayer].Count;
actualNumFinishedChars = 0;
}
public GameObject getUnitAtTile(int i, int j) {
return unitMap [i, j];
}
private direction[] directions = {
new direction(){x = 1, y= 0},
new direction(){x = 0, y= 1},
new direction(){x = -1, y= 0},
new direction(){x = 0, y= -1}
};
public List<position> getPathBFS(int x, int y, int xx, int yy) {
int[,] map = new int[(int)mapSize.y, (int)mapSize.x];
int[,] road = new int[(int)mapSize.y, (int)mapSize.x*2];
position end;
end.row = yy;
end.column = xx;
position start;
start.row = y;
start.column = x;
map [start.row, start.column] = 0;
Queue<position> qp = new Queue<position> ();
qp.Enqueue (start);
while (qp.Count != 0) {
position p = qp.Dequeue();
position[] adj = {
new position (directions [0].y + p.row, directions [0].x + p.column),
new position (directions [1].y + p.row, directions [1].x + p.column),
new position (directions [2].y + p.row, directions [2].x + p.column),
new position (directions [3].y + p.row, directions [3].x + p.column)
};
for (int i = 0; i < 4; i++) {
position a = adj [i];
if (a.row >= 0 && a.row < mapSize.y && a.column >= 0 && a.column < mapSize.x) { // If not out of bounds
if(map[a.row,a.column] != -2){
if (terrain [a.row, a.column] != 0) {
if (map [a.row, a.column] > map [p.row, p.column] || map [a.row, a.column] == -1) {
qp.Enqueue (a);
map [a.row, a.column] = map [p.row, p.column] + 1;
road [a.row, a.column * 2] = p.row;
road [a.row, a.column * 2 + 1] = p.column;
}
} else {
map [a.row, a.column] = -2;
}
}
}
}
}
int e1 = end.row;
int e2 = end.column;
int t;
List<position> res = new List<position>();
while (map[e1,e2] != 0){
res.Add (new position (e1, e2));
t = e2;
e1 = road[t, e2*2];
e2 = road [t, (e2 * 2) + 1];
}
return res;
}
/*void OnGUI(){
if (showActions) {
GUI.Box (new Rect(0, 0, 100, 100), "Move");
GUI.Box (new Rect(100, 0, 100, 100), "Attack");
}
}*/
}