第 11 章

我的世界,你的模组

如果说,有一种创造,它最大的敌人不是灵感的枯竭,也不是技术的壁垒,而是“更新”本身——你信不信?把时间拨回到2009年。那一年,Valve的创意工坊还没有诞生,Steam平台上的玩家创作仍然散落在各个游戏的专属论坛和第三方下载站里。那一年的5月,一个瑞典程序员马库斯·佩尔松——游戏圈更熟悉他的网名Notch——在一个叫TIGSource的独立游戏论坛上发布了一个游戏的最初版本。这个游戏叫《我的世界》(Minecraft),它的画面粗糙到令人发指:整个世界由一个个巨大的立方体构成,草是绿的方块,土是棕的方块,石头是灰的方块。没有光影效果,没有曲面建模,没有高清贴图。你控制一个手臂像方块的人物,在这个世界里走来走去,把方块挖掉,再把方块放到别的地方。如果你在2009年第一次打开这个游戏,你很可能会在十分钟内关掉它。它太原始了,原始到像是1993年的产物。但如果你多玩了一会儿,你会发现一件事:这个世界不是设计师预先做好的。它是生成的。

你走到哪里,地形就生成到哪里。山脉、河流、洞穴、矿脉,全都是由算法在你进入的瞬间实时计算出来的。而且,你可以改变它。每一块你挖掉的泥土,每一块你放下的石头,都会被游戏记住。你离开再回来,那个你挖出来的洞还在那里。这个机制本身并不新鲜。早在1980年代,就有游戏允许玩家修改地形。但《我的世界》做了一件此前没有人认真做过的事:它把“修改世界”变成了游戏本身。没有任务,没有关卡,没有剧情,没有NPC给你指路。你被扔进一个完全开放的世界里,唯一要做的事情,就是活下去,然后建造。而建造所需要的所有材料,都来自这个世界本身。你要木头,就去砍树。你要石头,就去挖矿。你要工具,就把材料在工作台上组合。游戏的合成系统是一个巨大的配方网络,每一种新材料的获得都会解锁新的可能性。但这个游戏真正疯狂的,不是它的玩法,而是它的代码结构。Notch是用Java写的这个游戏。

Java是一种运行在虚拟机上的语言,它的代码不像C++那样被编译成机器码,而是被编译成一种中间字节码。这意味着,只要你愿意,你可以把游戏的核心文件——一个叫minecraft.jar的东西——用压缩软件打开,看到里面的类文件,然后用Java反编译工具把这些类文件还原成可读的源代码。对于模组作者来说,这简直是一份公开的邀请函。在《我的世界》之前,大多数游戏的模组制作依赖于官方提供的开发工具。Valve给《半条命》提供了Hammer编辑器,id Software给《雷神之锤》提供了QuakeC脚本语言,暴雪给《魔兽争霸3》提供了World Editor。这些工具把游戏的底层代码封装起来,给模组作者提供一个安全的、受控的创作环境。你可以改地图,可以改单位属性,可以写脚本触发事件,但你不能动游戏引擎本身。那是禁区。《我的世界》没有提供任何模组工具。Notch在早期开发阶段根本没有考虑过模组支持这件事。

他一个人写代码,一个人修bug,一个人往游戏里添加新内容。但他用的是Java,而Java的字节码是可以被逆向工程的。于是,在没有官方支持、没有文档、没有任何开发工具的情况下,一群玩家开始做一件在商业游戏开发领域几乎不可想象的事情:他们直接反编译了游戏代码,读懂了Notch的原始逻辑,然后往里面注入自己的代码。这不是模组制作。这是外科手术。最早期的《我的世界》模组,安装方式是这样的:你需要先找到游戏的minecraft.jar文件,用压缩软件打开它,删除一个叫META-INF的文件夹——这是Java的安全签名,不删掉游戏会拒绝运行被修改过的代码——然后把模组作者提供的class文件拖进去,覆盖掉原始文件。如果两个模组修改了同一个class文件,它们就会冲突。你只能选一个。后来有人开发了模组加载器,比如ModLoader和Minecraft Forge,它们提供了一套API,让多个模组可以在不直接冲突的情况下共存。

