refactor(战斗系统): 简化属性系统并移除魔法相关属性

移除魔法攻击(MAP)、魔法防御(MDEF)、元素抗性等冗余属性
将伤害减免统一由DEF属性处理,重命名CRITICAL_RESIST为CRITICAL_RES
更新相关技能、天赋和怪物配置以适应新的属性系统
删除未使用的职业成长系数配置和基础属性映射逻辑
This commit is contained in:
walkpan
2026-01-01 22:08:26 +08:00
parent e50431dbd6
commit 5e9494e4f8
17 changed files with 88 additions and 486 deletions

View File

@@ -49,7 +49,7 @@ export const TD_OPTION_CONFIG: Record<number, IOptionGrowth> = {
// 控制与特效 (统一配置)
[Attrs.STUN_CHANCE]: { base: 1.5, grow: 0.05, desc: "眩晕概率 +{val}%", totalNote: "+40%" },
// ... 其他控制类同上
[Attrs.PIERCE]: { base: 1, grow: 0, desc: "穿透 +{val}", totalNote: "+20" },
[Attrs.PUNCTURE]: { base: 1, grow: 0, desc: "穿透 +{val}", totalNote: "+20" },
};
// 辅助函数

View File

@@ -30,7 +30,7 @@ export const TD_ENABLED_ATTRS: ReadonlySet<Attrs> = new Set<Attrs>([
Attrs.AP,
Attrs.AS,
Attrs.DIS,
Attrs.PIERCE,
Attrs.PUNCTURE,
Attrs.CRITICAL,
Attrs.CRITICAL_DMG,
Attrs.HP_MAX,
@@ -44,7 +44,7 @@ export const TD_OPTIONAL_ATTRS: ReadonlySet<Attrs> = new Set<Attrs>([
]);
export const TD_ATTR_GROUPS = {
towerCore: [Attrs.AP, Attrs.AS, Attrs.DIS, Attrs.PIERCE],
towerCore: [Attrs.AP, Attrs.AS, Attrs.DIS, Attrs.PUNCTURE],
towerBonus: [Attrs.CRITICAL, Attrs.CRITICAL_DMG],
enemyCore: [Attrs.HP_MAX, Attrs.DEF],
optional: [Attrs.SLOW_CHANCE, Attrs.GOLD_GAIN, Attrs.DMG_RED],

View File

@@ -54,7 +54,7 @@
| 妨害状态 | 冻结(FREEZE_CHANCE) +6% | 中毒(POISON_CHANCE) +8% | 燃烧(BURN_CHANCE) +8% | +68% | 中期 | 面向清杂、溃散,触发期望受控 |
| 蓝量循环 | 蓝上限(MP_MAX) +10% | 蓝回复(MP_REGEN) +15% | 吸蓝(MANASTEAL) +6% | +1015% | 早中期 | 技能密度稳定来源,支撑法系 |
| 续航强化 | 吸血(LIFESTEAL) +6% | 治疗效果(HEAL_EFFECT) +12% | 护盾效果(SHIELD_UP) +12% | +612% | 中后期 | 对应不同生存风格,数值递减避免堆满 |
| 稳定系 | 命中(HIT) +10% | 控抗(CON_RES) +10% | 暴抗(CRITICAL_RESIST) +10% | +810% | 中后期 | 降低波动,克制高暴击/高控敌群 |
| 稳定系 | 命中(HIT) +10% | 控抗(CON_RES) +10% | 暴抗(CRITICAL_RES) +10% | +810% | 中后期 | 降低波动,克制高暴击/高控敌群 |
| 经济成长 | 经验(EXP_GAIN) +10% | 金币(GOLD_GAIN) +10% | 掉落(DROP_CHANCE) +8% | +810% | 转场期 | 低战力节点给经济,避免战斗失衡 |
| 复活保障 | 复活次数(REVIVE_COUNT) +1 | 无敌时间(INVINCIBLE_TIME) +1s | 复活时间(REVIVE_TIME) -10% | +1 / +1s / -10% | 后期 | 高压波次救命,不与关键天赋冲突 |
| 元素对抗 | 物抗(PHYS_RES) +10% | 魔抗(MAGIC_RES) +10% | 物伤加成(PHYS_POWER) +8% | +810% | 中后期 | 根据敌群构成动态出现 |

View File

@@ -2,7 +2,7 @@
"ver": "1.0.1",
"importer": "text",
"imported": true,
"uuid": "e59e8d19-308d-42c8-9fae-7faaa767d57b",
"uuid": "cbe20048-4b53-4d88-a84d-f856214e902d",
"files": [
".json"
],

View File

@@ -0,0 +1,11 @@
{
"ver": "1.0.1",
"importer": "text",
"imported": true,
"uuid": "2eccd2f0-0d28-44bd-b2c0-603ffe1f4dce",
"files": [
".json"
],
"subMetas": {},
"userData": {}
}

View File

@@ -4,7 +4,6 @@ import { Initialize } from "../initialize/Initialize";
import { GameMap } from "../map/GameMap";
import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops";
import { WxCloudApi } from "../wx_clound_client_api/WxCloudApi";
import { Test } from "./Test";
import { GameEvent } from "./config/GameEvent";
/**
* 用远程数据覆盖本地数据(统一方法)

View File

@@ -1,5 +1,3 @@
import * as exp from "constants";
import { HType } from "./heroSet";
/**
* Buff类型枚举
@@ -31,45 +29,27 @@ export enum Attrs {
SHIELD_MAX = 2, // 最大护盾值
HP_REGEN = 3, // 生命回复
MP_REGEN = 4, // 魔法回复
HEAL_EFFECT = 5, // 治疗效果
// ========== 攻击属性 (10-19) ==========
AP = 10, // 攻击力
MAP = 11, // 魔法攻击力
DIS = 12, // 攻击距离
AS = 13, // 攻击速度减少技能skills[0]CD
SS = 14, // 技能速度 (减少skills[0] 以外的cd)
SKILL_DURATION = 15, // 技能持续时间
AREA_OF_EFFECT = 16, // 作用范围
PIERCE = 17, // 穿透次数
// ========== 防御属性 (20-29) ==========
DEF = 20, // 物理防御
MDEF = 21, // 魔法防御
DEF = 20, // 防御 伤害减免
DODGE = 22, // 闪避率
BLOCK = 23, // 格挡率
DMG_RED = 24, // 伤害减免
THORNS = 25, // 反伤
CRITICAL_RESIST = 26, // 暴击抗性
CRITICAL_RES = 26, // 暴击抗性
CON_RES = 27, // 控制抗性
// ========== 暴击与命中属性 (30-39) ==========
CRITICAL = 30, // 暴击率
CRITICAL_DMG = 31, // 暴击伤害
HIT = 32, // 命中率
// ========== 元素属性 (40-49) ==========
ICE_RES = 40, // 冰冻抗性
FIRE_RES = 41, // 火焰抗性
WIND_RES = 42, // 自然抗性
PHYS_RES = 43, // 物理抗性
MAGIC_RES = 44, // 魔法抗性
ICE_POWER = 45, // 冰冻伤害加成
FIRE_POWER = 46, // 火焰伤害加成
WIND_POWER = 47, // 自然伤害加成
PHYS_POWER = 48, // 物理伤害加成
MAGIC_POWER= 49,
// ========== 特殊效果属性 (50-59) ==========
LIFESTEAL = 50, // 吸血比率
@@ -105,10 +85,6 @@ export enum Attrs {
// ========== 负面状态相关 (80-89) ==========
DMG_INVUL = 80, //易伤
// ========== 基础属性(影响其他属性) (90-99)==========
STRENGTH = 90, // 力量(影响物理相关)
INTELLIGENCE = 91, // 智力(影响魔法相关)
AGILITY = 92, // 敏捷(影响速度和闪避)
SPIRIT = 93, // 精神(影响抗性和特殊效果)
LUCK = 94, // 幸运(影响暴击和特殊概率)
}
@@ -154,45 +130,29 @@ export const AttrsType: Record<Attrs, BType> = {
[Attrs.SHIELD_MAX]: BType.VALUE, // 最大护盾值 - 数值型
[Attrs.HP_REGEN]: BType.VALUE, // 生命回复 - 数值型
[Attrs.MP_REGEN]: BType.VALUE, // 魔法回复 - 数值型
[Attrs.HEAL_EFFECT]: BType.RATIO, // 治疗效果 - 百分比型
// ========== 攻击属性(数值型) ==========
[Attrs.AP]: BType.VALUE, // 攻击力 - 数值型
[Attrs.MAP]: BType.VALUE, // 魔法攻击力 - 数值型
[Attrs.DIS]: BType.VALUE, // 攻击距离 - 数值型
[Attrs.AS]: BType.RATIO, // 攻击速度 - 百分比型
[Attrs.SS]: BType.RATIO, // 技能速度 - 百分比型
[Attrs.SKILL_DURATION]: BType.RATIO, // 技能持续时间 - 百分比型
[Attrs.AREA_OF_EFFECT]: BType.VALUE, // 作用范围 - 数值型
[Attrs.PIERCE]: BType.VALUE, // 穿透次数 - 数值型
// ========== 防御属性(混合类型) ==========
[Attrs.DEF]: BType.VALUE, // 物理防御 - 数值型
[Attrs.MDEF]: BType.VALUE, // 魔法防御 - 数值型
[Attrs.DODGE]: BType.RATIO, // 闪避率 - 百分比型
[Attrs.BLOCK]: BType.RATIO, // 格挡率 - 百分比型
[Attrs.DMG_RED]: BType.RATIO, // 伤害减免 - 百分比型
[Attrs.THORNS]: BType.RATIO, // 反伤 - 百分比型
// ========== 暴击与命中属性(百分比型) ==========
[Attrs.CRITICAL]: BType.RATIO, // 暴击率 - 百分比型
[Attrs.CRITICAL_DMG]: BType.RATIO, // 暴击伤害 - 百分比型
[Attrs.HIT]: BType.RATIO, // 命中率 - 百分比型
[Attrs.CRITICAL_RESIST]: BType.RATIO, // 暴击抗性 - 百分比型
[Attrs.CRITICAL_RES]: BType.RATIO, // 暴击抗性 - 百分比型
[Attrs.CON_RES]: BType.RATIO, // 控制抗性 - 百分比型
// ========== 元素属性(百分比型) ==========
[Attrs.ICE_RES]: BType.RATIO, // 冰冻抗性 - 百分比型
[Attrs.FIRE_RES]: BType.RATIO, // 火焰抗性 - 百分比型
[Attrs.WIND_RES]: BType.RATIO, // 风抗性 - 百分比型
[Attrs.PHYS_RES]: BType.RATIO, // 物理抗性 - 百分比型
[Attrs.MAGIC_RES]:BType.RATIO,
[Attrs.ICE_POWER]: BType.RATIO, // 冰冻伤害加成 - 百分比型
[Attrs.FIRE_POWER]: BType.RATIO, // 火焰伤害加成 - 百分比型
[Attrs.WIND_POWER]: BType.RATIO, // 风伤害加成 - 百分比型
[Attrs.PHYS_POWER]: BType.RATIO, // 物理伤害加成 - 百分比型
[Attrs.MAGIC_POWER]: BType.RATIO, // 物理伤害加成 - 百分比型
// ========== 特殊效果属性(百分比型) ==========
[Attrs.LIFESTEAL]: BType.RATIO, // 吸血比率 - 百分比型
@@ -230,10 +190,6 @@ export const AttrsType: Record<Attrs, BType> = {
[Attrs.DMG_INVUL]: BType.RATIO, //易伤
// ========== 基础属性(数值型) ==========
[Attrs.STRENGTH]: BType.VALUE, // 力量 - 数值型
[Attrs.INTELLIGENCE]: BType.VALUE, // 智力 - 数值型
[Attrs.AGILITY]: BType.VALUE, // 敏捷 - 数值型
[Attrs.SPIRIT]: BType.VALUE, // 精神 - 数值型
[Attrs.LUCK]: BType.VALUE, // 幸运 - 数值型
};
@@ -246,306 +202,4 @@ export const isRatioAttr = (attrType: Attrs): boolean => {
return AttrsType[attrType] === BType.RATIO;
};
/**
* 职业属性增长系数配置
* 定义不同职业类型下,基础属性对战斗属性的差异化转化比例
*/
/**
* 基础属性增长映射接口
*/
export interface BaseAttrGrowthRate {
[targetAttr: number]: number; // 目标属性 -> 增长系数
}
/**
* 职业属性增长配置接口
*/
export interface HeroTypeAttrGrowth {
[baseAttr: number]: BaseAttrGrowthRate; // 基础属性 -> 目标属性增长配置
}
/**
* 职业属性增长配置表
* 体现不同职业的成长特色
*/
export const HeroTypeGrowthConfig: Record<HType, HeroTypeAttrGrowth> = {
// ========== 战士 (Warrior) ==========
// 特点:高生命、高物理攻击、高物理防御
[HType.warrior]: {
[Attrs.STRENGTH]: {
[Attrs.HP_MAX]: 3, // 力量 -> 生命值 (战士系数更高)
[Attrs.AP]: 1.5, // 力量 -> 攻击力 (战士系数更高)
[Attrs.DEF]: 0.8, // 力量 -> 物理防御
},
[Attrs.INTELLIGENCE]: {
[Attrs.MP_MAX]: 0.5, // 智力 -> 魔法值 (战士系数较低)
[Attrs.MAP]: 0.3, // 智力 -> 魔法攻击 (战士不擅长)
},
[Attrs.AGILITY]: {
[Attrs.CRITICAL]: 0.3, // 敏捷 -> 暴击率
[Attrs.DODGE]: 0.2, // 敏捷 -> 闪避 (战士较低)
[Attrs.AS]: 0.2, // 敏捷 -> 攻击速度
},
[Attrs.SPIRIT]: {
[Attrs.MP_MAX]: 0.5, // 精神 -> 魔法值
[Attrs.LIFESTEAL]: 0.4, // 精神 -> 吸血 (战士较高)
[Attrs.MDEF]: 0.3, // 精神 -> 魔法防御
[Attrs.HP_REGEN]: 0.2, // 精神 -> 生命回复
[Attrs.MP_REGEN]: 0.3, // 精神 -> 魔法回复
},
[Attrs.LUCK]: {
[Attrs.CRITICAL]: 0.8, // 幸运 -> 暴击率
[Attrs.CRITICAL_DMG]: 0.4, // 幸运 -> 暴击伤害
},
},
// ========== 远程 (Remote) ==========
// 特点:高敏捷、高攻速、高暴击
[HType.remote]: {
[Attrs.STRENGTH]: {
[Attrs.HP_MAX]: 1.5, // 力量 -> 生命值 (远程较低)
[Attrs.AP]: 1.2, // 力量 -> 攻击力
[Attrs.DEF]: 0.4, // 力量 -> 物理防御 (远程较低)
},
[Attrs.INTELLIGENCE]: {
[Attrs.MP_MAX]: 0.8, // 智力 -> 魔法值
[Attrs.MAP]: 0.5, // 智力 -> 魔法攻击
},
[Attrs.AGILITY]: {
[Attrs.CRITICAL]: 0.8, // 敏捷 -> 暴击率 (远程很高)
[Attrs.DODGE]: 0.6, // 敏捷 -> 闪避 (远程较高)
[Attrs.AS]: 0.5, // 敏捷 -> 攻击速度 (远程很高)
[Attrs.SPEED]: 0.3, // 敏捷 -> 移动速度
},
[Attrs.SPIRIT]: {
[Attrs.MP_MAX]: 0.6, // 精神 -> 魔法值
[Attrs.HIT]: 0.5, // 精神 -> 命中 (远程需要精准)
[Attrs.MDEF]: 0.3, // 精神 -> 魔法防御
},
[Attrs.LUCK]: {
[Attrs.CRITICAL]: 1.2, // 幸运 -> 暴击率 (远程最高)
[Attrs.CRITICAL_DMG]: 0.8, // 幸运 -> 暴击伤害 (远程很高)
[Attrs.HIT]: 0.4, // 幸运 -> 命中
},
},
// ========== 法师 (Mage) ==========
// 特点:高魔法攻击、高魔法值、高魔法防御
[HType.mage]: {
[Attrs.STRENGTH]: {
[Attrs.HP_MAX]: 1.2, // 力量 -> 生命值 (法师很低)
[Attrs.AP]: 0.3, // 力量 -> 攻击力 (法师不需要)
},
[Attrs.INTELLIGENCE]: {
[Attrs.MP_MAX]: 2, // 智力 -> 魔法值 (法师最高)
[Attrs.MAP]: 1.8, // 智力 -> 魔法攻击 (法师最高)
[Attrs.MDEF]: 0.8, // 智力 -> 魔法防御
[Attrs.AREA_OF_EFFECT]: 0.3, // 智力 -> 作用范围
},
[Attrs.AGILITY]: {
[Attrs.CRITICAL]: 0.4, // 敏捷 -> 暴击率
[Attrs.DODGE]: 0.3, // 敏捷 -> 闪避
[Attrs.AS]: 0.3, // 敏捷 -> 攻击速度
},
[Attrs.SPIRIT]: {
[Attrs.MP_MAX]: 1.5, // 精神 -> 魔法值 (法师较高)
[Attrs.MDEF]: 0.8, // 精神 -> 魔法防御 (法师较高)
[Attrs.CON_RES]: 0.3, // 精神 -> 控制抗性
},
[Attrs.LUCK]: {
[Attrs.CRITICAL]: 0.6, // 幸运 -> 暴击率
[Attrs.CRITICAL_DMG]: 0.5, // 幸运 -> 暴击伤害
},
},
// ========== 辅助 (Support) ==========
// 特点:高生命、高魔法值、高抗性、高辅助效果
[HType.support]: {
[Attrs.STRENGTH]: {
[Attrs.HP_MAX]: 2.5, // 力量 -> 生命值 (辅助较高)
[Attrs.AP]: 0.5, // 力量 -> 攻击力 (辅助较低)
[Attrs.DEF]: 0.6, // 力量 -> 物理防御
},
[Attrs.INTELLIGENCE]: {
[Attrs.MP_MAX]: 1.5, // 智力 -> 魔法值 (辅助需要)
[Attrs.MAP]: 0.8, // 智力 -> 魔法攻击
[Attrs.MDEF]: 0.6, // 智力 -> 魔法防御
},
[Attrs.AGILITY]: {
[Attrs.DODGE]: 0.4, // 敏捷 -> 闪避
[Attrs.AS]: 0.3, // 敏捷 -> 攻击速度
[Attrs.SPEED]: 0.4, // 敏捷 -> 移动速度
},
[Attrs.SPIRIT]: {
[Attrs.MP_MAX]: 2, // 精神 -> 魔法值 (辅助很高)
[Attrs.LIFESTEAL]: 0.5, // 精神 -> 吸血
[Attrs.MDEF]: 0.8, // 精神 -> 魔法防御 (辅助较高)
[Attrs.CON_RES]: 0.5, // 精神 -> 控制抗性 (辅助较高)
[Attrs.BUFF_UP]: 0.6, // 精神 -> Buff效果提升 (辅助特色)
},
[Attrs.LUCK]: {
[Attrs.CRITICAL]: 0.5, // 幸运 -> 暴击率
[Attrs.SHIELD_UP]: 0.8, // 幸运 -> 护盾效果提升 (辅助特色)
},
},
// ========== 刺客 (Assassin) ==========
// 特点:超高暴击、高敏捷、高爆发、低防御
[HType.assassin]: {
[Attrs.STRENGTH]: {
[Attrs.HP_MAX]: 1.8, // 力量 -> 生命值 (刺客较低)
[Attrs.AP]: 1.3, // 力量 -> 攻击力
[Attrs.DEF]: 0.3, // 力量 -> 物理防御 (刺客很低)
},
[Attrs.INTELLIGENCE]: {
[Attrs.MP_MAX]: 0.6, // 智力 -> 魔法值
[Attrs.MAP]: 0.4, // 智力 -> 魔法攻击
},
[Attrs.AGILITY]: {
[Attrs.CRITICAL]: 1, // 敏捷 -> 暴击率 (刺客超高)
[Attrs.DODGE]: 0.8, // 敏捷 -> 闪避 (刺客很高)
[Attrs.AS]: 0.6, // 敏捷 -> 攻击速度 (刺客很高)
[Attrs.SPEED]: 0.5, // 敏捷 -> 移动速度 (刺客很高)
},
[Attrs.SPIRIT]: {
[Attrs.MP_MAX]: 0.5, // 精神 -> 魔法值
[Attrs.LIFESTEAL]: 0.6, // 精神 -> 吸血 (刺客较高)
[Attrs.MDEF]: 0.2, // 精神 -> 魔法防御 (刺客很低)
},
[Attrs.LUCK]: {
[Attrs.CRITICAL]: 1.5, // 幸运 -> 暴击率 (刺客超高)
[Attrs.CRITICAL_DMG]: 1, // 幸运 -> 暴击伤害 (刺客超高)
[Attrs.HIT]: 0.3, // 幸运 -> 命中
},
},
};
/**
* 根据职业类型和基础属性,计算其他属性的增长值
* @param heroType 职业类型
* @param baseAttrType 基础属性类型STRENGTH, INTELLIGENCE, AGILITY, SPIRIT, LUCK
* @param baseAttrValue 基础属性点数
* @returns 其他属性的增长值映射表
*
* @example
* // 计算战士职业10点力量的属性增长
* const gains = calculateAttributeGains(HType.warrior, Attrs.STRENGTH, 10);
* // 返回:{ [Attrs.HP_MAX]: 30, [Attrs.AP]: 15, [Attrs.DEF]: 8 }
*/
export function calculateAttributeGains(
heroType: HType,
baseAttrType: Attrs,
baseAttrValue: number
): Partial<Record<Attrs, number>> {
const heroGrowthConfig = HeroTypeGrowthConfig[heroType];
if (!heroGrowthConfig) {
console.warn(`未找到职业类型 ${heroType} 的增长配置`);
return {};
}
const baseAttrGrowth = heroGrowthConfig[baseAttrType];
if (!baseAttrGrowth) {
console.warn(`职业 ${heroType} 不具有基础属性 ${baseAttrType} 的增长配置`);
return {};
}
const result: Partial<Record<Attrs, number>> = {};
for (const targetAttrStr in baseAttrGrowth) {
const targetAttr = Number(targetAttrStr) as Attrs;
const growthRate = baseAttrGrowth[targetAttr];
result[targetAttr] = baseAttrValue * growthRate;
}
return result;
}
/**
* 快捷方法:计算力量属性增长
* @param heroType 职业类型
* @param strengthPoints 力量点数
* @returns 其他属性的增长值
*/
export function addStrength(heroType: HType, strengthPoints: number): Partial<Record<Attrs, number>> {
return calculateAttributeGains(heroType, Attrs.STRENGTH, strengthPoints);
}
/**
* 快捷方法:计算智力属性增长
* @param heroType 职业类型
* @param intelligencePoints 智力点数
* @returns 其他属性的增长值
*/
export function addIntelligence(heroType: HType, intelligencePoints: number): Partial<Record<Attrs, number>> {
return calculateAttributeGains(heroType, Attrs.INTELLIGENCE, intelligencePoints);
}
/**
* 快捷方法:计算敏捷属性增长
* @param heroType 职业类型
* @param agilityPoints 敏捷点数
* @returns 其他属性的增长值
*/
export function addAgility(heroType: HType, agilityPoints: number): Partial<Record<Attrs, number>> {
return calculateAttributeGains(heroType, Attrs.AGILITY, agilityPoints);
}
/**
* 快捷方法:计算精神属性增长
* @param heroType 职业类型
* @param spiritPoints 精神点数
* @returns 其他属性的增长值
*/
export function addSpirit(heroType: HType, spiritPoints: number): Partial<Record<Attrs, number>> {
return calculateAttributeGains(heroType, Attrs.SPIRIT, spiritPoints);
}
/**
* 快捷方法:计算幸运属性增长
* @param heroType 职业类型
* @param luckPoints 幸运点数
* @returns 其他属性的增长值
*/
export function addLuck(heroType: HType, luckPoints: number): Partial<Record<Attrs, number>> {
return calculateAttributeGains(heroType, Attrs.LUCK, luckPoints);
}
/**
* 计算多个基础属性的总增长
* @param heroType 职业类型
* @param baseAttrs 基础属性映射表 { 属性ID: 属性值 }
* @returns 总增长值
*
* @example
* // 计算战士职业的总属性增长
* const totalGains = calculateTotalAttributeGains(HType.warrior, {
* [Attrs.STRENGTH]: 10,
* [Attrs.AGILITY]: 5,
* [Attrs.SPIRIT]: 3
* });
*/
export function calculateTotalAttributeGains(
heroType: HType,
baseAttrs: Partial<Record<Attrs, number>>
): Partial<Record<Attrs, number>> {
const totalGains: Partial<Record<Attrs, number>> = {};
for (const baseAttrStr in baseAttrs) {
const baseAttr = Number(baseAttrStr) as Attrs;
const baseAttrValue = baseAttrs[baseAttr];
if (baseAttrValue === undefined || baseAttrValue <= 0) continue;
const gains = calculateAttributeGains(heroType, baseAttr, baseAttrValue);
for (const targetAttrStr in gains) {
const targetAttr = Number(targetAttrStr) as Attrs;
const gainValue = gains[targetAttr];
if (gainValue !== undefined) {
totalGains[targetAttr] = (totalGains[targetAttr] || 0) + gainValue;
}
}
}
return totalGains;
}

View File

@@ -153,57 +153,57 @@ interface IEndAnm {
// 技能配置接口 - 按照6001格式排列
export interface SkillConfig {
uuid:number,name:string,sp_name:string,icon:string,TGroup:TGroup,SType:SType,act:string,DTType:DTType,DType:DType,
ap:number,map:number,cd:number,t_num:number,hit_num:number,hit:number,hitcd:number,speed:number,cost:number,with:number,dis:Number,ready:number,EAnm:number,DAnm:number,RType:RType,EType:EType,
ap:number,cd:number,t_num:number,hit_num:number,hit:number,hitcd:number,speed:number,cost:number,with:number,dis:Number,ready:number,EAnm:number,DAnm:number,RType:RType,EType:EType,
buffs:BuffConf[],neAttrs:NeAttrsConf[],info:string,hero?:number ,
}
export const SkillSet: Record<number, SkillConfig> = {
5000:{uuid:5000,name:"反伤",sp_name:"thorns",icon:"3036",TGroup:TGroup.Enemy,SType:SType.damage,act:"atk",DTType:DTType.single,DType:DType.ATK,
ap:0,map:0,cd:60,t_num:1,hit_num:1,hit:1,hitcd:0.2,speed:720,cost:0,with:0,dis:80,
ap:0,cd:60,t_num:1,hit_num:1,hit:1,hitcd:0.2,speed:720,cost:0,with:0,dis:80,
ready:0,EAnm:0,DAnm:9001,RType:RType.fixed,EType:EType.animationEnd,
buffs:[],neAttrs:[],info:"反伤",
},
// ========== 基础攻击 ========== 6001-6099
6001: {
uuid:6001,name:"挥击",sp_name:"atk_s1",icon:"3036",TGroup:TGroup.Enemy,SType:SType.damage,act:"atk",DTType:DTType.single,DType:DType.ATK,
ap:100,map:0,cd:1,t_num:1,hit_num:1,hit:1,hitcd:0.2,speed:720,cost:10,with:0,dis:80,
ap:100,cd:1,t_num:1,hit_num:1,hit:1,hitcd:0.2,speed:720,cost:10,with:0,dis:80,
ready:0,EAnm:0,DAnm:9001,RType:RType.fixed,EType:EType.animationEnd,
buffs:[],neAttrs:[],info:"向最前方敌人扔出石斧,造成100%攻击的伤害",
},
6002: {
uuid:6002,name:"挥砍",sp_name:"atk_s4",icon:"3036",TGroup:TGroup.Enemy,SType:SType.damage,act:"atk",DTType:DTType.single,DType:DType.ATK,
ap:100,map:0,cd:1,t_num:1,hit_num:1,hit:1,hitcd:0.2,speed:720,cost:10,with:0,dis:80,
ap:100,cd:1,t_num:1,hit_num:1,hit:1,hitcd:0.2,speed:720,cost:10,with:0,dis:80,
ready:0,EAnm:0,DAnm:9001,RType:RType.fixed,EType:EType.animationEnd,
buffs:[],neAttrs:[],info:"向最前方敌人扔出石斧,造成100%攻击的伤害",
},
6005: {
uuid:6005,name:"水球",sp_name:"m_water_ball_1",icon:"3039",TGroup:TGroup.Enemy,SType:SType.damage,act:"atk",DTType:DTType.single,DType:DType.ICE,
ap:100,map:0,cd:5,t_num:1,hit_num:1,hit:2,hitcd:0.3,speed:720,cost:0,with:90,dis:360,
ap:100,cd:5,t_num:1,hit_num:1,hit:2,hitcd:0.3,speed:720,cost:0,with:90,dis:360,
ready:8001,EAnm:0,DAnm:9001,RType:RType.linear,EType:EType.collision,
buffs:[],neAttrs:[],info:"召唤水球攻击前方敌人,造成100%魔法攻击的伤害",
},
// ========== 基础buff ========== 6100-6199
6100: {
uuid:6100,name:"治疗",sp_name:"buff_wind",icon:"3036",TGroup:TGroup.Self,SType:SType.heal,act:"atk",DTType:DTType.single,DType:DType.ATK,
ap:30,map:0,cd:5,t_num:1,hit_num:1,hit:1,hitcd:0.2,speed:720,cost:10,with:0,dis:720,
ap:30,cd:5,t_num:1,hit_num:1,hit:1,hitcd:0.2,speed:720,cost:10,with:0,dis:720,
ready:0,EAnm:0,DAnm:9001,RType:RType.fixed,EType:EType.animationEnd,
buffs:[],neAttrs:[],info:"治疗自己,回复30%最大生命值",
},
6101:{
uuid:6101,name:"魔法盾",sp_name:"buff_wind",icon:"3036",TGroup:TGroup.Self,SType:SType.shield,act:"atk",DTType:DTType.single,DType:DType.WIND,
ap:30,map:0,cd:7,t_num:1,hit_num:1,hit:1,hitcd:0.2,speed:720,cost:10,with:0,dis:720,
ap:30,cd:7,t_num:1,hit_num:1,hit:1,hitcd:0.2,speed:720,cost:10,with:0,dis:720,
ready:0,EAnm:0,DAnm:9001,RType:RType.fixed,EType:EType.animationEnd,
buffs:[],neAttrs:[],info:"获得30%最大生命值的护盾,持续60秒",
},
6102:{
uuid:6102,name:"强壮",sp_name:"buff_wind",icon:"3036",TGroup:TGroup.Team,SType:SType.buff,act:"atk",DTType:DTType.single,DType:DType.WIND,
ap:30,map:0,cd:10,t_num:1,hit_num:1,hit:1,hitcd:0.2,speed:720,cost:10,with:0,dis:720,
ap:30,cd:10,t_num:1,hit_num:1,hit:1,hitcd:0.2,speed:720,cost:10,with:0,dis:720,
ready:0,EAnm:0,DAnm:9001,RType:RType.fixed,EType:EType.animationEnd,
buffs:[{buff:Attrs.AP,BType:BType.VALUE,value:10,time:30,chance:1}],neAttrs:[],info:"增加目标10%攻击力,持续30秒",
},
6103:{
uuid:6103,name:"群体强壮",sp_name:"buff_wind",icon:"3036",TGroup:TGroup.Team,SType:SType.buff,act:"atk",DTType:DTType.range,DType:DType.WIND,
ap:30,map:0,cd:10,t_num:3,hit_num:1,hit:1,hitcd:0.2,speed:720,cost:10,with:0,dis:720,
ap:30,cd:10,t_num:3,hit_num:1,hit:1,hitcd:0.2,speed:720,cost:10,with:0,dis:720,
ready:0,EAnm:0,DAnm:9001,RType:RType.fixed,EType:EType.animationEnd,
buffs:[{buff:Attrs.AP,BType:BType.RATIO,value:10,time:30,chance:1}],neAttrs:[],info:"增加目标10%攻击力,持续30秒",
},
@@ -211,7 +211,7 @@ export const SkillSet: Record<number, SkillConfig> = {
6201: {
uuid:6201, name:"怪物近战", sp_name:"atk_s1", icon:"3036",
TGroup:TGroup.Enemy, SType:SType.damage, act:"atk", DTType:DTType.single, DType:DType.ATK,
ap:100, map:0, cd:1, t_num:1, hit_num:1, hit:1, hitcd:0.2, speed:0, cost:0, with:0,
ap:100, cd:1, t_num:1, hit_num:1, hit:1, hitcd:0.2, speed:0, cost:0, with:0,
dis:50, // 近战距离
ready:0, EAnm:0, DAnm:9001, RType:RType.fixed, EType:EType.animationEnd,
buffs:[], neAttrs:[], info:"怪物基础近战攻击",
@@ -219,7 +219,7 @@ export const SkillSet: Record<number, SkillConfig> = {
6203: {
uuid:6203, name:"怪物射击", sp_name:"arrow_1", icon:"3039",
TGroup:TGroup.Enemy, SType:SType.damage, act:"atk", DTType:DTType.single, DType:DType.ATK,
ap:80, map:0, cd:2, t_num:1, hit_num:1, hit:1, hitcd:0.2, speed:800, cost:0, with:0,
ap:80, cd:2, t_num:1, hit_num:1, hit:1, hitcd:0.2, speed:800, cost:0, with:0,
dis:600, // 远程距离
ready:0, EAnm:0, DAnm:9001, RType:RType.linear, EType:EType.collision,
buffs:[], neAttrs:[], info:"怪物基础远程攻击",

View File

@@ -4,7 +4,6 @@ export const TD_ENABLED_ATTRS: ReadonlySet<Attrs> = new Set<Attrs>([
Attrs.AP,
Attrs.AS,
Attrs.DIS,
Attrs.PIERCE,
Attrs.CRITICAL,
Attrs.CRITICAL_DMG,
Attrs.HP_MAX,
@@ -20,14 +19,13 @@ export const TD_ENABLED_ATTRS: ReadonlySet<Attrs> = new Set<Attrs>([
export const TD_OPTIONAL_ATTRS: ReadonlySet<Attrs> = new Set<Attrs>([
Attrs.GOLD_GAIN,
Attrs.DMG_RED,
]);
export const TD_ATTR_GROUPS = {
towerCore: [Attrs.AP, Attrs.AS, Attrs.DIS, Attrs.PIERCE],
towerCore: [Attrs.AP, Attrs.AS, Attrs.DIS],
towerBonus: [Attrs.CRITICAL, Attrs.CRITICAL_DMG],
enemyCore: [Attrs.HP_MAX, Attrs.DEF],
optional: [Attrs.GOLD_GAIN, Attrs.DMG_RED],
optional: [Attrs.GOLD_GAIN],
control: [Attrs.FREEZE_CHANCE, Attrs.BURN_CHANCE, Attrs.STUN_CHANCE, Attrs.BACK_CHANCE, Attrs.SLOW_CHANCE],
sustain: [Attrs.LIFESTEAL, Attrs.MANASTEAL],
} as const;

View File

@@ -26,7 +26,7 @@ export const LEVEL_OPTIONS_TABLE: Record<number, ITDLevelOption[]> = {
{ attr: Attrs.AS, value: 5.25, showValue: 5.25, weight: 100, desc: "攻击速度 +5.25%", isSpecial: false, note: "常规强化" },
],
3: [
{ attr: Attrs.PIERCE, value: 1, showValue: 1, weight: 50, desc: "穿透数量 +1", isSpecial: true, note: "上限5层" },
{ attr: Attrs.PUNCTURE, value: 1, showValue: 1, weight: 50, desc: "穿透数量 +1", isSpecial: true, note: "上限5层" },
{ attr: Attrs.CRITICAL, value: 14, showValue: 14, weight: 50, desc: "暴击率 +14%", isSpecial: true, note: "上限70%" },
{ attr: Attrs.CRITICAL_DMG, value: 40, showValue: 40, weight: 50, desc: "暴击伤害 +40%", isSpecial: true, note: "上限200%" },
{ attr: Attrs.STUN_CHANCE, value: 10, showValue: 10, weight: 30, desc: "眩晕概率 +10%", isSpecial: true, note: "上限50%" },
@@ -47,7 +47,7 @@ export const LEVEL_OPTIONS_TABLE: Record<number, ITDLevelOption[]> = {
// 无强化等级
],
6: [
{ attr: Attrs.PIERCE, value: 1, showValue: 1, weight: 50, desc: "穿透数量 +1", isSpecial: true, note: "上限5层" },
{ attr: Attrs.PUNCTURE, value: 1, showValue: 1, weight: 50, desc: "穿透数量 +1", isSpecial: true, note: "上限5层" },
{ attr: Attrs.CRITICAL, value: 14, showValue: 14, weight: 50, desc: "暴击率 +14%", isSpecial: true, note: "上限70%" },
{ attr: Attrs.CRITICAL_DMG, value: 40, showValue: 40, weight: 50, desc: "暴击伤害 +40%", isSpecial: true, note: "上限200%" },
{ attr: Attrs.STUN_CHANCE, value: 10, showValue: 10, weight: 30, desc: "眩晕概率 +10%", isSpecial: true, note: "上限50%" },
@@ -71,7 +71,7 @@ export const LEVEL_OPTIONS_TABLE: Record<number, ITDLevelOption[]> = {
{ attr: Attrs.AS, value: 6.75, showValue: 6.75, weight: 100, desc: "攻击速度 +6.75%", isSpecial: false, note: "常规强化" },
],
9: [
{ attr: Attrs.PIERCE, value: 1, showValue: 1, weight: 50, desc: "穿透数量 +1", isSpecial: true, note: "上限5层" },
{ attr: Attrs.PUNCTURE, value: 1, showValue: 1, weight: 50, desc: "穿透数量 +1", isSpecial: true, note: "上限5层" },
{ attr: Attrs.CRITICAL, value: 14, showValue: 14, weight: 50, desc: "暴击率 +14%", isSpecial: true, note: "上限70%" },
{ attr: Attrs.CRITICAL_DMG, value: 40, showValue: 40, weight: 50, desc: "暴击伤害 +40%", isSpecial: true, note: "上限200%" },
{ attr: Attrs.STUN_CHANCE, value: 10, showValue: 10, weight: 30, desc: "眩晕概率 +10%", isSpecial: true, note: "上限50%" },
@@ -92,7 +92,7 @@ export const LEVEL_OPTIONS_TABLE: Record<number, ITDLevelOption[]> = {
{ attr: Attrs.AS, value: 7.5, showValue: 7.5, weight: 100, desc: "攻击速度 +7.5%", isSpecial: false, note: "常规强化" },
],
12: [
{ attr: Attrs.PIERCE, value: 1, showValue: 1, weight: 50, desc: "穿透数量 +1", isSpecial: true, note: "上限5层" },
{ attr: Attrs.PUNCTURE, value: 1, showValue: 1, weight: 50, desc: "穿透数量 +1", isSpecial: true, note: "上限5层" },
{ attr: Attrs.CRITICAL, value: 14, showValue: 14, weight: 50, desc: "暴击率 +14%", isSpecial: true, note: "上限70%" },
{ attr: Attrs.CRITICAL_DMG, value: 40, showValue: 40, weight: 50, desc: "暴击伤害 +40%", isSpecial: true, note: "上限200%" },
{ attr: Attrs.STUN_CHANCE, value: 10, showValue: 10, weight: 30, desc: "眩晕概率 +10%", isSpecial: true, note: "上限50%" },
@@ -131,7 +131,7 @@ export const LEVEL_OPTIONS_TABLE: Record<number, ITDLevelOption[]> = {
{ attr: Attrs.AS, value: 9, showValue: 9, weight: 100, desc: "攻击速度 +9%", isSpecial: false, note: "常规强化" },
],
18: [
{ attr: Attrs.PIERCE, value: 1, showValue: 1, weight: 50, desc: "穿透数量 +1", isSpecial: true, note: "上限5层" },
{ attr: Attrs.PUNCTURE, value: 1, showValue: 1, weight: 50, desc: "穿透数量 +1", isSpecial: true, note: "上限5层" },
{ attr: Attrs.CRITICAL, value: 14, showValue: 14, weight: 50, desc: "暴击率 +14%", isSpecial: true, note: "上限70%" },
{ attr: Attrs.CRITICAL_DMG, value: 40, showValue: 40, weight: 50, desc: "暴击伤害 +40%", isSpecial: true, note: "上限200%" },
{ attr: Attrs.STUN_CHANCE, value: 10, showValue: 10, weight: 30, desc: "眩晕概率 +10%", isSpecial: true, note: "上限50%" },

View File

@@ -21,7 +21,7 @@ export enum TriType {
export enum TalEffet {
ATK_DMG=1, // 伤害 次数+伤害加成如额外5次 伤害+20%
SKILL_DMG=2, // 技能伤害 次数+伤害加成如额外5次 伤害+20%
DMG_RED=10, // 减伤 次数+减伤加成如额外5次 伤害-20%
DEF=10, // 减伤 次数+减伤加成如额外5次 伤害-20%
THORNS=14, //反伤 百分比 次数+反伤加成如额外5次 反伤-20%
///////////////////////////////////////////////////////////////////////
HP=3, // 回血 百分比 直接触发回血20%
@@ -52,7 +52,6 @@ export enum TalAttrs {
SILENCE_CHANCE=Attrs.SILENCE_CHANCE, // 沉默概率
CRITICAL=Attrs.CRITICAL, // 暴击率
AP=Attrs.AP, // 攻击力
MP=Attrs.MAP, // 魔法攻击力
}
/**
* 天赋配置接口
@@ -116,7 +115,7 @@ export const talConf: Record<number, ItalConf> = {
desc:"被攻击3次后, 给于目标50%的伤害"},
7102:{uuid:7102,name:"护盾",triType:TriType.DMG,Trigger:3,count:1,target:TalTarget.SELF,effet:TalEffet.SHIELD,vType:BType.RATIO, value:20,attrs:TalAttrs.NON,
desc:"被攻击3次后, 获得20%的生命值护盾"},
7103:{uuid:7103,name:"减伤",triType:TriType.DMG,Trigger:3,count:1,target:TalTarget.ENEMY,effet:TalEffet.DMG_RED,vType:BType.RATIO, value:50,attrs:TalAttrs.NON,
7103:{uuid:7103,name:"减伤",triType:TriType.DMG,Trigger:3,count:1,target:TalTarget.ENEMY,effet:TalEffet.DEF,vType:BType.RATIO, value:50,attrs:TalAttrs.NON,
desc:"被攻击3次后, 下1次伤害减50%"},

View File

@@ -77,18 +77,14 @@ export enum HeroConf{
MAX_HP=200,
MAX_MP=200,
MAX_AP=20,
MAX_MAP=20,
MAX_DEF=20,
MAX_MDEF=20,
}
export const getPreAttr = (uuid:number)=>{
let hp=HeroInfo[uuid].hp/HeroConf.MAX_HP
let mp=HeroInfo[uuid].mp/HeroConf.MAX_MP
let ap=HeroInfo[uuid].ap/HeroConf.MAX_AP
let map=HeroInfo[uuid].map/HeroConf.MAX_MAP
let def=HeroInfo[uuid].def/HeroConf.MAX_DEF
let mdef=HeroInfo[uuid].mdef/HeroConf.MAX_MDEF
return {hp:hp,mp:mp,ap:ap,map:map,def:def,mdef:mdef}
return {hp:hp,mp:mp,ap:ap,def:def}
}
export enum HeroUpSet {
MP=5,
@@ -101,7 +97,7 @@ export enum HeroUpSet {
export interface heroInfo{
uuid:number, name:string, path:string,fac:FacSet,kind:number,type:HType, as:number,
hp:number,mp:number, ap:number,map:number, def:number,mdef:number,dis:number, speed:number,lv:number,skills:number[],
hp:number,mp:number, ap:number, def:number,dis:number, speed:number,lv:number,skills:number[],
buff:BuffConf[], tal:number[], info:string
}
@@ -110,37 +106,37 @@ export const HeroInfo: Record<number, heroInfo> = {
// 刘邦 - 领导型战士(善于用人,知人善任)
5001:{uuid:5001,name:"刘邦",path:"hk1", fac:FacSet.HERO, kind:1,as:1.5,
type:HType.warrior,lv:1,hp:200,mp:200,map:0,def:9,mdef:0,ap:15,dis:100,speed:120,skills:[6001,6100,6101,6102],
type:HType.warrior,lv:1,hp:200,mp:200,def:9,ap:15,dis:100,speed:120,skills:[6001,6100,6101,6102],
buff:[],tal:[7101,7201,7301],info:"楚汉争霸领袖,领导统御型战士"},
// 荆轲 - 刺客(敏捷型,高速度和暴击率)
5002:{uuid:5002,name:"荆轲",path:"hc1", fac:FacSet.HERO, kind:1,as:1.5,
type:HType.assassin,lv:1,hp:80,mp:60,map:0,def:3,mdef:0,ap:22,dis:120,speed:180,skills:[6002,6001],
type:HType.assassin,lv:1,hp:80,mp:60,def:3,ap:22,dis:120,speed:180,skills:[6002,6001],
buff:[],tal:[7201],info:"战国刺客,刺杀专精敏捷型刺客"},
// 赵武灵王 - 远程射手(胡服骑射,机动型高移动速度和远程攻击)
5005:{uuid:5005,name:"赵武灵王",path:"ha1", fac:FacSet.HERO, kind:2,as:1.5,
type:HType.remote,lv:1,hp:100,mp:80,map:0,def:6,mdef:0,ap:18,dis:450,speed:140,skills:[6002,6001],
type:HType.remote,lv:1,hp:100,mp:80,def:6,ap:18,dis:450,speed:140,skills:[6002,6001],
buff:[],tal:[7002],info:"胡服骑射改革者,机动型高远程输出"},
// 张良 - 智谋法师(运筹帷幄,智谋型法师)
5007:{uuid:5007,name:"张良",path:"hh1", fac:FacSet.HERO, kind:2,as:1.5,
type:HType.mage,lv:1,hp:88,mp:135,map:0,def:5,mdef:0,ap:15,dis:350,speed:100,skills:[6002,6001],
type:HType.mage,lv:1,hp:88,mp:135,def:5,ap:15,dis:350,speed:100,skills:[6002,6001],
buff:[],tal:[7004],info:"运筹帷幄谋士,智谋型法师"},
// 屈原 - 元素法师(离骚诗韵,元素型高魔法输出)
5008:{uuid:5008,name:"屈原",path:"hm1", fac:FacSet.HERO, kind:2,as:1.5,
type:HType.mage,lv:1,hp:85,mp:140,map:0,def:4,mdef:0,ap:16,dis:400,speed:90,skills:[6002,6001],
type:HType.mage,lv:1,hp:85,mp:140,def:4,ap:16,dis:400,speed:90,skills:[6002,6001],
buff:[],tal:[7101],info:"离骚诗韵,元素型高魔法输出"},
// 孙膑 - 谋略法师(兵法谋略,谋略型法师)
5009:{uuid:5009,name:"孙膑",path:"hm2", fac:FacSet.HERO, kind:2,as:1.5,
type:HType.mage,lv:1,hp:92,mp:135,map:0,def:6,mdef:0,ap:14,dis:420,speed:95,skills:[6002,6001],
type:HType.mage,lv:1,hp:92,mp:135,def:6,ap:14,dis:420,speed:95,skills:[6002,6001],
buff:[],tal:[7202],info:"兵法谋略,谋略型法师"},
// 萧何 - 后勤辅助(后勤保障,后勤型辅助)
5010:{uuid:5010,name:"萧何",path:"hz1", fac:FacSet.HERO, kind:2,as:1.5,
type:HType.support,lv:1,hp:115,mp:145,map:0,def:10,mdef:0,ap:8,dis:380,speed:105,skills:[6002,6001],
type:HType.support,lv:1,hp:115,mp:145,def:10,ap:8,dis:380,speed:105,skills:[6002,6001],
buff:[],tal:[7006],info:"后勤保障,后勤型辅助"},
@@ -149,79 +145,78 @@ export const HeroInfo: Record<number, heroInfo> = {
//怪物
5201:{uuid:5201,name:"兽人战士",path:"mo1", fac:FacSet.MON, kind:1,as:3,
type:HType.warrior,lv:1,hp:30,mp:100,map:0,def:5,mdef:0,ap:5,dis:90,speed:100,skills:[6005],
type:HType.warrior,lv:1,hp:30,mp:100,def:5,ap:5,dis:90,speed:100,skills:[6005],
buff:[],tal:[],info:"普通怪物-战士型"},
5202:{uuid:5202,name:"兽人刺客",path:"mo1", fac:FacSet.MON, kind:1,as:3,
type:HType.remote,lv:1,hp:20,mp:100,map:0,def:5,mdef:0,ap:5,dis:90,speed:150,skills:[6005],
type:HType.remote,lv:1,hp:20,mp:100,def:5,ap:5,dis:90,speed:150,skills:[6005],
buff:[],tal:[],info:"普通怪物-战士型"},
5203:{uuid:5203,name:"兽人护卫",path:"mo1", fac:FacSet.MON, kind:1,as:3,
type:HType.warrior,lv:1,hp:60,mp:100,map:0,def:5,mdef:0,ap:5,dis:90,speed:100,skills:[6005],
type:HType.warrior,lv:1,hp:60,mp:100,def:5,ap:5,dis:90,speed:100,skills:[6005],
buff:[],tal:[],info:"普通怪物-战士型"},
// 1. 基础近战型
5204:{uuid:5204,name:"蝙蝠",path:"mo1", fac:FacSet.MON, kind:1,as:3,
type:HType.warrior,lv:1,hp:15,mp:100,map:0,def:0,mdef:0,ap:5,dis:50,speed:200,skills:[6201],
type:HType.warrior,lv:1,hp:15,mp:100,def:0,ap:5,dis:50,speed:200,skills:[6201],
buff:[],tal:[],info:"高速飞行单位,血量极低,快速接近"},
5205:{uuid:5205,name:"骷髅",path:"mo1", fac:FacSet.MON, kind:1,as:3,
type:HType.warrior,lv:1,hp:40,mp:100,map:0,def:3,mdef:0,ap:7,dis:50,speed:100,skills:[6201],
type:HType.warrior,lv:1,hp:40,mp:100,def:3,ap:7,dis:50,speed:100,skills:[6201],
buff:[],tal:[],info:"标准近战单位,基准数值"},
// 2. 快速突击型
5206:{uuid:5206,name:"石像鬼",path:"mo1", fac:FacSet.MON, kind:1,as:3,
type:HType.assassin,lv:1,hp:25,mp:100,map:0,def:3,mdef:0,ap:8,dis:50,speed:250,skills:[6201],
type:HType.assassin,lv:1,hp:25,mp:100,def:3,ap:8,dis:50,speed:250,skills:[6201],
buff:[],tal:[],info:"速度极快,快速切入,给玩家压迫感"},
5207:{uuid:5207,name:"快速骷髅",path:"mo1", fac:FacSet.MON, kind:1,as:3,
type:HType.assassin,lv:1,hp:22,mp:100,map:0,def:2,mdef:0,ap:7,dis:80,speed:200,skills:[6005],
type:HType.assassin,lv:1,hp:22,mp:100,def:2,ap:7,dis:80,speed:200,skills:[6005],
buff:[],tal:[],info:"快速突击型:高速直线冲锋,接触伤害;高速、低血、成群出现"},
// 3. 重型坦克型
5208:{uuid:5208,name:"大型骷髅",path:"mo1", fac:FacSet.MON, kind:1,as:3,
type:HType.warrior,lv:1,hp:300,mp:100,map:0,def:10,mdef:0,ap:15,dis:50,speed:60,skills:[6201],
type:HType.warrior,lv:1,hp:300,mp:100,def:10,ap:15,dis:50,speed:60,skills:[6201],
buff:[],tal:[],info:"重装单位,移动缓慢但极难被击杀"},
5209:{uuid:5209,name:"树人",path:"mo1", fac:FacSet.MON, kind:1,as:3,
type:HType.warrior,lv:1,hp:160,mp:100,map:0,def:12,mdef:0,ap:12,dis:90,speed:80,skills:[6005],
type:HType.warrior,lv:1,hp:160,mp:100,def:12,ap:12,dis:90,speed:80,skills:[6005],
buff:[],tal:[],info:"重型坦克型:缓慢逼近,高血量,中等伤害"},
// 4. 远程骚扰型
5210:{uuid:5210,name:"骷髅弓手",path:"mo1", fac:FacSet.MON, kind:1,as:3,
type:HType.remote,lv:1,hp:35,mp:100,map:0,def:2,mdef:0,ap:10,dis:600,speed:80,skills:[6203],
type:HType.remote,lv:1,hp:35,mp:100,def:2,ap:10,dis:600,speed:80,skills:[6203],
buff:[],tal:[],info:"远程单位,在远处进行骚扰攻击"},
5211:{uuid:5211,name:"法师骷髅",path:"mo1", fac:FacSet.MON, kind:1,as:3,
type:HType.mage,lv:1,hp:55,mp:100,map:25,def:4,mdef:5,ap:10,dis:80,speed:105,skills:[6005],
type:HType.mage,lv:1,hp:55,mp:100,def:4,ap:10,dis:80,speed:105,skills:[6005],
buff:[],tal:[],info:"远程骚扰型:保持距离释放法术弹幕,逼迫玩家走位"},
// 5. 特殊机制型
5212:{uuid:5212,name:"炸弹骷髅",path:"mo1", fac:FacSet.MON, kind:1,as:3,
type:HType.assassin,lv:1,hp:30,mp:100,map:0,def:3,mdef:0,ap:25,dis:50,speed:130,skills:[6201],
type:HType.assassin,lv:1,hp:30,mp:100,def:3,ap:25,dis:50,speed:130,skills:[6201],
buff:[],tal:[],info:"特殊机制:接近玩家后造成高额伤害,需优先击杀"},
// 6. 精英/BOSS型
5213:{uuid:5213,name:"亡灵领主(精英)",path:"mo1", fac:FacSet.MON, kind:1,as:3,
type:HType.warrior,lv:3,hp:200,mp:100,map:0,def:10,mdef:5,ap:20,dis:100,speed:110,skills:[6005],
type:HType.warrior,lv:3,hp:200,mp:100,def:10,ap:20,dis:100,speed:110,skills:[6005],
buff:[],tal:[],info:"精英/BOSS高血量与独特机制波次高潮与重要经验来源"},
// 5. 特殊机制扩展
// 召唤师:持续召唤小怪(后续可在技能系统中实现 SType.zhaohuan
5214:{uuid:5214,name:"死灵法师(召唤师)",path:"mo1", fac:FacSet.MON, kind:1,as:3,
type:HType.mage,lv:1,hp:90,mp:160,map:0,def:4,mdef:6,ap:8,dis:380,speed:100,skills:[6005],
type:HType.mage,lv:1,hp:90,mp:160,def:4,ap:8,dis:380,speed:100,skills:[6005],
buff:[],tal:[],info:"特殊机制:持续召唤小怪,需优先击杀"},
// 治疗者:为周围怪物回血(此处以提升治疗效果和生命回复为基础被动)
// Attrs.HEAL_EFFECT=5 (RATIO=1)Attrs.HP_REGEN=3 (VALUE=0)
5215:{uuid:5215,name:"祭司(治疗者)",path:"mo1", fac:FacSet.MON, kind:1,as:3,
type:HType.support,lv:1,hp:100,mp:160,map:0,def:5,mdef:8,ap:6,dis:90,speed:105,skills:[6005],
type:HType.support,lv:1,hp:100,mp:160,def:5,ap:6,dis:90,speed:105,skills:[6005],
buff:[],tal:[],info:"特殊机制:为周围怪物提供治疗增益与持续回复"},
// 光环怪为周围怪物提供增益此处以Buff效果提升与移动速度提升为基础被动
// Attrs.BUFF_UP=60 (RATIO=1)Attrs.SPEED=63 (RATIO=1)
5216:{uuid:5216,name:"光环幽灵(光环怪)",path:"mo1", fac:FacSet.MON, kind:1,as:3,
type:HType.support,lv:1,hp:85,mp:140,map:0,def:4,mdef:7,ap:7,dis:90,speed:110,skills:[6005],
type:HType.support,lv:1,hp:85,mp:140,def:4,ap:7,dis:90,speed:110,skills:[6005],
buff:[],tal:[],info:"特殊机制:为周围怪物提供增益光环,加速与增益效果强化"},
};

View File

@@ -100,7 +100,7 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
* - CRITICAL_DMG: 暴击伤害加成
* - BACK_CHANCE: 击退概率
* - HIT: 命中率(用于闪避计算)
* - AP/MAP: 攻击力(基础伤害计算)
* - AP 攻击力(基础伤害计算)
*
* ✅ 正确使用被攻击者属性TAttrsComp - 实时):
* - DODGE: 闪避率(用于闪避计算)
@@ -147,8 +147,8 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
return reDate;
}
// 暴击判定
// 使用施法者的暴击率属性damageEvent.Attrs 快照),- 被攻击者的暴击抗性属性TAttrsComp.Attrs[Attrs.CRITICAL_RESIST]
const isCrit = this.checkChance(damageEvent.Attrs[Attrs.CRITICAL]-TAttrsComp.Attrs[Attrs.CRITICAL_RESIST]);
// 使用施法者的暴击率属性damageEvent.Attrs 快照),- 被攻击者的暴击抗性属性TAttrsComp.Attrs[Attrs.CRITICAL_RES]
const isCrit = this.checkChance(damageEvent.Attrs[Attrs.CRITICAL]-TAttrsComp.Attrs[Attrs.CRITICAL_RES]);
// 计算基础伤害
let damage = this.dmgCount(damageEvent,TAttrsComp);
if (this.debugMode) console.log("[HeroAtkSystem] dmgCount",damage)
@@ -237,18 +237,12 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
/**
* 详细伤害计算核心方法
*
* 这是整个战斗系统中最核心的伤害计算方法,负责根据施法者属性、目标属性和技能配置
* 计算最终的基础伤害值。该方法采用多阶段的伤害计算公式,综合考虑了物理和魔法伤害
* 以及各种属性加成和抗性减免。
*
* 计算流程:
* 1. 获取技能配置
* 2. 计算原始物理伤害和魔法伤害
* 3. 应用防御减免
* 4. 应用物理/魔法攻击力和抗性修正
* 5. 应用元素属性加成和抗性修正
* 6. 应用最终伤害减免
* 7. 确保伤害值非负
* 2. 计算原始物理伤害
* 3. 应用最终伤害减免
* 4. 确保伤害值非负
*
* @param CAttrs 施法者属性快照对象,包含所有攻击力、属性加成等战斗属性
* @param TAttrs 目标属性对象,包含所有防御力、抗性等防御属性
@@ -256,9 +250,7 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
* @returns 经过完整计算后的最终伤害值(未考虑暴击)
*
* @important 注意事项:
* - 此方法计算的是基础伤害,暴击计算在外部处理
* - 所有除法和乘法计算后都进行取整操作,确保游戏中的伤害值为整数
* - 元素伤害只应用于魔法伤害部分
*/
private dmgCount(damageEvent:DamageEvent,TAttrsComp:HeroAttrsComp){
// 1. 获取技能配置 - 如果技能不存在直接返回0伤害
@@ -270,58 +262,15 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
// 2. 计算原始物理伤害和魔法伤害
// 物理伤害基础值 = 技能物理倍率 * (施法者物理攻击力 + 额外伤害) / 100 * 额外伤害比例
let apBase = (sConf.ap||0)*(CAttrs[Attrs.AP]+damageEvent.ext_dmg)/100*damageEvent.dmg_ratio;
// 魔法伤害基础值 = 技能魔法倍率 * (施法者魔法攻击力 + 额外伤害) / 100 * 额外伤害比例
let mapBase = (sConf.map||0)*(CAttrs[Attrs.MAP]+damageEvent.ext_dmg)/100*damageEvent.dmg_ratio;
if (this.debugMode) console.log(`[HeroAtkSystem] 物理伤害基础值: ${apBase}, 技能ap=${sConf.ap},施法者物理攻击力: ${CAttrs[Attrs.AP]}, 魔法伤害基础值: ${mapBase}技能map=${sConf.map}
if (this.debugMode) console.log(`[HeroAtkSystem] 物理伤害基础值: ${apBase}, 技能ap=${sConf.ap},施法者物理攻击力: ${CAttrs[Attrs.AP]},}
额外伤害:${damageEvent.ext_dmg}, 额外伤害比例:${damageEvent.dmg_ratio}`);
// 3. 获取目标防御属性
const def = (TAttrs[Attrs.DEF]||0); // 目标物理防御
const mdef = (TAttrs[Attrs.MDEF]||0); // 目标魔法防御
// 4. 计算防御减免系数(采用公式:防御/(防御+常数)确保防御值不会导致伤害减到0
const apRed = def / (def + FightSet.DEF_C); // 物理防御减免系数
const mapRed = mdef / (mdef + FightSet.MDEF_C); // 魔法防御减免系数
// 5. 应用防御减免到基础伤害,向下取整
let apAfter = Math.floor(apBase * (1 - apRed)); // 物理伤害 - 防御减免
let mapAfter = Math.floor(mapBase * (1 - mapRed)); // 魔法伤害 - 防御减免
if (this.debugMode) console.log(`[HeroAtkSystem] 物理伤害基础值: ${apBase}, 物理伤害 - 防御减免: ${apAfter} 魔法伤害基础值: ${mapBase}, 魔法伤害 - 防御减免: ${mapAfter}`);
// 6. 应用物理/魔法攻击力和抗性修正
// 物理伤害修正:基础伤害 * (1 + 物理攻击力加成%) * (1 - 目标物理抗性%)
apAfter = this.applyPR(apAfter, CAttrs[Attrs.PHYS_POWER]||0, TAttrs[Attrs.PHYS_RES]||0);
// 魔法伤害修正:基础伤害 * (1 + 魔法攻击力加成%) * (1 - 目标魔法抗性%)
mapAfter = this.applyPR(mapAfter, CAttrs[Attrs.MAGIC_POWER]||0, TAttrs[Attrs.MAGIC_RES]||0);
if (this.debugMode) console.log(`[HeroAtkSystem] 物理伤害修正后: ${apAfter} 魔法伤害修正后: ${mapAfter} `);
// 7. 根据技能元素类型,应用元素属性加成和抗性修正
switch (sConf.DType) {
case DType.ICE:
// 冰系伤害修正:魔法伤害 * (1 + 冰系攻击力加成%) * (1 - 目标冰系抗性%)
mapAfter = this.applyPR(mapAfter, CAttrs[Attrs.ICE_POWER]||0, TAttrs[Attrs.ICE_RES]||0);
break;
case DType.FIRE:
// 火系伤害修正:魔法伤害 * (1 + 火系攻击力加成%) * (1 - 目标火系抗性%)
mapAfter = this.applyPR(mapAfter, CAttrs[Attrs.FIRE_POWER]||0, TAttrs[Attrs.FIRE_RES]||0);
break;
case DType.WIND:
// 风系伤害修正:魔法伤害 * (1 + 风系攻击力加成%) * (1 - 目标风系抗性%)
mapAfter = this.applyPR(mapAfter, CAttrs[Attrs.WIND_POWER]||0, TAttrs[Attrs.WIND_RES]||0);
break;
}
if (this.debugMode) console.log(`[HeroAtkSystem] 物理伤害修正后: ${apAfter} 元素伤害修正后: ${mapAfter}`);
// 8. 计算最终总伤害(物理伤害 + 魔法伤害)
let total = apAfter + mapAfter;
//9.1 易伤
//3.1 易伤
let DMG_INVUL = TAttrs[Attrs.DMG_INVUL]||0
//9.2 免伤 属性免伤+天赋免伤
let DMG_RED =TAttrs[Attrs.DMG_RED]||0+TAttrsComp.useCountValTal(Attrs.DMG_RED);
// 10. 确保伤害值非负,返回最终伤害
total = Math.max(0,total);
//11. 易伤减免 免伤属性免伤+天赋免伤
//3.2 免伤 属性免伤+天赋免伤
let DMG_RED =TAttrs[Attrs.DEF]||0+TAttrsComp.useCountValTal(Attrs.DEF);
//4. 确保伤害值非负,返回最终伤害
let total = Math.max(0,apBase);
//5. 易伤减免 免伤属性免伤+天赋免伤
total = Math.floor(total * (1 + ((DMG_INVUL-DMG_RED)/100)));
if (this.debugMode) console.log(`[HeroAtkSystem] 易伤减免后: ${total}`);
return Math.max(0,total);

View File

@@ -305,7 +305,6 @@ export class HeroAttrsComp extends ecs.Comp {
break;
case Attrs.DEF:
case Attrs.AP:
case Attrs.MAP:
this.Attrs[attrIndex] = Math.max(1, this.Attrs[attrIndex]);
break;
case Attrs.CRITICAL:

View File

@@ -71,7 +71,7 @@ export class Monster extends ecs.Entity {
model.is_kalami = true;
}
// 根据等级和类型获取怪物属性
const {hp, mp, ap, map, def, mdef} = getMonAttr(lv, uuid, monType);
const {hp, mp, ap,def} = getMonAttr(lv, uuid, monType);
// 初始化属性数组
model.Attrs = getAttrs();
model.hp = model.Attrs[Attrs.HP_MAX] = hp;

View File

@@ -208,8 +208,8 @@ export class TalComp extends ecs.Comp {
case TalEffet.SKILL_DMG:
heroAttrs.addCountTal(TalEffet.SKILL_DMG, talent.value + talent.value_add);
break;
case TalEffet.DMG_RED:
heroAttrs.addCountTal(TalEffet.DMG_RED, talent.value + talent.value_add);
case TalEffet.DEF:
heroAttrs.addCountTal(TalEffet.DEF, talent.value + talent.value_add);
break;
case TalEffet.HP:
heroAttrs.add_hp(talent.value + talent.value_add,talent.vType == BType.VALUE);

View File

@@ -68,9 +68,9 @@ interface IMonsConfig {
}
export const MonAttrSet={
[MonType.NORMAL]:{ HP_MAX:1.1, AP:1.05, MP:1.1, DEF:1.05, MDEF:1.05, MAP:1.05,},
[MonType.ELITE]: { HP_MAX:2, AP:1.1, MP:1.1, DEF:1.1, MDEF:1.1, MAP:1.1,},
[MonType.BOSS]: { HP_MAX:5, AP:2, MP:5, DEF:2, MDEF:2, MAP:2,},
[MonType.NORMAL]:{ HP_MAX:1.1, AP:1.05, MP:1.1, DEF:1.05,},
[MonType.ELITE]: { HP_MAX:2, AP:1.1, MP:1.1, DEF:1.1,},
[MonType.BOSS]: { HP_MAX:5, AP:2, MP:5, DEF:2,},
}
export const MonBuffSet={
@@ -82,10 +82,8 @@ export const getMonAttr=(lv:number,uuid:number,MonType:MonType)=>{
let hp=mon.hp*lv*MonAttrSet[MonType].HP_MAX
let mp=mon.mp*lv*MonAttrSet[MonType].MP
let ap=mon.ap*lv*MonAttrSet[MonType].AP
let map=mon.map*lv*MonAttrSet[MonType].MAP
let def=mon.def*lv*MonAttrSet[MonType].DEF
let mdef=mon.mdef*lv*MonAttrSet[MonType].MDEF
return {hp:hp,mp:mp,ap:ap,map:map,def:def,mdef:mdef}
return {hp:hp,mp:mp,ap:ap,def:def}
}
/**