SettlementGenerator.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. public class SettlementGenerator
  5. {
  6. private static readonly string[] townNames = {
  7. "Ashford", "Brookhaven", "Clearwater", "Drakemoor", "Emberfall",
  8. "Frostholm", "Goldmeadow", "Ironbridge", "Moonhaven", "Oakenford",
  9. "Ravenshollow", "Silverdale", "Thornwick", "Wolfsburg", "Brightwater"
  10. };
  11. private static readonly string[] villageNames = {
  12. "Millbrook", "Stonefield", "Greenhill", "Redrock", "Fairhaven",
  13. "Smallwood", "Riverside", "Hillcrest", "Meadowbrook", "Pinewood",
  14. "Sunset", "Morning", "Pleasant", "Quiet", "Little"
  15. };
  16. public void GenerateSettlements(MapData mapData)
  17. {
  18. GenerateTowns(mapData);
  19. GenerateVillages(mapData);
  20. }
  21. private void GenerateTowns(MapData mapData)
  22. {
  23. int townCount = Random.Range(2, 5);
  24. int attempts = 0;
  25. int maxAttempts = 100;
  26. while (mapData.GetTowns().Count < townCount && attempts < maxAttempts)
  27. {
  28. attempts++;
  29. int x = Random.Range(15, mapData.Width - 15);
  30. int y = Random.Range(15, mapData.Height - 15);
  31. if (CanPlaceSettlement(mapData, x, y, 9, 10))
  32. {
  33. CreateTown(mapData, x, y);
  34. }
  35. }
  36. }
  37. private void GenerateVillages(MapData mapData)
  38. {
  39. int villageCount = Random.Range(8, 15);
  40. int attempts = 0;
  41. int maxAttempts = 200;
  42. while (mapData.GetVillages().Count < villageCount && attempts < maxAttempts)
  43. {
  44. attempts++;
  45. int x = Random.Range(5, mapData.Width - 5);
  46. int y = Random.Range(5, mapData.Height - 5);
  47. if (CanPlaceSettlement(mapData, x, y, 1, 10))
  48. {
  49. CreateVillage(mapData, x, y);
  50. }
  51. }
  52. }
  53. private bool CanPlaceSettlement(MapData mapData, int x, int y, int size, int minDistance)
  54. {
  55. // Check if area is suitable (plains terrain)
  56. for (int dx = -size / 2; dx <= size / 2; dx++)
  57. {
  58. for (int dy = -size / 2; dy <= size / 2; dy++)
  59. {
  60. int checkX = x + dx;
  61. int checkY = y + dy;
  62. if (!mapData.IsValidPosition(checkX, checkY))
  63. return false;
  64. MapTile tile = mapData.GetTile(checkX, checkY);
  65. if (tile.terrainType != TerrainType.Plains &&
  66. tile.terrainType != TerrainType.Shore)
  67. return false;
  68. }
  69. }
  70. // Check distance from other settlements
  71. var allSettlements = mapData.GetTowns();
  72. allSettlements.AddRange(mapData.GetVillages());
  73. foreach (var settlement in allSettlements)
  74. {
  75. float distance = Vector2.Distance(new Vector2(x, y),
  76. new Vector2(settlement.position.x, settlement.position.y));
  77. if (distance < minDistance)
  78. return false;
  79. }
  80. return true;
  81. }
  82. private void CreateTown(MapData mapData, int centerX, int centerY)
  83. {
  84. string name = GetRandomName(townNames);
  85. var settlement = new Settlement(name, SettlementType.Town, new Vector2Int(centerX, centerY));
  86. // Create 3x3 town area
  87. for (int dx = -1; dx <= 1; dx++)
  88. {
  89. for (int dy = -1; dy <= 1; dy++)
  90. {
  91. int x = centerX + dx;
  92. int y = centerY + dy;
  93. if (mapData.IsValidPosition(x, y))
  94. {
  95. mapData.GetTile(x, y).featureType = FeatureType.Town;
  96. mapData.GetTile(x, y).name = name;
  97. settlement.tiles.Add(new Vector2Int(x, y));
  98. }
  99. }
  100. }
  101. mapData.AddSettlement(settlement);
  102. }
  103. private void CreateVillage(MapData mapData, int x, int y)
  104. {
  105. string name = GetRandomName(villageNames);
  106. var settlement = new Settlement(name, SettlementType.Village, new Vector2Int(x, y));
  107. mapData.GetTile(x, y).featureType = FeatureType.Village;
  108. mapData.GetTile(x, y).name = name;
  109. settlement.tiles.Add(new Vector2Int(x, y));
  110. mapData.AddSettlement(settlement);
  111. }
  112. private string GetRandomName(string[] nameArray)
  113. {
  114. return nameArray[Random.Range(0, nameArray.Length)];
  115. }
  116. }