Beispiel #1
0
 public void RegisterPumpingStation(BaseTileData tile)
 {
     if (!_pumpingStationsTiles.Contains(tile))
     {
         _pumpingStationsTiles.Add(tile);
     }
 }
Beispiel #2
0
 public void SwapNextTurnTiles(BaseTileData oldTile, BaseTileData newTile)
 {
     NTtiles.Remove(oldTile);
     NTtiles.Add(newTile);
     _modifiedNTTiles.Add(oldTile);
     OnTilemapModified?.Invoke();
 }
Beispiel #3
0
    private void ManageClick()
    {
        // The second part of the condition prevents from interacting with the tilemap if we click on UI
        if (Input.GetMouseButtonDown(0) && EventSystem.current.currentSelectedGameObject == null && !BlockingUI.IsBlocked)
        {
            BaseTileData tileClicked = GetTileAtMousePos();

            if (tileClicked != null)
            {
                if (BuildingManager.Instance.IsInBuildMode)
                {
                    BuildingManager.Instance.BuildCurrentStructure(HoveredTile);
                }
                else
                {
                    tileClicked.terrainTile.DebugOnClick();
                }
                if (SelectedTile != null)
                {
                    SelectedTile.SetIsSelected(false);
                }
                SelectedTile = tileClicked;
                SelectedTile.SetIsSelected(true);
            }
            else
            {
                if (SelectedTile != null)
                {
                    SelectedTile.SetIsSelected(false);
                }
                SelectedTile = null;
            }
            OnPlayerClick?.Invoke();
        }
    }
Beispiel #4
0
    public override void DestroyStructure()
    {
        BaseTileData baseTileData = TilesDataManager.Instance.GetTileDataAtPos(GridPosition);

        WaterClusterManager.Instance.UnregisterPumpingStation(baseTileData);
        base.DestroyStructure();
    }
Beispiel #5
0
    private void PerformFill()
    {
        // start from the top
        int h = BOARD_HEIGHT - 1;

        for (int w = 0; w < BOARD_WIDTH; w++)
        {
            if (_board[w, h] == null)
            {
                // search downwards and count the number of tiles we need to fill
                int hSearch = h;
                while (hSearch >= 0)
                {
                    Tile tile = _board[w, hSearch];
                    if (tile != null)
                    {
                        break;
                    }
                    hSearch--;
                }

                // once the bottom location is found, we need to iterate up to create the tiles
                int offset = 1;
                hSearch += 1;                 // we ended at a non null h, we need to move up one
                while (hSearch < BOARD_HEIGHT)
                {
                    BaseTileData tileData   = PickRandomTileData();
                    Tile         tileToDrop = CreateTileAtCoordsforDropping(tileData, w, hSearch, h + offset);
                    _droppingTiles.Add(tileToDrop);
                    offset++;
                    hSearch++;
                }
            }
        }
    }
Beispiel #6
0
 public void AddTile(BaseTileData tile)
 {
     if (!tiles.Contains(tile) && tile.terrainTile is WaterTile)
     {
         tiles.Add(tile);
     }
 }
Beispiel #7
0
    private Tile CreateTileAtCoords(BaseTileData data, int xCoords, int yCoords, bool tweensIn = false)
    {
        GameObject tileGO = GameObject.Instantiate(TilePrefab);
        Tile       tile   = tileGO.GetComponent <Tile>();

        tile.Initialize(data, xCoords, yCoords);

        tileGO.transform.SetParent(TilesContainer);
        tileGO.transform.position = CoordsToWorldPosition(xCoords, yCoords);

        if (tweensIn)
        {
            tileGO.transform.localScale = Vector3.zero;
            iTween.ScaleTo(tile.gameObject,
                           iTween.Hash("scale", Vector3.one,
                                       "easetype", iTween.EaseType.easeOutBack,
                                       "time", 0.5f
                                       )
                           );
        }

        _board[xCoords, yCoords] = tile;

        return(tile);
    }
Beispiel #8
0
    public BaseTileData RegisterRandomFloodableTile(WaterCluster cluster)
    {
        BaseTileData tile = GetRandomFloodableTile(cluster);

        AddPossibleFloodTile(cluster, tile);
        return(tile);
    }
