第二天一早,林度蹲在魔王城门口,盯着格里姆搬回来的那块白板。
很大。
比他要求的还大一倍。格里姆大概是觉得“大就是好,好就是大”。白板靠在魔王城的外墙上,比林度整个人高出一个头,风一吹还晃了两下,差点把旁边的格里姆拍进墙里。
“这板子能当城墙使了。”林度站起来,拍了拍膝盖上的灰,“行吧,干活。”
他掏出马克笔,在白板上写下第一行字:
Bug #1:重力异常
字写得很丑。他写字本来就丑,在白板上更丑。格里姆在旁边认真地看了看,然后认真地点头:“主、主人的字……很有……艺术感。”
“闭嘴。”
瑟莉雅捧着奶茶走过来,头发随便扎了个丸子头,眼睛还带着起床气。她瞥了一眼白板,又瞥了一眼林度的字,什么也没说,但那个沉默比任何吐槽都致命。
“你写得好你来写。”林度把马克笔递过去。
“我又不是你的秘书。”瑟莉雅吸了一口奶茶,但还是接过了笔,在第一行下面补了一行小字:症状:面包往上飞,鸡不上树改上天,人走路像踩棉花。
“你这字写得也不怎么样。”林度说。
“我这是手写体。”
“手写体和丑之间有区别吗?”
“有。手写体是故意的,丑不是。”
林度决定不跟她争。他指着第一行:“行,现在来说这个Bug。触发条件?影响范围?”
瑟莉雅打开笔记本电脑,调出昨天半夜爬取的日志数据。屏幕上密密麻麻的数字和错误码,林度看了一眼就觉得眼睛疼。
“触发条件不明确。”瑟莉雅说,“但主要集中在我王城区域。频率大概是每天三到五次,每次持续几十秒到几分钟不等。昨天下午三点十二分,王城东区一家面包店出炉了五十个法棍,正好赶上重力失灵——五十个法棍全部飘上了天。”
林度想象了一下那个画面。
五十根法棍像火箭一样升空,面包店老板在下面仰头看着,手里还拿着夹子。
“后来呢?”他问。
“后来重力恢复了,法棍掉下来,砸伤了两个路人。”瑟莉雅面不改色,“教会把这事定性为‘天谴’,说是神对面包店老板偷税漏税的惩罚。”
“他偷税了?”
“偷了。但这不是重点。重点是重力异常和偷税没有因果关系。”
“所以神只是碰巧用面包砸了他?”
“神可能也没想到法棍会那么硬。”
格里姆在旁边举手:“大、大人……我能帮忙吗?”
“你想帮什么?”
“我、我可以……负责……测试。”
“你怎么测试?”
格里姆想了想,从地上捡起一块石头,扔向天空。
石头没有掉下来。
它飘着。
所有人抬头看着那块石头。
它飘了五秒钟,然后像突然想起自己有重量似的,咚地一声砸在地上,差点砸到格里姆的脚。
“测、测试完成。”格里姆说,“重力确实出、出问题了。”
林度沉默了一秒:“……行,算你通过了。正式聘你为重力测试员。”
格里姆热泪盈眶:“我是、是正式员工了!”
“没有工资。”
“没、没关系!”
瑟莉雅在旁边小声嘀咕:“这算不算非法用工?”
林度假装没听见。
他转头看向瑟莉雅:“代码能改吗?”
“理论上可以。但我得先找到重力函数的位置。”瑟莉雅把电脑转向林度,屏幕上显示着一个文件夹,名字叫“新建文件夹”。
“又是新建文件夹?”
“不止。你看看里面。”
林度点开“新建文件夹”,里面还有“新建文件夹2”。点开,里面是“新建文件夹3”。点开,“新建文件夹最终版”。点开,“新建文件夹最终版2”。点开,“新建文件夹打死也不改了”。
“他是不是有病?”林度说。
“你认识作者,你问我?”
林度沉默了。他确实认识作者——他的大学室友,一个永远在赶ddl、永远在重命名文件、永远在最后一天凌晨三点给他发消息说“救命帮我看看这个bug”的男人。
有一次期末项目,室友交了个压缩包,名字叫“最终版最终版打死也不改了最终版”。老师解压之后,里面只有一个空文件夹。
“我忘了把代码放进去了。”室友后来这么说。
林度当时笑了三天。
现在他笑不出来了。
“找到了。”瑟莉雅敲了几下键盘,调出一段代码,“重力函数在这里。”
林度凑过去看。屏幕上大概二十多行,缩进乱七八糟,有的地方用空格,有的地方用Tab,还有一行直接顶格写。最上面有一行注释:
# 重力。别问我怎么写的,我抄的物理课本。也不知道对不对。—— 作者
“至少他承认了。”林度说。
“你再往下看。”
瑟莉雅滚动鼠标,露出核心的那一行:
gravity = 9.8 * (random.random() * 0.5 + 0.75)
林度盯着这行代码看了五秒钟。
“重力是随机数?”
“对。”瑟莉雅面无表情,“百分之七十五到百分之一百二十五之间的随机数。所以有时候重力只有七点三,面包飘了;有时候十二点多,人走路像背了十袋米。”
林度深吸一口气。
他想起了大学时室友写的一段代码。那次他们做一个物理模拟的小作业,室友写了行“speed = random.random() * 20”,林度问他为什么用随机数,室友说:“因为真实世界里物体的速度也不是恒定的嘛。”
“那是风阻和摩擦力!”林度当时拍了桌子。
“差不多差不多。”
差不多。神的造物。
“改回9.8就行?”林度问。
“先别急。”瑟莉雅又往下翻了一页,“你看看这个。”
屏幕上是一段更长的代码,看起来像是重力函数的调用部分。每一行都调用了重力函数,但有一个问题——
“他每次计算都重新调用随机数?”林度皱着眉。
“对。物理引擎每帧调用一次重力,每秒六十帧。也就是说,每一秒重力都在变六十次。”
林度沉默了很长时间。
他想象了一下这个世界——一个重力每秒变化六十次的世界。面包往上飞、人走路忽轻忽重、鸡上树都是轻的,更严重的是房子地基在反复承受变化的重力,随时可能开裂。
“这个世界没塌真是个奇迹。”他说。
“可能是因为作者也没想到会有人真的跑起来。”瑟莉雅说,“你准备好了吗?我改了。”
“改。”
瑟莉雅把随机数删掉,改成9.8。又把调用部分优化了一下,只在物体生成时计算一次重力,而不是每帧都算。最后加了一行注释:
# 重力改成常数了。之前的随机数是作者脑子进水。—— 瑟莉雅
“你写了你的名字?”林度问。
“署名权很重要。”
“行吧。提交。”
瑟莉雅按下了回车。
屏幕闪了一下。代码生效了。
安静的几秒钟。什么也没发生。
林度看向窗外。天空很蓝,云很白,风很轻。一只鸟飞过,没有飘,也没有掉下来。
“好像好了。”他说。
话音刚落,系统弹出了一条消息:
【检测到代码修改生效。重力已恢复正常。副作用正在计算中……】
“副作用?”林度皱眉。
【重力Bug持续了半年,期间有大量物体偏离了原本的位置。现在重力恢复正常,这些物体会被地球引力召回。】
“什么叫召回?”
【就是字面意思。掉回来。】
林度还没来得及追问,城门外传来第一声巨响。
“咚。”
像什么东西砸在了屋顶上。
紧接着是第二声。第三声。声音越来越密,越来越快——咚、咚、咚咚咚咚咚咚——
林度跑出城门口,抬头一看。
天空在下雨。
不是雨。
是面包。
几百个面包从天上掉下来,像一场突如其来的冰雹。法棍、全麦、白吐司、贝果、牛角包——有的完整,有的已经长了绿毛,有的还带着包装袋——噼里啪啦地砸在地上、屋顶上、城墙上、鸡窝上。
一个法棍精准地砸在林度肩膀上。
“啪。”
挺疼。
又一个全麦砸在他脚边,弹了两下,滚进了花坛。
瑟莉雅不知道什么时候也出来了,站在城门口,一个牛角包落在她头上,她伸手拿下来看了看,面不改色地咬了一口。
“这个牛角包是昨天那家店的。”她说。
“你怎么知道?”
“他家牛角包放的可可粉多,一吃就知道。”
“你区别面包的方式是吃?”
“不然呢?看配料表?”
又一个法棍从天而降,这次直奔林度的脑门。他闪了一下——没完全闪开,法棍擦着他的耳朵飞过去,砸在了身后的格里姆脸上。
格里姆的鼻子被砸个正着,眼泪当场就下来了。但他忍住了,没有叫,只是默默地蹲下来,把那个法棍捡起来,看了看,擦了擦灰,放进了兜里。
“你捡它干嘛?”林度问。
“晚、晚饭。”格里姆的鼻音很重。
“这是砸你脸的面包,你还吃?”
“不、不能浪费。”
林度觉得格里姆的道德水平可能比整个圣光教会加起来都高。
面包雨持续了大约两分钟。到后面越来越稀疏,最后一个——一个蔫巴巴的贝果——旋转着落在了魔王城的水井里,溅起一小片水花。
然后面包结束了。
但还没完。
林度正要转身回去,天上又传来了声音。
不是面包的声音。是……鸡叫声。
“咯咯咯——!”
一只芦花鸡从天上飘下来,翅膀扑腾着,落在一棵树上。紧接着第二只、第三只、第四只——几十只鸡像跳伞兵一样从天而降,有的落在屋顶上,有的落在墙头上,有的直接落进了魔王城的厨房——大概是闻到了油烟味。
整个魔王城瞬间变成了养鸡场。
鸡毛到处飞,鸡屎到处拉,鸡叫声此起彼伏,有一只特别肥的母鸡直接落在了白板上,把林度写的那行字踩成了一团模糊的黑色划痕。
格里姆的眼睛亮了:“鸡!鸡!鸡!”
“你激动什么?”
“晚、晚饭!烤鸡!炖鸡!炸鸡!”
“你还记得你是魔将吗?”
“魔、魔将也要吃饭!”
格里姆开始满院子追鸡。他一个两米高的肌肉大汉,追着一群鸡在魔王城里来回跑,时不时扑空摔一跤,爬起来继续追。那画面太美,林度不敢多看。
瑟莉雅站在城门口,从头到尾一动没动。她头顶上还顶着刚才那个牛角包,肩膀上落了一只鸡——一只小小的、黄色的、看起来像是刚出壳没多久的雏鸡,正歪着头看她。
“这只归我了。”瑟莉雅说。
“你养鸡?”
“养。养大了炖汤。”
林度觉得这圣女的道德水平和格里姆半斤八两。
系统此时弹出一条消息:
【面包雨和鸡群空降已结束。统计:共掉落面包547个,鸡63只。其中约三成已腐烂或损坏,剩余可食用。建议宿主尽快处理,以免引发卫生问题。】
“你现在才说?”林度看着满地的面包屑和鸡毛,“你怎么不告诉我副作用是高空抛物?”
【因为作者没有写副作用处理函数。理论上,重力恢复后,所有物体应该瞬移回原位,而不是被“召回”。但作者没写瞬移的逻辑,所以系统只能采用最朴素的物理模拟——掉回来。】
“所以这不是副作用,是他又没写完?”
【是的。请在Bug清单上增加一条:作者逻辑缺失。】
林度在白板上新起一行,歪歪扭扭地写道:
Bug #0:作者脑子有坑
这一次,瑟莉雅没有吐槽他的字。
---
傍晚。
面包清理完毕。格里姆带着几个小反派——不,“反派”这个词不准确,应该是几个住在魔王城里的失业人员——把能吃的面包收进了仓库,发霉的拿去沤肥,鸡抓回来三十七只,关在厨房后面的空地上。
那只落在瑟莉雅肩膀上的小黄鸡,被她放进了自己房间。理由:“它太小了,关外面会被老鹰叼走。”
“你确定不是想养大了炖汤?”林度问。
“炖汤也要等它长大。长大之前,它需要温暖的家。”瑟莉雅说得理直气壮。
林度不跟她争了。他已经学会了一个道理——和程序员吵架没有意义,他们会用逻辑把你说服,然后用代码把你的逻辑推翻。
林度正准备继续讨论Bug细节,城门外忽然传来一声中气十足的呐喊——
“魔王————!今天我要打败你!”
是艾尔文。
林度和瑟莉雅对视一眼。
“又来?”瑟莉雅挑眉。
“每天一次,比闹钟还准。”林度叹了口气。
他一个人走向城门口。格里姆想跟,被林度拦住了:“你在白板上画个
格里姆认认真真地拿起马克笔,在白板上画了一条歪歪扭扭的横线——他以为自己画的是表格,实际上看起来像是地震后的心电图。
---
城门外,艾尔文穿着闪亮的银白色盔甲,骑着白马,身后跟着十个圣骑士。今天的他格外精神,大概是昨晚睡得早。
“魔——王——”艾尔文举剑,“今天你无路可逃!”
林度靠在城门上,双手插兜:“我每次都没逃。是你自己走的。”
“那是因为你用妖术把我送走了!”
“那叫快捷键。”林度打了个哈欠,“行吧,今天你想怎么打?”
艾尔文从马上跳下来,谨慎地看了看地面。他学聪明了——每走一步都要先用脚探一探,确认不是坑才踩实。
林度看着他像踩地雷一样慢慢挪过来,忍不住笑了:“你今天带了探测仪?”
“这叫谨慎。”
“你上次也带了梯子。”
“梯子有用!”
“有用在哪?”
艾尔文想了想,发现自己确实没用上梯子——因为他是被传送走的,不是掉坑里走的。
“不管!今天我一定要正面击败你!”
他加快脚步冲了过来。剑光一闪,直刺林度面门。
林度不慌不忙,甚至没有躲。他只是在心里默念了一句:“系统,Alt+F4还能用吗?”
【可以用。这是原著里作者写的“魔王秘技”,注释写着“我也不知道这个快捷键有什么用,但感觉很酷”。实际上它会触发英雄传送。】
“那就用。”
林度抬起一只手,像按键盘一样在空中虚按了一下:“Alt+F4。”
艾尔文的剑尖距离林度的鼻子只有零点零三米。然后他消失了。
连同他的白马、他的十个圣骑士,一起消失了。
原地只剩下一片被风卷起的树叶。
几秒钟后,远方传来一声隐约的惨叫:“又是这招————!”
林度拍了拍手,转身往回走。走了两步,又停下来,对着空气说了一句:“明天见。”
系统:【反派值-2(使用Alt+F4打发英雄,过于敷衍,不够邪恶)。当前反派值:-9。】
“够用就行。”
他回到魔王城门口,发现格里姆已经把白板画满了——不是表格,是一堆乱七八糟的圈圈和箭头,中间写着“Bug清单”四个大字,旁边还有一只简笔鸡。
“这是什么?”林度指着那只鸡。
“圣、圣女说……要画一只鸡……代、代表副食品库存……”
林度看向瑟莉雅。
瑟莉雅面不改色:“库存管理很重要。昨天掉下来的鸡有六十三只,今天吃掉三只,还有六十只。不画下来记不住。”
“……行,你说了算。”
晚上,林度坐在城墙上,旁边是瑟莉雅(裹着毯子,抱着小黄鸡),格里姆(端着夜宵——今天的是炸鸡块,用的是今天掉下来的鸡),和关在笼子里的其他三十多只鸡(明天再决定是养还是吃)。
瑟莉雅打开了电脑,调出了第二个Bug。
Bug #2:情节循环
“英雄艾尔文的记忆重置。”她调出代码,“你看这里——”
屏幕上是一段定时器代码,每天零点触发,把艾尔文的记忆恢复到前一天的状态。注释写着:
# 为了让情节可以重复使用,英雄每天重置。不用写新情节了,省事。—— 作者
“所以他每天都是新的一天?”林度问。
“对。他不记得上次讨伐过你,不记得掉过坑,不记得被你用Alt+F4传走过。每天醒来都是‘今天我要去讨伐魔王’。”
“三百多次?”
“三百一十七次。”瑟莉雅精确地说,“我数过了。”
林度沉默了。
他忽然想起第一次见艾尔文的时候,那个年轻人站在城门口,阳光打在他的银白色盔甲上,他的眼神那么认真,那么坚定。他不知道自己已经说过同样的话三百多次,走过同样的路三百多次,掉进同样的坑三百多次。
他每一次都是第一次。
“关掉。”林度说。
“关掉之后,他会想起所有的事。”瑟莉雅看着他,“三百一十七次记忆同时涌进脑子里,你觉得他受得了吗?”
“受不受得了是他自己的事。”林度说,“但继续瞒着他,才是真的残忍。”
瑟莉雅看了他几秒钟,然后低下头,敲了一句代码:
# memory_reset_timer.enabled = False
“零点生效。”她说。
---
零点。
林度没睡。
他坐在城墙上,看着远方的王城。那个方向有一点点微弱的灯光,大概是从艾尔文的住处传来的。那个年轻人正在睡着,不知道自己的脑子会在下一秒被三百多天的记忆同时灌满。
“你会梦到什么?”林度小声说。
【定时器已关闭。记忆恢复中。】
系统的消息弹出来,又消失了。
什么也没发生。没有爆炸,没有闪光,没有地动山摇。只是远处那盏灯,在这一刻,好像微微地晃了一下。
然后灭了。
“他醒了?”瑟莉雅问。
“可能。”林度说,“也可能在梦里尖叫。”
“你担心他?”
“不担心。他打不过我。”
“这次是人话。”
林度没有回答。他低头看了一眼系统面板上的数字:
反派值:-5
头发:97%
Bug修复进度:1/47
还早得很。
他拿起格里姆递过来的炸鸡块,咬了一口。
鸡块是今天掉下来的那只芦花鸡做的。
“好吃。”林度说。
格里姆笑了,笑得像个两百斤的孩子。
瑟莉雅吸了一口奶茶,小黄鸡在她腿上睡着了。
月亮挂在天上。
魔王城的城墙上,三个人,一只鸡(不,三十多只),影子被拉得很长。
系统最后弹了一条消息,只有林度能看到:
【温馨提示:英雄记忆恢复后,可能会产生强烈的复仇情绪。建议宿主提前准备逃跑路线。】
林度把这条消息划掉了。
逃跑?
他连厨房都刚买好灶台,凭什么逃跑。
明天见,英雄。
---
【本章系统彩蛋】
修复Bug:重力异常
新增Bug:高空抛物(面包雨、鸡群空降)——已转交后勤处理
Alt+F4使用次数:+1(累计317次,与英雄讨伐次数持平)
英雄当前状态:已传送至圣光教会大门口,正对着空气骂人
下一目标:情节循环(英雄记忆重置)——定时器已关闭,等待宿主与英雄的正面交锋
当前发量:97%
系统评价:一个没有厨房的魔王不是好魔王。一个有厨房但全是鸡的魔王……算养殖户。
下次英雄再来,建议宿主换个快捷键。Ctrl+Z也行——反正他分不清。