大侠
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

130 lines
3.7 KiB

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;
}
}