test_weapon_unlock_fix.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. /**
  2. * 武器解锁修复验证脚本
  3. * 用于测试关卡完成后武器是否正确解锁
  4. */
  5. console.log('=== 武器解锁修复验证脚本 ===');
  6. // 获取必要的管理器实例
  7. function getManagers() {
  8. const gameManagerNode = cc.find('GameManager');
  9. const gameManager = gameManagerNode ? gameManagerNode.getComponent('GameManager') : null;
  10. const saveDataManager = window.SaveDataManager ? window.SaveDataManager.getInstance() : null;
  11. const upgradeControllerNode = cc.find('Canvas/UpgradeUI');
  12. const upgradeController = upgradeControllerNode ? upgradeControllerNode.getComponent('UpgradeController') : null;
  13. return { gameManager, saveDataManager, upgradeController };
  14. }
  15. // 检查当前状态
  16. function checkCurrentStatus() {
  17. console.log('\n=== 当前状态检查 ===');
  18. const { saveDataManager, upgradeController } = getManagers();
  19. if (!saveDataManager) {
  20. console.error('SaveDataManager未找到');
  21. return;
  22. }
  23. const currentLevel = saveDataManager.getCurrentLevel();
  24. const maxUnlockedLevel = saveDataManager.getMaxUnlockedLevel();
  25. const money = saveDataManager.getMoney();
  26. const diamonds = saveDataManager.getDiamonds();
  27. console.log(`当前关卡: ${currentLevel}`);
  28. console.log(`最大解锁关卡: ${maxUnlockedLevel}`);
  29. console.log(`金钱: ${money}`);
  30. console.log(`钻石: ${diamonds}`);
  31. // 检查武器解锁状态
  32. if (upgradeController && upgradeController.getWeaponUnlockStatus) {
  33. const weaponStatus = upgradeController.getWeaponUnlockStatus();
  34. console.log('\n=== 武器解锁状态 ===');
  35. console.log(`总武器数: ${weaponStatus.summary.total}`);
  36. console.log(`已解锁: ${weaponStatus.summary.unlocked}`);
  37. console.log(`应该解锁: ${weaponStatus.summary.shouldBeUnlocked}`);
  38. console.log(`需要更新: ${weaponStatus.summary.needsUpdate}`);
  39. if (weaponStatus.summary.needsUpdate > 0) {
  40. console.warn('⚠️ 发现武器解锁状态不一致!');
  41. weaponStatus.weapons.forEach(weapon => {
  42. if (weapon.needsUpdate) {
  43. console.warn(` - ${weapon.name}: 应该解锁但未解锁 (需要关卡${weapon.requiredLevel})`);
  44. }
  45. });
  46. } else {
  47. console.log('✅ 武器解锁状态正常');
  48. }
  49. }
  50. }
  51. // 模拟关卡完成测试
  52. function simulateLevelComplete(targetLevel) {
  53. console.log(`\n=== 模拟关卡${targetLevel}完成测试 ===`);
  54. const { saveDataManager, upgradeController } = getManagers();
  55. if (!saveDataManager) {
  56. console.error('SaveDataManager未找到');
  57. return;
  58. }
  59. // 记录修复前状态
  60. const beforeMaxLevel = saveDataManager.getMaxUnlockedLevel();
  61. console.log(`修复前最大解锁关卡: ${beforeMaxLevel}`);
  62. // 模拟GameEnd.ts中的修复逻辑
  63. console.log('执行修复后的关卡完成逻辑...');
  64. // 1. 先调用completeLevel更新maxUnlockedLevel
  65. saveDataManager.completeLevel(targetLevel, 0, 60); // 模拟60秒游戏时长
  66. console.log('✅ 已调用completeLevel更新maxUnlockedLevel');
  67. // 2. 然后给予奖励
  68. saveDataManager.giveCompletionRewards(targetLevel).then(() => {
  69. console.log('✅ 已给予完成奖励');
  70. // 3. 检查maxUnlockedLevel是否正确更新
  71. const afterMaxLevel = saveDataManager.getMaxUnlockedLevel();
  72. console.log(`修复后最大解锁关卡: ${afterMaxLevel}`);
  73. if (afterMaxLevel > beforeMaxLevel) {
  74. console.log('✅ maxUnlockedLevel正确更新');
  75. // 4. 触发GAME_SUCCESS事件,让UpgradeController检查武器解锁
  76. console.log('触发GAME_SUCCESS事件...');
  77. const EventBus = window.EventBus || cc.EventBus;
  78. if (EventBus) {
  79. EventBus.getInstance().emit('GAME_SUCCESS');
  80. console.log('✅ 已触发GAME_SUCCESS事件');
  81. // 5. 检查武器是否正确解锁
  82. setTimeout(() => {
  83. if (upgradeController && upgradeController.getWeaponUnlockStatus) {
  84. const weaponStatus = upgradeController.getWeaponUnlockStatus();
  85. console.log('\n=== 武器解锁结果检查 ===');
  86. const newlyUnlocked = weaponStatus.weapons.filter(w =>
  87. w.requiredLevel <= afterMaxLevel && w.isCurrentlyUnlocked
  88. );
  89. console.log(`应该解锁的武器数量: ${weaponStatus.summary.shouldBeUnlocked}`);
  90. console.log(`实际解锁的武器数量: ${weaponStatus.summary.unlocked}`);
  91. if (weaponStatus.summary.needsUpdate === 0) {
  92. console.log('🎉 武器解锁修复成功!所有武器状态正确');
  93. } else {
  94. console.error('❌ 武器解锁仍有问题,需要进一步检查');
  95. }
  96. // 显示详细的武器状态
  97. weaponStatus.weapons.forEach(weapon => {
  98. const status = weapon.isCurrentlyUnlocked ? '✅已解锁' :
  99. weapon.shouldBeUnlocked ? '❌应解锁' : '⏳未达成';
  100. console.log(` ${weapon.name}: ${status} (需要关卡${weapon.requiredLevel})`);
  101. });
  102. }
  103. }, 100);
  104. } else {
  105. console.error('EventBus未找到,无法触发事件');
  106. }
  107. } else {
  108. console.error('❌ maxUnlockedLevel未正确更新');
  109. }
  110. }).catch(error => {
  111. console.error('给予奖励时出错:', error);
  112. });
  113. }
  114. // 强制同步武器解锁状态
  115. function forceSyncWeapons() {
  116. console.log('\n=== 强制同步武器解锁状态 ===');
  117. const { upgradeController } = getManagers();
  118. if (upgradeController && upgradeController.forceSyncWeaponUnlocks) {
  119. const result = upgradeController.forceSyncWeaponUnlocks();
  120. if (result) {
  121. console.log('✅ 武器解锁状态强制同步完成');
  122. } else {
  123. console.error('❌ 武器解锁状态同步失败');
  124. }
  125. } else {
  126. console.error('UpgradeController或forceSyncWeaponUnlocks方法未找到');
  127. }
  128. }
  129. // 诊断武器解锁问题
  130. function diagnoseWeaponUnlock() {
  131. console.log('\n=== 武器解锁问题诊断 ===');
  132. const { upgradeController } = getManagers();
  133. if (upgradeController && upgradeController.diagnoseWeaponUnlockIssue) {
  134. upgradeController.diagnoseWeaponUnlockIssue();
  135. } else {
  136. console.error('UpgradeController或diagnoseWeaponUnlockIssue方法未找到');
  137. }
  138. }
  139. // 主测试函数
  140. function runWeaponUnlockTest() {
  141. console.log('开始武器解锁修复验证测试...');
  142. // 1. 检查当前状态
  143. checkCurrentStatus();
  144. // 2. 诊断问题
  145. diagnoseWeaponUnlock();
  146. // 3. 模拟关卡完成(测试关卡2,应该解锁尖胡萝卜)
  147. setTimeout(() => {
  148. simulateLevelComplete(2);
  149. }, 1000);
  150. }
  151. // 导出测试函数到全局
  152. window.weaponUnlockTest = {
  153. runTest: runWeaponUnlockTest,
  154. checkStatus: checkCurrentStatus,
  155. simulateComplete: simulateLevelComplete,
  156. forceSync: forceSyncWeapons,
  157. diagnose: diagnoseWeaponUnlock
  158. };
  159. console.log('\n=== 测试函数已准备就绪 ===');
  160. console.log('使用方法:');
  161. console.log('1. window.weaponUnlockTest.runTest() - 运行完整测试');
  162. console.log('2. window.weaponUnlockTest.checkStatus() - 检查当前状态');
  163. console.log('3. window.weaponUnlockTest.simulateComplete(2) - 模拟完成关卡2');
  164. console.log('4. window.weaponUnlockTest.forceSync() - 强制同步武器状态');
  165. console.log('5. window.weaponUnlockTest.diagnose() - 诊断武器解锁问题');
  166. // 自动运行测试
  167. if (typeof window !== 'undefined') {
  168. setTimeout(() => {
  169. runWeaponUnlockTest();
  170. }, 2000);
  171. }