refactor(fight/effect): 重构能力操作类型枚举命名,统一使用大写形式(ADD/SUB/COPY/RESET)并更新相关调用点
This commit is contained in:
@@ -2,6 +2,9 @@ package input
|
||||
|
||||
import (
|
||||
"blazing/common/data/xmlres"
|
||||
"blazing/logic/service/fight/info"
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
@@ -23,6 +26,115 @@ func getItemBonus(itemID uint32) float64 {
|
||||
return 1.0
|
||||
}
|
||||
|
||||
// 特殊胶囊必定成功
|
||||
// CaptureParams 捕捉参数
|
||||
// type CaptureParams struct {
|
||||
// PetID int // 精灵ID
|
||||
// MaxHP int // 目标最大HP
|
||||
// CurrentHP int // 目标当前HP
|
||||
// CatchRate int // 目标捕获率分子
|
||||
// CatchDenom int // 捕获率分母(如100、1000)
|
||||
// ItemID int // 使用的道具ID
|
||||
// Statuses [20]byte // 异常状态数组,存在的状态对应位置为1
|
||||
// OwnedCount int // 已拥有数量(-1=保底,0=锁定,≥1=衰减)
|
||||
|
||||
// -1是保底模式,0是锁定模式,》0是衰减模式
|
||||
// Capture 执行捕捉 ,捕捉精灵,使用的道具,模式
|
||||
func (c *Input) Capture(pet *info.BattlePetEntity, ItemID uint32, ownerpet int) (bool, CaptureDetails) {
|
||||
|
||||
if getItemBonus(ItemID) >= 255 {
|
||||
return true, CaptureDetails{
|
||||
Success: true,
|
||||
Mode: "特殊胶囊必定成功",
|
||||
BaseRate: 100.0,
|
||||
ModifiedRate: 100.0,
|
||||
GuaranteeBonus: 0,
|
||||
StatusBonus: c.GetStatusBonus(),
|
||||
Details: fmt.Sprintf("道具ID=%d,必定成功", ItemID),
|
||||
}
|
||||
}
|
||||
|
||||
// 锁定模式
|
||||
if ownerpet == 0 {
|
||||
return false, CaptureDetails{
|
||||
Success: false,
|
||||
Mode: "锁定模式",
|
||||
BaseRate: 0,
|
||||
ModifiedRate: 0,
|
||||
GuaranteeBonus: 0,
|
||||
StatusBonus: c.GetStatusBonus(),
|
||||
Details: "已拥有数量为0,无法捕捉",
|
||||
}
|
||||
}
|
||||
|
||||
// 计算基础捕捉率
|
||||
baseRate := c.calcBaseRate(pet, ItemID)
|
||||
denominator := c.Player.GetPlayerCaptureContext().Denominator
|
||||
numerator := int(baseRate * float64(denominator))
|
||||
|
||||
// 衰减模式
|
||||
if ownerpet > 0 {
|
||||
decay := math.Pow(1-c.Player.GetPlayerCaptureContext().DecayFactor, float64(ownerpet))
|
||||
baseRate *= decay
|
||||
if baseRate < 0.01 {
|
||||
baseRate = 0.01 // 最低1%成功率
|
||||
}
|
||||
numerator = int(baseRate * float64(denominator))
|
||||
}
|
||||
|
||||
// 走统一保底判定
|
||||
success, basePct, bonusPct := c.Player.Roll(numerator, denominator)
|
||||
|
||||
return success, CaptureDetails{
|
||||
Success: success,
|
||||
Mode: map[int]string{-1: "保底模式", 0: "锁定模式", 1: "衰减模式"}[ownerpet],
|
||||
BaseRate: basePct,
|
||||
ModifiedRate: basePct + bonusPct,
|
||||
GuaranteeBonus: bonusPct,
|
||||
StatusBonus: c.GetStatusBonus(),
|
||||
Details: fmt.Sprintf("a=%d, 分子=%d, 分母=%d", c.calcBaseA(pet, ItemID), numerator, denominator),
|
||||
}
|
||||
}
|
||||
|
||||
// calcBaseA 按公式计算a值
|
||||
func (c *Input) calcBaseA(pet *info.BattlePetEntity, ItemID uint32) int {
|
||||
catchRate := gconv.Int(pet.CatchRate)
|
||||
catchRate = (catchRate * c.Player.GetPlayerCaptureContext().Denominator) / 1000 // 归一化到1000分母
|
||||
if catchRate < 3 {
|
||||
catchRate = 3
|
||||
}
|
||||
|
||||
currentHP := pet.Info.Hp
|
||||
if currentHP <= 0 {
|
||||
currentHP = 1
|
||||
}
|
||||
|
||||
hpRatio := (3.0*float64(pet.Info.MaxHp) - 2.0*float64(currentHP)) / (3.0 * float64(pet.Info.MaxHp))
|
||||
if hpRatio < 0 {
|
||||
hpRatio = 0
|
||||
}
|
||||
|
||||
itemBonus := getItemBonus(ItemID)
|
||||
statusBonus := c.GetStatusBonus()
|
||||
|
||||
return int(hpRatio * float64(catchRate) * itemBonus * statusBonus)
|
||||
}
|
||||
|
||||
// calcBaseRate 按公式计算基础成功率
|
||||
func (c *Input) calcBaseRate(pet *info.BattlePetEntity, ItemID uint32) float64 {
|
||||
if getItemBonus(ItemID) >= 255 {
|
||||
return 1.0
|
||||
}
|
||||
|
||||
a := c.calcBaseA(pet, ItemID)
|
||||
if a >= 255 {
|
||||
return 1.0
|
||||
}
|
||||
|
||||
g := int(1048560.0 / math.Floor(math.Sqrt(math.Floor(math.Sqrt(math.Floor(16711680.0/float64(a)))))))
|
||||
return math.Pow(float64(g)/65536.0, 4.0)
|
||||
}
|
||||
|
||||
// CaptureDetails 捕捉详情
|
||||
type CaptureDetails struct {
|
||||
Success bool
|
||||
|
||||
@@ -22,7 +22,9 @@ type Effect interface {
|
||||
PreAttacked(opp *Input, skill *info.SkillEntity) //预处理受击技能
|
||||
BeforeAttacked(opp *Input, id *info.DamageZone) //受击前触发 这时候就是百分比减伤区间
|
||||
Attacked(opp *Input, id *info.DamageZone) // 受击触发 这时候就是点数减伤
|
||||
Shield() bool // 护盾值变化时触发
|
||||
|
||||
PostDamage() bool // 伤害结算后触发(血量扣除后),比如触发回神,反弹也在这里实现
|
||||
Shield() bool // 护盾值变化时触发
|
||||
|
||||
OnSwitchIn() bool // 精灵出战 / 上场时触发
|
||||
OnSwitchOut() bool // 精灵下场时触发
|
||||
@@ -33,8 +35,6 @@ type Effect interface {
|
||||
PreBattleEnd() bool //战斗结束前
|
||||
OnBattleEnd() bool //战斗结束
|
||||
|
||||
// PostDamage() bool // 伤害结算后触发(血量扣除后)
|
||||
// AfterAttacked() bool // 被攻击后触发(受击判定)
|
||||
// OnSkillPP() bool //技能PP减少节点
|
||||
// // 治疗相关触发
|
||||
// OnBeforeHeal() bool // 治疗前触发
|
||||
|
||||
@@ -93,61 +93,130 @@ func (u *Input) SetProp(in *Input, prop, level int8, ptype info.EnumAbilityOpTyp
|
||||
return t.BeferProp(in, prop, level, ptype) //返回本身结算,如果false,说明不能使用技能了
|
||||
|
||||
})
|
||||
if canuseskill {
|
||||
if !canuseskill {
|
||||
|
||||
return false
|
||||
}
|
||||
var newValue int8
|
||||
abfunc := func(prop, level int8, ptype info.EnumAbilityOpType) (ret bool) {
|
||||
|
||||
switch ptype {
|
||||
case info.AbilityOpType.AbilityOpIncrease:
|
||||
newValue := utils.Min(u.AttackValue.Prop[prop]+int8(level), 6)
|
||||
case info.AbilityOpType.ADD:
|
||||
newValue = utils.Min(u.AttackValue.Prop[prop]+int8(level), 6)
|
||||
|
||||
if newValue > u.AttackValue.Prop[prop] {
|
||||
fmt.Println("属性值会增加")
|
||||
ret = true
|
||||
return true
|
||||
} else {
|
||||
fmt.Println("属性值不会增加")
|
||||
ret = false
|
||||
return false
|
||||
}
|
||||
|
||||
// 执行赋值
|
||||
u.AttackValue.Prop[prop] = newValue
|
||||
case info.AbilityOpType.SUB:
|
||||
newValue = utils.Max(u.AttackValue.Prop[prop]+int8(level), -6)
|
||||
if newValue < u.AttackValue.Prop[prop] {
|
||||
fmt.Println("属性值会减少")
|
||||
return true
|
||||
} else {
|
||||
fmt.Println("属性值不会增加")
|
||||
return false
|
||||
}
|
||||
|
||||
case info.AbilityOpType.AbilityOpDecrease:
|
||||
u.AttackValue.Prop[prop] = utils.Max(u.AttackValue.Prop[prop]+int8(level), -6)
|
||||
|
||||
case info.AbilityOpType.AbilityOpReset:
|
||||
case info.AbilityOpType.RESET:
|
||||
if level > 0 && u.AttackValue.Prop[prop] > 0 { //消强
|
||||
u.AttackValue.Prop[prop] = 0
|
||||
newValue = 0
|
||||
return true
|
||||
|
||||
}
|
||||
if level < 0 && u.AttackValue.Prop[prop] < 0 { //解弱
|
||||
u.AttackValue.Prop[prop] = 0
|
||||
}
|
||||
|
||||
case info.AbilityOpType.AbilityOpStealStrengthen:
|
||||
|
||||
if in.AttackValue.Prop[prop] > 0 {
|
||||
u.SetProp(u, prop, in.AttackValue.Prop[prop], info.AbilityOpType.AbilityOpIncrease)
|
||||
|
||||
in.SetProp(u, prop, 1, info.AbilityOpType.AbilityOpReset) //消除对面强化
|
||||
}
|
||||
case info.AbilityOpType.AbilityOpReverse:
|
||||
if level > 0 && u.AttackValue.Prop[prop] > 0 { //反转强化,实际上是附带2倍的反转强化
|
||||
|
||||
u.SetProp(u, prop, u.AttackValue.Prop[prop]*2, info.AbilityOpType.AbilityOpDecrease)
|
||||
|
||||
}
|
||||
if level < 0 && u.AttackValue.Prop[prop] < 0 {
|
||||
u.SetProp(u, prop, -u.AttackValue.Prop[prop]*2, info.AbilityOpType.AbilityOpIncrease)
|
||||
}
|
||||
case info.AbilityOpType.AbilityOpBounceWeaken:
|
||||
|
||||
if u.AttackValue.Prop[prop] < 0 {
|
||||
in.SetProp(u, prop, u.AttackValue.Prop[prop], info.AbilityOpType.AbilityOpDecrease)
|
||||
|
||||
u.SetProp(u, prop, -1, info.AbilityOpType.AbilityOpReset) //消除自身弱化
|
||||
newValue = 0
|
||||
return true
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
return
|
||||
switch ptype {
|
||||
|
||||
case info.AbilityOpType.AbilityOpStealStrengthen:
|
||||
|
||||
temp := in.AttackValue.Prop[prop]
|
||||
|
||||
if temp <= 0 { //对方没有强化
|
||||
return false
|
||||
}
|
||||
if abfunc(prop, temp, info.AbilityOpType.ADD) { //把对面的强化等级添加自身
|
||||
u.AttackValue.Prop[prop] = newValue //成功把 强化更新
|
||||
in.SetProp(u, prop, 1, info.AbilityOpType.RESET) //吸取后消除对面强化
|
||||
|
||||
}
|
||||
|
||||
case info.AbilityOpType.AbilityOpReverse:
|
||||
temp := u.AttackValue.Prop[prop]
|
||||
|
||||
switch {
|
||||
|
||||
case level > 0: //反转强化
|
||||
if temp <= 0 { //没有强化
|
||||
return false
|
||||
}
|
||||
if abfunc(prop, temp*2, info.AbilityOpType.SUB) {
|
||||
u.AttackValue.Prop[prop] = newValue
|
||||
if temp == -u.AttackValue.Prop[prop] { //成功到对应弱化
|
||||
|
||||
return true
|
||||
} else {
|
||||
return true
|
||||
|
||||
}
|
||||
|
||||
} else { //自身免弱或已到-6
|
||||
|
||||
return false
|
||||
}
|
||||
default: //反转弱化
|
||||
if temp >= 0 { //没有弱化
|
||||
return false
|
||||
}
|
||||
if abfunc(prop, -temp*2, info.AbilityOpType.ADD) {
|
||||
u.AttackValue.Prop[prop] = newValue
|
||||
if temp == -u.AttackValue.Prop[prop] { //成功到对应强化
|
||||
|
||||
return true
|
||||
} else {
|
||||
return true
|
||||
|
||||
}
|
||||
|
||||
} else { //自身免弱或已到-6
|
||||
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
case info.AbilityOpType.AbilityOpBounceWeaken:
|
||||
temp := u.AttackValue.Prop[prop]
|
||||
if temp >= 0 { //没有弱化
|
||||
return false
|
||||
}
|
||||
|
||||
if in.SetProp(u, prop, temp, info.AbilityOpType.SUB) {
|
||||
|
||||
u.SetProp(u, prop, -1, info.AbilityOpType.RESET) //消除自身弱化
|
||||
return true
|
||||
}
|
||||
default: //增加减少重置
|
||||
|
||||
if abfunc(prop, level, ptype) {
|
||||
// 执行赋值
|
||||
u.AttackValue.Prop[prop] = newValue
|
||||
return true
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
func (i *Input) GetAction(opp *Input) {
|
||||
//使用1#技能,实际上要按照四个技能权重去使用
|
||||
@@ -4,10 +4,7 @@ import (
|
||||
"blazing/common/utils"
|
||||
"blazing/logic/service/common"
|
||||
"blazing/logic/service/fight/info"
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
"github.com/jinzhu/copier"
|
||||
)
|
||||
|
||||
@@ -87,112 +84,3 @@ func (i *Input) GetStatusBonus() float64 {
|
||||
|
||||
return maxBonus
|
||||
}
|
||||
|
||||
// 特殊胶囊必定成功
|
||||
// CaptureParams 捕捉参数
|
||||
// type CaptureParams struct {
|
||||
// PetID int // 精灵ID
|
||||
// MaxHP int // 目标最大HP
|
||||
// CurrentHP int // 目标当前HP
|
||||
// CatchRate int // 目标捕获率分子
|
||||
// CatchDenom int // 捕获率分母(如100、1000)
|
||||
// ItemID int // 使用的道具ID
|
||||
// Statuses [20]byte // 异常状态数组,存在的状态对应位置为1
|
||||
// OwnedCount int // 已拥有数量(-1=保底,0=锁定,≥1=衰减)
|
||||
|
||||
// -1是保底模式,0是锁定模式,》0是衰减模式
|
||||
// Capture 执行捕捉 ,捕捉精灵,使用的道具,模式
|
||||
func (c *Input) Capture(pet *info.BattlePetEntity, ItemID uint32, ownerpet int) (bool, CaptureDetails) {
|
||||
|
||||
if getItemBonus(ItemID) >= 255 {
|
||||
return true, CaptureDetails{
|
||||
Success: true,
|
||||
Mode: "特殊胶囊必定成功",
|
||||
BaseRate: 100.0,
|
||||
ModifiedRate: 100.0,
|
||||
GuaranteeBonus: 0,
|
||||
StatusBonus: c.GetStatusBonus(),
|
||||
Details: fmt.Sprintf("道具ID=%d,必定成功", ItemID),
|
||||
}
|
||||
}
|
||||
|
||||
// 锁定模式
|
||||
if ownerpet == 0 {
|
||||
return false, CaptureDetails{
|
||||
Success: false,
|
||||
Mode: "锁定模式",
|
||||
BaseRate: 0,
|
||||
ModifiedRate: 0,
|
||||
GuaranteeBonus: 0,
|
||||
StatusBonus: c.GetStatusBonus(),
|
||||
Details: "已拥有数量为0,无法捕捉",
|
||||
}
|
||||
}
|
||||
|
||||
// 计算基础捕捉率
|
||||
baseRate := c.calcBaseRate(pet, ItemID)
|
||||
denominator := c.Player.GetPlayerCaptureContext().Denominator
|
||||
numerator := int(baseRate * float64(denominator))
|
||||
|
||||
// 衰减模式
|
||||
if ownerpet > 0 {
|
||||
decay := math.Pow(1-c.Player.GetPlayerCaptureContext().DecayFactor, float64(ownerpet))
|
||||
baseRate *= decay
|
||||
if baseRate < 0.01 {
|
||||
baseRate = 0.01 // 最低1%成功率
|
||||
}
|
||||
numerator = int(baseRate * float64(denominator))
|
||||
}
|
||||
|
||||
// 走统一保底判定
|
||||
success, basePct, bonusPct := c.Player.Roll(numerator, denominator)
|
||||
|
||||
return success, CaptureDetails{
|
||||
Success: success,
|
||||
Mode: map[int]string{-1: "保底模式", 0: "锁定模式", 1: "衰减模式"}[ownerpet],
|
||||
BaseRate: basePct,
|
||||
ModifiedRate: basePct + bonusPct,
|
||||
GuaranteeBonus: bonusPct,
|
||||
StatusBonus: c.GetStatusBonus(),
|
||||
Details: fmt.Sprintf("a=%d, 分子=%d, 分母=%d", c.calcBaseA(pet, ItemID), numerator, denominator),
|
||||
}
|
||||
}
|
||||
|
||||
// calcBaseA 按公式计算a值
|
||||
func (c *Input) calcBaseA(pet *info.BattlePetEntity, ItemID uint32) int {
|
||||
catchRate := gconv.Int(pet.CatchRate)
|
||||
catchRate = (catchRate * c.Player.GetPlayerCaptureContext().Denominator) / 1000 // 归一化到1000分母
|
||||
if catchRate < 3 {
|
||||
catchRate = 3
|
||||
}
|
||||
|
||||
currentHP := pet.Info.Hp
|
||||
if currentHP <= 0 {
|
||||
currentHP = 1
|
||||
}
|
||||
|
||||
hpRatio := (3.0*float64(pet.Info.MaxHp) - 2.0*float64(currentHP)) / (3.0 * float64(pet.Info.MaxHp))
|
||||
if hpRatio < 0 {
|
||||
hpRatio = 0
|
||||
}
|
||||
|
||||
itemBonus := getItemBonus(ItemID)
|
||||
statusBonus := c.GetStatusBonus()
|
||||
|
||||
return int(hpRatio * float64(catchRate) * itemBonus * statusBonus)
|
||||
}
|
||||
|
||||
// calcBaseRate 按公式计算基础成功率
|
||||
func (c *Input) calcBaseRate(pet *info.BattlePetEntity, ItemID uint32) float64 {
|
||||
if getItemBonus(ItemID) >= 255 {
|
||||
return 1.0
|
||||
}
|
||||
|
||||
a := c.calcBaseA(pet, ItemID)
|
||||
if a >= 255 {
|
||||
return 1.0
|
||||
}
|
||||
|
||||
g := int(1048560.0 / math.Floor(math.Sqrt(math.Floor(math.Sqrt(math.Floor(16711680.0/float64(a)))))))
|
||||
return math.Pow(float64(g)/65536.0, 4.0)
|
||||
}
|
||||
|
||||
@@ -14,8 +14,8 @@ import (
|
||||
type EnumEffectType int
|
||||
|
||||
var EffectType = enum.New[struct {
|
||||
Skill EnumEffectType `enum:"1000000"` //技能
|
||||
//Prop EnumEffectType `enum:"2000000"` //属性
|
||||
Skill EnumEffectType `enum:"1000000"` //技能
|
||||
NewSel EnumEffectType `enum:"2000000"` //特性
|
||||
Status EnumEffectType `enum:"3000000"` //状态
|
||||
|
||||
}]()
|
||||
Reference in New Issue
Block a user