Files
bl/docs/effect-refactor-summary-2026-03-28.md
xinian 87fdccaddf
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat: 实现大量技能效果及战斗逻辑修复
2026-03-30 00:51:18 +08:00

23 KiB
Raw Blame History

Effect 重构会话总结2026-03-28

1. 本次会话完成内容

1.1 注释与说明统一

  • 已将 logic/service/fight/effect 下效果注释统一为:
    • // Effect <id>: <desc>
  • 说明来源:
    • public/config/effectInfo.json

1.2 结构整理与公共能力抽取

  • 新增并使用了子效果统一挂载 helper
    • addSubEffect(...)
  • 已清理 effect 目录中的 GenSub(...) 直接调用残留,统一走 helper。

1.3 回合类基类(组合继承)已落地

  • 当前已引入的 base位于 logic/service/fight/effect/sub_effect_helper.go

    • RoundEffectArg0Base
    • RoundEffectSideArg0Base
    • FixedDuration1Base
    • FixedDurationNeg1Base
    • FixedDuration2Base
    • RoundEffectArg1Base
    • RoundEffectSideArg1Base
    • RoundEffectSideArg0Minus1Base
    • RoundEffectSideArg0Minus1CanStackBase
  • 已有大量效果结构体改为嵌入上述 base删除重复 SetArgs 模板代码。

1.4 编译状态

  • 已多轮执行并通过:
    • go test ./logic/service/fight/effect

1.5 本轮新增 effect 实现

  • 新增缺失效果实现:

    • 400 若和对手属性相同,则技能威力翻倍
    • 480 {0}回合内自身所有攻击威力为两倍
    • 586 {0}回合内自己的属性攻击必中
    • 599 {0}回合内受到{1}伤害减少{2}%
    • 610 遇到天敌时先制+{0}
    • 611{0}回合自身使用攻击技能则附加{1}点固定伤害
    • 613 {0}回合内自身令对手使用的{1}系攻击技能无效
    • 573 {0}回合内若自身能力提升状态被消除或吸取则{1}%使对手{2}``{3}回合
    • 587 {0}回合内若被对手击败则对手损失{1}点体力造成致命伤害时对手剩余1点体力
    • 591 造成伤害大于{0},则下{1}回合自己所有直接攻击先制+{2}
    • 592{0}回合每回合使用攻击技能{1}%令对手{2}
    • 594 造成的伤害低于{0}{1}%令对手{2}
    • 596 技能使用成功时,{0}%给予对手冻伤、中毒、烧伤中任意一种异常状态
    • 597 {0}回合内每回合使用技能吸取对手最大体力的1/{1}
    • 598 {0}%恢复自己所有技能PP值{1}
    • 627 对手处于能力提升状态时附加其{0}{1}%的百分比伤害
    • 628 若对手处于能力下降状态则造成伤害的{0}%恢复体力
    • 629 消除{0}状态,消除成功下回合自身先制+{1}
    • 630 {0}回合内{1}状态被消除,则有{2}%概率使对手{3}
    • 631 消除{0}状态,消除成功下回合造成伤害提升{1}%
    • 632 造成伤害{0}``{1},则下{2}回合必定暴击
    • 633 造成伤害{0}``{1},则造成伤害的{2}%恢复体力
    • 634 若当前体力{0}对手,则造成伤害的{1}%恢复体力
    • 635 吸收对手能力上升状态,吸收成功,下回合先制+{0}
    • 636 消除{0}状态,消除成功则令对手{1}
    • 637 若对手处于异常状态,则对手{0}``{1}
    • 638 若对手{0},技能威力提升{1}%
    • 639 造成伤害{0}``{1},则下{2}回合所有技能附带{3}点固定伤害
    • 640 命中后{0}%使对手{1}``{2}回合,遇到天敌概率翻倍
    • 641 命中后{0}%使对手进入流血状态
    • 401 若和对手属性相同,则技能威力翻倍
    • 585 技能使用成功时,{0}
    • 589 复制对手{0}的能力提升状态
    • 590 使对手{0}{6}%弱化效果翻倍
    • 593 附加{0}{1}值的{2}%的百分比伤害
    • 595 技能使用成功时,{0}%使对手{1},若没有触发,则对手{2}
  • 已同步更新:

    • logic/service/fight/effect/effect_info_map.go

