Files
bl/logic/service/fight/effect/642_646.go
xinian a7171e9ef4
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
fix: 修正 effect 642-646 实现逻辑
2026-03-29 21:44:27 +08:00

164 lines
3.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package effect
import (
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
"blazing/logic/service/fight/node"
"github.com/alpacahq/alpacadecimal"
)
func counterDamageByLevel(level int) alpacadecimal.Decimal {
if level < 0 || level > 5 {
return alpacadecimal.Zero
}
return alpacadecimal.NewFromInt(int64((level + 1) * 50))
}
// Effect 642: {0}回合内若对手攻击技能命中则己方在场精灵{1}%做出{2}
type Effect642 struct {
RoundEffectArg0Base
}
func (e *Effect642) Skill_Use_ex() bool {
skill := e.Ctx().SkillEntity
if skill == nil || skill.AttackTime == 0 || skill.Category() == info.Category.STATUS {
return true
}
success, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart()), 100)
if !success {
return true
}
damage := counterDamageByLevel(int(e.Args()[2].IntPart()))
if damage.Cmp(alpacadecimal.Zero) <= 0 {
return true
}
e.Ctx().Opp.Damage(e.Ctx().Our, &info.DamageZone{
Type: info.DamageType.Fixed,
Damage: damage,
})
return true
}
// Effect 643: {0}%概率使对手{1}回合内{2}能力每回合变化{3}
type Effect643 struct {
node.EffectNode
}
func (e *Effect643) Skill_Use() bool {
skill := e.Ctx().SkillEntity
if skill == nil || skill.AttackTime == 0 {
return true
}
success, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100)
if !success {
return true
}
effect := e.Ctx().Our.InitEffect(
input.EffectType.Sub,
643,
int(e.Args()[0].IntPart()),
int(e.Args()[1].IntPart()),
int(e.Args()[2].IntPart()),
int(e.Args()[3].IntPart()),
)
if effect != nil {
e.Ctx().Opp.AddEffect(e.Ctx().Our, effect)
}
return true
}
type Effect643Sub struct {
RoundEffectArg1Base
}
func (e *Effect643Sub) TurnEnd() {
propID := int(e.Args()[2].IntPart())
if propID >= 0 && propID < 6 {
e.Ctx().Our.SetProp(e.Ctx().Opp, int8(propID), int8(e.Args()[3].IntPart()))
}
e.EffectNode.TurnEnd()
}
// Effect 644: 当回合未击败对手则减少对手当前体力1/{0}
type Effect644 struct {
node.EffectNode
}
func (e *Effect644) Action_end() bool {
skill := e.Ctx().SkillEntity
if skill == nil || skill.AttackTime == 0 {
return true
}
if e.Ctx().Opp.CurrentPet.Info.Hp <= 0 || e.Args()[0].Cmp(alpacadecimal.Zero) <= 0 {
return true
}
damage := e.Ctx().Opp.CurrentPet.GetHP().Div(e.Args()[0])
if damage.Cmp(alpacadecimal.Zero) <= 0 {
return true
}
e.Ctx().Opp.Damage(e.Ctx().Our, &info.DamageZone{
Type: info.DamageType.Percent,
Damage: damage,
})
return true
}
// Effect 645: 体力低于1/{0}时威力{1}倍
type Effect645 struct {
node.EffectNode
}
func (e *Effect645) SkillHit() bool {
if e.Ctx().SkillEntity == nil {
return true
}
threshold := e.GetInput().CurrentPet.GetMaxHP().Div(e.Args()[0])
if e.GetInput().CurrentPet.GetHP().Cmp(threshold) < 0 {
e.Ctx().SkillEntity.XML.Power *= int(e.Args()[1].IntPart())
}
return true
}
// Effect 646: 体力高于对手时此技能命中后100%使对手{0}
type Effect646 struct {
node.EffectNode
}
func (e *Effect646) Skill_Use() bool {
skill := e.Ctx().SkillEntity
if skill == nil || skill.AttackTime == 0 {
return true
}
if e.Ctx().Our.CurrentPet.GetHP().Cmp(e.Ctx().Opp.CurrentPet.GetHP()) <= 0 {
return true
}
for i, delta := range e.SideEffectArgs[:min(len(e.SideEffectArgs), 6)] {
if delta == 0 {
continue
}
e.Ctx().Opp.SetProp(e.Ctx().Our, int8(i), int8(delta))
}
return true
}
func init() {
input.InitEffect(input.EffectType.Skill, 642, &Effect642{})
input.InitEffect(input.EffectType.Skill, 643, &Effect643{})
input.InitEffect(input.EffectType.Sub, 643, &Effect643Sub{})
input.InitEffect(input.EffectType.Skill, 644, &Effect644{})
input.InitEffect(input.EffectType.Skill, 645, &Effect645{})
input.InitEffect(input.EffectType.Skill, 646, &Effect646{})
}