//alert("Loaded gnatts.js");

function Gnatt()
{
	this.row;
	this.col
	this.share; // nr of other gnatts on this pos
}

function GnattsGame()
{
	// variables
	var m_player = 0;
	var m_gnatt;

	var m_NRows;
	var m_NCols;

	// interface
	this.SetSize = function(rows, cols) {
		m_NRows = rows;
		m_NCols = cols;
	}

	this.Create = function(nGnatts) {
		m_player = new Gnatt();
		m_player.row = Math.floor(m_NRows / 2);
		m_player.col = Math.floor(m_NCols / 2);
		m_player.share = 0;

		m_gnatt = new Array(nGnatts);
		for (var i = 0; i < nGnatts; i++) {
			m_gnatt[i] = new Gnatt();
			do {
				m_gnatt[i].row = Math.floor(Math.random() * m_NRows);
				m_gnatt[i].col = Math.floor(Math.random() * m_NCols);
			} while (m_gnatt[i].row >= m_player.row - 2 && m_gnatt[i].row <= m_player.row + 2 &&
						m_gnatt[i].col >= m_player.col - 2 && m_gnatt[i].col <= m_player.col + 2)
		}

		CountGnatts();
	}

	this.GetPosition = function(i) {
		var place = new Array(3);
		place[0] = m_gnatt[i].row;
		place[1] = m_gnatt[i].col;
		place[2] = m_gnatt[i].share;
		return place;
	}

	this.GetPlayerPosition = function() {
		var place = new Array(3);
		place[0] = m_player.row;
		place[1] = m_player.col;
		place[2] = m_player.share;
		return place;
	}

	this.CanMovePlayer = function(dir) {
		if (dir == 1 || dir == 4 || dir == 7) {
			if (m_player.col <= 0)
				return false;
		}
		else if (dir == 3 || dir == 6 || dir == 9) {
			if (m_player.col >= m_NCols - 1)
				return false;
		}
		if (dir == 1 || dir == 2 || dir == 3) {
			if (m_player.row >= m_NRows - 1)
				return false;
		}
		else if (dir == 7 || dir == 8 || dir == 9) {
			if (m_player.row <= 0)
				return false;
		}
		return true;
	}

	this.MovePlayer = function(dir) {
		switch (dir) {
		case 0: Transport();
				break
		case 1: m_player.row++;
				m_player.col--;
				break
		case 2: m_player.row++;
				break
		case 3: m_player.row++;
				m_player.col++;
				break
		case 4: m_player.col--;
				break
		case 6: m_player.col++;
				break
		case 7: m_player.row--;
				m_player.col--;
				break
		case 8: m_player.row--;
				break
		case 9: m_player.row--;
				m_player.col++;
				break
		}
		//alert("moved player in direction " + dir);
		CountGnatts();
		//alert("counted gnatts");
		if (m_player.share > 0)
			return 2;
		//alert("moving gnatts");
		for (var i = 0; i < m_gnatt.length; i++)
			MoveGnatt(i);
		//alert("counting gnatts");
		CountGnatts();
		//alert("checking for win");
		return CheckForWin();
	}

	// private functions
	function CountGnatts() {
		for (var i = 0; i < m_gnatt.length; i++) {
			m_gnatt[i].share = 0;
		}
		for (var i = 0; i < m_gnatt.length; i++) {
			for (var j = i + 1; j < m_gnatt.length; j++) {
				if (m_gnatt[i].row == m_gnatt[j].row && m_gnatt[i].col == m_gnatt[j].col) {
					if (m_gnatt[i].share < 2)
						m_gnatt[i].share += 1;
					if (m_gnatt[j].share < 2)
						m_gnatt[j].share += 1;
				}
			}
			if (m_gnatt[i].row == m_player.row && m_gnatt[i].col == m_player.col) {
				m_player.share = 1;
			}
		}
	}

	function CheckForWin() {
		if (m_player.share > 0)
			return 2;
		for (var i = 0; i < m_gnatt.length; i++) {
			if (m_gnatt[i].share == 0)
				return 0;
		}
		return 1;
	}

	function MoveGnatt(i) {
		if (m_gnatt[i].share == 0) {
			var dir = CalcDir(m_player.row - m_gnatt[i].row, m_player.col - m_gnatt[i].col);
			if (dir == 0)
				alert("MoveGnatt(" + i + "): Wrong direction");
			switch (dir)
			{
			case 1: m_gnatt[i].row++;
					m_gnatt[i].col--;
					break;
			case 2: m_gnatt[i].row++;
					break;
			case 3: m_gnatt[i].row++;
					m_gnatt[i].col++;
					break;
			case 4: m_gnatt[i].col--;
					break;
			case 6: m_gnatt[i].col++;
					break;
			case 7: m_gnatt[i].row--;
					m_gnatt[i].col--;
					break;
			case 8: m_gnatt[i].row--;
					break;
			case 9: m_gnatt[i].row--;
					m_gnatt[i].col++;
					break;
			}
		}
	}

	function CalcDir(rowDiff, colDiff) {
		if (rowDiff < 0) {
			if (colDiff < 0) {
				if (colDiff <= 2 * rowDiff)
					return 4;
				else if (rowDiff <= 2 * colDiff)
					return 8;
				else
					return 7;
			}
			else {
				if (colDiff >= -2 * rowDiff)
					return 6;
				else if (-rowDiff >= 2 * colDiff)
					return 8;
				else
					return 9;
			}
		}
		else if (colDiff < 0) {
			if (-colDiff >= 2 * rowDiff)
				return 4;
			else if (rowDiff >= -2 * colDiff)
				return 2;
			else
				return 1;
		}
		else {
			if (colDiff >= 2 * rowDiff)
				return 6;
			else if (rowDiff >= 2 * colDiff)
				return 2;
			else
				return 3;
		}
		return 0;
	}
/**/
}
