CD Code Digest Hub /GTA V

小游戏与竞技活动

6 分钟阅读 6 个章节 1 张图

返回总览。本模块包括体育、射击/飞行训练、竞速、工作型活动、室内双人活动、赌场和街机等。目录分类并不完全按玩法语义,例如刺杀任务和 Tonya 系列也位于 Minigames。

1. 用独立子游戏接管有限的玩家体验#

小游戏通常有 launcher、活动核心、角色/道具数据、相机/UI、结果与清理几个部分。它既要实现自身规则,也要临时管理手机、特殊能力、通缉、输入和世界活动。其复杂度很大一部分来自如何安全进入和退出主世界。

内容族机制重点代表入口
网球、高尔夫连续动作、球体运动、专用 AI、回合规则Tennis/Golf
飞镖、掰手腕玩家轮次、局部相机、输入和同步AM_Darts、AM_Armwrestling
赛车、铁人三项、跳伞路线/检查点、排名、越界、载具和成绩racing、Triathlon、BaseJumping
飞行学校、靶场分阶段教学、目标和评分PilotSchool、Range
赌场桌/座位、下注、发牌、主机规则与客户端演出Blackjack 等
街机自身绘制、音效、计分和输入shared 中 arcade 公共头
出租车、拖车等世界中的重复工作循环Taxi、Towing

本篇以网球、飞镖、Blackjack 深读共性,其他族在目录覆盖中归并,不逐关卡重复描述。

2. 网球:入口很小,核心在公共库#

Tennis.sc 定义 IS_TENNIS_MULTIPLAYER=0,引入 tennis_core_lib.sch。入口建立 properties、status、SP data、UI data,区分自身与对手 ID。[S1]

其准备步骤包括设置小游戏状态、停用特殊能力、启用专用输入、打开音频场景、处理通缉、禁用手机、加载球/球拍/角色/动作资源、初始化双方 AI home position,最后进入活动状态。

网球还对对手设置 PCF_ForceNoTimesliceIntelligenceUpdate,说明精确交互中的关键 NPC 更新及时性比远景路人更重要。它不是要求整个游戏的 AI 都关闭分帧;这种例外应限于资源可控的局部活动。

清理入口登记多种 force-cleanup 原因,并恢复玩家服装等状态。玩法开始时“临时关掉什么”,结束时就要明确恢复什么,不能只删除球和球拍。

3. 飞镖证明单机目录不等于单机运行#

AM_Darts.sc 虽位于 singleplayer 下,却包含 MP_MISSION_DATA、玩家/观众计数、主机判断、MP 状态维护和在线 UI。[S2] 共享规则和表现代码通过模式分支复用,单机朋友活动和在线玩家对局可以共用核心机制。

因此分析/修改小游戏应从使用的核心 .sch 和启动参数追踪,而不只看所在目录。复用的收益是同一得分、动画和 UI 规则不必复制;风险则是 SP 假设不小心进入 MP 分支,例如暂停、参与者退出和同步对象控制权。

4. Blackjack:共享规则与个人表现分开#

Blackjack.sc 定义 server state、client state、playing、dealing、audio 等状态枚举,按桌处理发牌、座位请求、玩家手牌和荷官。[S3]

主循环先验证脚本应否终止、玩家是否仍在赌场/对应室内、室内切换和活动选项是否允许;随后所有玩家执行 client logic,仅当前 host 执行 server logic。非 host 若碰巧拥有荷官实体控制权,还会允许其 network ID 迁移,体现脚本主持与实体控制的分离。[S3,L11061]

本文不推断服务端如何验证随机牌序或支付;脚本中的主机规则、客户端动画和在线交易仍是不同层。

5. 规则、表现与成绩应保持分离#

比分/回合推进应有明确事实来源,动画和音效表现消费这些事实。否则多人中某个动画未播完就可能卡住全体规则,或重试表现时重复记分。输入锁定、退出提示、对手离开与成绩提交应作为活动状态机的一部分。

小游戏也是内容复用的好例子:同一规则适配不同球场、角色、难度和比赛长度;工作型活动则复用目的地、车辆/对象类别和计酬流程。新增变体时应验证成绩系统、100% 完成度、朋友关系和多人参与是否都需要更新。

源码证据#

[S1] Tennis.sc L1、L18、L25、L43–122;[S2] AM_Darts.sc L136、L190、L1216、L1412;[S3] Blackjack.sc L12–65、L9208、L10694、L11061;[S4] Golf.sc;[S5] 小游戏及公共街机目录。

[S1]: <../../../GTAV Source/script/dev_ng/singleplayer/scripts/Minigames/Tennis/Tennis.sc> [S2]: <../../../GTAV Source/script/dev_ng/singleplayer/scripts/Minigames/Darts/AM_Darts.sc> [S3]: <../../../GTAV Source/script/dev_ng/multiplayer/scripts/minigames/Blackjack/Blackjack.sc> [S4]: <../../../GTAV Source/script/dev_ng/singleplayer/scripts/Minigames/Golf/Golf.sc> [S5]: <../../../GTAV Source/script/dev_ng/shared/include/public>