跳到主要内容

世界选项

有些设置属于表现:文字速度、战斗动画、窗口皮肤。玩家改动这些,改变的只是自己屏幕的样子,别无其他。它们留在客户端,那本来就是它们该在的地方。

有三项设置属于规则。它们改变战斗中实际发生的事。在联机世界里,这些不能放在客户端,原因再平常不过:一个在自己机器上把难度调成"简单"的玩家,改动的是服务器所遵循的规则。

所以 MCE 把两者分开。表现留在本地,规则来自服务器。

哪一项属于哪一类​

对设置界面十六个项目做一次清点,它们分成三组:

分组数量存放在哪
规则3服务器,由运营者播种
表现12客户端,玩家自己的选择
联机下隐藏1根本不显示

三项规则是难度、训练师等级和战斗方式。隐藏的那一项是传送时自动存档,它被隐藏而不是以只读方式显示,因为在联机中持久化归服务器所有:一个自动存档开关描述的会是一件不再发生的事。

客户端如何使用它们​

客户端在进入世界的途中,用 mce_world_options_get 一次性取回这三个值。

真正要紧的设计决定是它不对这些值做什么:它不会把它们写进玩家自己的配置。第一版就是那样做的,而那是错的。那些配置会被持久化,于是一个设为 固定 的世界会覆盖玩家保存的 切换 偏好——并把它一路带进离线游戏,而在那里没有任何服务器在作主。

所以引擎不写入,而是询问。每一处用到规则的地方都调用它的读取口:有世界时取世界的值,没有世界时取玩家自己的值。玩家的偏好完好无损地留存下来。

联机会话中的设置界面

界面顶部的 Estilo: Fijo 是世界的值,不是这位玩家的:他很可能在离线游戏里保存着 切换,那个值仍在那里,没被动过,等着他。规则以下的一切都是普通的本地偏好:语言、音量、动画速度。服务器对这些没有意见,也从不索取。

设置界面被接成:当世界作主时,这三项以只读显示。玩家能看到自己处在哪个难度,却无法更改——这是隐藏(无从得知)与可编辑(可以作弊)之间的折中。

实机验证

2026‑08‑29 对一台播种为 Hard/Set 的在线服务器实测。进入世界途中,游戏自己的日志:

[R-OPCIONES] el mundo dice: dificultad=Hard estilo=Set aLaCaja=False sembrado=True
[R-OPCIONES] el mundo manda: dificultad=Hard estilo=Set aLaCaja=False

两行,真正要紧的是第二行:客户端取回了规则,并且把权限交给了它们。往返的两半说的是同一件事。

服务器拿它们做什么​

难度移动的是训练师对手的等级——而且只有训练师,与 Core 在离线时的行为一致:

难度倍率
简单0.8
普通1.0
困难1.2

结果被夹在 1–100 之间。它在 buildTrainerParty 中生效,那是服务器铸造训练师对手的唯一位置,因此不存在第二条可能与之不一致的路径。

如何播种​

mce_world_options_seed 只允许服务器对服务器。任何带用户会话的调用都会被拒绝,它需要 Nakama 运行时的 http_key——与物种播种相同的凭据、相同的规矩,也就是说绝不能提交进仓库,也不能随构建发布。

面向购买者的路径是 Hub 的 Online 页签:在那里设置三个值,它会替你播种,并从仓库之外读取密钥。

对没有建模的值,它点名拒绝​

送来一个引擎不认识的难度或战斗方式,播种会被拒绝,并且错误信息会说明是哪个值不对。

诱人的替代方案是接受它并回落到 Normal。那比听起来更糟。运营者会以为自己配置好了一个世界,而世界悄悄是另一回事,并且永远没有任何东西会说出来。服务器无法建模的规则会被拒绝,绝不以中立值蒙混过去。

"未播种"是一个独立状态​

存储起初为空,而空意味着未播种——这被刻意区别于 Normal,即便今天两者都给出 1.0 的倍率。

它们现在是同一个数字。不同之处在于 Normal 不再等于 1.0 的那一天会发生什么:这两个世界中一个应当改变,另一个不该。把两者合并的服务器,等于丢掉了区分它们所需的信息。

权限​

world_options 记录以 permissionRead: 2 和 permissionWrite: 0 存储。

人人都能读取自己所处的规则。没有人能从客户端写入它们。不存在上传动词——mce_world_options_get 只下载,而这个"缺失"正是设计本身,不是遗漏。