在线联机原型全集:第 11 章 团队塔防

团队塔防(Team Tower Defense) 类别:实时协作塔防 + AOI 同步 + 资源共享 + 一致性结算 目标:验证 AOI(兴趣区域)同步、队伍资源共享(经济同步)、权威服结算与快照、断线重连与回放、延迟队列驱动的波次调度。 原型代号:proto-011-team-td 依赖模块 …

团队塔防(Team Tower Defense)

  • 类别:实时协作塔防 + AOI 同步 + 资源共享 + 一致性结算
  • 目标:验证 AOI(兴趣区域)同步、队伍资源共享(经济同步)、权威服结算与快照、断线重连与回放、延迟队列驱动的波次调度。
  • 原型代号proto-011-team-td
  • 依赖模块proto-001-echo-chat(底座通讯)、proto-002-rps(锁步回合同步雏形)
  • 推荐语言栈:Go / Java / Rust / TypeScript
  • 协议栈:HTTP(匹配/编排/回放) + WebSocket(战斗实时流) + Cron/DelayQueue(波次与任务调度)

1. 设计纲要(Design Brief)

塔防游戏(Tower Defense, 简称 TD)是即时策略与资源规划的经典结合体。
而“团队塔防(Team Tower Defense)”的设计目标,
是要验证一种多玩家、实时协作、共享经济、区域同步的混合型原型系统。

目标场景:2–4 名玩家协作,基于网格化地图建塔、协同升级与技能联动,抵御多路径敌军波次进攻。以 AOI 限域同步 降低广播开销,验证 共享经济 + 权威结算 + 快照/回放 + 重连恢复 的一套完整联机内核。

1.1 核心循环(Core Loop)

  1. 进入房间 → 准备阶段(资源/塔点预规划)
  2. 波次调度(DelayQueue)→ 敌军生成与路径推进(服务器权威)
  3. 玩家操作:建塔/升级/卖塔/释放技能/资源捐赠
  4. 服务器按帧执行:塔攻击 → 敌军受击/状态 → 奖励/掉落 → 资源入账
  5. 波间结算与团队分配 → 下一波开始
  6. 终局:通关 / 基地 HP 归零 → 结果快照 → 录像落盘

完整一局约 3–5 分钟,可循环运行多轮。

1.2 成功标准(验收口径)

  • 同步性:≥95% 操作在 150ms 内达成“观察者可见”(同 AOI)。
  • 一致性:客户端状态偏差 < 1%(资源/血量/塔等级误差率)。
  • 容灾:断线 10s 内重连恢复,重放 ≤ 2s 完成。
  • 扩展性:128 房间并发、每房 6 人、每房地图对象(塔+怪)峰值 1,200。
  • 可观察性:战斗日志、经济日志、广播指标与热点 AOI 视图完整。

2. 世界与地图(World & Map)

2.1 地图结构

  • 尺寸:128×128 Tile 网格;可参数化(64/96/128)。
  • 路径:3–5 条敌军路径(Waypoints),支持分叉与汇合。
  • 塔位(Build Slots):预设可建点 + 限位规则(路径旁 2 格内可建)。
  • AOI 网格:8×8 的 AOI Cell(每 Cell ≈ 16×16 Tile),邻区广播。

2.2 数据定义(简化)

{
  "map_id": "ttd_forest_01",
  "tiles": [/* 索引或压缩RLE */],
  "paths": [
    {"id":"p1","waypoints":[[4,120],[10,100], ... ,[120,4]]}
  ],
  "build_slots":[{"id":"b_001","x":12,"y":98,"tags":["ground"]}],
  "aoi": {"cell_size":16}
}

3. 实体与战斗(Entities & Combat)

3.1 敌军(Creep)

  • 基础字段id,type,hp,armor,speed,elem,resist,position,path_id,ai_state
  • 状态:减速(slow)、灼烧(burn)、缴械(disarm)、护盾(shield)
  • 掉落:金币、能量碎片(团队共享池/个人钱包依据模式)

