/// <summary> /// Generates the biomes each area has /// </summary> void GenerateBiomes() { AreaGraph = new AreaGraph(Areas.Values.ToList(), this); AreaGraph.ColorGraph(); MergeAreasWithSameBiome(AreaGraph); foreach (AreaNode node in AreaGraph.GetNodes()) { if (Areas.ContainsKey(node.NodeID)) { Area areaForNode = Areas[node.NodeID]; areaForNode.GenerateBiomeForArea(node.GetColor()); } } }
/// <summary> /// TEMP /// </summary> /// <param name="g"></param> void DrawGraph(AreaGraph g) { foreach (AreaNode node in g.GetNodes()) { Gizmos.color = biomeTypeToMaterialDictionary[node.GetColor()].color; HexCell centerCell = map.GetAreaByID(node.NodeID).Cells[0]; Vector3 nodePos = Converter.V2ToV3(Map.HexCellToWorldPosition(centerCell)); Gizmos.DrawSphere(nodePos, 1); Gizmos.color = Color.cyan; foreach (uint node2 in node.Edges) { HexCell edgeNode = map.GetAreaByID(node2).Cells[0]; Vector3 nodePos2 = Converter.V2ToV3(Map.HexCellToWorldPosition(edgeNode)); Gizmos.DrawLine(nodePos, nodePos2); } }// end i }
/// <summary> /// Merges areas that have the same color in the area graph /// </summary> void MergeAreasWithSameBiome(AreaGraph g) { // FIND ALL AREAS THAT HAVE TO BE MERGED WITH THIS AREA // MERGE ALL AT ONCE List <List <uint> > listOfAreasToMerge = g.GetAreasToMerge(); foreach (List <uint> areasToMerge in listOfAreasToMerge) { int size = 0; List <HexCell> cellsInNewArea = new List <HexCell>(); int tier = 0; foreach (uint areaID in areasToMerge) { if (Areas.ContainsKey(areaID)) { Area mergeArea = Areas[areaID]; // use capacity if merge area not completely filled // aka can add to this area if map is expanding size += mergeArea.Cells.Capacity; cellsInNewArea.AddRange(mergeArea.Cells); tier = (tier < mergeArea.Tier) ? mergeArea.Tier : tier; RemoveArea(areaID); } else { Debug.LogError("trying to acces area that does not exist. ID: " + areaID); } }// end foreach uint areaID // accumulated all things about the merging ares from cell to capcaity to tier Area newMergedArea = new Area(size); newMergedArea.SetTier(tier); foreach (HexCell cellInNewArea in cellsInNewArea) { newMergedArea.TryEstablishRelationWithCell(cellInNewArea); } Areas.Add(newMergedArea.AreaID, newMergedArea); //Debug.Log("Created new Area with ID: " + newMergedArea.AreaID); AreaGraph.MergeNodesIntoNewNode(areasToMerge, newMergedArea.AreaID); }// end foreach list uint }