标题:新增区域实战教程
作者:Sloovy
日期:2004年1月8日
参考:Phrozen
Keep - Phrozen Forums - [Any] New outdoor levels is possible,similar to
Moo Moo Farm
版本:暗黑破坏神2 - 毁灭之王 v1.10 正式版
导读:
1. 你必须正确安装了Afj666的地图扩展插件;
2. 你需要有一些关于 DS1地图文件 和 修改 Levels.txt
和 LvlPrest.txt 的知识;
3. 你需要会使用Paul的Win_DS1Edit。虽然我会谈到些用法,但是至少你得会让它跑起来;)
4. 文中颜色标注意义如下:
橙色:txt数据文件;
红色:列名;
绿色:需要填入的值;
蓝色:提及的人名(多是作者名);
粗体:需要注意的地方;
这里放几个预览图。
新增地图的左上角
新增地图的右下角
第一个测试版本用Cain
Stone当出入口
帐篷门是出入口
我终于下定决心逼自己收起些懒惰,重新干点实际的Mod活。很幸运,昨晚用了不到2个小时,就搞定了自己新增的第一个区域,虽然算不上是顺利。
下来我会一步一步的尽量详细的讲解方法。另外,这篇文章里都是按照我完成的情况来讲的,大家可以按自己喜好慢慢尝试不同的方法和地图;)
一。制作DS1地图文件:
因为我打算把新增的地图放在世界地图里Tristram、奶牛农场的下面,并且预期将来会把它和Tristram连接起来试试,所以我是用奶牛农场里奶牛王站的那一块地图来修改的(那一片是固定且唯一的)。
1. 在 D2data.mpq\Data\Global\Tiles\ACT1\OUTDOORS 里面找到bivouac.ds1,把它解压或者复制到你的Win_DS1Edit目录里面,并重命名为testmap1.ds1。新建一个内容如下的TestMap1.bat:
@echo off
win_ds1edit TestMap1.ds1 2 50 > debug_TestMap1.txt
2. 运行TestMap1.bat开始编辑这张新地图。进入编辑器后,如果觉得太慢可以按"F3"以停止动画效果,用加号减号放大缩小。如果没有顺利进入图形编辑器界面,查看debug_TestMap1.txt找找问题在哪里。
(1). 首先,我们要去掉奶牛王,毕竟一进去就被奶牛包围在中间的热情接待有点让人受不了。按一次"Tab"键进入Object编辑模式,点击奶牛王脚下的小方块(不是它头上的标签),确认它脚下的小方块、标签的外框和连线都变成粗体才算选中。按"Ctrl+X"删除它;
(2). 为了纪念牺牲的奶牛王,我决定把它的“遗址”做成出入口。确认你还在Object编辑模式下,在原来奶牛王的地方按"Ins"键以插入新的Object——这时出现的应该是Gheed。右键点击他头上的标签,会弹出一个列表框。首先点击右上方的“Type2”切换到类型2物件,然后选择一个物件(我是用的Id=4,flag
2),点OK,应该是变成旗子了;

(3). 下来要把旗子做成出入口的标志。现在按两次"Tab"键切换回地图编辑模式,右键点击旗子脚下的那一格地图。这时会进入一个Wall/Floor编辑界面。在右边的界面里,第一行选择"Wall1"(默认就是),下面行的页选择"Special",然后向下翻页到vis6,选择它,点击OK退出;

(4). 最后,我们得把这个出入口的vis6设为隐藏的。否则在游戏里你会看到是一格绿色……。先选择vis6的那一格地图,然后按住"Ctrl+Shift"右键点击它,进入代码编辑模式。只需要把"W1"行第一列(下面标记的有Hidden的)改为1就可以OK退出了;

(5). 保存退出,编辑新地图DS1的工作结束。

3. 我们还得修改 浪人营地 的地图,方便跑到新的地图去。
(1). 从 D2Exp.mpq 或者 D2Data.mpq 里面解压出Data\Global\Tiles\ACT1\Town\TownE1.ds1,把它放到你的Win_DS1Edit目录里面。新建一个内容如下的TownE1.bat:
@echo off
win_ds1edit TownE1.ds1 1 1 > debug_TownE1.txt
(2). 运行TownE1.bat开始编辑 浪人营地 的地图。找到左下角显示坐标为(29,22)的一格,应该正好是在
浪人营地 左下方帐篷的门那一格;
(3). 在这一格上面左键选定后点击右键,进入Wall/Floor编辑界面。我们这里要先选择第一行的"Wall2",然后选择下面右边的"Special",找到vis6并选择后OK退出;

