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); }
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); }
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]; } } } }