diff --git a/logic/service/fight/info/BattleSkillEntity.go b/logic/service/fight/info/BattleSkillEntity.go index 173fac59..a8f5798e 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) {