export default class IUpgrade{ _level:number = 0; materialBase:number; materialSenior:number; _upMaterList = []; constructor(level:number, materialBase:number, materialSenior:number) { this._level = level; this.materialBase = materialBase; this.materialSenior = materialSenior; } /** * 检查限制条件(需要子类实现具体逻辑) * @param {number} value - 要检查的值 * @returns {boolean} 是否达到限制 */ checkLimit(value) { return false; // 默认实现,子类应该重写 } /** * 升级操作 */ upgrade() { this._level++; // 注意:refreshLevel 方法需要在子类中实现 if (this.refreshLevel) { this.refreshLevel(); } else { console.warn('refreshLevel method not implemented in subclass'); } } /** * 刷新等级(需要子类实现) */ protected refreshLevel() { // 子类应该实现此方法以处理等级刷新逻辑 throw new Error('refreshLevel method must be implemented in subclass'); } /** * 获取因子(需要在子类中实现) */ get factor() :number{ return 0; } /** * 获取当前等级 */ get level() { return this._level; } /** * 获取升级所需材料 * 基于因子(factor)计算材料需求 */ get materials() { const materialsArray = []; // factor 需要在子类中实现 const factor = this.factor; // 可能未定义,需要在子类中实现 // 常量定义 const MAX_ITEMS: number = 5 // 最大材料种类数 const DIVISOR_BASE: number = 81 // 初始除数 const MAX_PER_ITEM: number = 2 // 单种材料最大数量 // 计算每种材料的需求量 let divisor: number = DIVISOR_BASE let totalAdded: number = 0 for (let i = 0; i < MAX_ITEMS; i++) { // 计算当前材料需求数量 let count: number = Math.floor(factor / divisor) // 限制单种材料最大数量 count = Math.min(count, MAX_PER_ITEM) // 累计总材料数 totalAdded += count // 根据类型和总数限制处理材料数量 if (this.checkLimit(totalAdded)) { materialsArray.unshift(0) // 超过限制时设为0 } else { materialsArray.unshift(count) // 添加材料需求数量到列表开头 } // 更新除数(每次除以3) divisor = Math.floor(divisor / 3) } // 组织材料数据 const materialsDict = {}; for (let j = materialsArray.length - 1; j >= 0; j--) { if (materialsArray[j] > 0) { let materialKey; if (j < 2) { // 基础材料 materialKey = this.materialBase + j; } else { // 高级材料 materialKey = this.materialSenior + (j - 2); } // 累加材料数量 materialsDict[materialKey] = (materialsDict[materialKey] || 0) + materialsArray[j]; } } // 转换为数组格式 this._upMaterList = []; for (const materialId in materialsDict) { this._upMaterList.push({ id: materialId, value: materialsDict[materialId] }); } return this._upMaterList; } get upMaterList() { return this._upMaterList; } }