fix: 修复宠物存活状态判定逻辑
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful

移除 `NotAlive` 字段,改用 `Alive()` 方法通过 HP 判断存活状态,修正相关效果触发逻辑。
This commit is contained in:
xinian
2026-03-17 13:34:50 +08:00
committed by cnb
parent 1e37d71878
commit 937ddd0a97
11 changed files with 99 additions and 18 deletions

View File

@@ -15,13 +15,16 @@ func (e *Effect197) SetArgs(t *input.Input, a ...int) {
e.EffectNode.Duration(a[0]) // 持续n回合 e.EffectNode.Duration(a[0]) // 持续n回合
} }
func (e *Effect197) SwitchOut(in *input.Input) bool { func (e *Effect197) SwitchOut(in *input.Input) bool {
if e.Ctx().Our.CurrentPet.NotAlive { // 被击败 if e.Input == in {
for i, v := range e.Ctx().Opp.Prop[:] { if !e.Ctx().Our.CurrentPet.Alive() { // 被击败
if v > 0 { for i, v := range e.Ctx().Opp.Prop[:] {
e.Ctx().Opp.SetProp(e.Ctx().Opp, int8(i), 0) if v > 0 {
} e.Ctx().Opp.SetProp(e.Ctx().Opp, int8(i), 0)
}
}
} }
e.Alive(false)
} }
return true return true

View File

@@ -15,11 +15,14 @@ func (e *Effect199) SetArgs(t *input.Input, a ...int) {
e.EffectNode.Duration(-1) // 持续n回合 e.EffectNode.Duration(-1) // 持续n回合
} }
func (e *Effect199) SwitchOut(in *input.Input) bool { func (e *Effect199) SwitchOut(in *input.Input) bool {
if e.Ctx().Our.CurrentPet.NotAlive { // 被击败 if e.Input == in {
// 设置下一个出场精灵的增益效果 if !e.Ctx().Our.CurrentPet.Alive() { // 被击败
effectType := int8(e.Args()[0].IntPart()) // xx类型 // 设置下一个出场精灵的增益效果
effectValue := int8(e.Args()[1].IntPart()) // 等级+k effectType := int8(e.Args()[0].IntPart()) // xx类型
e.Ctx().Our.SetProp(e.Ctx().Our, effectType, effectValue) effectValue := int8(e.Args()[1].IntPart()) // 等级+k
e.Ctx().Our.SetProp(e.Ctx().Our, effectType, effectValue)
}
e.Alive(false)
} }
return true return true

View File

@@ -18,7 +18,7 @@ func (e *Effect495) OnSkill() bool {
if success { if success {
// 秒杀对手 // 秒杀对手
e.Ctx().Opp.CurrentPet.Info.Hp = 0 e.Ctx().Opp.CurrentPet.Info.Hp = 0
e.Ctx().Opp.CurrentPet.NotAlive = true
} }
} }

View File

@@ -0,0 +1,27 @@
package effect
import (
"blazing/logic/service/fight/input"
"blazing/logic/service/fight/node"
)
type Effect547 struct {
node.EffectNode
}
func (e *Effect547) Skill_Use() bool {
fearEffect := e.Ctx().Our.InitEffect(input.EffectType.Status, int(e.SideEffectArgs[0]))
if fearEffect != nil {
e.Ctx().Opp.AddEffect(e.Ctx().Our, fearEffect)
e.Ctx().Our.AddEffect(e.Ctx().Our, fearEffect)
}
return true
}
func (e *Effect547) SetArgs(t *input.Input, a ...int) {
e.EffectNode.SetArgs(t, a...)
e.EffectNode.Duration(a[1]) // 持续n回合
}
func init() {
input.InitEffect(input.EffectType.Skill, 547, &Effect547{})
}

View File

@@ -0,0 +1,43 @@
package effect
import (
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
"blazing/logic/service/fight/node"
"github.com/gogf/gf/v2/util/grand"
)
// "id": 559,
// "argsNum": 1,
// "info": "{0}回合内若对手使用攻击技能则随机进入烧伤、冻伤、中毒、麻痹、害怕、睡眠中的一种异常状态"
// },
type Effect559 struct {
node.EffectNode
}
func (e *Effect559) Skill_Use_ex() bool {
if e.Ctx().SkillEntity == nil {
return true
}
status := []info.EnumPetStatus{
info.PetStatus.Burned,
info.PetStatus.Frozen,
info.PetStatus.Poisoned,
info.PetStatus.Paralysis,
info.PetStatus.Fear,
info.PetStatus.Sleep,
}
fearEffect := e.Ctx().Our.InitEffect(input.EffectType.Status, int(status[grand.Intn(len(status))]))
if fearEffect != nil {
e.Ctx().Opp.AddEffect(e.Ctx().Our, fearEffect)
}
return true
}
func init() {
input.InitEffect(input.EffectType.Skill, 559, &Effect559{})
}

