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.
AdLike2048/assets/mx/module/merge/upgrade/UpgradeSystem.ts

71 lines
2.5 KiB

3 weeks ago
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;
}
}