mcpField
G
godot-turn-system

godot-turn-system

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

关于 godot-turn-system

面向 Godot 开发者的回合制系统设计技能,涵盖回合顺序、行动点、阶段以及 ATB 和时间线模型。通过专用脚本提供确定性处理与联网回合超时模式。

主要功能

  1. 01支持多种回合模型
  2. 02管理回合队列与阶段
  3. 03校验行动点消耗
  4. 04确定性处理先攻顺序
  5. 05实现联网回合超时

适用场景

  1. 01构建战术游戏的轮次流程
  2. 02实现 ATB 战斗进度条
  3. 03为时间线界面预测行动顺序
  4. 04为联网对局设置超时自动结束

安装

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

$npx skills add https://github.com/thedivergentai/game-dev-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