但即使如此,每一次游戏更新,Notch修改了底层代码,所有的模组都会集体失效。模组作者们必须重新反编译新版本的代码,找到自己的修改点,重新适配。你可能会想,这值得吗?为了一款独立游戏,花几十个小时逆向工程代码,然后每一次更新都要重来一遍。如果Notch改了一个关键类的方法签名,整个模组可能要从头重写。答案是:值得。因为《我的世界》提供的不是一个游戏,而是一个世界。而这个世界,是可以被改写的。让我们先停下来,想一想“改写世界”这四个字意味着什么。在《反恐精英》里,你改写的是枪的伤害值和地图的布局。在《DOTA》里,你改写的是英雄的技能和物品的属性。这些修改,本质上是在一个既定的游戏类型框架内调整参数。射击游戏还是射击游戏,只是枪的手感变了。即时战略还是即时战略,只是英雄的平衡性变了。但在《我的世界》里,你可以改写这个世界的底层法则。原版《我的世界》的世界法则是什么?白天有阳光,夜晚有怪物。木头可以烧成木炭。铁矿石在熔炉里烧成铁锭。

水往低处流。红石粉末可以传递信号,就像电路一样。这些法则构成了游戏的基础逻辑。所有的玩法都建立在这些法则之上。现在,想象一下,有人写了一个模组,往这个世界里加入了一种新的法则:电。不是红石电路那种象征性的信号传递,而是真正的、工业意义上的电。有电压,有电流,有电阻。你需要建造发电机,铺设电缆,安装变压器。不同的机器消耗不同的功率。如果你的电网负载超过了发电能力,整个系统会崩溃。这就是《工业时代》(IndustrialCraft²)做的事情。这个模组最早由一位叫Alblaka的德国玩家在2010年开始开发。它的核心理念很简单:给《我的世界》加入工业科技树。你从最原始的木炭发电机开始,逐步解锁风力发电机、水力发电机、地热发电机,最后建造核反应堆。每一种机器都需要特定的材料,每一种材料都需要特定的加工流程。你要把铁矿石粉碎成铁粉,把铁粉烧成精炼铁,把精炼铁锻造成机器外壳。你要种植橡胶树,提取橡胶,做成绝缘电缆。

你要开采铀矿,离心浓缩,做成燃料棒。这听起来像是在玩一个工厂管理游戏。但这一切,都发生在那个由方块构成的世界里。你亲手挖出矿洞,亲手搭建厂房,亲手铺设流水线。当你站在自己建造的核电站控制室里,看着仪表盘上的指针在安全范围内摆动,那种成就感,和你在原版游戏里盖好一座城堡的成就感,是同一种东西——但被放大了十倍。因为你建造的不只是建筑,你建造的是一整套生产体系。而这个生产体系,是另一个玩家设计的。这就是《我的世界》模组最核心的审美体验:你玩的,不只是Notch创造的世界,你玩的是另一个玩家想象出来的世界规则。Alblaka想象了一个有工业文明的方块世界,于是他写了《工业时代》。一个叫Azanor的玩家想象了一个有魔法体系的方块世界,于是他写了《神秘时代》(Thaumcraft)。在这个模组里,世界不再只有物质和能量,还有一种叫“灵气”的东西。灵气弥漫在每一个方块里,不同的方块含有不同数量和属性的灵气。

你可以用魔杖从方块中抽取灵气,用来炼金、附魔、召唤傀儡。你研究灵气的流动规律,建造魔法祭坛,打开通往异世界的传送门。《工业时代》和《神秘时代》,这是两个完全不同的世界观。一个相信科技,一个相信魔法。在原版《我的世界》里,你只能做一个中世纪的农夫和工匠。但在模组里,你可以成为一个工业大亨,或者一个秘术法师。你可以同时安装这两个模组,在你的世界里既建造核电站,又建造炼金实验室。你甚至可以找到让这两个系统交互的方法——比如用工业模组提供的泵和管道,来自动化神秘时代模组里的炼金流程。这种跨模组的交互,产生了一种全新的创作可能性:元模组。有人专门写模组,不是为了添加新内容,而是为了让其他模组之间能更好地协作。比如《建筑》(BuildCraft)模组提供了一套通用的管道和自动合成系统,它本身不定义你要运什么或造什么,它只给你工具。你可以用它的管道来运输《工业时代》的矿石,也可以用它的自动合成台来批量制作《神秘时代》的魔法材料。

