键盘敲下最后一行指令,陈墨重重靠在椅背上。
屏幕上弹出鲜红的提示框:
【编译错误:第247行,内存溢出】
窗外的雨已经下了三个小时。上海老弄堂的出租屋里,泡面碗堆了四个,电脑散热扇发出垂死般的嗡鸣。他盯着那行错误提示,忽然想起七年前——也是这样一个夜晚,父亲在病床前握着他的手说:“小墨,代码要写干净……人活一世,总要留下点,别人用得着的东西。”
父亲是国企里最后一批用汇编语言的老程序员。
陈墨闭上眼睛,摘下眼镜揉了揉眉心。手边手机亮起,是房东的第八条催租短信。上一条是银行的还款提醒,再上一条,是前女友发来的婚礼电子请柬——新郎是他在上家公司的直属领导。
他重新戴上眼镜,点开桌面上那个闪烁了三天的图标。
【武侠纪元·全球首款脑机接口沉浸式武侠世界】
【今夜0点,正式开服】
广告语浮现在幽蓝的屏保上:“在这里,你就是江湖。”
陈墨扯了扯嘴角。他需要这个——需要忘记代码错误、忘记房租、忘记自己二十八岁的人生像一段永远编译不通过的垃圾程序。
墙上的电子钟跳到23:59。
他戴上那个银灰色的脑机接口头盔,触感冰凉。据说这玩意儿用上了最新的神经编织技术,能让人百分百沉浸——当然,要价也相当于他三个月的房租。
“连接中……”
视野暗下去。
没有炫酷的光影特效,没有激昂的背景音乐。只有一片纯粹的黑暗,和黑暗中浮现的几行白色小字:
【检测到用户:陈墨,ID:CM2026】
【神经链接稳定性:97.8%(优)】
【意识映射准备就绪】
【正在生成角色……】
然后,卡住了。
不是黑屏,不是报错。就是卡在“正在生成角色……”这一行字上,整整十秒。
陈墨皱了皱眉。作为一个写了十年代码的程序员,他对“异常状态”有种病态的敏感。他尝试在虚空中做出滑动的手势——这是头盔的操作手册里提到的手势指令。
没反应。
“重启协议。”他念出手册里的强制指令。
黑暗中的字闪烁了一下,变成了:
【警告:角色数据生成异常】
【错误代码:#E-747】
【建议:联系客服……】
然后,那行字突然扭曲、变形,像被无形的橡皮擦抹去,又重新拼凑成另一串字符——不是中文,不是英文,而是一行行……
代码。
陈墨的呼吸停了一拍。
眼前悬浮的,是标准的JSON数据结构嵌套着Python风格的字典,中间还混杂着几行他从未见过的、闪着微光的注释字符:
{
“character“:{
“name“:“陈墨“,
“level“: 1,
“title“:“无名小卒“,//#ERROR:称号字段溢出
“attributes“:{
“strength“:“5“,//期待: int,实际: str
“agility“:“5“,
“intelligence“:“9“//最大值10
}
},
“position“:“新手村·村口老槐树下“,
“world_time“:“辰时三刻“
}
注释后面,跟着一行行半透明的、流动的发光字符——那是这个虚拟世界的底层逻辑,是角色属性的计算规则,是NPC行为树的判定条件。
陈墨伸出手,手指穿透了那些发光的字符。在他触碰到“title”字段后面那行【#ERROR:称号字段溢出】的瞬间,字符变成了可编辑状态。
就像在IDE里修改代码一样。
他的手指颤抖了一下。
然后,几乎是本能地,他删掉了“无名小卒”四个字,敲入:
“江湖过客”
按下回车。
【修改无效:权限不足】
红色提示一闪而过。但陈墨没看提示——他的视线死死盯在“无名小卒”后面那行发光注释上:
//隐藏属性:[天弃之人]
//效果:所有NPC初始好感度-20
//来源:角色创建时ROLL点触发(概率0.007%)
//状态:已激活
“天弃之人……”陈默念出这四个字,忽然笑出了声。
连系统都在嘲讽他。
但下一秒,他的笑容僵在脸上。因为在那行注释下方,他看到了更多——看到整个“称号”字段的数据结构像一棵展开的树,每一根树枝都是一行代码,每一片叶子都是一个参数:
title:{
display_name:“无名小卒“,
hidden_effects:[
{ type:“npc_favor“, value:-20, target:“all“},
{ type:“item_drop_rate“, value:-0.15 },
{ type:“exp_gain“, value:-0.1 }
],
validation_rules:[
“length <= 4“,
“no_special_chars“
],
// BUG:验证规则未检查Unicode代理对
//可利用漏洞:插入零宽字符突破长度限制
}
零宽字符。
陈墨的心脏重重跳了一下。那是Unicode里一些不可见的控制字符,不占显示宽度,但会被系统识别。在现实世界的编程中,这是常见的安全漏洞——很多输入验证会漏掉它们。
他选中“无名小卒”,没有删除,而是在前面插入了一个零宽连接符(U+200D)。
按下回车。
这一次,没有红色错误提示。
只有短暂的卡顿,然后,整个数据块刷新了:
title:{
display_name:“无名小卒“,//注:前方有零宽字符
hidden_effects:[...],//同上
validation_rules:[...],//验证通过:字符数4,无非特殊字符
actual_length: 8 //实际字符数(含零宽字符)
}
系统没识别出来。
它只检查“显示长度”不超过4,而零宽字符不可见。所以“无名小卒”四个字通过了验证,但系统实际存储的是八个字符——四个汉字,四个零宽字符。
而就在这一刻,陈墨看到了更诡异的东西:
在那行【actual_length: 8】后面,浮现出一行全新的、暗金色的注释:
//检测到验证规则冲突
//系统解决方案:保留完整数据,但显示截断
//结果:隐藏属性[天弃之人]因数据截断而丢失关联索引
//状态:已失效
失效了?
陈墨还没反应过来,眼前的一切突然开始旋转、崩塌、重组。
黑暗褪去。
他闻到了泥土的味道,混着青草和牲畜粪便的气息。脚下是坑洼的土路,路旁歪斜的木质路牌上刻着三个斑驳的字:新手村。
晨光刺眼,他抬手遮了遮眼睛。粗布衣袖磨着手腕,低头看,一身灰扑扑的粗布短打,脚上是露出脚趾的草鞋。
成功了。他进了游戏。
不,不止是“进了游戏”。
陈墨猛地抬头,看向四周。村子很小,十几间茅屋,一口水井,几块菜地。一个扛着锄头的老农慢吞吞走过,头顶悬浮着一行绿色小字:
【村民·张三】
【状态:闲逛】
【好感度:0(中立)】
但陈墨看到的,不止这些。
在那一行绿色小字下方,漂浮着一串串发光的、半透明的代码字符——就像刚才创建角色时看到的一样。那些字符在流动、在变化:
npc_id:“villager_003“,
current_action:“wandering“,
action_tree:[
{ condition:“time >辰时四刻“, action:“go_to_field“},
{ condition:“player_interact“, action:“dialog_001“}
],
dialog_001:{
lines:[
“这位少侠,初来乍到吧?“,
“村子东头王铁匠正在招学徒,不妨去看看。“
],
next:“dialog_002“
}
陈墨眨了眨眼。代码还在。
他转头,看向路旁槐树下蹲着的一个乞丐。那乞丐衣衫褴褛,面前摆着个破碗,头顶的标识是:
【无名乞丐】
【状态:乞讨】
【好感度:-5(轻微厌恶)】
下面的代码更复杂些:
npc_id:“beggar_001“,
hidden_quest: true,//隐藏任务标记
quest_trigger:{
condition:“give_item(food, 1)“,
reward:“broken_dagger“,//奖励:破损的匕首
exp: 50
},
current_dialog:“line_001:'行行好吧……'“
隐藏任务。
破损的匕首。
陈墨摸了摸身上。粗布衣服只有两个口袋,左边空空如也,右边——摸到半个硬邦邦的馒头。物品信息自动浮现在脑海:
【硬馒头】
【类型:食物】
【效果:饥饿度-20】
【描述:放了三天,硬得能砸死人】
陈墨走到乞丐面前。
乞丐抬头,浑浊的眼睛看着他,念出台词:“行行好吧……三天没吃饭了……”
陈墨没说话。他盯着乞丐头顶那行代码,盯着【quest_trigger】下面的条件:【give_item(food, 1)】。
他伸出右手,食指在空中虚点——就像在触摸屏上操作一样,点中了那行条件语句。
代码变成了可编辑的淡蓝色高亮。
陈墨删掉了“give_item(food, 1)”,快速键入:
“player.level < 5”
按下回车。
乞丐头顶的代码刷新了。任务触发条件变成了:【player.level < 5】。
而陈墨现在的等级是1。
几乎是同时,乞丐的表情变了。那张麻木的脸上突然挤出一个夸张的、近乎谄媚的笑容,声音也洪亮起来:
“少侠!这位少侠!老朽看你骨骼清奇,绝非池中之物啊!”
陈墨往后退了半步。
乞丐已经站起身,从怀里掏出一把生锈的、刀刃缺了好几口的匕首,双手捧过来:“此物与老朽相伴三十载,今日见少侠器宇不凡,便赠与你了!只盼少侠日后名震江湖时,莫忘今日缘分!”
陈墨接过匕首。
【获得:破损的匕首(任务物品)】
【描述:锈迹斑斑,但握柄处有奇异纹路】
【触发隐藏任务:乞丐的馈赠(1/1)】
【获得经验:50】
【等级提升:2级】
暖流从身体深处涌起,陈墨能感觉到力量的增长——很微弱,但确实存在。他看向自己的状态栏,那些漂浮的代码显示着:
player:{
level: 2,
exp: 50/200,
hp: 120/120,
//...其他属性
}
乞丐还在絮叨着什么,但陈墨已经听不清了。他低头看着手里的匕首,看着乞丐头顶刷新出的新对话代码,看着整个世界——这个由代码构成的、可以修改的江湖。
雨夜的出租屋、编译错误、催租短信、婚礼请柬……忽然变得无比遥远。
他握紧了匕首。
生锈的铁刃硌着手心,有些疼。这疼痛如此真实,真实到让他怀疑——这真的只是个游戏吗?
“少侠?”乞丐见他发呆,又唤了一声。
陈墨抬起头,看向这个由代码驱动、却会笑会说话的乞丐,看向远处田野里耕作的农民,看向村口提着水桶走过的妇人,看向这个世界的每一行流动的字符。
然后,他轻声说:
“谢谢。”
不只是对乞丐说。
是对这个漏洞百出、却给了他第二次机会的世界。
远处传来钟鸣——辰时四刻了。村东头隐约传来打铁的声音,叮,叮,叮,规律而沉重。
陈墨将匕首别在腰间,朝着铁匠铺的方向走去。
脚下的泥土松软,一步一个脚印。
他走得很慢,因为每一步都在看——看路旁杂草的贴图代码,看天上云朵的生成算法,看自己每走一步,状态栏里【体力值】的递减公式。
走到铁匠铺门口时,他停住了。
炉火通红,光着膀子的壮汉正在捶打一块烧红的铁坯,火星四溅。壮汉头顶的标识是:
【王铁匠】
【状态:工作中】
【好感度:0】
陈墨的目光,却落在铁匠铺角落那个蹲着的小女孩身上。
七八岁年纪,扎着两个羊角辫,正用树枝在地上划拉着什么。她头顶没有NPC名称,没有状态标识。
只有一行行密集的、近乎疯狂的、不断报错的红色代码:
npc_id:“unknown_error“,
name:“null“,
dialog_tree:“corrupted“,
behavior:“unexpected_loop“,
// ERROR:数据索引丢失
// ERROR:模型文件不存在
// ERROR:正在尝试自我修复...
//修复失败,第114次迭代
小女孩忽然抬起头,看向陈墨。
她的眼睛很黑,很空,像两个没有星辰的夜空。
然后,她咧开嘴,笑了。
用某种尖锐的、不似人声的语调,一字一顿地说:
“你、看、得、见、我。”
陈墨浑身一僵。
下一秒,小女孩的身影闪烁、扭曲,像信号不良的电视画面,然后——消失了。
地上只留下树枝划出的凌乱痕迹,和一行用歪斜字体写出的、正在缓缓淡去的字:
“快逃”
铁匠铺里,王铁匠抬起头,擦了把汗,朝陈墨喊道:“喂,那边的小子,要打铁不?”
炉火噼啪。
陈墨站在原地,看着那行渐渐消失的字,看着空空如也的角落,看着视野里那些疯狂报错的红色代码也慢慢淡去,仿佛从未出现过。
只有腰间那把生锈的匕首,硌着他,提醒他这一切不是梦。
他深吸一口气,走进铁匠铺。
“师傅,”他说,声音有些干涩,“我想学打铁。”
王铁匠打量他一眼,点点头:“一天十文钱,管饭。”
陈墨应下,接过铁锤。很沉,但他握得很稳。
炉火映在他脸上,那些流动的代码倒映在他瞳孔深处,像另一个世界的光。
远处的村口老槐树下,那个乞丐还蹲在原地,但脸上的谄媚笑容已经消失了。他望着铁匠铺的方向,浑浊的眼中闪过一丝极淡的、不该属于NPC的清明。
然后,他低声喃喃,声音轻得只有自己能听见:
“又一个……”
“看得见的人。”
风吹过,槐树叶沙沙作响。
乞丐头顶,那行原本只有陈墨能看见的代码,其中一行的注释字符,悄然改变了内容:
// hidden_quest: true,
//实际功能:检测“代码可视者”
//已标记:玩家_陈墨
//上报状态:待处理
但陈墨看不见这行注释了。
他正举起铁锤,重重砸在烧红的铁块上。
铛——!
火星迸溅,像破碎的星辰。
(第一集完)
下集预告:
铁匠铺的夜晚,陈墨在炉火边看到了更多——不只是NPC的代码,还有整个世界的运行日志。而那个消失的小女孩,在王铁匠醉酒后的呓语中,有了另一个名字:“三年前,村东头李家的丫头,得急病死了……”
可系统记录显示,那个NPC编号,昨晚还在活跃。
这个世界,到底有多少“死人”在行走?
而陈墨不知道的是,在他修改乞丐任务代码的瞬间,千里之外——昆仑科技总部的服务器监控室里,一个刺耳的警报,响了。

