“一代经典的诞生、兴盛与衰败”
《荣誉勋章》这个名字想必大家都不会陌生。早些年间它与战地、使命召唤被玩家们称呼为FPS三巨头,成为了不少玩家的童年回忆。而如今这“三巨头”中使命召唤和战地依旧活跃在大众视野之中,而《荣誉勋章》却早已销声匿迹多年,不复往日荣光。
《荣誉勋章》是如何诞生的呢?一代经典IP是如何走到如今的地步? 游戏 背后又有着怎样的故事?本文将带领各位回顾这一 游戏 系列的前世今生。
说到初代《荣誉勋章》就不得不提到一位好莱坞传奇导演——史蒂文·斯皮尔伯格。
1997年,史蒂文·斯皮尔伯格正在拍摄著名战争片《拯救大兵瑞恩》,然而在电影即将完成时,这位导演得知,这部限制级的影片将无法同年轻一代的观众产生共鸣,于是他决定创立一个自己的工作室——梦工厂互动。
在工作室成立之后,斯皮尔伯格要求员工们创造一款不仅在场面上能让玩家感到兴奋的 游戏 ,还需要让年轻的玩家们了解到第二次世界大战中发生的著名事件。
然而这个想法并没有收到工作室成员们的热情支持,他们认为在二战写实题材的射击 游戏 很难在当时由《雷神之锤》为代表的一众科幻射击 游戏 主宰的市场上取得很好的成绩。
最终在导演斯皮尔伯格的坚持下,公司的开发团队用了一周的时间开发了一个试玩Demo,最终帮助完成了斯皮尔伯格导演想法,让公司为其制作 游戏 亮起了绿灯。
为了使《荣誉勋章》尽可能的符合史实,团队军事顾问代尔·戴率领制作团队进入新兵训练营,帮助他们纠正 游戏 战役中的 历史 错误,并亲自为 游戏 的开场担任旁白。
到了1999年,正当 游戏 开发进入最后阶段时,国会荣誉勋章协会主席找上门来试图说服斯皮尔伯格导演放弃这个名字。他认为将退伍军人的经历制作成 游戏 是对老兵的冒犯,然而在看到 游戏 对于这一主题的尊重后,他表示了对 游戏 的认可和理解。
随即,《荣誉勋章》在1999年11月11日老兵节期间顺利发售。 游戏 一经发售便广受好评,其呈现的优秀画面和真实还原的 历史 得到了许多赞赏。 游戏 的每一部分都充满了十分详实的叙事信息,包括 游戏 过场中出现的 历史 真实影像。
初代《荣誉勋章》的成功十分的迅速而且影响深远,一个将主导未来十年二战FPS的 游戏 系列就此诞生。
时间来到了2000年,此时的《荣誉勋章》系列已经在主机平台积累了不少人气,EA也将梦工厂互动改名为了EA洛杉矶工作室,让这支团队致力于开发新一代主机上的荣誉勋章新系列。
当年的五月,斯皮尔伯格导演看中了一家初露头角的工作室——2015工作室,并询问他们是否有兴趣开发PC独占的新一代荣誉勋章。
这支当时只开发过一款叫名为SIN的 游戏 资料片的团队,花了两年的时间开发这款新一代《荣誉勋章》,并将其寄给了EA发行,引起了巨大的轰动,造就了一部旷世巨作。
这部为荣誉勋章系列建功立业的作品就是国内玩家最为熟悉的荣誉勋章三部曲之一的《荣誉勋章:联合袭击》。
这一作给玩家带来令人难忘的诺曼底海滩登陆战役,甚至与电影院中斯皮尔伯格本人的电影《拯救大兵瑞恩》不相上下,联合袭击将荣誉勋章系列推向了一个新的高度。
如果说初代《荣誉勋章》为二战射击 游戏 开创了先河,《联合袭击》则是开创了二战射击 游戏 这一整个市场。让 游戏 成为一种叙事的载体,让玩家在家就能体验到当年盟军登陆时的被机枪死死压制的感觉。搭配上 游戏 中各类令人神经紧绷的任务流程,配合上大量的脚本事件演出,成功的使 游戏 整个单人战役有着电影般的流畅叙事和令人难忘的 游戏 体验。
《联合突袭》以及两部资料片《先头部队》和《突出重围》这三部曲为未来十年的二战射击 游戏 市场奠定了整体基调,也向世人展示了 游戏 也能够完美的还原和回顾战争。
它给予了玩家从诺曼底海滩登陆,并一路向德国进军的完美战争体验,同时也成为了二战射击 游戏 市场无数人争相复制的模板之作,也让二战射击 游戏 市场的竞争愈演愈烈。
然而在《联合突袭》获得成功后,EA决定决定收购2015工作室。这引起了 游戏 主创们的强烈不满,于是一批制作者们离开了2015工作室决定自立门户。他们随后组建了一直新团队,即后人熟知的Infinity Ward并开始制作了一款代号为“荣誉勋章杀手”的新 游戏 。
从此,大名鼎鼎的《使命召唤》系列诞生了。这款 游戏 也将在未来的日子里一直成为EA的眼中钉肉中刺,并最终在《荣誉勋章》的衰败中扮演重要的角色。
虽然将 游戏 带至顶峰的2015工作室集体出走,转投动视旗下建立了Infinity Ward,并开创了未来将荣誉勋章拉下神坛的使命召唤系列。但是在二战射击 游戏 这部分市场中,《荣誉勋章》系列仍然保持着领先地位。《血战太平洋》的战争全新视角,《血战欧洲》的开放式关卡设计,《空降神兵》的空降作战都曾让人眼前一亮。
然而,随着像战地系列和星球大战:前线(2004年9月18日由LucasArts发行)这类以联机对抗为主的 游戏 越来越受欢迎,射击 游戏 的重心已经开始逐渐从单人战役转向激烈的多人对抗。
但是荣誉勋章系列一直并未重视多人模式的发展,尽管靠着优秀的单人战役, 游戏 在销量方面依旧不错,但其 游戏 寿命却因缺乏除单人战役外的亮点遭受了不小的损失。
到了2007年,荣誉勋章与使命召唤在二战射击 游戏 这个市场里已经打的难舍难分。EA此时打算重拳出击,凭借一年之内推出的三部荣誉勋章系列,同时在PC与主机平台彻底拿下二战射击 游戏 这块市场。
然而就在EA妄想凭借这一套三连击败使命召唤的时候,使命召唤也在2007年推出了自己的大胆创新之作——现代战争系列,Infinity Ward凭借着现代战争的优秀表现正在将EA曾经最伟大的 游戏 系列赶下王位。
显然《荣誉勋章》这个系列的衰落正在日渐明显,整个系列已经迷失了方向需要暂时停下来重新找到自己的方向。
为了将整个系列推倒重来,EA洛杉矶工作室被改组为了Danger Close Games,用以重塑荣誉勋章这一系列并开发新一代产品。
在闭关修炼三年后,《荣誉勋章2010》将整个系列带离二战这一满目疮痍的战场,来到了充满争议的现代中东战场。显然EA打算继续让这一系列在现代战场上浴火重生,正如同三年前使命召唤凭借现代战场击败荣誉勋章一样。
游戏 内多人模式允许玩家扮演塔利班成员与美军进行对抗,这一设定导致许多的政治家以及军队官员的抗议,EA最终迫于压力将 游戏 中塔利班的阵营名称改变为“反叛势力”。但是这一举措并没有改变军队对其下达禁令,使得 游戏 被禁止在全球所有的军事基地内发售。
尽管受到大量争议, 游戏 依旧凭借着可圈可点的单人战役以及DICE所制作的多人战役成功的走出了一条属于自己的道路,并吸引了一批忠实的玩家。其500万份销量也保证了EA将会继续沿着这个方向为系列制作续作。
然而2012年发布的续作《荣誉勋章:战士》在令人失望的销量以及 游戏 媒体平庸的评价与批评中,为这一经典的射击 游戏 系列盖上了棺材盖。惨淡的销量也使得EA不得不冻结这个系列,并将Danger Close Games工作室也被解散重组为DICE洛杉矶,整个系列作品所带来的进步与成就也在这一惨烈的失败下轰然倒塌。
对于荣誉勋章这曾经向世界证明电子 游戏 可以用书本或电影都无法做到的方式讲述人性中的艰难时刻的来说,任何一个FPS 游戏 粉丝都无法忽视它曾经的辉煌,我们会铭记联合突袭的奥马哈海滩抢滩登陆辉煌也会叹息它最终令人惋惜的结局。
老兵不死,只是逐渐凋零。
---- End ----
关注公众号 情报姬(paperji),得到ACGN更多有思想有意思的内容
1、基本的通配符有哪些?
·“?”可替代单个字符。
·“*”可替代任意字符。
·方括号“[charset]”可替代charset集中的任何单个字符。
对最后一条做些解释。[cChH]通配符便可替代c或h字符的大小写形式。
通配符集还能描述介于字符对之间的所有字符。如“[a-z]”就可以代
替任意小写字母,而[a-zA-Z]则可替代任意字母。注意可替代的字符
包括字符包括字符对之间的所有字符。
与DOS相比,UNIX的通配符机制要比DOS好得多。在DOS中,任何在“*”
之后,在“.”之彰的字符均被忽略,所以下面的指令将不能得到你想
象的结果。
del *bak.*
在DOS中,用户只能用此命令删除当前目前下的所有文件,除非系统要
求你不这样做。而在UNIX系统中,“*”可替代包括0在内的任意数字的
字符,但一行中的其余特征也仍需匹配,因此“bak.*”可匹配
newbak.save、oldbak.new甚至bak.temp,但不能和newbak匹配,因为后
者不含“.”。这非常巧妙,可大大方便用户,而“*bak”则可匹配以上
所有的词条,包括newbak。
2、能在一条指令中用多个通配符吗?
可以,如
rm a*out*tmp?
该命令可以删除一系列临时性的输出文件,如ab.out.temp1、ab.out.temp1
等。
3、如何利用通配符使指令更灵活?
UNIX可将有一定关的文件看作一集合的一部分,用户可以用该集合去匹配。
所以,如果你需要删除file1.temp、file2.temp……file9.temp,只须健入:
rm file[0-9].temp
该技巧的用处在于可以用删除那些相要删除的文件。如果你每天都要为一个
非常重要的数据库做一个“dump”报告,你把文件存入dump.'date%h%d',
它包括一系列文件如下:
dump.jun23
dump jun24
dump jun25
dump.jun26
再让我们假设因为每个文件的容量都在100M左右,所以磁盘空间很快会被占满,
因此需要每隔几天删去一些老的文件,只留下最近的两个文件,为此,键入:
rm –i du*[34]
这条指令将删去那些以“du”开头并以“3”或“4”结尾的文件。
通配符的使用
在使用文件时,主文件名和扩展名中还可以使用通配符“*”“?”。其中“*”代表从它所在位置直到“.”(主文件名中为到“.”前,扩展名为“.”后)的所有字符;“?”代表它所在位置的任意字符。
实例:
A.?? 表示文件主名为A,扩展名不超过两个字符的文件
???.com 表示文件名不超过三个字符,扩展名为COM的文件
*.* 表示所有文件
ABC.* 表示文件名为ABC,具有任意扩展名的文件
*.EXE 表示以EXE为扩展名的所有文件
A*.* 表示以字符A开头的所有文件 例如: ABC.txt ABD.com等
A??.* 表示文件主名以A开头且不超过三个字符,具有任意扩展名
的文件
tabs)
%x
匹配任何数量的非空格
[range]
匹配任何数量的在[range]中列出的字符
^
强制从一行的开始进行匹配
$
强制匹配到一行的结束
(pattern)
保存匹配的式样到参数%1~%9
~
包括其中的字符不会被解释为特殊字符
{val1|val2|val3|...}
匹配其中列出的任何特殊的串
{^string}
不匹配其中包括的串
使用[range]时,你可以在其中列出需要的字符例如 [abc] 或使用范围 [a-c] 。
为了匹配特殊字符本身,可以使用~将特殊字符括住,例如:~[test~] 将匹配字符串
[test] 而不是作为 [range] 来匹配。
只使用$可以匹配一个空行。
别名中使用参数的例子
我们在解谜过程中向npc提出的问题通常是以:
ask npc about here
ask npc about rumors
ask npc about name
这样三个命令开始的,把他们定义成别名可以节省一些时间,像这样:
#al askn {ask %1 about here;ask %1 about here;ask %1 about name}
可如果npc的名字有两个单词,或一堆同名的npc中你要问其中第二个,就需要把别名
中的参数改为%-1,此时执行askn bing 2或askn tian bing就不会出错了。
为了更好的理解参数的作用,试试执行下面的命令:
#al tt test1 %1 test2 %2 test3 %-1 test4 %-2
看看执行{tt a1 a2 a3 a4 a5}的结果,一切都清楚了吧?
表达式
当执行运算时,如果所有参数均为数字,则执行数学运算,否则执行字符串操作。以
下是一些常用的表达式(v1和v2代表变量或另外的表达式):
v1 v2
如果v1或v2不是数字,则执行字符串相加
v1-v2
从v1中减去v2
v1*v2
相乘
v1/v2
v1除v2,结果不含小数
v1\v2
取模
v1&v2
逻辑运算and
v1 and v2
同上
v1 | v2
逻辑运算or
v1 or v2
同上
v1 xor v2
逻辑运算xor
v1 = v2
如果v1等于v2返回真
v1 > v2
如果v1大于v2返回真
v1 < v2
如果v1小于v2返回真
v1 >= v2
如果v1大于等于v2返回真
v1 <= v2
如果v1小于等于v2返回真
v1 <> v2
如果v1不等于v2返回真
v1 != v2
同上
v1 =~ v2
如果表达式v1中的pattern包含v2,返回真
v1 ~= v2
同上
-v1
返回v1的负值
!v1
逻辑运算非
命令:
number]
Syntax:牋?#number command
这个命令向MUD重复发送number次命令,number必须是一个常数,如果要使用变量,请
使用loop命令。当前已经重复的计数保存在系统变量%repeatnum中。
实例:
#4 fight bing %i
命令将被解释成{fight bing 1;fight bing 2;...;fight bing 4}发往MUD10
abort
Syntax:牋?#AB
停止分析处理当前的命令行中#ab以后的部分
实例:
get all corpse;#ABORT;split
在这个例子中,split将被忽略
action
Syntax:牋?#AC pattern command [classname]
Related:牋?#TRIGGER #T #T- #IGNORE
这是zMUD中最有用的特性之一。当从MUD中收到一条匹配的文本时,预先定义的命令将
被执行。这条命令的第一个参数是被匹配的文本,如果文本中包含空格,你需要将它
用括号{}括起来。pattern中能够包含特殊的pattern matching symbols 和通配符。
第二个参数是将要被执行的命令,超过一个单词的命令也需要使用括号{}。第三个参
数用于给不同的触发动作命名分类,便于管理。高级的触发设置必须使用参数
(Preferences)对话框,在对话框中,你可以决定触发的动作是紧跟在匹配的文本之
后还是在新的一行中执行。
一个简单的例子:
#AC {你买下一件藤甲} {wear jia}
这样,无论何时只要你买了藤甲,立刻可以自动穿上。
自动登录的例子:
#AC {^您的英文名字:} {river}
#AC {^请输入相应密码:} {12345}
然后在参数对话框中关闭 Trigger on Newline 设置并且打开 Trigger on Prompt 这
样名字和密码将紧接着提示行输入而不会等待换行。注意,字符 ^ 将强制从一行的头
部开始匹配。
触发中的参数
#AC {^You get (%d) coins} {chat I get oin } rich
当你看到一行“You get [number] coins”时,其中的数值将被存放在变量%1中,其
后执行的命令可以使用这个数值。在这个例子中用到了类(class)名rich,这样你就
能够使用t 和t-命令来打开或关闭这个触发。
add
Syntax:牋?#AD variable amount
这个例子允许你做一个简单的算术计算。amount可以是数值或变量。如果要做减法,
可以使用负值。复杂一些的算术计算,请使用 #math 命令。
实例:
#AD moves 1
给变量@moves加一
#ACTION {You get (%d) coins} {#AD gold %1}
当捡到钱时,把捡钱的数量加到 @gold 变量中
alarm
Syntax:牋?#ALA timepattern command
Related:牋?#TRIGGER
建立一个基于时间的触发,而不是根据从MUD中获得的信息触发。timepattern可以是
特定的时间或包括通配符。如果在minus前加上(-),则表示连线时间而不是实际时
间。
timepattern 的格式表示成 hours:minutes:seconds ,其中的小时和分钟是可选项,
如果不指明,则假定小时和分钟被通配符*取代。通配符*可以代替任何数值,而*10可
以匹配10、20、30等等。你也可以指定几个数值用(|)来分隔。Finally, you can
put parenthesis around the wildcards to save the values matched to the
%1..%9 parameters。(这句话我不懂,谁来帮我?)
实例:
#ALARM -30:00 {save}
这里的 hour 没有指定,所以默认为*。 因此,这个例子将在连线后每隔30分钟执行
save 命令。
#ALARM 3:00:00 {gossip Why arent you sleeping?}
命令将在凌晨3点触发。
#ALARM -59:(55|56|57|58|59) {#SHOW 60-%1}
这个命令在你连线时每个小时的最后5秒在屏幕上显示 5 4 3 2 1。
alias
Syntax:牋?#AL [aliasname] [string]
Related:牋?#VARIABLE
保存一个或一组命令到一个较短的别名中。当执行别名时,命令中的变量能够被扩
展。如果需要延迟变量扩展,可以使用两个变量标志(%%)。
如果不带参数执行命令alias,所有的别名将被列出在输出窗口。如果在命令alias中
指定别名,被指定的别名将被显示。
别名能够用<tab>键扩展。在命令行中键入一个别名并按下<tab>键,命令行中的别名
将被替换成别名中包含的命令。
如果在定义别名时使用参数(%1,%2,...),在命令行中紧随别名的文本将取代这些
参数。特殊的参数%-1到%-99表示-n之后的所有文本。(使用参数的例子)
实例
#AL fs {fill waterskin}
当执行fs时,fill waterskin将被送往MUD。
#AL fs {fill @container}
在别名中使用变量,变量可以在购买容器时用触发赋值。
#AL make {#ALIAS %1 {cast %1 %%1]
在这个例子中,执行make heal将发出#ALIAS heal {cast heal %1}命令,这样就建立
了一个新的别名heal。
all
Syntax:牋?#ALL command
发送一个命令到所有角色的窗口
实例:
#ALL quit
发送 quit 命令到所有激活的角色窗口。
backup
Syntax:牋?#BA
Related:牋?#PATH #RETRACE
从当前正在记录的路径中删除最后一步
实例:
如果当前路径是 .nsew 那麽执行 #BA 将使其成为 .nse 。如果当前路径是 .n4s 则
执行 #BA 后将成为 .n3s 。?
beep
Syntax:牋?#BEEP [value]
Related:牋?#PLAY
在pc机喇叭中发声,value 对应相应的 windows 事件。
实例:
#BEEP 16
播放windows 事件 16 的声音。
#BEEP;#WAIT 500;#BEEP
beep两次,中间间隔0.5秒。
button
Syntax:牋?#BU number
触发一个自定义按钮,编号(从1至16)决定触发的按钮。number 可以是一个变量。
实例:
#BU 1
触发第一个按钮,效果相当于在屏幕上按下这个按钮
c
Syntax:牋?#C [name]
Related:牋?#C-
开始获取文本到窗口name中,如果省略name,文本将送入command editor,(如果
editor中的capturing设置可用)。如果在preferences对话框中选中Capture
Commands设置,键入的命令也将被送往这个窗口。
例子:
#c temp
开始拷贝所有从MUD中获得的文本到名为temp的窗口中
c-
Syntax:牋?#C-
Related:牋?#C
停止获取文本到另一个窗口
capture
Syntax:牋?#CAP [number] [name]
Related:牋?Editor window
获取最后number行送到另一个窗口。如果省略number,则只获取最后一行。如果
number是-1,所有的行将被拷贝。如果name省略,发送的目标将是command editor
window。
例子
#tr {咖啡告诉你:救命!} {#cap tell}
将tell的内容存入名为tell的窗口,避免忽略。
case
Syntax:牋?#CA index command1 [commandn]
允许从命令列表中选择一个命令执行。index参数决定执行哪一个命令。如果index大
于列表中的命令数,将从第一个开始重新选择。例如,列表中有4个命令,而index=
6,则第二个命令将被执行。你也可以用变量%random随机的选择需执行的命令。
实例:
#CASE 2 {first command} {second command} {third command}
执行第二个命令
#CASE @joincmd {join} {rescue}
如果变量@join是奇数,执行join,偶数执行rescue。
#CASE %random {Hello} {Hi there} {Hiya} {Hi}
随机选择问候语。
character
Syntax:牋?#CH
Related:牋?#HOST #PW
从Charater atabase中返回当前角色的名字
colse
Syntax:牋?#CL filenum
Related:牋?#FILE
根据给定的文件号关闭文件,文件必须是已经用#file命令打开的。
实例:
#CLOSE 1
关闭一号文件
clr
清除屏幕。如果要清空scrollback buffer并收回内存,请使用菜单命令Empty。
color
Syntax:牋?#CO attribute [pattern]
Related:牋?#HIGHLIGHT
如果省略pattern参数,这个命令将改变最后一行的颜色。颜色属性见下表。如果包括
pattern参数,将建立一个颜色触发,引起触发的条件除了字符对应外还需要有相同的
颜色。
Color values:
black牋?
0
blue牋
1
green
2
cyan
3
red
4
magenta
5
brown
6
gray
7
tellow
14
white
15
bold
128
要显示亮色,在基本值上加8,作为背景颜色,需要用基本值乘16。例如:使用红色背
景的值是4*16或64。在前景上使用粗体字,需要再加128。这样,在蓝色背景上的粗体
白字的值是:128 1*16 15=159。
实例:
#CO red
将最后一行的颜色变成红色
#CO bold,red
将最后一行变成红色粗体
connect
Syntax:牋?#CON
Related:牋?#DISCONNECT
断开并重新连接到当前的MUD,与菜单命令File/Reconnect 相同
cr
Syntax:牋?#CR
送一个空行到MUD
cw
Syntax:牋?#CW color
Related:牋?#COLOR
在一次成功的触发之后,改变引起触发的内容的颜色
实例:
#TRIGGER {告诉你} {#CW red}
当有人tell 你时,显示较为醒目的颜色
dde
Syntax:牋?#DDE server topic macro
这个命令允许你通过动态数据交换使用外部程序。zMUD也有一些内建的函数用于DDE: