六月二十二日,凌晨三点十一分。 沈砚从短暂的睡眠中醒过来的时候,手机屏幕正亮着微博推送的冷白光线。他没看那条推送的内容,手腕上的电子表显示他睡了四十二分钟,但这四十二分钟里他没有做梦,脑子里只有六楼机房那台Dell PowerEdge服务器散热孔里吹出来的干燥热风,以及屏幕上MD5值比对结果——两个长度一样的十六进制字符串,从第三十二位开始出现差异,一直延续到末尾。 他翻身坐起来。 宿舍的单人床垫因为他的动作发出短促的吱嘎声。空调设定的二十四度偏低,裸露的肩膀上起了一层细密的鸡皮疙瘩。沈砚抓起搭在床尾椅背上的深灰色T恤套上,布料碰到皮肤的时候还残留着昨晚从运维机房回来时混在织物里的那股金属和电路板的冷涩气味。 他站起来,没有开灯,走到窗边。六月佛山凌晨的天色还没透亮,窗外那棵老榕树的树冠在路灯橘黄色的光晕里投下一大片沉甸甸的墨色阴影,树影被风扯动的时候像某种在水底缓缓游动的生物。对面宿舍楼的窗户几乎全是暗的,只有五楼靠左手边的某扇窗亮着极淡的白光,大概是哪个组的人还没睡,也可能只是忘了关显示器。 沈砚用拇指划开手机锁屏。 微博推送还在最上方横着,发信人是"游戏圈话题榜话题讨论",标题写着:"《神陨之墟》策划组疑似内部动荡,玩家联名要求公布副本设计逻辑——"后面跟了一个愤怒的表情符号。他没点进去,直接清掉了这条通知,转而打开相册。 相册里最新的一张图是他凌晨从机房导出来的拍摄文件——手机对着服务器终端屏幕拍下的对比截图。左边是运维系统显示的五月十二日补丁包MD5值,右边是他从备份镜像里提取出来的实际二进制文件计算出的MD5。两个哈希值从第三十二位开始分岔,这意味着被替换的代码至少有两千多个字节,将近三行完整逻辑代码的量。不是注释。不是空格缩进。是实实在在的可执行代码。 沈砚盯着这张图看了大概十秒钟,然后把手机屏幕按灭。 他得先去一趟老赵面馆。 凌晨三点钟从宿舍区走到北门侧街,路径穿过整个西区停车场和半条被树荫遮蔽的水泥路。六月的夜风很闷,吹在脸上带着南方那种黏稠的潮气,气温虽然比白天降了七八度,但湿度让凉意打不穿皮肤。路边的白玉兰已经过了盛花期,偶尔飘过来一缕将散未散的残香,混在柴油发动机残留在空气里的尾气痕迹里。 停车场里停着七八辆夜班留宿员工的私家车,其中一辆白色的丰田卡罗拉前挡风玻璃上凝结了一层薄薄的水雾,雨刷底下压着一张黄色的违停提示单——物业管理处贴的,大概是停错车位。沈砚从车尾绕过去的时候瞥了一眼车窗内部,中控台上放着一罐没喝完的冰红茶,易拉罐被压扁了,大概是某个人下班后坐在这里抽了根烟喝掉半罐,然后上楼去加班了。 老赵面馆的灯亮着。 这家店开在北门侧街的拐角,门脸窄,招牌是用红底白字的塑料板钉在墙上的那种老式样式,上面的"赵"字被六月暴晒褪了大半,只能勉强辨认出轮廓。但凌晨三点还在营业的唯一一家就是这里,除了老板赵叔自己值夜,招不到愿意干这个时段的帮工。卷帘门半拉着,底下露出一截五十公分高的缝隙,昏黄的灯光从那道缝隙里淌出来,落在门口台阶上落了半夜的灰尘里,把灰尘颗粒照得像细微的悬浮金粉。 沈砚弯腰钻进去。 店里只有两桌坐了人,一桌靠墙坐了三个人,穿着背后印着"神陨"二字的黑T恤,正面前堆了三碗老汤面的空碗;另一桌靠门坐着一个单独的男人,旁边放着一台开着的笔记本电脑,屏幕光照得他侧脸线条分明,他没在吃东西,面前只搁了一杯已经见底的柠檬水。 靠墙那桌的三个人在说话。声音不大,但在凌晨三点空旷狭窄的面馆里传得很远。 "——我跟你讲,那个落石+扇形AOE的配合,完全是反逻辑设计,"说话的是三个人里最壮的,国字脸,寸头,嗓门里压着一种被折腾了太久之后的疲倦式怒火,"落石先出预警圈,两秒后石柱落地生成障碍物,紧接着boss读条扇形AOE。问题在于落石生成的障碍物会挡住扇形AOE的边缘覆盖区域,玩家按照正常逻辑去利用障碍物躲避AOE,结果那障碍物只存在四秒,四秒后自动碎裂,但AOE读条要五秒。最后那一秒——" "最后那一秒把你从障碍物后面露出来了。"坐他对面的瘦高个接话,语气平静得多,但咬字里带着一种类似冷笑的节奏。 "对。整整一个CD的团,三十二个人,卡在这个机制上灭了一晚上。我T掉了一万二的耐久度。一万二。" "策划脑子有问题。" "你怎么知道是策划脑子有问题?"瘦高个往椅背上靠了靠,手指在桌面上敲了两下,"说不定是故意的。逼你买耐久修理符。" 寸头沉默了两秒,把空碗往里推了推,发出一声瓷碗碰木桌的钝响。"我没买。硬扛着打了,最后过了,过了之后我截了图,去论坛发帖问了,你猜怎么着?——三分钟帖子就被删了。" 沈砚站在门口的位置,距离点餐台还有两步远,能清楚听到这段对话里每一个字。他顿了顿,没有径直走向柜台,而是偏过头,对靠墙那桌的方向说了一句:"落石障碍物碎裂前的零点五秒,地面会出现一道裂纹特效,横向的,大概在障碍物底部三分之一高度。看到那道裂纹的同时向侧面翻滚,AOE判定框会提前零点三秒刷新。" 寸头转过头来。 他脸上的表情从被突然打断的戒备慢慢变成一种缓释的恍然,然后是更深的某种东西——像是被人提醒了一个他想过很多次但始终没找到答案的问题。他看着沈砚,眉头皱起来,嘴唇动了动,像在回想什么。 "那裂纹我见过,"他说,声音比刚才低了两个调,"我以为那是落石碎开的视觉反馈,没往判定预警的方向想。" "游戏里绝大多数视觉特效都不只是视觉特效。"沈砚说。他说这句话的时候语气很平,像在陈述一个天气数据。 寸头旁边那个一直没说话的第三个人忽然抬起头来。这个人比寸头和瘦高个都年轻,戴着框架眼镜,镜片在暖黄灯光下反出一片白亮的光晕。他盯着沈砚看了几秒,然后开口:"你就是那个策划吧?" 沈砚迎上他的视线。 他犹豫了大概半秒,这半秒里老赵面馆后厨灶台上一锅高汤正滚到临界点,发出沉闷的嗡鸣声,混在空调外机的低频噪音里,让空气中短暂的寂静被填充得几近满溢。 "我负责那个副本的一部分设计。"沈砚说。 戴眼镜的年轻人猛地站起来,椅子腿刮在地砖上发出刺耳的尖声。他的动作很快,半边身体已经从桌沿探了出来,但寸头伸手按住了他的小臂,没让他再往前。那个力道不大,但戴眼镜的年轻人停住了。 "一部分设计——你知不知道我们团昨天从晚上八点打到凌晨两点四十分,就卡在这个机制上?"戴眼镜的年轻人的声音有轻微的发抖,在压抑不住和想要克制住之间摇摆,"我知道你肯定又要说什么机制设计都有解法破绽提示、每一处伤害都是可预判的,但你有没有真的自己去打过?一晚上灭团十七次,十七次,你坐在工位上写代码的时候想过玩家面对十七次灭团是什么感受吗?" 沈砚站在原地,背后半拉的卷帘门底缝溜进来的一线夜风吹在他后脚跟上,带着外面潮湿的柏油路面气味。他看着这个戴眼镜的年轻人,对方的胸口在T恤下面明显地起伏着。 "我打过,"他说,"内部测试的时候,开荒这个机制用了四次。第一次是我自己写的代码,我知道落石碎裂的动画帧里嵌了裂纹特效,但我打的那一次没有提前发现。第二次注意到了地面纹理变化,第三次提前翻滚了零点三秒但方向偏了十五度,第四次过了。" 戴眼镜的年轻人嘴唇微微张开,像被噎住了。 寸头松开按住他小臂的手,慢慢靠回椅背,打量着沈砚的目光里那层戒备的底色还在,但上面覆了一层新的东西——像是在重新估算眼前这个人的分量。 "你叫什么?"寸头问。 "沈砚。" 寸头沉默了一下,像是在脑子里搜索这个名号,然后摇了摇头。"没听过。你在哪个组?" "技术策划。六楼。" "六楼?"瘦高个插进来,语气里带着一点隐约的意外,"六楼不是运维和服务器组吗?" "运维和服务器组在三楼到五楼,"沈砚说,"六楼是技术策划和关卡整合。" 寸头眯起眼睛,像是在心里把这条信息拼到某个框架里。他还没来得及继续问,沈砚侧过身往点餐台走了两步,然后像是想起什么似的回过头来。 "你们团长是不是姓顾?" 寸头一顿。"你认识老顾?" "不算认识。上周五他给反馈平台提交了一份落石AOE的机制拆解文本,里面有一条时间轴推算,AOE读条从boss抬手到伤害判定是五点三秒,但我文档里写的初始值是五点二秒。他测得很准,零点一秒的误差是帧率浮动造成的。但他拆解文本最后一段提到'裂纹特效出现位置存在随机偏移',这个是错误的。裂纹始终出现在障碍物底部径向三十度夹角范围内,是伪随机。你可以转告他,让他修正。" 他说完这些话的时候,老赵已经从后厨掀帘走了出来,手里端着一只搪瓷碗,里面是热腾腾的素面,汤色清亮,表面浮着一层薄薄的油花和几粒葱花。老赵看见沈砚,没多余的寒暄,把碗搁在点餐台一角的木托盘上,朝沈砚抬了抬下巴。 "今天怎么这么早。" "睡不着。"沈砚说。 他在点餐台旁边的高脚凳上坐下来,开始吃那碗面。汤是热的,面条煮得略硬,咬下去能感觉到麦芯的韧性。他吃得很慢,用筷子挑起一绺面,吹凉了,再送进嘴里。背后那桌的三个玩家安静了很长一段时间,然后寸头率先站起来,把三只空碗叠在一起端到点餐台旁边的回收箱里,碗底碰撞发出清脆的叮当声。 他们走的时候,戴眼镜的年轻人经过沈砚身侧,停顿了不到一秒钟。 "谢谢,"他说,声音很轻,"裂纹那个信息。" 沈砚没抬头,只是把碗里的汤喝完了。 他从面馆出来的时候天边隐约翻了一线灰白,不是天亮,是城市灯光在低云层上的漫反射。北门侧街空无一人,路灯还亮着,灯杆底下聚集了一小群飞蛾,绕着光晕打转。 手机在兜里震了一下。 沈砚摸出来看,是微博客户端推送的"你的内容有人互动"——他甚至不记得自己什么时候在微博上有过活跃。他点进去,转了几圈加载动画,然后看到了一条被截图的微博。截图主体是有人远远拍的老赵面馆门口,时间大概就是他刚才弯腰钻进卷帘门的那一刻,拍到了他的背影轮廓和半侧脸。配文写着:"《神陨之墟》策划组员工深夜现身面馆,疑似与玩家正面冲突?据说就是设计'落石障碍'那个傻逼机制的策划,大家认认脸。" 沈砚往下划了两屏,底下已经跟了将近一百条评论。他一条都没看完,前面几条里有人贴了他去年在行业论坛做技术分享时的侧脸照片做对比,有人说"就是他,我见过他上台",也有人说"别网暴,搞清楚再说"。 他把客户端切到后台,按灭屏幕。 手机又震了一声。这次是短信。 季成蹊发来的,只有一行字。 "明天九点到我办公室。带上你最近在查的所有东西。" 沈砚盯着这行字看了大概五秒钟。短信发送时间是凌晨四点零三分,距离现在过去了十几分钟。他不知道季成蹊这个时间还没睡,还是醒了之后看到某些信息才发的这条消息。他也不知道"最近在查的所有东西"这个措辞里包含多少他已经掌握的内容,又包含多少对方已经知晓的内容。 他把手机放进裤兜,沿着来的路往回走。 老榕树的树影比刚才偏移了一些角度,风停了,叶片静止不动,像一整片剪影贴在穹顶的灰暗中。沈砚走过停车场的时候,那辆白色卡罗拉挡风玻璃上的水雾更浓了,压着的黄色违停单被夜里的露水润湿了一角,边沿卷了起来。 他忽然停住脚步。 不是因为那辆车。是因为他路过停车场出口门禁柱的时候,注意到柱子侧面被贴了一张新的白色A4纸,上面印着两行打印体小字——"本月十三日凌晨三点四十分至四点整,六楼空调外机检修,期间机房温度或出现波动,请各位同事配合。" 十三日。 五月十三日。 他记得五月十二日的补丁推送和次声波预警参数调整,记得五月十四日晚上GM后台有人给06区测试服特定角色ID添加了隐藏标识位。但五月十三日凌晨三点四十分到四点的这个时间段,他之前没有在任何运维日志或工单系统里看到过。 沈砚把那张A4纸从门禁柱上揭下来。纸背面的胶还黏着柱身的金属漆面,撕下来的时候发出细微的裂帛声。他捏着那张纸折了两折,塞进侧兜。 拐过西区食堂的转角时,他终于点开了那条被截图的微博推送下面的评论区,看到了第一条被置顶的热评——来自一个ID叫"Kappa_404"的用户,只写了七个字。 "别查了,对你不好。" 沈砚的脚步有一瞬间的停滞。 然后他继续往前走,步伐没有明显变化,只是握着手机的右手收紧了半秒又松开,让那七个字在白光屏幕上停留了足够他记住每一个笔画的时间,才把屏幕按熄。 宿舍楼入口的感应灯亮起来,惨白的LED光照亮了台阶上一片干涸的蜗牛爬痕。 沈砚推门进去,一楼走廊的声控灯一路往后亮过去,在他身后一截一截地灭下来,像某种节律性的追索。 他上了楼,打开宿舍门,没有开灯。靠着门背在黑暗中站了大概半分钟,听到走廊尽头最后一个灯管关掉的滋啪声,然后整栋楼陷入寂静。 手机还在裤兜里,隔着布料传过来隐约的温度。他没再拿出来看。 明天九点。 他得想清楚从哪件事开始说。 但在此之前,他得先搞清楚一件事情——那张贴在门禁柱上的空调外机检修通知,是谁贴的,为什么一个本该经由行政部统一用邮件发布的临时检修通知,会以纸质打印件的形式出现在一个几乎没人会注意到的停车场侧柱上。 沈砚在黑暗中扯了扯嘴角,脸上没有笑意。 他伸手摸到书桌边上那台沉默的显示器,按下了电源键。屏幕亮起来的光打在他面孔上,照亮了颧骨下的一小片阴影和眼底一夜未消的暗色。 桌面上的文件夹里躺着他备份的所有日志文件、MD5比对截图、GM后台操作时间戳,以及他现在要新加进去的一样东西——那张A4纸的照片,正反面各一张,用手机拍完导进去的。 他新建了一个文件夹,命名为"0513空调检修"。 光标在文件名的末端一闪一闪。 凌晨四点的城市在窗外闷热地呼吸,沈砚坐在显示器前,听着自己很轻的呼吸声和机箱风扇的匀速转动,开始整理这一夜之间多出来的新线头。 每一根线头都在往同一个方向收拢。 他要赶在九点之前,至少理出其中一根的尽头。