这个模组的作者,他设计的不是内容,而是让内容之间能够连接起来的接口。你看到这个结构了吗?Notch创造了一个世界。Alblaka在这个世界里创造了一套工业规则。Azanor在这个世界里创造了一套魔法规则。而BuildCraft的作者创造了一套让不同规则能够互操作的物流系统。每一个模组作者,都是在前面所有作者的基础上,再往上叠加一层新的逻辑。玩家进入游戏,面对的不是一个作者的作品,而是一个作者群体的集体创作。你挖下一块石头,你不知道这块石头会触发哪个模组的行为——也许它只是一块普通的石头,也许它含有某种稀有矿物,也许它蕴含灵气,也许它被某个自动化系统标记为待采集的目标。你每一次行动,都是在与多个作者的设计进行互动。这已经完全超出了传统意义上“玩游戏”的范畴。你是在体验一个层层嵌套的创作结构。每一层结构都是由不同的人,在不同的时间,基于不同的想象,独立开发出来的。

它们之间没有统一的规划,没有产品经理做需求对齐,没有美术总监统一视觉风格。它们唯一的共同点,就是它们都运行在《我的世界》的Java虚拟机上。而这种层层嵌套的结构,导致了一个深远的结果:作者与玩家的界限,彻底模糊了。在传统的游戏模组社区里,作者和玩家的身份是相对清晰的。你做模组,你是作者。你下载模组来玩,你是玩家。但在《我的世界》的模组社区里,这个界限从一开始就是模糊的。很多模组作者最初只是普通玩家,他们在玩某个模组的时候,觉得如果能再加一个功能就好了,于是他们开始学Java,开始看反编译出来的源代码,开始尝试修改。他们发布第一个模组的时候,可能自己都说不清楚自己算作者还是玩家。更关键的是,《我的世界》的模组使用方式,本身就要求玩家具备一定的创作能力。你下载了五个模组,它们之间可能冲突。你需要自己调试,找出是哪个class文件被覆盖了,哪个加载顺序有问题。你需要自己配置模组的参数,决定哪些功能开启,哪些关闭。

你需要在游戏里设计如何把不同模组的系统整合起来——工业模组产生的电力怎么输送到魔法模组的祭坛上?这没有一个标准答案,你必须自己设计解决方案。这个过程,和你用游戏引擎开发一个关卡,在本质上有什么区别?没有区别。唯一的区别是,你是在一个已经运行的世界里做这件事,而不是在一个空白的编辑器里。你的设计,是即时可玩的。你改完一个参数,进游戏走两步,就能看到效果。这种即时反馈,极大地缩短了创作和体验之间的距离。你不再是一个坐在编辑器前、面对空白画布的开发者,你是一个站在自己创造的世界里、一边修改一边游玩的造物主。这种体验,在官方支持的、货架化的创作平台上,是很难获得的。让我们回到上一章结尾留下的那个问题。Valve的创意工坊,把玩家创作变成了一种货架经济。创作者上传作品,平台审核上架,玩家付费下载,收入分成。这个模式高效、可持续、对平台友好。但它有一个隐含的筛选机制:只有那些可以被标价、被展示、被评价的内容,才适合放在货架上。

皮肤、模型、音效包——这些是完美的商品。它们有明确的使用价值,有可视的质量差异,有可衡量的受欢迎程度。但一个改变了游戏底层逻辑的模组,它怎么标价?你给《工业时代》定多少钱?你下载了它,你可能要花几十个小时才能体验到它的全部内容。它的价值,不是在你下载的那一刻实现的,而是在你游玩的过程中逐步展开的。它是一种体验,不是一个物品。而且,模组之间是相互依赖的。《工业时代》依赖《我的世界》本体,《建筑》依赖《工业时代》提供的电力系统,某个小型模组可能同时依赖《工业时代》和《神秘时代》。这种依赖网络,构成了一套复杂的生态系统。你不能把它拆成一个个独立的商品来售卖,就像你不能把热带雨林里的一棵树拔出来,单独标价出售一样。树的价值,在于它和整个雨林的根系、土壤、微生物、动物之间的连接。模组的价值,也在于它和其他模组之间的连接。《我的世界》的模组社区,就是这样一片热带雨林。这片雨林没有园丁。Notch从未给模组作者提供过官方支持。

他在2011年接受采访时说过,他想给游戏添加模组API,但一直没有做。2014年,微软以25亿美元收购了Mojang——Notch创办的公司——Notch离开了团队。微软接手后,确实开始推进模组API的工作,但他们的做法和Java版社区的期望有巨大的差距。微软推出了一个叫“附加组件”(Add-Ons)的系统,允许玩家修改游戏的行为,但只能在微软定义的框架内进行。这个框架的安全性和稳定性远高于Java版的野蛮修改,但它的自由度也远低于Java版的野蛮修改。你不能再修改底层的世界生成算法,不能再注入自己的类文件,不能再做那些需要直接操作字节码才能实现的疯狂改造。Java版的模组社区,对此的反应是:继续用老方法。他们继续反编译,继续注入代码,继续在每一次游戏更新后修复兼容性。Minecraft Forge这个模组加载器项目,由一个志愿者团队维护,他们追踪Mojang的每一个快照版本,分析代码变更,更新API。

