Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
新增大量战斗效果逻辑实现,包括效果ID 678-708、734-743、744-748,并更新对应的效果描述映射。
216 lines
5.2 KiB
Go
216 lines
5.2 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"
|
||
)
|
||
|
||
// Effect 734: 若对手不处于能力提升或下降状态时则恢复{0}点体力
|
||
type Effect734 struct {
|
||
node.EffectNode
|
||
}
|
||
|
||
func (e *Effect734) OnSkill() bool {
|
||
if len(e.Args()) == 0 || e.Ctx().Opp.HasPropADD() || e.Ctx().Opp.HasPropSub() {
|
||
return true
|
||
}
|
||
|
||
e.Ctx().Our.Heal(e.Ctx().Our, &action.SelectSkillAction{}, e.Args()[0])
|
||
return true
|
||
}
|
||
|
||
// Effect 735: 若对手处于能力提升状态则下{0}回合先制+{1}
|
||
type Effect735 struct {
|
||
node.EffectNode
|
||
}
|
||
|
||
func (e *Effect735) Skill_Use() bool {
|
||
if len(e.Args()) < 2 || !e.Ctx().Opp.HasPropADD() {
|
||
return true
|
||
}
|
||
|
||
effect := e.Ctx().Our.InitEffect(input.EffectType.Sub, 735, int(e.Args()[0].IntPart()), int(e.Args()[1].IntPart()))
|
||
if effect != nil {
|
||
e.Ctx().Our.AddEffect(e.Ctx().Our, effect)
|
||
}
|
||
return true
|
||
}
|
||
|
||
type Effect735Sub struct {
|
||
RoundEffectArg0Base
|
||
}
|
||
|
||
func (e *Effect735Sub) ComparePre(fattack, sattack *action.SelectSkillAction) bool {
|
||
if len(e.Args()) < 2 {
|
||
return true
|
||
}
|
||
|
||
current := actionByPlayer(fattack, sattack, e.Ctx().Our.UserID)
|
||
if current == nil || current.SkillEntity == nil {
|
||
return true
|
||
}
|
||
|
||
current.SkillEntity.XML.Priority += int(e.Args()[1].IntPart())
|
||
return true
|
||
}
|
||
|
||
// Effect 736: 消除对手能力提升状态,消除成功则{0}回合内令对手使用的属性技能无效
|
||
type Effect736 struct {
|
||
node.EffectNode
|
||
}
|
||
|
||
func (e *Effect736) OnSkill() bool {
|
||
if len(e.Args()) == 0 {
|
||
return true
|
||
}
|
||
|
||
cleared := false
|
||
for i, v := range e.Ctx().Opp.Prop[:] {
|
||
if v <= 0 {
|
||
continue
|
||
}
|
||
if e.Ctx().Opp.SetProp(e.Ctx().Our, int8(i), 0) {
|
||
cleared = true
|
||
}
|
||
}
|
||
if !cleared {
|
||
return true
|
||
}
|
||
|
||
effect := e.Ctx().Our.InitEffect(input.EffectType.Sub, 736, int(e.Args()[0].IntPart()))
|
||
if effect != nil {
|
||
e.Ctx().Opp.AddEffect(e.Ctx().Our, effect)
|
||
}
|
||
return true
|
||
}
|
||
|
||
type Effect736Sub struct {
|
||
RoundEffectArg0Base
|
||
}
|
||
|
||
func (e *Effect736Sub) SkillHit_ex() bool {
|
||
if e.Ctx().SkillEntity == nil || e.Ctx().SkillEntity.Category() != info.Category.STATUS {
|
||
return true
|
||
}
|
||
|
||
e.Ctx().SkillEntity.SetNoSide()
|
||
return true
|
||
}
|
||
|
||
// Effect 737: {0}%使对手{1},若没有触发,则回合结束时减少对手1/{2}最大体力
|
||
type Effect737 struct {
|
||
node.EffectNode
|
||
}
|
||
|
||
func (e *Effect737) OnSkill() bool {
|
||
if len(e.Args()) < 3 {
|
||
return true
|
||
}
|
||
|
||
success, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100)
|
||
if success {
|
||
statusType := int(e.Args()[1].IntPart())
|
||
statusEff := e.Ctx().Our.InitEffect(input.EffectType.Status, statusType)
|
||
if statusEff != nil {
|
||
statusEff.SetArgs(e.Ctx().Our, 2)
|
||
e.Ctx().Opp.AddEffect(e.Ctx().Our, statusEff)
|
||
}
|
||
return true
|
||
}
|
||
|
||
effect := e.Ctx().Our.InitEffect(input.EffectType.Sub, 737, int(e.Args()[2].IntPart()))
|
||
if effect != nil {
|
||
e.Ctx().Our.AddEffect(e.Ctx().Our, effect)
|
||
}
|
||
return true
|
||
}
|
||
|
||
type Effect737Sub struct {
|
||
FixedDuration1Base
|
||
}
|
||
|
||
func (e *Effect737Sub) TurnEnd() {
|
||
if len(e.Args()) == 0 || e.Args()[0].IntPart() <= 0 {
|
||
e.Alive(false)
|
||
return
|
||
}
|
||
|
||
damage := e.Ctx().Opp.CurrentPet.GetMaxHP().Div(e.Args()[0])
|
||
e.Ctx().Opp.Damage(e.Ctx().Our, &info.DamageZone{
|
||
Type: info.DamageType.Percent,
|
||
Damage: damage,
|
||
})
|
||
e.Alive(false)
|
||
}
|
||
|
||
// Effect 738: {0}回合内若对手使用属性技能,则使用属性技能后的下{1}回合攻击技能无法造成伤害且命中效果失效
|
||
type Effect738 struct {
|
||
node.EffectNode
|
||
}
|
||
|
||
func (e *Effect738) Skill_Use() bool {
|
||
effect := e.Ctx().Our.InitEffect(input.EffectType.Sub, 738, e.SideEffectArgs...)
|
||
if effect != nil {
|
||
e.Ctx().Our.AddEffect(e.Ctx().Our, effect)
|
||
}
|
||
return true
|
||
}
|
||
|
||
type Effect738Sub struct {
|
||
RoundEffectArg0Base
|
||
}
|
||
|
||
func (e *Effect738Sub) Skill_Use_ex() bool {
|
||
if len(e.Args()) < 2 || e.Ctx().SkillEntity == nil || e.Ctx().SkillEntity.Category() != info.Category.STATUS {
|
||
return true
|
||
}
|
||
|
||
lock := e.Ctx().Our.InitEffect(input.EffectType.Sub, 7381, int(e.Args()[1].IntPart()))
|
||
if lock != nil {
|
||
e.Ctx().Opp.AddEffect(e.Ctx().Our, lock)
|
||
}
|
||
return true
|
||
}
|
||
|
||
type Effect738Lock struct {
|
||
RoundEffectArg0Base
|
||
}
|
||
|
||
func (e *Effect738Lock) SkillHit() bool {
|
||
if e.Ctx().SkillEntity == nil || e.Ctx().SkillEntity.Category() == info.Category.STATUS {
|
||
return true
|
||
}
|
||
|
||
e.Ctx().SkillEntity.SetNoSide()
|
||
return true
|
||
}
|
||
|
||
func (e *Effect738Lock) Damage_Mul(zone *info.DamageZone) bool {
|
||
if zone == nil || zone.Type != info.DamageType.Red {
|
||
return true
|
||
}
|
||
if e.Ctx().SkillEntity == nil || e.Ctx().SkillEntity.Category() == info.Category.STATUS {
|
||
return true
|
||
}
|
||
|
||
zone.Damage = alpacadecimal.Zero
|
||
return true
|
||
}
|
||
|
||
func init() {
|
||
input.InitEffect(input.EffectType.Skill, 734, &Effect734{})
|
||
input.InitEffect(input.EffectType.Skill, 735, &Effect735{})
|
||
input.InitEffect(input.EffectType.Sub, 735, &Effect735Sub{})
|
||
input.InitEffect(input.EffectType.Skill, 736, &Effect736{})
|
||
input.InitEffect(input.EffectType.Sub, 736, &Effect736Sub{})
|
||
input.InitEffect(input.EffectType.Skill, 737, &Effect737{})
|
||
input.InitEffect(input.EffectType.Sub, 737, &Effect737Sub{})
|
||
input.InitEffect(input.EffectType.Skill, 738, &Effect738{})
|
||
input.InitEffect(input.EffectType.Sub, 738, &Effect738Sub{})
|
||
input.InitEffect(input.EffectType.Sub, 7381, &Effect738Lock{})
|
||
}
|