calc-h 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,6 @@
1
1
  import { Resistance } from './resistance.js';
2
2
  import type { RoleDamageRes } from './model/RoleDamageRes.js';
3
+ import type { CalcBaseDamageParams, CalcRoleDamageParams, CalcDamageParams } from './model/DamageCalcParam.js';
3
4
  /**
4
5
  * 攻击力计算
5
6
  * @author huaju
@@ -30,9 +31,10 @@ export declare function featherCalc(attribute: number, multiplier: number): numb
30
31
  * @author huaju
31
32
  * @param roleLevel 角色等级
32
33
  * @param enemyLevel 敌人等级
34
+ * @param defenseReduction 减防系数(百分比小数)
33
35
  * @returns 防御值
34
36
  */
35
- export declare function defenseCalc(roleLevel: number, enemyLevel: number): number;
37
+ export declare function defenseCalc(roleLevel: number, enemyLevel: number, defenseReduction?: number): number;
36
38
  /**
37
39
  * 抗性计算
38
40
  * @author huaju
@@ -51,13 +53,14 @@ export declare function resistanceCalc(resistance: Resistance, reduce: Resistanc
51
53
  * @param roleLevel 角色等级
52
54
  * @param enemyLevel 敌人等级
53
55
  * @param enemyResistance 敌人抗性
54
- * @param reduce 减伤
56
+ * @param reduce 削抗
55
57
  * @param dmgPercentBonus 伤害加成
56
58
  * @param critDamage 暴击伤害
57
59
  * @param damageType 伤害类型
60
+ * @param defenseReduction 减防系数(百分比小数)
58
61
  * @returns 计算后的伤害值
59
62
  */
60
- export declare function calcDamage(attack: number, multiplier: number, roleLevel: number, enemyLevel: number, enemyResistance: Resistance, reduce: Resistance, dmgPercentBonus: number, critDamage: number, damageType: number): number;
63
+ export declare function calcDamage({ attack, multiplier, roleLevel, enemyLevel, enemyResistance, dmgPercentBonus, critDamage, damageType, reduce, defenseReduction, }: CalcDamageParams): number;
61
64
  /**
62
65
  * 基本伤害计算
63
66
  * @author huaju
@@ -67,17 +70,30 @@ export declare function calcDamage(attack: number, multiplier: number, roleLevel
67
70
  * @param roleLevel 角色等级
68
71
  * @param enemyLevel 敌人等级
69
72
  * @param enemyResistance 敌人抗性
70
- * @param reduce 减伤
73
+ * @param reduce 削抗
71
74
  * @param dmgPercentBonus 伤害加成
72
75
  * @param critDamage 暴击伤害
73
76
  * @param damageType 伤害类型
77
+ * @param defenseReduction 减防系数(百分比小数)
74
78
  * @returns 计算后的伤害值
75
79
  */
76
- export declare function calcBaseDamage(attack: number, multiplier: number, roleLevel: number, enemyLevel: number, enemyResistance: number, reduce: number, dmgPercentBonus: number, critDamage: number, damageType: number): number;
80
+ export declare function calcBaseDamage({ attack, multiplier, roleLevel, enemyLevel, enemyResistance, dmgPercentBonus, critDamage, damageType, reduce, defenseReduction, }: CalcBaseDamageParams): number;
77
81
  /**
78
82
  * 角色伤害计算
79
83
  * @description 公式: 基础攻击力 * (1 + 百分比攻击力加成) * 倍率 * (1 + 增伤) * (1 + 暴击伤害) * 防御系数 * (1 - 抗性系数)
80
84
  * @author huaju
85
+ * @param roleName 角色名称
86
+ * @param weaponName 武器名称
87
+ * @param enemyName 敌人名称
88
+ * @param roleLevel 角色等级
89
+ * @param enemyLevel 敌人等级
90
+ * @param atkPercent 百分比攻击力加成(小数)
91
+ * @param reduce 削抗值(小数)
92
+ * @param dmgPercentBonus 伤害百分比加成(小数)
93
+ * @param critDamage 暴击伤害(小数)
94
+ * @param damageType 伤害类型
95
+ * @param defenseReduction 减防系数(百分比小数,0~1,默认 0)
96
+ * @returns 角色各类型伤害结果
81
97
  */
82
- export declare function calcRoleDamage(roleName: string, weaponName: string, enemyName: string, roleLevel: number, enemyLevel: number, atkPercent: number, reduce: number, dmgPercentBonus: number, critDamage: number, damageType: number): RoleDamageRes;
98
+ export declare function calcRoleDamage({ roleName, weaponName, enemyName, roleLevel, enemyLevel, atkPercent, dmgPercentBonus, critDamage, damageType, reduce, defenseReduction, }: CalcRoleDamageParams): RoleDamageRes;
83
99
  export { Resistance } from './resistance.js';
