docs(effect): 移除未实现任务文档 task-320 移除 effects 2215-2219 的未实现任务文档,这些 effect 已经被重新评估 或通过其他方式处理,不再需要单独的任务跟踪文档。 ```
This commit is contained in:
@@ -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,优先补核心逻辑或补充明确的不可实现说明。
|
||||
226
logic/service/fight/effect/1665_1669.go
Normal file
226
logic/service/fight/effect/1665_1669.go
Normal file
@@ -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{})
|
||||
}
|
||||
Reference in New Issue
Block a user