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.
70 lines
2.5 KiB
70 lines
2.5 KiB
import type { IComposeConfigProvider } from '../config/IComposeConfigProvider';
|
|
import { PlaceRejectReason, type BagSlotRecord } from '../types/MergeTypes';
|
|
|
|
/** 背包内单格 Weapon1 合成升级 */
|
|
export class UpgradeSystem {
|
|
constructor(private readonly _config: IComposeConfigProvider) {}
|
|
|
|
canMergeInBag(source: BagSlotRecord, target: BagSlotRecord): PlaceRejectReason | null {
|
|
const srcType = this._config.getWeapon2Type(source.weapon2Id);
|
|
const dstType = this._config.getWeapon2Type(target.weapon2Id);
|
|
if (srcType !== 1 || dstType !== 1) {
|
|
return PlaceRejectReason.InvalidMerge;
|
|
}
|
|
|
|
const srcW1 = source.weapon1Id ?? this._config.getWeapon1ByGroupSequence([source.weapon2Id]);
|
|
const dstW1 = target.weapon1Id ?? this._config.getWeapon1ByGroupSequence([target.weapon2Id]);
|
|
if (srcW1 == null || dstW1 == null) {
|
|
return PlaceRejectReason.InvalidMerge;
|
|
}
|
|
if (!this._config.isSingleCellWeapon1(srcW1)) {
|
|
return PlaceRejectReason.InvalidMerge;
|
|
}
|
|
|
|
const srcLevel = source.level ?? 1;
|
|
const dstLevel = target.level ?? 1;
|
|
if (srcW1 !== dstW1 || srcLevel !== dstLevel) {
|
|
return PlaceRejectReason.InvalidMerge;
|
|
}
|
|
|
|
const max = this._config.getMaxWeaponLevel(srcW1);
|
|
if (srcLevel >= max) {
|
|
return PlaceRejectReason.MaxLevel;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
mergeInBag(target: BagSlotRecord): BagSlotRecord {
|
|
const w1 = target.weapon1Id ?? this._config.getWeapon1ByGroupSequence([target.weapon2Id]);
|
|
const next = (target.level ?? 1) + 1;
|
|
if (w1 == null) {
|
|
console.log('[UpgradeSystem] mergeInBag 无法解析 Weapon1');
|
|
return { ...target };
|
|
}
|
|
return {
|
|
...target,
|
|
level: Math.min(this._config.getMaxWeaponLevel(w1), next),
|
|
};
|
|
}
|
|
|
|
/** 多字 Weapon1:拖字块到已组合单位上升级 */
|
|
canUpgradeOnMap(
|
|
bagTile: BagSlotRecord,
|
|
composedWeapon1Id: number,
|
|
composedLevel: number,
|
|
requiredWeapon2Id: number,
|
|
): PlaceRejectReason | null {
|
|
if (bagTile.weapon2Id !== requiredWeapon2Id) {
|
|
return PlaceRejectReason.InvalidMerge;
|
|
}
|
|
const max = this._config.getMaxWeaponLevel(composedWeapon1Id);
|
|
if (composedLevel >= max) {
|
|
return PlaceRejectReason.MaxLevel;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
upgradeLevel(level: number): number {
|
|
return level + 1;
|
|
}
|
|
}
|
|
|