mcpField
G
godot-turn-system

godot-turn-system

github.com/thedivergentai开发925318 次安装3 周前更新
代码仓库

关于 godot-turn-system

用于在 Godot 中实现回合制战斗系统的技能,涵盖回合与先攻队列、ATB 计量及时间线模型。重点包括确定性排序、行动点校验、战术网格和联网回合超时处理。

主要功能

  1. 01回合阶段与先攻队列
  2. 02ATB 计量与异步行动
  3. 03带回合预测的时间线模型
  4. 04行动点校验模式
  5. 05基于 AStarGrid2D 的战术网格辅助
  6. 06权威式联网回合超时

适用场景

  1. 01实现回合制战术战斗
  2. 02构建 ATB 计量或预测时间线
  3. 03防止无效行动和联网回合停滞

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/thedivergentai/game-design-agentic-skills --skill godot-turn-system

安装后在 Claude Code 中输入/godot-turn-system确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
elite-turn-patterns.md
migration-notes.md
scripts/
active_time_battle.gd
combat_stats_resource.gd
timeline_turn_manager.gd
turn_predictor.gd
turn_system_patterns.gd

详细介绍

绝对不要做(专家级反模式)

顺序与确定性
  • 绝对不要在每个操作后重新计算回合顺序;严格地每轮只排序一次,或仅在与速度相关的属性发生变化时排序,以防止出现 O(n log n) 延迟。

  • 绝对不要使用随机方式打破先攻平局;严格使用次级静态属性(敏捷、ID 或持久的“运气”)来实现可确定性重放。

  • 绝对不要在遍历回合顺序队列时修改该队列;严格遍历 duplicate() 的副本,或在循环结束后修改队列。

  • 绝对不要使用立即执行的 call_group() 广播全局回合状态变化;严格使用 call_group_flags(SceneTree.GROUP_CALL_DEFERRED, ...),以避免通知数百个单位时造成帧卡顿。

  • 绝对不要将 Node 层级作为事实来源;严格使用 Dictionary 棋盘状态记录逻辑网格坐标。

逻辑与行动经济
  • 绝对不要在验证之前扣除行动点(AP);严格先调用 can_perform_action(cost),再执行 current_ap -= cost,以防止漏洞。
  • 绝对不要硬编码阶段转换(if phase == 0);严格使用 enum + match 或专用状态机来管理抽牌、主要和结束阶段。
  • 绝对不要在内部清理之前发出“回合结束”信号;严格在通知下一回合之前重置 AP 并处理状态效果。
  • 绝对不要使用精确浮点相等判断(==)检查 AP;严格使用 >= 或 is_equal_approx() 进行可靠比较。
战术网格与 UI
  • 绝对不要将通用 AStar2D 用于瓦片网格;严格使用 AStarGrid2D,以实现快 10 倍的寻路并原生处理对角线。
  • 更改障碍物状态后,绝对不要忘记对 AStarGrid2D 调用 update();如果切换了 set_point_solid(),则必须先刷新网格,才能进行下一次查询。
  • 绝对不要用 while 循环锁住主线程来处理输入;严格使用 await 关键字或信号,让执行让出控制权并返回 Tree。
  • 绝对不要使用 is_action_pressed() 处理回合决策;严格使用 is_action_just_pressed() 处理离散且逐帧锁定的菜单输入。
  • 绝对不要在联网游戏中跳过回合超时处理;严格实现服务端计时器,并设置默认的“跳过”操作,以防止恶意拖延。请参阅下方的联网回合超时黄金路径。

决策树 — 选择回合模型

需求选择必需脚本
离散回合(国际象棋 / 战术游戏 / 卡牌阶段)回合 + 先攻队列 + AP 阶段turn_system_patterns.gd
连续量表(FF 风格 ATB)在 _process 中填充每个行动者的量表active_time_battle.gd
时间线 / CTB,带有打断与预测事件时间线 + 预测 UItimeline_turn_manager.gd

不要在代码中另创第四种模型。编码前请先阅读对应脚本。

专家级组件(scripts/)

TurnManager Autoload — 仅包含接口契约

保持 Autoload 精简。不要在此粘贴完整的队列计算逻辑 — 请在上方选定的脚本中实现。

# turn_manager.gd (AutoLoad) — contract only
extends Node
signal turn_started(combatant: Node)
signal turn_ended(combatant: Node)
signal round_ended
signal turn_timed_out(combatant: Node)  # multiplayer: server default-pass

func start_combat(participants: Array[Node]) -> void: pass
func end_turn() -> void: pass
func request_pass(combatant: Node) -> void: pass  # default action on timeout

联网回合超时(标准路径)

引用自 NEVER:时钟由服务端掌控;客户端永远不能决定“跳过”。

  1. 收到 turn_started 时,服务端启动一个一次性 Timer / SceneTreeTimer(权威)。
  2. 超时后:服务端调用 request_pass(current)(或自动结束回合),然后发出 turn_timed_out。
  3. 客户端只负责渲染倒计时;绝不在本地修改回合队列。
  4. 与 godot-multiplayer-networking 搭配使用,以支持主机权威 RPC。

行动点(契约)

func can_perform_action(cost: int) -> bool:
    return current_action_points >= cost

func perform_action(cost: int) -> bool:
    if not can_perform_action(cost):
        return false
    current_action_points -= cost
    return true

阶段:优先使用 enum Phase { DRAW, MAIN, END } + match,或转到 godot-state-machine-advanced。完整的 ATB / 时间线运算位于 MANDATORY 脚本中——不要在此处重复 Elite 代码片段。

深度配方(按需查阅)

LLM 忽略规则:如果通用 Agent 在阅读前不会知道某项内容,就将其放在此处或 scripts/ 中——绝不要删除,只能移动。

主题参考
ATB / 预测 / 预览elite-turn-patterns.md

参考

渐进式披露:仅在研究特定 API 时打开官方文档链接; 将工作路由给相关领域时加载相关技能——不要预加载整个技能网络。

官方文档
  • 空闲和物理处理 — 何时应将回合计时放在 _process、_physics_process 或纯事件步骤中。
  • 使用信号 — 无需轮询量表即可处理回合开始 / 回合结束 / 单位行动事件。
  • 资源 — 将先攻 / 速度属性作为 Resource,用于模拟和 UI 预测。
  • 单例(Autoload) — TurnManager 的所有权边界。
  • GDScript 基础知识 — 使用 await 编排多阶段回合。
  • Object — 回合总线侦听器的信号连接标志。
  • SceneTree — 在菜单处理回合选择时暂停游戏。
  • Timer — 无需忙等循环的可选实时回合计时器。
  • Tween — 为 ATB 量表和回合交接效果制作动画。
  • AnimationPlayer — 必须在下一回合开始前完成的行动动画。
  • MultiplayerAPI — 联网对局中的权威回合顺序。
  • JSON — 用于平衡测试的确定性回合回放 / 种子日志。
相关技能
前置条件
补充
下游 / 使用方
主索引
  • godot-master — 用于回合系统的库路由器与镜像模块入口。

评论

支持 Markdown