From e86e9dd2dc31eb22edf717186eb887ebee687473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <1@72wo.cn> Date: Mon, 25 Aug 2025 19:40:25 +0800 Subject: [PATCH] =?UTF-8?q?refactor(fight):=20=E9=87=8D=E6=9E=84=E4=BC=A4?= =?UTF-8?q?=E5=AE=B3=E8=AE=A1=E7=AE=97=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重新定义 DamageZone 结构,区分加算区和乘算区 - 添加 GetAddValue 和 GetMulValue 方法获取特定区域的值 - 实现 PutDamageZone 方法设置伤害区域的值 - 更新 CalculatePower 方法,使用新的伤害区域计算逻辑 - 优化代码结构,提高可读性和可维护性 --- logic/service/fight/info/BattleSkillEntity.go | 129 ++++++++++++++---- 1 file changed, 101 insertions(+), 28 deletions(-) diff --git a/logic/service/fight/info/BattleSkillEntity.go b/logic/service/fight/info/BattleSkillEntity.go index 173fac59d..a8f5798ee 100644 --- a/logic/service/fight/info/BattleSkillEntity.go +++ b/logic/service/fight/info/BattleSkillEntity.go @@ -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) {