Beispiel #9
0
 private void ManageHover()
 {
     if (!BlockingUI.IsBlocked)
     {
         BaseTileData  tileHovered      = GetTileAtMousePos();
         StructureType currentBuildType = BuildingManager.Instance.CurrentBuildingStructure;
         phantomBuildingSprite.sprite = BuildingManager.Instance.StructuresTemplates.GetSpriteForStructure(currentBuildType);
         if (tileHovered != null)
         {
             HoveredTile = tileHovered;
             hoveredTileSprite.transform.position = HoveredTile.worldPosition;
             if (BuildingManager.Instance.IsInBuildMode)
             {
                 bool canBuild = BuildingManager.Instance.CanBuildStructureAtPos(currentBuildType, tileHovered.GridPosition);
                 phantomBuildingSprite.transform.position = HoveredTile.worldPosition;
                 phantomBuildingSprite.color = canBuild ? _transpColor : _transpRedColor;
             }
             else
             {
                 phantomBuildingSprite.color = _invisibleColor;
             }
         }
         else
         {
             HoveredTile = null;
             hoveredTileSprite.transform.position = _awayPos;
             phantomBuildingSprite.color          = _invisibleColor;
         }
     }
 }
Beispiel #10
0
    public static List <BaseTileData> GetNeighboursTilesOfRelay(BaseTileData baseTileData /*should be a relay tile */)
    {
        RelayTile           relayTile = (RelayTile)(baseTileData.structureTile);
        List <Vector3Int>   list      = GetNeighboursPositionsAtDistance(baseTileData.GridPosition, relayTile.GetActivationAreaRange());
        List <BaseTileData> neighbour = TilesDataManager.Instance.GetTilesAtPos(list).ToList();

        return(neighbour);
    }
Beispiel #11
0
 public BaseTileData(BaseTileData origin)
 {
     GridPosition  = origin.GridPosition;
     worldPosition = origin.worldPosition;
     originTile    = origin.originTile;
     terrainTile   = origin.terrainTile;
     structureTile = origin.structureTile;
 }
Beispiel #12
0
 private void UpdateTilesDebugText()
 {
     foreach (Vector3Int pos in _tilemap.cellBounds.allPositionsWithin)
     {
         _debugTextsDico.TryGetValue(pos, out TextMeshProUGUI text);
         BaseTileData data = _tileDataManager.GetTileDataAtPos(pos, true);
         text.text = _isVisible ? data.terrainTile.GetDebugText() : "";
     }
 }
Beispiel #13
0
    public void DestroyStructureAtPos(Vector3Int pos)
    {
        BaseTileData  data      = GetTileDataAtPos(pos);
        StructureTile structure = data.structureTile;

        if (structure != null && structure._building != null)
        {
            structure.DestroyStructure();
            data.structureTile = null;
        }
    }
Beispiel #14
0
 // Start is called before the first frame update
 void Start()
 {
     _errorText.gameObject.SetActive(false);
     _errorTextDico = new Dictionary<ActivationState, string>();
     foreach (ErrorText errorText in _errors)
     {
         _errorTextDico.Add(errorText.state, errorText.errorText);
     }
     _previousTile = null;
     MouseManager.OnPlayerClick += Refresh;
     Refresh();
 }
Beispiel #15
0
 private void PredictNextTurn()
 {
     foreach (Vector3Int pos in TilesDataManager.Instance.GetTilemapBounds().allPositionsWithin)
     {
         if (TilesDataManager.Instance.HasTile(pos))
         {
             BaseTileData tile = TilesDataManager.Instance.GetTileDataAtPos(pos);
             tile.PredictOnTurnStarts();
         }
     }
     OnTurnPredict?.Invoke();
 }
Beispiel #16
0
    public StructureTile CreateStructureFromType(StructureType type, BaseTileData data)
    {
        StructureTile newTile = null;

        StructureBinding structureBinding = BuildingManager.Instance.StructuresTemplates.GetStructureBindingFromType(type);

        if (structureBinding != null)
        {
            switch (type)
            {
            case StructureType.PowerPlant:
                newTile = new PowerPlantTile();
                break;

            case StructureType.Sawmill:
                newTile = new SawmillTile();
                break;

            case StructureType.PumpingStation:
                newTile = new PumpingStationTile();
                WaterClusterManager.Instance.RegisterPumpingStation(data);
                break;

            case StructureType.Village:
                newTile = new VillageTile();
                break;

            case StructureType.Mine:
                newTile = new MineTile();
                break;

            case StructureType.Relay:
                newTile = new RelayTile();
                break;

            case StructureType.MainRelay:
                newTile = new MainRelayTile();
                break;

            default:
                throw new MissingStructureTypeDefinitionException();
            }
            data.structureTile = newTile;
            BuildingView building = Instantiate(structureBinding.building, data.worldPosition, Quaternion.identity, transform);
            building.dataTile    = newTile;
            newTile._building    = building;
            newTile.GridPosition = data.GridPosition;
            ResourcesManager.Instance.RegisterStructure(newTile);
            RelayManager.Instance.RegisterStructure(data);
        }
        return(newTile);
    }
