第 16 章
雁门的重量
沈明远的手指在方向盘上敲了两下。雨刮器的节奏是固定的,每秒钟一个来回,把三月的雨水从挡风玻璃上推开。他在等一个红灯,车停在文一西路的十字路口。收音机里的历史学者还在讲五代——后周世宗北伐,打到雁门关的时候,补给线已经拉得太长,军中开始出现逃兵。他关掉了收音机。
双轨方案在核心组会议上通过了。陆辰拿到了他想要的叙事保留权,赵铮拿到了四周的战斗手感优化周期。数据回升的迹象出现在第三周,第二章主线的完成率从百分之三十五爬到了百分之五十二。那些被标注为“低效叙事节点”的内容——箭痕标记、戍卒日记、城墙上的刻字——被暂时冻结在版本库里,等待一个不确定的复审窗口。
沈明远现在想的是另一件事。雁门关。这个地名在项目立项之初就被写进了核心文档。十六州的地图上,蔚州、朔州、云州是三个可交付的疆域,但雁门关不一样。它不是一个州城,不是一个据点,它是一个符号。后周打到这里,北宋打到这里,契丹南下的时候也要经过这里。项目组的世界观策划文档里有一句话,是历史顾问顾知远写的:“雁门关在五代十国的军事地理中,不是一个关口,是一个绞肉机。”
沈明远当时在这句话旁边批了两个字:“能做”,后面加了一个问号。那个问号的意思很清楚:这个判断在历史层面是准确的,但在游戏层面意味着什么,没有人知道。那是2022年秋天。现在是一年后,2023年3月。雁门关区域的可玩版本还没有交付。
不是没做。系统策划组在三个月前交了一个方案,代号叫“雁门·烽火”。那个方案沈明远看过,林铮看过,赵铮也看过。它把雁门关设计成一个阵营对抗的战场,玩家可以选择加入守军或攻城方,每两小时刷新一次攻防事件,胜利方获得声望和装备奖励。方案的底层逻辑来自《逆水寒》的帮会战系统,做了适配和简化,技术实现上风险可控。美术组已经根据这个方案出了三版概念图,关城的外墙、箭楼、瓮城都建了模。
但沈明远没有签字。他把方案压了整整两周,然后在一次周会上说了一句话:这个雁门关做得太像游戏了。
会议室里安静了大概五秒钟。林铮先开口,提醒他这本来就是游戏。“我知道。”沈明远把投影切到一张历史照片——那是1933年梁思成在雁门关拍摄的测绘影像,关城的墙体斑驳,城砖之间的缝隙里长出荒草。他的意思不是否定游戏性本身,而是雁门关不只是一个战场。它是一个活了一千三百年的关隘。士兵在这里戍边,商队在这里过关,文人在城墙上题诗。如果只做攻防,就等于告诉玩家,这个地方唯一的价值就是打仗。
赵铮当时没有表态。他的战斗系统组正在攻关手感优化,雁门关的攻防玩法对他来说是下一步的事。但系统策划组的组长周逸群坐不住了。他在会后找到沈明远,语气压得很平,问了一个直接的问题:烽火方案做了三个月,现在要改,改什么,改成什么样,有没有方向。
沈明远没有方向。他只是觉得不对。那天晚上他开车回家,经过西溪湿地的时候,突然想起一件事。2021年秋天,项目组第一次去山西做实地采风。他们从太原出发,走二广高速,三个小时后到达代县。雁门关在代县以北二十公里,车子开进山区,路越来越窄,两侧的山体像两扇门一样合拢过来。同行的美术总监许程在后来的采风笔记里写了一句观察:关城还没到,压迫感已经到了。那种压迫感不是来自战场,它来自地形本身。
沈明远把车停进小区的地下车库,坐在车里想了很久。他打开手机,给顾知远发了一条消息,问雁门关的戍卒平时在做什么。
顾知远第二天早上回了消息。他发来一段《武经总要》的原文,又附了一份他自己整理的笔记。笔记里记录了北宋初年雁门关戍卒的日常:卯时点卯,辰时巡更,午时炊饭,未时修补城墙,酉时再巡更,戌时关闭关门。每隔三日检查一次烽火台的火石和柴薪,每隔十日进行一次箭术考核,每隔一月清点一次军械库的弩机和箭矢。顾知远在笔记末尾写了一句话:“戍边的日常,比打仗更重。战争是例外,等待战争是常态。”
沈明远把这句话转发到了核心组的群里。林铮回复了一个问号。陆辰回复了三个字:“说得好。”周逸群没有回复。
这就是雁门关困境的起点。项目组从一开始就把它定位为核心叙事舞台,但这个定位本身就是模糊的。什么叫“核心叙事舞台”?是让玩家在这里打一场大仗,还是让玩家在这里生活?如果是前者,烽火方案已经做到了。如果是后者,那需要的是完全不同的设计逻辑——不是事件驱动,而是状态驱动;不是高潮迭起,而是日常与危机的渐进切换。两种逻辑在技术实现上的成本差异,至少是三倍。
林铮在第二周约沈明远单独谈了一次。他们在园区的咖啡厅碰头,林铮点了美式,沈明远点了拿铁。林铮开门见山:雁门关如果要改方向,他需要知道技术边界在哪里。烽火方案的同屏人数上限是六十,攻城方四十,守城方二十。这个数字是Messiah引擎在当前画质设定下能稳定跑三十帧的极限。如果要加日常NPC、巡逻士兵、过关商队,同屏人数至少翻倍。翻倍的后果是移动端直接崩。
沈明远用勺子搅着咖啡,问移动端的性能预算是去年定的。“对,去年定的。那时候雁门关还是一个概念,没有人告诉我它要承载多少东西。”林铮的语气没有抱怨,只是在陈述事实。现在如果要加内容,要么降画质,要么砍别的区域。
“不能都保?”
“不能。”
沈明远沉默了几秒。他知道林铮不是在谈判,是在给他一个真实的边界。Messiah引擎是网易自研的,中台团队在去年已经拒绝了项目组关于底层重构的请求,只给了渲染管线和地形系统上的有限实验权限。雁门关如果要做到“日常与战争并存”的状态,就意味着引擎要同时处理两套NPC行为逻辑——一套是和平状态下的巡逻、交易、对话,一套是战争状态下的冲锋、防守、受伤倒地。这两套逻辑在切换时产生的性能峰值,林铮的团队测算过,比单一状态高出百分之四十七。
“百分之四十七。”沈明远重复了这个数字。
“对。”林铮把咖啡杯放下,“而且这只是服务端的压力。客户端还要加载高精度的关城模型、动态天气、实时光影。雁门关的地形是峡谷,两侧山体的面数本来就高,如果再加攻城器械——”
“我知道。”沈明远打断了他,“给我一周。我重新看一遍方案。”
那一周里发生了三件事。
第一件事。顾知远给沈明远发了一份更详细的资料,是关于雁门关在五代时期的具体战例。后晋天福三年,契丹南侵,雁门关守军坚守四十七天,最终因粮尽援绝而失守。守将杨光远在城破前下令焚烧军械库,不给敌军留下武器,他自己战死在瓮城门口。这段记载来自《旧五代史》,顾知远在邮件里标注了出处,并附了一句观察:杨光远守关的四十七天里,前四十五天都在等待。真正打仗的,只有最后两天。沈明远把这句话记在了笔记本上。
第二件事。系统策划组的一个年轻策划苏敏——就是那个写了七版文案、差点辞职的文案策划——给沈明远发了一份文档,标题是“雁门关·另一种可能”。文档不长,只有五页。她提出一个想法:不做阵营对抗,做“时间层叠”。玩家在不同阶段进入雁门关,会看到不同的景象。和平时期,关城是一个边贸集市,玩家可以在这里交易、接任务、听NPC讲戍边的故事。战争临近时,关城的氛围逐渐变化——商人撤走,士兵增多,城墙上的守军开始加固防御。战争爆发后,玩家参与的是防守,不是攻城。他们要保护的不是一个抽象的“阵营胜利”,而是关城里那些他们之前认识的人。
苏敏在文档的末尾写了一句:“让玩家在乎雁门关,不是因为它是一个战场,而是因为它是一个他们生活过的地方。”沈明远看完文档,在页边批了四个字:“有意思。继续。”
第三件事。林铮发来了一份服务器压力测试的初步数据。他的团队用烽火方案的框架跑了一次模拟,同屏六十人,攻城器械开启,动态天气开启,帧率在台式机上稳定在三十五帧,在移动端掉到了十八帧。林铮在数据下面写了一行备注:如果加日常NPC,移动端帧率预估在十二到十五之间,不可交付。
三件事叠加在一起,沈明远做了一个决定。他召集了一次会议,时间定在周四下午两点,地点在项目组的二号会议室。参会人员:林铮、赵铮、陆辰、周逸群、许程、顾知远,还有苏敏。会议代号叫“雁门评审”。
那天杭州下着雨。沈明远第一个到会议室,把投影接好,打开了一个空白文档。其他人陆续进来,外套上带着雨水的气味。周逸群最后一个到,手里拿着一个移动硬盘。沈明远没有寒暄,开门见山,说今天只谈雁门关,让周逸群先放烽火方案的演示。
周逸群把移动硬盘接上电脑,打开了一段录屏。那是烽火方案的内部测试版本,录屏时长七分钟。画面从关城外开始,玩家角色骑马穿过峡谷,前方出现雁门关的城楼。城墙上站着一排守军NPC,旗帜在风中飘动。攻城号角响起,攻城方玩家从山坡上冲下来,投石车开始发射,城墙上的守军开始射箭。画面切到瓮城内部,守城方玩家在组织防御,有人在修城门,有人在布置陷阱。最后城门被攻破,双方在瓮城里混战,帧率在混战阶段有明显波动,但整体可玩。
录屏放完,会议室里没有人说话。沈明远转向周逸群,问这个版本做了多久。“三个月。”周逸群说,“从概念到可玩,三个组并行。系统组做玩法逻辑,美术组做场景,战斗组做攻防AI。现在完成度大概百分之七十,剩下的百分之三十是平衡性调整和Bug修复。”
“投入了多少人?”
“系统组四个,美术组六个,战斗组三个。加上测试和音效,一共十五个人。”
沈明远点了点头。他沉默了几秒,然后说了一句话:“这个方案,我决定不签。”
会议室里的空气像被抽走了一层。周逸群的手指在桌面上停住了。林铮把身体往椅背上靠了靠。赵铮低头看着自己的笔记本,笔尖停在纸面上。
沈明远接着说了原因。不是这个方案做得不好,恰恰相反,它做得很好。但它把雁门关做成了一台战争机器。玩家进来,打仗,拿奖励,走人。这和《逆水寒》的帮会战没有本质区别。雁门关在历史上不只是一个战场,它是一个活着的关隘。士兵在这里戍边,百姓在这里过关,商队在这里交税。这些日常,才是雁门关的重量。
周逸群开口了。他的声音很平,但每个字都压得很实。他理解沈明远说的这些日常,但玩家为什么要体验日常?他们来玩游戏,不是来上班。戍边士兵的日常是什么?巡更、炊饭、修城墙。这些东西做成玩法,能好玩吗?
“不好玩。”沈明远承认。至少现在不好玩。但如果他们不做,雁门关就只剩一个空壳。玩家打完了仗,记住了什么?记住了攻城器械很帅,记住了奖励很丰厚。他们不会记住雁门关。
陆辰在这个时候插话了。他的声音不大,但很清晰。他同意沈明远的判断,但想补充一点——玩家记不住雁门关,不是因为他们不想记住,是因为他们没有给玩家记住的理由。烽火方案的问题不在于它做了战争,在于它只做了战争。战争是结果,不是过程。如果他们能让玩家在战争之前,先在这个地方生活一段时间,认识这里的人,知道城墙上哪块砖是哪个戍卒修补的,那战争爆发的时候,玩家感受到的不是刺激,是损失。
“损失感。”林铮重复了这个词。他问陆辰是不是想让玩家感受到损失。
“对。”陆辰说,“历史游戏的战争不应该让玩家觉得爽。它应该让玩家觉得疼。”
赵铮抬起头。他的战斗系统组在过去四周里刚刚完成了一轮手感优化,起手帧延迟的问题已经解决了大半。他对“疼”这个字很敏感。赵铮说疼是可以做的,但疼也要有手感。如果玩家在守城的时候操作卡顿、反馈延迟,他们感受到的不是历史的疼痛,是游戏的疼痛。这是两回事。
沈明远看着赵铮,让他说清楚。赵铮翻开笔记本,上面画满了战斗系统的流程图。烽火方案的攻防AI是基于阵营逻辑的,攻城方和守城方各自有一个目标优先级列表,攻城方优先攻击城门,守城方优先防守城门。这个逻辑清晰,但它是对称的。真正的守城战不是对称的。守城方知道自己在守什么——他们在守自己的粮仓、自己的营房、自己认识的人。攻城方没有这些。如果他们想让玩家感受到损失,AI的逻辑就不能是对称的。守城方的NPC要有记忆,要有行为惯性。和平时期他们在哪里巡更,战争时期他们就会优先防守那个区域。如果那个区域被攻破,他们的反应不是切换目标,而是崩溃。
“崩溃。”周逸群重复了这个词。他问赵铮是不是要做NPC的情绪系统。
“不是情绪系统。”赵铮说,“是行为逻辑的差异化。守城NPC在失去他们日常守护的区域后,战斗效率会下降。不是数值上的下降,是行为模式的变化——他们会撤退、会犹豫、会犯错。这种变化玩家能感觉到。”
林铮在笔记本上快速算了几行数字。差异化行为逻辑意味着每个NPC需要独立的决策树。雁门关的守城NPC数量,按烽火方案是二十个。如果每个都要独立决策,服务端的计算量会增加至少百分之三十。加上日常NPC的同屏数量,移动端跑不动。
会议室再次陷入沉默。沈明远站起来,走到白板前,拿起马克笔画了一条线。线的左端写着“烽火方案”,右端写着“日常沉浸”。他说他们现在站在这条线的中间,左边是技术可行但叙事空洞,右边是叙事丰满但技术不可行。他们要找的,不是左边,不是右边,是第三条路。他在线的中间画了一个交叉点。
沈明远提到苏敏的文档里有一个概念,叫“时间层叠”。他看向苏敏,让她来说。
苏敏站起来,声音有点紧张,但思路很清晰。雁门关在游戏里不是一个静态场景。玩家第一次进入雁门关,是在和平时期。他们看到的是一座活着的关城——有商人、有士兵、有驿卒。他们可以在这里接任务、交易、探索。当他们完成一定的主线进度后,战争会逐渐逼近。关城的氛围开始变化——商人撤走,士兵增多,城墙上的守军开始日夜巡逻。最后战争爆发,玩家参与防守。他们防守的不是一个抽象的关城,而是他们之前认识的那些人、那些地方。
林铮问这个方案的技术难点在哪里。“分阶段加载。”苏敏说,“和平时期加载的是日常NPC和交易系统,战争时期加载的是战斗NPC和破坏系统。两个阶段不共存,不会同时占用性能。”
“切换呢?”
“切换通过主线任务触发。玩家完成特定任务后,离开雁门关再回来,就会进入下一个阶段。不是实时切换,是实例化切换。”
林铮在笔记本上重新算了一遍。如果两个阶段不共存,同屏人数可以控制在四十以内。移动端帧率预估在二十五到三十之间。可交付。
周逸群看着苏敏,沉默了很久。他说这个方案有一个问题:玩家在和平时期认识的那些NPC,在战争时期会死。如果他们死了,玩家之前在他们身上投入的时间——交易、任务、对话——就白费了。
“不是白费。”陆辰说,“是变成损失感。”
“玩家会骂的。”
“他们会骂。”陆辰承认,“但骂完了,他们会记住。”
周逸群没有再说话。沈明远在白板上写下了几个关键词:时间层叠、实例化切换、差异化AI、损失感。他退后一步,看着这些词,宣布了决定。雁门关不做阵营对抗,做多时空层叠的叙事空间。和平、备战、战争,三个阶段,每个阶段的进入条件由主线进度控制。玩家在和平阶段建立的情感连接,在战争阶段转化为防守动机。技术实现上,分阶段加载,不共存。战斗AI做差异化,守城NPC有记忆和行为惯性。
他转向周逸群。烽火方案的场景资产——关城模型、地形、城墙——全部保留,美术组不需要重做。要重做的是玩法逻辑和NPC行为树。系统组需要和苏敏的叙事组对接,把三个阶段的任务线和NPC日常行为全部重新设计。
周逸群的手指在桌上敲了两下,问工期。“三个月。”沈明远说,“从今天开始算。”
“三个月做不完。”
“做不完也要做。雁门关是燕云十六州的脸面。如果这个地方做砸了,整个项目的地图叙事逻辑就立不住。”
周逸群深吸了一口气。他看了看林铮,林铮点了点头。他看了看赵铮,赵铮已经在笔记本上开始画新的行为树草图。“行。”周逸群说,“但我有一个条件。”
“你说。”
“烽火方案的攻城AI代码,我要保留一部分。不是全部,是攻城器械的逻辑和城墙破坏的物理计算。这部分代码我们写了两个月,如果全部扔掉,太可惜。”
沈明远想了想。他同意保留攻城器械的逻辑,但把它从玩家操作改成NPC操作。战争阶段,攻城方是NPC,玩家只参与防守。“可以。”
会议在下午五点结束。沈明远走出会议室的时候,雨已经停了。他站在走廊的窗边,看着园区里的积水反射着路灯的光。苏敏走到他旁边,说了声谢谢。“谢什么。”沈明远说。“谢谢你在会上提了我的方案。”沈明远转过头看她,说她的方案不是因为他提了才成立的,它本身就有道理。
苏敏沉默了一会儿。她说她写那个文档的时候,其实没想那么多。她只是觉得,如果雁门关只是一个战场,那它和别的关隘没有区别。玩家打完就走了,不会回头看。
“现在呢?”
“现在我觉得,它可能真的会变成一个让人记住的地方。”
沈明远没有回答。他看向窗外,积水在路灯下泛着冷白色的光。
雁门评审的决定在项目组内部传开后,反应是分裂的。美术组松了一口气——他们的场景资产不需要大改,关城模型的精度和地形贴图都保住了。许程在第二天发了一封邮件,确认美术组可以在两周内完成和平阶段的场景调整,主要是增加集市的摊位、关城内部的营房细节和城墙上的日常痕迹——晾晒的衣物、修补墙面的工具、巡更士兵留下的脚印。
战斗组进入了高强度的重做周期。赵铮把差异化AI的行为树画了整整一面白板,守城NPC的记忆逻辑被拆解成三层:第一层是空间记忆——每个NPC有一个“守护区域”,和平阶段他们在这个区域内活动,战争阶段他们会优先防守这个区域;第二层是关系记忆——NPC之间有社交关系,如果他们的同伴受伤或死亡,他们的战斗行为会发生变化;第三层是状态记忆——NPC会记住自己受伤的次数、失去的同伴数量,当这些数值超过阈值,他们的行为模式会从“坚守”转为“撤退”或“死战”。赵铮在技术文档里给这套系统起了一个代号:“雁门·骨血”。
系统策划组面临的压力最大。周逸群在雁门评审后的第三天,召集全组开了一次闭门会。会议从下午两点开到晚上九点,七个策划在白板上画出了雁门关三个阶段的任务流程图。和平阶段的任务线最长,有十七条支线,覆盖了关城内的主要NPC——守关的校尉、管粮仓的文书、修城墙的工匠、从蔚州来的商人、带着孩子过关的流民。备战阶段的任务线缩短到九条,重点是资源收集和防御加固。战争阶段只有一条主线——守住关城,保护尽可能多的NPC存活。
周逸群在白板上写下了设计目标:玩家在和平阶段认识的人越多,战争阶段的损失感越重。然后他退后一步,看着全组,提出了一个风险——如果玩家在和平阶段没有做支线,直接推进了主线,战争阶段他们会面对一群陌生人。损失感不存在。
“所以我们要强制玩家做支线?”一个策划问。
“不能强制。”陆辰的声音从门口传来。他刚开完另一个会,路过系统组的会议室,听到讨论就走了进来。强制做支线会破坏开放世界的自由感。他们要做的不是强制,是引导。让玩家觉得这些支线值得做。
“怎么引导?”
“用NPC的日常行为。”陆辰走到白板前,拿起笔。和平阶段的NPC不是在原地等玩家来接任务,他们在生活。校尉每天卯时在点将台点卯,玩家路过就能听到他点名。工匠在城墙上修墙,玩家走近能看到墙砖上刻着他的名字。商队在关门排队过关,玩家从旁边经过,商人会主动打招呼,问要不要搭伴走一段。这些日常行为本身就是任务入口。玩家不需要找任务,任务会找到他们。
系统组的策划们安静了几秒。然后有人开口,说这等于要做一个完整的NPC日程系统。“对。”陆辰说,“但不需要从零开始做。Messiah引擎的AI框架里有现成的日程逻辑,是从《逆水寒》的NPC系统里继承过来的。我们需要做的是适配雁门关的地形和角色设定。”周逸群在笔记本上记了一行字:NPC日程系统,评估复用成本。
这是雁门关重做的第一个月。
第二个月,技术问题开始浮出水面。林铮的团队在跑第一阶段压力测试的时候,发现了一个意料之外的瓶颈:雁门关的地形本身。关城两侧的山体面数太高,峡谷地形的光影计算量比平地高出百分之六十。和平阶段加载日常NPC的时候,帧率还能勉强维持在移动端二十八帧,但一旦进入备战阶段,城墙上的守军数量增加,帧率就掉到了二十二帧。
林铮把压力测试报告发给了沈明远。报告里有一行标红的数据:移动端,备战阶段,同屏NPC四十二人,帧率二十二,未达标。沈明远看完报告,去了一趟林铮的工位,问二十二帧能不能优化。“能。”林铮说,“但要砍东西。要么砍山体面数,要么砍NPC数量,要么砍动态光影。”
“砍哪个影响最小?”
“动态光影。”林铮打开了一个对比图。雁门关的峡谷地形,大部分时间处于山体的阴影中。动态光影的效果在关城内部不明显,只有在正午两个小时里能看到明显的明暗变化。如果把这部分砍掉,改成静态烘焙,帧率能回升到二十六帧。
沈明远问正午两个小时的动态光影,玩家会不会在意。林铮想了想,说如果没有人告诉他们,他们大概不会注意到。但许程可能会杀了他。沈明远笑了一下。许程是美术总监,他对光影的要求近乎偏执,在蔚州城的制作中,他曾经因为黄昏时分的城墙阴影角度偏差了三度,让美术组返工了两周。“我去跟许程谈。”沈明远说。
许程的反应比预想的平静。他听完林铮的技术分析,沉默了一会儿,然后给出了判断:雁门关的峡谷地形确实不适合做全时段的动态光影。正午的光线被两侧山体遮挡后,关城内部大部分区域是半阴的,动态光影的优势在这种地形里发挥不出来。他可以接受静态烘焙,但有一个条件——备战阶段和战争阶段的光影要做差异化。备战阶段的光线偏暖,战争阶段偏冷。用色调来区分氛围,不靠动态光影。林铮点头,色调调整不占性能。“那就这么定了。”沈明远说。
动态光影的问题解决了,但NPC日程系统的问题刚刚开始暴露。系统组在适配Messiah引擎的日程逻辑时发现,原有的框架是为城镇NPC设计的,NPC的移动路径是固定的,每天的日程是循环的。雁门关的需求不一样——NPC的行为需要根据战争阶段的推进而改变。一个和平时期在城墙上修墙的工匠,在备战时期会加入守城民兵,在战争时期会拿起武器战斗。同一个NPC,三个阶段的身份、位置、行为逻辑都不同。
周逸群在技术评审会上把这个问题摆到了桌面上。引擎的日程框架不支持阶段切换,NPC的身份和路径是在场景加载时固定的,不能根据主线进度动态改变。如果要实现苏敏方案里的“同一个NPC在三个阶段的不同表现”,需要在引擎层做改动。
林铮皱起了眉头。引擎层的改动需要中台审批,上次他们申请渲染管线的实验权限,等了两个月。“这次不能等。”沈明远说,“雁门关的工期只剩六周。”
会议室里的气氛重新变得沉重。沈明远看着林铮,问有没有绕过引擎框架的办法。林铮想了很久。有。不做阶段切换,做实例化副本。和平、备战、战争,三个雁门关是三个独立的场景文件,NPC各自独立。玩家在完成主线任务后,进入的不是同一个雁门关,是下一个版本的雁门关。
“这意味着什么?”
“意味着玩家在和平阶段认识的那个工匠NPC,在战争阶段其实是一个不同的NPC——有相同的名字、相同的外貌,但在系统底层是两个独立的数据实体。他们之间的‘记忆’不是通过系统逻辑传递的,是通过任务脚本硬写的。”
“玩家能感觉到吗?”
“如果任务脚本写得够好,感觉不到。”
陆辰在这个时候开口了。任务脚本他可以写,但有一个问题——如果和平阶段的工匠NPC和战争阶段的工匠NPC是两个实体,那玩家在和平阶段送给他的东西,战争阶段他还会记得吗?“不会。”林铮说,“除非你手动在脚本里写进去。”
“那就要写大量的跨阶段记忆脚本。”陆辰算了一下。雁门关有名字的NPC大概三十个,每个NPC在三个阶段都有不同的行为。如果要手动写跨阶段记忆,工作量至少翻倍。
沈明远的手指在桌上敲了敲。翻倍也做。雁门关的核心是让玩家在乎这些人,如果他们不在乎,整个方案就白做了。
“工期——”
“工期不变。加人。”沈明远看向周逸群,“从蔚州城的收尾组抽两个人过来。蔚州的交付已经稳定了,可以腾出人手。”周逸群点头。
技术方案从引擎层改动退回到实例化副本,牺牲了系统层面的优雅,换取了工期上的可行性。跨阶段记忆的脚本量比预期更大,陆辰的叙事组在第三周进入了每天十二小时的工作节奏。苏敏负责写和平阶段的NPC对话,她给每个NPC写了一段背景故事——校尉姓杨,是杨光远的后人,祖上在雁门关战死,他世代戍边;工匠姓石,从蔚州来的,他的手艺是父亲教的,父亲的手艺是祖父教的,三代人都在修城墙;流民母子是从朔州逃难来的,丈夫死在了契丹南侵的路上,他们想过关去中原,但关城的文书说流民不能过关,他们只能在关城外的草棚里等着。
苏敏在写流民母子的对话时,加了一句。母亲对儿子说:“等你长大了,雁门关的城墙要是还没修好,你就去修。”陆辰在审核这段对话的时候,在旁边批了一行字:战争阶段,这对母子会死。玩家救不了他们。苏敏问能不能让玩家救。陆辰说不能。如果所有NPC都能被救活,损失感就不存在了。苏敏沉默了很久,然后她把那句对话改了。母亲对儿子说:“等你长大了,雁门关的城墙要是还没修好,你就去修。要是修好了,你就去守。”
第三个月。雁门关的战争阶段开始进入战斗测试。赵铮的“雁门·骨血”系统在测试服上跑了第一次完整流程。测试团队选了十个玩家,让他们从和平阶段开始体验,一直玩到战争阶段结束。测试结果在第三天汇总到了沈明远的邮箱里。
数据是分裂的。正面数据:十个玩家中有八个在战争阶段表现出了明显的防守倾向——他们优先保护的NPC,都是他们在和平阶段有过交互的角色。校尉、工匠、流民母子,这些NPC的存活率比随机NPC高出百分之四十。赵铮的差异化AI起了作用——当工匠NPC受伤倒地时,附近的守城士兵会冲过去掩护他,这种行为让测试玩家感到了NPC之间的情感连接。
负面数据:十个玩家中有六个在战争结束后表示太压抑了。流民母子的死亡引发了强烈的负面情绪,有两个玩家在测试后的问卷里写了类似的话:他们知道这是游戏,但还是很难受,以后不想再来雁门关了。
“不想再来”——这四个字触动了沈明远。他把问卷转给了陆辰。陆辰看完后,在回复邮件里写了一段话。他说压抑是对的,雁门关在历史上就是一个让人不想再来的地方。但玩家说不想再来,不是说他们不喜欢这个设计,是说这个设计太有效了。现在要解决的问题不是压抑本身,是压抑之后的出口。玩家在战争结束后,需要一个理由重新回到雁门关。不是为了打仗,是为了重建。
“重建。”沈明远重复了这个词。他给陆辰回了一封邮件,只有一句话:加一个战后阶段。战争结束后,玩家可以回到雁门关,看到幸存的NPC在重建关城。工匠如果活着,他会继续修城墙。校尉如果活着,他会重新组织守军。流民母子如果死了,他们的草棚会被别的流民住进去。
陆辰回复了两个字:工期。沈明远回复:先做设计文档,战后阶段的实现放在上线后的版本更新里。陆辰没有再回复。第二天,他发来了一份新的文档,标题是“雁门关·战后”。文档里描述了战争结束后的雁门关:关城的城墙有大段坍塌,瓮城里堆满了碎石。幸存的NPC在清理废墟,新的商队重新出现在关门外。玩家回到这里,会和每一个幸存的NPC有一段新的对话——工匠会说墙倒了可以再修,校尉会说死了的人回不来了,新的流民会问玩家这里以前住的人你认识吗。苏敏在文档末尾加了一句话:“雁门关的重量,不在于它被摧毁了多少次,而在于它被重建了多少次。”沈明远看完文档,在页边批了四个字:“定调版本。”
雁门关的可玩版本在第三个月的最后一周交付了测试。移动端帧率稳定在二十七帧,台式机四十五帧。和平阶段的十七条支线全部完成,备战阶段的防御加固逻辑通过了压力测试,战争阶段的差异化AI在测试服上跑了三轮,NPC的存活率曲线符合设计预期。
但沈明远知道,这只是开始。雁门关方案所代表的设计取向——重历史沉浸、轻传统玩法、用叙事驱动情感而非用奖励驱动行为——在项目组内部仍然存在分歧。
周逸群的系统组完成了交付,但他在最后一次周会上说了一句话:雁门关是一个好关卡,但它是不是一个好游戏,要等玩家来回答。赵铮的战斗组完成了差异化AI,但他也在技术文档的末尾写了一行备注:这套系统的维护成本很高,每个NPC的行为树都需要单独调试,如果未来要在其他关隘复用,需要重构底层框架。林铮的引擎团队撑住了性能底线,但代价是砍掉了动态光影、牺牲了实例化切换的系统优雅性。他在交付邮件里写了一句话:雁门关在技术上是可交付的,但它不是最优解,它是他们在约束条件下找到的可行解。
这些声音,沈明远都听到了。他把它们记在了笔记本上,然后合上了笔记本。
雁门关交付后的第三天,他收到了一封邮件。发件人是网易互娱事业群的产品副总裁陈言。邮件只有一句话:下个月的内部版本评审,你们准备拿什么版本来。
沈明远看着这行字,没有立刻回复。他站起来,走到窗边。四月的杭州开始回暖,园区的樱花开了。他想起雁门关的城墙,想起顾知远笔记里那句“戍边的日常,比打仗更重”,想起苏敏文档末尾那句“让玩家在乎雁门关,不是因为它是一个战场,而是因为它是一个他们生活过的地方”。
雁门关方案已经落地了。但它所代表的那条路——重历史、轻传统玩法、用叙事驱动情感——还没有在更高的决策层级上被检验。陈言问的“拿什么版本来”,不是一个技术问题,它是一个定位问题。《燕云十六声》到底是一款什么样的游戏?这个问题,雁门关回答了三分之一。剩下的三分之二,将在下个月的内部版本评审中,被放到桌面上。
沈明远回到电脑前,打开回复窗口。他打了一行字,删掉,又打了一行,又删掉。最后他敲定了回复:“我们拿雁门关的版本来。但这个版本的核心不是玩法,是方向。”
他点了发送。窗外的樱花被风吹落了几瓣,落在积水里,漂在水面上不动了。