SkillConfigManager.ts 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. import { _decorator, Component, resources, JsonAsset } from 'cc';
  2. import { BundleLoader } from '../../Core/BundleLoader';
  3. const { ccclass, property } = _decorator;
  4. /**
  5. * 技能类型配置接口
  6. */
  7. export interface SkillTypeConfig {
  8. id: number;
  9. name: string;
  10. displayName: string;
  11. nameTemplate: string;
  12. type: string;
  13. }
  14. /**
  15. * 技能组配置接口
  16. */
  17. export interface SkillGroupConfig {
  18. group: number;
  19. effectPercent: number;
  20. diamondCost: number;
  21. }
  22. /**
  23. * 技能配置数据接口
  24. */
  25. export interface SkillConfig {
  26. skillTypes: SkillTypeConfig[];
  27. skillGroups: SkillGroupConfig[];
  28. totalGroups: number;
  29. skillsPerGroup: number;
  30. }
  31. /**
  32. * 技能配置管理器 - 单例模式
  33. * 负责加载和管理技能配置数据
  34. */
  35. @ccclass('SkillConfigManager')
  36. export class SkillConfigManager extends Component {
  37. private static _instance: SkillConfigManager | null = null;
  38. private _skillConfig: SkillConfig | null = null;
  39. private _isLoaded: boolean = false;
  40. public static getInstance(): SkillConfigManager | null {
  41. return SkillConfigManager._instance;
  42. }
  43. onLoad() {
  44. if (SkillConfigManager._instance === null) {
  45. SkillConfigManager._instance = this;
  46. this.loadSkillConfig();
  47. } else {
  48. this.destroy();
  49. return;
  50. }
  51. }
  52. onDestroy() {
  53. if (SkillConfigManager._instance === this) {
  54. SkillConfigManager._instance = null;
  55. }
  56. }
  57. /**
  58. * 加载技能配置
  59. */
  60. private async loadSkillConfig() {
  61. try {
  62. const bundleLoader = BundleLoader.getInstance();
  63. const skillConfigData = await bundleLoader.loadDataJson('skill_config');
  64. if (!skillConfigData) {
  65. console.error('技能配置文件内容为空');
  66. this.createDefaultConfig();
  67. return;
  68. }
  69. this._skillConfig = skillConfigData.json as SkillConfig;
  70. this._isLoaded = true;
  71. console.log('技能配置加载成功:', this._skillConfig);
  72. } catch (error) {
  73. console.error('加载技能配置失败:', error);
  74. this.createDefaultConfig();
  75. }
  76. }
  77. /**
  78. * 创建默认配置(当JSON加载失败时使用)
  79. */
  80. private createDefaultConfig() {
  81. console.log('使用默认技能配置');
  82. this._skillConfig = {
  83. skillTypes: [
  84. {
  85. id: 0,
  86. name: "Damage",
  87. displayName: "伤害",
  88. nameTemplate: "Damage +{}%",
  89. type: "damage"
  90. },
  91. {
  92. id: 1,
  93. name: "Ball Speed",
  94. displayName: "球速",
  95. nameTemplate: "Ball Speed +{}%",
  96. type: "ball_speed"
  97. },
  98. {
  99. id: 2,
  100. name: "Crit Damage",
  101. displayName: "暴击伤害",
  102. nameTemplate: "Crit Damage +{}%",
  103. type: "crit_damage"
  104. }
  105. ],
  106. skillGroups: [],
  107. totalGroups: 12,
  108. skillsPerGroup: 3
  109. };
  110. // 生成默认的技能组配置
  111. for (let group = 1; group <= 12; group++) {
  112. this._skillConfig.skillGroups.push({
  113. group: group,
  114. effectPercent: group * 5,
  115. diamondCost: 10 + (group - 1) * 10
  116. });
  117. }
  118. this._isLoaded = true;
  119. }
  120. /**
  121. * 获取技能配置
  122. */
  123. public getSkillConfig(): SkillConfig | null {
  124. return this._skillConfig;
  125. }
  126. /**
  127. * 检查配置是否已加载
  128. */
  129. public isLoaded(): boolean {
  130. return this._isLoaded;
  131. }
  132. /**
  133. * 获取技能类型配置
  134. */
  135. public getSkillTypeConfig(skillIndex: number): SkillTypeConfig | null {
  136. if (!this._skillConfig || skillIndex < 0 || skillIndex >= this._skillConfig.skillTypes.length) {
  137. return null;
  138. }
  139. return this._skillConfig.skillTypes[skillIndex];
  140. }
  141. /**
  142. * 获取技能组配置
  143. */
  144. public getSkillGroupConfig(group: number): SkillGroupConfig | null {
  145. if (!this._skillConfig) {
  146. return null;
  147. }
  148. return this._skillConfig.skillGroups.find(config => config.group === group) || null;
  149. }
  150. /**
  151. * 获取技能名称
  152. */
  153. public getSkillName(skillIndex: number, group: number): string {
  154. const skillTypeConfig = this.getSkillTypeConfig(skillIndex);
  155. const skillGroupConfig = this.getSkillGroupConfig(group);
  156. if (!skillTypeConfig || !skillGroupConfig) {
  157. return `Unknown Skill ${skillIndex + 1}`;
  158. }
  159. return skillTypeConfig.nameTemplate.replace('{}', skillGroupConfig.effectPercent.toString());
  160. }
  161. /**
  162. * 获取技能消耗
  163. */
  164. public getSkillCost(group: number): number {
  165. const skillGroupConfig = this.getSkillGroupConfig(group);
  166. return skillGroupConfig ? skillGroupConfig.diamondCost : 0;
  167. }
  168. /**
  169. * 获取技能效果百分比
  170. */
  171. public getSkillEffectPercent(group: number): number {
  172. const skillGroupConfig = this.getSkillGroupConfig(group);
  173. return skillGroupConfig ? skillGroupConfig.effectPercent : 0;
  174. }
  175. /**
  176. * 获取技能类型字符串
  177. */
  178. public getSkillType(skillIndex: number): string {
  179. const skillTypeConfig = this.getSkillTypeConfig(skillIndex);
  180. return skillTypeConfig ? skillTypeConfig.type : 'unknown';
  181. }
  182. /**
  183. * 获取技能显示名称
  184. */
  185. public getSkillDisplayName(skillIndex: number): string {
  186. const skillTypeConfig = this.getSkillTypeConfig(skillIndex);
  187. return skillTypeConfig ? skillTypeConfig.displayName : '未知技能';
  188. }
  189. /**
  190. * 获取总组数
  191. */
  192. public getTotalGroups(): number {
  193. return this._skillConfig ? this._skillConfig.totalGroups : 12;
  194. }
  195. /**
  196. * 获取每组技能数
  197. */
  198. public getSkillsPerGroup(): number {
  199. return this._skillConfig ? this._skillConfig.skillsPerGroup : 3;
  200. }
  201. /**
  202. * 等待配置加载完成
  203. */
  204. public async waitForLoad(): Promise<void> {
  205. return new Promise((resolve) => {
  206. if (this._isLoaded) {
  207. resolve();
  208. return;
  209. }
  210. const checkLoaded = () => {
  211. if (this._isLoaded) {
  212. resolve();
  213. } else {
  214. setTimeout(checkLoaded, 50);
  215. }
  216. };
  217. checkLoaded();
  218. });
  219. }
  220. }