3.2 防御塔(Tower)

  • 类型:箭塔(单体DPS)、炸弹塔(AOE)、冰塔(控制)、激光塔(穿透)
  • 升级:Lv1–Lv5;协作升级 支持多名玩家联合支付→触发团队光环
  • 光环样例:双人+10% 攻速;三人+15% 射程;全员+5% 暴击+群体微治疗

3.3 技能(Skills)

  • 个人技能:瞬发/引导,冷却绑定角色
  • 团队技能:需要共享能量,如“全图冰封 3s”“临时护盾 10s”

3.4 公式(参考)

  • 伤害期望:D = (atk - armor) * (1 + crit_rate*crit_multi) * elem_bonus * buffs
  • 减速叠加:slow = 1 - Π(1 - slow_i)(避免线性叠加超标)
  • 经济加成:按参与度(伤害/控制/击杀/支援)分配权重

4. 经济与共享(Economy & Sharing)

4.1 模式

  • 完全共享:所有金币入团队池,由队长/投票分配(或策略自动分配)
  • 半共享(推荐):每波基础金平均 + 绩效金按权重分 + 个人击杀金
  • 完全独立:教学/休闲

4.2 经济事件

  • GoldEarn(room, player, amount, reason)
  • Donate(room, from, to, amount)(队友捐赠)
  • LockTower(room, towerId)(协作升级锁定)
  • UpgradeShared(room, towerId, contrib[])