@@ -39,10 +39,11 @@ export function featherCalc(attribute, multiplier) {
39
39
  * @author huaju
40
40
  * @param roleLevel 角色等级
41
41
  * @param enemyLevel 敌人等级
42
+ * @param defenseReduction 减防系数(百分比小数)
42
43
  * @returns 防御值
43
44
  */
44
- export function defenseCalc(roleLevel, enemyLevel) {
45
- return roundTo((roleLevel + 100) / (roleLevel + 100 + enemyLevel + 100));
45
+ export function defenseCalc(roleLevel, enemyLevel, defenseReduction = 0) {
46
+ return roundTo((roleLevel + 100) / (roleLevel + 100 + (enemyLevel + 100) * (1 - defenseReduction)));
46
47
  }
47
48
  /**
48
49
  * 抗性计算
@@ -66,22 +67,22 @@ export function resistanceCalc(resistance, reduce) {
66
67
  * @param roleLevel 角色等级
67
68
  * @param enemyLevel 敌人等级
68
69
  * @param enemyResistance 敌人抗性
69
- * @param reduce 减伤
70
+ * @param reduce 削抗
70
71
  * @param dmgPercentBonus 伤害加成
71
72
  * @param critDamage 暴击伤害
72
73
  * @param damageType 伤害类型
74
+ * @param defenseReduction 减防系数(百分比小数)
73
75
  * @returns 计算后的伤害值
74
76
  */
75
- export function calcDamage(attack, multiplier, roleLevel, enemyLevel, enemyResistance, reduce, dmgPercentBonus, critDamage, damageType) {
76
- console.debug(`属性参数:${attack}, ${multiplier}, ${roleLevel}, ${enemyLevel}, ${enemyResistance}, ${reduce}, ${dmgPercentBonus}, ${critDamage}`);
77
- const resultResistance = resistanceCalc(enemyResistance, reduce).getResistanceType(damageType);
77
+ export function calcDamage({ attack, multiplier, roleLevel, enemyLevel, enemyResistance, dmgPercentBonus, critDamage, damageType, reduce = new Resistance(0), defenseReduction = 0, }) {
78
+ const resultResistance = resistanceCalc(enemyResistance, reduce ?? new Resistance(0)).getResistanceType(damageType);
78
79
  if (resultResistance === undefined)
79
80
  throw new Error('传入的伤害类型有误');
80
81
  return roundTo(attack *
81
82
  multiplier *
82
83
  (1 + dmgPercentBonus) *
83
84
  (1 + critDamage) *
84
- defenseCalc(roleLevel, enemyLevel) *
85
+ defenseCalc(roleLevel, enemyLevel, defenseReduction) *
85
86
  (1 - resultResistance));
86
87
  }
87
88
  /**
@@ -93,21 +94,45 @@ export function calcDamage(attack, multiplier, roleLevel, enemyLevel, enemyResis
93
94
  * @param roleLevel 角色等级
94
95
  * @param enemyLevel 敌人等级
95
96
  * @param enemyResistance 敌人抗性
96
- * @param reduce 减伤
97
+ * @param reduce 削抗
97
98
  * @param dmgPercentBonus 伤害加成
98
99
  * @param critDamage 暴击伤害
99
100
  * @param damageType 伤害类型
101
+ * @param defenseReduction 减防系数(百分比小数)
100
102
  * @returns 计算后的伤害值
101
103
  */
102
- export function calcBaseDamage(attack, multiplier, roleLevel, enemyLevel, enemyResistance, reduce, dmgPercentBonus, critDamage, damageType) {
103
- return calcDamage(attack, multiplier, roleLevel, enemyLevel, new Resistance(enemyResistance), new Resistance(reduce), dmgPercentBonus, critDamage, damageType);
104
+ export function calcBaseDamage({ attack, multiplier, roleLevel, enemyLevel, enemyResistance, dmgPercentBonus, critDamage, damageType, reduce = 0, defenseReduction = 0, }) {
105
+ return calcDamage({
106
+ attack: attack,
107
+ multiplier: multiplier,
108
+ roleLevel: roleLevel,
109
+ enemyLevel: enemyLevel,
110
+ enemyResistance: new Resistance(enemyResistance),
111
+ dmgPercentBonus: dmgPercentBonus,
112
+ critDamage: critDamage,
113
+ damageType: damageType,
114
+ reduce: new Resistance(reduce ?? 0),
115
+ defenseReduction: defenseReduction,
116
+ });
104
117
  }
105
118
  /**
106
119
  * 角色伤害计算
107
120
  * @description 公式: 基础攻击力 * (1 + 百分比攻击力加成) * 倍率 * (1 + 增伤) * (1 + 暴击伤害) * 防御系数 * (1 - 抗性系数)
108
121
  * @author huaju
122
+ * @param roleName 角色名称
123
+ * @param weaponName 武器名称
124
+ * @param enemyName 敌人名称
125
+ * @param roleLevel 角色等级
126
+ * @param enemyLevel 敌人等级
127
+ * @param atkPercent 百分比攻击力加成(小数)
128
+ * @param reduce 削抗值(小数)
129
+ * @param dmgPercentBonus 伤害百分比加成(小数)
130
+ * @param critDamage 暴击伤害(小数)
131
+ * @param damageType 伤害类型
132
+ * @param defenseReduction 减防系数(百分比小数,0~1,默认 0)
133
+ * @returns 角色各类型伤害结果
109
134
  */
110
- export function calcRoleDamage(roleName, weaponName, enemyName, roleLevel, enemyLevel, atkPercent, reduce, dmgPercentBonus, critDamage, damageType) {
135
+ export function calcRoleDamage({ roleName, weaponName, enemyName, roleLevel, enemyLevel, atkPercent, dmgPercentBonus, critDamage, damageType, reduce = 0, defenseReduction = 0, }) {
111
136
  const role = roles.find((x) => x.name === roleName);
112
137
  const weapon = weapons.find((x) => x.name === weaponName);
113
138
  const enemy = enemies.find((x) => x.name === enemyName);
@@ -122,16 +147,60 @@ export function calcRoleDamage(roleName, weaponName, enemyName, roleLevel, enemy
122
147
  passiveDamage: [],
123
148
  };
124
149
  role.normalAtkDamageBreakdown.forEach((multiplier) => {
125
- roleDamageRes.normalDamage.push(calcDamage(baseAttack * (1 + atkPercent + weapon.atkPercent), multiplier, roleLevel, enemyLevel, enemy.resistances, new Resistance(reduce), dmgPercentBonus + weapon.dmgPercentBonus, critDamage + weapon.critDamage + role.critDamage, damageType));
150
+ roleDamageRes.normalDamage.push(calcDamage({
151
+ attack: baseAttack * (1 + atkPercent + weapon.atkPercent),
152
+ multiplier,
153
+ roleLevel: roleLevel,
154
+ enemyLevel: enemyLevel,
155
+ enemyResistance: enemy.resistances,
156
+ dmgPercentBonus: dmgPercentBonus + weapon.dmgPercentBonus,
157
+ critDamage: critDamage + weapon.critDamage + role.critDamage,
158
+ damageType: damageType,
159
+ reduce: new Resistance(reduce ?? 0),
160
+ defenseReduction: defenseReduction,
161
+ }));
126
162
  });
127
163
  role.eAtkDamageBreakdown.forEach((multiplier) => {
128
- roleDamageRes.eDamage.push(calcDamage(baseAttack * (1 + atkPercent + weapon.atkPercent), multiplier, roleLevel, enemyLevel, enemy.resistances, new Resistance(reduce), dmgPercentBonus + weapon.dmgPercentBonus, critDamage + weapon.critDamage + role.critDamage, damageType));
164
+ roleDamageRes.eDamage.push(calcDamage({
165
+ attack: baseAttack * (1 + atkPercent + weapon.atkPercent),
166
+ multiplier,
167
+ roleLevel: roleLevel,
168
+ enemyLevel: enemyLevel,
169
+ enemyResistance: enemy.resistances,
170
+ dmgPercentBonus: dmgPercentBonus + weapon.dmgPercentBonus,
171
+ critDamage: critDamage + weapon.critDamage + role.critDamage,
172
+ damageType: damageType,
173
+ reduce: new Resistance(reduce ?? 0),
174
+ defenseReduction: defenseReduction,
175
+ }));
129
176
  });
130
177
  role.qAtkDamageBreakdown.forEach((multiplier) => {
131
- roleDamageRes.qDamahe.push(calcDamage(baseAttack * (1 + atkPercent + weapon.atkPercent), multiplier, roleLevel, enemyLevel, enemy.resistances, new Resistance(reduce), dmgPercentBonus + weapon.dmgPercentBonus, critDamage + weapon.critDamage + role.critDamage, damageType));
178
+ roleDamageRes.qDamahe.push(calcDamage({
179
+ attack: baseAttack * (1 + atkPercent + weapon.atkPercent),
180
+ multiplier,
181
+ roleLevel: roleLevel,
182
+ enemyLevel: enemyLevel,
183
+ enemyResistance: enemy.resistances,
184
+ dmgPercentBonus: dmgPercentBonus + weapon.dmgPercentBonus,
185
+ critDamage: critDamage + weapon.critDamage + role.critDamage,
186
+ damageType: damageType,
187
+ reduce: new Resistance(reduce ?? 0),
188
+ defenseReduction: defenseReduction,
189
+ }));
132
190
  });
133
191
  role.passiveDamageBreakdown.forEach((multiplier) => {
134
- roleDamageRes.passiveDamage.push(calcDamage(baseAttack * (1 + atkPercent + weapon.atkPercent), multiplier, roleLevel, enemyLevel, enemy.resistances, new Resistance(reduce), dmgPercentBonus + weapon.dmgPercentBonus, critDamage + weapon.critDamage + role.critDamage, damageType));
192
+ roleDamageRes.passiveDamage.push(calcDamage({
193
+ attack: baseAttack * (1 + atkPercent + weapon.atkPercent),
194
+ multiplier,
195
+ roleLevel: roleLevel,
196
+ enemyLevel: enemyLevel,
197
+ enemyResistance: enemy.resistances,
198
+ dmgPercentBonus: dmgPercentBonus + weapon.dmgPercentBonus,
199
+ critDamage: critDamage + weapon.critDamage + role.critDamage,
200
+ damageType: damageType,
201
+ reduce: new Resistance(reduce ?? 0),
202
+ defenseReduction: defenseReduction,
203
+ }));
135
204
  });
136
205
  return roleDamageRes;
137
206
  }
@@ -0,0 +1,69 @@
1
+ import { Resistance } from '../resistance.js';
2
+ export interface CalcDamageParams {
3
+ /** 攻击力(面板值) */
4
+ attack: number;
5
+ /** 技能/伤害倍率 */
6
+ multiplier: number;
7
+ /** 角色等级 */
8
+ roleLevel: number;
9
+ /** 敌人等级 */
10
+ enemyLevel: number;
11
+ /** 敌人抗性 */
12
+ enemyResistance: Resistance;
13
+ /** 伤害百分比加成(小数,0.5 = +50%) */
14
+ dmgPercentBonus: number;
15
+ /** 暴击伤害(小数,1 = 100%) */
16
+ critDamage: number;
17
+ /** 伤害类型,1 = 火 */
18
+ damageType: number;
19
+ /** 削抗值(小数),默认 0 */
20
+ reduce?: Resistance;
21
+ /** 减防系数(小数,0~1),默认 0 */
22
+ defenseReduction?: number;
23
+ }
24
+ export interface CalcBaseDamageParams {
25
+ /** 攻击力(面板值) */
26
+ attack: number;
27
+ /** 技能/伤害倍率 */
28
+ multiplier: number;
29
+ /** 角色等级 */
30
+ roleLevel: number;
31
+ /** 敌人等级 */
32
+ enemyLevel: number;
33
+ /** 敌人抗性(小数,0.1 = 10%) */
34
+ enemyResistance: number;
35
+ /** 伤害百分比加成(小数,0.5 = +50%) */
36
+ dmgPercentBonus: number;
37
+ /** 暴击伤害(小数,1 = 100%) */
38
+ critDamage: number;
39
+ /** 伤害类型,1 = 火 */
40
+ damageType: number;
41
+ /** 削抗值(小数),默认 0 */
42
+ reduce?: number;
43
+ /** 减防系数(小数,0~1),默认 0 */
44
+ defenseReduction?: number;
45
+ }
46
+ export interface CalcRoleDamageParams {
47
+ /** 角色名称,需能在 roles 中找到 */
48
+ roleName: string;
49
+ /** 武器名称,需能在 weapons 中找到 */
50
+ weaponName: string;
51
+ /** 敌人名称,需能在 enemies 中找到 */
52
+ enemyName: string;
53
+ /** 角色等级,参与防御系数计算 */
54
+ roleLevel: number;
55
+ /** 敌人等级,参与防御系数计算 */
56
+ enemyLevel: number;
57
+ /** 百分比攻击力加成(小数,0.466 = +46.6%) */
58
+ atkPercent: number;
59
+ /** 伤害百分比加成(小数,不含武器加成) */
60
+ dmgPercentBonus: number;
61
+ /** 暴击伤害(小数,不含武器和角色自带加成) */
62
+ critDamage: number;
63
+ /** 伤害类型,1 = 火 */
64
+ damageType: number;
65
+ /** 削抗值(小数,0.2 = 削 20% 抗性),默认 0 */
66
+ reduce?: number;
67
+ /** 减防系数(小数,0~1),默认 0 */
68
+ defenseReduction?: number;
69
+ }
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "calc-h",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "伤害计算公式集",
5
5
  "license": "MIT",
6
6
  "author": "huaju",