ai_strategy.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #include "ai_strategy.h"
  2. #include <algorithm>
  3. namespace Game::Systems::AI {
  4. auto AIStrategyFactory::parse_strategy(const QString &strategy_str)
  5. -> AIStrategy {
  6. QString lower = strategy_str.toLower();
  7. if (lower == "aggressive") {
  8. return AIStrategy::Aggressive;
  9. }
  10. if (lower == "defensive") {
  11. return AIStrategy::Defensive;
  12. }
  13. if (lower == "expansionist") {
  14. return AIStrategy::Expansionist;
  15. }
  16. if (lower == "economic") {
  17. return AIStrategy::Economic;
  18. }
  19. if (lower == "harasser" || lower == "harassment") {
  20. return AIStrategy::Harasser;
  21. }
  22. if (lower == "rusher" || lower == "rush") {
  23. return AIStrategy::Rusher;
  24. }
  25. return AIStrategy::Balanced;
  26. }
  27. auto AIStrategyFactory::strategy_to_string(AIStrategy strategy) -> QString {
  28. switch (strategy) {
  29. case AIStrategy::Aggressive:
  30. return "Aggressive";
  31. case AIStrategy::Defensive:
  32. return "Defensive";
  33. case AIStrategy::Expansionist:
  34. return "Expansionist";
  35. case AIStrategy::Economic:
  36. return "Economic";
  37. case AIStrategy::Harasser:
  38. return "Harasser";
  39. case AIStrategy::Rusher:
  40. return "Rusher";
  41. case AIStrategy::Balanced:
  42. default:
  43. return "Balanced";
  44. }
  45. }
  46. auto AIStrategyFactory::create_config(AIStrategy strategy) -> AIStrategyConfig {
  47. AIStrategyConfig config;
  48. config.strategy = strategy;
  49. switch (strategy) {
  50. case AIStrategy::Aggressive:
  51. config.aggression_modifier = 1.5F;
  52. config.defense_modifier = 0.7F;
  53. config.expansion_priority = 0.8F;
  54. config.production_rate_modifier = 1.2F;
  55. config.min_attack_force = 0.6F;
  56. config.retreat_threshold = 0.15F;
  57. config.harassment_range = 0.0F;
  58. break;
  59. case AIStrategy::Defensive:
  60. config.aggression_modifier = 0.5F;
  61. config.defense_modifier = 1.8F;
  62. config.expansion_priority = 0.5F;
  63. config.production_rate_modifier = 1.3F;
  64. config.min_attack_force = 1.5F;
  65. config.retreat_threshold = 0.40F;
  66. config.harassment_range = 0.0F;
  67. break;
  68. case AIStrategy::Expansionist:
  69. config.aggression_modifier = 0.8F;
  70. config.defense_modifier = 1.0F;
  71. config.expansion_priority = 2.0F;
  72. config.production_rate_modifier = 1.1F;
  73. config.min_attack_force = 0.8F;
  74. config.retreat_threshold = 0.30F;
  75. config.harassment_range = 0.0F;
  76. break;
  77. case AIStrategy::Economic:
  78. config.aggression_modifier = 0.6F;
  79. config.defense_modifier = 1.2F;
  80. config.expansion_priority = 1.0F;
  81. config.production_rate_modifier = 1.5F;
  82. config.min_attack_force = 1.8F;
  83. config.retreat_threshold = 0.35F;
  84. config.harassment_range = 0.0F;
  85. break;
  86. case AIStrategy::Harasser:
  87. config.aggression_modifier = 1.3F;
  88. config.defense_modifier = 0.8F;
  89. config.expansion_priority = 0.7F;
  90. config.production_rate_modifier = 1.0F;
  91. config.min_attack_force = 0.4F;
  92. config.retreat_threshold = 0.50F;
  93. config.harassment_range = 60.0F;
  94. break;
  95. case AIStrategy::Rusher:
  96. config.aggression_modifier = 2.0F;
  97. config.defense_modifier = 0.5F;
  98. config.expansion_priority = 0.3F;
  99. config.production_rate_modifier = 0.9F;
  100. config.min_attack_force = 0.3F;
  101. config.retreat_threshold = 0.10F;
  102. config.harassment_range = 0.0F;
  103. break;
  104. case AIStrategy::Balanced:
  105. default:
  106. config.aggression_modifier = 1.0F;
  107. config.defense_modifier = 1.0F;
  108. config.expansion_priority = 1.0F;
  109. config.production_rate_modifier = 1.0F;
  110. config.min_attack_force = 1.0F;
  111. config.retreat_threshold = 0.25F;
  112. config.harassment_range = 0.0F;
  113. break;
  114. }
  115. return config;
  116. }
  117. void AIStrategyFactory::apply_personality(AIStrategyConfig &config,
  118. float aggression, float defense,
  119. float harassment) {
  120. float aggression_factor = (aggression - 0.5F) * 2.0F;
  121. float defense_factor = (defense - 0.5F) * 2.0F;
  122. float harassment_factor = (harassment - 0.5F) * 2.0F;
  123. config.aggression_modifier *= (1.0F + aggression_factor * 0.3F);
  124. config.min_attack_force *= (1.0F - aggression_factor * 0.2F);
  125. config.defense_modifier *= (1.0F + defense_factor * 0.3F);
  126. config.retreat_threshold *= (1.0F + defense_factor * 0.2F);
  127. if (harassment > 0.6F) {
  128. config.harassment_range += harassment_factor * 30.0F;
  129. }
  130. config.aggression_modifier =
  131. std::max(0.3F, std::min(3.0F, config.aggression_modifier));
  132. config.defense_modifier =
  133. std::max(0.3F, std::min(3.0F, config.defense_modifier));
  134. config.min_attack_force =
  135. std::max(0.2F, std::min(2.5F, config.min_attack_force));
  136. config.retreat_threshold =
  137. std::max(0.05F, std::min(0.60F, config.retreat_threshold));
  138. config.harassment_range =
  139. std::max(0.0F, std::min(100.0F, config.harassment_range));
  140. }
  141. } // namespace Game::Systems::AI