1.6 本轮新增文件

  • logic/service/fight/effect/400_480_586_599_610_611_613.go
  • logic/service/fight/effect/573_587_591_592_594_596_597_598.go
  • logic/service/fight/effect/627_631.go
  • logic/service/fight/effect/632_636.go
  • logic/service/fight/effect/637_641.go
  • logic/service/fight/effect/effect_info_map.go

1.7 本轮验证

  • 已执行:
    • go test ./service/fight/effect
  • 结果:
    • 通过

1.8 本轮结论

  • 当前这轮更适合按“低风险、可复用现有模式”的 effect 小批次推进,而不是一次性追求 effectInfo.json 全量覆盖。
  • 现有 effect 目录里已经有不少“共享实现 + 批量注册”的写法,后续判断缺失项时不能只靠 grep InitEffect(...)
  • 文档第 3 节里的“未实现”列表目前仍是历史扫描快照,只能作为候选列表,不能直接当最终事实使用。

2. 当前仍保留自定义 SetArgs 的效果(建议下一轮重点)

以下属于“非纯模板”或“仍待抽象”的 SetArgs

  • Effect570570.go
  • Effect123effect_119_123.go
  • Effect41effect_41.go
  • Effect42effect_42.go
  • Effect46effect_46.go
  • Effect47effect_47.go
  • Effect48effect_48.go
  • Effect60effect_60.go
  • EffectPropSyncReverseeffect_attr.go
  • SelfKillselfkill.go

