SkillConfigManager.ts 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. import { _decorator, Component, resources, JsonAsset } from 'cc';
  2. import { JsonConfigLoader } from '../../Core/JsonConfigLoader';
  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 skillConfigData = await JsonConfigLoader.getInstance().loadConfig('skillConfig');
  63. if (!skillConfigData) {
  64. console.error('技能配置文件内容为空');
  65. this.createDefaultConfig();
  66. return;
  67. }
  68. this._skillConfig = skillConfigData as SkillConfig;
  69. this._isLoaded = true;
  70. console.log('技能配置加载成功:', this._skillConfig);
  71. } catch (error) {
  72. console.error('加载技能配置失败:', error);
  73. this.createDefaultConfig();
  74. }
  75. }
  76. /**
  77. * 创建默认配置(当JSON加载失败时使用)
  78. */
  79. private createDefaultConfig() {
  80. console.log('使用默认技能配置');
  81. this._skillConfig = {
  82. skillTypes: [
  83. {
  84. id: 0,
  85. name: "Damage",
  86. displayName: "伤害",
  87. nameTemplate: "Damage +{}%",
  88. type: "damage"
  89. },
  90. {
  91. id: 1,
  92. name: "Ball Speed",
  93. displayName: "球速",
  94. nameTemplate: "Ball Speed +{}%",
  95. type: "ball_speed"
  96. },
  97. {
  98. id: 2,
  99. name: "Crit Damage",
  100. displayName: "暴击伤害",
  101. nameTemplate: "Crit Damage +{}%",
  102. type: "crit_damage"
  103. }
  104. ],
  105. skillGroups: [],
  106. totalGroups: 12,
  107. skillsPerGroup: 3
  108. };
  109. // 生成默认的技能组配置
  110. for (let group = 1; group <= 12; group++) {
  111. this._skillConfig.skillGroups.push({
  112. group: group,
  113. effectPercent: group * 5,
  114. diamondCost: 10 + (group - 1) * 10
  115. });
  116. }
  117. this._isLoaded = true;
  118. }
  119. /**
  120. * 获取技能配置
  121. */
  122. public getSkillConfig(): SkillConfig | null {
  123. return this._skillConfig;
  124. }
  125. /**
  126. * 检查配置是否已加载
  127. */
  128. public isLoaded(): boolean {
  129. return this._isLoaded;
  130. }
  131. /**
  132. * 获取技能类型配置
  133. */
  134. public getSkillTypeConfig(skillIndex: number): SkillTypeConfig | null {
  135. if (!this._skillConfig || skillIndex < 0 || skillIndex >= this._skillConfig.skillTypes.length) {
  136. return null;
  137. }
  138. return this._skillConfig.skillTypes[skillIndex];
  139. }
  140. /**
  141. * 获取技能组配置
  142. */
  143. public getSkillGroupConfig(group: number): SkillGroupConfig | null {
  144. if (!this._skillConfig) {
  145. return null;
  146. }
  147. return this._skillConfig.skillGroups.find(config => config.group === group) || null;
  148. }
  149. /**
  150. * 获取技能名称
  151. */
  152. public getSkillName(skillIndex: number, group: number): string {
  153. const skillTypeConfig = this.getSkillTypeConfig(skillIndex);
  154. const skillGroupConfig = this.getSkillGroupConfig(group);
  155. if (!skillTypeConfig || !skillGroupConfig) {
  156. return `Unknown Skill ${skillIndex + 1}`;
  157. }
  158. return skillTypeConfig.nameTemplate.replace('{}', skillGroupConfig.effectPercent.toString());
  159. }
  160. /**
  161. * 获取技能消耗
  162. */
  163. public getSkillCost(group: number): number {
  164. const skillGroupConfig = this.getSkillGroupConfig(group);
  165. return skillGroupConfig ? skillGroupConfig.diamondCost : 0;
  166. }
  167. /**
  168. * 获取技能效果百分比
  169. */
  170. public getSkillEffectPercent(group: number): number {
  171. const skillGroupConfig = this.getSkillGroupConfig(group);
  172. return skillGroupConfig ? skillGroupConfig.effectPercent : 0;
  173. }
  174. /**
  175. * 获取技能类型字符串
  176. */
  177. public getSkillType(skillIndex: number): string {
  178. const skillTypeConfig = this.getSkillTypeConfig(skillIndex);
  179. return skillTypeConfig ? skillTypeConfig.type : 'unknown';
  180. }
  181. /**
  182. * 获取技能显示名称
  183. */
  184. public getSkillDisplayName(skillIndex: number): string {
  185. const skillTypeConfig = this.getSkillTypeConfig(skillIndex);
  186. return skillTypeConfig ? skillTypeConfig.displayName : '未知技能';
  187. }
  188. /**
  189. * 获取总组数
  190. */
  191. public getTotalGroups(): number {
  192. return this._skillConfig ? this._skillConfig.totalGroups : 12;
  193. }
  194. /**
  195. * 获取每组技能数
  196. */
  197. public getSkillsPerGroup(): number {
  198. return this._skillConfig ? this._skillConfig.skillsPerGroup : 3;
  199. }
  200. /**
  201. * 等待配置加载完成
  202. */
  203. public async waitForLoad(): Promise<void> {
  204. return new Promise((resolve) => {
  205. if (this._isLoaded) {
  206. resolve();
  207. return;
  208. }
  209. const checkLoaded = () => {
  210. if (this._isLoaded) {
  211. resolve();
  212. } else {
  213. setTimeout(checkLoaded, 50);
  214. }
  215. };
  216. checkLoaded();
  217. });
  218. }
  219. }