refactor(fight): 重构伤害计算逻辑

- 重新定义 DamageZone 结构,区分加算区和乘算区
- 添加 GetAddValue 和 GetMulValue 方法获取特定区域的值
- 实现 PutDamageZone 方法设置伤害区域的值
- 更新 CalculatePower 方法,使用新的伤害区域计算逻辑
- 优化代码结构,提高可读性和可维护性
This commit is contained in:
2025-08-25 19:40:25 +08:00
parent ed693bc9bf
commit e86e9dd2dc

View File

@@ -32,13 +32,14 @@ var Category = enum.New[struct {
// 战斗中可以修改技能实体值,比如是否暴击,是否必中等
type BattleSkillEntity struct {
skill.Move
ctx context.Context
SideEffects []int
SideEffectArgs []int
PP int
InfinityPP bool
DamageMultiplierZone map[DamageMultiplierZone]float64
isCritical bool //技能是否暴击
ctx context.Context
SideEffects []int
SideEffectArgs []int
PP int
InfinityPP bool
DamageZone map[DamageZone]float64
isCritical bool //技能是否暴击
ATTACK_COUNT_ZONE int //攻击次数
// 技能类型属性
//SkillType EnumCategory // 技能类型(物理/特殊/状态)
@@ -67,7 +68,7 @@ func CreateBattleSkillWithInfinity(id int, pp int) *BattleSkillEntity {
}
ret.SideEffectArgs = sideEffectArgs
ret.DamageMultiplierZone = make(map[DamageMultiplierZone]float64)
ret.DamageZone = make(map[DamageZone]float64)
return &ret
}
@@ -180,22 +181,38 @@ func getSideEffects(move *BattleSkillEntity) []int {
return move.SideEffects
}
// DamageMultiplierZone 伤害乘算区枚举使用enum包定义
type DamageMultiplierZone int
type EnumsDamageZone int
// DamageMultiplierZone 伤害乘算区枚举使用enum包定义
type DamageZone struct {
add DamageZoneValue
nul DamageZoneValue
}
type DamageZoneValue struct {
skilltype EnumCategory //技能类型
value float64
}
var Zone = enum.New[struct {
Power DamageZone // 通用增伤区
PowerP DamageZone //物理增伤区
PowerS DamageZone //特殊增伤区
Power_R DamageZone // 通用减伤区
PowerP_R DamageZone //物理增伤区
PowerS_R DamageZone //特殊增伤区
var DamageMultiplierZoneEnum = enum.New[struct {
POWER_ADD DamageMultiplierZone // 威力加算区,直接加成威力值
POWER_MUL DamageMultiplierZone // 威力乘算区,倍率调整(如威力倍数)
SPECIAL_EFFECT_MUL DamageMultiplierZone //殊效果乘算区, 例如Boss伤害减免或哈莫雷特的非对应顺序技能攻击为0, 此系数默认为1
ATK_RESISTANCE DamageMultiplierZone //攻击伤害减免系数乘区, 默认为1, 减伤50%等效于将这个系数设置为0.5, 同种类取最高
SP_ATK_RESISTANCE DamageMultiplierZone //特殊攻击伤害减免系数乘区, 默认为1, 减伤50%等效于将这个系数设置为0.5, 同种类取最高
ATTACK_COUNT_ZONE DamageMultiplierZone //攻击次数
DEFENSE_ZONE DamageMultiplierZone //固定伤害减免
SP_DEFENSE_ZONE DamageMultiplierZone //物伤减免
ATK_DEFENSE_ZONE DamageMultiplierZone //特伤减免
Critical_ZONE DamageMultiplierZone //暴击乘区
}]()
// s_nul DamageMultiplierZone //殊效果乘算区, 例如Boss伤害减免或哈莫雷特的非对应顺序技能攻击为0, 此系数默认为1
// a_r_nul DamageMultiplierZone //攻击伤害减免系数乘区, 默认为1, 减伤50%等效于将这个系数设置为0.5, 同种类取最高
// SP_ATK_RESISTANCE DamageMultiplierZone //特殊攻击伤害减免系数乘区, 默认为1, 减伤50%等效于将这个系数设置为0.5, 同种类取最高
// DEFENSE_ZONE DamageMultiplierZone //固定伤害减免
// SP_DEFENSE_ZONE DamageMultiplierZone //物伤减免
// ATK_DEFENSE_ZONE DamageMultiplierZone //特伤减免
func (s *BattleSkillEntity) Random() *random.RandomXS128 {
battle, _ := s.ctx.Value(BattleContainerCtx).(*BattleContainer1V1)
@@ -203,6 +220,62 @@ func (s *BattleSkillEntity) Random() *random.RandomXS128 {
}
// 获得指定的+-区
func (s *BattleSkillEntity) GetAddValue(e EnumCategory) decimal.Decimal {
for dz, v := range s.DamageZone {
if dz.add.skilltype == e {
return decimal.NewFromFloat(v)
}
}
return decimal.NewFromFloat(0)
}
// 获得指定的*/区
func (s *BattleSkillEntity) GetMulValue(e EnumCategory) decimal.Decimal {
for dz, v := range s.DamageZone {
if dz.nul.skilltype == e {
return decimal.NewFromFloat(v)
}
}
return decimal.NewFromFloat(0)
}
// 设置指定的值
func (s *BattleSkillEntity) PutDamageZone(e EnumCategory, dtype DamageZone, value float64, ftype bool) {
switch dtype { //判断伤害节点段
//case Zone.Power: //特判乘算区的乘运算
default:
switch ftype { //判断设置哪个算区
case true: // 乘算区
old := s.GetAddValue(e)
new := decimal.NewFromFloat(value)
s.DamageZone[dtype] = float64(old.Add(new).IntPart())
case false: // 加算区
old := s.GetMulValue(e)
new := decimal.NewFromFloat(value)
s.DamageZone[dtype] = float64(old.Add(new).IntPart())
}
}
}
func (s *BattleSkillEntity) Pet() (*BattlePetEntity, bool) {
pet, ok := s.ctx.Value(BattlePetEntityCtx).(*BattlePetEntity)
@@ -233,9 +306,9 @@ func (s *BattleSkillEntity) CalculatePower(p *BattlePetEntity) int64 {
// 2. 计算威力因子 (基础威力 + 加算) * 乘算
powerAdd := decimal.NewFromFloat(s.DamageMultiplierZone[DamageMultiplierZoneEnum.POWER_ADD]) //威力加算区
powerAdd := decimal.NewFromFloat(s.DamageZone[DamageMultiplierZoneEnum.威力加乘区]) //威力加算区
powerMul := decimal.NewFromFloat(s.DamageMultiplierZone[DamageMultiplierZoneEnum.POWER_MUL]) //威力乘算区
powerMul := decimal.NewFromFloat(s.DamageZone[DamageMultiplierZoneEnum.POWER_MUL]) //威力乘算区
powerZone := decimal.NewFromInt(int64(s.Power)).Add(powerAdd).Mul(powerMul)
var (
@@ -247,15 +320,15 @@ func (s *BattleSkillEntity) CalculatePower(p *BattlePetEntity) int64 {
case Category.PHYSICAL:
attackDec = decimal.NewFromInt(int64(pet.UnitAttributes[AttrType.Attack].Value()))
defenseDec = decimal.NewFromInt(int64(p.UnitAttributes[AttrType.Defense].Value()))
damageReduction = decimal.NewFromFloat(s.DamageMultiplierZone[DamageMultiplierZoneEnum.ATK_RESISTANCE])
damageReduction = decimal.NewFromFloat(s.DamageZone[DamageMultiplierZoneEnum.ATK_RESISTANCE])
case Category.SPECIAL:
attackDec = decimal.NewFromInt(int64(pet.UnitAttributes[AttrType.Attack].Value()))
defenseDec = decimal.NewFromInt(int64(p.UnitAttributes[AttrType.Speed].Value()))
damageReduction = decimal.NewFromFloat(s.DamageMultiplierZone[DamageMultiplierZoneEnum.SP_ATK_RESISTANCE])
damageReduction = decimal.NewFromFloat(s.DamageZone[DamageMultiplierZoneEnum.SP_ATK_RESISTANCE])
}
//攻击次数结算
attackCount := decimal.NewFromFloat(s.DamageMultiplierZone[DamageMultiplierZoneEnum.ATTACK_COUNT_ZONE])
attackCount := decimal.NewFromFloat(s.DamageZone[DamageMultiplierZoneEnum.ATTACK_COUNT_ZONE])
// 5. 基础伤害公式:等级因子 * 威力因子 * 攻击 / 防御 / 50 + 2然后乘以攻击次数
baseDamage := levelFactor.
Mul(powerZone).
@@ -283,7 +356,7 @@ func (s *BattleSkillEntity) CalculatePower(p *BattlePetEntity) int64 {
}
// 9. 技能特殊效果倍率
specialEffect := decimal.NewFromFloat(s.DamageMultiplierZone[DamageMultiplierZoneEnum.SPECIAL_EFFECT_MUL])
specialEffect := decimal.NewFromFloat(s.DamageZone[DamageMultiplierZoneEnum.SPECIAL_EFFECT_MUL])
// 10. 随机倍率随机值除以255
randomFactor := decimal.NewFromInt(int64(randomnum)).Div(decimal.NewFromInt(255))
@@ -301,7 +374,7 @@ func (s *BattleSkillEntity) CalculatePower(p *BattlePetEntity) int64 {
//context.PutExtraRate("REAL_DAMAGE", damage)
// 13. 应用固定伤害减免伤害不能低于0
fixReduction := decimal.NewFromFloat(s.DamageMultiplierZone[DamageMultiplierZoneEnum.DEFENSE_ZONE])
fixReduction := decimal.NewFromFloat(s.DamageZone[DamageMultiplierZoneEnum.DEFENSE_ZONE])
if fixReduction.GreaterThan(decimal.Zero) {
damage = damage.Sub(fixReduction)
if damage.LessThan(decimal.Zero) {