Machinations 图示语言
Machinations Diagrams
Machinations 是 Joris Dormans 设计的可视化语言与在线模拟工具,用于创建、记录、模拟和测试游戏的内部经济。其理论前提是:玩法最终由有形、无形与抽象资源在游戏系统中的流动决定。图由存放资源的节点 (Nodes)、搬运资源的实线资源连接 (Resource Connections)、以及用当前状态去修改别处的虚线状态连接 (State Connections) 组成;语法足够严格,可被计算机按时间步执行,接近一种专门表示游戏机制的可视化编程语言。本页按第 5 章整理全部基本元素与《吃豆人》建模示例,并给出本 wiki 用 Mermaid 改画 Machinations 图的约定。
为什么需要它(第 5 章 The Machinations Framework,印刷页约 p.79–83)
- 机制与其结构特征大多藏在代码里;程序代码、有限状态图、Petri 网对设计师而言复杂难用,也不能在足够抽象的层面让反馈回路一眼可见。Machinations 力求易懂,同时保留结构特征与动态行为。
- Machinations 工具:外观类似 Visio 的 2D 绘图程序,运行时按时间步 (Time Step / Iteration) 执行图中规定的事件,一步完成后以新状态执行下一步,直到手动停止或满足图中设定的结束条件;可设置每步间隔。数字版的图在某种程度上"可玩"。
- 范围与细节层级:可以抽象到任意程度(早期《模拟城市》没算力模拟每辆车,只按路段计算交通密度)。常常只从单个玩家的视角建模即可,多人情形可以复制并组合单人图;在高抽象层级,实时与回合制差别往往不大。图的自然范围是单个玩家及其视角;工具没有为多人设计的功能(只有鼠标输入,无法限制谁的回合)——它是模拟工具,不是做可玩游戏的工具。图只帮助理解游戏,不能替代研究游戏本身。
现状说明:原书所述工具运行在 Adobe Flash Player 上(www.jorisdormans.nl/machinations)。Adobe 已于 2020-12-31 停止支持 Flash,并自 2021-01-12 起阻止 Flash 内容运行,所以原版工具已无法在现代浏览器中直接使用。
节点与连接的基础(第 5 章 Machinations Diagram Basic Elements,印刷页约 p.83–92)
池 (Pool):资源聚集的地方,画成空心圆,资源是叠在上面的小彩色圆;太多时显示数字(默认显示上限 25,可逐池设置;0 表示总显示数字)。池用来建模实体(如银行账户)。池只能存整数(账户只能存整美元,或改以美分计)。不同颜色区分不同资源;一个池可以存多种资源以表示复合实体,但初学时最好一种资源一个池(生命、能量、弹药各一个池)。
资源连接:实线箭头,旁边的标签是每个时间步能流过的资源数,无标签即 1,all 表示不限。进入节点的连接是该节点的输入,离开的是输出;连接的起点叫源头 (Origin),终点叫目标 (Target)。
随机流量:
| 写法 | 含义 |
|---|---|
D | 未指定的随机因素(画一个骰子图标;模拟时用侧栏 Dice 框的默认值) |
D6、D6+3、2D6、2D4+D8+D12 | 桌面 RPG 的骰子记法;不限于实体骰,可以用 5、7、35 面骰 |
25% | 每个时间步有 25% 概率流过 1 个 |
250% | 至少 2 个,另有 50% 概率再多 1 个 |
激活模式 (Activation Modes):每个时间步节点可能触发 (Fire),触发时沿连接推或拉资源。
| 模式 | 标记 | 何时触发 |
|---|---|---|
| 自动 (Automatic) | * | 每个时间步,所有自动节点同时触发 |
| 交互 (Interactive) | 双线轮廓 | 玩家动作(点击)时 |
| 起始动作 (Starting Action) | s | 只在第一个时间步之前触发一次 |
| 被动 (Passive) | 无标记 | 只在被其他元素的触发器触发时 |
拉与推:池触发时默认拉 (Pull)——按各输入的流量从上游拉资源;设为推 (Push) 模式(标 p)则沿输出推;只有输出的池总是推模式(省略 p)。资源不足时:默认"能拉多少拉多少";全有或全无 (All or None) 模式(标 &)在不能全部满足时一个也不拉/推。推模式节点可同时标 p 和 &。
沙漏例子:被动池 A 有 5 个资源,自动池 B 为空,B 每步从 A 拉 1 个,5 步后全部移到 B,状态不再变化。
时间模式 (Time Modes):
| 模式 | 规则 |
|---|---|
| 同步 (Synchronous) | 自动节点按固定间隔触发;玩家点击的交互节点在下一时间步与自动节点同时触发;同一步内可点多个交互节点,但每个只能点一次 |
| 异步 (Asynchronous,工具默认) | 自动节点仍按间隔触发,但交互节点点击后立即执行,一步内可多次点击 |
| 回合制 (Turn-Based) | 不按时间间隔,而是玩家用完每回合的行动点 (Action Points) 后,所有自动节点触发、开始新回合;交互节点可设 0 点,再加一个"结束回合"节点,就能做"随意行动直到声明结束"的游戏 |
拉取冲突(图 5.10):A 有 9 个资源,B 每步从 A 自动拉 1 个,C 与 D 每步都想从 B 拉 1 个。同步模式下资源不够两人分就谁都拉不到,于是每两步 C、D 同时各拉 1 个,9 步后 C=D=4、B 剩 1;异步或回合制模式下由一方拉到,优先权起初随机、此后每步交替,最终一方 4 个、另一方 5 个。
这与引擎中"同一帧内多个系统读写同一状态"的问题同源:同步模式相当于先读旧状态、统一提交(双缓冲),异步模式相当于按顺序立即生效(见 双缓冲、游戏循环与更新方法)。
状态连接(第 5 章 State Changes,印刷页约 p.88–92)
图的状态=资源在各节点间的当前分布。状态连接是虚线箭头,从控制节点(源头)指向目标——节点、资源连接,罕见地也可以是另一条状态连接。按所连元素与标签分四种:
| 类型 | 连接 | 标签 | 语义 |
|---|---|---|---|
| 标签修改器 (Label Modifier) | 节点 → 资源连接(或状态连接)的标签 | 以 +/- 开头,如 +2、-1、+1% | 下一步生效: |
| 节点修改器 (Node Modifier) | 节点 → 节点 | +3、-2,可为分数 +1/3 | ;可创造/销毁资源 |
| 触发器 (Trigger) | 节点 → 节点或资源连接 | * | 源头节点的所有输入都满足(每个输入都送来了其流量所标数量)时触发目标;无输入的节点自身触发时就发出触发 |
| 激活器 (Activator) | 节点 → 节点 | 条件:==0、<3、>=4、!=2、3-6 | 源头状态满足条件时目标可触发,否则被抑制 |
要点与例子:
- 标签修改器跟随变化量而非绝对值:标签
+3、源头增加 2,则目标标签加 6;源头减少 2,则减 6。正标签让目标"跟随"源头,负标签让目标"反向"。例(图 5.11):每往池 A 加 1 个资源,B→C 的流量加 2,于是第一次点击 B 时 1 个流向 A、3 个流向 C,第二次就是 5 个流向 C。例:《大富翁》中地产越多,其他玩家的钱流向你的随机流量越大(图 5.12 只示意原理)。 - 节点修改器:图 5.13 中 C 的数量=3×A 的数量−2×B 的数量。负修改器或重新分配可能让节点为负,表示短缺 (Shortage):不能从短缺节点拉资源,流入的资源先用来填补短缺。分数标签
n/d表示源头每跨过一个 d 的整数倍边界(向下取整)就改变 n:源头由 7 变 8 时,-2/4让目标减 2(⌊8/4⌋−⌊7/4⌋=1),+1/3不变(⌊8/3⌋=⌊7/3⌋)。例:《卡坦岛》每个村庄 1 分、每座城市 2 分——村庄数与城市数两个源头修改分数节点。作者提醒:节点修改器能凭空创造/销毁资源,适合"威胁等级"这类抽象资源,钥匙、生命这类资源最好用源和泄。 - 触发器常用来触发什么也不做的被动节点,让它只在特定情形发生时触发。例(图 5.14):《大富翁》把钱付给银行,触发地产从银行转到你手中。
- 激活器例(图 5.15):《凯吕斯 (Caylus)》把工人(资源)放到建筑上才能执行该建筑的特殊动作,如在金矿采金;图中的触发器表示每次采金后工人回到工人池。
高级节点类型(第 5 章 Advanced Node Types,印刷页约 p.92–98)
除池外还有七种节点(源、泄、转换器、交易器对应第 4 章的四种经济功能,见 内部经济)。其中一些能用池+连接巧妙拼出,专门节点只是为了让图不至于杂乱。
| 节点 | 原书图形 | 作用 | 等价构造 / 例子 |
|---|---|---|---|
| 池 (Pool) | 空心圆 | 储存资源(整数) | 实体、账户 |
| 门 (Gate) | 菱形 | 不储存,立即重新分配资源;输出只能全是概率型或全是条件型 | 《战国风云》把军队投入危险换领土:成功/失败的概率输出 |
| 源 (Source) | 向上三角 | 创造资源,产率由输出流量决定 | 自动:《X-Wing Alliance》护盾持续回复;交互:《战国风云》造军队;被动:《大富翁》经过起点被事件触发而得钱;有限的源最好用装有指定数量资源的池 |
| 泄 (Drain) | 向下三角 | 永久消耗资源,速率由输入流量决定;all 一次排空(像冲马桶) | 磨损、摩擦、开火耗弹;原则上可用无输出的池代替,但泄更清楚地表示"不再影响游戏" |
| 转换器 (Converter) | 指向右的三角+竖线 | 消耗一种资源产生另一种 | ≡ 泄触发源;风车:小麦→面粉;锯木厂 1 棵树→50 块木板;有限转换器=泄+有限源(图 5.21 两种等价做法) |
| 交易器 (Trader) | 两个左右三角+竖线 | 资源换主人,按比例交换而非转换 | ≡ 两个门用触发器相连;购物;《辐射 3》商人货物有限;任一方资源不足则交易不发生 |
| 结束条件 (End Condition) | 内含实心小方块的方块(停止键图标) | 每步检查,满足即停止运行;必须由激活器激活 | 25 个资源被自动泄完后停止;种出 3 个以上苹果和橙子即获胜 |
门的细节:
- 概率输出:百分比(总和不应超过 100%,不足 100% 时资源有可能哪个输出都不走而被销毁)或权重(输出概率=本输出权重/总权重,1 与 3 即 1/4 与 3/4)。
- 条件输出:标
>3、==0、3-5等;每来一个资源就检查所有条件,每个满足条件的输出都送出一个资源——条件重叠会复制资源,都不满足则销毁资源。 - 门同样有被动/交互/自动/起始动作四种激活模式;没有输入的门每次触发时发出触发,可用来自动或按玩家动作产生触发。
- 分配模式:确定型门 (Deterministic)(空心菱形)按百分比或权重均匀地轮流分配;有条件输出时统计本时间步通过的资源数来检查条件(可以把它看作"计数门")。随机门 (Random)(标骰子)生成随机数:概率输出时在 0–100% 或总权重内取值;条件输出时默认掷一个 D6 与条件比较。
- 单输出的门:随机放过 30%;无视输出流量立即放行;只放过最先的两个(图 5.16 中排)。
- 门的所有输出状态连接都是触发器(门不积累资源,修改器和激活器从门出发没有意义),这些触发器也可以带条件或概率。例(图 5.17):一个自动随机门以 30% 概率触发,让 3 个资源从被动池 A 流到被动池 B。
转换器 vs 交易器:对玩家几乎一样——交出若干资源换回别的资源;对设计师完全不同:转换器是泄+源,触发后游戏中的资源总量可能改变;交易器只是交换,总量不变。
进阶元素(第 6 章 More Machinations Concepts,印刷页约 p.107–113)
| 元素 | 记法 | 语义 | 例子 |
|---|---|---|---|
| 寄存器 (Register) | 实心方块+数字 | 不存资源、只显示数值;不要接资源连接,可接节点修改器。被动寄存器的值由输入状态连接按公式计算(输入自动编号 a、b、c…,也可用 max/min),未运行时显示 x;交互寄存器有初值和加减按钮,等价于"池+交互源+交互泄" | 计算、玩家输入的参数(如技能值) |
| 间隔 (Interval) | 1/5、5/10、D6/3、1/(D4+2)、D6/D6 | 每 n 步才产出;5/10 每 10 步一次性产出 5 个("爆发",与 0.5 的均匀速率不同);间隔本身也可随机 | 吃豆人中水果的出现与消失 |
| 动态间隔 | 标签修改器单位 i,如 +1i、-3i | 改变目标的间隔 | B 中资源越多,源 A 的产出间隔越长 |
| 乘数 (Multiplier) | 3*50%、2*10%、3*D3 | 把多次相同概率的机会合成一个标签(等价于多条概率输出,概率不同时只能用多条输出) | 每个单位一次击杀机会 |
| 动态乘数 | 标签修改器单位 m,如 +1m、+2m | 改变目标的乘数(同样传递的是变化量) | 寄存器 B 控制交互泄 A 尝试抽取几次(每次 50%) |
| 延迟 (Delay) | 内含一个沙漏的小圆 | 输出标签表示延迟的步数(不是流量);可被标签修改器动态修改、可用骰子随机;可同时处理多个资源,每个都延迟指定步数 | 造兵既要资源又要时间 |
| 队列 (Queue) | 内含两个沙漏 | 一次只处理一个资源(例:每 5 步放行一个) | 建造命令逐个执行 |
| 延迟/队列的状态输出 | 状态连接 | 传出正在处理(含排队)的资源数,可做定时效果 | 激活延迟 A 使源 B 工作 10 步——可改进吃豆人能量豆的建模 |
| 反向触发器 (Reverse Trigger) | 标签 ! | 源头节点想拉却拉不齐输入所标的资源时触发目标 | 《文明》金币不够付城市设施维护费时自动卖掉设施;生命耗尽后再受伤则触发结束条件 |
| 颜色编码 (Color-Coded) | 图设置中开启 | 资源与连接的颜色有意义:颜色不同的资源连接只拉同色资源,状态连接只响应同色资源;同一池可存多种资源;源/转换器可按输出颜色产不同资源;门可按颜色分拣,来色不匹配任何输出时按随机或权重选一个输出并改变资源颜色(例:平均 7:2 地随机产红蓝资源);延迟/队列可按颜色设不同延迟(骑士比士兵贵且慢) | RTS 的不同兵种、建筑依赖 |
| 图表 (Chart) | 用状态连接把池接到图表 | 记录池中资源数随时间的曲线(未选中时连接缩成两个小箭头) | 恒温器温度曲线、篮球比分 |
非确定性符号(表 6.2 Types of Determinability,据原图转写):
| 类型 | 图标 | 工具中的标签 | 含义 |
|---|---|---|---|
| 确定 (Deterministic) | 无 | — | 给定状态下机制总是同样表现 |
| 随机 (Random) | 骰子 | D | 依赖随机因素;可影响反馈的速度、回报或是否发生,可造成不频繁的回报;随机反馈难以评估,增加死锁的可能 |
| 多人动态 (Multiplayer-Dynamic) | 两个棋子 | M | 类型、强度或效果受玩家之间直接交互影响 |
| 策略 (Strategy) | 灯泡 | ST | 受玩家之间战术或策略性交互影响 |
| 玩家技能 (Player Skill) | 摇杆 | S | 受玩家执行动作时的手上技巧影响 |
工具无法真正模拟技能或其他玩家,运行时这些符号都只是产生 1–6 的随机值(可在设置中改);区分它们是为了让图更好读。
本 wiki 的 Mermaid 改画约定
Machinations 原图是图形符号,本 wiki 不放图片,改用 Mermaid 流程图近似表示,并始终附节点表:
| Machinations 元素 | Mermaid 写法 | 说明 |
|---|---|---|
| 池 | A((名称 n)) | n 为初始资源数 |
| 交互池/交互节点 | A(((名称))) 或在名称前加 [点击] | 原书为双线轮廓 |
| 自动节点 | 名称后加 * | |
| 门 | G{门 条件/概率} | 随机门写"随机门" |
| 源 | S[/源\] | 梯形近似向上三角 |
| 泄 | D[\泄/] | 倒梯形近似向下三角 |
| 转换器 | C>转换器] | |
| 交易器 | T{{交易器}} | |
| 结束条件 | E[■ 结束] | |
| 资源连接 | `A --> | 流量 |
| 状态连接 | `A -.-> | +2 / * / >100 |
Mermaid 无法让连接指向另一条连接的标签,所以标签修改器在图中画成指向该连接的目标节点,并在表里写明"修改的是哪条连接的流量"。
例:为《吃豆人》建模(第 5 章 Modeling Pac-Man,印刷页约 p.98–105)
作者把建模分六步逐个机制加入,每个机制一种颜色;这是近似而非软件的逐字模拟(例如幽灵每 5 步出屋一只,真实算法更复杂)。
资源:
| 资源 | 类型 | 说明 |
|---|---|---|
| 豆子 (Dots) | 有形 | 全吃完过关;开局固定数量,游玩中不产生(真实游戏每关 240 个,模型用 50) |
| 能量豆 (Power Pills) | 有形、稀缺 | 每关 4 个,只消耗不产生,要用得明智 |
| 水果 (Fruits) | 有形 | 偶尔出现,吃掉加分 |
| 幽灵 (Ghosts) | 有形 | 4 个,在"幽灵屋"或迷宫中——资源不一定对玩家有利 |
| 生命 (Lives) | 无形 | 开局 3 条,耗尽则游戏结束 |
| 威胁 (Threat) | 抽象(作者为模拟而设) | 超过阈值就被抓、失去一条命;迷宫形状本身 Machinations 无法建模 |
| 分数 (Points) | 无形 | 目标是得分尽量多 |
各机制:
- 吃豆:豆子池(50) →交互转换器"吃豆"→分数池;输入为随机流量,起始成功率 100%,标签修改器
+1%从豆子池指向该流量——豆子每少 1 个,ΔS=−1,乘 +1% 得 −1%,成功率降 1%(模拟越到后面越难找到剩下的豆子)。真实游戏中走新路时 100% 吃到、走回头路时 0%;用 0.25% 则代表很少走回头路的高手。豆子吃完触发结束条件(过关)。 - 水果:分数源每 20 步产生一个水果、泄每 5 步移除一个(分数流量),即出现 5 步后消失;交互"吃水果"成功率固定 50%,得 5 分(豆子得 1 分)。真实游戏每关只出现两次、分值随关卡递增。
- 幽灵制造威胁:迷宫池每 5 步从幽灵屋拉一个幽灵;自动源产生威胁,迷宫中每个幽灵都提高该源的产量(标签修改器)。玩家可点随机交互门"躲避":50% 概率触发一个一次泄掉 9 个威胁的泄(失败可再点;高手可提高该概率)。
- 被抓与失命:威胁池超过 100 时(激活器
>100)自动触发"重置门",重置门把触发分三路:泄掉一条命、让幽灵从迷宫回屋的资源连接、泄掉全部积累的威胁。最后一条命用完则游戏结束。 - 能量豆:有限的能量豆池 →交互转换器"吃能量豆"→能量时间 (Power-Up Time) 抽象资源(自动泄掉)。有能量时间时,幽灵停止产生威胁,并激活一个泄去威胁的泄;同时出现新的交互动作"吃幽灵":幽灵回屋并得 5 分。
下图按上述文字把完整模型(原书图 5.28)改画为 Mermaid(简化,标签按正文):
flowchart LR
Dots(("豆子 50")) -->|"100%,每少 1 豆 −1%"| EatDot>"[点击] 吃豆"]
EatDot -->|1| Points(("分数"))
Dots -.->|"==0"| Win["■ 过关"]
FS[/"水果源 1/20"\] --> Fruit(("水果"))
Fruit -->|1/5| FD[\"水果消失"/]
Fruit -->|50%| EatFruit>"[点击] 吃水果"]
EatFruit -->|5| Points
House(("幽灵屋 4")) -->|1/5| Maze(("迷宫中的幽灵"))
Maze -.->|"+1 产量"| TS[/"威胁源 *"/]
TS --> Threat(("威胁"))
Evade{"[点击] 躲避 随机门 50%"} -.->|"*"| ED[\"泄 9 威胁"/]
Threat --> ED
Threat -.->|">100"| Reset{"重置门"}
Reset -.->|"*"| LD[\"失去 1 命"/]
Lives(("生命 3")) --> LD
Reset -.->|"* 幽灵回屋"| House
Reset -.->|"* 清空威胁"| TD[\"泄 all 威胁"/]
Threat --> TD
Lives -.->|"==0"| Lose["■ 游戏结束"]
Pills(("能量豆 4")) --> EatPill>"[点击] 吃能量豆"]
EatPill --> Power(("能量时间"))
Power --> PD[\"自动流逝"/]
Power -.->|">0 抑制产生威胁 / 激活吃幽灵"| EatGhost>"[点击] 吃幽灵"]
Maze --> EatGhost
EatGhost -->|"幽灵回屋"| House
EatGhost -->|5| Points从简化模型中能读到的设计信息:
- 玩家要在吃豆、躲避、吃水果间分配精力;吃水果与其他系统几乎隔离——只加分、不帮别的,所以手忙脚乱的新手可以安全忽略它。
- 能量豆是需要明智花费的关键资源:可以用来吃幽灵拿奖励分,也可以用来安全地吃掉最后的豆子、更快过关——数字版模型甚至能让人体会到真实游戏中的这些策略选项。
- 能量持续时间和吃幽灵得分在真实游戏中随关卡变化,模型做了简化。
- 建模已有游戏比设计新游戏更难:近似的数值是主观选择,要仔细想清楚每个选择的含义;设计新游戏时则可以随意设置与试验,这是工具的最大长处。
原书问题
- 第 5 章开头说工具教程在(在线)附录 C,随后的 Note 却写"附录 A 包含 Machinations 工具使用教程"。按原书目录与引言,附录 A 是快速参考 (Quick Reference),入门教程是附录 C "Getting Started with Machinations",Note 中的"附录 A"应为附录 C。
- 第 5 章习题全部是图题(原书为图片),PDF 中只有题干,本页不复述。
与其他建模方式并列
| 方式 | 优势 | 劣势(作者观点) |
|---|---|---|
| 程序代码 | 精确、可执行 | 设计师难读,反馈结构不直观 |
| 有限状态图 | 适合少量离散状态(幽灵的分散/追击,见 状态模式与有限状态机) | 游戏状态太多,无法表示资源流 |
| Petri 网 | 形式化的并发与令牌流 | 对设计师复杂 |
| 电子表格 | 数值平衡常用(Schell 的数据表方法,见 游戏平衡) | 作者称 Machinations 可"不写代码也不用电子表格"模拟机制 |
| Machinations | 资源流与反馈一眼可见、可运行、可批量统计 | 只表示经济,不表示空间与 AI;单人视角 |
实际上 Machinations 的令牌在节点间流动、按条件触发,形式上与 Petri 网相近;作者的取舍是用更少的元素类型换取可读性。
出处
- Game_Mechanics_Advanced_Game_Design_-_Ernest_Adams.pdf
- Ernest Adams & Joris Dormans《Game Mechanics: Advanced Game Design》第 1 版(New Riders, 2012, ISBN 978-0-321-82027-3)第 5 章 Machinations(PDF p.120–161,印刷页约 p.79–106);附录 A Machinations Quick Reference(PDF p.420–421)
- Adobe, "Adobe Flash Player End of Life"(官方公告:2020-12-31 起停止支持,2021-01-12 起阻止 Flash 内容运行),用于说明原版工具现状
- Ernest Adams & Joris Dormans《Game Mechanics: Advanced Game Design》第 1 版(New Riders, 2012, ISBN 978-0-321-82027-3)第 6 章 Common Mechanisms(PDF p.162–216,印刷页约 p.107–146)