Files
bl/logic/service/fight/effect/1573_1577.go
xinian 0f862453cb
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
feat: 实现战斗效果1543-1547和1573-1577
2026-04-04 01:17:25 +08:00

244 lines
6.4 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/action"
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
"blazing/logic/service/fight/node"
"github.com/alpacahq/alpacadecimal"
"github.com/gogf/gf/v2/util/grand"
)
const (
statusSaintEffect = 3001
statusDemonEffect = 3002
)
var hundred = alpacadecimal.NewFromInt(100)
func isStatusActive(target *input.Input, statusID int) bool {
if target == nil || statusID <= 0 {
return false
}
eff := target.GetEffect(input.EffectType.Status, statusID)
return eff != nil && eff.Alive()
}
func addStatusByID(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 1573: 自身为圣念状态时下2回合受到的攻击伤害减少50%自身为邪念状态时下2回合造成的攻击伤害提升50%
type Effect1573 struct{ node.EffectNode }
func (e *Effect1573) DamageDivEx(zone *info.DamageZone) bool {
if zone == nil || zone.Type != info.DamageType.Red {
return true
}
if hasSaint := isStatusActive(e.Ctx().Our, statusSaintEffect); hasSaint {
zone.Damage = zone.Damage.Div(alpacadecimal.NewFromInt(2))
return true
}
if isStatusActive(e.Ctx().Our, statusDemonEffect) {
zone.Damage = zone.Damage.Mul(alpacadecimal.NewFromInt(3)).Div(alpacadecimal.NewFromInt(2))
}
return true
}
// Effect 1574: 附加自身攻击值与速度值总和{0}%的百分比伤害,每次使用增加{1}%,最高{2}%
type Effect1574 struct {
node.EffectNode
currentPercent alpacadecimal.Decimal
increment alpacadecimal.Decimal
maxPercent alpacadecimal.Decimal
}
func (e *Effect1574) SetArgs(t *input.Input, a ...int) {
e.EffectNode.SetArgs(t, a...)
if len(a) >= 1 {
e.currentPercent = alpacadecimal.NewFromInt(int64(a[0]))
}
if len(a) >= 2 {
e.increment = alpacadecimal.NewFromInt(int64(a[1]))
}
if len(a) >= 3 {
e.maxPercent = alpacadecimal.NewFromInt(int64(a[2]))
}
if e.maxPercent.Cmp(alpacadecimal.Zero) <= 0 {
e.maxPercent = alpacadecimal.NewFromInt(100)
}
}
func (e *Effect1574) DamageAdd(zone *info.DamageZone) bool {
if zone == nil || zone.Type != info.DamageType.Red || e.Ctx().SkillEntity == nil || e.Ctx().SkillEntity.Category() == info.Category.STATUS {
return true
}
if e.currentPercent.Cmp(alpacadecimal.Zero) <= 0 {
return true
}
sum := e.Ctx().Our.GetProp(0).Add(e.Ctx().Our.GetProp(4))
if sum.Cmp(alpacadecimal.Zero) <= 0 {
return true
}
extra := sum.Mul(e.currentPercent).Div(hundred)
if extra.Cmp(alpacadecimal.Zero) <= 0 {
return true
}
zone.Damage = zone.Damage.Add(extra)
if e.increment.Cmp(alpacadecimal.Zero) > 0 && e.currentPercent.Cmp(e.maxPercent) < 0 {
e.currentPercent = e.currentPercent.Add(e.increment)
if e.currentPercent.Cmp(e.maxPercent) > 0 {
e.currentPercent = e.maxPercent
}
}
return true
}
// Effect 1575: 下{0}回合后出手则对手{1}
type Effect1575 struct{ node.EffectNode }
func (e *Effect1575) Skill_Use() bool {
if len(e.Args()) < 2 {
return true
}
sub := e.Ctx().Our.InitEffect(input.EffectType.Sub, 1575, int(e.Args()[0].IntPart()), int(e.Args()[1].IntPart()))
if sub != nil {
e.Ctx().Our.AddEffect(e.Ctx().Our, sub)
}
return true
}
type Effect1575Sub struct {
RoundEffectArg0Base
statusID int
}
func (e *Effect1575Sub) SetArgs(t *input.Input, a ...int) {
e.EffectNode.SetArgs(t, a...)
e.Duration(-1)
e.CanStack(false)
if len(a) >= 1 {
e.Duration(a[0])
}
if len(a) >= 2 {
e.statusID = a[1]
}
}
func (e *Effect1575Sub) ComparePre(fattack, sattack *action.SelectSkillAction) bool {
if e.Ctx().SkillEntity == nil || e.Ctx().SkillEntity.Category() == info.Category.STATUS {
return true
}
if e.IsFirst() {
return true
}
addStatusByID(e.Ctx().Our, e.Ctx().Opp, e.statusID)
e.Alive(false)
return true
}
// Effect 1576: 消耗自身全部体力,使对手{0}回合内无法通过自身技能恢复体力
type Effect1576 struct{ node.EffectNode }
func (e *Effect1576) Skill_Use() bool {
if e.Ctx().Our == nil || e.Ctx().Opp == nil || e.Ctx().Our.CurrentPet == nil {
return true
}
damage := e.Ctx().Our.CurrentPet.GetHP()
if damage.Cmp(alpacadecimal.Zero) <= 0 {
return true
}
e.Ctx().Our.Damage(e.Ctx().Our, &info.DamageZone{Type: info.DamageType.Fixed, Damage: damage})
if len(e.Args()) == 0 {
return true
}
sub := e.Ctx().Our.InitEffect(input.EffectType.Sub, 1576, int(e.Args()[0].IntPart()))
if sub != nil {
e.Ctx().Opp.AddEffect(e.Ctx().Our, sub)
}
return true
}
type Effect1576Sub struct {
RoundEffectArg0Base
}
func (e *Effect1576Sub) Heal_Pre(ac action.BattleActionI, value *int) bool {
if value == nil || *value <= 0 {
return true
}
skill, ok := ac.(*action.SelectSkillAction)
if !ok || skill.GetPlayerID() != e.Ctx().Opp.Player.GetInfo().UserID {
return true
}
*value = 0
return true
}
// Effect 1577: {0}回合做{1}-{2}次攻击当前技能PP值小于{3}时连击上限为{4}
type Effect1577 struct {
RoundEffectArg0Base
}
func (e *Effect1577) Skill_Use() bool {
if len(e.Args()) < 5 {
return true
}
sub := e.Ctx().Our.InitEffect(input.EffectType.Sub, 1577, e.SideEffectArgs...)
if sub != nil {
e.Ctx().Our.AddEffect(e.Ctx().Our, sub)
}
return true
}
func (e *Effect1577) SkillHit() bool {
if len(e.Args()) < 5 || e.Ctx().SkillEntity == nil || e.Ctx().SkillEntity.Category() == info.Category.STATUS || e.Ctx().SkillEntity.AttackTime == 0 {
return true
}
minHits := int(e.Args()[1].IntPart())
maxHits := int(e.Args()[2].IntPart())
if maxHits < minHits {
maxHits = minHits
}
times := minHits
if maxHits > minHits {
times = minHits + grand.Intn(maxHits-minHits+1)
}
if skill := e.Ctx().SkillEntity.Info; skill != nil {
threshold := e.Args()[3].IntPart()
if threshold >= 0 && int(skill.PP) <= int(threshold) {
times = int(e.Args()[4].IntPart())
}
}
if times <= 1 {
return true
}
e.Ctx().SkillEntity.AttackTime += uint32(times - 1)
return true
}
func init() {
input.InitEffect(input.EffectType.Skill, 1573, &Effect1573{})
input.InitEffect(input.EffectType.Skill, 1574, &Effect1574{})
input.InitEffect(input.EffectType.Skill, 1575, &Effect1575{})
input.InitEffect(input.EffectType.Sub, 1575, &Effect1575Sub{})
input.InitEffect(input.EffectType.Skill, 1576, &Effect1576{})
input.InitEffect(input.EffectType.Sub, 1576, &Effect1576Sub{})
input.InitEffect(input.EffectType.Skill, 1577, &Effect1577{})
}