|
一、怪物的位置
6 Z V% ]3 A8 O* X怪物的产生位置由两种方法来确定。一种是随机产生,另一种是在某确定的地图处产生确定种类的怪物。 / u" Y) S! n5 B2 q3 h8 G
. ? G; D9 h7 R- f" N5 p* X1 ~7 \& x1. 固定产生' @8 d5 |! i5 J2 Q1 m0 \5 s- j5 g
在固定的场景产生固定种类的怪物。这类怪物是直接固定在地图中的,跟Levels.txt无关。当然,仅仅是场景固定而已,怪物产生的位置并非精确固定的。按这种方法确定位置的有:所有的城镇NPC,固定暗金怪物,所有的任务金怪,以及某些场景的普通怪物。例如,Act1的地下墓穴第四层总是会在那几个固定的位置出现黑暗魔和黑暗魔巫师,而Act5的血腥丘陵上也少不了投石机。4 ^! C/ r3 e& ]! P
& I1 i* g3 p! c0 m$ h, K2. 随机产生+ H/ k; L; W; Z. o
每个场景的怪物生成系统都会从一个预先设定好的怪物集合中随机选择怪物种类(Levels.txt),每个场景均会做三次选择。这其中,每个场景的怪物种类数量由Levels.txt中的NumMon列决定,MonX几列决定了该场景允许出现的怪物种类(X代表1~10)。有多少堆普通怪物由MonDen这一列决定,多少堆带头目的怪物由MonUMin/MonUMax列决定。有些怪物总是伴随着周围的一群喽啰一起出现,这是由MonStats.txt决定的;同时该txt的MinGrp和MaxGrp也定义了每个单独怪物群体的数量(上限和下限)。若该怪群内有首领怪物(例如沉沦巫师),则系统转由PartyMin和PartyMax列决定该怪物带多少Minions。MonStats.txt的Rarity列决定了该类怪物出现的几率。
1 @' q7 ~; l5 j% O 在三个难度,一些配置数据会改变。
) a8 W. S/ t9 e8 U 随机的头目怪物和暗金怪物数量由Levels.txt的MonUMin和MonUMax列决定。在普通难度,它们的种类由Levels.txt的UMonX列和MonStats.txt的Rarity列决定,噩梦和地狱难度由Levels.txt的NMonX列决定(X代表1~10)。
* M5 r7 H! I7 t7 S: Y因此,你可能会在某些时候遇到在 按照“三次选择”原则出现的怪物种类 之外的其他怪物种类——暗金怪或者头目怪。5 d# V% w- U2 V% d* q, c
% k1 n# R. h3 X9 z8 U$ b二、举例
& U" w1 F. u) M, ?拿Act5的血腥丘陵来说,督军总是出现在固定的位置。而他的Minion种类已经规定好了,因此无论他产生在哪个地方,他身旁都会跟着相同种类的仆从。固定金怪达克法恩总是产生在血腥丘陵出口的瓶颈处。它的仆从类别与它自己相同,所以它总是带着一群恶魔妖精。
0 i) ~+ A& M2 I* }6 w0 f投石机被独立分配一个位置。
, Z: @5 z# w7 y9 F在这个场景,两个怪物种类随机分布。在普通难度,你还可以看到仆魔和巨锤死神,其他怪物都不会出现;在噩梦和地狱难度将会出现大量的Guest Monster——客串怪物,但每次场景初始化只能有两个选择。MonStats.txt的Rarity列导致燃烧的死法师选择几率比其他客串怪物要高。9 E% H1 U' Z8 Y' B
距离玩家、玩家的雇佣兵以及玩家的召唤生物两屏以内的怪物会在游戏内显示,各种数据都会确定下来不再更改;距离怪物大约半屏距离的时候,它们会发现玩家并发动进攻(这个距离随怪物的不同而不同,取决于怪物的AI设定)。2 Q5 v8 A1 L& A4 Y8 _
9 \( ~3 k: a' J9 I2 C7 j+ A8 P9 x: S6 C) R& }4 s# v* n
三、地图的生成
5 d. B% T* G4 _地图的生成同样有两种方式。 有时候你会看到预先设置好的地图,它们永远不会变化;而更多情况下你会遇到随机产生的迷宫地图,每次重新进入游戏都会发生变化。
5 ]" T: l& B( C% z一些场景的地图是从预先设置好的几个地图样板中随机挑选的,例如Act1和Act2的城镇;一些迷宫类的地图则会包含预先设定好的大块区域,或者从一些预先设置的区域中随机挑选,例如火焰之河场景地图中的熔岩。固定不变的场景如下
6 [1 B2 |4 H% A/ X6 |# qAct1
. e# G W/ [3 e8 m8 C洞穴二层
+ X) E+ V* l4 `; `' f+ x* d遗忘的高塔第五层 (两种布局)
8 N6 m+ _0 q. J4 O$ G* m内侧回廊
. J8 w ^ ]$ F大教堂' ]! C- u- n: f8 ]
崔斯特瑞姆
/ M5 y- r& }$ `( I% q地下墓穴第四层8 Z3 `( d/ D' z
Act2
$ j8 S& V3 `' u' C# g2 X1 I+ F' o蝮蛇神殿第二层5 g- x, J. S, e5 j' ?# ~# }, m' N
女眷住处2 z. z8 e, C% h
皇宫监牢
5 W5 A9 x8 ]8 T2 q9 \! J术士的峡谷
# I; \( A6 ^$ N9 ~都瑞尔的房间8 K( Q( T+ k$ \* e: r
Act3$ Y5 G8 F4 b8 y4 P$ q
下水道第二层+ ]+ g$ p) d$ x8 [/ y+ D7 t
库拉斯特堤道
/ Z l. R" y$ j- e3 J2 \崔凡克
( ~/ t) F( r: Q/ p N; S, Z憎恶的囚牢第三层) F! R5 e6 U3 M# g
Act4
9 Q2 z, k9 ]1 f7 `$ w混沌避难所(入口处和封印处各有两种布局)
' h, ?6 p8 T& S+ J; Y4 V7 bAct5
2 R$ D; a3 W' E" e尼拉塞克的神殿
, J5 M& c4 |) q7 L0 V6 u% B% t亚瑞特山脉巅峰! F! [9 T- H, V: u. w
毁灭的王座
* x! c9 U. i" y# G0 B+ s5 `$ a% i世界之石大殿7 x& A) N/ c# L0 I
: g. Z! _( b) H5 j
$ Z2 B+ u7 D1 h. \随机地图的生成规则,要比预置地图复杂的多.下面我们来着重介绍一下随机地图的生成.4 o0 O0 @$ m+ l7 ?0 m+ }/ j% E
% c" S7 f5 R, f! `2 H) v! p- R 生成随机地图的这一过程,有两个不同的规则,根据不同的场景来选择不同的方法.一个是地面场景,另一个与之相对的就是地下场景., H( S+ n& _$ k; t# k) c% M9 }
首先是地面场景% \: {6 b9 F9 z* s, v3 Y
地面场景的生成相对于地下场景来说,要稍微简单一些,因为对于地面场景来说,提供的活动空间要更广阔一些,没有地下场景中那些房间,墙壁的遮挡(地图边缘的墙除外).所以在地图块的拼接上,显得更为自由灵活一些.
' X! Y6 L0 @1 d- B+ k3 t地面场景的ds1文件,与地下场景相比,也有着不同,它们的构成方式为"单词+数字+字母".比如edge1b.ds1,单词用来注释,edge表示这是构成地图边缘的地图块文件,数字是用来表示方向,1表示是组成地图的南部边缘,2表示组成地图的西部边缘,3表示组成地图的北部边缘,4表示组成地图的东部边缘,5表示组成地图的西南角,6表示组成地图的西北角,7表示组成地图的东北角,8表示组成地图的东南角,9表示该ds1文件西南角为障碍物,10表示该ds1文件西北角为障碍物,11表示该ds1文件东北角为障碍物,12表示该ds1文件东南为障碍物.最后的字母表示这一类地图块文件中的数量,同样是edge1.ds1文件,就有a~e5种,保证了地图的边缘不相雷同.同时系统随机调用wild.ds1等文件,填充好地图中间的部分.这样一个光秃秃的地图就基本设置好了.
5 G/ T" r: f5 o 随后系统要进一步的修饰地图,在Lvlsub.txt中挑选出可以在该场景中出现的修饰图像(比如树,石头,水坑等等)随机放置在地图中,选中几率值取决于ProbX,修饰图像中的图块数量是由TrialsX的值决定的,但MaxX决定了它的上限.如果该修饰图像被选中,系统要在1~TrialsX之间选取一个随机数A,之后再在这个随机数A与MaxX之间取较小者B.然后在该修饰图像包含的ds1文件中,随机抽取B个ds1文件组成该修饰图像放置在地图中,同时覆盖掉该处原先的ds1文件.最后系统要调取一些在该场景固定出现的ds1文件(比如该场景的出入口,或者固定金怪所在的地图块等等)同时覆盖掉该处原来的文件,来更进一步修饰地图.
1 `& X: ?9 r( I/ x Q9 \% s 这样一个地面场景就基本完成了,再然后就是设置怪物,神殿等等.0 S" g; A/ C4 W# q, E- d2 @
" h. J9 C0 z8 Y# m) w$ h接下来介绍的是地下场景- d. T6 |) ?5 L
地下场景的ds1文件命名规则是"单词+大写字母+数字"来表示的,"单词"表示需要用到该ds1文件的场景,而"大写字母"的含义为路的方向,"数字"用以区别同一类型的各个地图块文件.举个例子来说,比如"lavaW.ds1"这个文件,"lava"表示了这是ACT4火焰之河的地图块文件,"W"则表示:在这个地图块中,在西边(W)有通道,可以和别的地图块相连接,而其他三面却是墙壁(这里墙壁定义为无法通过的贴图).可以看出这个ds1文件是用在地图的边缘部分.如果是"lavaSEW.ds1"这个文件,说明只有北面是墙壁,其余三面可通行.
( p8 x% @( z# h2 v% B" _0 m2 \6 j 系统在调用ds1文件生成地下场景时,需要从LvlMaze.txt中读取Rooms值,来确定组成该场景的最小ds1文件数,不过需要注意的是,LvlMaze.txt中的Room值,决定的是随机地图块的数量,在该场景中固定出现的出入口部分,任务区域的地图块要排除在外,不算在Room值中.然后根据文件名N=S,E=W的原则,来随机抽取ds1文件,抽取的数量不小于Rooms值.使文件名N=S,E=W的原则,是为了保证路口相等,生成的地图是个完整封闭的空间.在地图块的排列过程中,出入口部分和任务区域在排列中,具有优先排列权.可以与之相连接的随机地图块,首先要与它们排列,然后再是其他随机地图块.完成拼接后,地图要完整封闭.如果还有剩余的地图块没有使用,要予以舍弃.于此可见,Room值只是用来决定抽取的地图块数,对于实际出现的地图块数量没有直接影响.
0 \" H* w* E- W' N. S; M- p1 e! _ 这样,地下也有了一个光秃秃的场景,之后的步骤和地面场景相同了,这里就不再赘述了. |
|