public void generateUIMap() { Vector2Int mapSize = map.mapSize; Vector2Int bottomLeft = map.bottomLeft; for (int i = 0; i < mapSize.x; i++) { List <HighlightTile> row = new List <HighlightTile>(); for (int j = 0; j < mapSize.y; j++) { GameObject go = Instantiate(highlightTilePrefab, new Vector3(i + bottomLeft.x, j + bottomLeft.y, 0), Quaternion.identity); go.transform.parent = gameObject.transform; //go.layer = LayerMask.NameToLayer("map"); HighlightTile tile = go.GetComponent <HighlightTile>(); tile.highlightMap = this; tile.gridPosition = new Vector2Int(i, j); tile.GetComponent <Renderer>().material.color = new Color(0, 0, 1, 0); // set addional settings required row.Add(tile); } tileList.Add(row); } }
protected override void OnUpdate() { BufferFromEntity <HighlightTile> highlightTilesFromEntity = GetBufferFromEntity <HighlightTile>(false); Entities.ForEach((Entity entity, ref Translation trans, ref CursorData cursorData) => //remove ref trans later it doesn't need to be ref { if (highlightTilesFromEntity.HasComponent(entity)) { DynamicBuffer <HighlightTile> highlightTiles = highlightTilesFromEntity[entity]; Point pointInfo = new Point((ushort)((trans.Value.x) / cursorData.tileSize), (ushort)((trans.Value.z) / cursorData.tileSize)); cursorData.currentHoverPoint = pointInfo; for (int i = 0; i < highlightTiles.Length; i++) { if (highlightTiles[i].state == (ushort)MapLayer.Hover) { highlightTiles[i] = new HighlightTile { point = new Point((ushort)((trans.Value.x) / cursorData.tileSize), (ushort)((trans.Value.z) / cursorData.tileSize)), state = (ushort)MapLayer.Hover }; //Realistically there should only be one hover tile... break; } } } }).Run(); }
// To be called whenever a pathfinding event is done. Re-computes adjacency list and resets tile distances. public void InitPathFinding(HighlightTile startTile, bool includeDiagonals = false) { // Initialise AdjacencyList again to account for updates to tiles e.g. destroyed ComputeAdjacencyList(includeDiagonals); foreach (List <HighlightTile> row in tileList) { foreach (HighlightTile tile in row) { tile.distance = int.MaxValue; } } startTile.distance = 0; }
public void HighlightSelectedTiles(HighlightTile mainTile) { // if alr clicked, do nothing: if (clicked) { return; } RemoveSelectedTiles(); // check if tile being hovered is attackable Tile mapStartTile = map.tileList[mainTile.gridPosition.x][mainTile.gridPosition.y]; if (!mapStartTile.attackable) { return; } Ability ability = GameAssets.MyInstance.turnScheduler.currUnit?.chosenAbility; if (ability == null) { ability = new AbilityDefault(); } TargetingStyle targetingStyle = ability.targetingStyle; #region Getting the correct target team IEnumerable <Unit> friendlyTeam; TurnScheduler turnScheduler = GameAssets.MyInstance.turnScheduler; if (turnScheduler.currTurn == Team.ENEMY) { if (ability.targetsSameTeam) { friendlyTeam = turnScheduler.enemies; } else { friendlyTeam = turnScheduler.players; } } else { if (ability.targetsSameTeam) { friendlyTeam = turnScheduler.enemies; } else { friendlyTeam = turnScheduler.players; } } #endregion bool IsFriendlyFire(Tile mapEquivalent) { if (mapEquivalent.occupied) { foreach (Unit unit in friendlyTeam) { if (unit.currentTile == mapEquivalent) { return(true); } } } return(false); } if (targetingStyle == TargetingStyle.MULTI) { int multiAbilityRange = ability.multiAbilityRange; //Debug.Log("multiAbilityRange = " + multiAbilityRange); // init BFS Queue <HighlightTile> processing = new Queue <HighlightTile>(); // Compute Adjacency List and reset all distances. InitPathFinding(mainTile); selectedTiles.Add(mainTile); processing.Enqueue(mainTile); // relax edges with minimum SP estimate while (processing.Count > 0) { HighlightTile node = processing.Dequeue(); foreach (HighlightTile neighbour in node.adjacencyList) { Tile mapEquivalent = map.tileList[neighbour.gridPosition.x][neighbour.gridPosition.y]; if (mapEquivalent.walkable && neighbour.distance > node.distance + 1 && node.distance + 1 <= multiAbilityRange) { if (!IsFriendlyFire(mapEquivalent)) { neighbour.distance = node.distance + 1; selectedTiles.Add(neighbour); processing.Enqueue(neighbour); } } } } } else if (targetingStyle == TargetingStyle.SINGLE || targetingStyle == TargetingStyle.SELF || targetingStyle == TargetingStyle.SELFSINGLE) { Tile mapEquivalent = map.tileList[mainTile.gridPosition.x][mainTile.gridPosition.y]; if (!IsFriendlyFire(mapEquivalent)) { selectedTiles.Add(mainTile); } } else if (targetingStyle == TargetingStyle.RADIUS) { foreach (Tile tile in map.GetAttackableTiles()) { if (!IsFriendlyFire(tile)) { selectedTiles.Add(tileList[tile.gridPosition.x][tile.gridPosition.y]); } } } else if (targetingStyle == TargetingStyle.OBSTACLES) { if (map.tileCostReference.IsObstacle(mainTile.transform.position)) { selectedTiles.Add(mainTile); } } foreach (HighlightTile tile in selectedTiles) { tile.hover = true; } }