feat(fight): 优化战斗属性计算和技能命中逻辑

- 更新了战斗中属性比较和技能命中的计算方式
- 调整了属性提升和状态效果的处理逻辑
- 优化了属性值的计算方法,确保结果至少为1
- 修改了技能准确性的计算公式
This commit is contained in:
2025-09-17 00:50:37 +08:00
parent 29ac99c860
commit 60a8be8b48
6 changed files with 26 additions and 14 deletions

View File

@@ -51,7 +51,7 @@ func (f *FightC) Compare(a, b BattleActionI) (BattleActionI, BattleActionI) {
return a, b
}
p2 = int(f.Opp.GetProp(4)) - int(f.Our.GetProp(4))
p2 = int(f.Opp.GetProp(4, false)) - int(f.Our.GetProp(4, false))
if p2 > 0 {
return b, a
} else if p2 < 0 {

View File

@@ -14,7 +14,7 @@ type Effect0 struct {
// 技能命中计算
func (this *Effect0) IsHit(opp *input.Input, skill *info.SkillEntity) {
skill.AttackTimeC() //计算命中
skill.AttackTimeC(int(opp.GetProp(5, true))) //计算命中
}
// 比如xx技能无效

View File

@@ -538,11 +538,18 @@ func (f *FightC) enterturn(fattack, sattack BattleActionI) {
ret.FAttack.LostHp = uint32(f.First.Damage.IntPart()) //先手方造成血量
ret.SAttack.RemainHp = int32(f.Second.CurrentPet.Info.Hp)
ret.SAttack.LostHp = uint32(f.Second.Damage.IntPart()) //后手方造成血量
ret.FAttack.Prop.Accuracy = 6
ret.SAttack.Prop.Accuracy = 6
ret.SAttack.Status.Poisoned_1 = 1
ret.FAttack.Status.Poisoned_1 = 1
//ret.SAttack.Status.Poisoned_1 = 1
for i := 0; i < 6; i++ { //堆叠属性提升
ret.FAttack.Prop[i] = int8(attacker.GetProp(i, true))
ret.FAttack.Prop[i] = int8(defender.GetProp(i, true))
}
for i := 0; i < 20; i++ { //堆叠状态剩余回合
ate, _ := attacker.GetStatusEffect(i)
ret.FAttack.Status[i] = int8(ate.Duration(0))
dte, _ := defender.GetStatusEffect(i)
ret.FAttack.Status[i] = int8(dte.Duration(0))
}
f.Broadcast(func(ff *input.Input) {
ff.Player.SendAttackValue(ret)

View File

@@ -173,20 +173,20 @@ func CreateBattlePetEntity(info *model.PetInfo, rand *rand.Rand) *BattlePetEntit
// value 基础属性值
// stat 状态变化值(可正可负)
// 返回// 返回计算后的实际属性值确保结果至少为1
func CalculateRealValue(value uint32, stat int) uint32 {
func CalculateRealValue(value int, stat int) int {
if stat == 0 {
if value <= 0 {
return 1
}
return value
} else if stat > 0 {
r := uint32(float64(value) * (float64(stat+2) / 2.0))
r := int(float64(value) * (float64(stat+2) / 2.0))
if r <= 0 {
return 1
}
return r
} else {
r := uint32(float64(value) * (2.0 / float64(2-stat)))
r := int(float64(value) * (2.0 / float64(2-stat)))
if r <= 0 {
return 1
}

View File

@@ -213,7 +213,7 @@ func (a *SkillEntity) GetAccuracy(level int) uint32 {
}
if level > 6 || level == 0 { //强化等级
return uint32(CalculateRealValue(uint32(a.Accuracy), level))
return uint32(CalculateRealValue((a.Accuracy), level))
}
var temp float64
switch level {

View File

@@ -88,15 +88,20 @@ func InitPropEffect(id int, t Effect) {
}
// * battle_lv: atk(0), def(1), sp_atk(2), sp_def(3), spd(4), accuracy(5)
func (c *Input) GetProp(id int) uint32 {
// 是否需要真实提升
func (c *Input) GetProp(id int, istue bool) int {
//todo 插入获取前
t, ok := NodeM[id+2000000]
if ok {
if id < 5 {
return info.CalculateRealValue(c.CurrentPet.Info.Prop[id], t.GetMaxStack())
if istue {
return t.GetMaxStack()
}
return info.CalculateRealValue(int(c.CurrentPet.Info.Prop[id]), t.GetMaxStack())
}
//命中就直接返回
return t.GetMaxStack()
}
//todo 插入获取后函数