4.3 事务与一致性

  • 单房间内使用 单分区顺序日志(Kafka/Raft/内存 WAL)+ 原子批处理

    • 帧内聚合“经济变更” → 一次性应用(幂等 txn_id
    • 最终一致事件 推送至 AOI 观察者(带 versionhash

5. 同步模型(Sync Model)

5.1 帧参数

  • 逻辑帧:100ms/帧(10 FPS 服务端逻辑)
  • 通知与渲染:客户端 60 FPS 插值表现(预测 ≤ 150ms)

5.2 输入与广播

  • 客户端仅上传“意图”(Place/Upgrade/Sell/Skill/Donate),服务器权威
  • 广播采用 AOI 限域 + 邻区 “边界膨胀”(padding=1 cell)
  • 高频(位置/HP)→ 压缩状态包;低频(建塔/升级/技能)→ 事件包

5.3 快照与重连

  • 1s 全量快照(结构化 + 位姿流)存环形缓冲(近 60s)
  • 重连:下发最近快照 + 增量事件回放(since_version
  • 录像:战斗结束将帧日志/快照索引落盘供复盘

6. AOI 系统(Area of Interest)

6.1 划分

  • 网格 AOI:16×16 Tile 为一 Cell
  • 订阅集S(player) = cell(player) ∪ neighbors(cell)
  • 对象索引:每对象维护“当前所属 Cell 列表”

6.2 事件路由

  • 位置更新 → AOI 更新 → 差集计算(离开/进入观察集)
  • Publish(key=aoi:cellId, event)Fanout 给订阅者
  • 控制背压:Cell 级消息队列限速 + 合并(coalesce)相同目标的频繁属性

7. 房间与匹配(Rooms & Matchmaking)

7.1 房间生命周期

  1. Init:拉起战斗服实例,加载地图
  2. Ready:玩家进房,准备、分配建塔预案
  3. Active:波次运行(若干回合)
  4. End:结算/录像/清理
  5. Destroy:释放房间(T+30s 容错缓冲)

7.2 匹配队列(简)

  • 队伍规模段位/胜率延迟 为主键
  • 超时回退:3 人也可开局(动态难度降阶)

8. 协作机制(Co-Op Mechanics)

8.1 协作升级(核心特色)

  • 提交协作请求 → 服务器锁定塔位(lock_ttl=3s
  • 聚合多名玩家贡献(金币/能量)→ 升级成功 → 触发团队光环
  • 失败(超时/撤销/断线)→ 自动回滚贡献

8.2 支援信道

  • SOS:标记防线失守风险 → AOI 邻区收到提醒
  • Assist:派发临时炮台/地形陷阱(消耗共享能量)
  • Donate:快捷捐赠指定金额(固定档位 + 输入)

9. 协议与消息(Protocol & Messages)

9.1 会话

  • 认证:HTTP 登录 → JWT → 升级 WebSocket(子协议 ttd.v1
  • 心跳ping/pong 5s;空闲踢出:60s

9.2 典型消息(精简)

// C2S: 建塔
{"op":"tower.place","rid":"R123","slot":"b_001","type":"arrow","nonce":"x"}
// S2C: 建塔确认(AOI 广播)
{"ev":"tower.placed","rid":"R123","id":"t_789","slot":"b_001","owner":"P2","lv":1,"v":1024}

// C2S: 协作升级提交
{"op":"tower.upgrade.shared","rid":"R123","tower":"t_789","contrib":{"gold":120},"nonce":"y"}
// S2C: 协作升级成功(团队光环)
{"ev":"tower.upgraded","rid":"R123","id":"t_789","lv":2,"aura":"aspd+10%","v":1031}

// S2C: 快照(重连/校准)
{"ev":"snapshot","rid":"R123","tick":880,"state":{ /* 压缩 */ },"v":1100}

注:所有事件携带单调递增版本号 vtick;客户端按 v 校正乱序。

10. 服务器架构(Server Architecture)

Client
  └─WS──► Gateway(鉴权/路由/限流/心跳)
           └─► Matchmaker(队列/编队)
           └─► RoomMgr(房间编排/伸缩)
                └─► BattleServer(单房)
                     ├─ FrameLoop(100ms)
                     ├─ AOI Service(Cell PubSub)
                     ├─ Tower/Enemy Systems
                     ├─ Economy & Txn Log
                     ├─ Snapshot/Replay
                     └─ WaveScheduler(DelayQueue)
  • 部署:单房间单进程(轻量),叠加多实例;或 多房共进程(共享线程池)。
  • 数据:房间内存态 + 异步持久(Result/Replay)
  • 可选:同区多房共享 AOI Broker(进程内 Bus 或 NATS/Redis Stream)

11. 调度与波次(Waves & Scheduler)

11.1 调度

  • DelayQueueT+Δ 投递:生成怪、Boss、随机事件
  • Cron 触发赛季/日常任务刷新(非战斗时段)

11.2 波次模板

waves:
  - id: 1
    spawns:
      - type: grunt
        count: 20
        path: p1
        interval_ms: 500
    reward:
      base_gold: 120
  - id: 10
    spawns:
      - type: boss_golem
        count: 1
        path: p3
    reward:
      base_gold: 500
      chest: epic

12. 反作弊与容错(Security & Fault Tolerance)

  • 输入鉴别:服务器判权 + 语义校验(塔位合法/冷却/资源充足)
  • 重放与篡改nonce + ts;重复 nonce 拒绝
  • 预测与回滚:客户端仅弱预测 UI,状态以权威帧为准
  • 断线重连:快照 + 增量补齐;期间服务器仍推进
  • 幂等事务txn_id 与 WAL 去重

13. 指标与日志(Metrics & Logging)

13.1 指标(Prometheus 语义)

  • ws_active_sessions, room_active_total, frame_exec_ms
  • aoi_broadcast_qps, aoi_cell_backlog
  • econ_txn_rate, econ_rollback_count
  • reconnect_latency_ms, snapshot_size_bytes
  • tick_drift_ms(客户端→服务器漂移估计)

13.2 日志通道

  • BattleLog:帧→事件(放置/击杀/Boss 死亡)
  • EconomyLog:入账、支出、捐赠、协作升级
  • AuditLog:异常操作、失败原因
  • PerfLog:广播合并率、背压触发、热点 AOI

14. 客户端(Client)

14.1 前端栈

  • Web:TypeScript + WebGL/WebGPU(表现层独立于逻辑)
  • 预测:UI 即时反馈,实际以服务器确认覆盖
  • 插值/外推:怪物位置线性插值;状态条平滑过渡

14.2 UI 关键界面

  • 队伍资源面板(共享池/个人钱包/捐赠快捷键)
  • 协作升级弹窗(贡献条/超时倒计时)
  • AOI 观测边界提示(出入区域动画)
  • 波次时间线与事件轨(即将到来的精英/Boss)

15. 数据结构与存储(Data & Storage)

15.1 热态(内存)

  • RoomStateAOI IndexFrameBufferTxnAccumulator
  • 键空间:room:{id}:*(可落入本地 KV 做热备)

15.2 冷态(持久)

  • 战斗结果(SQL/OLAP):胜负、用时、伤害、贡献、资源曲线
  • 录像索引(对象存储):room_id/date/seq → 帧日志与快照切片
  • 平衡表(JSON/YAML):塔/怪/技能参数

16. 负载与容量规划(Capacity Planning)

维度目标
每房广播平均 1–3 KB/帧/人(AOI 合并后)
网关连接10k WS/实例(Go epoll/kqueue)
战斗服64–128 房/实例(多房共进程)
存储录像每房 10–30 MB/局(压缩)

17. 测试计划(Test Plan)

17.1 单元/仿真

  • 战斗逻辑:塔射击→命中→抗性→DOT/Slow 叠加
  • 经济事务:协作升级并发提交→一致性→回滚
  • AOI:移动穿越 Cell 边界 → 订阅差集正确

17.2 压测

  • 广播压力:热点 Cell 怪群 + 集中技能 → 背压曲线
  • 重连风暴:同时 20% 客户端断开 → 恢复时延
  • 波次峰值:Boss + Adds(召唤小怪) → 帧耗跟踪

17.3 回归

  • 版本回放相同性(录像 → 重演 → Hash 对比)
  • 资源泄露与 GC 抖动分析(p99 帧耗稳定)

18. 风险与对策(Risks & Mitigations)

风险影响对策
AOI 热点广播尖峰合并/限速;扩邻区仅对慢变更
协作升级竞争体验撕扯锁+TTL;投票快速决策
重连期间位姿漂移画面撕裂最近快照+插值;HUD 提示“同步中”
波次模板失衡策略崩塌A/B 参数与 Telemetry 曲线校准

19. 玩法拓展(Modes & LiveOps)

  • PvP-TD:双方互派怪(经济对冲)
  • 无尽模式:爬榜,周榜结算
  • 工坊(UGC):塔/地图脚本沙箱(Lua/QuickJS),审核与签名
  • 赛季制:科技树与皮肤通行证

20. 里程碑(Milestones)

  1. M1(2 周):单人塔防 + 波次调度 + 录像落盘(本地)
  2. M2(+2 周):2–4 人联机 + AOI 广播 + 断线重连
  3. M3(+2 周):协作升级 + 半共享经济 + 指标告警
  4. M4(+2 周):Boss/精英生态 + 快照回放 + 压测报表
  5. M5(+2 周):UGC 地图 + 赛季通行证(雏形)

21. 开发清单(Backlog 摘要)

  • AOI 索引与订阅差集算法
  • 帧内经济事务聚合器(WAL/幂等)
  • 协作升级锁与贡献汇聚
  • DelayQueue 波次与事件调度器
  • 录像编码与增量回放
  • 指标/日志/热图(AOI 热点)
  • 压测脚本与对抗场景库

22. 验收剧本(Playbook)

  • 剧本 A:三人分线 + 双人协作升二级冰塔 → 波 5 精英冻结成功,基地无伤
  • 剧本 B:共享经济偏置给新手 → 新手线稳态,通过捐赠/支援弥补短板
  • 剧本 C:Boss 波处置 → 团队技能链(护盾→冰封→爆裂)+ 资源极值测试
  • 剧本 D:断线重连风暴 → 10 名客户端轮流断线,快照恢复验证

23. 总结

《团队塔防》不仅是一款多人协作塔防原型,更是:

  1. 一个 多人同步与AOI技术沙盒
  2. 一个 资源共享与团队经济的实验模型
  3. 一个 战斗结算、一致性同步、快照回放的综合验证环境

该项目具备以下验证价值:

  • ✅ 可验证分布式AOI广播系统;
  • ✅ 可验证共享经济同步机制;
  • ✅ 可验证多人一致性、快照回放与断线重连;
  • ✅ 可演进至PvP塔防或SLG混合原型;
  • ✅ 可作为 后续大型游戏(如SLG/MMO)战斗服核心雏形

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页