예제 #1
0
    public void Init(CityInventory cityInventory, CityConfig cityConfig, UnityAction <Building> onHoverBuilding = null, UnityAction <Building> onHoverEndBuilding = null)
    {
        CityInventory = cityInventory;
        CityConfig    = cityConfig;

        OnHoverBuilding    = onHoverBuilding;
        OnHoverEndBuilding = onHoverEndBuilding;
        CityInventory.RefreshInventoryGrids();
        CityInventory.RefreshConflictAndIsolation();

        CityEditAreaIndicator.Init(CityInventory);
        cityInventoryGirdMatrix = new CityInventoryGrid[cityInventory.Columns, cityInventory.Rows];

        while (rockPosSet.Count < 2)
        {
            rockPosSet.Add(new GridPos(Random.Range(0, CityInventory.Columns / 2), Random.Range(0, CityInventory.Rows / 2)));
        }
        while (rockPosSet.Count < 4)
        {
            rockPosSet.Add(new GridPos(Random.Range(CityInventory.Columns / 2, CityInventory.Columns), Random.Range(0, CityInventory.Rows / 2)));
        }
        while (rockPosSet.Count < 6)
        {
            rockPosSet.Add(new GridPos(Random.Range(0, CityInventory.Columns / 2), Random.Range(CityInventory.Rows / 2, CityInventory.Rows)));
        }
        while (rockPosSet.Count < 8)
        {
            rockPosSet.Add(new GridPos(Random.Range(CityInventory.Columns / 2, CityInventory.Columns), Random.Range(CityInventory.Rows / 2, CityInventory.Rows)));
        }
        while (rockPosSet.Count < 10)
        {
            rockPosSet.Add(new GridPos(Random.Range(CityInventory.Columns / 3 * 1, CityInventory.Columns / 3 * 2), Random.Range(CityInventory.Rows / 3 * 1, CityInventory.Rows / 3 * 2)));
        }

        PerlinRandomOffset = new Vector2(Random.Range(-99872.3213f, 344.1239123f), Random.Range(-12312.1231f, 39291.1231f));
        for (int col = 0; col < cityInventory.Columns; col++)
        {
            for (int row = 0; row < cityInventory.Rows; row++)
            {
                CityInventoryGrid grid = cityInventory.CreateCityInventoryGrid(CityInventoryGridContainer);
                grid.transform.localPosition = new Vector3((col - cityInventory.Columns / 2) * cityInventory.GridSize, 0, (row - cityInventory.Rows / 2) * cityInventory.GridSize);
                TerrainType tt = GenerateTerrainByPerlinNoise(col, row);
                grid.Init(new GridPos(col, row), CityInventory, tt);
                cityInventoryGirdMatrix[col, row] = grid;
            }
        }

        CityInventory.OnAddItemSucAction    = OnAddBuildingSuc;
        CityInventory.OnRemoveItemSucAction = OnRemoveBuildingSuc;
        GridShown = false;

        RefreshBuildingCoverMaskMatrix(false);
    }
예제 #2
0
    public CityInventoryGrid CreateCityInventoryGrid(Transform transform)
    {
        if (InstantiateCityInventoryGridHandler != null)
        {
            MonoBehaviour mono = InstantiateCityInventoryGridHandler?.Invoke(transform);
            if (mono != null)
            {
                try
                {
                    CityInventoryGrid res = (CityInventoryGrid)mono;
                    return(res);
                }
                catch (Exception e)
                {
                    LogError(e.ToString());
                }
            }
        }

        return(null);
    }
예제 #3
0
    public void RefreshBuildingCoverMaskMatrix(bool includingPreview)
    {
        BuildingCoverMaskGroup[,] matrix = includingPreview ? CityInventory.BuildingCoverMaskMatrix_IncludingPreview : CityInventory.BuildingCoverMaskMatrix;

        void BatchSetRadiusGridCoverMask(BuildingCoverMaskGroup mask, int col, int row, float radius)
        {
            for (int col_delta = Mathf.CeilToInt(-radius); col_delta <= Mathf.FloorToInt(radius); col_delta++)
            {
                for (int row_delta = Mathf.CeilToInt(-radius); row_delta <= Mathf.FloorToInt(radius); row_delta++)
                {
                    int final_col = col + col_delta;
                    int final_row = row + row_delta;
                    if (CityInventory.ContainsIndex(final_col, final_row))
                    {
                        if (col_delta * col_delta + row_delta * row_delta <= radius * radius)
                        {
                            matrix[final_col, final_row] |= mask;
                        }
                    }
                }
            }
        }

        void ResetAllCoverMask()
        {
            for (int col = 0; col < CityInventory.Columns; col++)
            {
                for (int row = 0; row < CityInventory.Rows; row++)
                {
                    matrix[col, row] = BuildingCoverMaskGroup.None;
                }
            }
        }

        ResetAllCoverMask();
        for (int col = 0; col < CityInventory.Columns; col++)
        {
            for (int row = 0; row < CityInventory.Rows; row++)
            {
                CityInventoryGrid      terrainGrid = cityInventoryGirdMatrix[col, row];
                BuildingCoverMaskGroup terrainMask = CityInventoryGrid.TerrainTypeToMask(terrainGrid.TerrainType);
                matrix[col, row] |= terrainMask;

                InventoryItem item = CityInventory.InventoryItemMatrix[col, row];
                if (!includingPreview && CityInventory.InventoryInfo.HasPreviewItem(item))
                {
                    continue;
                }

                BuildingInfo buildingInfo = (BuildingInfo)item?.ItemContentInfo;
                if (buildingInfo != null)
                {
                    BatchSetRadiusGridCoverMask(buildingInfo.provideBuildingCoverInnerRange, item.GridPos_Matrix.x, item.GridPos_Matrix.z, buildingInfo.provideBuildingCoverInnerRange_Radius);
                    BatchSetRadiusGridCoverMask(buildingInfo.provideBuildingCoverOuterRange, item.GridPos_Matrix.x, item.GridPos_Matrix.z, buildingInfo.provideBuildingCoverOuterRange_Radius);
                    matrix[col, row] |= buildingInfo.provideBuildingCoverByOccupation;
                }

                if (!includingPreview)
                {
                    cityInventoryGirdMatrix[col, row].Mask = matrix[col, row];
                }
            }
        }
    }