Summary:
世界上的甲方都有病,而现在,Jason成了自己的甲方。
哦豁。
Notes:
本文的英文名来源于软件工程里著名的甲方言论:It’s just what we asked for, but not what we want.
与其说是写文时写了小游戏,不如说是被甲方气个半死还要哄队友的时候,决定写点治愈自己的东西。
在说“治愈”自己的时候,我是指这个游戏。
正文
- New Project
Jason Peter Todd从没想过自己会有一天会真的做这种事。
小时候他有Bruce,后来他有Roy,期间间或的“空窗期”里,Dick和美元也总有一个能为他效劳。
所以,他从来没有自己动手写过任何东西。
是,Bruce教过他,这些实用的技能是不会褪色的。但即便它在Jason的技能树里躺了小十年,也不妨碍它的熟练度是个明晃晃的0。
但是,无论如何,现在Jason已经走到这一步了——他买了台正经电脑,下载了Eclipse,装了jdk1.8.0_261,对着空空荡荡的界面,思考起他要从哪里起步。
空白一片的界面总是容易让人走神,你会忍不住盯着屏幕上的每一个字符,什么都想,唯独不想正事。
慢着,正事是什么来着?
对了,他要写个小游戏。
public class Main……为什么要叫main?
“这就是主要问题(main problem),你真的知道自己想要什么吗,Jay?”Dick在他身边问道。
他们时不时会碰个面,三四个月一次吧,没有任何正事,就是一起去喝一杯,互相观察一下“你没把自己玩死吧”或者“你有没有失忆/被洗脑/又犯了哪个陈年心理疾病”。Dick会想方设法给他灌鸡汤——Dick管那叫兄弟间的关心,但管他呢——,Jason从来不喝,不过偶尔也会看两眼。
比如这个问题。说实话,Jason不知道自己想要什么。这不是废话吗?作为“如何以史诗般的方式搞砸事情”方向的博士学位获得者1,知道自己想要什么,毋庸置疑是对此学历的侮辱。
Jason经常不知道自己想干什么,绝大多数时候。这个“绝大多数”与“全部”的区别,就在一个念头上。
——他要做个推箱子小游戏。
Jason非常确定,他想要这个。——至少,他是这么告诉自己的。
管他呢。
他把注意力从乱糟糟的脑子里抽出来,重新拍到眼前的屏幕上。
Eclipse自带三个主题,classic陈旧得像一战前的遗产;light比医院急救室还白,Jason甚至能闻到里面的消毒水味;至于dark……阴森暗沉的背景色,加上花花绿绿的颜色配置,Jason不介意承认他对这种存在有心理阴影。
所以最后他还是选了消毒水。
此时此刻,消毒水上铺着个堪称空白的文件,只有一个空荡荡的Main类,Jason甚至连main函数都没费神去写。
他能清晰地感觉到,自己心底的某个角落冷笑了一声,发出鄙夷的震颤:“这就是你想要的?”
这就是我想要的,他对自己说道,不然还能有什么?
人和电脑,通过一门没有二义性的语言交流,任何错误都是人这一方的,而电脑不具备任何反应能力——它不会嘲笑,更好的是,不会安慰。
看,还有什么能比这更好的?
- class SokobanMap
Java,一个位于印度尼西亚的小岛,但估计等到人类搬离地球了,这个名字依然如雷贯耳。因为这个岛屿产出的咖啡在硅谷格外畅销,所以它的名字就成为了一门蔚为流行的编程语言。
Jason有一次去Java,专门买了点当地的咖啡豆煮咖啡,但说实话,他真喝不出来它有什么特别的。全世界使用最多的编程语言,起名的时候也不过是一种平凡无奇的咖啡豆。
就好像罗宾一样。偌大地球,成千上万种鸟,Mary Grayson夫人唯独拿知更鸟当了儿子的昵称,从此,这个名字就成了哥谭夜色中难以割舍的一道风景。Jason幸运或不幸地,也曾担任过这一角色——获得做出改变的实力确实是幸运的部分,但鸟名字、黄披风、绿鳞小短裤?这就未必了。Jason不会为糟糕的审美对Dick发火,主要是因为这事已经过去了,而且Jason本人也确实有错——当罗宾的时候他确实还是个没长大的小孩儿,但后来穿夜翼制服的时候,Jason确实已经过了能用“少不更事”当借口的年岁。
嗯,偷穿前任衣服这事确实是他起的头,这锅没地方可甩。
Jason揉了揉鼻子,决定还是回去写他的代码。
在思维乱飘的时候,他头脑深处的代码结构已经渐渐成型。推箱子游戏,最基础的元素当然是箱子,Box。箱子当个抽象类会比较方便,记下它的位置,预留下移动时调用的抽象函数,返回值要是个boolean。从箱子继承出几种不同的箱子,玩家是一种,出口是一种,推动的块是一种,可通过的地面放成空的就好。再扩展还可以有很多,比如不可移动的墙,要用箱子填上才能通过的坑,再比如黑天模式,还可以引入战斗系统,或者升级成3D,但这些暂时都不在计划之内。
接下来是一个管理Box们的类,SokobanMap。顾名思义它的核心是个Map,根据坐标收纳好所有的Box,作为进行游戏运算的主体,需要留出一些接口,比如控制玩家移动的函数movePlayer,还需要有内部操作的函数,比如移动某个箱子的moveBox,返回某个位置情况的getBoxAt。
接着,Jason开始实现函数,沿着逻辑顺序。先是Player的移动函数,它需要调用Square的移动函数,它又需要调用推箱子Map的移动箱子函数。
哦,慢着,还要有初始化函数,再写一下载入关卡的函数,这个要留好后续读取关卡文件的接口,再设计一下判断胜负的函数。
等等,为了绘图方便,玩家箱子应该放在更高的图层上,这就意味着所有关于玩家的操作函数都要重写。
然后,Jason忽然意识到自己没有写调试用的打印函数,于是他匆匆敲下一行“//TODO”就跳了过去。
脑子里的“to-do list”越来越长,思绪纷繁之间,Jason忽然想起不是很久以前,自己也干了类似的事。
顾客下了单子,安全屋隔壁吵得他再也忍不下去了,一直追查的一个黑帮组织终于有了点线索,Jason当时正忙得焦头烂额,突然就收到了一条消息,来自一个他以为他永远也不会收到消息的人。
他大概愣了两秒钟的神,然后扔下了手上所有的事,一个人开了七个小时的飞机去缅甸的雨林里荒野求生了两个礼拜。回来的时候,Roy把单子搞砸了——理所应当,那是两个人的活——,隔壁的三个住户全死了所以清净了不少,黑帮组织消失得无影无踪。
而他一点都不后悔。
他并不准备苛责自己,因为他脑子进过水。
看,挖开过自己的坟就是有这种好处,你发什么疯都可以把锅甩过去,而没人会反驳你——因为没有第二个人做过这种事。死而复生过的人不少,在拉萨路池泡过澡的人也不止他一个,但因为一次宇宙级的地震自己挖开棺材爬出来?
Jason对自己在这事上的独一无二还是很有自信的。
东南亚的雨林和南美的区别相当之大,远不是在赤道哪边能概括的。Jason去过八次亚马逊雨林,每次都是为了追查毒枭,其原因不一而同,甚至有一次是受雇于南非某政府,去取回南非另一政府寄存在毒枭处的一个硬盘。但不管是干什么,遍地毒虫、缺乏饮水、食品匮乏的雨林总不会是度假的好地方,而且雨林总会额外耗损一些他的弹药。
东南亚不一样,Jason依然清晰地记得篝火里树枝被烤干、爆开时的声响,记得昼夜不分时半明半暗的光线,记得下雨时既陈腐又清新的气味。
雨林是非常糟糕的地方,但Jason那次获得了非常美好的回忆。可能……大概……好吧,对自己没什么可隐瞒的,就是因为当时在他身边的那个人。
Jason走着神懒怠怠地编完了底层的函数,在main函数里随手添了两行,盯着编辑器底下的终端开始debug。
他下一步该写可视化图形界面,这个Bruce没教过,但应该不会很难。他真正该关心的是该显示些什么图片。
玩家用一只红鸟表示会不会太着痕迹了?但出口一定要用一只红蝙蝠,他总得在自己的软件上留个签名。箱子、墙、洞……好吧,这些图片都需要考虑考虑。——他刚才是不是说过不考虑墙和洞?Nah,甲方改主意了。
Jason把滑轮滑回去,开始扩充他的箱子种类。
与普遍认知不同,编程真正的难度不在于语言或者算法,而在于整个代码体系结构的设计。——对,这他妈其实是门艺术,讲究美学,讲究观感的,艺术。
跟做设计比起来,实现设计里的函数简单得不值一提。
……就好像,当你想要把自己和某个人的关系推动到某个特定的位置时,下定决心往往才是最难的部分。
Jason擅长的东西不算太多,绝大多数可以归到“侦探”和“雇佣兵”两棵技能树下,幸好他还有一项超能力,叫做让厨房在他出来时仍是他进去时的样子。
这个超能力非常有用,因为……还记得吗?Jason Todd是从蝙蝠洞里出来的。
离得近的时候,他会寄点小饼干什么的去泰坦塔,更近的时候,可能直接潜入进去放下两道加餐。Jason并不很在意那些食物最后进了谁的胃里,关键是那个人要知道是他干的。
那天他收到了一条消息,说很感谢他两天前送到泰坦塔的二十只烤生蚝,问他还在不在附近,想请他吃一顿饭。
Jason的手反应得比他的脑子快,他在看到消息的第二秒就答应下来。他希望自己没显得太急促,但具体结果如何,只有通讯器那头的人才知道。
他们在一家餐厅门口碰面,Jason西装革履而另一个人皮椅钉靴。他们不约而同地咳嗽一声,进门吃饭。
“所以,找我是有什么事?”餐桌对面的人第三次欲言又止时,Jason开口问道。
“嗯?呃,也没什么。”他扒拉了一把头发,“就只是,想当面谢谢你。”
他轻轻吸了口气:“你最近……很照顾我,我没什么好回报的,所以只能请你吃顿饭。”
Jason用叉子划拉了一下盘子里用酱汁装饰性绘制的纹路:“说到吃饭……你这次没给我生蚝的点评啊。”之前每一次,Jason都能连同感谢收到一份点评,他这位不可说虽说出身上流,但并不精通此道,几乎写成了“我猜你是这么做的”,但,聊胜于无。至少,那证明他用心吃了。
“啊,说到这个……我没吃到生蚝。”闷闷的声音让Jason抬起头看他,从那双蓝眼睛里看到了一点沮丧和更多的讨好。
Jason一直不是很敢看他,他害怕会压抑不住自己胸口的感情,说出他真正想说的话。
Jason没听他接下来说了什么,他假装自己在听,但其实没有。他知道这个故事十之八九从属于《饥饿的神速者》系列,Dick讲得已经够多了。
血色低于人类平均值的嘴唇开开合合,说道:“……所以,我想请你吃顿饭。我不希望你觉得我在怠慢你对我的关心,就因为……你已经这么关心我好一阵子了。”
“嗯哼。”Jason什么都没听,所以他最好别表现出来。
“同时,我也忍不住好奇,你这么做的原因。”他低下头,欠打理的黑发中露出两只苍白的耳朵,放在桌上的手握紧了拳头。
“为什么。”Jason嗓子发紧,但他还是问出来了。
“因为我有所期待,我想知道,原因是不是我希望的那个……”
对话正在向不可控制的方向滑去,而Jason不知道该如何阻止。或者说,内心深处,他不想阻止。即便他觉得自己没有足够的勇气听完桌对面的人的话,他也依然绝望地希望着他们想的是一样的。
“坦白地说我甚至不确定它们是给我的,礼物。但,我认为有一些可能性,它是。而在这一些可能性中,又有一些是,你送给我礼物,是为了,增进关系,增进,你和我的,关系。”
他的语调越来越轻,越来越小心翼翼,Jason几乎要在嘈杂的餐厅中错过最后几个字。Jason不确定自己心里到底在想些什么,这些描述清晰而又模糊,它们可以说是正中靶心,又称得上错得离谱。最后Jason只好如此回答他:“如果你想的话,你可以这么理解。”
看,这就是为什么Jason觉得编程语言比自然语言强上一百万倍——自然语言就像人类一样,充满了不确定的二义性。他们看起来是说了半天,但其实什么也没说。
那天的谈话让Jason一直气闷到现在,而他甚至说不明白自己到底在些生什么气。
去他妈的英语。
去他妈的人类。
……去他妈的Jason Todd。
他怀揣着“虽然语言无法表示但人类应当都不难理解”的心情决定了他要用些什么图片,然后绘制好了整个窗口,在drawImage上出了点小意外,但反正最后他成功解决了。
看到没?又一个IDE比人类社会强的地方,问题是诞生于有限的代码量的,而有限的代码量里只可能会有有限的问题。
人类社会不一样,人类社会就是一团永远在熵增的混乱。就像他截止到此刻的人生。
他加上了键盘监听,补充了操作提示,设定好了关卡输入的规范……
好极了,他现在需要做的就只有把脑子里的关卡设计写下来,然后打包出可执行文件,再发送给收信的那只小红鸟。
英语已经辜负了他,如果Java再辜负他一回,他就真的不知道要怎么表达内心汹涌澎湃的脏话了。
Tim在电脑前筑巢24小时,Conner开始担心。
Tim在电脑前筑巢48小时,Conner十分担心。
Tim在电脑前筑巢72小时,Conner非常担心。
“我觉得我们应该联系Dick。”Conner背着队长组织了一次少年泰坦会议,他确信这瞒不过Tim,但他也确信Tim完全不会关心他们在干什么。
事实上,过去72小时里,Tim除了那个U盘里的东西之外,什么都没关心过。如果不是队友们路过时会帮他把咖啡续上,他说不准已经把杯子啃了。
Raven和Garf是Dick的老朋友,他俩没有意见,Bart对什么都没意见,而Cassie是Conner的女朋友。
所以没有人提出任何意见,没人反对Conner的提议,换句话说,也没人对他表示明确支持。
这个队伍绝对有些毛病,Conner想,他们全都习惯听Tim的,没有任何人具备“五秒钟内拿出一套行动方案”的能力,所以当Tim出事的时候,他们就全放假了。
Conner还是联系了Dick:“嘿,Dick,我觉得有件事必须要告诉你——是Tim。他在电脑前坐了整整72小时,没去过任何比厕所远的地方。”
“新案子吗?那不是很Tim。”通讯那头的呼吸不大稳定,还伴随着时不时的风声,听上去像是在打架。
一声到肉的闷响,Dick继续说道:“怎么不联系Jason?Timmy最近和他的来往比和我的多。”
Conner欲言又止,止言又欲,他不知道该不该告诉Dick,让Tim筑巢的那个U盘上画了一只红蝙蝠。“我不确定,我们跟他都不大熟。”他最后说道。
“Rose。”Dick轻快的声音传来,“她以前是个泰坦,而且最近和Jason合作了。”
Conner觉得这听起来像是个好主意,所以他道谢后挂断了通讯,打给了Rose。
Rose没接。
这种事并不罕见,她经常不接通讯,一般来说会在12小时内给回复,他们也都习惯了。
但Conner不觉得他应该让Tim再做12小时——管他在做什么——了。
他诚恳地注视着他的队友们,希望获得一点支持:“我觉得我们应该让Rob去睡觉。”
Cassie给了他一个灿烂的微笑,而Bart说:“上,Conner。把他放倒。”
Conner确信这帮家伙是指望不上了。
所以他推开Tim房间的门:“呃,Rob。嗯……你好久没休息了,有什么我们帮得上忙的吗?”
Tim冲着电脑屏幕眨眨眼,缓缓转动他的脖子,长久没有活动的颈椎发出咔哒咔哒的脆响。他看着Conner,又眨了眨眼,如梦初醒,道:“嗯,对,过来。”
Conner走过去,Tim给Conner看他屏幕上的一个文件列表:“我三天前收到了这个——一个游戏,一个推箱子游戏。”
Conner还以为那里面是什么多重加密的机密文件,现在看来,全部的Luthor智力也不够看透一只蝙蝠的。“啊哈?”
“我反编译了可执行程序2,我以为代码里会有些后门,但没有。”Tim揉揉眉心,“它就是个游戏。”
Conner保持了礼貌性的倾听神态——他不知道自己该摆出什么样的表情,反编译一个推箱子小游戏不是正常人会做的事,但那是Tim,他每周黑进一次Lexcorp作为暖手,所以他会做这事很正常。相比之下,Jason居然没有留下任何代码彩蛋?这感觉就很不蝙蝠。可那又是Jason,他动不动就往泰坦塔送吃的,这也很不蝙蝠。
Tim继续说下去:“我打通了这个游戏,一共十关,录了屏。(他切换了一个窗口,上面有许多图片,还有一个视频)这是每一关初始的状态,它们都有不止一种解法,所以信息不可能是在通关过程里,那就只可能是在关卡设计里。”
“红鸟是玩家,红蝙蝠是关卡出口,也是下一关红鸟的初始化地点。”Tim的声音开始紧绷,“我把每一关的地图连上了(他给Conner展示了一张图片),什么都没有。然后我把红鸟的位置重叠起来(他切换了一张图片),依然什么都没有。接着我把红蝙蝠的位置叠在一起(又换了一张图片),还是什么都没有。”
Conner看了一眼Tim,后者的浅蓝的眼睛中似乎在孕育一场暴风雨。他犹豫着提议道:“呃,有没有可能你只是太累了,以至于忽视了某种可能?”
这次Tim给他看了一张表格:“我数了每一关每一种格子的个数,和、差、积都算了,构成的数列没有任何解码的办法。每一关的每一行、每一列我都用三种方法翻译成了二进制3,无论是ASCII还是其他什么编码都解不开。”
Conner隐约感到了什么,这时候Tim问他:“告诉我,超级大脑。——还有什么可能?”
“直接去问他?”Conner摊开手。
“我自作多情过了,两次。……我不会再做第三次了。”Tim说。
Conner没有办法了。
Conner打昏了他:“先睡一觉吧,Rob,我相信他不会在24小时内多一个恋人的。”
Tim在泰坦塔里对他不设防,所以直接昏死在了他的椅子上,嘟囔都没有嘟囔一声。
本着人道主义精神,Conner拷贝了他分析到一半的文件,试图做出一些贡献。
但不幸的是,尽管他的生父(之一)拥有宇宙顶级的九级智慧,但连蝙蝠侠秘密身份都不知道更不关心的他,显然没能给儿子遗传“如何解析一只蝙蝠”的技术。至于Conner本人,虽说理论上出生前就被心灵感应教导了人类社会的全部知识,不过因为一,长期属于锻炼,二,蝙蝠是人类/氪星人不可解析之谜他锻炼也没用,并不具备超出平均水平的理解/推理能力。
Conner尽最大的努力,试图集中注意力从那十张图片上得到点什么——结论是,他如果是个绿灯,恐怕活不过十一分六秒。
十一分六秒,这是他在完全摸不着头脑的事上集中注意力的上限时间。
十一分六秒后,Conner打开了那个视频。
这份小礼物谈不上精致,坦白说,甚至显得有点粗制滥造。——作者草率地画了几个勉强可识别指向但细节全然不对的超级英雄LOGO做贴图,没有任何动画效果,也没有BGM或移动音效,只有一个消息框,简单粗暴地描述了移动方法。
那只胸前有交叉绑带的红鸟显然是指红罗宾,也就是玩家,或许说明这是专为Tim写的游戏?再不济,至少也说明,送到Tim手上的这个版本,贴图是设计过的。
一只红蝙蝠代表出口,V形翅膀的蓝鸟是可推动的箱子,外面有个圈的金色R字母代表不可移动的墙。还有一种图案是个蝙蝠——或者说是个白色的蝙蝠形线框——,它代表……
Conner傻眼了,他下意识把视频回退了几秒钟,重新播放。
屏幕上,红鸟没能痛过蝙蝠线框的格子,所以绕了一圈,把蓝鸟标记推向蝙蝠线框。蓝鸟消失不见,蝙蝠线框上则覆盖了一个碧绿的图标——一横,一圈,一横,那是个绿灯军团的徽记。
红鸟兀自移动,踩过叠上绿灯的蝙蝠线框,冲进了红蝙蝠的领域,开启下一关。
夜翼、罗宾、蝙蝠侠都好理解,毕竟是他们自家人。但……绿灯侠?
这贴图就是他随便画的吧,Conner完全看不出其中的逻辑何在。
Conner茫然地看完了视频,正准备再看一遍时,他的通讯器响了,是Rose。
“我帮你们问了问。外星公主什么都不知道,蝙蝠男孩积极抵抗,弓箭手说‘Jaybird弄了很久’。”
然后她发来一张图片,附言“这是他的桌面,或许有点线索?”。
Conner对她表示感谢,然后开始研究那张图。——如果让Tim知道它的存在,他一定会立刻从床上窜起来,继续在电脑前的慢性自杀行为,所以Conner不准备让他知道。
一分钟后他确信这玩意儿没用——在昏暗的光线下,摆在那张桌子上的,是一本《战争的艺术》4。
推箱子小游戏里一个字母没有,这本书通篇是玄之又玄的理论,这能对上就真的见鬼了。
Conner满脑子浆糊,愁得直挠头——他刻意放轻了手劲,因为他不想继承但他也不知道有没有继承的部分Luthor基因。
“你知道,”Cassie来到他身边,贴着他坐下,“小说里解密的关键都在设计谜题的人身上。”
“我知道。”Conner露出一个大约比哭还难看的笑容,“但我除了陈列室里那句留言5外,对他真的一无所知。”
他们没有人了解Jason——Tim除外,当然——,第二位罗宾生性张狂桀骜,只愿意和他认可的人组队,这点和现任罗宾出奇一致。他们对在意的人掏心掏肺,对不在乎的人死活不论,连面子功夫都不做。Conner不是说他介意或者什么,内心深处,每个人都会把人际关系划一个亲疏远近,只是在眼下,这对他而言真的不算什么好事。
或许他该去查一查。
Tim从昏睡中醒来时,就看到Conner垂着一双狗狗眼,坐在他床边的沙发上,看起来几乎是在愧疚。
“出什么事了?”Tim问他。Conner把他打晕了,而且没叫醒他,说明事情没紧急到世界在红罗宾睡着时毁灭的地步;可Conner不会随便愧疚,他又没有自毁倾向。
Conner抬起他灰绿色的狗狗眼看他,灰绿色继承自Lex Luthor,狗狗眼继承自Clark Kent,这种混搭诡异地可爱着。Conner说:“我想帮你解开那个小游戏,但我好像搞砸了……”
Tim从床上坐起来,等候着Conner的后半句话,然后他意识到这大约是他人生中最大的一次危机。未来蝙蝠侠(Tim Drake版本)不是,差点被忍者大师的姐妹绑起来强奸也不是,那些生死一线的任务更是连屁都不算,因为……
“我触动了他的警报,他觉得是你干的。”
妈的。
Tim的脑子在一瞬间内转过无数念头,大约有60%左右是各种语言的脏话,有一部分尖叫着让他打电话给Luthor要求退货“不是说全部的Luthor智力吗?虚假广告!”,还有一部分数量很少,但存在感异常明确,驱使着他拿起通讯器看看都收到了些什么消息。
唯一一条未读来自军火库。
“我觉得不是你干的,但他嘛……他最近一直心情不好。我可以再给你一周让他开心起来,你可能不需要他,但我们需要。”
你才不需要他,这是Tim的第一反应。
Tim重新回到他的案子上。
这不是红罗宾的案子,也不是Timothy Drake的案子,而是那个九岁起就抱着相机,孤身一人在哥谭大街小巷游荡的Tim,十岁那一年遇到的案子。
——你是谁?你是个什么样的人?
第三任罗宾潜入了他前任在庄园的卧室,搜查了他在犯罪巷的据点,在艳阳高照的日子给他的墓碑除草,捡回他从平行宇宙穿回来又丢掉的制服自己穿,在纽约的Lex塔顶邀请他留下一起吃早饭……
但Tim从不敢说自己了解他。
Tim不敢说,对方为什么会愿意陪他在东南亚的雨林里打半个月飞虫,为什么会愿意三天两头给他送加餐,为什么会愿意西装革履出席一次平平常常的晚餐。
因为那个他说过的原因——他有所期待,他希望对方也对他抱有一样的感情。
“如果你想的话,你可以这么理解。”Tim听到这句话的时候,就知道对方一个字也没听懂。他可能是真的没有听懂,更可能是在和善地拒绝他。“怎么当个好哥哥”那一套,Tim不会怀疑Dick把这套鬼扯教给了他——难以置信,Dick至今都没发现,他所谓的“成功”只是因为Tim和Damian在刻意配合他而已——,他们时不时就见一面。
某种意义上,蝙蝠侠真的是个教育天才——他能让自己的儿子替他养儿子,而且心甘情愿,甚至成果很可能比他本人亲自上还好。
这就是为什么Tim始终觉得Dick对Bruce有些超出常理的感情。他可以理解,头两任罗宾都对蝙蝠侠有着某种或许不大健康、起源于青春期前、从未被妥善解决过、偶尔可能还掺杂性的迷恋;但,Dick有时实在是有点太惯着Bruce了。或许这是爱情,或许这就是Dick,Tim一度难以确定。
——等等。
把箱子推向坑,坑被箱子填上,成为可通过的路面。
把夜翼推向蝙蝠侠,蝙蝠侠……
世界第二侦探发现自己之前大错特错,错得离谱。送这份礼物的人喜欢诗歌和戏剧,他才不会用极客那一套藏起信息,他不会在程序里留下暗门,也不会在图形和数字上暗藏玄机……他会用经典的、老派的、诗意的方法。
这个推箱子游戏就是信息本身,它是个比喻。
它的游戏规则,就是那个人想对他说的话——
“小红鸟,推开夜翼,绕过罗宾,堵上蝙蝠侠的嘴,到我身边来。”
就是这个,一定是这个,只可能是这个。
八年之后,他的案子终于破了。
Tim拨出电话,对面在响了两声之后把它接起来,一个字都没说,Tim只能听到那个人轻轻的呼吸声。
“嘿,”他小心翼翼地开口,“能告诉我你在哪儿吗?”
Tim到的时候,Jason正在摆多米诺骨牌,黑的红的摆了一地,旁边还有两箱刚拆封。
“V字仇杀队?”Tim低头看了一眼,“认真的吗?”
Jason放下手里最后一块,耸耸肩:“这么大片空地,空着也是空着。”然后他站起身来,从箱子里又抓了一把,从头到尾没看Tim一眼:“你找我什么事?”
Tim没答,蹲到他身边:“我要是现在给你推了,你会怎样?”
“用你脖子里的血把它们粘回地上。”
“呵。”Tim笑了笑,“这句不错,介意我剽窃一下吗?下次和Damian吵架可能用得到。”
“你知道,”Jason总算看了他一眼,“你俩真的到了,不能再一凑到一起,就都瞬间变回七岁小孩,的年纪了。”
Tim轻蔑地哼了一声。
“——呃,不,不是七岁,三岁。Dick和我都确定你们七岁的的时候得比这成熟,得多。”
Tim震惊地瞪大了眼睛:“你们俩在一起聊的是我和Damian?!”
Jason露出一个诡异的笑容——事实上,他会和Dick聊他们都认识的任何人,为了防止Dick把话题扯到他身上。但他又没说谎,七岁的Tim连赢了两年全额奖学金——嗯对,私立贵族学校从小学一年级起就有奖学金,为了鼓励学生竞争——,而七岁的Damian同时在学古希腊语、中国水墨画、高聚酯材料设计与合成、黑客技术、和刺客联盟经典之把暗杀设计成自然死亡的八百一十六种方法。刚死回来那会儿,Jason查过Tim的所有公开资料,而Damian十岁前的教学计划是就是他本人写的——Talia和Ra’s都觉得,他们计划征服世界的继承人可以用上一些父亲那边的教育方式,而考虑到那会儿全知全能的蝙蝠侠甚至不知道他有个儿子,那只能由他的继承人(次席)Jason代劳了。
Tim不耐地“啧”了一声,而Jason依然在brothering6他,感觉简直要没完没了。“你知道,Dick不是十八岁了,他有自己的生活要过,他不可能永远在那儿,给你俩提供,你们应该自己长出来的成熟、理智、和容忍有的事、有的人,不会仅仅因为你讨厌就变成错的。”
是啊,如果你不是那个Dick在十八岁的时候在教如何长大的人的话,这话听起来可能还真的有那么点说服力。Tim在心里默默念叨道。
但同时,他还冥顽不灵地说道:“人总要给自己留点希望。”
Jason叹了口气,喉咙里还带着笑意。他把手里剩下的多米诺骨牌放在脚边,然后转身看向Tim:“作为一个世界级侦探,你可真是有个顽固得难以置信的脑子。”
Tim挪过去——事后想起来,他鸭子步的姿势十有八九既不理智,又不火辣,岂止不火辣、简直可笑得吓人,但当时他和Jason大概都没发现这个——,问道:“你对我的脑子有什么意见吗?”
Jason盯着他的眼睛,Tim只能从那对斑驳的祖母绿里看出一片虚无。Jason点了头:“它很吵。很烦人。”
“但它解开了你的谜题……就是,你藏在推箱子小游戏里的那个。”
Jason困惑地眨眨眼睛:“什么谜题?”
如坠冰窟并不足以形容Tim那一刻的感觉,事实上,他失去了从第一节颈椎骨往下的知觉,而如果Jason真的能听到他大脑转动的声音,大概也能听到它此刻因为系统错误炸出一大堆电火花,然后彻底崩溃退出,甚至没来的及执行重启命令的死机声。
“什么谜题?”,所以说没有谜题。
Jason没那个意思,什么“到我身边来”,那就只是他牵强附会出来的。
……是他自作多情了。第三次。
操。所有回应都是想象的单相思的痛苦与绝望,和推理彻头彻尾地错误的挫败与羞辱,这二者争夺着Tim的心脏,唯一共同的地方只有“绝对不能让Bruce知道”,而这才不是什么能阻止他的心脏裂成两半——或者更多,比如碎片——的概念。
Tim不由自主地想起他前两次犯傻逼的时候。
第一次是在缅甸,Tim本来只是给Dick回短信,就是“最近怎么样”那种短信。而Tim,好吧,他承认他当时不怎么在状态,所以他回复的是“缅甸雨林,离贝爷只差一个剧组,如果我不会先一步被无聊死的话。”
正因为他不在状态,所以,他发消息的时候一个手滑——可能有那么80%的故意吧,毕竟他真的有个超好的借口,实在很难抗拒它的诱惑——,也同时发给了Jason。
他当时决定假装自己从来没干过这事,所以当八个小时之后,Jason从他面前的那棵树后面走出来时,他大约是惊喜得失去了任何表情管理能力——这个判断基于Jason突然露出且无法抑制的笑容。
事实上,Jason甚至张开双臂,歪过脑袋,笑呵呵地“嗯?”了一声。
所以是的,Tim当然他妈的冲过去拥抱了他。
Jason出现之后,缅甸雨林的每一分每一秒,都让Tim觉得他随时可能养出对多巴胺的抗性,或者对睾酮的,或者二者都有。到了Garf嘴里,他大概会说“就像是只有一半时间的蜜月”。但对于Tim而言,那远胜他能想象到的任何蜜月。他们没有争吵,没有揭开任何一条伤疤,甚至没有去叫任何其他人,——就只是,Jason和他,为“这顿的果子是单数”而猜拳,还有其他Tim永远也不会告诉任何人的事情。
有那么一个时候,下着大雨,厚实的积雨云严重影响了可见光,他们在棚屋里用之前收集的干树枝升起一堆篝火,坐在它旁边,Jason讲了个笑话——又或者是句讽刺,反正结果都一样——,他们都笑了起来。
Tim觉得那个时机堪称完美,所以他盯着Jason,问道:“所以,你有在和什么人……约会,或者,别的什么吗?我是想,如果你和我一样,都有空,说不定我们可以,你懂,多一起,玩玩,什么的。”
你是在约我出去吗?
Jason可能飞快地瞥了他一眼,又可能那就只是Tim的幻觉,然后说道:“我?还是单身,暂时而言。事情是,我的上一个约会对象说,直到外星人突然出现,她被带上太空飞船抵达异星球之前,那都是她经历过的最无聊的约会;同时,有这么一个人,我很想约出来,可我又完全不知道该怎么安排这次约会;最后,我害怕被拒绝,害怕这会毁掉我们之间的关系。”
所以如果,你可以问了。
Tim在“没人会拒绝你”和“我可以来安排约会”之间犹豫了一下,然后说道:“所以你带她干了什么?上一个约会对象。”
看来你没这意思。
Jason讲起了他的华尔街故事,而Tim盘腿坐在篝火边,伸手支着下巴,一个字都没听进去。
从雨林回去没多久,Jason开始给他送吃的。Tim简直不知道该怎么形容那种感觉:一方面,Jason记住了他“多一起玩玩”的邀请,多半还推测出他最近有点……欠缺陪伴;另一方面,他知道同时,就在同时,说不定就在Jason做那些超棒的蓝莓蛋挞的时候,Jason有一个喜欢的人。
正因如此,Tim强迫自己把对Jason所有的监控调成了静音,因为他真的没有看直播的兴趣。不过,他并没有在每天看录播的那五分钟里发现任何“约会”的迹象。所以他内心深处的一个念头愈发膨胀——如果Jason已经被拒绝了呢?
错过二十只生蚝两天后,他终于决定约Jason见一面。他花了一个小时删改他的草稿,点击发送,然后捡起两根导线,烧掉了手机电源。
两个小时后,他修好手机,看见了那句“好”。
Tim没吃到生蚝,Jason眼里只有他的盘子,在同时卖牛排和墨西哥玉米卷的小餐厅里。而Tim居然希望在这种会面里和Jason好好聊聊。
这根本不是约会。而即便这是个约会,那一定也是Tim见过的最他妈完蛋的约会。——把Bruce约Lois在旋转餐厅吃晚餐,吃到一半的发现Clark在Lois身后的玻璃外悬浮着,冲他疯狂招手,然后帮Clark拆了Lex大概半吨机器人,后半夜收工,和他一起在星球日报楼下的咖啡馆吃夜宵,这时候发现Lois从他们窗外路过,上楼去写他俩刚搞出来的新闻,而且她搭的是Lex的便车,的那次也算进去。
因为那个时候,这四个人至少没有像Tim一样说不出人话来:“坦白地说我甚至不确定它们是给我的,礼物。但,我认为有一些可能性,它是。而在这一些可能性中,又有一些是,你送给我礼物,是为了,增进关系,增进,你和我的,关系。”
所以当然了,Jason的回应和Tim的问题一样模糊不清。“如果你想的话,你可以这么理解。”
我还想你愿意当我男朋友呢,我也能这么理解吗?
不是约会的约会结束在令人浑身难受的沉默里。Tim觉得他应该把Jason打一顿,或者让Jason把他打一顿。
然后是现在,第三次。Jason说:“什么谜题。”
“Tim?Tim!”Jason在叫他。
Tim打了个激灵,发现自己还蹲在那堆多米诺骨牌旁边,而Jason看起来在担心他:“你怎么了?”
“没……”Tim下意识地想说没事,但他强行忍住了,因为那骗不过他,“有事。”
他不想再看Jason,所以低下头,左脚后滑了半步,听见咔哒一声脆响。
Tim下意识看过去,看到了正在倒塌的大半个V字符号。
第三次他自作多情,连带一脚踹翻Jason搭了不知道多久的多米诺骨牌半成品。看来第三次确实是种Charm。
操他妈的。
Jason本来的计划是,等他摆完这个多米诺骨牌,就拍个视频发给Tim。
现在……姑且说,整个流程都被Tim加速了吧。
“有什么事?”Jason试图表现得和善些,毕竟每次聊到私人话题的时候,他俩都把对话搞得很僵。——或许他该去问问Dick,或许Dick是这世上他最不该去问的人。
Tim看着倒塌的多米诺骨牌,沉默了一会儿,才终于说道:“抱歉。”
“没什么,早晚要推了的。”Jason站起来,伸手想拉一把Tim,但他没接。
好吧,Jason想,我又搞砸了。世界上有些事情,因为过于微妙,所以总是没有简短的解说版本,他不知道到底哪里出了问题,但显而易见,他又搞砸了。
他们僵持了一会儿,直到Tim终于决定站起来,然后他一个腿软,整个人栽进了Jason怀里,而Jason下意识抱住了他。
“我知道现在时机不太好,但是……”Jason盯着Tim的后脑勺,“没有什么谜题。我就只是想说,我总会在你能到的地方。仅此而已。”
Tim没有抬头,就只是在他怀里冷笑两声:“你知道,这挺可笑的。因为我觉得,你是在说,让我到你身边来。”
Jason下意识伸展了一下胳膊,彻底把Tim搂在怀里:“唔,嗯呐,它有那个意思。”
Tim猛得抬起头,软软的头发轻扫过他的下巴,那双浅蓝色的眼睛瞪着他:“你说什么?”
那双眼睛的注视太过猝不及防,Jason甚至来不及思考,就做出了那件事,那件他一直想做,但没找到机会的事。
他吻了Tim,然后扭开头:“也有这个意思。”
“它到底什么意思,Jason?”
Jason……Jason不好意思说,他伸手把Tim的脑袋压进自己胸口。因为回到他神志不清写程序的时候——那是凌晨四点,他头脑发热得合情合理——,他想的是……
“你愿意当我一个人的小红鸟吗?”
END
不为人知的故事:
后来,Tim靠在Jason身边,终于静下心来玩那个游戏,他才发现了一个问题:“所以,为什么我把Dick推向Bruce,会跳出个Hal来。”
“你之前都没发现?”
“没,我只顾着看你的源代码了。”
Jason耸耸肩:“就,你还记不记得,你以前是站Bruce和Dick这对CP的?所以我觉得让你把他俩推到一起,这个操作会很符合你的直觉。但是,前不久,你突然变成了Bruce和Hal的CP粉,所以……唔,我没能想出什么好主意,但我觉得至少可以做一点小修改。”
Tim盯着屏幕上那个潦草的绿灯徽记:“好吧,哈,我挺喜欢的。”
Footnotes
-
Jason这个学位出自红头罩与军火库的漫画。 ↩
-
反编译:设定上,Jason送给Tim的是一个Java写的,在Linux上运行的游戏软件(也就是一个jar包)。但我并没有研究过这种程序,我只在Windows下反编译过apk包。我也不知道一个jar能不能直接反编译,但反正都是Java写的,而Java有相当优良的跨平台性能,所以就当它可以吧。 ↩
-
三种方法翻译成二进制:1. 箱子为1其他为0;2. 所有块为1,空白块为0;3. 箱子和墙为1,其他为0。 ↩
-
战争的艺术(The Art Of War):孙子兵法英文译名。 ↩
-
Jason Todd Was Here:Jay潜进泰坦塔打Tim的那期漫画里,两个人一路打到放死亡成员雕像的房间,里面没有Jason。Jason说“I was a Titan, too!”,一棍子抽翻了Donna的雕像。最后Jason用红颜料(或者血)在墙上留下了这句话和一个手印。总而言之相信我,跟漫画待遇比起来,少正S2的投影真的甜到爆炸。 ↩
-
brothering,其实我都不确定英语里有这个词,但brother-ing的意思应该不难理解:Jason在表现得像个哥哥,但他事实上并不把自己当做他俩的哥哥,他也知道他俩不把他当成哥哥。 ↩