View File

@@ -37,7 +37,7 @@ func (e *Effect72) SkillHit() bool {
Type: info.DamageType.True, Type: info.DamageType.True,
Damage: alpacadecimal.NewFromInt(int64(e.Ctx().Our.CurrentPet.Info.Hp)), Damage: alpacadecimal.NewFromInt(int64(e.Ctx().Our.CurrentPet.Info.Hp)),
}) })
e.Ctx().Our.CurrentPet.NotAlive = true
return true return true
} }

View File

@@ -31,7 +31,7 @@ func (e *SelfKill) OnSkill() bool {
Damage: alpacadecimal.NewFromInt(int64(e.Ctx().Our.CurrentPet.Info.MaxHp)), Damage: alpacadecimal.NewFromInt(int64(e.Ctx().Our.CurrentPet.Info.MaxHp)),
}) })
e.can = true e.can = true
e.Ctx().Our.CurrentPet.NotAlive = true
return true return true
} }
@@ -210,6 +210,6 @@ func (e *Effect112) Skill_Use() bool {
Type: info.DamageType.Fixed, Type: info.DamageType.Fixed,
Damage: alpacadecimal.Min(alpacadecimal.NewFromInt(n), e.Ctx().Opp.CurrentPet.GetHP().Sub(alpacadecimal.NewFromInt(1))), Damage: alpacadecimal.Min(alpacadecimal.NewFromInt(n), e.Ctx().Opp.CurrentPet.GetHP().Sub(alpacadecimal.NewFromInt(1))),
}) })
e.Ctx().Our.CurrentPet.NotAlive = true
return true return true
} }

View File

@@ -355,7 +355,7 @@ func (f *FightC) enterturn(firstAttack, secondAttack *action.SelectSkillAction)
} }
func (f *FightC) TURNOVER(cur *input.Input) { func (f *FightC) TURNOVER(cur *input.Input) {
cur.CurrentPet.NotAlive = true
f.Broadcast(func(ff *input.Input) { f.Broadcast(func(ff *input.Input) {
ff.Exec(func(t input.Effect) bool { ff.Exec(func(t input.Effect) bool {

View File

@@ -23,10 +23,15 @@ type BattlePetEntity struct {
//Status StatusDict //精灵的状态 //Status StatusDict //精灵的状态
//能力提升属性 //能力提升属性
//Prop PropDict //Prop PropDict
NotAlive bool `struc:"skip"` //NotAlive bool `struc:"skip"`
//DamageZone map[EnumCategory]map[EnumsZoneType]map[EnumsZoneType][]float64 // 三维map 伤害类型-》增还是减-》加还是乘-》值 //DamageZone map[EnumCategory]map[EnumsZoneType]map[EnumsZoneType][]float64 // 三维map 伤害类型-》增还是减-》加还是乘-》值
} }
func (t *BattlePetEntity) Alive() bool {
return t.Info.Hp > 0
}
// 创建精灵实例 // 创建精灵实例
func CreateBattlePetEntity(info model.PetInfo, rand *rand.Rand) *BattlePetEntity { func CreateBattlePetEntity(info model.PetInfo, rand *rand.Rand) *BattlePetEntity {
ret := &BattlePetEntity{} ret := &BattlePetEntity{}

View File

@@ -235,7 +235,7 @@ func initfightready(in *input.Input) (model.FightUserInfo, []model.ReadyFightPet
func (f *FightC) IsWin(c *input.Input) bool { func (f *FightC) IsWin(c *input.Input) bool {
for _, v := range f.GetInputByPlayer(c.Player, true).AllPet { for _, v := range f.GetInputByPlayer(c.Player, true).AllPet {
if !v.NotAlive { //如果存活 if !v.Alive() { //如果存活
return false return false
} }
} }

View File

@@ -89,7 +89,7 @@ func (our *Input) SortPet() {
} }
nonZeroHP = append(nonZeroHP, s) nonZeroHP = append(nonZeroHP, s)
} else { } else {
s.NotAlive = true
zeroHP = append(zeroHP, s) zeroHP = append(zeroHP, s)
} }
} }