Pico-8: 一部梦幻主机的诞生简史
说起来不算什么令人大惊小怪的事,我是伴随着 Apple IIe, C64 和 BBC Micro 这些经典的家用电脑长大的。尽管我家没有买,但我确实花了很多时间泡在有电脑的朋友家里,也经常留宿在我父亲的心理学实验室中,那里我父亲会用 BBC Micro 控制硬件来研究鸽子的记忆力。我也就是这么学会编程的,从 BBC 手册里翻出代码片段输入进去试着能不能捣鼓点啥出来,即便一点都不像能玩得起来的游戏。
于我而言,为这些老机器编程的经历,是一段发自肺腑的童年回忆,同和初恋女友一起攀爬的黄榆树的清香,以及八岁那年骑着自行车从沙砾路上摔倒嗅到的鲜血味同样鲜活难忘。
在我八岁的大脑之中一直萦绕着那样的情节,在又大又笨的键盘上敲击输入程序,绘制大颗的彩色像素画面。打开电脑,除了跳动闪烁的提示符再也看不到任何东西着的念头在今天或许已经显得有点荒谬了吧,那意味着除了墨色画布一样的屏幕,只有你和你的程序存在。
工具与编辑器
我最初投入游戏开发之际,还没有什么专门绘制图像的工具可用。每个项目都需要重写或者改写精灵编辑器,地图编辑器,音效编辑器和其他工具,这些过程就好像仪式一般一直维系着。
差不多 Lexaloffle 刚成立的时候吧,我开始放弃这种习惯,自制了一款名为 poido (名称来自“point dough”)的泛用型素材编辑器。它拥有多个模式,能够编辑精灵图,色盘,模型,uv图,骨骼动画和音效,之后还加入了合音和体素编辑功能。
poido的初衷说起来其实很简单:
我希望能够统一编辑各种素材并且将它们存储在同一个文件中(我称之为"pod",如上图所示),这样就不必老在不同编辑器间跳来跳去,或者管理精灵图集或单独的素材文件。后来,这个项目成为了 Voxatron 和 PICO-8 中编辑器的雏形。
LEX500
时间回溯到 2004 年。Lexaloffle 已经成立了好几年,发布过几款销量平平的解密游戏。我们当时出于兴趣开发一些小型项目来维持激情,同时接一些外包来维持运营。其中有个项目叫 LEX500,仿照 Amiga500 命名,但说真的更像是 BBC Micro,分辨率大小仅有 240X240, 16色盘,启动后会进入一个可以使用 BASIC 代码的交互环境。
LEX500 还留下一大堆设计笔记和设定图。那时我将这个项目视为了一次设计训练,除了确实内置精灵编辑器外,它和一款 BBC Micro 模拟器没什么区别。LEX500 还有个有意思的功能是,如果你在代码编辑器中引用素材,它们会立即回显在交互式命令行的环境中。
图像格式
除了 LEX500 以外,我也捣鼓过很多拥有自己特殊视觉风格的模拟图像格式。灵感首先来自 Ken Silverman 的 Voxlap demo,有些不令人讨厌的 Ray-tracing 错误会导致 64X64X32 的体素块被渲染成立方体。我曾经用它来设计了一个名叫 Felix and the Firebird 的游戏的演示场景(如下图所示),这最终变成了开发 Voxatron 已经随后故事的缘起。
此外还有基于矢量的双通道颜色格式:其中一个通道用于保存 HUE 数据,另一个则用于保存饱和度。多边形会被不同通道分别渲染,最终在每一帧输出时转换为 RGB 格式。我将这种技术用到了 Conflux (2008)的原型开发和 Swarm Racer 3000 的开发之中。
通过一系列互补工具研究这些格式的过程中,我渐渐开始了解作为一个运行平台或者运行环境应具有的功能。同时,那些为老电脑制作的游戏拥有独特的视觉效果和氛围,理应有这样一个平台来解决这些独特的设计问题,促使人们制作这种游戏。
Voxatron
Voxatron 动工于 2010 年,最初是一个用来为我进行体素演示的小型项目。最开始它只是个机器人射击小游戏(项目名字也正是 Voxel 体素和 Robotron 机器人的综合),但油管上它的预览视频突然爆红,我马上放下手头的其他工作,全力拓展它的功能,又在它的基础上融入一款之前设想过的冒险游戏。由于特殊的文件格式,我同样意识到有机会将它开放为一个通用的平台,让其他人也能创作和分享他们的体素游戏。
这些计划逐渐形成了一个设计问题。如何能够避免哪些常人理解中的糟糕游戏术语(包括游戏模式,小游戏,DLC,模组,关卡,用户自制关卡等等)来将我设想的内容呈现给大家呢?每个人对其都有不同的期待,最后会让内容没办法很好地呈现。
尤其在涉及到用户生成内容时,这种问题非常典型。我希望开发者能够享有著作权,是在一个平台上创作属于自己的内容,而非为某个游戏制作关卡或者模组。有些项目或许也并非关卡甚至游戏,也可能是一些练习探索或者视效demo。
我很长时间都没有找到头绪,知道想到卡带点子。与其区别各种不同的项目类型,不如让所有的项目都以卡带的形式呈现,总之它们都是可以分享的作品单元。
PICO-8
PICO-8 作为 LEX500 项目的重置始于 2012 年。在 Voxatron 同一关卡中,我需要增加一种通用的脚本组件,但当时我对这种东西还没有多少经验。如果我做一个 LEX500 那样的控制台出来,就可以很好地进行脚本互动了,或许之后它也能作为为 Voxatron 用户介绍编程的入口。
另外一个动因则是,当时Lexaloffle的办公室以 Pico Pico Cafe (小小咖啡厅)的形式作为公共空间开放了一段时间(这也是 PICO-8 这个名字的来源之一),当时有一位常客,名叫 Julien Quint,精通各种语言以及实现,也和我一样喜欢离奇的小项目,鼓励我在 LEX500 的 BASIC 交互环境下写点东西。
我们花了大概一个月为设计师制作了一款用于展示和讲述的小玩意儿,叫 Picotachi(又是 Pico),结果表明 PICO-8 这样的命令行控制台项目大有可为,尤其是在 Voxatron 中进行某些没有视觉反馈的开发时。
之后,我逐渐发现这两个项目比我想象的还要更相似。
由于 Voxatron 内置了一整套设计工具,在开发 PICO-8 时我也很自然地想延续这个特性,最终我也证明了这样做的重要性。我之前就将 Voxatron 的图像 2D 化,做过一些低分辨率的演示图。最终也选择使用 128 X 128 作为 PICO-8 的分辨率,这样它恰好是 Voxatron 体素图像的一个切面,这样让后者理论上也能显示前者的画面。PICO-8 也和 Voxatron 一样作为一个平台来发布,我们也开放了 Lexaloffle BBS 来供大家发布和分享作品。
PCIO-8 最终变成了 Voxatron 项目的 2D 浓缩精华版。
这是一张 PICO-8 的早期截图,我当时在尝试游戏中有多少瓷砖时设计能够足够有趣又不至于令人觉得辛苦。最开始选用的是 160X120 的画面大小,并且拥有独立的 320X240 分辨率的文字图层,后者用于代码编辑器,因为我觉得原生分辨率下很难做出可读性良好的文字编辑器。或许当时我的想法是对的吧。
第一次迭代时,我通过使用 Lua 虚拟机将 BASIC 转换成 lua 代码实现了 BASIC 交互环境。在这个过程中。我渐渐惊艳于 lua 的好用,渐渐从 PICO 上去掉了那层用 BASIC 包裹的外壳。
尽管思考一台 PICO-8 实体主机瞧上去会是什么样子始终很有趣,但其实它物理外观是什么样对它本身并无影响。特定的选择会鼓励特定的设计文化,影响开发过程的体验,但并不会有什么更深层次的现实意义。选择将操作限制为使用DPAD和两个按钮也同样如此,但这样做有一个挺好的附带效果是,将来大家使用集成式的组件组装自己的PICO-8主机会方便很多。
梦幻主机
所以呢,我渐渐积攒起了制作一台“梦幻主机”的资源:卡带格式,开发工具,社区平台,图像和控制的格式和接口。然而,那个时候,我依然还没有真正地看到它出现。PICO-8最开始的时候还只有磁盘和程序这些概念……看起来不像梦幻主机倒像是梦幻老电脑。而 Voxatron 不过是一个自带模块和内置编辑器的游戏。每当我把自己的想法解释给别人的时候,告诉他们 Voxatron 其实是一个平台,而非别的什么时,对方都会用毫无生气的眼睛像看傻瓜一样盯着我。
PICO-8 渐渐壮大成了某种有点影响力的东西,而它也多少帮我说明了它和与它类似的 Voxatron 的目标。我已经不记得我是怎么最终开始将它们变成真正的主机的,但当时已经有很多因素促使我去那样做。它也让我有理由为 Voxatron 加入卡带的设计,为这两个不用卡带就有点抽象的项目提供一种又可爱又容易理解的呈现方式,并且让 PICO-8 项目专注于设计相关的事情。否则像是将把固定的 32K内存映射到卡带数据的想法已经很难见到了。
假如我一开始的想法是:“设计一台功能完善的主机怎么样”,或许整个项目都会轻松很多,工作也会朝着这个目标努力。当我步出迷雾重重的森林,回头去看揭晓的答案:呀,所以这些努力最后都变成了一部主机。