public void undo() { Debug.Log("undo"); Vector3 def = new Vector3(0, 0, 0); int i; bool done = false; for (i = 0; i < maxActions && !done; i++) { if (prevMove[i] == def) { i--; done = true; } } if (!done) { i = maxActions - 1; } if (i >= 0) { if ((grid.objects[(int)Mathf.Floor(prevMove[i].x), (int)Mathf.Round(prevMove[i].y / 0.75f)].GetComponent(typeof(tileData)) as tileData).tank != null) { Vector3 pos = this.transform.position; tileData tile = grid.objects[(int)Mathf.Floor(pos.x), (int)Mathf.Round(pos.y / 0.75f)].GetComponent(typeof(tileData)) as tileData; tile.tank = null; tile = grid.objects[(int)Mathf.Floor(prevMove[i].x), (int)Mathf.Round(prevMove[i].y / 0.75f)].GetComponent(typeof(tileData)) as tileData; tile.tank = this; this.transform.position = prevMove[i]; } } }
IEnumerator enemySpawn() { int num = UnityEngine.Random.Range(2, (int)Mathf.Floor(difficulty) + 1); GameObject temp; for (int i = 0; i < num; i++) { float y = UnityEngine.Random.Range(0, rows); float x = (float)UnityEngine.Random.Range(columns * 2 / 3 - 1, columns - 1); tileData tile = objects[(int)x, (int)y].GetComponent(typeof(tileData)) as tileData; if (y % 2 == 1) { x += 0.5f; } y = y * 0.75f; while (tile.enemy != null || tile.isWater || tile.blocked || tile.city || tile.tank != null) { } temp = Instantiate(enemyFabs[UnityEngine.Random.Range(0, enemyFabs.GetLength(0))], new Vector3(12, y, -0.1f), Quaternion.identity) as GameObject; float elapsedTime = 0.0f; while (elapsedTime < 0.5f) { temp.transform.position = Vector3.Lerp(new Vector3(12, y, -0.1f), new Vector3(x, y, -0.1f), elapsedTime / 0.5f); elapsedTime += Time.deltaTime; yield return(new WaitForEndOfFrame()); } temp.transform.position = new Vector3(x, y, -0.1f); temp.transform.SetParent(enemyContainer); tile.enemy = temp.GetComponent(typeof(Enemy)) as Enemy; } waiting = false; }
void OnMouseDown() { GameObject[] tanks = GameObject.FindGameObjectsWithTag("Moving"); foreach (GameObject tank in tanks) { Tank t = (tank.GetComponent(typeof(Tank))) as Tank; BoardManager grid = (BoardManager)FindObjectOfType(typeof(BoardManager)); Vector3 def = new Vector3(0, 0, 0); bool done = false; for (int i = 0; i < t.maxActions && !done; i++) { if (grid.prevMove[i] == def) { grid.prevMove[i] = t.transform.position; grid.prevTank[i] = t.id; done = true; } } Vector3 pos = t.transform.position; GameObject cur = grid.objects[(int)Mathf.Floor(pos.x), (int)Mathf.Round(pos.y / 0.75f)]; tileData tile = cur.GetComponent(typeof(tileData)) as tileData; tile.tank = null; t.transform.position = this.transform.position; cur = grid.objects[(int)Mathf.Floor(this.transform.position.x), (int)Mathf.Round(this.transform.position.y / 0.75f)]; tile = cur.GetComponent(typeof(tileData)) as tileData; tile.tank = t; t.hideMoveableTiles(); t.actions--; } }
public IEnumerator attack() { BoardManager grid = (BoardManager)FindObjectOfType(typeof(BoardManager)); Vector3 def = new Vector3(0, 0, 0); if (tileToHitDiff != def) { Vector3 target = new Vector3(this.transform.position.x + tileToHitDiff.x, this.transform.position.y + tileToHitDiff.y, 0.0f); if (target.x >= 0 && target.x < grid.getCols() && target.y >= 0 && target.y < grid.getRows()) { GameObject hit = grid.objects[(int)Mathf.Floor(target.x), (int)Mathf.Round(target.y / 0.75f)]; tileData tile = hit.GetComponent(typeof(tileData)) as tileData; if (tile.city) { grid.damageCity(dmg); } else if (tile.enemy != null) { tile.enemy.damage(dmg); } else if (tile.tank != null) { tile.tank.damage(dmg); } } //Play audio Destroy(tileToHit); yield return(new WaitForSeconds(0.5f)); } waiting = false; }
// Functions // = = = = = = = = = = = = = = = = = = = = > private void BuildNewMap() { for (int x = 0; x < mapTileWide; x++) { for (int y = 0; y < mapTileHigh; y++) { Tiles [x, y] = new tileData(x, y); Tiles [x, y].GroundType = "Space"; Tiles [x, y].ObjectType = "None"; } } }
void FillAllTiles() { bounds = tilemap.cellBounds; TileBase[] tileBounds = tilemap.GetTilesBlock(bounds); for (int x = 0; x < bounds.size.x; x++) { for (int y = 0; y < bounds.size.y; y++) { TileBase tile = tileBounds[x + y * bounds.size.x]; if (tile != null) { tileData tileData = new tileData(); tileData.tile = tile; tileData.posX = x + bounds.x; tileData.posY = y + bounds.y; allTiles.Add(tileData); } } } }
TileDirection CalculateNearby(tileData tile) { TileDirection direction = TileDirection.SOLO; List <int> values = new List <int>(); if (tilemap.GetTile(new Vector3Int(tile.posX, tile.posY + 1, 0)) == null) { values.Add(1); } if (tilemap.GetTile(new Vector3Int(tile.posX + 1, tile.posY, 0)) == null) { values.Add(2); } if (tilemap.GetTile(new Vector3Int(tile.posX, tile.posY - 1, 0)) == null) { values.Add(3); } if (tilemap.GetTile(new Vector3Int(tile.posX - 1, tile.posY, 0)) == null) { values.Add(4); } if (values.Count == 1) { if (values.Contains(1)) { direction = TileDirection.UP; } else if (values.Contains(2)) { direction = TileDirection.RIGHT; } else if (values.Contains(3)) { direction = TileDirection.DOWN; } else if (values.Contains(4)) { direction = TileDirection.LEFT; } } else if (values.Count == 2) { if (values.Contains(1) && values.Contains(2)) { direction = TileDirection.URC; } else if (values.Contains(2) && values.Contains(3)) { direction = TileDirection.LRC; } else if (values.Contains(3) && values.Contains(4)) { direction = TileDirection.LLC; } else if (values.Contains(4) && values.Contains(1)) { direction = TileDirection.ULC; } else if (values.Contains(1) && values.Contains(3)) { direction = TileDirection.TWOS; } else if (values.Contains(2) && values.Contains(4)) { direction = TileDirection.TWOU; } } else if (values.Count == 3) { if (values.Contains(1) && values.Contains(2) && values.Contains(4)) { direction = TileDirection.THREEUP; } else if (values.Contains(1) && values.Contains(2) && values.Contains(3)) { direction = TileDirection.THREERIGHT; } else if (values.Contains(2) && values.Contains(3) && values.Contains(4)) { direction = TileDirection.THREEDOWN; } else if (values.Contains(3) && values.Contains(4) && values.Contains(1)) { direction = TileDirection.THREELEFT; } } else if (values.Count == 4) { direction = TileDirection.FULL; } return(direction); }
public IEnumerator fire(Vector3 pos, Vector3 target) { BoardManager grid = (BoardManager)FindObjectOfType(typeof(BoardManager)); tileData tile; tile = grid.objects[(int)Mathf.Floor(target.x), (int)Mathf.Round(target.y / 0.75f)].GetComponent(typeof(tileData)) as tileData; if (tile.enemy != null) { tile.enemy.damage(damage); if ((int)Mathf.Round(target.y / 0.75f) > (int)Mathf.Round(pos.y / 0.75f)) { if (target.x > pos.x) { if ((int)Mathf.Floor(target.x + 0.5f) < grid.getCols() && (int)Mathf.Round((target.y + 0.75f) / 0.75f) >= 0) { tileData temp = grid.objects[(int)Mathf.Floor(target.x + 0.5f), (int)Mathf.Round((target.y + 0.75f) / 0.75f)].GetComponent(typeof(tileData)) as tileData; if (temp.blocked) { tile.enemy.damage(1); } else if (temp.city) { tile.enemy.damage(1); grid.damageCity(1); } else if (temp.tank != null) { tile.enemy.damage(1); temp.tank.damage(1); } else if (temp.enemy != null) { tile.enemy.damage(1); temp.enemy.damage(1); } else if (temp.isWater) { GameObject e = tile.enemy.getGameObject(); enemyBear en = e.GetComponent(typeof(enemyBear)) as enemyBear; if (en != null) { en.transform.position = temp.transform.position; yield return(new WaitForSeconds(0.1f)); Destroy(e); tile.enemy = null; } } else if (tile.isNull) { } else { GameObject e = tile.enemy.getGameObject(); enemyBear en = e.GetComponent(typeof(enemyBear)) as enemyBear; if (en != null) { float elapsedTime = 0.0f; while (elapsedTime < 0.5f) { en.transform.position = Vector3.Lerp(tile.transform.position, temp.transform.position, elapsedTime / 0.5f); elapsedTime += Time.deltaTime; yield return(new WaitForEndOfFrame()); } en.transform.position = temp.transform.position; temp.enemy = tile.enemy; tile.enemy = null; en.moveAttack(new Vector3(0.5f, 0.75f, 0.0f)); } } } } else { if ((int)Mathf.Floor(target.x - 0.5f) < grid.getCols() && (int)Mathf.Round((target.y + 0.75f) / 0.75f) >= 0) { tileData temp = grid.objects[(int)Mathf.Floor(target.x - 0.5f), (int)Mathf.Round((target.y + 0.75f) / 0.75f)].GetComponent(typeof(tileData)) as tileData; if (temp.blocked) { tile.enemy.damage(1); } else if (temp.city) { tile.enemy.damage(1); grid.damageCity(1); } else if (temp.tank != null) { tile.enemy.damage(1); temp.tank.damage(1); } else if (temp.enemy != null) { tile.enemy.damage(1); temp.enemy.damage(1); } else if (temp.isWater) { GameObject e = tile.enemy.getGameObject(); enemyBear en = e.GetComponent(typeof(enemyBear)) as enemyBear; if (en != null) { en.transform.position = temp.transform.position; yield return(new WaitForSeconds(0.1f)); Destroy(e); tile.enemy = null; } } else if (tile.isNull) { } else { GameObject e = tile.enemy.getGameObject(); enemyBear en = e.GetComponent(typeof(enemyBear)) as enemyBear; if (en != null) { float elapsedTime = 0.0f; while (elapsedTime < 0.5f) { en.transform.position = Vector3.Lerp(tile.transform.position, temp.transform.position, elapsedTime / 0.5f); elapsedTime += Time.deltaTime; yield return(new WaitForEndOfFrame()); } en.transform.position = temp.transform.position; temp.enemy = tile.enemy; tile.enemy = null; en.moveAttack(new Vector3(-0.5f, 0.75f, 0.0f)); } } } } } else if ((int)Mathf.Round(target.y / 0.75f) < (int)Mathf.Round(pos.y / 0.75f)) { if (target.x > pos.x) { if ((int)Mathf.Floor(target.x + 0.5f) < grid.getCols() && (int)Mathf.Round((target.y - 0.75f) / 0.75f) >= 0) { tileData temp = grid.objects[(int)Mathf.Floor(target.x + 0.5f), (int)Mathf.Round((target.y - 0.75f) / 0.75f)].GetComponent(typeof(tileData)) as tileData; if (temp.blocked) { tile.enemy.damage(1); } else if (temp.city) { tile.enemy.damage(1); grid.damageCity(1); } else if (temp.tank != null) { tile.enemy.damage(1); temp.tank.damage(1); } else if (temp.enemy != null) { tile.enemy.damage(1); temp.enemy.damage(1); } else if (temp.isWater) { GameObject e = tile.enemy.getGameObject(); enemyBear en = e.GetComponent(typeof(enemyBear)) as enemyBear; if (en != null) { en.transform.position = temp.transform.position; yield return(new WaitForSeconds(0.1f)); Destroy(e); tile.enemy = null; } } else if (tile.isNull) { } else { GameObject e = tile.enemy.getGameObject(); enemyBear en = e.GetComponent(typeof(enemyBear)) as enemyBear; if (en != null) { float elapsedTime = 0.0f; while (elapsedTime < 0.5f) { en.transform.position = Vector3.Lerp(tile.transform.position, temp.transform.position, elapsedTime / 0.5f); elapsedTime += Time.deltaTime; yield return(new WaitForEndOfFrame()); } en.transform.position = temp.transform.position; temp.enemy = tile.enemy; tile.enemy = null; en.moveAttack(new Vector3(0.5f, -0.75f, 0.0f)); } } } } else { if ((int)Mathf.Floor(target.x - 0.5f) < grid.getCols() && (int)Mathf.Round((target.y - 0.75f) / 0.75f) >= 0) { tileData temp = grid.objects[(int)Mathf.Floor(target.x - 0.5f), (int)Mathf.Round((target.y - 0.75f) / 0.75f)].GetComponent(typeof(tileData)) as tileData; if (temp.blocked) { tile.enemy.damage(1); } else if (temp.city) { tile.enemy.damage(1); grid.damageCity(1); } else if (temp.tank != null) { tile.enemy.damage(1); temp.tank.damage(1); } else if (temp.enemy != null) { tile.enemy.damage(1); temp.enemy.damage(1); } else if (temp.isWater) { GameObject e = tile.enemy.getGameObject(); enemyBear en = e.GetComponent(typeof(enemyBear)) as enemyBear; if (en != null) { en.transform.position = temp.transform.position; yield return(new WaitForSeconds(0.1f)); Destroy(e); tile.enemy = null; } } else if (tile.isNull) { } else { GameObject e = tile.enemy.getGameObject(); enemyBear en = e.GetComponent(typeof(enemyBear)) as enemyBear; if (en != null) { float elapsedTime = 0.0f; while (elapsedTime < 0.5f) { en.transform.position = Vector3.Lerp(tile.transform.position, temp.transform.position, elapsedTime / 0.5f); elapsedTime += Time.deltaTime; yield return(new WaitForEndOfFrame()); } en.transform.position = temp.transform.position; temp.enemy = tile.enemy; tile.enemy = null; en.moveAttack(new Vector3(-0.5f, -0.75f, 0.0f)); } } } } } else { if (target.x > pos.x) { if ((int)Mathf.Floor(target.x + 1.0f) < grid.getCols()) { tileData temp = grid.objects[(int)Mathf.Floor(target.x + 1.0f), (int)Mathf.Round(target.y / 0.75f)].GetComponent(typeof(tileData)) as tileData; if (temp.blocked) { tile.enemy.damage(1); } else if (temp.city) { tile.enemy.damage(1); grid.damageCity(1); } else if (temp.tank != null) { tile.enemy.damage(1); temp.tank.damage(1); } else if (temp.enemy != null) { tile.enemy.damage(1); temp.enemy.damage(1); } else if (temp.isWater) { GameObject e = tile.enemy.getGameObject(); enemyBear en = e.GetComponent(typeof(enemyBear)) as enemyBear; if (en != null) { en.transform.position = temp.transform.position; yield return(new WaitForSeconds(0.1f)); Destroy(e); tile.enemy = null; } } else if (tile.isNull) { } else { GameObject e = tile.enemy.getGameObject(); enemyBear en = e.GetComponent(typeof(enemyBear)) as enemyBear; if (en != null) { float elapsedTime = 0.0f; while (elapsedTime < 0.5f) { en.transform.position = Vector3.Lerp(tile.transform.position, temp.transform.position, elapsedTime / 0.5f); elapsedTime += Time.deltaTime; yield return(new WaitForEndOfFrame()); } en.transform.position = temp.transform.position; temp.enemy = tile.enemy; tile.enemy = null; en.moveAttack(new Vector3(1.0f, 0.0f, 0.0f)); } } } } else { if ((int)Mathf.Floor(target.x - 1.0f) >= 0) { tileData temp = grid.objects[(int)Mathf.Floor(target.x - 1.0f), (int)Mathf.Round(target.y / 0.75f)].GetComponent(typeof(tileData)) as tileData; if (temp.blocked) { tile.enemy.damage(1); } else if (temp.city) { tile.enemy.damage(1); grid.damageCity(1); } else if (temp.tank != null) { tile.enemy.damage(1); temp.tank.damage(1); } else if (temp.enemy != null) { tile.enemy.damage(1); temp.enemy.damage(1); } else if (temp.isWater) { GameObject e = tile.enemy.getGameObject(); enemyBear en = e.GetComponent(typeof(enemyBear)) as enemyBear; if (en != null) { en.transform.position = temp.transform.position; yield return(new WaitForSeconds(0.1f)); Destroy(e); tile.enemy = null; } } else if (tile.isNull) { } else { GameObject e = tile.enemy.getGameObject(); enemyBear en = e.GetComponent(typeof(enemyBear)) as enemyBear; if (en != null) { float elapsedTime = 0.0f; while (elapsedTime < 0.5f) { en.transform.position = Vector3.Lerp(tile.transform.position, temp.transform.position, elapsedTime / 0.5f); elapsedTime += Time.deltaTime; yield return(new WaitForEndOfFrame()); } en.transform.position = temp.transform.position; temp.enemy = tile.enemy; tile.enemy = null; en.moveAttack(new Vector3(-1.0f, 0.0f, 0.0f)); } } } } } } }
public IEnumerator move() { BoardManager grid = (BoardManager)FindObjectOfType(typeof(BoardManager)); Queue <GameObject>[] queues = new Queue <GameObject> [movement + 1]; GameObject cur; tileData tile; bool targetFound = false; Vector3 originalPosition = this.transform.position; Vector3 finalPosition = new Vector3(0.0f, 0.0f, 0.0f); for (int i = 0; i < movement + 1; i++) { queues[i] = new Queue <GameObject>(); } if (Mathf.Floor(this.transform.position.x + 1) < grid.getCols() && Mathf.Round(this.transform.position.y / 0.75f) < grid.getRows()) { queues[0].Enqueue(grid.objects[(int)Mathf.Floor(this.transform.position.x + 1), (int)Mathf.Round(this.transform.position.y / 0.75f)]); } if (Mathf.Floor(this.transform.position.x - 1) >= 0 && Mathf.Round(this.transform.position.y / 0.75f) < grid.getRows()) { queues[0].Enqueue(grid.objects[(int)Mathf.Floor(this.transform.position.x - 1), (int)Mathf.Round(this.transform.position.y / 0.75f)]); } if (Mathf.Floor(this.transform.position.x + 0.5f) < grid.getCols() && Mathf.Round(this.transform.position.y / 0.75f + 1) < grid.getRows()) { queues[0].Enqueue(grid.objects[(int)Mathf.Floor(this.transform.position.x + 0.5f), (int)Mathf.Round(this.transform.position.y / 0.75f + 1)]); } if (Mathf.Floor(this.transform.position.x + 0.5f) < grid.getCols() && Mathf.Round(this.transform.position.y / 0.75f - 1) >= 0) { queues[0].Enqueue(grid.objects[(int)Mathf.Floor(this.transform.position.x + 0.5f), (int)Mathf.Round(this.transform.position.y / 0.75f - 1)]); } if (Mathf.Floor(this.transform.position.x - 0.5f) >= 0 && Mathf.Round(this.transform.position.y / 0.75f + 1) < grid.getRows()) { queues[0].Enqueue(grid.objects[(int)Mathf.Floor(this.transform.position.x - 0.5f), (int)Mathf.Round(this.transform.position.y / 0.75f + 1)]); } if (Mathf.Floor(this.transform.position.x - 0.5f) >= 0 && Mathf.Round(this.transform.position.y / 0.75f - 1) >= 0) { queues[0].Enqueue(grid.objects[(int)Mathf.Floor(this.transform.position.x - 0.5f), (int)Mathf.Round(this.transform.position.y / 0.75f - 1)]); } for (int i = 0; i < movement && !targetFound; i++) { while (queues[i].Count != 0 && !targetFound) { cur = queues[i].Dequeue(); tile = cur.GetComponent(typeof(tileData)) as tileData; if (tile.city) { targetFound = true; tileToHitDiff = new Vector3(cur.transform.position.x, cur.transform.position.y, cur.transform.position.z); } else if ((tile.tank == null) && !tile.blocked && !tile.isNull && (tile.enemy == null) && !tile.isWater) { GameObject temp; bool found; if (Mathf.Floor(cur.transform.position.x + 1) < grid.getCols() && Mathf.Round(cur.transform.position.y / 0.75f) < grid.getRows()) { temp = grid.objects[(int)Mathf.Floor(cur.transform.position.x + 1), (int)Mathf.Round(cur.transform.position.y / 0.75f)]; found = false; for (int j = 0; j < movement && !found; j++) { if (queues[j].Contains(temp)) { found = true; } } if (!found) { queues[i + 1].Enqueue(temp); } } if (Mathf.Floor(cur.transform.position.x - 1) >= 0 && Mathf.Round(cur.transform.position.y / 0.75f) < grid.getRows()) { temp = grid.objects[(int)Mathf.Floor(cur.transform.position.x - 1), (int)Mathf.Round(cur.transform.position.y / 0.75f)]; found = false; for (int j = 0; j < movement && !found; j++) { if (queues[j].Contains(temp)) { found = true; } } if (!found) { queues[i + 1].Enqueue(temp); } } if (Mathf.Floor(cur.transform.position.x + 0.5f) < grid.getCols() && Mathf.Round(cur.transform.position.y / 0.75f + 1) < grid.getRows()) { temp = grid.objects[(int)Mathf.Floor(cur.transform.position.x + 0.5f), (int)Mathf.Round(cur.transform.position.y / 0.75f + 1)]; found = false; for (int j = 0; j < movement && !found; j++) { if (queues[j].Contains(temp)) { found = true; } } if (!found) { queues[i + 1].Enqueue(temp); } } if (Mathf.Floor(cur.transform.position.x + 0.5f) < grid.getCols() && Mathf.Round(cur.transform.position.y / 0.75f - 1) >= 0) { temp = grid.objects[(int)Mathf.Floor(cur.transform.position.x + 0.5f), (int)Mathf.Round(cur.transform.position.y / 0.75f - 1)]; found = false; for (int j = 0; j < movement && !found; j++) { if (queues[j].Contains(temp)) { found = true; } } if (!found) { queues[i + 1].Enqueue(temp); } } if (Mathf.Floor(cur.transform.position.x - 0.5f) >= 0 && Mathf.Round(cur.transform.position.y / 0.75f + 1) < grid.getRows()) { temp = grid.objects[(int)Mathf.Floor(cur.transform.position.x - 0.5f), (int)Mathf.Round(cur.transform.position.y / 0.75f + 1)]; found = false; for (int j = 0; j < movement && !found; j++) { if (queues[j].Contains(temp)) { found = true; } } if (!found) { queues[i + 1].Enqueue(temp); } } if (Mathf.Floor(cur.transform.position.x - 0.5f) >= 0 && Mathf.Round(cur.transform.position.y / 0.75f - 1) >= 0) { temp = grid.objects[(int)Mathf.Floor(cur.transform.position.x - 0.5f), (int)Mathf.Round(cur.transform.position.y / 0.75f - 1)]; found = false; for (int j = 0; j < movement && !found; j++) { if (queues[j].Contains(temp)) { found = true; } } if (!found) { queues[i + 1].Enqueue(temp); } } } //inside loop } } while (queues[movement].Count != 0 && !targetFound) { cur = queues[movement].Dequeue(); tile = cur.GetComponent(typeof(tileData)) as tileData; if (tile.city) { targetFound = true; tileToHitDiff = new Vector3(cur.transform.position.x, cur.transform.position.y, cur.transform.position.z); } } if (!targetFound) { if (Mathf.Floor(this.transform.position.x + 1) < grid.getCols() && Mathf.Round(this.transform.position.y / 0.75f) < grid.getRows()) { queues[0].Enqueue(grid.objects[(int)Mathf.Floor(this.transform.position.x + 1), (int)Mathf.Round(this.transform.position.y / 0.75f)]); } if (Mathf.Floor(this.transform.position.x - 1) >= 0 && Mathf.Round(this.transform.position.y / 0.75f) < grid.getRows()) { queues[0].Enqueue(grid.objects[(int)Mathf.Floor(this.transform.position.x - 1), (int)Mathf.Round(this.transform.position.y / 0.75f)]); } if (Mathf.Floor(this.transform.position.x + 0.5f) < grid.getCols() && Mathf.Round(this.transform.position.y / 0.75f + 1) < grid.getRows()) { queues[0].Enqueue(grid.objects[(int)Mathf.Floor(this.transform.position.x + 0.5f), (int)Mathf.Round(this.transform.position.y / 0.75f + 1)]); } if (Mathf.Floor(this.transform.position.x + 0.5f) < grid.getCols() && Mathf.Round(this.transform.position.y / 0.75f - 1) >= 0) { queues[0].Enqueue(grid.objects[(int)Mathf.Floor(this.transform.position.x + 0.5f), (int)Mathf.Round(this.transform.position.y / 0.75f - 1)]); } if (Mathf.Floor(this.transform.position.x - 0.5f) >= 0 && Mathf.Round(this.transform.position.y / 0.75f + 1) < grid.getRows()) { queues[0].Enqueue(grid.objects[(int)Mathf.Floor(this.transform.position.x - 0.5f), (int)Mathf.Round(this.transform.position.y / 0.75f + 1)]); } if (Mathf.Floor(this.transform.position.x - 0.5f) >= 0 && Mathf.Round(this.transform.position.y / 0.75f - 1) >= 0) { queues[0].Enqueue(grid.objects[(int)Mathf.Floor(this.transform.position.x - 0.5f), (int)Mathf.Round(this.transform.position.y / 0.75f - 1)]); } for (int i = 0; i < movement && !targetFound; i++) { while (queues[i].Count != 0 && !targetFound) { cur = queues[i].Dequeue(); tile = cur.GetComponent(typeof(tileData)) as tileData; if (tile.tank != null) { targetFound = true; tileToHitDiff = new Vector3(cur.transform.position.x, cur.transform.position.y, cur.transform.position.z); } else if ((tile.tank == null) && !tile.blocked && !tile.isNull && (tile.enemy == null) && !tile.isWater) { GameObject temp; bool found; if (Mathf.Floor(cur.transform.position.x + 1) < grid.getCols() && Mathf.Round(cur.transform.position.y / 0.75f) < grid.getRows()) { temp = grid.objects[(int)Mathf.Floor(cur.transform.position.x + 1), (int)Mathf.Round(cur.transform.position.y / 0.75f)]; found = false; for (int j = 0; j < movement && !found; j++) { if (queues[j].Contains(temp)) { found = true; } } if (!found) { queues[i + 1].Enqueue(temp); } } if (Mathf.Floor(cur.transform.position.x - 1) >= 0 && Mathf.Round(cur.transform.position.y / 0.75f) < grid.getRows()) { temp = grid.objects[(int)Mathf.Floor(cur.transform.position.x - 1), (int)Mathf.Round(cur.transform.position.y / 0.75f)]; found = false; for (int j = 0; j < movement && !found; j++) { if (queues[j].Contains(temp)) { found = true; } } if (!found) { queues[i + 1].Enqueue(temp); } } if (Mathf.Floor(cur.transform.position.x + 0.5f) < grid.getCols() && Mathf.Round(cur.transform.position.y / 0.75f + 1) < grid.getRows()) { temp = grid.objects[(int)Mathf.Floor(cur.transform.position.x + 0.5f), (int)Mathf.Round(cur.transform.position.y / 0.75f + 1)]; found = false; for (int j = 0; j < movement && !found; j++) { if (queues[j].Contains(temp)) { found = true; } } if (!found) { queues[i + 1].Enqueue(temp); } } if (Mathf.Floor(cur.transform.position.x + 0.5f) < grid.getCols() && Mathf.Round(cur.transform.position.y / 0.75f - 1) >= 0) { temp = grid.objects[(int)Mathf.Floor(cur.transform.position.x + 0.5f), (int)Mathf.Round(cur.transform.position.y / 0.75f - 1)]; found = false; for (int j = 0; j < movement && !found; j++) { if (queues[j].Contains(temp)) { found = true; } } if (!found) { queues[i + 1].Enqueue(temp); } } if (Mathf.Floor(cur.transform.position.x - 0.5f) >= 0 && Mathf.Round(cur.transform.position.y / 0.75f + 1) < grid.getRows()) { temp = grid.objects[(int)Mathf.Floor(cur.transform.position.x - 0.5f), (int)Mathf.Round(cur.transform.position.y / 0.75f + 1)]; found = false; for (int j = 0; j < movement && !found; j++) { if (queues[j].Contains(temp)) { found = true; } } if (!found) { queues[i + 1].Enqueue(temp); } } if (Mathf.Floor(cur.transform.position.x - 0.5f) >= 0 && Mathf.Round(cur.transform.position.y / 0.75f - 1) >= 0) { temp = grid.objects[(int)Mathf.Floor(cur.transform.position.x - 0.5f), (int)Mathf.Round(cur.transform.position.y / 0.75f - 1)]; found = false; for (int j = 0; j < movement && !found; j++) { if (queues[j].Contains(temp)) { found = true; } } if (!found) { queues[i + 1].Enqueue(temp); } } } } } while (queues[movement].Count != 0 && !targetFound) { cur = queues[movement].Dequeue(); tile = cur.GetComponent(typeof(tileData)) as tileData; if (tile.tank != null) { targetFound = true; tileToHitDiff = new Vector3(cur.transform.position.x, cur.transform.position.y, cur.transform.position.z); } } } if (!targetFound) { int posY = (int)Mathf.Round(this.transform.position.y / 0.75f); float x = 0.0f; int y = 0; for (int i = 0; i < grid.getRows(); i++) { if (grid.cityRows[i]) { if (Mathf.Abs(posY - y) > Mathf.Abs(posY - i)) { y = i; } } } if (y % 2 == 1) { x = x + 0.5f; } float dirX; if ((int)Mathf.Floor(this.transform.position.x) > (int)Mathf.Floor(x)) { dirX = -1.0f; } else { dirX = 1.0f; } for (int i = 0; i < movement; i++) { float my = 0.0f; float mx = 0.0f; Vector3 pos = this.transform.position; Debug.Log(y); if ((int)Mathf.Round(pos.y / 0.75f) > y) { my = -0.75f; if (dirX > 0.0f) { mx = 0.5f; } else { mx = -0.5f; } } else if ((int)Mathf.Round(pos.y / 0.75f) < y) { my = 0.75f; if (dirX > 0.0f) { mx = 0.5f; } else { mx = -0.5f; } } else { if (dirX > 0.0f) { mx = 1.0f; } else { mx = -1.0f; } } Vector3 moveTo = new Vector3(this.transform.position.x + mx, this.transform.position.y + my, this.transform.position.z); GameObject temp = grid.objects[(int)Mathf.Floor(moveTo.x), (int)Mathf.Round(moveTo.y / 0.75f)]; tile = temp.GetComponent(typeof(tileData)) as tileData; int iter = 0; while ((tile.enemy != null || tile.blocked || tile.isNull || tile.city || tile.tank != null || tile.isWater) && iter < 6) { if (mx > 0.0f) { if (my > 0.0f) { mx = 1.0f; my = 0.0f; moveTo = new Vector3(pos.x + mx, pos.y + my, pos.z); } else if ((int)my == 0) { mx = 0.5f; my = -0.75f; moveTo = new Vector3(pos.x + mx, pos.y + my, pos.z); } else { mx = -0.5f; my = 0.75f; moveTo = new Vector3(pos.x + mx, pos.y + my, pos.z); } } else { if (my > 0.0f) { mx = -1.0f; my = 0.0f; moveTo = new Vector3(pos.x + mx, pos.y + my, pos.z); } else if ((int)my == 0) { mx = -0.5f; my = -0.75f; moveTo = new Vector3(pos.x + mx, pos.y + my, pos.z); } else { mx = 0.5f; my = 0.75f; moveTo = new Vector3(pos.x + mx, pos.y + my, pos.z); } } iter++; if ((int)Mathf.Floor(moveTo.x) >= 0 && (int)Mathf.Floor(moveTo.x) < grid.getCols() && (int)Mathf.Round(moveTo.y / 0.75f) >= 0 && (int)Mathf.Round(moveTo.y / 0.75f) < grid.getRows()) { temp = grid.objects[(int)Mathf.Floor(moveTo.x), (int)Mathf.Round(moveTo.y / 0.75f)]; tile = temp.GetComponent(typeof(tileData)) as tileData; } } if (iter == 6) { moveTo = new Vector3(pos.x, pos.y, pos.z); } isRunning = true; StartCoroutine(moveTile(moveTo)); while (isRunning) { Debug.Log(isRunning); yield return(new WaitForEndOfFrame()); } finalPosition = moveTo; } } else { Vector3 moveTo; cur = grid.objects[(int)Mathf.Floor(this.transform.position.x), (int)Mathf.Round(this.transform.position.y / 0.75f)]; bool done = false; Vector3 pos = new Vector3(this.transform.position.x, this.transform.position.y, this.transform.position.z); float mx; float my; while (!done) { if ((int)Mathf.Round(tileToHitDiff.y / 0.75f) > (int)Mathf.Round(this.transform.position.y / 0.75f)) { if ((int)Mathf.Floor(this.transform.position.x) < (int)Mathf.Floor(tileToHitDiff.x)) { moveTo = new Vector3(pos.x + 0.5f, pos.y + 0.75f, pos.z); mx = 0.5f; my = 0.75f; } else { moveTo = new Vector3(pos.x - 0.5f, pos.y + 0.75f, pos.z); mx = -0.5f; my = 0.75f; } } else if ((int)Mathf.Round(tileToHitDiff.y / 0.75f) < (int)Mathf.Round(this.transform.position.y / 0.75f)) { if ((int)Mathf.Floor(this.transform.position.x) < (int)Mathf.Floor(tileToHitDiff.x)) { moveTo = new Vector3(pos.x + 0.5f, pos.y - 0.75f, pos.z); mx = 0.5f; my = -0.75f; } else { moveTo = new Vector3(pos.x - 0.5f, pos.y - 0.75f, pos.z); mx = -0.5f; my = -0.75f; } } else { if ((int)Mathf.Floor(tileToHitDiff.x) < (int)Mathf.Floor(this.transform.position.x)) { moveTo = new Vector3(pos.x - 1.0f, pos.y, pos.z); mx = -1.0f; my = 0.0f; } else { moveTo = new Vector3(pos.x + 1.0f, pos.y, pos.z); mx = 1.0f; my = 0.0f; } } if ((int)Mathf.Floor(moveTo.x) == (int)Mathf.Floor(tileToHitDiff.x) && (int)Mathf.Round(moveTo.y / 0.75f) == (int)Mathf.Round(tileToHitDiff.y / 0.75f)) { done = true; finalPosition = this.transform.position; } if (!done) { GameObject temp = grid.objects[(int)Mathf.Floor(moveTo.x), (int)Mathf.Round(moveTo.y / 0.75f)]; tile = temp.GetComponent(typeof(tileData)) as tileData; while (tile.blocked || tile.isNull || tile.city || tile.tank != null || tile.enemy != null || tile.isWater) { if (mx > 0.0f) { if (my > 0.0f) { mx = 1.0f; my = 0.0f; moveTo = new Vector3(pos.x + mx, pos.y + my, pos.z); } else if ((int)my == 0) { mx = 0.5f; my = -0.75f; moveTo = new Vector3(pos.x + mx, pos.y + my, pos.z); } else { mx = -0.5f; my = 0.75f; moveTo = new Vector3(pos.x + mx, pos.y + my, pos.z); } } else { if (my > 0.0f) { mx = -1.0f; my = 0.0f; moveTo = new Vector3(pos.x + mx, pos.y + my, pos.z); } else if ((int)my == 0) { mx = -0.5f; my = -0.75f; moveTo = new Vector3(pos.x + mx, pos.y + my, pos.z); } else { mx = 0.5f; my = 0.75f; moveTo = new Vector3(pos.x + mx, pos.y + my, pos.z); } } temp = grid.objects[(int)Mathf.Floor(moveTo.x), (int)Mathf.Round(moveTo.y / 0.75f)]; tile = temp.GetComponent(typeof(tileData)) as tileData; } isRunning = true; StartCoroutine(moveTile(moveTo)); while (isRunning) { yield return(new WaitForEndOfFrame()); } finalPosition = moveTo; pos = this.transform.position; } } tileToHitDiff.x = tileToHitDiff.x - this.transform.position.x; tileToHitDiff.y = tileToHitDiff.y - this.transform.position.y; tileToHit = Instantiate(hitTile, new Vector3(this.transform.position.x + tileToHitDiff.x, this.transform.position.y + tileToHitDiff.y, this.transform.position.z), Quaternion.identity); tileToHit.transform.SetParent(this.transform); } cur = grid.objects[(int)Mathf.Floor(originalPosition.x), (int)Mathf.Round(originalPosition.y / 0.75f)]; tile = cur.GetComponent(typeof(tileData)) as tileData; tile.enemy = null; cur = grid.objects[(int)Mathf.Floor(finalPosition.x), (int)Mathf.Round(finalPosition.y / 0.75f)]; tile = cur.GetComponent(typeof(tileData)) as tileData; tile.enemy = this; this.tile = tile; waiting = false; }
private Rectangle getBoundingBox(tileData tempData) { Rectangle destRect = new Rectangle(); switch (gravity) { case Direction.right: if (playerMode.direction)//flip { destRect.X = (int)(playerLoc[0]) + tempData.origin[0]; destRect.Y = (int)(playerLoc[1]) - tempData.origin[1]; destRect.Width = -1 * tempData.srcRect.Width; destRect.Height = tempData.srcRect.Height; } else//normal { destRect.X = (int)(playerLoc[0]) - tempData.origin[0]; destRect.Y = (int)(playerLoc[1]) - tempData.origin[1]; destRect.Width = tempData.srcRect.Width; destRect.Height = tempData.srcRect.Height; } break; case Direction.left: if (playerMode.direction)//flip { destRect.X = (int)(playerLoc[0]) + tempData.origin[0]; destRect.Y = (int)(playerLoc[1]) + tempData.origin[1]; destRect.Width = -1 * tempData.srcRect.Width; destRect.Height = -1 * tempData.srcRect.Height; } else//normal { destRect.X = (int)(playerLoc[0]) - tempData.origin[0]; destRect.Y = (int)(playerLoc[1]) + tempData.origin[1]; destRect.Width = tempData.srcRect.Width; destRect.Height = -1 * tempData.srcRect.Height; } break; case Direction.down: if (playerMode.direction)//flip { destRect.X = (int)(playerLoc[0]) + tempData.origin[0]; destRect.Y = (int)(playerLoc[1]) - tempData.origin[1]; destRect.Width = -1 *tempData.srcRect.Height; destRect.Height = -1 *tempData.srcRect.Width; destRect.X = destRect.X + (tempData.origin[1] - tempData.origin[0]); destRect.Y = destRect.Y + tempData.origin[0] + tempData.origin[1]; } else//normal { destRect.X = (int)(playerLoc[0]) - tempData.origin[0]; destRect.Y = (int)(playerLoc[1]) - tempData.origin[1]; destRect.Width = -1 *tempData.srcRect.Height; destRect.Height = tempData.srcRect.Width; destRect.Y = destRect.Y + (tempData.origin[1] - tempData.origin[0]); destRect.X = destRect.X + (tempData.origin[0] + tempData.origin[1]); } break; case Direction.up: if (playerMode.direction)//flip { destRect.X = (int)(playerLoc[0]) + tempData.origin[0]; destRect.Y = (int)(playerLoc[1]) - tempData.origin[1]; destRect.Width = tempData.srcRect.Height; destRect.Height = tempData.srcRect.Width; destRect.Y = destRect.Y + (tempData.origin[1] - tempData.origin[0]); destRect.X = destRect.X - (tempData.origin[0] + tempData.origin[1]); } else//normal { destRect.X = (int)(playerLoc[0]) - tempData.origin[0]; destRect.Y = (int)(playerLoc[1]) - tempData.origin[1]; destRect.Width = tempData.srcRect.Height; destRect.Height = -1 * tempData.srcRect.Width; destRect.X = destRect.X - (tempData.origin[1] - tempData.origin[0]); destRect.Y = destRect.Y + tempData.origin[0] + tempData.origin[1]; } break; } return destRect; }
private void initAnimSet(String path) { anim = new List<List<tileData>>(); ditherAnim = new List<List<tileData>>(); String animPath = Path.Combine(path, "playerTiles.key"); String ditherPath = Path.Combine(path, "DitherTiles.key"); for (int i = 0; i < (int)animMode.STORAGE_SIZE; i++) { anim.Add(new List<tileData>()); ditherAnim.Add(new List<tileData>()); } int index; tileData tempData; StreamReader reader = new StreamReader(animPath); String line; String tempString; line = reader.ReadLine(); while (line != null) { //assume all frames are written in order, from 0 up index = 0; tempData = new tileData(); tempData.origin = new int[2]; tempData.srcRect = new Rectangle(); tempString = MapParser.getString(line, index); index = MapParser.strSearch(line, " ", index); tempData.frameNo = MapParser.getInt(line, index); index = MapParser.strSearch(line, " ", index); tempData.srcRect.X = MapParser.getInt(line, index); index = MapParser.strSearch(line, " ", index); tempData.srcRect.Y = MapParser.getInt(line, index); index = MapParser.strSearch(line, " ", index); tempData.srcRect.Width = MapParser.getInt(line, index); index = MapParser.strSearch(line, " ", index); tempData.srcRect.Height = MapParser.getInt(line, index); index = MapParser.strSearch(line, " ", index); tempData.origin[0] = MapParser.getInt(line, index); index = MapParser.strSearch(line, " ", index); tempData.origin[1] = MapParser.getInt(line, index); switch (tempString) { case "stand": tempData.animType = animMode.stand; anim[(int)animMode.stand].Add(tempData); break; case "run": tempData.animType = animMode.run; anim[(int)animMode.run].Add(tempData); break; case "win": tempData.animType = animMode.win; anim[(int)animMode.win].Add(tempData); break; case "drop": tempData.animType = animMode.drop; anim[(int)animMode.drop].Add(tempData); break; case "jump": tempData.animType = animMode.jump; anim[(int)animMode.jump].Add(tempData); break; case "die": tempData.animType = animMode.die; anim[(int)animMode.die].Add(tempData); break; } line = reader.ReadLine(); } //I'm lazy: reader = new StreamReader(ditherPath); line = reader.ReadLine(); while (line != null) { //assume all frames are written in order, from 0 up index = 0; tempData = new tileData(); tempData.origin = new int[2]; tempData.srcRect = new Rectangle(); tempString = MapParser.getString(line, index); index = MapParser.strSearch(line, " ", index); tempData.frameNo = MapParser.getInt(line, index); index = MapParser.strSearch(line, " ", index); tempData.srcRect.X = MapParser.getInt(line, index); index = MapParser.strSearch(line, " ", index); tempData.srcRect.Y = MapParser.getInt(line, index); index = MapParser.strSearch(line, " ", index); tempData.srcRect.Width = MapParser.getInt(line, index); index = MapParser.strSearch(line, " ", index); tempData.srcRect.Height = MapParser.getInt(line, index); index = MapParser.strSearch(line, " ", index); tempData.origin[0] = MapParser.getInt(line, index); index = MapParser.strSearch(line, " ", index); tempData.origin[1] = MapParser.getInt(line, index); switch (tempString) { case "stand": tempData.animType = animMode.stand; ditherAnim[(int)animMode.stand].Add(tempData); break; case "run": tempData.animType = animMode.run; ditherAnim[(int)animMode.run].Add(tempData); break; case "win": tempData.animType = animMode.win; ditherAnim[(int)animMode.win].Add(tempData); break; case "drop": tempData.animType = animMode.drop; ditherAnim[(int)animMode.drop].Add(tempData); break; case "jump": tempData.animType = animMode.jump; ditherAnim[(int)animMode.jump].Add(tempData); break; case "die": tempData.animType = animMode.die; ditherAnim[(int)animMode.die].Add(tempData); break; } line = reader.ReadLine(); } }
IEnumerator testTankSpawn() { while (waiting) { yield return(new WaitForEndOfFrame()); } GameObject[,] spawnable = new GameObject[2, rows]; for (int x = 0; x < 2; x++) { for (int y = 0; y < rows; y++) { tileData t = objects[x, y].GetComponent(typeof(tileData)) as tileData; if (!t.city && !t.isWater && !t.isNull && !t.blocked) { if (y % 2 == 1) { spawnable[x, y] = Instantiate(spawn, new Vector3(x + 0.5f, y - (y * .25f), -0.1f), Quaternion.identity) as GameObject; } else if (!(y % 2 == 1 && x == 1)) { spawnable[x, y] = Instantiate(spawn, new Vector3(x, y - (y * .25f), -0.1f), Quaternion.identity) as GameObject; } } } } Vector3 def = new Vector3(0.0f, 0.0f, 0.0f); while (spawnPos[0] == def || spawnPos[1] == def || spawnPos[2] == def) { yield return(new WaitForEndOfFrame()); } for (int x = 0; x < 2; x++) { for (int y = 0; y < rows; y++) { Destroy(spawnable[x, y]); } } Vector3[] startPos = new Vector3[3]; for (int i = 0; i < 3; i++) { startPos[i] = new Vector3(spawnPos[i].x - 5.0f, spawnPos[i].y, spawnPos[i].z); if (metadata.Tanks[i] != null) { tanks[i] = Instantiate(metadata.Tanks[i], startPos[i], Quaternion.identity) as GameObject; Tank temp = tanks[i].GetComponent(typeof(Tank)) as Tank; temp.init(); temp.weap1 = (metadata.Tanks[i].GetComponent(typeof(Tank)) as Tank).weap1; temp.weap2 = (metadata.Tanks[i].GetComponent(typeof(Tank)) as Tank).weap2; temp.id = i; } else { tanks[i] = Instantiate(tank, startPos[i], Quaternion.identity) as GameObject; Tank temp = tanks[i].GetComponent(typeof(Tank)) as Tank; temp.init(); temp.weap1 = new normalShot(); temp.id = i; } } difficulty = metadata.Difficulty; float elapsedTime = 0.0f; while (elapsedTime < 0.5f) { tanks[0].transform.position = Vector3.Lerp(startPos[0], spawnPos[0], (elapsedTime / 0.5f)); tanks[1].transform.position = Vector3.Lerp(startPos[1], spawnPos[1], (elapsedTime / 0.5f)); tanks[2].transform.position = Vector3.Lerp(startPos[2], spawnPos[2], (elapsedTime / 0.5f)); elapsedTime += Time.deltaTime; yield return(new WaitForEndOfFrame()); } tanks[0].transform.position = spawnPos[0]; tanks[1].transform.position = spawnPos[1]; tanks[2].transform.position = spawnPos[2]; tileData tile; tile = objects[(int)Mathf.Floor(spawnPos[0].x), (int)Mathf.Round(spawnPos[0].y / 0.75f)].GetComponent(typeof(tileData)) as tileData; tile.tank = tanks[0].GetComponent(typeof(Tank)) as Tank; tile = objects[(int)Mathf.Floor(spawnPos[1].x), (int)Mathf.Round(spawnPos[1].y / 0.75f)].GetComponent(typeof(tileData)) as tileData; tile.tank = tanks[1].GetComponent(typeof(Tank)) as Tank; tile = objects[(int)Mathf.Floor(spawnPos[2].x), (int)Mathf.Round(spawnPos[2].y / 0.75f)].GetComponent(typeof(tileData)) as tileData; tile.tank = tanks[2].GetComponent(typeof(Tank)) as Tank; int num = 0; for (int i = 0; i < tanks.Length; i++) { Tank t = tanks[i].GetComponent(typeof(Tank)) as Tank; t.id = i; num += t.maxActions; } prevMove = new Vector3[num]; prevTank = new int[num]; spawned = true; }
private void UpdateFloorTile() { // Makes sure that all colliders are on the same tile, and if they are, sets that tile as the current floor tile. List <Collider2D> tilesCollidedNorthEast = new List <Collider2D>(); List <Collider2D> tilesCollidedNorthWest = new List <Collider2D>(); List <Collider2D> tilesCollidedSouthEast = new List <Collider2D>(); List <Collider2D> tilesCollidedSouthWest = new List <Collider2D>(); List <Collider2D> objectsCollidedWith = new List <Collider2D>(); ContactFilter2D noFilter = new ContactFilter2D(); noFilter.NoFilter(); northEastCollider.OverlapCollider(noFilter, tilesCollidedNorthEast); northWestCollider.OverlapCollider(noFilter, tilesCollidedNorthWest); southEastCollider.OverlapCollider(noFilter, tilesCollidedSouthEast); southWestCollider.OverlapCollider(noFilter, tilesCollidedSouthWest); // Gets all the tiles in one list for (int i = 0; i < tilesCollidedNorthEast.Count; i++) { objectsCollidedWith.Add(tilesCollidedNorthEast[i]); } for (int i = 0; i < tilesCollidedNorthWest.Count; i++) { objectsCollidedWith.Add(tilesCollidedNorthWest[i]); } for (int i = 0; i < tilesCollidedSouthEast.Count; i++) { objectsCollidedWith.Add(tilesCollidedSouthEast[i]); } for (int i = 0; i < tilesCollidedSouthWest.Count; i++) { objectsCollidedWith.Add(tilesCollidedSouthWest[i]); } List <tileData> referenceData = new List <tileData>(); if (objectsCollidedWith.Count > 0) { for (int i = 0; i < objectsCollidedWith.Count; i++) { if (objectsCollidedWith[i].gameObject.tag == "Floor" && objectsCollidedWith[i] != CurrentFloorTile) { bool referenceRecorded = false; for (int j = 0; j < referenceData.Count; j++) { if (objectsCollidedWith[i].gameObject == referenceData[j].tile) { // we've looked at this tile before referenceData[j].references++; referenceRecorded = true; if (referenceData[j].references == 4) { if (CurrentFloorTile != null) { if (CurrentFloorTile != objectsCollidedWith[i].gameObject) { if (PreviousFloorTile != null) { if (objectsCollidedWith[i].gameObject != PreviousFloorTile) { PreviousFloorTile = CurrentFloorTile; CurrentFloorTile = objectsCollidedWith[i].gameObject; } } else { PreviousFloorTile = CurrentFloorTile; CurrentFloorTile = objectsCollidedWith[i].gameObject; } } } else { CurrentFloorTile = objectsCollidedWith[i].gameObject; } } break; } } if (!referenceRecorded) { tileData data = new tileData(); data.tile = objectsCollidedWith[i].gameObject; data.references = 1; referenceData.Add(data); } } } } }