小游戏与竞技活动
返回总览。本模块包括体育、射击/飞行训练、竞速、工作型活动、室内双人活动、赌场和街机等。目录分类并不完全按玩法语义,例如刺杀任务和 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>