refactor(fight): 重构伤害计算区域数据结构并优化伤害计算方法

This commit is contained in:
1
2025-08-26 21:30:30 +00:00
parent a14481a2dd
commit 88b9c1f534
4 changed files with 87 additions and 84 deletions

View File

@@ -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 {

View File

@@ -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)

View File

@@ -14,6 +14,13 @@ type BattleContext struct {
opposite []BattleInputSourceEntity //不同阵营
}
// 执行下一回合
func (b *BattleContext) NextRound() {
b.Round++ //回合数加1
}
// 战斗模式
type EnumBattleMode int

View File

@@ -9,7 +9,8 @@ import (
type BattleContainer1V1 struct {
BattleContext
ownerid uint32 // 房主ID
ownerid uint32 // 房主ID
FirstPerson uint32 //先手方ID
}
// 返回房主信息