refactor(fight): 重构伤害计算逻辑
- 重新定义 DamageZone 结构,区分加算区和乘算区 - 添加 GetAddValue 和 GetMulValue 方法获取特定区域的值 - 实现 PutDamageZone 方法设置伤害区域的值 - 更新 CalculatePower 方法,使用新的伤害区域计算逻辑 - 优化代码结构,提高可读性和可维护性
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user