FeatureGenerator.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3. public class FeatureGenerator
  4. {
  5. private SettlementGenerator settlementGenerator;
  6. private RoadGenerator roadGenerator;
  7. public FeatureGenerator()
  8. {
  9. settlementGenerator = new SettlementGenerator();
  10. roadGenerator = new RoadGenerator();
  11. }
  12. public void GenerateFeatures(MapData mapData)
  13. {
  14. // Generate settlements first
  15. settlementGenerator.GenerateSettlements(mapData);
  16. // Generate roads connecting settlements (handles bridges and tunnels automatically)
  17. roadGenerator.GenerateRoads(mapData);
  18. // Generate harbours
  19. GenerateHarbours(mapData);
  20. }
  21. private void GenerateHarbours(MapData mapData)
  22. {
  23. var settlements = mapData.GetTowns();
  24. settlements.AddRange(mapData.GetVillages());
  25. foreach (var settlement in settlements)
  26. {
  27. // Check if settlement is near water
  28. if (IsNearWater(mapData, settlement.position.x, settlement.position.y, 3))
  29. {
  30. // Find a suitable position for harbour
  31. var harbourPos = FindHarbourPosition(mapData, settlement.position);
  32. if (harbourPos != Vector2Int.zero)
  33. {
  34. mapData.GetTile(harbourPos.x, harbourPos.y).featureType = FeatureType.Harbour;
  35. }
  36. }
  37. }
  38. }
  39. private Vector2Int FindHarbourPosition(MapData mapData, Vector2Int settlementPos)
  40. {
  41. for (int range = 1; range <= 3; range++)
  42. {
  43. for (int x = settlementPos.x - range; x <= settlementPos.x + range; x++)
  44. {
  45. for (int y = settlementPos.y - range; y <= settlementPos.y + range; y++)
  46. {
  47. if (mapData.IsValidPosition(x, y))
  48. {
  49. MapTile tile = mapData.GetTile(x, y);
  50. if (tile.terrainType == TerrainType.Shore &&
  51. IsAdjacentToWater(mapData, x, y))
  52. {
  53. return new Vector2Int(x, y);
  54. }
  55. }
  56. }
  57. }
  58. }
  59. return Vector2Int.zero;
  60. }
  61. private bool IsNearWater(MapData mapData, int x, int y, int range)
  62. {
  63. for (int dx = -range; dx <= range; dx++)
  64. {
  65. for (int dy = -range; dy <= range; dy++)
  66. {
  67. int checkX = x + dx;
  68. int checkY = y + dy;
  69. if (mapData.IsValidPosition(checkX, checkY))
  70. {
  71. if (mapData.GetTile(checkX, checkY).IsWater())
  72. {
  73. return true;
  74. }
  75. }
  76. }
  77. }
  78. return false;
  79. }
  80. private bool IsAdjacentToWater(MapData mapData, int x, int y)
  81. {
  82. var neighbors = mapData.GetNeighbors(x, y);
  83. foreach (var neighbor in neighbors)
  84. {
  85. if (mapData.GetTile(neighbor.x, neighbor.y).IsWater())
  86. {
  87. return true;
  88. }
  89. }
  90. return false;
  91. }
  92. }