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