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.
185 lines
4.9 KiB
185 lines
4.9 KiB
import { Singleton } from "../../mx/tools/Singleton";
|
|
|
|
|
|
/**武器类型
|
|
*
|
|
* 武器类型
|
|
1、减速
|
|
2、燃烧
|
|
3、感电
|
|
4、物理
|
|
5、通用
|
|
*/
|
|
export enum WEAPON_TYPE{
|
|
/**减速*/
|
|
Slow = 1,
|
|
/**燃烧*/
|
|
Burn = 2,
|
|
/**感电*/
|
|
Shock = 3,
|
|
/**物理*/
|
|
Physic = 4,
|
|
/**通用*/
|
|
Common = 5,
|
|
}
|
|
|
|
|
|
|
|
/**武器品质*/
|
|
export enum QUAILITY{
|
|
/**普通*/
|
|
Normal = 1,
|
|
/**精英*/
|
|
Elite = 2,
|
|
/**稀有*/
|
|
Rare = 3,
|
|
/**传说*/
|
|
Legend = 4,
|
|
}
|
|
/**加成类型*/
|
|
export enum AddType{
|
|
/**攻击加成1*/
|
|
Atk = 1,
|
|
/**角色冷却*/
|
|
CD = 2,
|
|
/**暴击*/
|
|
Crit = 3,
|
|
/**攻击加成2*/
|
|
Atk2= 4,
|
|
/**伤害加成*/
|
|
DamageAdd = 5,
|
|
/**暴击伤害加成*/
|
|
CritDamageAdd = 6,
|
|
/**所有武器点燃单位额外加成*/
|
|
IgniteAdd = 7,
|
|
/**感电单位额外加成*/
|
|
ShockAdd = 8,
|
|
|
|
}
|
|
|
|
/**穿戴加成类型 1 指定武器, 2指定品质武器 3所有武器加成 4指定类型的武器*/
|
|
export enum WearingAddType{
|
|
/**指定武器加成*/
|
|
SpecifyWeapon = 1,
|
|
/**指定品质武器加成*/
|
|
SpecifyQualityWeapon = 2,
|
|
/**所有武器加成*/
|
|
AllWeapon = 3,
|
|
/**指定类型武器加成*/
|
|
SpecifyAddType = 4,
|
|
}
|
|
|
|
// types/pet.ts
|
|
export interface AttrResult {
|
|
atkAdd: number;
|
|
cdAdd: number;
|
|
critAdd: number;
|
|
atk2Add: number;
|
|
damageAdd: number;
|
|
critDamageAdd: number;
|
|
igniteAdd: number;
|
|
shockAdd: number;
|
|
}
|
|
|
|
export const ATTR_TYPE_MAP: Record<number, keyof AttrResult> = {
|
|
[AddType.Atk]: 'atkAdd',
|
|
[AddType.CD]: 'cdAdd',
|
|
[AddType.Crit]: 'critAdd',
|
|
[AddType.Atk2]: 'atk2Add',
|
|
[AddType.DamageAdd]: 'damageAdd',
|
|
[AddType.CritDamageAdd]: 'critDamageAdd',
|
|
[AddType.IgniteAdd]: 'igniteAdd',
|
|
[AddType.ShockAdd]: 'shockAdd',
|
|
};
|
|
|
|
// 3. 【核心优化】定义条件判断策略表 (彻底替代 switch/case)
|
|
// 键:WearingAddType 枚举值
|
|
// 值:一个函数,接收 (配置参数, 武器数据),返回 boolean
|
|
export const CONDITION_STRATEGIES: Record<number, (param: number, weapon: ITableWeapon2) => boolean> = {
|
|
[WearingAddType.SpecifyWeapon]: (param, weapon) => param === weapon.id, // 假设 weapon.id 是武器ID
|
|
|
|
[WearingAddType.SpecifyQualityWeapon]: (param, weapon) => param === weapon.quality,
|
|
|
|
[WearingAddType.AllWeapon]: () => true, // 所有武器直接返回 true
|
|
|
|
[WearingAddType.SpecifyAddType]: (param, weapon) => param === weapon.type || weapon.type == WEAPON_TYPE.Common, //5是通用武器加成
|
|
};
|
|
|
|
export class AttributeInterface extends Singleton {
|
|
// 配置:有多少个来源参与了加成计算?
|
|
|
|
/**
|
|
* 通用计算核心
|
|
* @param weaponId 武器ID
|
|
* @param attrKey 属性键名 (如 'atkAdd', 'critAdd' 等)
|
|
*/
|
|
private _calculateAttr(weaponId: number, attrKey: keyof AttrResult): number {
|
|
// 1. 获取三个来源的数据
|
|
// const petAttr = gg.pet.getPetAttr(weaponId);
|
|
// const allSkinAttr = gg.skin.getSkinGlobalAdd();
|
|
// const skinAttr = gg.skin.getSkinAttrByWeapon(weaponId);
|
|
|
|
// // 2. 累加对应属性的值
|
|
// const total =
|
|
// (petAttr[attrKey] || 0) +
|
|
// (allSkinAttr[attrKey] || 0) +
|
|
// (skinAttr[attrKey] || 0);
|
|
|
|
// return total
|
|
return 1
|
|
}
|
|
|
|
/**获取攻击力额外属性 */
|
|
getAttrAtk1Value(weaponId: number): number {
|
|
return this._calculateAttr(weaponId, 'atkAdd');
|
|
}
|
|
|
|
/**获取冷却额外属性 */
|
|
getAttrCDValue(weaponId: number): number {
|
|
return this._calculateAttr(weaponId, 'cdAdd');
|
|
}
|
|
|
|
/**获取暴击额外属性 */
|
|
getAttrCritValue(weaponId: number): number {
|
|
return this._calculateAttr(weaponId, 'critAdd');
|
|
}
|
|
|
|
/**获取攻击加成2额外属性 */
|
|
getAttrAtk2Value(weaponId: number): number {
|
|
return this._calculateAttr(weaponId, 'atk2Add');
|
|
}
|
|
|
|
/**获取伤害加成额外属性 */
|
|
getAttrDamageValue(weaponId: number): number {
|
|
return this._calculateAttr(weaponId, 'damageAdd');
|
|
}
|
|
|
|
/**获取暴击伤害加成额外属性 */
|
|
getAttrCritDamageAddValue(weaponId: number): number {
|
|
return this._calculateAttr(weaponId, 'critDamageAdd');
|
|
}
|
|
|
|
/**获取点燃单位额外加成 */
|
|
getAttrIgniteAddValue(weaponId: number): number {
|
|
return this._calculateAttr(weaponId, 'igniteAdd');
|
|
}
|
|
|
|
/**获取感电单位额外加成 */
|
|
getAttrShockAddValue(weaponId: number): number {
|
|
return this._calculateAttr(weaponId, 'shockAdd');
|
|
}
|
|
|
|
// 💡 进阶技巧:如果你需要通过 AddType 枚举动态获取值,可以加这个万能方法
|
|
getAttrByType(weaponId: number, type: AddType): number | null {
|
|
const key = ATTR_TYPE_MAP[type];
|
|
if (!key) {
|
|
console.warn(`未知的属性类型: ${type}`);
|
|
return null;
|
|
}
|
|
return this._calculateAttr(weaponId, key);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|