林劫把墨影送来的那台旧服务器拆开的时候,沈易正好推门进来。他看了一眼满地的螺丝刀、跳线帽和拆下来的内存条,把手里两罐咖啡放在桌上,挑了个没被零件占着的角落坐下来。
“服务器是给你用的,不是给你拆的。”
“不给用。”林劫头也没抬,手里捏着一根跳线,正在主板上找什么东西,“墨影的服务器,底层固件里埋了三层追踪协议。一层是墨影自己的,用来监控设备位置。第二层是龙吟系统的残留监控——这是从龙穹科技淘汰下来的旧设备,系统没清干净。第三层我不确定是谁放的,不是墨影,不是龙吟,加密方式跟陈博士实验室的遗留代码很像。”
沈易拉开咖啡罐的动作停了一下。“你是说墨影的设备里被人埋了后门?”
“至少这台有。”林劫把跳线帽插进一组裸露的针脚上,主板上的指示灯闪了一下,从红变绿。“我把追踪模块的供电跳线拔了。现在这台服务器的网络功能只剩下一张裸网卡,除了收发数据包什么都干不了。没法被定位,也没法往外发信号。”
“那还能用吗?”
“能。就是慢点。”林劫把那组拆下来的零件扫到一边,拿毛巾擦了擦手,把服务器接上电源和网线。机器启动的时候风扇声音像一架小型无人机起飞,吹得桌上的纸巾飘出去好几张。“锚点环境需要的东西不多。算力,内存,一个干净的存储分区。这台够用了。”
“干净的存储分区?”沈易环顾了一圈地下室。墙角堆着陈博士实验室淘汰下来的旧硬盘,有几块标签都掉了,不知道还能不能用。桌上的外卖盒子摞了三层,最上面那个里面的剩饭已经长了绿毛。“你管这儿叫干净?”
“我说的是数据干净。”林劫在键盘上敲了几下,屏幕上弹出一个存储分区的格式化进度条。“陈博士实验室的旧硬盘上全是蓬莱计划的残留数据。残缺体的碎片、失败的提取记录、被覆盖了一半的意识残片。那些东西不能带进锚点环境——任何一个碎片掉进来,都会污染她想记住的东西。”
沈易没有说话。他想起了王博士说过的那句话——“锚点救不了他。锚点只是让他以为自己还活着。那不是救,是骗。”陈博士的锚点,是把人按在水里,往他手里塞一块石头。林劫要做的事刚好相反——是把她从水里托起来,给她一块踩得稳的礁石,然后把手松开。但这需要一片干净的水域,不能有沉船的碎片,不能有别人的影子。
格式化进度条走到百分之百。林劫开始往新分区里写数据。不是写代码,不是搭环境,是先写了一份文档。沈易从旁边看了一眼屏幕——是一份清单,每条前面都有一个数字编号。
“1.煮面的背影。完整度93%。环境要素:厨房,灶台,锅里冒热气。声音要素:水开的声音,筷子搅面的声音,回头时拖鞋底蹭地面的声音。触觉要素:锅沿的烫,水汽打在脸上的湿。情感标注:等待,期待,被需要。”
“2.橘子。完整度未知——她的版本,不是你的。环境要素:冷柜的凉气,红色塑料袋的触感。触觉要素:橘子皮的光滑,指甲掐进皮里的凹陷。情感标注:甜,被照顾,手心有东西握着。”
“3.海边。完整度不适用——最初是你的记忆,但她在里面站过之后,水漫过了她的脚踝。水知道她站在里面。环境要素:海浪声,咸味的风,那双鞋底磨歪了的拖鞋。情感标注:困惑(最初),确认(现在)。她说‘不对’之后,海变成了她的。”
“4.回头。完整度93%。环境要素:门开的声音,脚步声,或者只是水开了,她习惯性地回头看一眼。情感标注:确认。确认门口站着的人是你。确认你在等她。确认她煮的面会被吃完。”
“5.橘子皮上的指甲印。完整度未知。环境要素:橘子被握着,被捂热,被放在桌上。情感标注:数数。数日子?数你说过的话?数她记得的事?不确定。但她一直在数。”
沈易看完这五条,咖啡罐端在嘴边停了很久。这不是技术文档,也不是修复方案——是他把她的记忆从自己脑子里挖出来,一块一块摆在桌上,然后退开两步,让她自己来挑。哪一块是她认得的,哪一块不是。
“你自己呢?”沈易问。
“什么?”
“这五条锚点,每一条都跟她有关。煮面的背影,她等的人是你。橘子,她记得的味道是你剥的。回头,她确认门口站着的人是你。海边,她说了‘不对’,但她没有走。橘子皮上的指甲印,她数的是什么你不知道,但她一直在数。”沈易把咖啡罐放在桌上,罐底在桌面磕出一声响,“这些锚点不只是她的记忆,也是你的。你把它们写下来,放进锚点环境里——你也会被拉进去。”
林劫的手指停在键盘上。屏幕上那五条锚点安静地排成一列,像五块从退潮的沙滩上捡起来的石头。“我知道。锚点不是单向的。她能抓住,我也能。她抓住会浮上来,我抓住——”他沉默了几秒,“我抓住会留在里面。”
“留在她够得到的地方。”沈易补完了他没说完的那半句。
林劫没有回答。他把清单文档最小化,打开锚点环境的构建界面。墨影这台旧服务器的架构很老,跑的是蓬莱计划早期的基础框架。好处是这套框架跟陈博士的加密方式同源——不是往上兼容的那种同源,是骨子里长在一起的同源。坏处是慢。内存只有128G,处理器是几年前的型号,跑一个基础锚点环境的渲染就要占掉将近一半的算力。
他把第一条锚点的环境要素一个一个填进去。灶台不难——他在给林雪搭建海边的时候做过一遍,那段代码他还记得,稍微改改就能用。锅里的水要冒热气——物理渲染引擎太吃算力,他用了一个取巧的办法:把热气的动画做成循环播放的视频贴图,分辨率不高,但距离拉远几寸就看不出来了。声音最难。不是水开的声音,不是筷子搅面的声音,是拖鞋底蹭地面的声音。
那个声音太轻了,轻到他从来没有刻意去记过,但它就在那里,压在记忆的最底层,像一块被沙子埋了太久的石头。林雪每次从灶台前面转过身来,右脚会先动,拖鞋底蹭一下地面,然后整个身体转过来,脸上有一点热出来的红。那个声音很短,不到零点三秒。他反复录了几遍都不对。太响,太闷,太脆,太假。怎么听都不像。
沈易看他折腾了快半个小时,站起来走了出去。过了大概一刻钟,他拿着一双旧拖鞋回来了。那是从隔壁废品站捡的,鞋底磨得几乎透明,有一块还缺了个角。林劫接过来,翻过去看鞋底纹路——和林雪从前那双很像,是那种廉价泡沫底的,穿久了会在水泥地上磨出一种很特别的涩响。
他把手机放在地上,用拖鞋底蹭过去。录了三遍,挑了一段最接近的,放大波形,微调了一下频率。然后放进锚点环境里。灶台上锅冒着热气,水在翻涌。他把那段声音文件拖进时间轴的时候,手指停了一下。就一下。然后他松开了鼠标。那个声音被放在第一帧和第三帧之间——她从灶台前面转过身来的那一瞬间。拖鞋底蹭过地面,不到零点三秒,很轻,轻到如果不仔细听就会被水开的声音盖过去。
她活着的时候,这个声音每天都会响起。早上煮粥,晚上煮面,半夜给他热剩饭。他从没注意过。现在他把它找回来放进了一个虚拟的厨房里,等她来踩。
“她会听到的。”沈易说。
林劫没有抬头。他把第二条锚点也放了进去。橘子。不是他记忆里那只皮都干了的橘子,是一片空白——和之前给她的一样,灰蒙蒙的,没有任何细节。放在灶台旁边的小桌上。等她来握。第三条,海边。他没有重建那片海,而是在厨房的窗户外放了一片海水。不是他记忆里那片永远停在下午的海,是一片会变的海——潮汐是真实的,浪花的高度会根据风速变化,天空的颜色会随时间从蓝变灰再变红。这片海的参数不是他写的,是他从龙吟系统的公共气象数据里截取来的实时潮汐数据换算出来的,每六小时自动更新一次,不是她的记忆,但会自己呼吸。从厨房窗户看出去,像一幅挂在墙上的画,但画里的浪在动,风在吹,云在走。
第四条,回头。他没有放声音,没有放画面,只是在厨房门口留了一小块空白。什么也没有,连地板纹理都是灰的。那是她要自己填充的地方。如果她记得门开的声音,那里就会有声音。如果她记得脚步声,那里就会有脚步声。如果她什么都不记得了,那里会一直空白着。
第五条,橘子皮上的指甲印。他也没有放。不是忘了,是不知道该放什么。她能数什么——数日子?数他说过的话?数她记得的事?他不知道。所以他只在她手边留了一个灰色的橘子,让她自己决定要在上面掐几道印子。
五条锚点全部放完。林劫靠在椅背上,看着屏幕上那个安静的厨房。锅冒着热气,海在窗外涨潮退潮,门口有一块灰色。很安静。安静得有点过头了。像一间刚收拾完的屋子,东西都摆好了,就等人推门进来。但人还没来。
沈易站起来把空咖啡罐扔进垃圾桶。“你在这儿等着。我回墨影一趟。”
林劫没有回答。他在看屏幕上那片海。潮水正在涨。窗外是她的海,不是他的。每一波浪花都有自己的方向。