第 9 章
推倒重来的勇气
罗兹那间阁楼的显示器亮到很晚,空气里混着旧家具和焊锡的气味。红队的人围在屏幕前,看着一个猎魔人的身体在画面里转身。剑已经抬起来了,可角色没有移动。时间从那一帧开始拉长,下一道指令迟迟没有被引擎接住。
塞巴斯蒂安·杰林斯基盯着屏幕,没有说话。亚当·巴多夫斯基把手里那沓纸放回桌面,声音干得像纸页摩擦:这已经不是修几帧动画的问题了。
早在2001年前后,类似的场景就在这间阁楼里反复出现。那时版权合约的墨迹已经干透。作家萨普科夫斯基接受了公司的提议,把《猎魔人》系列的游戏改编权交给CD Projekt。
法律层面的事情告一段落,可真正的挑战才刚刚开始。公司继承的不只是一个IP,还有一句话背后的前提:游戏必须证明自己配得上这个故事。此前谁都以为,最难的部分是让那位作家点头。
后来他们才明白,让猎魔人在屏幕上动起来,才是第一道真正的断崖。事情的起点听起来像一次顺理成章的机会。
CD Projekt手里有《暗黑联盟》留下来的代码,有BioWare授权使用的极光引擎,有一家靠本地化发行《博德之门》建立起来的现金流,还有一部在国内市场越来越值钱的《猎魔人》。他们打算基于波兰奇幻小说作家安杰·萨普科夫斯基的《猎魔人》系列书籍研发游戏。那部小说在波兰很流行,作者本人也接受了公司的提议。最初该系列小说的改编权卖给了一个波兰手机游戏工作室,但该工作室并没有做任何相关的游戏。CD Projekt随后购得了《猎魔人》系列的改编权。
这个决定在1999年之后的波兰并不显得疯狂。相反,它几乎像一次迟到的本地化延伸:既然能替别人把外面的角色扮演游戏带进波兰,为什么不能把波兰自己的小说变成外面的角色扮演游戏?
红队就是在这样的逻辑里成立的。罗兹的阁楼最初只有十来个人,后来迅速扩张。
这个原本只有十五人的团队,在短时间内膨胀到近百人,研发成本一路攀升。
他们拿着极光引擎,带着本地化《博德之门》时积累下来的技术经验,试图把萨普科夫斯基那套复杂的世界塞进一个已经成熟的框架里。当时有人相信,这样做最安全。授权引擎意味着不用从零开始写渲染管线,不需要碰底层逻辑,也不必在波兰人才市场里寻找稀缺的引擎工程师。他们只需要替换内容,把剑湾换成维吉玛,把敌人的法术换成法印和炼金药。
直到原型第一次跑起来之前,这个计划听起来都像是一条捷径。但那台机器第一次跑起来之后,捷径就断了。
极光引擎有自己的性格。它从诞生起就服务于《博德之门》那一类游戏:等距视角、小队指挥、暂停后逐条下达指令。玩家点击一个目标,角色走过去,按照预先动画完成攻击,然后一切重新回到等待状态。
它的底层不是动作游戏那种实时碰撞和帧级别输入响应,而是一套被包装成即时的回合逻辑。角色每一次攻击,都像在一张指令队列里排队。玩家按下鼠标,不过是在队列最末端添加了一个新的条目。
这个例子在后来常被红队成员拿来解释那种无力感:无论你怎么敲键盘,角色都像隔着一道玻璃在执行命令。猎魔人的战斗完全不是那样。萨普科夫斯基写下的剑术不是一套摆好姿势、等角色去执行的演出。银剑在手中转动,脚步沿泥地滑开,手腕一翻,剑锋从侧面切入。随后法印在另一只手的指尖炸开,炼金药顺着喉咙烧下去,瞳孔开始变黑。这一连串动作发生在呼吸之间,需要玩家直接握住每一种动作的时间,而不是把命令交给系统去排队。
猎魔人的身体感来自速度和中断:你能在一剑劈出后强行取消后摇,能侧身躲过反击,能在翻滚起身的瞬间补上一记法印。极光引擎做不到这些。它甚至不允许玩家在攻击动画中途插入新的输入。
演示失败并不突然。问题是从原型内部长出来的。最开始的版本里,角色挥剑后要原地站上将近一秒,才能接受下一次点击。
开发组试着把动画切短,结果剑还没劈到敌人身上,伤害判定已经提前出现。
后来他们尝试在攻击流程里加入硬编码的取消逻辑,于是新的问题又来了:法印在快捷栏里被触发时,角色会先停下手里的剑,转身面向摄像机,做一整套施法准备动作。炼金药水切换后,武器模型偶尔会从手里消失半秒,像被引擎短暂地忘记了存在。最致命的是翻滚。角色滚出去之后,必须完整播放完起身动画,才能重新进入战斗状态。敌人不会等。屏幕上那个猎魔人经常在起身的第三帧被侧面劈中,血条掉下去,而玩家从头到尾没有做错任何操作。
一次次修补之后,一个结论逐渐变得无法回避:他们不是在修改引擎,而是在和引擎的底层逻辑对抗。每修好一个动作,就会在另一个位置撕裂出新的破绽。
有人提出把战斗做成半即时状态,像《博德之门》那样让玩家暂停后安排动作。他们做了个内部版本试玩。结果是灾难性的。猎魔人停了下来,战斗变成一次次按空格的开会。法印像清单上的选项,银剑像待结算的骰子。
萨普科夫斯基笔下那个在沼泽里追着怪物跑、浑身泥浆与药水味的猎魔人,完全不见了。
剩下的只是一具穿着狼头徽章、站在网格里的等距角色。问题从来不只是技术。更深层的原因在于,团队在开发过程中逐渐形成了自己的设计哲学:他们不想做一款《博德之门》的波兰换皮版,而是想做一款让玩家感受到猎魔人身体质感的动作角色扮演游戏。
这个野心最初并不清晰。他们甚至一度以为,只要照着《博德之门》的成功公式,把剧情和角色换成猎魔人,就足以在波兰市场成功。但随着原型一次次跑起来,那个模糊的念头变得越来越具体:如果杰洛特的剑术和法印需要被引擎安排成队列指令,那么一切关于猎魔人的独特体验就只剩下了文本。战斗被抽干成回合结算后,故事再好,也只是把小说搬到了另一个不合适的容器里。
这种认识不是一夜之间出现的。它藏在那些失败的测试报告下面,藏在开发组对萨普科夫斯基某些段落的争论里。
书里有一段反复被提到的战斗:杰洛特面对几只水鬼,没有站定,没有布阵,而是从石头上跃下,剑在左手里转了半圈,法印随之甩出,另一只水鬼被击退时,银剑已经切开了第一只的喉咙。
这一段没有写回合,没有写指令。它写的是身体的连贯。团队里越来越多人开始问同一个问题:如果游戏不能还原这种连贯,他们凭什么说自己拿到了《猎魔人》的改编权?
答案指向了一个更沉重的结论:极光引擎不适合这场战斗。它适合让玩家在远处观察角色,指挥一支小队,在暂停中作出战术判断。而猎魔人需要玩家成为杰洛特的手指和脚步。
这个判断一旦浮出水面,就没有再沉下去。亚当·巴多夫斯基当时已经进入核心决策层。作为项目管理者,他面对的不只是一个技术难题。
他手里摊着两张时间表。一张是继续沿着极光引擎修下去。原型已经跑起来,内容管线和对话系统有部分能复用。如果降低野心,把战斗改成更接近《博德之门》的点击攻击和法术列表,他们也许能在一年内拿出一个可玩的版本。成本可控,商业风险小。
另一张是从头再来。自研引擎意味着写代码的人要先搭工具,再谈游戏。他们可能要在罗兹阁楼里再耗上两三年,烧掉更多钱,而结果仍然没有保证。这种选择在当时波兰游戏行业几乎是不可理喻的。
波兰还没有多少自研引擎的积累。小公司靠授权引擎快速推出产品,是更常见的路子。
红队里并非没有人反对。反对者的理由很实际:公司没有自研产品,发行现金流虽然稳定,但养着近百人的开发团队,每多拖一个月,总部账本上的压力就大一分。极光引擎的原型尽管失败,至少证明了一些东西。放弃它,等于承认过去近两年的工作归零。更糟的是,他们甚至拿不出一个明确的替代方案。自研引擎听起来像一条路,可这条路通向哪里,谁也说不清。
然而,那种“不能这么做”的感觉越来越强。红队里有相当一部分人来自波兰的地下技术和演示场景。他们是在匮乏环境里长大的开发者,靠拆解盗版游戏、参加演示制作、在电子布告栏上交换技术心得练出了手艺。他们不认为授权引擎可以包办一切。对他们而言,一个引擎不是黑箱,而是可以拆开、可以绕过、可以重写的工具。
如果极光引擎不能做实时战斗,那就自己写一个能做的框架。这种冲动不完全理性,甚至带着某种来自蓝屏和报错信息里的倔强。
可正是这种倔强,让团队在技术冒险和商业安全之间,选择了前者。伊温斯基和季辛斯基后来都承认,当时他们并不完全理解红队正在下多大的赌注。总部的账本和罗兹阁楼之间隔着一段距离。他们能看见的是每月增加的人员工资,是一堆被标红的设计文档,是越来越长的开发周期。他们能听见的是巴多夫斯基和杰林斯基带回来的坏消息。
巴多夫斯基没有把选择说得太复杂。他谈的是产品身份。继续用极光引擎,公司可以交出一款游戏,但那不会是玩家想要的。自研引擎会拖长周期,可如果现在不转身,他们只会在一条死巷里越走越深。
最后拍板废掉原型的那个晚上,没有留下正式会议纪要。多年之后,当红队成员回忆起那段时间,提到的不是哪一次激烈争吵,而是一种逐渐沉下来的安静。有人把旧的原型演示存档,有人把引擎测试报告一张张收起。那台机器上失败的猎魔人依然僵着,可已经没有人在看它了。他们知道继续修下去只是延长痛苦。最诚实的做法,是承认这条路的尽头没有门。从技术角度回看,极光引擎并非烂引擎。
它后来在西方许多游戏中继续证明了自己的价值。它只是不合适。让一款为等距队伍指挥设计的引擎去承载一个需要帧级响应的动作角色扮演游戏,就像让一辆拖拉机跑出猎魔人的脚步。
失败的种子不是出现在某一次演示里,而是在他们决定用极光引擎去做猎魔人的那一刻就已经埋下。团队花了将近两年才把这个问题刨出来,代价是所有已经写好的原型,连同那份过于乐观的时间表,一起作废。
这个判断没有结束痛苦。恰恰相反,它在公司内部制造了一个新的空白。近两年的开发时间沉没了,已经扩张到近百人的团队必须重新确认方向。旧设计文档里的大多数内容无法沿用。战斗系统的全部逻辑要重写。敌人的人工智能、法印的释放方式、炼金药对角色状态的影响,这些都必须推倒。留下来的只有一样东西:对萨普科夫斯基世界的理解,以及对猎魔人应该是什么样子的执念。
这恰恰是那次推倒重来中最珍贵的部分。红队没有放弃小说,也没有放弃那个模糊的设计哲学。他们只是放弃了一个错误的载体。
而公司第一次用自己的钱,为“不妥协”三个字付了一次账。当时没有人会想到,这种模式会一再重复,并最终变成CD Projekt最被玩家称道的品牌姿态。如果有人问,这家公司是从什么时候开始认为延期和超支可以换取品质的,答案也许就藏在罗兹那个冬天里。
废弃原型只是这场赌博的下注。真正的工作从第二天早晨开始。有人打开新的文档,开始写第一行引擎代码,那行代码连一个三角形都还画不出来。有人重新画了战斗系统的草稿,用一张张纸描绘银剑的轨迹、脚步的位移、法印的触发时机。还有人坐下来,把萨普科夫斯基的小说重新翻开,不是为了整理剧情,而是为了寻找那些可以用动作系统表达的细节。
罗兹阁楼里的空气没有变得轻松。相反,裁员和预算的阴云一直悬在头顶。但至少方向变了。
他们终于承认自己走错了路。那是一个昂贵的转弯。就已经消耗的资源而言,近两年的原型开发几乎全部报废。团队人数从十五人扩张到近百人之后,每月的工资支出、设备投入、外部工具采购都在持续累积。
他们不是在修bug,而是在和一套根本不属于动作游戏的底层逻辑搏斗。极光引擎的核心是一套被称为“心跳-队列”的机制:引擎以固定频率轮询所有待处理指令,角色移动、攻击判定、法术结算、伤害反馈,全部排在同一张优先级表里。玩家点击鼠标的瞬间,那个指令不会直接触发动作,而是先进入队列,等待上一个动作的完整生命周期结束。在《博德之门》里,这套机制运转得天衣无缝。玩家指挥六人小队,点击敌人,角色走过去,挥剑,伤害数字跳出,一切都在可预期的节奏里完成。回合制的灵魂被巧妙地藏在即时演出的外衣下,玩家甚至感觉不到队列的存在。
但猎魔人的战斗容不下这张队列。萨普科夫斯基笔下的杰洛特不是在指令序列里战斗的。小说中有一段描写,后来被红队的设计师反复引用:杰洛特面对三只水鬼,左脚前踏,身体重心下沉,银剑从右向左横切,切开第一只水鬼的喉咙后,剑势未收,手腕内旋,剑锋顺势向上挑向第二只。与此同时,左手五指张开,阿尔德法印从掌心炸出,第三只水鬼被冲击波掀翻在泥地里。整个动作链条在两秒之内完成,没有停顿,没有等待,没有回合边界。
如果把这些动作拆解成引擎指令——移动、攻击A、攻击B、施法、切换目标——极光引擎会在每一个动作之间插入至少半秒的队列等待。两秒的连贯战斗,在引擎里会被拉伸成五秒以上的离散演出。水鬼不会等。玩家也不会等。
更深层的冲突在于动画系统。极光引擎的动画状态机是单向的:每个动画有明确的开始帧、中间帧和结束帧,引擎只在结束帧到达后才释放控制权。这意味着翻滚必须完整播完,攻击必须走完整个弧线,法印必须从起手式做到收手势。红队尝试过在动画中间插入“可中断帧”,但引擎的底层架构不允许外部输入打断正在播放的动画序列。他们甚至试图用脚本语言绕过状态机,在攻击动画的第12帧强制跳转到翻滚动画的第1帧。结果角色模型在切换瞬间出现了严重的骨骼错位——杰洛特的右手还握着剑,左手已经撑在地上,而引擎在两种骨骼姿态之间无法插值,导致角色在屏幕上短暂地扭曲成一团无法辨认的多边形。
这不是修修补补能解决的问题。它触及了引擎设计的根本哲学。极光引擎是为“观察-决策-执行”循环设计的:玩家观察战场,暂停游戏,下达指令,解除暂停,观看角色执行。一切动作都是预先编排好的演出,玩家是导演,角色是演员。但红队想要的是“感知-反应-动作”循环:玩家直接控制角色的身体,每一帧都在感知敌人的位置、自己的姿态、可用的技能,然后在毫秒级别做出反应。玩家不是导演,玩家是杰洛特的中枢神经。这两种循环之间的鸿沟,不是靠缩短动画帧数或优化指令队列就能跨越的。它们代表了对“什么是角色扮演游戏”这个问题的两种完全不同的回答。
这个认识不是一蹴而就的。在原型开发的头几个月里,红队内部弥漫着一种谨慎的乐观。他们成功地把维吉玛的街景导入了极光引擎的渲染管线,对话系统跑起来了,任务脚本也能触发。有人甚至做了一个简短的演示:杰洛特站在维吉玛郊外的沼泽边,镜头缓缓推近,狼头徽章在月光下泛着银光。那一刻,所有人都觉得这条路走得通。直到战斗系统被接进去。第一次战斗测试的日期,后来被几个老队员记在私人笔记里。他们选了小说里最简单的一场遭遇战:杰洛特在沼泽边遇到两只水鬼。按照设计文档,玩家应该先用法印击退一只,翻滚拉开距离,然后挥剑解决另一只。但在原型里,法印释放后角色僵在原地整整一秒,水鬼已经扑到面前。翻滚指令被队列延迟,角色在翻滚前先挨了两爪。银剑终于挥出去的时候,第一只水鬼已经绕到了背后。
测试结束后,有人把键盘推到一边。阁楼里安静了很久。杰林斯基后来在一次行业会议上回忆那个时刻,用了“集体失语”这个词。不是愤怒,不是沮丧,而是一种更深的困惑:他们以为自己知道怎么做游戏,但引擎告诉他们,他们不知道。这种困惑在接下来的几个月里转化成了一种近乎偏执的修补冲动。有人开始拆解极光引擎的动画管线,试图找到那个控制队列优先级的底层函数。有人在纸上重新设计整个战斗系统,用流程图画出每一帧的输入窗口和响应逻辑。还有人飞到加拿大,直接向BioWare的工程师请教引擎的架构细节。每一次尝试都带来短暂的希望,然后被新的问题击碎。动画管线可以改,但改了之后对话系统开始丢帧。队列优先级可以调,但调了之后敌人的人工智能开始出现逻辑断裂——怪物会在攻击中途突然转向,像被一根看不见的线拽走。
最绝望的时刻出现在一次内部演示之后。巴多夫斯基邀请了总部的伊温斯基和季辛斯基到罗兹阁楼,想让他们看看最新版本的进展。演示的内容是杰洛特同时面对三只水鬼和一只溺亡怪。战斗开始,杰洛特挥剑,动作流畅了一瞬。然后法印释放,角色再次僵住。翻滚之后,杰洛特面朝错误的方向,银剑砍在空气里。溺亡怪的模型在攻击动画中突然消失,半秒后重新出现在三米之外。演示结束,屏幕暗下来。伊温斯基没有说话。季辛斯基盯着屏幕看了很久,然后转向巴多夫斯基,问了一个问题:“如果这不是引擎的问题,而是我们的问题呢?”
这个问题击中了一个更深的痛点。红队里并非没有人怀疑过自己的设计能力。他们中的大多数人是第一次做游戏。塞巴斯蒂安·杰林斯基写过演示程序,但没有做过商业引擎的集成。亚当·巴多夫斯基管理过本地化项目,但从未主导过原创开发。团队里最资深的程序员,经验也仅限于把英文游戏翻译成波兰语版本时修改过的那些配置文件。如果他们连授权引擎都用不好,凭什么相信自己能从零开始写一个更好的?这种自我怀疑在阁楼里蔓延了一段时间。有人开始重读《博德之门》的设计文档,试图理解BioWare是如何在极光引擎的限制下做出那些流畅的战斗场景的。答案让他们更加沮丧:BioWare从来没有试图在极光引擎里做动作战斗。《博德之门》的战斗流畅,是因为它的设计完美地适配了引擎的队列逻辑。每一次攻击都是精心编排的演出,每一个法术都有固定的施法时间,玩家在暂停中做出的每一个决策都在引擎的舒适区内。红队不是用不好极光引擎,而是想用它做它根本不该做的事。
这个结论一旦被明确地说出来,就改变了讨论的方向。问题不再是“我们能不能修好极光引擎”,而是“我们到底想做什么样的游戏”。如果答案是“一款像《博德之门》那样的等距角色扮演游戏”,那么极光引擎完全够用,甚至绰绰有余。他们只需要把《博德之门》的公式搬到维吉玛,换上萨普科夫斯基的剧情和角色,然后交付一款在波兰市场绝对能回本的产品。但如果答案是“一款让玩家成为杰洛特的游戏”,那么极光引擎就不是工具,而是牢笼。这个二元选择在红队内部制造了第一次真正的分裂。一部分人认为,公司的资源根本不足以支撑自研引擎的野心。近百人的团队已经让总部账本吃紧,如果再拖两三年,现金流可能断裂。另一部分人则认为,如果现在妥协,他们永远只能做换皮游戏——先是《博德之门》的波兰版,然后是别的什么游戏的波兰版。CD Projekt花了十年时间把最好的角色扮演游戏带进波兰,不是为了让自己变成一家本地化工厂。
巴多夫斯基在这个阶段扮演的角色,后来被伊温斯基形容为“那个在悬崖边上说‘跳’的人”。他不是程序员,无法从技术层面判断自研引擎的可行性。他也不是设计师,无法从玩法层面证明动作战斗一定比回合制更好。但他有一种从本地化项目中磨出来的判断力:当产品身份不清晰的时候,任何技术方案都是临时的。他反复问团队一个问题:“如果五年后有人提起这款游戏,你希望他们说什么?”没有人回答“它很像《博德之门》”。这个沉默比任何技术论证都有说服力。它意味着团队已经在心里做出了选择,只是还没有勇气把它说出口。
那个选择最终在一个没有记录日期的晚上被正式确认。罗兹阁楼的暖气片嘶嘶作响,桌上摊着极光引擎原型的最后一次测试报告。报告里列出了所有已知问题:战斗响应延迟、动画中断导致的骨骼错位、法印和炼金药切换时的模型消失、翻滚后的输入锁死。旁边放着一份新的设计草案,标题是“猎魔人战斗系统核心原则”。第一行写着:“玩家的每一次输入必须在100毫秒内得到视觉反馈。”这个数字是杰林斯基从动作游戏研究论文里找到的。它意味着引擎必须在每一帧都检查输入状态,而不是等待队列轮询。极光引擎做不到这一点。没有任何修补能让它做到这一点。巴多夫斯基拿起那份草案,看了很久。然后他把测试报告翻到最后一页,在空白处写了一行字:“从零开始。”没有签名,没有日期。那张纸后来被钉在阁楼的公告板上,直到搬家时才被取下。
这个决定在商业层面的含义,远比技术层面更加沉重。近两年的开发时间不是一笔抽象的成本。它意味着红队从十几个人扩张到近百人的过程中,每一张工资单、每一台设备、每一份外包合同,都已经计入了公司的财务表。CD Projekt当时的主要收入来源是发行和本地化业务,利润率并不高。
整个项目的研发成本后来超过两千万兹罗提。其中相当一部分,是在转弯之前烧掉的。他们用这些钱换来了一个最重要的教训:工具必须服从游戏,而不是让游戏服从工具。这个教训写在引擎测试报告上,写在一次次僵在屏幕中央的猎魔人身上,也写在公司账本越来越紧的那一列数字里。但这笔钱没有白花。它逼着红队在废墟上重建,逼着他们从授权引擎的安全区里彻底走出来。接下来的路会更长,资金压力会更大,波兰以外没有人会为一个尚未自研引擎的小型波兰开发团队押注。可如果他们在那个冬天选择将就,那条死巷的尽头连废墟都不会有。归零之后,新的起点仍然模糊,却至少不再是一堵墙。对于一家靠发行现金流支撑、没有任何自研产品的小公司来说,这样的转身本身,就是一场看不见底的赌博。两年时间、近百人的团队、超过两千万兹罗提的投入,都已经被那个没有留下会议纪要的决定归零。
可正是在这种归零里,一种后来被反复验证的开发逻辑第一次显露出来:他们可以忍受更长的周期、更大的超支、更不确定的技术冒险,唯独不能接受交付一件连自己都不相信的产品。这个逻辑从罗兹的阁楼出发,将沿着一条曲折的引擎之路向前延伸,把这家公司带上一个比一个更高的悬崖。