BattleTestMode.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. /// <summary>
  4. /// Test mode for battle scene that creates test characters and enemies automatically
  5. /// Attach this to a GameObject in the battle scene to enable test mode
  6. /// Enhanced with post-battle looting and defeat testing capabilities
  7. /// </summary>
  8. public class BattleTestMode : MonoBehaviour
  9. {
  10. [Header("Test Mode Settings")]
  11. [Tooltip("Enable test mode to automatically create test characters")]
  12. public bool enableTestMode = true;
  13. [Tooltip("Number of player characters to create")]
  14. [Range(1, 4)]
  15. public int testPlayerCount = 2;
  16. [Tooltip("Number of enemy characters to create")]
  17. [Range(1, 6)]
  18. public int testEnemyCount = 2;
  19. [Header("Test Character Configuration")]
  20. [Tooltip("Available weapon types for testing")]
  21. public string[] availableWeapons = { "Sword", "Bow", "Fists" };
  22. [Tooltip("Player character names")]
  23. public string[] playerNames = { "TestWarrior", "TestRanger", "TestMage", "TestRogue" };
  24. [Tooltip("Enemy character names")]
  25. public string[] enemyNames = { "TestSkeleton", "TestBandit", "TestOrc", "TestGoblin", "TestTroll", "TestSpider" };
  26. [Header("Debug Settings")]
  27. public bool showDebugLogs = true;
  28. void Awake()
  29. {
  30. if (!enableTestMode)
  31. {
  32. if (showDebugLogs)
  33. Debug.Log("🧪 BattleTestMode: Test mode is disabled");
  34. return;
  35. }
  36. // Only activate test mode if there are no existing selections
  37. if (BattleSetupData.playerSelections.Count == 0 && BattleSetupData.enemySelections.Count == 0)
  38. {
  39. CreateTestBattleData();
  40. }
  41. else
  42. {
  43. if (showDebugLogs)
  44. Debug.Log("🧪 BattleTestMode: Battle data already exists, skipping test mode");
  45. }
  46. }
  47. /// <summary>
  48. /// Create test battle data with predefined characters and enemies
  49. /// </summary>
  50. void CreateTestBattleData()
  51. {
  52. if (showDebugLogs)
  53. Debug.Log("🧪 BattleTestMode: Creating test battle data...");
  54. // Clear any existing data
  55. BattleSetupData.playerSelections.Clear();
  56. BattleSetupData.enemySelections.Clear();
  57. // Create test player characters
  58. CreateTestPlayers();
  59. // Create test enemy characters
  60. CreateTestEnemies();
  61. // Create basic inventory data for the test characters
  62. CreateBasicInventoryData();
  63. // Add carry capacity components to test characters
  64. AddCarryCapacityToTestCharacters();
  65. if (showDebugLogs)
  66. {
  67. Debug.Log($"🧪 BattleTestMode: Created {BattleSetupData.playerSelections.Count} test players and {BattleSetupData.enemySelections.Count} test enemies");
  68. LogTestData();
  69. }
  70. }
  71. /// <summary>
  72. /// Create test player characters with varied weapons
  73. /// </summary>
  74. void CreateTestPlayers()
  75. {
  76. for (int i = 0; i < testPlayerCount; i++)
  77. {
  78. string playerName = i < playerNames.Length ? playerNames[i] : $"TestPlayer{i + 1}";
  79. string weaponType = availableWeapons[i % availableWeapons.Length];
  80. var playerSelection = new CharacterSelection
  81. {
  82. characterName = playerName,
  83. weaponType = weaponType
  84. };
  85. BattleSetupData.playerSelections.Add(playerSelection);
  86. if (showDebugLogs)
  87. Debug.Log($"🧪 Created test player: {playerName} with {weaponType}");
  88. }
  89. }
  90. /// <summary>
  91. /// Create test enemy characters with varied weapons
  92. /// </summary>
  93. void CreateTestEnemies()
  94. {
  95. for (int i = 0; i < testEnemyCount; i++)
  96. {
  97. string enemyName = i < enemyNames.Length ? enemyNames[i] : $"TestEnemy{i + 1}";
  98. string weaponType = availableWeapons[Random.Range(0, availableWeapons.Length)];
  99. var enemySelection = new CharacterSelection
  100. {
  101. characterName = enemyName,
  102. weaponType = weaponType
  103. };
  104. BattleSetupData.enemySelections.Add(enemySelection);
  105. if (showDebugLogs)
  106. Debug.Log($"🧪 Created test enemy: {enemyName} with {weaponType}");
  107. }
  108. }
  109. /// <summary>
  110. /// Log all test data for debugging
  111. /// </summary>
  112. void LogTestData()
  113. {
  114. Debug.Log("🧪 === Test Battle Data ===");
  115. Debug.Log($"🧪 Players ({BattleSetupData.playerSelections.Count}):");
  116. foreach (var player in BattleSetupData.playerSelections)
  117. {
  118. Debug.Log($"🧪 - {player.characterName} ({player.weaponType})");
  119. }
  120. Debug.Log($"🧪 Enemies ({BattleSetupData.enemySelections.Count}):");
  121. foreach (var enemy in BattleSetupData.enemySelections)
  122. {
  123. Debug.Log($"🧪 - {enemy.characterName} ({enemy.weaponType})");
  124. }
  125. Debug.Log("🧪 ========================");
  126. }
  127. /// <summary>
  128. /// Create basic inventory data for test characters using CombatDataTransfer
  129. /// </summary>
  130. void CreateBasicInventoryData()
  131. {
  132. // Create minimal combat session data to provide inventory
  133. var sessionData = new CombatDataTransfer.CombatSessionData
  134. {
  135. battleTerrain = TerrainType.Plains,
  136. battleFeature = FeatureType.None,
  137. weather = Weather.Clear,
  138. timeOfDay = 12f,
  139. playerTeam = new List<CombatDataTransfer.TeamCharacterCombatData>(),
  140. enemies = new List<CombatDataTransfer.EnemyCombatData>()
  141. };
  142. // Create inventory data for each player
  143. for (int i = 0; i < BattleSetupData.playerSelections.Count; i++)
  144. {
  145. var player = BattleSetupData.playerSelections[i];
  146. var playerData = new CombatDataTransfer.TeamCharacterCombatData
  147. {
  148. characterName = player.characterName,
  149. maxHealth = 20 + Random.Range(-5, 10),
  150. currentHealth = 20 + Random.Range(-5, 10),
  151. armorClass = 12,
  152. equippedWeapon = player.weaponType,
  153. strength = Random.Range(8, 16),
  154. dexterity = Random.Range(8, 16),
  155. constitution = Random.Range(8, 16),
  156. wisdom = Random.Range(8, 16),
  157. perception = Random.Range(8, 16),
  158. miscItems = CreateBasicTestInventory(i)
  159. };
  160. sessionData.playerTeam.Add(playerData);
  161. }
  162. // Create basic enemy data (no inventory needed for enemies)
  163. for (int i = 0; i < BattleSetupData.enemySelections.Count; i++)
  164. {
  165. var enemy = BattleSetupData.enemySelections[i];
  166. var enemyData = new CombatDataTransfer.EnemyCombatData
  167. {
  168. enemyName = enemy.characterName,
  169. maxHealth = 15 + Random.Range(-3, 8),
  170. currentHealth = 15 + Random.Range(-3, 8),
  171. armorClass = 11,
  172. preferredWeapon = enemy.weaponType,
  173. threatLevel = Random.Range(1, 4)
  174. };
  175. sessionData.enemies.Add(enemyData);
  176. }
  177. // Set the combat session
  178. CombatDataTransfer.SetCombatSession(sessionData);
  179. if (showDebugLogs)
  180. Debug.Log($"🧪 Created basic inventory data for {sessionData.playerTeam.Count} players");
  181. }
  182. /// <summary>
  183. /// Create a basic test inventory with health potions and other items
  184. /// </summary>
  185. List<string> CreateBasicTestInventory(int characterIndex)
  186. {
  187. var inventory = new List<string>();
  188. // Everyone gets health potions
  189. inventory.Add("Health Potion");
  190. inventory.Add("Health Potion"); // Give 2 health potions
  191. // Basic survival items
  192. inventory.Add("Bread");
  193. inventory.Add("Bandage");
  194. // Add some variety based on character index
  195. switch (characterIndex % 3)
  196. {
  197. case 0:
  198. inventory.Add("Health Potion"); // Extra healing for first character
  199. inventory.Add("Iron Ration");
  200. break;
  201. case 1:
  202. inventory.Add("Antidote");
  203. inventory.Add("Rope");
  204. break;
  205. case 2:
  206. inventory.Add("Torch");
  207. inventory.Add("Waterskin");
  208. break;
  209. }
  210. return inventory;
  211. }
  212. /// <summary>
  213. /// Add carry capacity components to test characters for weight management
  214. /// </summary>
  215. void AddCarryCapacityToTestCharacters()
  216. {
  217. // This will add carry capacity to actual character GameObjects when they're spawned
  218. // For now, just log that this system is available
  219. if (showDebugLogs)
  220. Debug.Log("🧪 Carry capacity system ready for test characters");
  221. // TODO: This method will be called after character spawning when the actual GameObjects exist
  222. // It would add CharacterCarryCapacity components to each spawned character
  223. }
  224. /// <summary>
  225. /// Context menu method to manually create test data
  226. /// </summary>
  227. [ContextMenu("Create Test Battle Data")]
  228. public void ManualCreateTestData()
  229. {
  230. CreateTestBattleData();
  231. }
  232. /// <summary>
  233. /// Context menu method to clear test data
  234. /// </summary>
  235. [ContextMenu("Clear Test Data")]
  236. public void ClearTestData()
  237. {
  238. BattleSetupData.playerSelections.Clear();
  239. BattleSetupData.enemySelections.Clear();
  240. CombatDataTransfer.ClearSession();
  241. if (showDebugLogs)
  242. Debug.Log("🧪 BattleTestMode: Test data and inventory cleared");
  243. }
  244. /// <summary>
  245. /// Context menu method to create random test data
  246. /// </summary>
  247. [ContextMenu("Create Random Test Data")]
  248. public void CreateRandomTestData()
  249. {
  250. // Randomize counts
  251. testPlayerCount = Random.Range(1, 5);
  252. testEnemyCount = Random.Range(1, 7);
  253. CreateTestBattleData();
  254. }
  255. /// <summary>
  256. /// Create a quick 1v1 battle for testing specific mechanics
  257. /// </summary>
  258. [ContextMenu("Create 1v1 Test Battle")]
  259. public void Create1v1TestBattle()
  260. {
  261. BattleSetupData.playerSelections.Clear();
  262. BattleSetupData.enemySelections.Clear();
  263. // Single player with sword
  264. BattleSetupData.playerSelections.Add(new CharacterSelection
  265. {
  266. characterName = "TestHero",
  267. weaponType = "Sword"
  268. });
  269. // Single enemy with bow
  270. BattleSetupData.enemySelections.Add(new CharacterSelection
  271. {
  272. characterName = "TestSkeleton",
  273. weaponType = "Bow"
  274. });
  275. // Create inventory data for the 1v1 battle
  276. CreateBasicInventoryData();
  277. if (showDebugLogs)
  278. Debug.Log("🧪 Created 1v1 test battle: TestHero (Sword) vs TestSkeleton (Bow)");
  279. }
  280. /// <summary>
  281. /// Create a larger battle for stress testing
  282. /// </summary>
  283. [ContextMenu("Create Large Test Battle")]
  284. public void CreateLargeTestBattle()
  285. {
  286. BattleSetupData.playerSelections.Clear();
  287. BattleSetupData.enemySelections.Clear();
  288. // Create 4 players with different weapons
  289. for (int i = 0; i < 4; i++)
  290. {
  291. BattleSetupData.playerSelections.Add(new CharacterSelection
  292. {
  293. characterName = playerNames[i],
  294. weaponType = availableWeapons[i % availableWeapons.Length]
  295. });
  296. }
  297. // Create 6 enemies with random weapons
  298. for (int i = 0; i < 6; i++)
  299. {
  300. BattleSetupData.enemySelections.Add(new CharacterSelection
  301. {
  302. characterName = enemyNames[i],
  303. weaponType = availableWeapons[Random.Range(0, availableWeapons.Length)]
  304. });
  305. }
  306. // Create inventory data for the large battle
  307. CreateBasicInventoryData();
  308. if (showDebugLogs)
  309. Debug.Log("🧪 Created large test battle: 4 players vs 6 enemies");
  310. }
  311. /// <summary>
  312. /// Create a test battle designed to test victory looting (weak enemies)
  313. /// </summary>
  314. [ContextMenu("Create Victory Test Battle")]
  315. public void CreateVictoryTestBattle()
  316. {
  317. BattleSetupData.playerSelections.Clear();
  318. BattleSetupData.enemySelections.Clear();
  319. // Create 2 strong players
  320. for (int i = 0; i < 2; i++)
  321. {
  322. BattleSetupData.playerSelections.Add(new CharacterSelection
  323. {
  324. characterName = playerNames[i],
  325. weaponType = availableWeapons[i % availableWeapons.Length]
  326. });
  327. }
  328. // Create 3 weak enemies
  329. for (int i = 0; i < 3; i++)
  330. {
  331. BattleSetupData.enemySelections.Add(new CharacterSelection
  332. {
  333. characterName = enemyNames[i],
  334. weaponType = "Fists" // Weak weapon
  335. });
  336. }
  337. // Create enhanced session data with stronger players and weaker enemies
  338. var sessionData = new CombatDataTransfer.CombatSessionData
  339. {
  340. battleTerrain = TerrainType.Plains,
  341. battleFeature = FeatureType.None,
  342. weather = Weather.Clear,
  343. timeOfDay = 12f,
  344. playerTeam = new List<CombatDataTransfer.TeamCharacterCombatData>(),
  345. enemies = new List<CombatDataTransfer.EnemyCombatData>()
  346. };
  347. // Create strong player data
  348. for (int i = 0; i < BattleSetupData.playerSelections.Count; i++)
  349. {
  350. var player = BattleSetupData.playerSelections[i];
  351. var playerData = new CombatDataTransfer.TeamCharacterCombatData
  352. {
  353. characterName = player.characterName,
  354. maxHealth = 35, // Higher health
  355. currentHealth = 35,
  356. armorClass = 15, // Better armor
  357. equippedWeapon = player.weaponType,
  358. strength = 16, // High strength for carry capacity
  359. dexterity = 14,
  360. constitution = 16,
  361. wisdom = 12,
  362. perception = 14,
  363. miscItems = CreateBasicTestInventory(i)
  364. };
  365. sessionData.playerTeam.Add(playerData);
  366. }
  367. // Create weak enemy data
  368. for (int i = 0; i < BattleSetupData.enemySelections.Count; i++)
  369. {
  370. var enemy = BattleSetupData.enemySelections[i];
  371. var enemyData = new CombatDataTransfer.EnemyCombatData
  372. {
  373. enemyName = enemy.characterName,
  374. maxHealth = 5, // Very low health
  375. currentHealth = 5,
  376. armorClass = 8, // Poor armor
  377. preferredWeapon = enemy.weaponType,
  378. threatLevel = 1 // Low threat
  379. };
  380. sessionData.enemies.Add(enemyData);
  381. }
  382. CombatDataTransfer.SetCombatSession(sessionData);
  383. if (showDebugLogs)
  384. Debug.Log("🧪 Created victory test battle: 2 strong players vs 3 weak enemies (for testing post-battle looting)");
  385. }
  386. /// <summary>
  387. /// Create a test battle designed to test defeat (weak players)
  388. /// </summary>
  389. [ContextMenu("Create Defeat Test Battle")]
  390. public void CreateDefeatTestBattle()
  391. {
  392. BattleSetupData.playerSelections.Clear();
  393. BattleSetupData.enemySelections.Clear();
  394. // Create 1 weak player
  395. BattleSetupData.playerSelections.Add(new CharacterSelection
  396. {
  397. characterName = "WeakHero",
  398. weaponType = "Fists"
  399. });
  400. // Create 2 strong enemies
  401. for (int i = 0; i < 2; i++)
  402. {
  403. BattleSetupData.enemySelections.Add(new CharacterSelection
  404. {
  405. characterName = enemyNames[i],
  406. weaponType = "Sword"
  407. });
  408. }
  409. // Create session data with weak player and strong enemies
  410. var sessionData = new CombatDataTransfer.CombatSessionData
  411. {
  412. battleTerrain = TerrainType.Forest,
  413. battleFeature = FeatureType.None,
  414. weather = Weather.Storm,
  415. timeOfDay = 20f, // Night
  416. playerTeam = new List<CombatDataTransfer.TeamCharacterCombatData>(),
  417. enemies = new List<CombatDataTransfer.EnemyCombatData>()
  418. };
  419. // Create weak player data
  420. var weakPlayer = new CombatDataTransfer.TeamCharacterCombatData
  421. {
  422. characterName = "WeakHero",
  423. maxHealth = 8, // Very low health
  424. currentHealth = 8,
  425. armorClass = 10, // Poor armor
  426. equippedWeapon = "Fists",
  427. strength = 8,
  428. dexterity = 8,
  429. constitution = 8,
  430. wisdom = 8,
  431. perception = 8,
  432. miscItems = new List<string> { "Health Potion" } // Minimal inventory
  433. };
  434. sessionData.playerTeam.Add(weakPlayer);
  435. // Create strong enemy data
  436. for (int i = 0; i < BattleSetupData.enemySelections.Count; i++)
  437. {
  438. var enemy = BattleSetupData.enemySelections[i];
  439. var enemyData = new CombatDataTransfer.EnemyCombatData
  440. {
  441. enemyName = enemy.characterName,
  442. maxHealth = 25, // High health
  443. currentHealth = 25,
  444. armorClass = 14, // Good armor
  445. preferredWeapon = "Sword",
  446. threatLevel = 5 // High threat
  447. };
  448. sessionData.enemies.Add(enemyData);
  449. }
  450. CombatDataTransfer.SetCombatSession(sessionData);
  451. if (showDebugLogs)
  452. Debug.Log("🧪 Created defeat test battle: 1 weak player vs 2 strong enemies (for testing game over screen)");
  453. }
  454. }