建议分三类继续抽 base

  • 随机回合/随机次数类(如 41、42
  • 次数型常驻类(如 46、47、48、SelfKill、570
  • “SetArgs + 额外上下文初始化”类(如 Effect123、EffectPropSyncReverse

3. 未实现(或疑似未实现)效果清单

3.0 从 effectInfo.json 提取的“未实现”总览(自动扫描)

  • JSON 配置总效果数:2112
  • 代码已注册效果数Skill338
  • JSON 中存在但代码未注册:1779
  • 代码中注册但 JSON 无对应条目:521, 31, 41, 42, 174

说明:

  • 这个口径是“配置覆盖率”不是“bug 数量”。
  • 其中大量属于未来版本/未迁移内容,不建议一次性全补;建议按战斗系统实际启用范围分批实现。
  • 以下列表为上一轮扫描快照,未随本轮新增实现实时回算。
  • 此外,扫描脚本若未把“共享实现中的批量注册”统计进去,也会把已实现效果误判成缺失。

JSON 中存在但代码未注册(示例前 60 项):

  • 2, 10, 11, 12, 14, 15, 16, 17, 22, 30
  • 38, 40, 45, 51, 55, 56, 61, 64, 66, 67
  • 70, 78, 84, 86, 92, 94, 96, 97, 99, 102
  • 103, 104, 106, 108, 109, 114, 118, 132, 133, 139
  • 141, 158, 162, 167, 168, 185, 401, 421, 431, 529
  • 543, 554, 569, 573, 581, 582, 583, 584, 585, 586

3.1 明确标记未实装

  • 文件存在明确标记:
    • logic/service/fight/effect/529.go未实装

3.2 已注册但缺少同名 Effect{id} 结构体(需人工确认是否由合并实现覆盖)

  • 53
  • 74
  • 75
  • 186
  • 402
  • 433
  • 446
  • 451
  • 463
  • 497
  • 564
  • 588

说明:

  • 这类通常可能是“多个 id 共用一个结构体实现”或“命名与 id 不一致”,需要逐个确认是否真正缺失行为。

3.3 疑似未实现(扫描规则:存在 Effect{id} 类型,但没有核心战斗 Hook

  • 519effect_519.go
  • 532532.go
  • 552552.go
  • 560560.go
  • 576576.go

说明:

  • 这批是“高优先级人工复查项”,不一定真的没实现,可能通过组合/间接机制生效。

3.4 当前更可信的“下一批候选”

这一组是结合本轮人工核对后,仍然值得优先继续补的缺失 effect 候选:

  • 当前文档 3.4 中这批候选已在本轮补齐。

说明:

  • 这批大多是 58x/59x 段的新效果,和当前目录中已有实现重叠较少。
  • 相比继续深挖旧扫描误差,这批更适合直接新增文件推进。

4. 下次继续的建议顺序

建议严格按下面顺序继续,不要重新从全量扫描开始:

  1. 先复核文档 3.4 里的候选项是否仍未实现。
  2. 优先补“单次触发、命中附加、固定伤害、恢复、概率状态”这类低风险逻辑。
  3. 再处理“复制对手状态 / 多分支条件 / 触发链式子效果”的 58x/59x 复杂效果。
  4. 最后再回头处理文档 2 中那些仍保留自定义 SetArgs 的结构整理。

本轮更推荐的下一批实现顺序:

  • 第一组:529 / 552 / 560 / 576
  • 第二组:10 / 11 / 12 / 14 / 15 / 16
  • 第三组:94 / 99 / 103 / 114

5. 下一次继续让我实现时可直接复制的指令

可直接用下面这句发起:

继续处理 effect按 docs/effect-refactor-summary-2026-03-28.md 的 3.3 和 4 执行:先复核 529/552/560/576再补低风险状态附加类 10/11/12/14/15/16每实现一批就更新同一文档和 effect_info_map.go并跑 go test ./service/fight/effect。

如果你希望按 JSON 覆盖率推进,可用这句:

继续处理 effect按 docs/effect-refactor-summary-2026-03-28.md 的 3.0 从低风险效果开始补实现先补状态附加类10/11/12/14/15/16/94/99/103/114每实现一批就更新文档中的“已实现列表”和“剩余列表”。


6. 扫描口径说明(供后续排查)

  • 已注册效果 ID 扫描来源:
    • InitEffect(input.EffectType.Skill, <id>, ...)
    • initskill(<id>, ...)
  • 但这还不够,后续扫描必须额外统计这些“共享实现/批量注册”文件:
    • sterStatusEffects.go
    • effect_power_doblue.go
    • EffectAttackMiss.go
    • EffectPhysicalAttackAddStatus.go
    • EffectDefeatTrigger.go
    • effect_attr.go
    • effect_EffectConditionalAddDamage.go
    • effect_74_75.go
    • effect_104_109.go
  • Effect{id} 结构体与方法扫描来源:
    • logic/service/fight/effect/*.go
  • “疑似未实现”判断是启发式,不是最终结论,仍需代码级确认。

7. 这次改动涉及的关键文件

  • public/config/effectInfo.json
  • logic/service/fight/effect/400_480_586_599_610_611_613.go
  • logic/service/fight/effect/573_587_591_592_594_596_597_598.go
  • logic/service/fight/effect/effect_info_map.go
  • logic/service/fight/effect/sub_effect_helper.go
  • docs/effect-refactor-summary-2026-03-28.md

8. 2026-03-29 增量记录

8.1 本轮补齐的 effect

  • 663 {0}回合内若对手使用攻击技能则{1}%使对手{2}
  • 664 若先出手则当回合对手无法造成攻击伤害
  • 665 造成的伤害低于{0}{1}回合内自身受到的伤害减少{2}
  • 666 使自身下回合攻击必定先手、必定暴击
  • 667 自身为满体力时{0}{1}

8.2 实现口径

  • 663 复用与 614 同类的“对手使用攻击技能时触发”路径,在 Skill_Use_ex() 中按概率给对手附加状态。
  • 664 复用 170 的先手免伤模式,在 DamageLockEx() 中将当回合受到的攻击伤害归零。
  • 665 按技能实参 250 3 100 的实际使用方式,落为“低于阈值则给自己挂 3 回合 100 点固定减伤子效果”,不是百分比减伤。
  • 666 落为仅对下回合攻击技能生效的先手与暴击保证:ComparePre() 强制先手,ActionStart() 强制暴击。
  • 667 按配置说明“自身攻击+a、防御+b、特攻+c、特防+d、速度+e、命中+f”处理仅在满体力时给自己附加前 6 项能力等级。

8.3 本轮新增文件

  • logic/service/fight/effect/663_667.go

8.4 本轮同步更新

  • logic/service/fight/effect/effect_info_map.go
  • docs/effect-unimplemented-tasks/task-013-effects-663-667.md 已完成,可从任务目录移除

8.5 本轮验证

  • cd /workspace/logic && go test ./service/fight/effect
  • cd /workspace/logic && go build ./...

9. 2026-03-29 增量记录(二)

9.1 本轮补齐的 effect

  • 668 若对手处于能力提升状态则先制额外+1
  • 669 当回合击败对手则下回合自身攻击先制+1
  • 670 {0}回合,每回合附加{1}{2}值的{3}%的百分比伤害
  • 671 若对手处于异常状态则恢复造成伤害的{0}%的体力
  • 672 当回合击败对手则恢复自身全部体力

9.2 实现口径

  • 668 复用 539 的条件先制模式,在 ComparePre() 中于对手存在能力提升状态时直接给当前技能先制+1。
  • 669 按“当回合击败后,为下回合攻击技能生效”处理:在 SwitchOut() 中标记击败成立,下一回合 ComparePre() 仅对攻击技能追加先制+1。
  • 670 参照 419593 的组合语义,实现为回合类附加伤害:效果持续期间每次使用技能时,附加一次基于指定目标属性值的固定伤害。
  • 671 复用 687 的伤害回血模式,但条件改为“对手处于任意异常状态”。
  • 672 按击败即时触发处理:在对手因本次攻击退场时,立刻将自身体力回复至满值。

9.3 本轮新增文件

  • logic/service/fight/effect/668_672.go

9.4 本轮同步更新

  • logic/service/fight/effect/effect_info_map.go
  • docs/effect-unimplemented-tasks/task-014-effects-668-672.md 已完成,可从任务目录移除

9.5 本轮验证

  • cd /workspace/logic && go test ./service/fight/effect
  • cd /workspace/logic && go build ./...

10. 2026-03-29 增量记录(三)

10.1 本轮补齐的 effect

  • 642 {0}回合内若对手攻击技能命中则己方在场精灵{1}%做出{2}
  • 643 {0}%概率使对手{1}回合内{2}能力每回合变化{3}
  • 644 当回合未击败对手,则减少对手当前体力1/{0}
  • 645 体力低于1/{0}时威力{1}
  • 646 体力高于对手时,此技能命中后 100% 使对手能力下降

10.2 实现口径

  • 642moves.json1000642 的说明实现反击档位映射:0-5 分别对应 50/100/150/200/250/300 点固定伤害;挂在 defender 侧 Skill_Use_ex(),仅对命中的攻击技能生效。
  • 643 按真实技能实参 55 2 1 -1 这类布局处理为“命中后按概率给对手挂回合子效果”,子效果在 TurnEnd() 对指定能力执行一次 SetProp
  • 644 复用 579 的“未击败对手”判定时机,落在 Action_end(),按对手当前体力结算 1/n 的百分比伤害。
  • 645 复用 37 的低血线威力倍率模式,在 SkillHit() 中按当前体力是否低于最大体力 1/n 改写技能威力。
  • 646 未按任务文档里的占位 param 硬编码;改按实际技能配置的 6 段能力变化参数通用处理,仅在自身体力高于对手且本次技能命中后生效。

10.3 本轮新增文件

  • logic/service/fight/effect/642_646.go

10.4 本轮同步更新

  • logic/service/fight/effect/effect_info_map.go
  • docs/effect-unimplemented-tasks/task-009-effects-642-646.md 已完成,可从任务目录移除

11. 2026-03-29 增量记录(四)

11.1 本轮补齐的 effect

  • 769 若对手不处于异常状态则造成的攻击伤害额外提升{0}%
  • 770 若对手处于异常状态,则恢复自身全部体力
  • 771 {0}回合内每次使用攻击技能都有{1}%概率使对手进入任意一种异常状态
  • 772 {0}回合内若对手使用攻击技能则有{1}%概率随机进入烧伤、冻伤、中毒、麻痹、害怕、睡眠中的一种异常状态
  • 773 若自身体力低于对手则与对手互换体力

11.2 实现口径

  • 769 复用 1103 的条件增伤写法,在 SkillHit() 中仅对攻击技能生效,并在对手不存在任意异常状态时追加威力百分比。
  • 770 按技能结算后触发处理,落在 Skill_Use(),满足“对手处于异常状态”时直接回复自身满体力。
  • 771 作为回合类自身增益实现,持续期间在 OnSkill() 针对每次攻击技能按概率给对手附加一项随机异常状态。
  • 772 参照 559 的 defender 侧监听时机,落在 Skill_Use_ex();对手使用攻击技能时按概率附加六选一异常状态。
  • 773 复用 529 的直接改写当前体力思路,在满足“自身体力低于对手”时交换双方当前体力,并分别按各自最大体力上限截断。

11.3 本轮新增文件

  • logic/service/fight/effect/769_773.go

11.4 本轮同步更新

  • logic/service/fight/effect/effect_info_map.go
  • docs/effect-unimplemented-tasks/task-032-effects-769-773.md 已完成,可从任务目录移除

12. 2026-03-29 增量记录(五)

12.1 本轮补齐的 effect

  • 1498 随机附加烧伤、冻伤、失明、失神中的 {0} 种异常状态,未触发则自身下 {1} 回合造成的伤害提升 {2}%
  • 1499 体力低于最大体力的 1/3 时先制 +3
  • 1500 1 回合做 {0}-{1} 次攻击,自身处于护盾状态下连击上限为 {2}
  • 1501 命中后为对手种下一颗黑暗之种
  • 1502 对手身上存在黑暗之种时先制 +1

12.2 实现口径

  • 1498 复用 1111 的“未触发则挂自身增伤子效果”模式;随机状态池按任务文案落为烧伤、冻伤、失明、失神,若本次一个状态都未成功挂上,则给自身添加持续 {1} 回合的增伤子效果。
  • 1499 复用现有条件先制写法,在 ComparePre() 中按当前体力是否低于最大体力 1/3 直接修改当前技能优先级。
  • 1500 参照仓库现有多段技能处理口径,不做逐段攻击,而是在 Damage_Mul() 中按随机连击次数折算红伤倍率;若自身当前存在护盾,则用 {2} 约束连击上限。
  • 1501 作为挂在 defender 身上的持久子效果实现:命中后附加“黑暗之种”,前 4 次 TurnEnd() 随机扣 1 个技能 PP成熟后每回合所有技能 PP -1;下场后清除。
  • 1502ComparePre() 中检查对手是否持有 1501 的子效果,存在时当前技能先制 +1

12.3 模型假设

  • 仓库当前未注册“失神”状态,本轮按状态 ID 29 追加了一个最小可用实现,行为复用 StatusCannotAct
  • 1500 仍受当前战斗模型限制,只能按总连击数折算伤害,不能表现逐段命中、逐段触发的细粒度行为。

12.4 本轮新增文件

  • logic/service/fight/effect/1498_1502.go

12.5 本轮同步更新

  • logic/service/fight/effect/effect_info_map.go
  • docs/effect-unimplemented-tasks/README.md
  • docs/effect-unimplemented-tasks/task-177-effects-1498-1502.md 已完成,可从任务目录移除

12.6 本轮验证

  • cd /workspace/logic && go test ./service/fight/effect
  • cd /workspace/logic && go build ./...

13. 2026-03-29 增量记录(六)

13.1 本轮补齐的 effect

  • 1503 清除对手身上的黑暗之种,清除成功则令对手随机受到 1-500 点固定伤害
  • 1504 40% 令对手诅咒,若对手身上存在黑暗之种则概率翻倍
  • 1505 黑暗之种成长期时附加 200 点固定伤害,黑暗之种长大后固定伤害翻倍
  • 1506 若对手不是龙系精灵则恢复自身 {0} 点体力
  • 1507 {0} 回合内自身受到攻击则令对手随机进入 {1} 种异常状态,未触发则消除对手回合类效果

13.2 实现口径

  • 1503 复用本轮新增的黑暗之种清理 helperSkill_Use() 中清除对手持有的 1501 子效果;仅当成功清除时追加一次 1-500 的随机固定伤害。
  • 1504 按任务文案直接实现为基础 40% 概率,若对手当前仍持有黑暗之种则翻倍到 80%;仓库尚无诅咒状态注册,本轮补了一个最小可用的状态壳以承接后续联动。
  • 1505 读取 1501 子效果当前成长阶段:成长期附加 200 固定伤害,成熟后附加 400 固定伤害;若对手不存在黑暗之种则不触发。
  • 1506 使用宠物当前系别组合判断是否包含龙系;仅在对手主属性、副属性均不为龙系时恢复自身体力。
  • 1507 复用 1228 的 defender 侧监听模式,落在 Skill_Use_ex():对手使用攻击技能命中本体时,随机附加若干异常状态;若整段持续时间内一次都未成功触发,则在最后一回合结束时清除对手回合类效果。

13.3 模型假设

  • 仓库当前缺少“诅咒”状态实现,本轮按状态 ID 23 注册了一个最小 BaseStatus 版本,只提供状态存在性与常规下场清理,不额外附带持续结算逻辑。
  • 1505 的“黑暗之种成长期/长大后”判断直接复用 1501 子效果内部阶段计数:前 4 次回合结束视为成长期,第 5 次起视为成熟。

13.4 本轮新增文件

  • logic/service/fight/effect/1503_1507.go

13.5 本轮同步更新

  • logic/service/fight/effect/effect_info_map.go
  • docs/effect-unimplemented-tasks/README.md
  • docs/effect-unimplemented-tasks/task-178-effects-1503-1507.md 已完成,可从任务目录移除

13.6 本轮验证

  • cd /workspace/logic && go test ./service/fight/effect
  • cd /workspace/logic && go build ./...

14. 2026-03-30 增量记录(一)

14.1 本轮补齐的 effect

  • 1508 先出手时无视攻击免疫效果
  • 1509 令对手全属性-{0} 且随机 {1} 个技能 PP 值归零,技能无效时消耗自身全部体力并令对手全属性-1然后对手下 3 次使用技能消耗的 PP 值为 3 倍
  • 1510 {0} 回合内对手主动切换精灵则登场精灵 {1}% 随机进入 {2} 种异常状态
  • 1511 先出手时免疫当回合受到的攻击伤害,若对手为自身天敌则免疫并反弹给对手造成伤害值 {0}% 的百分比伤害
  • 1512 集结天幕四龙之神力,使自身下 2 回合先制+3且攻击必定命中、必定致命

14.2 实现口径

  • 1508 采用仓库现有模型下的局部支持方案:若自身本次先出手且使用攻击技能,则在伤害结算前临时屏蔽若干常见“攻击伤害清零类” immunity effect并在技能结算结束后恢复。
  • 1509 正常命中时直接令对手全属性下降并随机清空若干技能 PP若本次技能实体存在但 AttackTime == 0,则按“技能无效”分支处理:自损全部体力、令对手全属性-1并给对手挂 3 次 PP 三倍消耗子效果。
  • 1510 复用 1562 的“主动切换后对登场精灵生效”模式:效果挂在对手侧,仅在对手主动切换下场时置 pending登场后按概率随机附加若干异常状态。
  • 1511 复用 170/1011 的免疫伤害写法,落在 DamageLockEx();若自身先出手则直接免疫本回合受到的红伤,若对手同时为自身天敌,则按原伤害值 {0}% 追加一次百分比伤害反弹。
  • 1512 作为持续 2 回合的自身子效果实现,在 ComparePre() 中固定追加先制 +3,并在 ActionStart() 中对攻击技能同时赋予必中与必定致命。

14.3 模型假设

  • 1508 当前没有通用“无视攻击免疫”标记位,本轮仅覆盖仓库内已识别的常见攻击免疫 effect170/525/570/850/1011/1511。对其他未来新增或语义不同的 defender 侧免疫实现,不保证自动生效。
  • 1509 的“技能无效时”按仓库现有口径解释为“技能实体存在,但本次结算后 AttackTime == 0”,不把被控未出手、无 PP 无法释放这类情况算作技能无效。

14.4 本轮新增文件

  • logic/service/fight/effect/1508_1512.go

14.5 本轮同步更新

  • logic/service/fight/effect/effect_info_map.go
  • docs/effect-unimplemented-tasks/README.md
  • docs/effect-unimplemented-tasks/task-179-effects-1508-1512.md 已完成,可从任务目录移除

14.6 本轮验证

  • cd /workspace/logic && go test ./service/fight/effect
  • cd /workspace/logic && go build ./...