From 88b9c1f5341867ae5feff50ed8f32bbc51fba49f Mon Sep 17 00:00:00 2001 From: 1 <1@72wo.cn> Date: Tue, 26 Aug 2025 21:30:30 +0000 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=E5=8C=BA=E5=9F=9F=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E5=B9=B6=E4=BC=98=E5=8C=96=E4=BC=A4=E5=AE=B3?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logic/service/fight/battle/node/manger.go | 2 +- logic/service/fight/info/BattleSkillEntity.go | 159 +++++++++--------- logic/service/fight/info/battle.go | 7 + logic/service/fight/info/battle_1v1.go | 3 +- 4 files changed, 87 insertions(+), 84 deletions(-) diff --git a/logic/service/fight/battle/node/manger.go b/logic/service/fight/battle/node/manger.go index 2b8dc722..85c72059 100644 --- a/logic/service/fight/battle/node/manger.go +++ b/logic/service/fight/battle/node/manger.go @@ -93,7 +93,7 @@ func (c *NodeManager) Tick() { } // 删除 -func (c *NodeManager) removeEffect(e Effect) { +func (c *NodeManager) RemoveEffect(e Effect) { var remain []Effect for _, eff := range c.Effects { if eff != e { diff --git a/logic/service/fight/info/BattleSkillEntity.go b/logic/service/fight/info/BattleSkillEntity.go index 4ae7066e..0eeef1f3 100644 --- a/logic/service/fight/info/BattleSkillEntity.go +++ b/logic/service/fight/info/BattleSkillEntity.go @@ -26,6 +26,9 @@ var Category = enum.New[struct { PHYSICAL EnumCategory `enum:"1"` // 物理攻击 SPECIAL EnumCategory `enum:"2"` // 特殊攻击 STATUS EnumCategory `enum:"4"` // 状态技能 + Fixed EnumCategory // 固定伤害 + Percent EnumCategory // 百分比伤害 + True EnumCategory // 真伤 }]() // BattleSkillEntity 战斗技能实体 @@ -38,9 +41,9 @@ type BattleSkillEntity struct { SideEffectArgs []int PP int InfinityPP bool - DamageZone map[DamageZone]float64 - isCritical bool //技能是否暴击 - ATTACK_COUNT_ZONE int //攻击次数 + DamageZone map[EnumCategory]map[EnumsZoneType]map[EnumsZoneType][]float64 // 三维map 伤害类型-》增还是减-》加还是乘-》值 + isCritical bool //技能是否暴击 + ATTACK_COUNT_ZONE int //攻击次数 // 技能类型属性 //SkillType EnumCategory // 技能类型(物理/特殊/状态) @@ -69,7 +72,19 @@ func CreateBattleSkillWithInfinity(id int, pp int) *BattleSkillEntity { } ret.SideEffectArgs = sideEffectArgs - ret.DamageZone = make(map[DamageZone]float64) + ret.DamageZone = make(map[EnumCategory]map[EnumsZoneType]map[EnumsZoneType][]float64) //初始化第一层 + + for _, v := range enum.Values[EnumCategory](Category) { + ret.DamageZone[v] = make(map[EnumsZoneType]map[EnumsZoneType][]float64) //初始化第二层 + for _, t := range enum.Values[EnumsZoneType](DamageC) { + ret.DamageZone[v][t] = make(map[EnumsZoneType][]float64) //初始化第三层 + for _, s := range enum.Values[EnumsZoneType](DamageC) { + ret.DamageZone[v][t][s] = make([]float64, 0) //初始化第四层 + + } + } + } + return &ret } @@ -105,6 +120,7 @@ func (s *BattleSkillEntity) Type() element.ElementType { return element.ElementType(s.Move.Type) } +// 技能产生动作 func (u *BattleSkillEntity) NewBattleAction(ctx context.Context) { ret := BattleAction{} @@ -147,47 +163,18 @@ func getSideEffects(move *BattleSkillEntity) []int { return move.SideEffects } -type EnumsDamageZone int +type EnumsZoneType int -// DamageMultiplierZone 伤害乘算区枚举,使用enum包定义 -type DamageZone struct { - add DamageZoneValue - nul DamageZoneValue -} +var DamageZone = enum.New[struct { + add EnumsZoneType // 加区 -type DamageZoneValue struct { - skilltype EnumCategory //技能类型 - value float64 -} - -var Zone = enum.New[struct { - - //增伤区间 - Power DamageZone // 通用增伤区 - - Power_P DamageZone //物理 - Power_S DamageZone //特殊 - Power_C DamageZone //固定 - Power_B DamageZone //百分比 - Power_T DamageZone //真伤 - - //减伤区间 - Power_R DamageZone // 通用 - Power_P_R DamageZone //物理 - Power_S_R DamageZone //特殊 - Power_C_R DamageZone //固定 - - Power_B_R DamageZone //百分比 - Power_T_R DamageZone //真伤 + nul EnumsZoneType // 乘区 +}]() +var DamageC = enum.New[struct { + boost EnumsZoneType //增伤区 + reduction EnumsZoneType // 减伤区 }]() -// 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) @@ -196,28 +183,33 @@ func (s *BattleSkillEntity) Random() *random.RandomXS128 { } // 获得指定的+-区 -func (s *BattleSkillEntity) GetAddValue(e EnumCategory) decimal.Decimal { +func (s *BattleSkillEntity) GetAddValue(e EnumCategory, c EnumsZoneType) decimal.Decimal { - for dz, v := range s.DamageZone { + t, ok := s.DamageZone[e][c][DamageZone.add] + if ok { + var ttt decimal.Decimal - if dz.add.skilltype == e { - return decimal.NewFromFloat(v) + for _, v := range t { + t1 := decimal.NewFromFloat(v) + ttt.Add(t1) } - + return ttt } - return decimal.NewFromFloat(0) } // 获得指定的*/区 -func (s *BattleSkillEntity) GetMulValue(e EnumCategory) decimal.Decimal { +func (s *BattleSkillEntity) GetMulValue(e EnumCategory, c EnumsZoneType) decimal.Decimal { - for dz, v := range s.DamageZone { + t, ok := s.DamageZone[e][c][DamageZone.nul] + if ok { + var ttt decimal.Decimal - if dz.nul.skilltype == e { - return decimal.NewFromFloat(v) + for _, v := range t { + t1 := decimal.NewFromFloat(v) + ttt.Mul(t1) } - + return ttt } return decimal.NewFromFloat(0) @@ -225,30 +217,30 @@ func (s *BattleSkillEntity) GetMulValue(e EnumCategory) decimal.Decimal { } // 设置指定的值 +// 三维map 伤害类型-》增还是减-》加还是乘-》值 +func (s *BattleSkillEntity) PutDamageZone(e EnumCategory, dtype EnumsZoneType, value float64, ftype EnumsZoneType) { + s.DamageZone[e][dtype][ftype] = append(s.DamageZone[e][dtype][ftype], value) + // switch dtype { //判断伤害节点段 -func (s *BattleSkillEntity) PutDamageZone(e EnumCategory, dtype DamageZone, value float64, ftype bool) { + // //case Zone.Power: //特判乘算区的乘运算 - switch dtype { //判断伤害节点段 + // default: + // switch ftype { //判断设置哪个算区 - //case Zone.Power: //特判乘算区的乘运算 + // case true: // 乘算区 + // old := s.GetAddValue(e) - default: - switch ftype { //判断设置哪个算区 + // new := decimal.NewFromFloat(value) + // s.DamageZone[dtype] = float64(old.Add(new).IntPart()) - case true: // 乘算区 - old := s.GetAddValue(e) + // case false: // 加算区 + // old := s.GetMulValue(e) - new := decimal.NewFromFloat(value) - s.DamageZone[dtype] = float64(old.Add(new).IntPart()) + // 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) { @@ -265,13 +257,19 @@ func (s *BattleSkillEntity) CriticalRate() decimal.Decimal { } -// 计算技能威力 -func (s *BattleSkillEntity) CalculatePower(p *BattlePetEntity) int64 { - +func (s *BattleSkillEntity) criticalrandom() decimal.Decimal { //这里应该算上威力区 // 初始化随机值,范围217~255 randomnum := s.Random().NextLongN(39) + 217 + // 10. 随机倍率,随机值除以255 + randomFactor := decimal.NewFromInt(int64(randomnum)).Div(decimal.NewFromInt(255)) + return randomFactor + +} + +// 计算技能威力 +func (s *BattleSkillEntity) CalculatePower(p *BattlePetEntity) int64 { pet, _ := s.Pet() @@ -281,7 +279,7 @@ func (s *BattleSkillEntity) CalculatePower(p *BattlePetEntity) int64 { // 2. 计算威力因子 (基础威力 + 加算) * 乘算 - powerAdd := decimal.NewFromFloat(s.DamageZone[DamageMultiplierZoneEnum.威力加乘区]) //威力加算区 + powerAdd := decimal.NewFromFloat(s.GetAddValue(EnumCategory., true)) //威力加算区 powerMul := decimal.NewFromFloat(s.DamageZone[DamageMultiplierZoneEnum.POWER_MUL]) //威力乘算区 powerZone := decimal.NewFromInt(int64(s.Power)).Add(powerAdd).Mul(powerMul) @@ -333,17 +331,14 @@ func (s *BattleSkillEntity) CalculatePower(p *BattlePetEntity) int64 { // 9. 技能特殊效果倍率 specialEffect := decimal.NewFromFloat(s.DamageZone[DamageMultiplierZoneEnum.SPECIAL_EFFECT_MUL]) - // 10. 随机倍率,随机值除以255 - randomFactor := decimal.NewFromInt(int64(randomnum)).Div(decimal.NewFromInt(255)) - // 11. 计算总伤害 damage := baseDamage. - Mul(sameTypeBonus). // 同属性加成 - Mul(typeRate). // 克制系数 - Mul(criticalRate). //暴击系数 - Mul(damageReduction). //减伤计算 - Mul(specialEffect). //特殊效果 - Mul(randomFactor) //随机波动 + Mul(sameTypeBonus). // 同属性加成 + Mul(typeRate). // 克制系数 + Mul(criticalRate). //暴击系数 + Mul(damageReduction). //减伤计算 + Mul(specialEffect). //特殊效果 + Mul(s.criticalrandom()) //随机波动 // 12. 存储真实伤害到额外倍率,方便后续查询 //context.PutExtraRate("REAL_DAMAGE", damage) diff --git a/logic/service/fight/info/battle.go b/logic/service/fight/info/battle.go index fdb995c1..3af9b3b5 100644 --- a/logic/service/fight/info/battle.go +++ b/logic/service/fight/info/battle.go @@ -14,6 +14,13 @@ type BattleContext struct { opposite []BattleInputSourceEntity //不同阵营 } +// 执行下一回合 +func (b *BattleContext) NextRound() { + + b.Round++ //回合数加1 + +} + // 战斗模式 type EnumBattleMode int diff --git a/logic/service/fight/info/battle_1v1.go b/logic/service/fight/info/battle_1v1.go index e419bd64..8ed8aefb 100644 --- a/logic/service/fight/info/battle_1v1.go +++ b/logic/service/fight/info/battle_1v1.go @@ -9,7 +9,8 @@ import ( type BattleContainer1V1 struct { BattleContext - ownerid uint32 // 房主ID + ownerid uint32 // 房主ID + FirstPerson uint32 //先手方ID } // 返回房主信息