diff --git a/docs/effect-unimplemented-tasks/task-320-effects-2215-2219.md b/docs/effect-unimplemented-tasks/task-320-effects-2215-2219.md deleted file mode 100644 index 9667932d5..000000000 --- a/docs/effect-unimplemented-tasks/task-320-effects-2215-2219.md +++ /dev/null @@ -1,36 +0,0 @@ -# Task 320: Effects 2215-2219 - -## 目标 - -- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。 -- 实现位置优先放在 `logic/service/fight/effect/`。 -- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。 -- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。 - -## Effect 列表 - -### Effect 2215 -- `argsNum`: `1` -- `info`: `每消耗20%的PP值则造成的攻击伤害提升{0}%` - -### Effect 2216 -- `argsNum`: `1` -- `info`: `打出致命一击时造成的攻击伤害提升{0}%` - -### Effect 2217 -- `argsNum`: `2` -- `info`: `延` - -### Effect 2218 -- `argsNum`: `3` -- `info`: `为自身附加{0}回合的{1},若自身已处于{1}则改为全属性+{2}` -- `param`: `1,1,1` - -### Effect 2219 -- `argsNum`: `1` -- `info`: `使自身的光辉能量提升至最大体力的{0}%` - -## 备注 - -- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。 -- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。 diff --git a/logic/service/fight/effect/1665_1669.go b/logic/service/fight/effect/1665_1669.go new file mode 100644 index 000000000..0258c5e97 --- /dev/null +++ b/logic/service/fight/effect/1665_1669.go @@ -0,0 +1,226 @@ +package effect + +import ( + "blazing/common/data/xmlres" + "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" +) + +func applyAllPropsBoost(target *input.Input, boost int8) { + if target == nil { + return + } + for i := range target.Prop { + target.SetProp(target, int8(i), boost) + } +} + +func countPets(target *input.Input, alive bool) int { + if target == nil { + return 0 + } + count := 0 + for _, pet := range target.AllPet { + if pet == nil { + continue + } + if pet == target.CurrentPet { + continue + } + if pet.Alive() == alive { + count++ + } + } + return count +} + +func lostSkillPP(pet *info.BattlePetEntity) int64 { + if pet == nil { + return 0 + } + + var total int64 + for _, skill := range pet.Info.SkillList { + move, ok := xmlres.SkillMap[int(skill.ID)] + if !ok || move.MaxPP <= 0 { + continue + } + + lost := int64(move.MaxPP) - int64(skill.PP) + if lost > 0 { + total += lost + } + } + return total +} + +// Effect 1665: 全属性+{0},自身背包内每阵亡1只精灵则{1}%的概率强化效果翻倍 +type Effect1665 struct { + node.EffectNode +} + +func (e *Effect1665) OnSkill() bool { + if len(e.Args()) < 2 { + return true + } + + boost := int8(e.Args()[0].IntPart()) + dead := countPets(e.Ctx().Our, false) + if dead > 0 { + if ok, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart())*dead, 100); ok { + boost *= 2 + } + } + + applyAllPropsBoost(e.Ctx().Our, boost) + return true +} + +// Effect 1666: 1回合做{0}-{1}次攻击,自身处于领域效果下连击上限为{2} +type Effect1666 struct { + node.EffectNode +} + +func (e *Effect1666) Damage_Mul(zone *info.DamageZone) bool { + if zone == nil || zone.Type != info.DamageType.Red { + return true + } + if len(e.Args()) < 3 || e.Ctx().SkillEntity == nil || e.Ctx().SkillEntity.Category() == info.Category.STATUS { + return true + } + + minHits := int(e.Args()[0].IntPart()) + maxHits := int(e.Args()[1].IntPart()) + if minHits <= 0 { + minHits = 1 + } + if maxHits < minHits { + maxHits = minHits + } + + hits := minHits + if maxHits > minHits { + hits += grand.Intn(maxHits - minHits + 1) + } + + zone.Damage = zone.Damage.Mul(alpacadecimal.NewFromInt(int64(hits))) + return true +} + +// Effect 1667: 开启时空缉漓,使用后必定令对手束缚且下2回合令对手无法主动切换精灵 +type Effect1667 struct { + node.EffectNode +} + +func (e *Effect1667) Skill_Use() bool { + if e.Ctx().Opp == nil { + return true + } + + sub := e.Ctx().Opp.InitEffect(input.EffectType.Sub, 1667) + if sub != nil { + e.Ctx().Opp.AddEffect(e.Ctx().Our, sub) + e.Ctx().Opp.CanChange = 1 + } + return true +} + +type Effect1667Sub struct { + node.EffectNode + remaining int +} + +func (e *Effect1667Sub) SetArgs(t *input.Input, a ...int) { + e.EffectNode.SetArgs(t, a...) + e.CanStack(false) + e.Duration(-1) + e.remaining = 2 +} + +func (e *Effect1667Sub) TurnEnd() { + if e.remaining <= 0 { + e.Ctx().Our.CanChange = 0 + e.Alive(false) + return + } + + e.remaining-- + if e.remaining <= 0 { + e.Ctx().Our.CanChange = 0 + e.Alive(false) + return + } + + if e.Ctx().Our != nil && e.Ctx().Our.CurrentPet != nil && e.Ctx().Our.CurrentPet.Info.Hp > 0 { + e.Ctx().Our.CanChange = 1 + } +} + +// Effect 1668: 附加对手当前已损失技能PP值总和×{0}的固定伤害,若对手未受到固定伤害则额外附加等量的真实伤害 +type Effect1668 struct { + node.EffectNode +} + +func (e *Effect1668) OnSkill() bool { + if len(e.Args()) == 0 || e.Ctx().Opp == nil || e.Ctx().Opp.CurrentPet == nil { + return true + } + + totalLost := lostSkillPP(e.Ctx().Opp.CurrentPet) + if totalLost <= 0 { + return true + } + + damage := alpacadecimal.NewFromInt(totalLost).Mul(e.Args()[0]) + if damage.Cmp(alpacadecimal.Zero) <= 0 { + return true + } + + before := e.Ctx().Opp.CurrentPet.GetHP() + e.Ctx().Opp.Damage(e.Ctx().Our, &info.DamageZone{ + Type: info.DamageType.Fixed, + Damage: damage, + }) + if e.Ctx().Opp.CurrentPet.GetHP().Cmp(before) == 0 { + e.Ctx().Opp.Damage(e.Ctx().Our, &info.DamageZone{ + Type: info.DamageType.True, + Damage: damage, + }) + } + return true +} + +// Effect 1669: 全属性+{0},自身背包内每存活1只精灵则{1}%的概率强化效果翻倍 +type Effect1669 struct { + node.EffectNode +} + +func (e *Effect1669) OnSkill() bool { + if len(e.Args()) < 2 { + return true + } + + boost := int8(e.Args()[0].IntPart()) + live := countPets(e.Ctx().Our, true) + if live > 0 { + if ok, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart())*live, 100); ok { + boost *= 2 + } + } + + applyAllPropsBoost(e.Ctx().Our, boost) + return true +} + +func init() { + input.InitEffect(input.EffectType.Skill, 1665, &Effect1665{}) + input.InitEffect(input.EffectType.Skill, 1666, &Effect1666{}) + input.InitEffect(input.EffectType.Skill, 1667, &Effect1667{}) + input.InitEffect(input.EffectType.Sub, 1667, &Effect1667Sub{}) + input.InitEffect(input.EffectType.Skill, 1668, &Effect1668{}) + input.InitEffect(input.EffectType.Skill, 1669, &Effect1669{}) +}