162 lines
4.0 KiB
Go
162 lines
4.0 KiB
Go
|
|
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"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
func transferPositiveProps(owner, source, target *input.Input) bool {
|
|||
|
|
if owner == nil || source == nil || target == nil {
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
transferred := false
|
|||
|
|
for idx, level := range source.Prop[:] {
|
|||
|
|
if level <= 0 {
|
|||
|
|
continue
|
|||
|
|
}
|
|||
|
|
if source.SetProp(owner, int8(idx), 0) {
|
|||
|
|
target.SetProp(owner, int8(idx), level)
|
|||
|
|
transferred = true
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return transferred
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func reducePetSkillPP(pet *info.BattlePetEntity, value int) bool {
|
|||
|
|
if pet == nil || value <= 0 {
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
changed := false
|
|||
|
|
for idx := range pet.Info.SkillList {
|
|||
|
|
if pet.Info.SkillList[idx].PP <= 0 {
|
|||
|
|
continue
|
|||
|
|
}
|
|||
|
|
if pet.Info.SkillList[idx].PP <= uint32(value) {
|
|||
|
|
pet.Info.SkillList[idx].PP = 0
|
|||
|
|
} else {
|
|||
|
|
pet.Info.SkillList[idx].PP -= uint32(value)
|
|||
|
|
}
|
|||
|
|
changed = true
|
|||
|
|
}
|
|||
|
|
return changed
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func divineMarkLayers(target *input.Input) int {
|
|||
|
|
if target == nil {
|
|||
|
|
return 0
|
|||
|
|
}
|
|||
|
|
return target.CurrentDivineEnergy()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func pickBanishedPet(target *input.Input) *info.BattlePetEntity {
|
|||
|
|
if target == nil {
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
// The current codebase has no explicit "banished" pet state yet.
|
|||
|
|
// Keep the fallback path intact until a dedicated representation exists.
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Effect 1533: 造成的攻击伤害低于{0}时附加大量真实伤害
|
|||
|
|
type Effect1533 struct{ node.EffectNode }
|
|||
|
|
|
|||
|
|
func (e *Effect1533) Skill_Use() bool {
|
|||
|
|
if len(e.Args()) == 0 || e.Ctx().SkillEntity == nil || e.Ctx().SkillEntity.Category() == info.Category.STATUS || e.Ctx().SkillEntity.AttackTime == 0 {
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
if e.Ctx().Our.SumDamage.Cmp(e.Args()[0]) >= 0 {
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
dealTrueDamage(e.Ctx().Our, e.Ctx().Opp, e.Args()[0])
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Effect 1534: 100%令对手随机1个被放逐的精灵所有技能PP值-1,若对手不存在被放逐的精灵则令对手当前精灵所有技能PP值-1
|
|||
|
|
type Effect1534 struct{ node.EffectNode }
|
|||
|
|
|
|||
|
|
func (e *Effect1534) Skill_Use() bool {
|
|||
|
|
if e.Ctx().Opp == nil {
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if pet := pickBanishedPet(e.Ctx().Opp); pet != nil && reducePetSkillPP(pet, 1) {
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
reducePetSkillPP(e.Ctx().Opp.CurrentPet, 1)
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Effect 1535: 对手存在神印则当回合自身先制+1
|
|||
|
|
type Effect1535 struct{ node.EffectNode }
|
|||
|
|
|
|||
|
|
func (e *Effect1535) ComparePre(fattack, sattack *action.SelectSkillAction) bool {
|
|||
|
|
if divineMarkLayers(e.Ctx().Opp) <= 0 {
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
current := actionByPlayer(fattack, sattack, e.Ctx().Our.UserID)
|
|||
|
|
if current == nil || current.SkillEntity == nil {
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
current.SkillEntity.XML.Priority++
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Effect 1536: 全属性+{0},对手存在神印时强化效果翻倍
|
|||
|
|
type Effect1536 struct{ node.EffectNode }
|
|||
|
|
|
|||
|
|
func (e *Effect1536) Skill_Use() bool {
|
|||
|
|
if len(e.Args()) == 0 {
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
boost := int8(e.Args()[0].IntPart())
|
|||
|
|
if divineMarkLayers(e.Ctx().Opp) > 0 {
|
|||
|
|
boost *= 2
|
|||
|
|
}
|
|||
|
|
applyAllPropUp(e.Ctx().Our, boost)
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Effect 1537: 消耗自身所有护罩并造成等量固定伤害,若当前护罩值低于{0}则造成的固定伤害翻倍
|
|||
|
|
type Effect1537 struct{ node.EffectNode }
|
|||
|
|
|
|||
|
|
func (e *Effect1537) Skill_Use() bool {
|
|||
|
|
if e.Ctx().Our == nil || e.Ctx().Opp == nil {
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
shield := e.Ctx().Our.CurrentShield()
|
|||
|
|
if shield.Cmp(alpacadecimal.Zero) <= 0 {
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
damage := e.Ctx().Our.ConsumeAllShield()
|
|||
|
|
if damage.Cmp(alpacadecimal.Zero) <= 0 {
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
if len(e.Args()) > 0 && shield.Cmp(e.Args()[0]) < 0 {
|
|||
|
|
damage = damage.Mul(alpacadecimal.NewFromInt(2))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
e.Ctx().Opp.Damage(e.Ctx().Our, &info.DamageZone{
|
|||
|
|
Type: info.DamageType.Fixed,
|
|||
|
|
Damage: damage,
|
|||
|
|
})
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func init() {
|
|||
|
|
input.InitEffect(input.EffectType.Skill, 1533, &Effect1533{})
|
|||
|
|
input.InitEffect(input.EffectType.Skill, 1534, &Effect1534{})
|
|||
|
|
input.InitEffect(input.EffectType.Skill, 1535, &Effect1535{})
|
|||
|
|
input.InitEffect(input.EffectType.Skill, 1536, &Effect1536{})
|
|||
|
|
input.InitEffect(input.EffectType.Skill, 1537, &Effect1537{})
|
|||
|
|
}
|