※<1>. 这里为什么要用"Wall2",而不是和修改新地图时候一样使用"Wall1"呢?
因为这里"Wall1"这个单元格已经被帐篷的门这张图片(我觉得更像一片一片的贴纸)占据了。可以试试选择"Wall1"、"Special"里面的"vis6",会看到帐篷门变成了草地……显然我们不想要这种不自然的帐篷,更不想用它来当出入口
>_<

※<2>. 为什么指定使用vis6呢?必须和对应的出入口选择一样的vis吗?
不是的,纯粹只是我的习惯而且。毕竟相同的vis让人很容易认为它们是连接在一起的,方便一些;)
(4). 同样,我们的目标是自然的"门",而不是一格绿色方块。选择vis6所在的格子,按住"Ctrl+Shift"右键点击它,进入代码编辑模式。把"W2"行第一列改为1就可以OK退出了。这样就完成了隐藏vis的工作;

(5). 保存退出。浪人营地的地图编辑这样就可以结束了。

4. 方便起见,我们把新增的地图也放到和 浪人营地 一起的目录里吧。在你的暗黑目录里新建或者找到 Data\Global\Tiles\Act1\Town,把刚才修改好的TestMap1.ds1和TownE1.ds1都放到这里就OK了。
二。修改LvlWarp.txt:
为了方便在帐篷上开门,得给LvlWarp.txt最后加这么一行:
Act1 Small Tent R 83 -20 -111 46 112 0 5 2 1
0 2 b 0
这个是新定义一个出入口的设置,我的理解是:当你把游标放到vis所在格子的什么范围之内,会显示出“通向 XXXX”字样的定义。不一定对喔(免责声明)。
具体的在Ds1
Editor - Tutorial 1 - A new Tent Warp有详细说明。
三。修改LvlPrest.txt:
1. 我们要指定让 浪人营地 使用TownE1.ds1这张地图。毕竟同时修改4张地图不但麻烦,而且很容易出错。用任何表格编辑工具(推荐AFJ
Sheet 0.52beta)打开LvlPrest.txt:
向右滚动,很快就可以看到File1(Q),File2(R),File3(S),File4(T),File5(U),File6(V)这几个列。选定第三行,Name列是"Act1
- Town 1",可以看到File1到File4分别对应了TownN1,TownE1,TownS1,TownW1四张地图。而这四张地图就是
浪人营地 的出口对应四个方向的固定地图。把它们都写成 Act1/Town/TownE1.ds1,这样无论
浪人营地 本来应该是往哪个方向出口,现在都会显示向东……代价就是有75%的概率我们都没法从正常的出口出 浪人营地 了 -_- 所以一定要用专门的测试人物进行测试!
2. 现在可以开始正式新增我们的地图了:
(1). 既然是用的奶牛农场地图测试,用它的数据修改自然是最方便的。找到第52行,Name是Act
1 - Bivouac的。选定整行复制一下,然后在最下面新增一行,粘贴上去;
(2). 按以下修改这行的数据:
Name : Act1 - Test
New Map 1 -- 方便识别的名字就行
Def : 1090 -- 下一个未使用的Def编号。原始文件里1089是最后一个
LevelId : 133 -- 同样是下一个未使用的LevelId编号。原始文件里面最后一个是132
Outdoors : 1 -- 定义是户外区域
SizeX : 0 -- 当我填入了正确的地图大小时候,却总是出现nSizeX类似的错误。然后仔细看了其它行,发现大多数预设定区域是(0,0),于是试了试,居然成功了
SizeY : 0 -- 同SizeY
Scan : 1 -- 当Scan=0的时候,似乎系统不会扫描这张地图和对应地图的vis。所以要让vis起作用,这里一定要设成1
Files : 1 -- 指定使用文件的个数。似乎对预设区域就是指定几张可能情况的地图,对于随机迷宫区域就是组合时候可用的地图数目
File1 : Act1/Town/TestMap1.ds1
-- 指定地图文件
其它的都不用动了。保存LvlPrest.txt吧。
四。修改Levels.txt:
1. 打开Levels.txt,修改一下 浪人营地 的第三行:
Name : Act1 - Town
Id : 1
Vis6 : 133 -- 指示Vis6连接到Id
= 133的地图
Warp6 : 83 -- 设置Vis6的Warp类型。使用新定义的帐篷门类型
2. 找到第41行复制一下,Name是Act1 - Moo
Moo Farm的行。在最下面新增一行,粘贴上去;
3. 按照以下修改新增行:
以下粗体是修改了的。为了方便解释我基本上把全部的列都列了出来,但并不需要全部修改 :)
Name : Act1 - Test
New Map 1 -- 随便给一个容易识别的新名字就行
Id : 133 -- 下一个未使用的Id编号
Pal : 0 -- 使用Act1的色盘(Palette)
(0~4对应1~5幕)
Act : 0 -- 第一幕(0~4对应1~5幕)
QuestFlag : 清空
-- 不需要先完成某个任务才能进入
QuestFlagEx : 清空
-- 不需要先完成某个任务才能进入
Layer : 26 -- 层设置。不用改变
SizeX : 16 -- 普通难度下新地图的X轴尺寸。在Win_DS1Edit里面看最右边(东边)一格的坐标就知道了
SizeY : 16 -- 普通难度下新地图的Y轴尺寸。在Win_DS1Edit里面看最右边(东边)一格的坐标就知道了
SizeX(N) : 16 --
恶梦难度下新地图的X轴尺寸。
SizeY(N) : 16 --
恶梦难度下新地图的Y轴尺寸。
SizeX(H) : 16 --
地狱难度下新地图的X轴尺寸。
SizeY(H) : 16 --
地狱难度下新地图的Y轴尺寸。
OffsetX : 5000
-- 请参看第六部分“世界地图设置”部分详细说明
OffsetY : 1328
-- 请参看第六部分“世界地图设置”部分详细说明
Depend : 0 -- 不清楚具体作用,不需要改动
Teleport : 1 -- 允许瞬间移动
Rain : 1 -- 有下雨的天气变化
Mud : 0 -- Beta版使用的参数。正式版里没用
NoPer : 0 -- 是否强制使用3D显示
LOSDraw : 0 -- 是否按照视线绘制(Line
of Sight Draw)
FloorFilter : 1 -- 是否过滤房屋、树等外景(1=是,0=否),说明:主要是针对DT1文件
BlankScreen : 1 -- 外景参数
DrawEdges : 1 -- 是否显示墙等物品的边缘
IsInside : 0 -- 是否此地图位于不可见的位置(如地下),这里因为是户外区域
DrlgType : 2 --
重要!设置地图为固定尺寸的预设区域
LevelType : 2 -- 地图的类型(同lvltypes.txt文件关联)。奶牛农场是使用了Id
= 2的Wilderness类型
SubType : -1 -- 预设区域不需要。应该是指定随机生成区域的地图类型
SubTheme : -1 -- 预设区域不需要。应该是指定随机生成区域的地图主题
SubWaypoint : -1 -- 预设区域不需要。应该是指定随机生成区域里的路标
SubShrine : -1 -- 预设区域不需要。应该是指定随机生成区域的神坛
Vis0 : 0 -- Vis0连接的地图Id,没有就是0
Vis1 : 0 -- Vis1连接的地图Id,没有就是0
Vis2 : 0 -- Vis2连接的地图Id,没有就是0
Vis3 : 0 -- Vis3连接的地图Id,没有就是0
Vis4 : 0 -- Vis4连接的地图Id,没有就是0
Vis5 : 0 -- Vis5连接的地图Id,没有就是0
Vis6 : 1 -- Vis6连接的地图Id,这里是连接到Id
= 1的 浪人营地
Vis7 : 0 -- Vis7连接的地图Id,没有就是0
Warp0 : -1 -- Vis0的Warp类型,没有就是-1
Warp1 : -1 -- Vis1的Warp类型,没有就是-1
Warp2 : -1 -- Vis2的Warp类型,没有就是-1
Warp3 : -1 -- Vis3的Warp类型,没有就是-1
Warp4 : -1 -- Vis4的Warp类型,没有就是-1
Warp5 : -1 -- Vis5的Warp类型,没有就是-1
Warp6 : 83 -- Vis6的Warp类型,这里还是用帐篷门的类型(偷懒)
Warp7 : -1 -- Vis7的Warp类型,没有就是-1
Intensity : 0
Red : 0
Green : 0
Blue : 0
Portal : 0
Position : 1 -- 似乎是部分预设地图有固定的位置时候为1
SaveMonsters : 0
Quest : 0
WarpDist : 2025
MonLvl1 : 28
MonLvl2 : 53
MonLvl3 : 78
MonLvl1Ex : 28
MonLvl2Ex : 64
MonLvl3Ex : 81
MonDen : 800
MonDen(N) : 800
MonDen(H) : 800
MonUMin : 0
MonUMax : 1
MonUMin(N) : 3
MonUMax(N) : 4
MonUMin(H) : 6
MonUMax(H) : 8
MonWndr : 1
MonSpcWalk : 0
NumMon : 空
mon1 : 空
mon2 : 空
mon3 : 空
mon4 : 空
mon5 : 空
mon6 : 空
mon7 : 空
mon8 : 空
mon9 : 空
mon10 : 空
rangedspawn : 空
nmon1 : 空
nmon2 : 空
nmon3 : 空
nmon4 : 空
nmon5 : 空
nmon6 : 空
nmon7 : 空
nmon8 : 空
nmon9 : 空
nmon10 : 空
umon1 : 空
umon2 : 空
umon3 : 空
umon4 : 空空
umon5 : 空
umon6 : 空
umon7 : 空
umon8 : 空
umon9 : 空
umon10 : 空
cmon1 : 空
cmon2 : 空
cmon3 : 空
cmon4 : 空
cpct1 : 空
cpct2 : 空
cpct3 : 空
cpct4 : 空
camt1 : 空
camt2 : 空
camt3 : 空
camt4 : 空
Themes : 0
SoundEnv : 18 -- 这张地图使用的背景音乐。我用了喜欢的Harem
Waypoint : 255 -- 255表示没有路标
LevelName : Test New Map 1
-- 这张地图(区域)的名字,对应PatchString.tbl中的键名
LevelWarp : To Test New Map
1 -- 通向这张地图的出入口名字,对应PatchString.tbl中的键名
EntryFile : A1L41
-- 进入地图时候显示的“通向 XXXX”的图片
其它的也不用动了。保存Levels.txt并退出。
4. 现在,我们还差一个A1L41的图片。没有它进入新地图的时候可是会出错的。不过解决方法很简单,用个代替的就行了……
在 D2Data.mpq\Data\Local\UI\Eng\ACT1 里面解压出来A1L40.dc6,把它改名成A1L41.dc6,放到
暗黑目录下面\Data\Local\UI\ENG\Expansion就可以了。
※<1>. 如果你想用的是中文版或者其它语言版本的图片,就在Data\Local\UI\XXX\ACT1目录下面找到对应的文件,放到Data\Local\UI\XXX\Expansion下面;
※<2>. 为什么放A1L41的目录不是...\Act1,而是...\Expansion呢?我想可能是因为新增的地图在Expansion行下面吧……我也尝试把新增行放到奶牛农场所在行的下面,但是出现了...nSize...错误
~_~
※<3>. 除了用图像编辑工具做DC6外,有一个专门的做这些出入口图像的工具,Joel的txtDC6,但是我运行时候却出错,无论是WinMe还是WinXP……
五。修改PatchString.tbl:
很简单的。
1. 用TBL编辑工具打开PatchString.tbl,新增一个键,键名(左边窗口的)叫Test New
Map 1,键值(右边窗口)也同样写Test New Map 1。这是当你按"Tab"键显示的地图名称;
2. 再新增一个键。键名叫To Test New Map 1,键值同样写To
Test New Map 1。这是当游标指向通往这个地图的入口(帐篷门)时候显示的文字。
※ 左边的键名是和Levels.txt里面LevelName/LevelWarp列相同的值,一定要用英文(虽然我没试过用中文……);右边的键值是游戏中显示的文字,可以根据不同的语言版本PatchString.tbl自己写。
六。世界地图设置:
为了方便调整,我计划暂时把新增的地图放到奶牛农场的下面,虽然最终目标是希望它和Tristram连接起来。这样就需要OffsetX应该是和Tristram、奶牛农场在一个组里——5000;
关于OffsetY,虽然应该是能让地图之间不重叠就可以,但是我发现原始的Levels.txt里面,同一组地图里,下面一张地图的OffsetY是上面一张地图的OffsetY加上100再加上地图SizeY。
例如:Tower Cellar Lv1的Offset是(2500,1000),Size是(200,200),而Tower Cellar Lv2的Offset(2500,1300)就是:
OffsetX(Tower Lv2) = OffsetX(Tower Lv1) = 2500
OffsetY(Tower Lv2) = OffsetY(Tower Lv1) + SizeY(Tower
Lv1) + 100 = 1000 + 200 + 100 = 1300
所以新增的地图的Offset就设置为:
OffsetX(New Map) = OffsetX(Moo Moo Farm) = 5000
OffsetY(New Map) = OffsetY(Moo Moo Farm) + SizeY(Moo
Moo Farm) + 100 = 1148 + 80 + 100 = 1328
七。常见错误:
新增地图时候一步几个错误是正常的事情……虽然很让人灰心。除了在窗口模式下面运行看错误时候的提示窗口内容外,还可以查看暗黑目录下面D2YYMMDD.txt(YYMMDD表示两位年两位月两位日),在里面搜索"Error"、"Warning"和从下向上搜索很容易找到问题所在。这里我会尽量列出来我碰到过的错误,方便大家少走弯路。
1. 没有正常安装区域扩展插件:
Assertion Failure
Location : D2Common\DUNGEON\Dungeon.cpp, line #796
Expression : ptAct
2. 陆续补充中……
特别感谢:
感谢 游戏小站 上的各位朋友和斑竹们,尤其是 ylycloak
和 剑月明 :)
感谢 Impk …… 我是直接拿了人家的页面来用,还没通知过 血脸杀手 那边……
感谢我的BF Dark_elf,时常要忍受我抓狂时的无理取闹,南无~~ |