我们都知道,《魔兽争霸》最最经典的玩法之一就是局域网战斗,这种玩法不仅是RTS竞技的首次尝试,也让DotA等后来的地图有了可以双方多人对战的基础。
出于技术方面的原因,在如今的MOBA游戏中,这种局域网对战的做法已经被逐渐抛弃,但在出于‘技术黑暗期’的暴雪,到底是如何做出了这种可以带来紧张刺激体验的多人对战玩法呢?在早些时间的一篇博客中,Patrick Wyatt讲述了《魔兽争霸》项目策划过程、战斗单位建造、战争迷雾、电脑AI设计的灵感和来源,并讲述了第一次《魔兽争霸》多人对战的设计以及出现的问题和解决过程,以下请看编译的完整译文:
《魔兽争霸》的首次多人游戏是压倒性的胜利、一个惨败,也是一场平局。可能有人会问,这怎么可能同时发生在一件事上呢?其实,这里是有故事的,其中包括游戏AI、游戏业务经济、战争迷雾以及更多因素,如果有时间的话,你应该认真读完这篇文章。
经过了自1993年9月以来的六个月研发之后,《魔兽争霸》系列的开山之作《兽人与人类》终于成为了一款游戏,而不是科技Demo。很多个月以来,我一直是该项目唯一的全职员工,因而游戏的研发节奏是有所限制的。幸运的是,我有其他同时协助,包括Ron Millar、Stu Rose和其他几个人负责游戏设计工作,随后几名从事其他项目的美术师终于抽空为项目做了创意原型的美术工作。
初始团队的人员数量听起来很寒酸,因为当时的《魔兽争霸》是公司自筹资研发,而公司的收入则是给Interplay和Sunsoft这样的游戏发行商做外包工作挣来的,所以资金量是很有限的。
当时我们在研发4款16位主机游戏:一个较好不叫座的横版解谜游戏续作《失落的维京人2(The Lost Vikings 2)》、一个横版奔跑跳跃游戏《黑色荆棘(Blackthorne)》、一个DC漫画皮的‘街霸’科隆作品《Justice League Task Force》和一个横版动作游戏《Death and Return of Superman》。正是有了这几款游戏的研发资金和公司其他的一些作品,我们才有了最初的研发成本。
游戏研发经济学
在游戏行业历史的大多数时期,不隶属于零售游戏发行商的独立研发工作室通常的筹资方式是有限的,大多数都是通过与这些发行公司签外包研发合同获得资金,因为这些发行商会提前支付一笔游戏研发费用,除了先期研发资金外,发行商还会负责PR、市场营销、制造、零售、客服支持诸如此类的后续工作。
在上世纪90年代初,那时候的零售游戏发行商比现在多很多,但持续增长的游戏研发成本以及游戏发行成本的增长导致了游戏业公司大量的破产和并购,现在想起零售游戏发行商,可能大多数人会提到动视暴雪、EA或者育碧,而不是20年前存在的那一大批中型公司。和所有行业一样,合同的条款是由出资方拟定的,所以规则就是,‘有钱人说了算’。虽然理论上来讲这种模式是非常有序的,游戏卖得好可以给研发商带来不错的回报,但从历史角度来看,从来都是发行商拿到最多的利润,这一点在电影行业同样适用,开发商们获得的资金充其量足够他们活着等到下一个项目,前提是如果足够幸运的话。
上面提到‘提前预付金’的时候,更为确切的说,是不包括分成在内的预付金,对于开发商们来说相当于一个可免除贷款,随后开发商可以从游戏销售中获得分成。这个模式其实听起来非常好:你研发一款游戏,并且卖出去的每一份游戏都有分成。但这种模式最后被证明了绝大多数研发出来的游戏销售额都没有能够达到预付金的水平。由于研发工作室通常必须放弃他们对游戏以及续集的所有权,这种模式通常被认为是雇佣协议模式。
为了更好的交易条件,研发工作室通常采用的策略就是自筹资研发游戏创意原型,然后用它来吸引发行商注资,开发商自筹资投入的时间越久,就可以从最终合同中得到更多的话语权。或许最佳的例子就是Valve Software,Gabe Newell用自己在微软挣到的资金用于《半条命》的研发,因此他获得了在这个游戏发布时间方面的话语权,所以他才可以决定只有达到高质量要求的时候才发布游戏,而不是必须为了让Sierra Entertainment季度财报更好看而按规定时间发布。更为重要的是,Gabe自己的资金量足以保证这款游戏的在线分销权属于Valve公司所有,而当时并不起眼的在线分销模式给Valve后来的起飞奠定了基础。
自筹资研发创意原型的不利之处在于,这时候的游戏是没有发行商签的,通常把资金耗光之后就会导致工作室关门。我所在的公司当时的名字还是 Silicon & Synapse,我们的《魔兽争霸》是自筹资的,另一个项目《Games People Play》也是自筹资,后者加入了猜词解谜、Boggle以及很多机场货架上经常见到的游戏玩法。
由于需要支持两款完全不同风格的游戏研发,当时的公司所有者们希望创造更多的资金来源,希望让公司的资金状况更加稳定,而不是去冒公司倒闭的风险。当然,把赌注放到多个游戏内容本身也是有风险的,因为多数情况下一个公司的产品如果没有满足其用户群的需求,往往也会失败。暴雪品牌今天的一个巨大优势就是,即便是没有看到产品,其忠实用户也会信任该公司能够做好,这就是品牌效应。而当时的既做休闲游戏又做3A游戏的风格是很难赢得这样声誉的,比如当年的 Sierra Entertainment,后来由于难以找到用户群而陷入了苦苦挣扎。
在所有的活动中,《Games People Play》都被证明是错误的决定,因为做一个休闲娱乐产品对于主程序来说非常的缺乏兴趣,所以这个项目从来也没有成熟过,而且最后还是被取消了。或者换个角度来说,这不是一个错误,因为正是由于《魔兽争霸》和《Games People Play》两款游戏的存在,才最终说服了当时的第二大教育软件公司Davidson & Associates收购Silicon & Synapse。
我们的新东家
Davidson & Associates由Jan Davidson创建,后来他的丈夫Bob也加入了公司,当时公司有多款教育游戏,得益于《Math Blaster》的成功,公司增长被一致看好。作为一款教育游戏,《Math Blaster》如果用的好的话还是有一定价值的,但我觉得它有时候很愚蠢,我高中的新闻课会在电脑房为校报写文章和医学教育进行分享,我的新闻学同学们和我一起看到过12年纪的医学学生们用计算器玩《Math Blaster》的场景。
由于这些小行星包含‘3+5’以及‘2X3’这样的表达式,所以他们快速的用计算器计算,然后输入结果破坏这些小行星,毫无疑问的是他们可以学到一些东西,认为他们比教师聪明,但我并不觉得他们这样用时间是值得的,因为他们很快就可以输入结果了。
有了良好的发展和风格激进的领导人,Davidson和Associates开始向游戏制造业扩张(为零售盒装游戏进行制作和打包)、介入了游戏分销以及学校教材的发放。他们看到了向娱乐领域进军的机会,最后,他们初期创造娱乐体验的经历让他们觉得, 如果从外部买一个有经验的团队会更加靠谱。
所以,威胁《魔兽争霸》研发团队继续投入的现金流问题也随着公司被收购变得迎刃而解了。有了Davidson的支持,Silicon & Synapse终于有可能专注于研发自己的游戏,而不是去不断的寻找低利润的雇佣模式给其他发行商打工,被收购之后公司改名为暴雪。当时的母公司实力雄厚,在1993年创造了2款顶级游戏,并且被评为任天堂年度开发商,但公司没有拿到任何分成。
从并购中获得了大笔资金可以用来招聘新员工,并且还可以让现有的员工转到该项目上来,所以《魔兽争霸》的研发进度有了大幅提高。
策划‘过程’
暴雪最初几年的游戏设计和研发过程最好的描述方式就是‘自然的’,在正式的设计讨论会上我们进行大量的讨论,但更是经常在公司走廊或者吃饭时间进行小规模交流。有些功能出自设计文档,而其他功能则是由单个程序员做出来的。游戏美术是规划好并且按照程序执行的,但也有些是因为美术师突然想到了好主意而熬夜加班完成的,还有则因为美术师只是希望做出不同,其他元素也是类似,《魔兽争霸》的故事和传说一直到游戏即将发布前的几个月才出现。
虽然过程不可预测,但结果是非常惊人的。因为我们的团队是由一些游戏研发大神组成的,在他们研发的过程中,游戏一步步发展到了后来被玩家们认可的作品。我们的第一款《魔兽争霸》是为IBM PC机研发的,最佳证明了这个过程,最终使这款游戏成为了经典。
《魔兽争霸》的单位创作系统是如何而来的
生物学家们都知道,进化过程的一开始就是错误的,因为所有的进化树都被抹掉了,而我们的研发也同样磕磕绊绊。因为我们没有可以对比的数据,所以只好反复的尝试并且去掉不能用的东西,我可以说这是一个谨慎、认真的过程,但很多时候这些想法都是从事故、争论以及个人冲突得来的。
我记忆犹新的一件事是和游戏单位创造相关的,在研发的初期阶段,你需要在主机上输入cheat指令才能让单位行动,因为当时没有别的UI机制可以做,在我们考虑如何最有效创造单位的时候,很多想法出现了。为暴雪初期游戏做了大量创意和设计的美术师Ron Millar提议让玩家们建造农场房间,和《Populous》里一样,这些农场阶段性的产出基本的工人单位,也就是(人类的)农民和(兽人的)苦工,玩家们可以使用这些单位直接挖掘金矿、砍伐树木并建造设施,但他们不能具备战士的能力。
这些苦工还可以直接在兵营里接受军事训练,期间他们会从地图上消失,训练完成后成为熟练的战斗单位,其他的训练区域可以创造更高等的军队单位,比如弩车组和巫师。这个想法最终没有完全实现,这也是我们设计过程的一个常见失误,因为设计过程的最终结果缺乏正式的文档,所以一个被讨论过的想法有时候不知道如何被执行,所以这个想法在开始写代码之前,在我们的非正式设计组里讨论了很多遍。
在开始写代码之前,Ron离开去参加了一个交易展会(有可能是当时的冬季CES),他是和公司总裁Allen Adham一起去的,在他们离开期间,我们确定了《魔兽争霸》系列的方向,我把它称之为‘《魔兽争霸》策划政变’。
在一个午后,另一个早期加入公司的美术师Stu Rose来到了我的办公室讲述不同的做法,Stu认为Ron提出的单位创造机制有太多未能解决的实际困难,更重要的是这种操作方式和我们要给玩家带来的实时策略游戏体验是相悖的(RTS)。
在他的RTS内容下,玩家们需要更多的注意力,他们不能把目光放在同一个地方太久,因为游戏中有太多的竞争,规划建筑/升级树、推动经济发展、创造单位、放置建筑、侦查地图、观看战斗并对个体技能进行微控制。在一个RTS游戏里,最有限的资源就是玩家的注意力,所以增加非直接的单位创造机制是给玩家增加了负担,可能会导致注意力冲突,提高游戏难度。
为了建造最基础的战斗单位兽人步兵,玩家们必须把农民或者从事低重要性工作的工人参加训练,在Stu看来这是不必要的增加了游戏难度。我对他的看法非常认同,因为我也有同样的看法,并且不认为单位创造是需要进行大改的地方。这里说的大改,参照物是《沙丘魔堡2》,我们的游戏《魔兽争霸》灵感就是来自该游戏,但比该游戏的单位创造有更为简单的方法,你只要在工厂建筑界面点击以下,这个战斗单位就可以跳出来为你而战,这个想法并不是创新,而是借鉴了更早的一些游戏,但却非常的适用。
Stu认为我们应该采取他的建议,不要进行更多争论而应该立即开始做。所以在接下来的几天以及多个夜晚中,我匆匆做出了游戏以及单位创造所必需的用户界面,所以这个设计决定已经成为了既定事实。当Ron和Allen回来的时候,我们已经完成了简单的单机模式,不过当时没有做敌人和电脑AI系统。
所以这个阶段的时候,《魔兽争霸》已经成了一个玩起来简单的游戏,更重要的是,它还很有趣,所以我们此后再也没有改过单位创造系统。
《魔兽争霸》的第一次多人游戏
在1994年6月,经过了10个多月的研发之后,我们的游戏引擎差不多已经可以用于多人模式了。我越来越开心的发现,我加入的一些代码上的改变使得《魔兽争霸》终于有可能进行首次多人游戏了。在忙于制作核心游戏逻辑(事件循环、单位调度、寻路、战略AI单位、状态栏、游戏内UI以及高等级网络代码等工作)的时候,其他的程序员们一直在忙着做多人游戏相关的组件。
一个来自Caltech的大学生Jesse McReynolds完成了一个低等级的网络资源库,并通过本地局域网发送IPX信息包。这个代码是基于Quake的源代码而来,当时是约翰?卡马克在 id Software时候做的,现在已经开源了。虽然IPX界面层只有几百行的C代码,但它是网卡驱动代码界面的一部分,确保了一个游戏客户端创造的信息可以被发送到另一个玩家的机器上。
当时还在Cal State Fullerton读研究生学位的Bob Fitch研发了最初的联网界面,可以让玩家们加入多人游戏,我的办公室和他挨着,所以交流起来非常的方便,因为我们必须通力合作才能把他的加入游戏与我的游戏事件结合起来。在完成了所有改变之后,我打包了游戏客户端并把它复制到一个网络驱动上,这时候Bob回到了自己的办公室加入这个游戏。这是一个多么小的奇迹,我们两人写的代码居然可以用了,所以我们俩完成了第一次的《魔兽争霸》多人对战。
随着游戏开始之后,我感觉到了玩任何其他游戏都没有的激动,其中一部分是因为我参与了代码工作,但更为重要的是,终于可以和真实的人类对手进行游戏,而不是电脑AI,而且由于战争迷雾的缘故,我还不知道他在做什么。
战争迷雾的由来
从早期游戏借鉴的一个想法就是让对手看不到敌对单位,游戏地图中的隐藏区域由黑色图片组成,只有友方单位探索之后玩家才能看到,因为在真是战斗中,如果可以实时看到地方的操作是非常不完美的体验。
十七年前由Walter Bright研发的一个回合制多人策略游戏《Empire》当时为了同样的目的使用了战争迷雾,当一个地图被发现之后,这片区域就永远是亮着的,所以这类游戏最重要的就是尽早探索地图,这样在和敌人作战的时候就拥有更大的优势,因为了解敌人动向才能更好的做应对。
在历史上,由于不了解敌人创造的地形而失败的将军太多了,把这个因素加入RTS玩法中是增加游戏乐趣非常重要的方式,所以这个玩法我们要感激Walter以及西木工作室从事《沙丘魔堡2》的人员。
电脑AI
很多玩家们都知道,策略游戏中玩家们遇到的电脑控制AI通常是很弱的,所以玩家们经常会发现电脑AI是程序化的,击败它们很简单,所以电脑AI方通常会有军队、位置或者规则方面的优势,这样才能给玩家们带来更大的挑战。
在大多数的《魔兽争霸》任务中,敌对电脑玩家通常有完整的城市和军队与人类玩家战斗,更为重要的是,《魔兽争霸》还有一些非对称规则,让AI可以与玩家进行竞争,不过可能大多数的玩家直接把这些规则称之为‘作弊’。我们创造的其中一条规则就是帮助AI减少金矿的流失量,比如当一个人类玩家用工人采矿的时候,每次可以采100个单位的矿,然后往大厅里运送100金,知道金矿被采光。而当AI占领这个金矿的时候,它的工人只需要采8个单位的矿就能往大厅运送100金。
这种非对称规则实际上让游戏更加好玩,比如以下两个方面:它可以阻止玩家使用堡垒策略,比如利用强大的策略技巧建造无懈可击的防御,所以‘堡垒策略’对于AI来说是没有用的,因为人类玩家的金矿会比电脑AI更早消耗光。
第二,当人类玩家最后破坏了电脑的基地之后,他们还可以有金矿可以采集,这样也让游戏变得更快,比使用有限的资源获得碾压性的胜利更为有趣。
大多数的玩家可能会意识到AI设计最不公平的是,他们可以看穿战争迷雾,AI随时知道玩家们在做什么。在实际游戏中,这个优势其实对于电脑来说并不大,仍然不能阻止它在人类玩家面前看起来非常愚蠢。有趣的是,在《星际争霸》推出十多年之后,一些AI程序员们开始尝试非作弊性AI的设计,得益于 BWAPI资源库的帮助,这些程序员们可以直接为《星际争霸》引擎输入指令玩游戏。程序员们进入这些AI进行相互竞争,这些BWAPI产生的AI是非常优秀的,有时候可以击败非常优秀的人类玩家。
与人斗其乐无穷
作为一个在开始研发《魔兽争霸》之前就玩过很多策略游戏的人来说,我对于当时的电脑AI限制是非常了解的,虽然我也和很多的电脑AI战斗过,有时候可能还会输,但大多数时候是赢的,我从来都不怕和AI战斗,即便是玩Eastern Front的时候同样如此,当时我在朋友的Atari 800游戏机上体验过Chris Crawford创造的游戏,后来我的卡带实在太久而不能读了。
这些游戏都很有趣、让人激动,最重要的是具有挑战性,但并不让人觉得可怕。但是,当我第一次玩了《魔兽争霸》的多人模式之后,我的看法有所改观。
我知道自己在和真实的人类玩家对战,不只是技术和策略,还需要考虑指挥速度,由于战争迷雾的原因还不能看到对方在做什么,这样的感觉既紧张又刺激。在我的职业生涯中,从来没有一款游戏可以让我像玩《魔兽争霸》多人模式这样激动,因为你不知道战斗的结果是赢还是输。
在这种激动情绪的推动下,我尽可能有效的获得金币和木材,建造农场和兵营,研发攻击能力,探索地图,最重要的是,在他可以攻击我之前击败Bob的军队。当时没有测试游戏来验证引擎的功能,我知道他也同样觉得谁赢得首个《魔兽争霸》多人战斗意义重大。更重要的是,当我们在暴雪一起玩《毁灭战士》的时候,我基本上在办公室出名了,Bob因为我频繁的杀掉他而发怒,他发誓再也不跟我玩了,我知道他一定在等着有机会报仇。
在战斗中我们的军队相遇了,我们都尽了最大努力创造更多的单位参战,当我发现他的营地并攻击之后,我就觉得更有希望了。Bob的策略似乎没有章法,似乎我可以击败他的军队,但我希望不给他留任何机会,然后只要看到他的单位和建筑我都会进行攻击。
而突然之间,游戏崩溃了。
只要是个程序员都会明白,新代码首次完美工作的可能性为0,所以游戏崩溃是很正常的,游戏屏幕回到了游戏崩溃界面,让人很容易想起Windows之前的时代。而现在我们的Windows错误报告其实更复杂了,玩家们还可以每一次都提交错误报告,不过通常玩家们偶尔会看到蓝屏界面。
游戏崩溃之后,我离开办公室去找Bob,并且说‘太棒了,我把你打的落花流水’,所以当我听到Bob说他把我打败了之后让我很惊讶。我们争执了几句就回到了正常话题,不过在更短的时间里我们发现,游戏不仅出现了bug,还出现了实时同步的问题,我把它称之为‘同步bug’,我们两个人的电脑完全在上演不同的战斗,本是同一个游戏却发生了完全不同的结果。
对于从来没有接触过网络编程的童鞋们来说,他们可能会认为《魔兽争霸》客户端会不断的发送整个游戏的状态,也就是说,每个回合电脑都会发送位置和每个游戏单位的动作。在一个只有少数位置的慢节奏游戏中,比如象棋或者跳棋是可以这么做的。但在一个像《魔兽争霸》这样的游戏中,一次性可能有600个单位在行动,所以你不可能通过网络传递这么大的信息量。
我们认为很多玩家可能会使用2400波特率的调制调解器,这样每秒钟只能传输几百个字符,从来没有用过调节器的年轻玩家们应该花时间看看这个技术,基本上没有比烟幕信号少太多东西,而且只是比滴水穿石的做法先进了那么一点点。但你们要知道,那时候还没有Amazon、谷歌以及Netflix,我们当时所处的时代太落后了。
由于此前曾经把战斗想起从DOS移植到Windows平台过,所以我对于多人游戏使用调节器交流是非常熟悉的,我知道这是因为通过调节器的带宽有限,所以通过网络发送所有的游戏状态是不可能的,所以我的解决方法就是只发送每个玩家的命令,并且让双方同时执行这些操作。
我知道这个方法是可行的,因为电脑对于执行命令是非常在行的。然而不幸的是,很多时候研发游戏的人类往往不善于告诉电脑应该去怎么做,所以才会产生如此之多的BUG。当两个电脑被认为应该做同样事情的时候,但通常会因为bug而出错,这的确是个问题。
当两台电脑同步各自游戏数据的时候,他们对于同样的问题给出了不同的答案,这个问题会随着游戏进展越积越深,就像很多穿越电影那样,你在过去只要改动一点点,未来就会发生巨大的改变,《魔兽争霸》游戏也是一样,在我的电脑上,我看到了Elvish弓箭手可以看到你的Orcish苦工并攻击,而在你的电脑上,苦工可能完全没有看到过我的单位,由于无法对这些数据不一致进行识别,我们两人进行的对战游戏就成了两个游戏。
所以这就是《魔兽争霸》的第一个多人游戏,但同时对于研发团队来说是个巨大的胜利,因为它实在是太有趣了,其他的团队成员很快也尝试了多人游戏,一旦人们体验了多人模式之后,再没有其他更具吸引力的东西了,即便当时经常出现游戏崩溃,我们团队一致认为我们在做伟大的游戏。
而当时我们所有要做的,就只是把游戏做完。
悲剧的是,我们很快发现了更糟糕的事情,我们不仅有很多的同步BUG,还发现了不同的BUG原因,如果所有的bug都出于同一个原因,那么我们解决起来会很容易,但结果是同样的bug有很多的原因导致,所以每一个BUG都要分不同情况解决。
为什么会发生同步BUG?
在研发《魔兽争霸》的时候,我设计了一个解决方案对需要网络传输的数据进行最小化控制,只发送每个玩家最初的指令,比如‘选择单位5’、‘移动到 65.,1224位置’以及‘攻击单位53’等等,很多程序员独自设计了同样的系统,这样可以不用发送整个游戏数据就可以在单个游戏回合进行两台电脑之间的同步。
如今,这种做法可能会有人尝试为这种方法申请专利,但我认为这个软件不应该申请专利,基本上软件中的大多数想法都是一个资深的程序员可以做到的,而Nuff表示专利的定义是必须是非明显性(non-obvious)的。
我从来没有使用任何方法来检查两个电脑之间的同步是否有问题,所以游戏代码中的任何BUG都可能导致游戏崩溃,所以有时候游戏可能会在双方电脑上各自运行,只不过差异会越来越大。所以为了让游戏发布,我的下一个问题就是设计一个可以检测同步问题的系统。
匆匆结束的故事
你们都知道了故事的结局:《魔兽争霸》最终还是在五个月之后发布了,这看起来像是永远那么久,因为我们每天都投入很多个小时,遇到了很多的困难,克服了太多的挑战,而且创造了一些让我们非常有热情的游戏。未来我可能会探索更多的事情,但写到这里也该结束了,这篇博客已经太长了。
责任编辑:黑色幽默
魔兽争霸
暴雪
1.75亿 | 未成年网民1.75亿 未成年互联网普及率达93.1% |
692.59亿 | 拼多多市值超京东 拼多多总市值约692.59亿美元 |
2倍 | 任天堂1至3月利润暴涨2倍 动物森友会创销售记录 |
9.56亿 | 动视暴雪发布Q1财报:微交易收入9.56亿美元 |