Files
bl/logic/service/fight/effect/1578_1582.go

206 lines
5.6 KiB
Go
Raw Normal View History

2026-04-04 01:04:58 +08:00
package effect
import (
"blazing/logic/service/fight/action"
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
"blazing/logic/service/fight/node"
"github.com/alpacahq/alpacadecimal"
)
var hundred = alpacadecimal.NewFromInt(100)
func applyStatusByID(owner, target *input.Input, statusID int) bool {
if owner == nil || target == nil || statusID <= 0 {
return false
}
eff := owner.InitEffect(input.EffectType.Status, statusID)
if eff == nil {
return false
}
target.AddEffect(owner, eff)
return true
}
// Effect 1578: 出手时自身护盾值高于{0}则自身下回合攻击技能先制+{1}
type Effect1578 struct{ node.EffectNode }
func (e *Effect1578) Skill_Use() bool {
if len(e.Args()) < 2 || e.Ctx().Our == nil {
return true
}
shield := e.Ctx().Our.CurrentShield()
if shield.Cmp(e.Args()[0]) <= 0 {
return true
}
sub := e.Ctx().Our.InitEffect(input.EffectType.Sub, 1578, int(e.Args()[1].IntPart()))
if sub != nil {
e.Ctx().Our.AddEffect(e.Ctx().Our, sub)
}
return true
}
type Effect1578Sub struct {
RoundEffectArg0Base
remaining int
priority int
}
func (e *Effect1578Sub) SetArgs(t *input.Input, a ...int) {
e.EffectNode.SetArgs(t, a...)
if len(a) > 0 {
e.remaining = 1
}
if len(a) > 1 {
e.priority = a[0]
}
}
func (e *Effect1578Sub) ComparePre(fattack, sattack *action.SelectSkillAction) bool {
if e.remaining <= 0 {
e.Alive(false)
return true
}
current := actionByPlayer(fattack, sattack, e.Ctx().Our.UserID)
if current == nil || current.SkillEntity == nil || current.SkillEntity.Category() == info.Category.STATUS {
return true
}
current.SkillEntity.XML.Priority += e.priority
e.remaining--
if e.remaining <= 0 {
e.Alive(false)
}
return true
}
// Effect 1579: 出手时自身护盾值低于{0}则下回合属性技能先制+{1}
type Effect1579 struct{ node.EffectNode }
func (e *Effect1579) Skill_Use() bool {
if len(e.Args()) < 2 || e.Ctx().Our == nil {
return true
}
if e.Ctx().Our.CurrentShield().Cmp(e.Args()[0]) >= 0 {
return true
}
sub := e.Ctx().Our.InitEffect(input.EffectType.Sub, 1579, int(e.Args()[1].IntPart()))
if sub != nil {
e.Ctx().Our.AddEffect(e.Ctx().Our, sub)
}
return true
}
type Effect1579Sub struct {
RoundEffectArg0Base
remaining int
priority int
}
func (e *Effect1579Sub) SetArgs(t *input.Input, a ...int) {
e.EffectNode.SetArgs(t, a...)
if len(a) > 0 {
e.remaining = 1
}
if len(a) > 1 {
e.priority = a[0]
}
}
func (e *Effect1579Sub) ComparePre(fattack, sattack *action.SelectSkillAction) bool {
if e.remaining <= 0 {
e.Alive(false)
return true
}
current := actionByPlayer(fattack, sattack, e.Ctx().Our.UserID)
if current == nil || current.SkillEntity == nil || current.SkillEntity.Category() != info.Category.STATUS {
return true
}
current.SkillEntity.XML.Priority += e.priority
e.remaining--
if e.remaining <= 0 {
e.Alive(false)
}
return true
}
// Effect 1580: 出手时对手体力高于最大体力的1/{0}则造成伤害的{1}%恢复自身体力
type Effect1580 struct {
node.EffectNode
shouldHeal bool
}
func (e *Effect1580) Skill_Use() bool {
if len(e.Args()) < 2 || e.Ctx().Opp == nil || e.Ctx().Opp.CurrentPet == nil {
return true
}
maxThreshold := e.Ctx().Opp.CurrentPet.GetMaxHP().Div(e.Args()[0])
if e.Ctx().Opp.CurrentPet.GetHP().Cmp(maxThreshold) <= 0 {
return true
}
e.shouldHeal = true
return true
}
func (e *Effect1580) DamageAdd(zone *info.DamageZone) bool {
if !e.shouldHeal || zone == nil || zone.Type != info.DamageType.Red || e.Ctx().Our == nil {
return true
}
if len(e.Args()) < 2 {
return true
}
heal := zone.Damage.Mul(e.Args()[1]).Div(hundred)
if heal.Cmp(alpacadecimal.Zero) > 0 {
e.Ctx().Our.Heal(e.Ctx().Our, &action.SelectSkillAction{}, heal)
}
e.shouldHeal = false
return true
}
// Effect 1581: 出手时对手体力低于最大体力的1/{0}则造成的伤害提升{1}%
type Effect1581 struct{ node.EffectNode }
func (e *Effect1581) Damage_Mul(zone *info.DamageZone) bool {
if zone == nil || zone.Type != info.DamageType.Red || len(e.Args()) < 2 || e.Ctx().Opp == nil || e.Ctx().Opp.CurrentPet == nil || e.Ctx().SkillEntity == nil || e.Ctx().SkillEntity.Category() == info.Category.STATUS || e.Ctx().SkillEntity.AttackTime == 0 {
return true
}
threshold := e.Ctx().Opp.CurrentPet.GetMaxHP().Div(e.Args()[0])
if e.Ctx().Opp.CurrentPet.GetHP().Cmp(threshold) >= 0 {
return true
}
zone.Damage = zone.Damage.Mul(hundred.Add(e.Args()[1])).Div(hundred)
return true
}
// Effect 1582: {0}%令对手{1}{2}%令自身{3},均未触发则为自身附加{4}点护盾
type Effect1582 struct{ node.EffectNode }
func (e *Effect1582) Skill_Use() bool {
if len(e.Args()) < 5 || e.Ctx().Our == nil {
return true
}
opponentTriggered := false
if ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100); ok {
opponentTriggered = applyStatusByID(e.Ctx().Our, e.Ctx().Opp, int(e.Args()[1].IntPart()))
}
selfTriggered := false
if ok, _, _ := e.Input.Player.Roll(int(e.Args()[2].IntPart()), 100); ok {
selfTriggered = applyStatusByID(e.Ctx().Our, e.Ctx().Our, int(e.Args()[3].IntPart()))
}
if opponentTriggered || selfTriggered {
return true
}
e.Ctx().Our.AddShield(e.Args()[4])
return true
}
func init() {
input.InitEffect(input.EffectType.Skill, 1578, &Effect1578{})
input.InitEffect(input.EffectType.Sub, 1578, &Effect1578Sub{})
input.InitEffect(input.EffectType.Skill, 1579, &Effect1579{})
input.InitEffect(input.EffectType.Sub, 1579, &Effect1579Sub{})
input.InitEffect(input.EffectType.Skill, 1580, &Effect1580{})
input.InitEffect(input.EffectType.Skill, 1581, &Effect1581{})
input.InitEffect(input.EffectType.Skill, 1582, &Effect1582{})
}