这个团队的核心成员,来自世界各地,有德国的程序员,有美国的大学生,有澳大利亚的系统管理员。他们不拿工资,不签合同,靠的是一个共同的信念:这个世界,应该允许任何人修改它的任何部分。2013年到2016年,是Java版模组社区的黄金时代。那几年,出现了一批至今仍然被玩家津津乐道的宏大模组。《林业》(Forestry)模组加入了完整的基因工程系统,你可以杂交蜜蜂和树木,培育出能产生特殊资源的新品种。《应用能源》(Applied Energistics)模组把物品存储变成了一个数字化的网络系统,你可以把成千上万的物品存储在硬盘里,通过终端随时调取。《匠魂》(Tinkers' Construct)模组彻底重做了工具制造系统,你可以用不同的材料铸造工具部件,然后像拼乐高一样把它们组装起来,每一把工具都有独特的属性和外观。这些模组,每一个都相当于在原版游戏的基础上,叠加了一个完整的独立游戏。它们的设计深度和系统复杂度,超过了很多商业游戏。

而它们都是免费的。模组作者们在论坛帖子里放一个下载链接,可能附上一句如果喜欢这个模组可以考虑捐赠的话。绝大多数玩家不会捐赠。但模组作者们还是继续更新,继续维护,继续在深夜对着反编译出来的代码,寻找那个需要修改的方法。为什么?你可能会说,是因为热爱。这个答案没错,但不完整。热爱可以解释一个人为什么开始做一件事,但不能解释他为什么在第三年、第五年还在做,尤其是当这件事需要他不断与游戏更新对抗,不断修复被破坏的代码,不断回应论坛上玩家的报错和催促。更准确的答案,也许是:因为在这个社区里,创作本身就是回报。当一个玩家下载了你的模组,把它装进自己的世界里,用你设计的工业体系建造了一座自动化工厂,然后截图发到论坛上——你看到的,不是你设计的物品被使用了,而是你的想象力,在另一个人的世界里,变成了现实。他建造的工厂,不是你预先设计好的某个建筑,而是他理解你的规则之后,自己创造的产物。你的模组,成为了他创作的工具。

他的创作,又可能启发下一个模组作者,去设计新的规则。这是一种链式反应。Notch创造了一个世界。Alblaka在这个世界里创造了工业。某个玩家用工业模组建造了一条自动化流水线。另一个玩家看到这条流水线,觉得物流系统不够高效,于是写了《建筑》模组。第三个玩家用《建筑》和《工业》一起,建造了一个全自动的采矿基地。第四个玩家在这个基地旁边,用《神秘时代》建造了一座魔法塔,用魔法传送门把矿石从基地直接传到塔里的炼金炉。第五个玩家看到这一切,开始思考:能不能写一个模组,让工业和魔法产生更深的交互?这个链条没有终点。每一个环节,都是创作。每一个人,都是作者。而《我的世界》本身,从Notch最初写下的那个生成世界的算法开始,就注定了要成为这个链条的起点——不是因为它提供了最好的创作工具,而是因为它没有设限。它的简陋,它的原始,它的代码被轻易反编译的缺陷,恰恰成为了创造力的土壤。这听上去很浪漫。

但我们必须面对一个冷峻的事实:这片热带雨林,是脆弱的。2016年以后,Java版模组社区的活跃度开始下降。一部分原因,是微软推动的“基岩版”(Bedrock Edition)逐渐成为《我的世界》的主流版本。基岩版是用C++重写的,性能更好,跨平台支持更完善,但它的模组支持完全不同于Java版的开放生态。基岩版的附加组件系统,把模组作者关进了一个安全笼子里。你可以添加新内容,但不能动底层代码。这意味着,像《工业时代》那样从根本上改写游戏规则的模组,在基岩版上是不可能实现的。另一部分原因,是模组作者自身的疲惫。维护一个大型模组,意味着你要持续追踪Mojang的更新。每一次大版本更新,都意味着数周甚至数月的适配工作。很多早期的模组作者,在坚持了五年、六年后,选择了离开。他们中的一些人进入了游戏行业,成为了职业开发者。

他们中的另一些人,彻底消失在了互联网的深处,只留下一个不再更新的下载链接,和一个论坛上最后一条写着由于个人原因暂停更新的帖子。他们的模组,还留在那些老旧的服务器上。那些服务器运行着某个特定的游戏版本,因为升级会让模组失效。服务器管理员在启动脚本里写死了版本号,年复一年地维持着那个世界的运转。玩家们在那个世界里建造的城市、工厂、魔法塔,还在那里。但那个世界的时间,停在了最后一次更新发生的那一天。这是野蛮生长的代价。没有官方支持,意味着没有稳定的基础设施。没有货架,意味着没有可持续的经济循环。每一个模组,都建立在志愿者们的个人时间和精力之上。当他们离开,他们的创作就成为了数字废墟的一部分。但废墟也是肥沃的。那些从模组社区里成长起来的创作者,把他们在这片热带雨林里学到的技能和理念,带到了更广阔的世界。有些人加入了游戏公司,成为了系统设计师。有些人创办了独立工作室,开发自己的游戏。

有些游戏——比如《异星工厂》(Factorio)——你可以清晰地看到《工业时代》模组的影子。那款游戏的设计师,公开表示过他受到《我的世界》工业模组的启发。这是一种不同的传承方式。不是通过货架上的商品流通,而是通过人的流动。模组社区成为了一个巨大的、非正式的培训机构。它不收学费,不发证书,但它教会了成千上万的人如何设计系统、如何编写代码、如何管理项目、如何与社区沟通。这些人从雨林里走出来,带着他们在野蛮环境中磨炼出的生存技能,进入了正规的游戏产业。他们中的一些人,正在设计下一代游戏的底层架构。而他们设计的时候,会记得那个可以反编译、可以注入代码、可以改写世界法则的方块世界。2011年,Valve邀请了一个叫IceFrog的模组作者,去开发《DOTA 2》。那个从《魔兽争霸3》的地图编辑器里长出来的玩法模组,最终成为了一个独立的、商业上极其成功的游戏。这是一个模组作者被平台收编的故事。但《我的世界》的模组作者们,走的是另一条路。

他们没有被收编,他们继续在平台的夹缝里、货架的阴影下,维护着那个脆弱的、野蛮的、不允许被标价的创作生态。直到今天,在某个论坛的深处,你还能找到那些为《我的世界》1.7.10版本和1.12.2版本编写的模组。这两个版本,因为Forge支持最稳定、模组生态最丰富,被社区自发地选定为长期支持版本。Mojang已经更新到了更高的版本号,但大量的模组服务器仍然运行在1.12.2上。这是一种沉默的抵抗。服务器管理员们用版本号筑起了一道堤坝,把官方更新的潮水挡在外面,保护着那片他们亲手建造的世界。那些世界里,核反应堆还在运转,灵气还在方块间流动,自动化的流水线还在日夜不停地生产。玩家们还在登录,还在建造,还在创造。他们玩的,是另一个玩家想象出来的规则。他们建造的,是另一个作者设计的工具所允许的可能性。他们截的每一张图,都是这个层层嵌套的创作链条上最新的一环。

这个链条,从Notch写下第一行生成世界的代码开始,穿过Alblaka的核反应堆,穿过Azanor的灵气网络,穿过无数个在深夜对着反编译代码的模组作者,最终落在一个十四岁的孩子面前。他刚刚下载了一个模组包,里面有几十个模组。他打开游戏,生成一个新的世界。他不知道这个世界里有什么规则在等着他。他只知道,他可以挖掉第一块木头,然后一切就开始了。而这个孩子,如果有一天他觉得某个模组的功能不够好,他会打开搜索引擎,输入“Minecraft modding tutorial”,然后在一个周末的下午,第一次用反编译工具打开minecraft.jar。他会看到那些混乱的、没有注释的、由Notch在多年前随手写下的代码。他会皱着眉头读上几个小时,然后小心翼翼地写下第一行属于他自己的代码。他保存文件,把修改后的class文件拖进jar包,启动游戏。当那个方块构成的世界再次出现在屏幕上,而他添加的新功能如期运转的那一刻,他成为了这个链条上新的一环。

不是最后一环。这个链条没有最后一环。这就是《我的世界》留给游戏产业最深刻的遗产。它不是一套模组API的规范,不是一个内容分发的货架系统,不是一个创作者分成的商业模式。它是一种可能性——一种让玩家成为作者、让作者成为世界创造者的可能性。这种可能性,不需要任何平台的许可,不依赖任何官方的支持,它只需要一个可以被反编译的jar文件,和一个愿意在深夜对着屏幕一行一行读代码的人。