@@ -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 EnumsDamageZon e int
type EnumsZoneTyp e 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 . DamageZon e[ DamageMultiplierZoneEnum . 威力加乘区 ] ) //威力加算区
powerAdd := decimal . NewFromFloat ( s . GetAddValu e( 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)