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