BattleTestMode.cs 21 KB

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