Beispiel #17
0
    public WaterCluster GetClusterForTile(BaseTileData tile)
    {
        WaterCluster res = null;

        foreach (WaterCluster cluster in clusters)
        {
            if (cluster.tiles.Contains(tile))
            {
                res = cluster;
            }
        }
        return(res);
    }
Beispiel #18
0
 public override void Execute()
 {
     _floodedTile = new BaseTileData(_originTile);
     TilesDataManager.Instance.CreateTerrainFromType(TerrainType.Water, _floodedTile);
     TilesDataManager.Instance.ChangeTerrainTileInTilemap(_floodedTile.GridPosition, TerrainType.Water, true);
     _cluster.AddTile(_floodedTile);
     _floodedStructure = _floodedTile.HandleFlood();
     _originTile.HandleFloodPrevision();
     _swapTilesCommand = new SwapTilesCommand(_originTile, _floodedTile);
     _swapTilesCommand.Execute();
     _removeFloodCommand = new WaterClusterRemoveFloodCommand(_cluster, WaterClusterManager.floodThreshold);
     _removeFloodCommand.Execute();
 }
Beispiel #19
0
    private Tile CreateTileAtCoordsforDropping(BaseTileData data, int xCoords, int yCoords, int yCoordsFake)
    {
        GameObject tileGO = GameObject.Instantiate(TilePrefab);
        Tile       tile   = tileGO.GetComponent <Tile>();

        tile.Initialize(data, xCoords, yCoords);

        tileGO.transform.SetParent(TilesContainer);
        tileGO.transform.position = CoordsToWorldPosition(xCoords, yCoordsFake);

        _board[xCoords, yCoords] = tile;

        return(tile);
    }
Beispiel #20
0
    public IEnumerable <BaseTileData> GetTilesAtPos(IEnumerable <Vector3Int> positions, bool predict = false)
    {
        List <BaseTileData> res = new List <BaseTileData>();

        foreach (Vector3Int pos in positions)
        {
            BaseTileData tile = GetTileDataAtPos(pos, predict);
            if (tile != null)
            {
                res.Add(tile);
            }
        }
        return(res.ToArray());
    }
Beispiel #21
0
    public IEnumerable <BaseTileData> GetTilesInBounds(BoundsInt bounds, bool predict = false)
    {
        List <BaseTileData> res = new List <BaseTileData>();

        foreach (Vector3Int pos in bounds.allPositionsWithin)
        {
            BaseTileData tile = GetTileDataAtPos(pos, predict);
            if (tile != null)
            {
                res.Add(tile);
            }
        }
        return(res);
    }
Beispiel #22
0
 public void AddPossibleFloodTile(WaterCluster cluster, BaseTileData tile)
 {
     if (_possibleFloodTiles.ContainsKey(cluster))
     {
         _possibleFloodTiles.TryGetValue(cluster, out Stack <BaseTileData> associatedTiles);
         associatedTiles.Push(tile);
     }
     else
     {
         Stack <BaseTileData> associatedTiles = new Stack <BaseTileData>();
         associatedTiles.Push(tile);
         _possibleFloodTiles.Add(cluster, associatedTiles);
     }
 }
Beispiel #23
0
 public void RegisterStructure(BaseTileData structure)
 {
     if (structure.structureTile != null)
     {
         StructureType structureType = structure.structureTile.GetStructureType();
         if (structureType == StructureType.Relay ^ structureType == StructureType.MainRelay)
         {
             if (structureType == StructureType.MainRelay)
             {
                 _mainRelayTile = structure;
             }
             ComputeConstructibleTerrainTiles();
         }
     }
 }
