# 六大类

LLMS 索引： [llms.txt](/dvw/llms.txt)

---

令人意外的是，虚拟世界的命令只有六个类别，其中只有一半是情境之内的。把这些实现出来，你就具备了搭建一个基本虚拟世界所需的材料。这六大类是：

- 退出虚拟世界（“quit”）。

- 获取游戏说明（“help”）。

- 记一条备忘（“bug”）[^78]。

- 通信（“tell”“say”“shout”“pose”，等等）。

- 创建／销毁物体（“chop wood”）。

- 状态变化（移动、“get”“drop”，以及其他所有命令）。

在这六大类里，从虚拟世界物理的角度看，最后一类最重要。

虚拟世界里的有形物体都有属性，属性又各有取值。属性可以有多种形式：“Mass”（质量）可能是一个整数；“label”（标签）可能是一个字符串；“location”（位置）可能是一组坐标；“contents”（内容物）可能是一个物体列表；“components”（组件）可能是一种树状数据结构。这些取值中，有些可以独立存在；另一些则可能因为取决于许多因素（例如对魔法的抗性），而要在每次使用时重新计算。

状态变化类命令会改动属性。比如说，一个简单的 “get”（拿），意味着把一个物体的位置从地板上改到角色身上；移动意味着把角色的位置属性从一个点改到另一个点；“open door”（开门）意味着把门的“opened”（已打开）属性改成 true。

当然，在实践中这要更复杂。有各种各样的前提条件需要满足（物体可能太重搬不起来，可能被固定住了，可能着了火，可能正被踩在脚下，还有一大堆别的烦人情况）；需要生成反馈（你看见门开了，门另一侧的人也一样）；属性本身也可以有不同的表示形式（位置可以表示为坐标，也可以表示为「包含／被包含」的层级）。不过，从设计者的角度看，实际的机制并不特别重要；更值得关心的是拿它们能做出什么。这是因为，除了物体的创建／销毁之外，一切有形的东西都可以用它们来做。

这意味着，你选择的属性决定了玩家命令的粒度，而命令的粒度又决定了物理的粒度。如果属性是细粒度的（比如说，如果你记录了一丛灌木上开着多少朵玫瑰，属性就可能是细粒度的），那么改动这些属性的命令也必须是细粒度的——因此，命令底下的物理还必须再细一点（因为正是它赋予了属性以意义）。人们是频繁使用这些命令还是很少使用，并没有什么区别；一旦你有了那样的细节层次，就必须支撑它。

同样，反其道而行，采用粗粒度的属性，你就会得到粗粒度的命令。如果花是花园的属性，而不是自身独立成物的物体，角色能拿它们做的事情就少得多（这意味着你的物理要处理的事情更少）。

至于该采用哪一档细节层次，这既取决于虚拟世界，也取决于真实世界。说取决于虚拟世界，是因为有些情境需要更细粒度的属性，而另一些情境没有它们也行。举例来说，一款谋杀悬疑侦探游戏需要为每个物体设定许多细致的属性，因为一丝不苟正是侦破的特征；而一款太空歌剧游戏则可以含糊带过大部分这类属性，因为它关心的是更宏大的尺度。不过，在所有情况下，真实的物理都是绝对的。玩家会有某些预期，并且会照着这些预期去行动。如果你鼓励他们往深处看，他们可能看得比你能应付的还要深；如果你只鼓励他们看表面，那又可能太表面，满足不了他们天生的好奇心。

在这里，设计者真正能做的，就是把自己放到玩家的位置上。先想象这个虚拟世界完成之后会是什么样子，再考虑玩家会想在里面做什么。按这一层次创建物体，按这一层次为物体设定属性，按这一层次规定命令。由此，你就能得出你的物理层次。

稍后我会更详细地讨论物体的属性 [^79]。不过眼下，我们先接着看底下这套基本的物理系统，并问一个问题：如果你想模拟某种在真实世界里不可能的东西，会发生什么？


[^78]: 如果你愿意，可以把它（记备忘这一条）归到通信那一类，但我认为它比通信更基本。
[^79]: 为了不让你空欢喜一场，我先把话说在前头：我不会给出一份常见物体属性的清单。这一节的目的，毕竟是让设计者自己从基本原理出发去思考虚拟世界的物理。