Beispiel #24
0
    public void Initialize(BaseTileData data, int xCoord, int yCoord)
    {
        _tileData = data;

        _spriteRenderer.sprite = data.Sprite;
        _spriteRenderer.color  = GetDebugColor();

        _xCoord = xCoord;
        _yCoord = yCoord;

        if (data is ObstructionTileData)
        {
            _turnsTilExpired = (data as ObstructionTileData).TurnsTilExpired;
        }
    }
Beispiel #25
0
 public Point2I GetSelectedTileLocation()
 {
     for (int x = 0; x < Tileset.Width; x++)
     {
         for (int y = 0; y < Tileset.Height; y++)
         {
             BaseTileData tileData = Tileset.GetTileData(x, y);
             if (tileData != null && tileData == editorControl.SelectedTilesetTileData)
             {
                 return(new Point2I(x, y));
             }
         }
     }
     return(new Point2I(-1, -1));
 }
Beispiel #26
0
 public void ToggleStructure()
 {
     BaseTileData selectedTile = MouseManager.Instance.SelectedTile;
     ActivationState activationState = selectedTile.ToggleStructureIfPossible();
     string currentErrorText;
     if (_errorTextDico.TryGetValue(activationState, out currentErrorText))
     {
         _errorText.gameObject.SetActive(true);
         _errorText.text = currentErrorText;
     }
     else
     {
         _errorText.gameObject.SetActive(false);
     }
 }
Beispiel #27
0
 private void UpdateUI()
 {
     BaseTileData selectedTile = MouseManager.Instance.SelectedTile;
     bool isActive = selectedTile != null;
     SetVisible(isActive);
     if (isActive)
     {
         _posText.text = selectedTile.GridPosition.ToString();
         _typeText.text = selectedTile.GetTerrainText();
         StructureTile structure = selectedTile.structureTile;
         _structureControlView.gameObject.SetActive(structure != null);
         _structureControlView.Structure = structure;
     }
     _errorText.gameObject.SetActive(false);
     _previousTile = selectedTile;
 }
Beispiel #28
0
 public void NextTurn()
 {
     InitState = InitializationState.Updating;
     _turnCounter++;
     foreach (Vector3Int pos in TilesDataManager.Instance.GetTilemapBounds().allPositionsWithin)
     {
         if (TilesDataManager.Instance.HasTile(pos))
         {
             BaseTileData tile = TilesDataManager.Instance.GetTileDataAtPos(pos);
             tile.OnTurnStarts();
         }
     }
     OnTurnStart?.Invoke();
     PredictNextTurn();
     InitState = InitializationState.Ready;
 }
Beispiel #29
0
    public override IEnumerator PerformWeaponSkill(GameBoard gameBoard, Battle battle, List <Tile> match, GameBoard.Swap swap)
    {
        float rand = UnityEngine.Random.Range(0f, 1f);

        if (match.Count == 3 && rand <= ThreeTileActivationPercentage ||
            match.Count >= 4 && rand <= FourTileActivationPercentage)
        {
            BaseTileData matchedTileData = match[0].TileData;
            gameBoard.ReplaceNRandomTiles(3, matchedTileData,
                                          delegate(Tile tile) {
                return(tile.TileType == matchedTileData.Type && !match.Contains(tile));
            }
                                          );
        }

        yield break;
    }
Beispiel #30
0
    public TerrainTile CreateTerrainFromType(TerrainType type, BaseTileData baseTileData)
    {
        TerrainTile newTile = null;

        TerrainBinding terrainBinding = GetTerrainBindingFromType(type);

        if (terrainBinding != null)
        {
            switch (type)
            {
            case TerrainType.Plains:
                newTile = new PlainsTile();
                break;

            case TerrainType.Water:
                newTile = new WaterTile();
                break;

            case TerrainType.Wood:
                newTile = new WoodsTile();
                break;

            case TerrainType.Stone:
                newTile = new StoneTile();
                break;

            case TerrainType.Sand:
                newTile = new SandTile();
                break;

            default:
                throw new MissingTerrainTypeDefinitionException();
            }
        }
        baseTileData.terrainTile = newTile;

        TerrainInfo terrainInfo = Instantiate(terrainBinding.terrainVisualInfo, baseTileData.worldPosition, Quaternion.identity, _terrainTilemap.transform);

        terrainInfo.dataTile = newTile;
        newTile.terrainInfo  = terrainInfo;
        newTile.GridPosition = baseTileData.GridPosition;
        return(newTile);
    }