找回密码
 点一下
查看: 17538|回复: 25

[翻译版]inside w3m(完结)-=附赠电子书=-

[复制链接]
发表于 2008-5-17 17:13:38 | 显示全部楼层 |阅读模式
写在之前:
前面翻译了一篇关于MPQ的文章,也许是能看懂的人太少,也许是文章已经被翻译过了, 关注的人很少,心里有种淡淡的失落感。好在一位同学的提醒下,决定去翻译这篇文章。上次的翻译太急功近利,仅仅熬夜两晚就完成了,语句上没有太多的推敲,造成阅读上有许多障碍,这次的文章比较长,所以打算慢慢打磨推敲一下,也许翻译速度上会慢点,有兴趣的同学们就稍微等待一会吧。
如有转贴,请注明本网站:http://www.islga.org



1.0 介绍
本文档包括了所有的WAR3地图文件(*.W3M和*.W3X)的详细说明。不过并没有暴雪的任何官方帮助说明,也不涉及WAR3引擎的"逆向工程"。
这里所介绍的文件版本是WAR3的最初版本,请注意您真在查看和修改的文件版本。
最后,使用这个文件需要承担一定风险,如果您改动了文件遭成任何后果,我不负任何责任。


1.1 必要预装
您需要安装好WAR3,在"C:\Program Files\Warcraft III\"。我们将在这里谈论的是WAR3文件的最初版本,所以可以基于一切您使用的版本文件格式。您必须意识到在不同版本文件中是有所差异的,不过只要是安装了完整的魔兽争霸3,那么您应该会看到这些文件的(当然还有一些其他的文件,而且我会用为例子):
在"C:\Program Files\Warcraft III\":
—WAR3.MPQ
和在"C:\Program Files\Warcraft III\Maps\":
—(4)Lost Temple.w3m
当然还有其他的W3M文件。

"W3M"地图文件可以用任何支持WAR3的MPQ编辑器,那么我建议您使用(WinMPQ (ShadowFlare));
您也可以使用MPQview, 不过会麻烦些。
最后,您还需要一个十六进制编辑器,我推荐的是hexworkshop.

1.2 WAR3文件

1.2.1)关于MPQ文件
MPQ文件就像是"RAR"或"ZIP"文件,包含了被压缩文件的目录结构。
在这里并不详细说明,具体的说明请看:http://www.islga.org/bbs/read.php?tid=13735

1.2.2)WAR3文件结构
当查找一个文件时,WAR3会最先在“真正的”目录中查找(就像网页浏览器的一样)。
假如您设置一个特殊的注册表键:
路径:HKEY_CURRENT_USER\Software\Blizzard Entertainment\Warcraft III\
键名称:"Allow Local Files"
键类型: dword
键值: 1
如果注册表键并没有设置,或者文件没有在目录中找到,那么会继续在您的地图文件中(W3M)中查找,然后是在最新的MPQ补丁(WAR3PATCH.MPQ)中查找,最后才是主要MPQ(WAR3.MPQ).
这就以为着您不需要对官方MPQs变址(不要更改您的WAR3.MPQ地址),您只需要使用 与"C:\Program Files\Warcraft III\"相同的 目录/文件结构 。然后添加*.W3M文件和其他大部分文件,不过不是全部。
例如:
需要
Units\unitUI.slk
Units\UnitMetadata.slk
Units\HumanUnitFunc.txt
Units\HumanUnitStrings.txt
Units\HumanAbilityFunc.txt
Units\HumanAbilityStrings.txt
Units\HumanUpgradeFunc.txt
Units\HumanUpgradeStrings.txt

不需要
Units\AbilityData.slk
Units\MiscData.txt

当您真的需要去改变文件,让文件不在地图装载前被装载 或者根本不被装载。
我的建议是先备份您的 "war3patch.mpq",然后创建个新文件,把原来的war3patch.mpq 和您修改后的文件添加到您刚创建的新"war3patch.mpq"。
请不要忘了备份您原本的war3patch.mpq,当您与别人对战时遇到版本冲突或者需要升级WAR3版本的时候,请还原备份的文件。

例如:
您有个叫"UI\MiscData.txt" 的文件同时存在于"War3Patch.mpq"和"War3.mpq"中。
魔兽程序默认使用在"War3Patch.mpq"中的文件。如果您要修改它,只需要在"C:\Program Files\Warcraft III\"中创建一个"UI\"目录,然后提取"War3Patch.mpq"中的"MiscData.txt"文件并放入上面的目录中(即"C:\Program Files\Warcraft III\UI\MiscData.txt")。
注册表键就用上面的路径来修改。
现在,当您再次运行魔兽3的时候,就会用新的文件代替旧的文件了。


注意:
— 在某些情况下,假如您与别人对战,那么所有人都需要有同样有您修改过的文件,否 则会出现像"netsyns eror"之类的错误。
— 某一些文件需要一种“特殊”的格式,假如您修改了它们,您需要“伪造”这种格式 ,而且并不是什么时候都有效。假如无效,WAR3会试图找到一个“标准文件”进行代 替。
— 在WAR3.MPQ和WAR3PATCH.MPQ以外的文件,WAR3是不会使用的。


1.2.3) 地图文件(W3M)
去编辑一个地图,您必须解压W3M中的某个档案,然后编辑档案,最后再把档案放回W3M文件。
不过W3M文件和MPQs文件是有不同的。我会在“W3M文件格式一节”和以下各节对W3M内其他档案做更多的介绍。


1.3 WAR3数据格式

暴雪在档案中使用了多种方式储存数据。不过还是经常使用到了通用类型。

__Integers整数

整数使用了4bytes(高高低低原则)储存。 就是说读取的第一个字节是最后一个字节。
就像C++中的"int"(signed)。
大小:4 bytes
例子:1234(十进制)=[00 00 04 D2]h 储存后是[D2 04 00 00]h


__Short Integers数值稍小的整数

数值稍小的整数使用了2bytes(高高低低原则)储存。
与C++中的signed short相近,不过Short Integers的范围是-16384到16383.
就是说可以随意用来做flag。
大小:2bytes

__Floats小数

小数使用标准IEEE 32位浮点数格式。使用4bytes(高高低低原则)储存。
就像C++中的"float"。
大小:4bytes
例子:7654.32(小数)
这个数字不能直接使用此格式储存,所以系统将会使用最最接近的值,而且能够用二进制数储存的数字代替。最接近的是:7654.319824(小数)=[45 EF 32 8H]h 储存后是[8F 32 EF 45]h

__Chars and Array of Chars字符和字符数组

字符使用标准chars(1char=1byte)储存,字符数组不得使用空字符
大小(chars):1byte
(array of chars):通常4bytes


__Trigger Strings and Strings触发字符串和字符串

字符串只是用一个空字符(C++ "\0")结束的字符数组。只不过暴雪有时使用特殊的控制代码来改变现实颜色。就像"|c00BBGGRR","BB","GG","RR"是用十六进制值(每个使用2位数)来代表蓝色,绿色和红色的值。
如果一个字符串使用 "TRIGSTR_" 做开头(区分大小写),则被视为触发字符串。一个触发字符串在记忆体中以("TRIGSTR_***") 开头,并且在WAR3需要显示它的时候会改变。所以在用户屏幕上出现的不是"TRIGSTR_000",WAR3会在加载地图时查看触发字符串表,然后用对应的触发字符串代替后显示。除了WTS通常自己定义触发字符串表外,触发字符串只对W3M内部文件有用(Jass,w3i)。如果在"TRIGSTR_" 下的数字为负,触发字符串将会指为一个NULL(空)字串;如果"TRIGSTR_" 下是文本,它将被视为触发字符串#0(= "TRIGSTR_000")。
"TRIGSTR_7", "TRIGSTR_07", "TRIGSTR_007"和"TRIGSTR_7abc"全部指向触发字符串#7;
"TRIGSTR_ab7", "TRIGSTR_abc"和"TRIGSTR_"全部指向触发字符串#0."TRIGSTR_-7"是负的,将不会指向任何触发字符串,显示" "。按照惯例。"TRIGSTR_" 后为三位数,以空字串结束。
例1:
您设置字符串"blah |c000080FFblah", WAR3将显示"blah blah",但是第二个blah将显示为橙黄色(blue=00 + green=80 + red=FF ==>orange)
例2:
您设置"TRIGSTR_025" ,字符串25在.WTS文件中被定义为"blah|c000080FFblah", 那么显示的结果和例1一样。
大小(字符串):变化的。字符串长度+1(空终止符)
(触发字符串):12 bytes



__ Flags

flags就是布尔值(TURE或FALSE,1或0),被储存为4 bytes。
每位都是一个flag(4 bytes = 32 bit = 32 flags)。
暴雪在储存flags使用整数。
大小:通常4 bytes



__ Custom Types

有时候,字节会被整数和flags共用。
在W3E文件格式中,水平线和2 Flags使用着相同的4字节组。
最高2位为flags,后两位为水平线。更有时一个字节包含两个或更多的数据。


__ Structures 结构

WAR4也使用各种大小的构造类型。



2.0 w3m文件格式

W3M文件就是WAR3地图文件,就是有一个512 bytes为header的MPQ文件(新压缩格式)。
官方W3M文件常常还为了认证地图,使用了260 bytes的footer。

header格式(固定大小=512bytes):

char[4]: 文件ID (应该是"HM3W")
int: unknown
string:地图名称
int:地图flags (和W3I文件一样)
0x0001: 1=隐藏预览屏的小地图
0x0002: 1=变更结盟优先权
0x0004: 1=混战
0x0008: 1=可用地图大小为大,从未减小
0x0010: 1=阴影区域部分可见
0x0020: 1=对固定玩家设置默认属性
0x0040: 1=使用默认属性
0x0080: 1=使用默认技能树
0x0100: 1=使用默认技能
0x0200: 1=使用默认升级设置
0x0400: 1=地图创建后至少打开一次地图道具菜单
0x0800: 1=显示悬崖岸水波
0x1000: 1=显示海岸水波
int:最高玩家数量
从00 bytes到512 bytes(header are filled).



foot格式:

char[4]: footer sign ID (应该是"NGIS" ==相反的 'sign')
byte[256]: 256 data bytes (认证用).


MPQ包含的文件:
(listfile)
(signature)
(attributes)
war3map.w3e
war3map.w3i
war3map.wtg
war3map.wct
war3map.wts
war3map.j
war3map.shd
war3mapMap.blp
war3mapMap.b00
war3mapMap.tga
war3mapPreview.tga
war3map.mmp
war3mapPath.tga
war3map.wpm
war3map.doo
war3mapUnits.doo
war3map.w3r
war3map.w3c
war3map.w3u
war3map.w3s
war3map.imp
war3mapImported\*.* (wave files,和其他用魔兽编辑器保存的文件)

下面我们会看到这些文件代表了什么。




3.0 "war3map.j"The JASS2 Script




这是最主要的地图脚本文件。使用的是文本格式,您可以使用记事本打开查看。
编写的语言是暴雪研发的JASS2(区分大小写)。
当您在进行游戏之前,JASS脚本会被加载然后被执行。
下面就是JASS里的几个关键词:
关键词

含义

function

used to define a new fonction

takes

used to define the number of arguments for a fontction

returns

sets the type of the value returned by a function

return

makes a function leaves and returns a value

endfunction

ends a function definition

call

used to call a function that returns nothing

globals

used to define the list of global variables

endglobals

ends the list of global variables definition

local

defines a local variable

set

assigns a value to a variable

if, elseif, else, then, endif

if (...) then ...
elseif (...) then ...
else ...
endif

Just an "if-then-else-endif" chain like in Basic.

loop, exitwhen, endloop

used to make loops in the script

constant

defines a constant

type

defines a new type/class

extends

says what the mother type is

native

defines a function header of an external built-in function implemented in Game.DLL


只存在“nothing””handle”两个”native types”
其他所有类型都能从”handle”导出(关键词”extends”
WAR3.MPQ中的"Scripts\Common.j"您可以看到完整的类型表和本地函数。
您还可以对句柄类型设定常数值:
“null”,整型数值,浮点型数值,字符串,触发字符串,”ture”,”false”

下面是一些JASS里的运算符:
操作符
含义
( )
parenthesis for priorities
+
addition (concatenation for strings)
-
substraction
*
multiplication
/
division
=
assignation
= =, <, <=, >, >=, !=
comparison (equal, lighter, lighter or equal, greater, greater or equal, different)
not
invert a boolean value

在编辑器里的函数在”Scripts\Blizzard.j”中被定义。


下面是一个函数定义的例子:
[jass]function myfunction takes nothing returns integer local string str = "blah blah blah" local integer i // comments line set i = 0 loop set i = i + 1 if (i == 27) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 60, str) endif exitwhen i == 30 endloop return i endfunction [/jass]

4.0  “war3map.w3e”The environment

这是”tiles”文件,包含了地图中所有地形设定的数据。
实际上地图被分为许多的矩形区域,这个矩形区域就叫”tiles”
3D,我们用点来定义面,但是在这里是用它们的转角来定义”tiles”
我称之为”tilepoint”
因此,假如您做了一张256×256的地图,那么就会有257×257tilepoints
例如,1/2块土地,1/4块草地,1/4块岩石 ,都只是一个tile
在文件中,第一个tilepoint代表了地图的左下角,然后连成一条条水平线。
Tilesets就是用于地面的纹理组。


下面就是war3map.w3e文件的格式:
Header:
char[4]:
文件ID = "W3E!"
int: w3e format version [0B 00 00 00]h = version 11
char: main tileset [TS]
Tileset
含义
A
Ashenvale
B
Barrens
C
Felwood
D
Dungeon
F
Lordaeron Fall
G
Underground
L
Lordaeron Summer
N
Northrend
Q
Village Fall
V
Village
W
Lordaeron Winter
X
Dalaran
Y
Cityscape

int: custom tilesets flag (1 = using cutom, 0 = not using custom tilesets)
int: tilesets
组的编号 (高高低低原则) (注意: 不能大于16 ,因为tilesets 标注在tilepoints 的定义中)
char[4][a]:
地表 tilesets IDs (tilesets目录)
   
例如: "Ldrt" 代表了 "洛丹伦的夏天"地表
   (
想要了解更多,请参阅war3.mpq"TerrainArt\Terrain.slk"文件)
int: cliff tilesets
的编号(高高低低原则) (注意: 不能大于16,原因同上)
char[4][b]: cliff tilesets IDs (
悬崖tilesets 目录)
   
例如: "CLdi"代表了洛丹伦悬崖泥土
   (
想要了解更多,请参阅war3,mpq"TerrainArt\CliffTypes.slk"文件)
int:
地图宽度+ 1 = Mx
int:
地图高度 + 1 = My
   
例如: 您的地图大小是160x128, Mx=A1h and My=81h



float: 地图X坐标中心偏移
float: 地图Y坐标中心偏移


这两个偏移用于脚本文件,小装饰物,还有其他一些地方。
原始坐标(00)位于地图左下角,比传统在地图正中间做(00)更易于使用。
下面是偏移的算法:
-1*(Mx-1)*128/2 and -1*(My-1)*128/2


在这里  
(Mx-1) (My-1) 是地图的宽度和高度
      128是地图里tile的大小
  /2 是取长度的中间值
  -1* 因为我们是"translating" 地图区域,而不是定义新坐标

数据:
一个 tilepoint 用一个7bytes的块来定义。
block的数量= Mx*My.
short: 地面高度
C000h: 最低高度(-16384)
2000h: 正常高度(零地水准平面)
3FFFh: 最高高度(+16383)
short: 水面 + 标记*(地图边缘的阴影范围)
4bit: 标记*
4bit: 地面构造类型 (草地,泥土,岩石,...)
1byte: 细节纹理 (石头, , 骨头,...).
4bit: 悬崖构造类型
4bit: 层的高度

flags*(标记):
标记值(低低高高原则):
   0x4000 --> 范围标记1 (地图边缘的阴影范围)
   0x0010 --> 斜坡标记 (两个地表层之间的斜坡)
   0x0020 --> blight flag (ground will look like Undead's ground)
   0x0040 --> 水面标记 (可用水面)
   0x0080 -->范围标记2 (镜头区域范围.)


水平面:
水平面和地面高度的储存一样. 最高位 (bit 15) 是范围标记1




Tilepoint 数据的例子:
51 21 00 62 56 84 13

51 21 --(高高低低原则)--> 0x2151 --(十六进制-->十二进制)--> 高度 = 8529
00 62 --(高高低低原则)--> 0x6200
   (提取范围标记)--> (0x6200 & 0xC000) = 0x4000 范围标记设置
   (提取水面数据)--> (0x6200 & 0x3FFF) = 0x2200 --(十六进制->十二进制)--> 水平面 = 8704
56 --> 5代表了水面标记和斜坡标记, 6 代表tilesets 表里的地表类型#6 tilepoint
84 --> 代表了细节纹理#132 tilepoint (=0x084)
13 --> 1 代表了悬崖类型 #1 (悬崖tilesets), 3代表了在"3"层的tilepoint
WEtilepoint "final height"算法是:
(ground_height - 0x2000 + (layer - 2)*0x0200)/4
"0x2000"代表了零地水准平面, 2代表了零层面, "0x0200" 也是层高
   = (0x2151 - 0x2000 + 1*0x0200)/4
   = (8529 - 8192 + 512)/4
   = 212,25

WE中水平面的tilepoint算法是:
(水平面- 0x2000)/4 - 89.6
"0x2000"代表了零地水准平面, -89.6代表了零水平面(water.slk 文件 高度 = -0,7 --> 零水平面 = -0,7*128):
   = 8704/4 - 89,6
   = 38,4

既然这样, 水面标记已经设置,水平面低于地水准平面,所以我们不会看到水面。 这只是个例子,您不可能在地图中看到这样的tilepoint 。这只是为了示例。






5.0  “war3map.shd”The Shadow Map File


这个文件没有header,,全部都是原始数据。
文件大小 = 16*地图宽度*地图高度
1byte 可以有两个值:
00h =无阴影
FFh =有阴影
Each byte set the shadow status of 1/16 of a tileset.
也就是说每个tileset 被分为16 (4*4)个部分。

评分

参与人数 1威望 +18 收起 理由
kook + 18 works complete

查看全部评分

 楼主| 发表于 2008-5-18 08:18:23 | 显示全部楼层
6.0 "war3mapPath.tga"The Imaga Path file and/or "war3map.wpm"The Path Map File

这两个文件是路径文件。旧的WAR3版本(<=1.21)使用的是"war3mapPath.tga"。
在1.30后的版本,WAR3使用了新的一种新的文件格式代替"war3map.wpm"。


6.1)"war3mapPath.tga"The Image Path file

这个文件是32位标准 RGB TGA文件,无压缩,有一条黑色阿尔法通道。
TGA格式是非常重要的。假如WAR3无法识别某文件格式,它会在tilesets里做一些变更(像使图片变绿格子)。还有,千万别忽略阿尔法通道。地图中的每个tile都被分为16像素(4×4 像在shadow文件中一样),所以TGA宽度是4×地图宽度,高度是4×地图高度。TGA中的每个像素都对应了地图里tileset的某特定部分。一像素的颜色设置那部分的规则。图像的左上角就是地图的左上角。


Header格式(18字节):
byte: ID长度= 0
byte:地图颜色类型= 0
byte: Image类型 = 2 (未压缩的RGB)

--地图颜色详细说明(5 字节) --
byte[2]: First Entry 索引 = 0
byte[2]:地图颜色长度 = 0
byte:地图颜色Entry 大小= 0

-- Image详细说明(10 字节) --
byte[2]: X 原点 = 0
byte[2]: Y 原点 = 0
byte[2]: image 宽度 (高高低低原则)
byte[2]: image 高度 (高高低低原则)
byte: 像素深度 = 32 (=0x20)
byte: Image 描述符= 0x28 (0x20=image从最左边起始, 0x08=8位“阿尔法通道”)


例子( "XX XX" 是宽度, "YY YY"是高度):
00 00 02 00 00 00 00 00 00 00 00 00 XX XX YY YY 20 28

数据:
一像素使用4 bytes定义:
BB GG RR AA
在这里:
BB代表了蓝色 (0 or 255)
GG代表了绿色(0 or 255)
RR代表了红色(0 or 255)
AA代表了阿尔法通道值 (设置为 0)
1 tileset有4×4像素.
TGA宽度等于地图宽度*4.
TGA高度等于地图高度*4.

下面是颜色代码:


Color颜色
Build state建筑状态
Walk state移动状态
Fly state飞行状态
White
no build
no walk
no fly
Red
build ok
no walk
fly ok
Yellow
build ok
no walk
no fly
Green
build ok
walk ok
no fly
Cyan
no build
walk ok
no fly
Blue
no build
walk ok
fly ok
Magenta
no build
no walk
fly ok
Black
build ok
fly ok
walk ok

总结来说:当设置为红色,意味着" no walk" ,当绿色是集合" no fly" 并且,当蓝色是集合"no build"阿尔法通道被用于设置有blight地方(黑色=正常、白色= blight)


6.2) "war3map.wpm" The Path Map File



Header:
char[4]: 文件ID =
'MP3W'

int: 文件版本 = 0
int: 地图路径宽度(=地图宽度
*4)
int: 地图高度路径(=地图高度
*4)

数据
:
正好和TGA一样,数据部分的每一位都是tlieset的一部分。

数据大小: (地图宽度*4)*(地图高度*4)字节
Flags table  标记表:
0x01: 0 (无用
)
0x02: 1=no walk, 0=walk ok
0x04: 1=no fly, 0=fly ok
0x08: 1=no build, 0=build ok
0x10: 0 (无用
)
0x20: 1=blight, 0=normal
0x40: 1=no water, 0=water
0x80: 1=unknown, 0=normal

例子
:
值: 使用
:
00 桥

08 浅水
0A 深水   
40 正常地面
48 瀑布,无法建造建筑物的地面,无法放置装饰物的地方
CA 悬崖边缘, 装饰物的实心部分(无法建造,无法通过)
CE 地图边缘 (范围)



7.0 "war3map.doo"The doodad file for trees


这个文件包含了树木的定义和位置。
下面是格式:
Header:
char[4]: 文件
ID = "W3do"
int: 文件版本
= 7
int: unknown (通常设置为[09 00 00 00]h, 少数情况下是
[07 00 00 00]h)
int: 被定义树木的号码


数据:
每棵树被42字节的块定义(有序)
:
char[4]: 树木ID (在文件"Units\\DestructableData.slk"中可以找到
)
int: 变化(高高低低原则
)
float: 地图中树木的X坐标

float: 地图中树木的Y坐标
float: 地图中树木的Z坐标
float: 树木角度(角的弧度值)(度数 = 弧度*180/圆周率)
float: 树木X标度

float: 树木Y标度
float: 树木Z标度
byte: 树木标记
byte: 树木生命(整数使用百分比储存,例如 100% 就是0x64, 170% 就是 0xAA)
int: WE中的树木ID号码(高高低低原则) (每个都不一样
)

标记
:
0= 不可见并且不实心的树木

1= 可见但是不实心的树木
2= 正常树木(可见,实心)

总结一下 怎么查看
:
tt tt tt tt vv vv vv vv xx xx xx xx yy yy yy yy zz zz zz zz aa aa aa aa xs xs xs xs ys ys ys ys zs
zs zs zs ff ll dd dd dd dd
在这里
:
tt:类型

vv:变化
xx: x 坐标
yy: y 坐标
zz: z 坐标
aa:旋转角
xs: x 标度
ys: y 标度
zs: z 标度
ff: 标记
ll: 生命值
dd: 编辑器里的装饰物号码

例子(the second tree of Legend):
4C 54 6C 74 08 00 00 00 00 00 74 45 00 00 70 44 00 10 24 44 E5 CB 96 40 98 85 98 3F 98 85 98 3F 98 85 98 3F 02 64 8D 01 00 00

4C 54 6C 74 --> LTlt (树木类型
)
08 00 00 00 --> 00000008 = 变化 #8 (改变树木的外形
)
00 00 74 45 --> X=3904.
00 00 70 44 --> Y=960.
00 10 24 44 --> Z=656.25
E5 CB 96 40 --> 角度(float值=4.7123895, 度数=270
°
)
98 85 98 3F --> X_标度
=1.191577
98 85 98 3F --> Y_标度
=1.191577
98 85 98 3F --> Z_标度
=1.191577
02 --> 树木是实心,可被选的

64 --> 生命值=100% 默认树木生命值
8D 01 00 00 --> 0000018D=397, 树木号 397

在上面的树木定义, 有4字节设置为"
0"(我不知道是不是版本问题
).
int:  "特别的"装饰物的系数"s"("特别的"比如悬崖,...)


    "s"次特别的装饰物结构(每个16字节):
char[4]: 装饰物ID
byte[4]: ? (0)
int: X? (w3e 坐标)
int: Y? (w3e 坐标)




"Frozen Throne expansion pack beta" 格式:
Header:
char[4]: 文件 ID = "W3do"
int: 文件版本
= 8
int: unknown ([0B 00 00 00]h)
int: 被定义的树木号

数据:
每棵树被50字节的块定义(有序):
char[4]: 树木
ID
int: 变化(高高低低原则
)
float: 地图中树木的X坐标

float: 地图中树木的Y坐标
float: 地图中树木的Z坐标
float: 树木角度(角的弧度值)(度数 = 弧度*180/圆周率)
float: 树木X标度

float: 树木Y标度
float: 树木Z标度
byte: 树木标记
byte: 树木生命(整数使用百分比储存,例如 100% 就是0x64, 170% 就是 0xAA)
int: unknown (-1)
int: unknown (0)
int: WE中的树木ID号码(高高低低原则) (每个都不一样
)

标记
:
0= 不可见并且不实心的树木

1= 可见但是不实心的树木
2= 正常树木(可见,实心)

总结一下 怎么查看
:
tt tt tt tt vv vv vv vv xx xx xx xx yy yy yy yy zz zz zz zz aa aa aa aa xs xs xs xs ys ys ys ys zs
zs zs zs ff ll bb bb bb bb cc cc cc cc dd dd dd dd
在这里:
tt: 类型

vv: 变化
xx: x 坐标
yy: y 坐标
zz: z 坐标
aa: 旋转角
xs: x 标度
ys: y 标度
zs: z 标度
ff: 标记
ll: 生命值
bb: unknown
cc: unknown
dd:
编辑器中的装饰物号码


8.0 "war3mapUnit.doo"The doodad file for items and such

这个文件包含了装饰物单位的定义和位置。
下面是格式:
Header:
char[4]: 文件
ID = "W3do"
int:文件版本
= 7
int: unknown (通常设置为
[09 00 00 00]h)
int: 被定义的装饰物单位号码



数据
每个装饰物都使用 (变长)字节的块定义(有序):
char[4]: 类型
ID
int: 变化

float: X坐标
float: Y坐标
float: Z坐标
float: 旋转角
float: X标度
float: Y标度
float: Z标度
byte: 标记
int: 玩家号码(拥有者) (player1 = 0, 16=中立被动)
byte: unknown
byte: unknown
int: %生命值(-1 =缺省
)
int: unknown (通常为
-1)
int: 掉落物品设置的系数"s"
"s"次掉落物品设置结构:
int: 有可能掉落的物品的系数"d"
"d"次有可能掉落的物品设置的结构:
char[4]: 物品ID ([00 00 00 00]h = none)
假如物品ID开头为"YYI"接着为"num", 那么随机物品等级= num
int: 掉落几率(百分比)
int: 金钱数量(默认 = 12500)
float: unknown (通常为
-1)
int: unknown (通常为
to 1)
int: unknown
int: unknown
int: 随机单位

0 = 任意中立被动建筑
1 = 随机组中的随机单位
2 = 自定义表中的随机单位
int: 任意中立被动建筑等级的随机单位类型
int: 自定义颜色(-1 = none, 0 = red, 1=blue,...)
int: 传送门: 开启目的地数量(-1 = none)
int: 创建数量
*flags:
可能和war3map.doo flags一样。
回复

使用道具 举报

 楼主| 发表于 2008-5-19 10:00:25 | 显示全部楼层
9.0 "war3map.w3i"The info file

这个文件包含了游戏开始时显示的一些信息。

格式:
int:文件格式版本= 18
int:保存次数(地图版本)
int: 编辑器版本(高高低低原则)
String: 地图名称
String: 地图作者
String: 地图描述
String: 建议玩家数
float[8]: "镜头范围"(和JASS文件中定义的一样)
int[4]: 镜头范围补码* (请看 note 1) (ints A, B, C and D)
int:地图可用区域宽度 E* (请看 note 1)
int:地图可用区域高度 F* (请看 note 1)


*note 1:
地图宽度 = A + E + B
地图高度 = C + F + D
int: 标记
0x0001: 1=在预览画面隐藏小地图
0x0002: 1=修改结盟优先权
0x0004: 1=混战地图
0x0008: 1=可用地图大小为大,从未减小为中 (?)
0x0010: 1=阴影区域部分可见
0x0020: 1=固定设置玩家自定义队伍
0x0040: 1=使用自定义队伍
0x0080: 1=使用自定义科技树
0x0100: 1=使用自定义技能
0x0200: 1=使用自定义升级
0x0400: 1=地图创建后至少一次打开功能菜单(?)
0x0800: 1=显示悬崖水波
0x1000: 1=显示海岸水波
char: 地图主要地表类型
例子: 'A'= Ashenvale, 'X' = City Dalaran
int: 战役背景图序号(-1 = none)
String: 文字说明(地图载入画面)
String: 标题(地图载入画面)
String: 子标题(地图载入画面)
int: 地图载入画面序号(-1 = none)
String: 文字说明(预览图)
String: 标题(预览图)
String: 子标题(预览图)
int: 玩家最多数量"MAXPL"
结构数组:
共有MAXPL个单个玩家数据(描述如下).
int:最多队伍数量"MAXFC"
int: 队伍标记
0x00000001: 同盟(队伍1)
0x00000002: 同盟胜利
0x00000004: 共享视野
0x00000010: 共享单位控制权
0x00000020: 共享所有控制权
int: unknown (通常是 -1)
结构数组:
共有MAXFC个单个队伍数据(描述如下).
int: 假如为0,那意味着w3i文件结束
假如为非0, 后面的字节定义了地图的特殊设置(科技树, 升级,...)

玩家数据格式:
int: unknown
int: 玩家类型
1=用户, 2=电脑, 3=中立, 4=可营救的
int: 玩家种族
1=人族, 2=兽族, 3=不死族, 4=暗夜精灵族
int: 00000001 = 固定开始点
String: 玩家名称
float: 开始点 X坐标
float: 开始点 Y坐标
int: 同盟最低优先权标记 (bit "x"=1 --> 设置玩家 "x")
int: 同盟最高优先权标记 (bit "x"=1 --> 设置玩家 "x")

队伍数据格式:
String: 队伍名称
int: unknown
int: unknown



NEW "Frozen Throne expansion pack beta" format:


int: 文件格式版本 = 19 (and 25 thx PitzerMike)
int: 保存次数(地图版本)
int: 编辑器版本 (高高低低原则)
String: 地图名称
String: 地图作者
String: 地图描述
String: 建议玩家数
float[8]: "镜头范围"(和JASS文件中定义的一样)
int[4]: 镜头范围补码* (请看note 1) (ints A, B, C,D)
int: 地图可用区域宽度 E* (请看note 1)
int: 地图可用区域高度 F* (请看note 1)
*note 1:
地图宽度 = A + E + B
地图高度 = C + F + D
int: 标记
0x0001: 1=在预览画面隐藏小地图
0x0002: 1=修改结盟优先权
0x0004: 1=混战地图
0x0008: 1=可用地图大小为大,从未减小为中 (?)
0x0010: 1=阴影区域部分可见
0x0020: 1=固定设置玩家自定义队伍
0x0040: 1=使用自定义队伍
0x0080: 1=使用自定义科技树
0x0100: 1=使用自定义技能
0x0200: 1=使用自定义升级
0x0400: 1=地图创建后至少一次打开功能菜单(?)
0x0800: 1=显示悬崖水波
0x1000: 1=显示海岸水波
0x2000: 1=unknown
0x4000: 1=unknown
0x8000: 1=unknown
char: 地图主要地表类型
例子: 'A'= Ashenvale, 'X' = City Dalaran
int: 战役背景序号(-1 = none)
String: 文字说明(地图载入画面)
String: 标题(地图载入画面)
String: 子标题(地图载入画面)
String: unknown
int: 地图载入画面序号(-1 = none)
(v25): String: (? 还需要进一步验证, 应该是自定义载入画面的路径)
String: 文字说明(预览图)
String: 标题(预览图 )
String: 子标题(预览图)
String: unknown
float: unknown (地形迷雾Z轴始?)
float: unknown (地形迷雾Z轴末?)
float: unknown (迷雾密度?)
byte[10]: ? (也许是一些字符串?)
int: unknown (-1)
int: 玩家最多数量"MAXPL"
结构数组:
共有MAXPL个单个玩家数据(描述如下).
int: 最多队伍数量"MAXFC"
int: 队伍标记
0x00000001: 同盟 (队伍 1)
0x00000002: 同盟胜利
0x00000004: 共享视野
0x00000010: 共享单位控制权
0x00000020: 共享所有控制权
int: unknown (通常为 -1)
结构数组:
共有MAXFC个单个队伍数据(描述如下).
int:假如为0,那意味着w3i文件结束
假如为非0, 后面的字节定义了地图的特殊设置(科技树, 升级,...)

玩家数据格式:
int: unknown
int: 玩家类型
1=用户, 2=电脑, 3=中立, 4=可营救的
int: 玩家种族
1=人族, 2=兽族, 3=不死族, 4=暗夜精灵族
int: 00000001 = 固定开始点
String: 玩家名称
float: 开始点 X坐标
float: 开始点 Y坐标
int: 同盟最低优先权标记 (bit "x"=1 --> 设置玩家 "x")
int: 同盟最高优先权标记 (bit "x"=1 --> 设置玩家 "x")

队伍数据格式:
String: 队伍名称
int: unknown
int: unknown
int: unknown


10.0 "war3map.wts"The trigger string data file

使用记事本打开这个文件,您会理解它是如何运行的。
每个触发字符串是用一个数字(触发ID)和这个数字的值来定义。当WAR3运行"TRIGSTR_***" (在这里 "***"是个数字),程序会在触发字符串表中寻找对应的字符串,然后用这个值来代替触发字符串. 一个明确的触发ID的值只会被这个ID的第一个定义定义一次: 假如您有两个触发字符串 0 被定义,只有第一个会被计入. "STRING "后的数字一定是正数: 任何负数都会被忽略.假如 "STRING "后为文本, 将会被认为是数字 0.

字符串定义:
以 "STRING "开头, 接着是触发字符串ID号码(用来区别每个触发字符串).
"{" 说明字符串值的定义开始(一个字符串包含了许多行代码)
"}"说明触发字符串定义结束.

例子:
.WTS文件中:

STRING 0
{
Blah blah blah...
}

在 .J和.W3I文件中一样, 当WAR3查询TRIGSTR_000, 会先在表单中寻找数字0触发字符串
然后用找的值 "Blah blah blah"替换"TRIGSTR_000".


11.0 “war3mapMap.blp”the minimap image

BLP文件包含了JPEG header和JPEG原始数据.(这两个是分开的)
BLP代表了"Blip" 文件("BLIzzard Picture").

Header:
char[4]: 文件ID ("BLP1")
int: 0代表JPGblp, 1代表Paletted
int: 0x00000008=有alpha, 0x00000000 =无alpha
int: 图像宽度
int: 图像高度
int: 队伍颜色标记(通常是 3, 4 or 5).假如'unit'纹理>=5, 那么队伍颜色就不会显示.
int: 通常为 0x00000001,假如为0x00000000,表示用这个纹理的模型是有问题的.
int: 小地图偏移(从文件开头算起)
int[15]: unknown
int: 小地图大小(header大小) "h" (通常为0x00000270)
byte[h]: header
接着0字节(直到jpeg数据).
address=小地图偏移: jpeg原始数据(直到文件结束)


12.0 "war3map.mmp"The menu minimap

Header:
int: unknown (通常为 0, 也许只是文件格式)
int: dataset号码

数据:
dataset的大小为16字节.
int: icon 类型
Icons 类型:
00: 金矿
01: 人口
02: player start (cross)
int: X坐标(icon)
int: Y坐标(icon)
地图坐标:
坐上: 10h, 10h
中心点: 80h, 80h
右下: F0h, F0h
byte[4]: 玩家icon颜色
玩家颜色(BB GG RR AA = blue, green, red, 阿尔法通道):
03 03 FF FF : red
FF 42 00 FF : blue
B9 E6 1C FF : cyan
81 00 54 FF : purple
00 FC FF FF : yellow
0E 8A FE FF : orange
00 C0 20 FF : green
B0 5B E5 FF : pink
97 96 95 FF : light gray
F1 BF 7E FF : light blue
46 62 10 FF : aqua
04 2A 49 FF : brow
FF FF FF FF : none

13.0 "war3map.w3u"The custom units file

W3U文件包含两个表单. 而且两个表单看起来差不多.
第一个表单是原始单位表单(WAR3原本有的单位).
第二个表单是自定义单位表单(用编辑器新建的单位).

Header:
int: W3U版本= 1
x 字节: 原始单位表单*
y 字节: 自定义单位表单*

数据:
*表单定义:
int: 表单中单位的数量n.
假如在原始单位表单中为0, 那么就会省略default单位表单.
这是单位的数量总计. 即使对原始表单不做任何修改, 还是会有这个值.
共有n个单个单位定义结构*.

*单位定义结构:
char[4]: 原始单位 ID (可从war3.mpq 中的"Units\\UnitData.slk"获得)
char[4]: 新建单位ID. 假如此项在原始表单中,那么为0(不被使用)。
int: 单位修改的系数m
共有m个单位修改结构*

*单位修改结构:
char[4] 改变 ID 代码 (从war3.mpq中的 "Units\\UnitMetaData.slk"获得)
int: 变量类型t (请看下面)
类型t : 值(长度根据前面类型t的详细说明)
int: 单位定义结束(通常为0)

*变量类型:
0=整型
1=实数型
2=非实数型
3=字符串
4=布尔值
5=字符型
6=单位列表
7=物品列表
8=回复类型
9=攻击类型
10=武器类型
11=可攻击类型
12=移动列表
13=防御类型
14=路块结构图
15=升级列表
16=字符串列表
17=技能列表
18=英雄技能列表
19=投射物
20=属性类型
21=攻击速率


14.0 "war3map.wtg"The triggers names file

Header:
char[4]: 文件ID (WTG!)
int: wtg文件格式版本= 4
int: 触发类别的系数a
共有a个单个类别定义结构*
int: 系数"b" ???
int: 变量的系数c
共有c个单个变量定义结构**
int: 触发的系数d
共有d个单个触发定义结构***

*触发类别定义结构:
int: 类别索引
String: 类别名称

**变量定义结构:
String: 变量名称
String: 变量类型
int: 系数e ???
int: 数组状态: 0=非数组, 1=数组
int: 初始化状态: 0=没有初始化完毕, 1=初始化完毕
String:初始值(string)

***触发定义结构:
String: 触发名称
String: 触发描述
int: 允许状态: 0=不可用, 1=可用
int:自定义文本触发状态: 0=没有自定义文本触发, 1=有自定义文本触发(使用WCT中的数据)
int: 初始化状态: 0=没有初始化完毕, 1=初始化完毕
int: ???
int:触发类别的索引
int:ECA函数的系数i (ECA就是事件-条件-动作)
共有i个单个ECA函数定义结构*(4) (假如这不是自定义文本触发, i就为0,这部分也就没意义了)

*(4)ECA函数定义结构
int: 函数类型: 0=事件, 1=条件, 2=动作
String: 函数名称
int: 允许状态: 0=函数不可用, 1=函数可用
共有x个单个参数结构*(5). x根据函数变化,是固定代码.

*(5)参数结构:
int: 0=预设, 1=变量, 2=函数
String: 参数值
int: ???
int: ???


NEW "Frozen Throne expansion pack beta" format :


Header:
char[4]: 文件ID (WTG!)
int: wtg文件格式版本= 7
int: 触发类别的系数a
共有a个单个类别定义结构*
int: 系数b ???
int: 变量的系数c
共有c个单个变量定义结构**
int: 触发的系数d
共有d个单个触发定义结构***

*类别定义结构:
int: 类别索引
String: 类别名称
int: 类别类型: 0=正常, 1=注释

**变量定义结构:
String: 变量名称
String: 变量类型
int: 系数"e" ???
int: 数组状态: 0=非数组, 1=数组
int: 数组大小
int: 初始化状态: 0=没有初始化完毕, 1=初始化完毕
String: 初始值(string)

***触发定义结构:
String: 触发名称
String: 触发描述
int: 触发类型: 0=正常, 1=注释
int: 允许状态: 0=不可用, 1=可用
int: 自定义文本触发状态: 0=没有自定义文本触发, 1=有自定义文本触发 (使用WCT中的数据)
int: 初始化状态: 0=初始化, 1=非初始化
int: 运行地图初始化: 0=否, 1=是
int: 触发类别的索引
int: ECA函数的系数i (ECA就是事件-条件-动作)
共有i个单个ECA函数定义结构*(4) (假如这不是自定义文本触发, i就为0,这部分也就没意义了)

*(4)ECA函数定义结构
int:函数类型: 0=事件, 1=条件, 2=动作
String: 函数名称
int: 允许状态: 0=函数不可用, 1=函数可用
共有x个单个参数结构*(5).x根据函数变化,是固定代码.
int: ???
int: ECA函数的系数i
共有i个单个ECA函数定义结构*(4) (假如这不是自定义文本触发, i就为0,这部分也就没意义了)

*(5)参数结构:
int: 类型:0=预设, 1=变量, 2=函数, 3=字符串
String: 参数值
int: begin function(1或0)
假如是1:
int: 类型: 3
String: 和参数值一样
int: begin function: 1
共有x个单个参数结构*(5). x根据
函数变化,是固定代码.
int: end function (通常为0)
回复

使用道具 举报

 楼主| 发表于 2008-5-19 10:00:41 | 显示全部楼层
15.0) "war3map.w3c" The camera file

Header:
int: 文件版本 = 0
int: 镜头定义结构的系数n

镜头定义结构:
float: 目标 X
float: 目标 Y
float: 偏移 Z
float: 旋转 (角度)
float: 攻角 (AoA) (角度)
float: 距离
float: 滚动
float: 视野 (FoV) (角度)
float: 远剪切面 (FarZ)
float: ??? (通常为100)
String: 镜头名称


16) "war3map.w3r" The triggers regions file

Header:
int: 版本 = 5
int: 区域定义结构*的系数n

数据:
共有n个单个区域定义结构*

*区域定义结构:
float: 左 (jass坐标)
float: 右 (jass坐标)
float: 下 (jass坐标)
float: 上 (jass坐标)
String: 区域名称
int: 区域索引 (创建号码)
char[4]:天气效果 ID (例如: "RLlr"代表"Rain Lordaeron Light Rain")
假如char[4]中都为0, 代表无天气效果.
String: 环境音效(音效ID在w3s文件中定义,例如
"gg_snd_HumanGlueScreenLoop1")
bytes[3]: 区域颜色 (用在WE中) (BB GG RR)
byte: 结构结束

17) "war3map.w3s" The sounds definition file

Header:
int: 文件格式版本 = 1
int: 声音定义的系数n

数据:
共有n个单个声音定义结构*

*声音定义结构:
String: 声音ID (比如"gg_snd_HumanGlueScreenLoop1")
String: 声音文件(比如 "Sound\\Ambient\\HumanGlueScreenLoop1.wav")
String: EAX效果(比如"DefaultEAXON")
DefaultEAXON=缺省
CombatSoundsEAX=战斗
KotoDrumsEAX=鼓
SpellsEAX=咒语
MissilesEAX=飞行物
HeroAcksEAX=英雄说话
DoodadsEAX=装饰物
int: 声音标记
0x00000001=循环
0x00000002=3D音效
0x00000004=范围外停止
0x00000008=音乐
0x00000010=
int: 逐渐淡出
int: 立即淡出
int: 音量 (-1=缺省值)
float: 声音相对高低
float: ???
int: ??? (-1或8)
int: channel:
0=普通
1=单位选择
2=单位确认
3=单位移动
4=单位准备
5=战斗
6=错误
7=音乐
8=用户界面
9=循环运动
10=循环环境
11=动画
12=建筑物
13=出生
14=射击
float: 最小距离
float: 最大距离
float: 距离界限
float: ???
float: ???
int: ??? (-1或127)
float: ???
float: ???
float: ???

注意:
Float值可以设置,也可以不设置(缺省值)。
当不设置float时, 该值为[4F800000]h = 4.2949673e+009.

18) "war3map.wct" The custom text trigger file

int: 文件版本(0)
int: 触发的系数n
共有n个单个自定义文本触发结构*
注意: 自定义文本触发结构的定义和WTG中的触发使用同样的要求。
即使没有被转换为自定义文本触发,每个触发都必须含有其自定义文本部分;
假如这样,自定义文本大小设置为 0 (只有4字节来设置大小).

*自定义文本触发结构:
int: 文本大小 s (包括空终止符)
String: 自定义文本触发器字符串(包含了s个字符,其中也包括了空终止符)


NEW "Frozen Throne expansion pack beta" format :


int: 文件版本: 1
String: 自定义脚本代码注解
只有一个自定义文本触发结构*
int: 触发的系数n
共有n个单个自定义文本触发结构*
注意: 自定义文本触发结构的定义和WTG中的触发使用同样的要求。
即使没有被转换为自定义文本触发,每个触发都必须含有其自定义文本部分;
假如这样,自定义文本大小设置为 0 (只有4字节来设置大小).

*自定义文本触发结构:
int: 文本大小 s (包含空终止符)
String: 自定义文本触发字符串(包含了s个字符,其中也包括了空终止符)



19) "war3map.imp" The imported file list

Header:
int: 文件格式版本
int: 导入文件的系数n

数据:
1byte: 路径是否完整,或者需要添加 "war3mapImported\\" (5 or 8= 标准路径, 10 or 13: 自定义路径)
String["n"]: 每个w3m中的导入文件的路径(比如"war3mapImported\\mysound.wav")

注意: 添加任何文件到W3M中,路径必须以"war3mapImported\\"开头,添加进.imp文件中。
假如您的路径名称以"war3mapImaported\\"开头,当您每次使用WE保存地图的时候,文件都不会被移除.
假如您的路径名称没有以"war3mapImported\\"开头,即使您把文件添加进导入文件,也无法用WE保存。

20) "war3map.wai" The Artificial Intelligence file

"Frozen Throne expansion pack beta"文件独有。
int: wai文件格式版本: 2
string: AI名称
int: 种族: 0=自定义, 1=人族, 2=兽族, 3=不死族, 4=暗夜精灵
int: 选项
除非另外说明所有的选项包含在选项整数中(HiWord)
用下面的值检查存在的选项:


设置玩家名称: 0x2000
混战: 0x0001
保护使用者: 0x8000
随机路径: 0x4000
目标英雄: 0x0002
修理建筑: 0x0004
英雄逃跑: 0x0008
单位逃跑: 0x0010
组队逃跑: 0x0020
决不仁慈: 0x0040
受伤忽略:0x0080
去除受伤者 : 0x1000
拾取物品: 0x0100
购买物品: 0x0001 LoWord
慢速采矿: 0x0200
允许基地变换: 0x0400
聪明的炮火: 0x0800


int: 工人和建筑物的数量. 假如少于详细指明4个工人和建筑物,WE会使用缺省值(4).
char[4]: 挖矿工人
char[4]: 砍树工人
char[4]: 基础建筑
char[4]: 采矿建筑 (假如没有, 使用与基础建筑相同的标识符)

int: 环境的系数n
int: ???: 7
共有a个单个环境定义结构*


char[4]: 首发英雄使用(假如没有,值设置为空;否则设置为单位ID)
char[4]: 二发英雄使用(假如没有,值设置为空;否则设置为单位ID)
char[4]: 三发英雄使用(假如没有,值设置为空;否则设置为单位ID)
int: 训练顺序 % 几率(1.首发英雄,2.二发英雄,3.三发英雄)
int: 训练顺序 % 几率(1.首发英雄,2.三发英雄,3.二发英雄)
int: 训练顺序 % 几率(1.二发英雄,2.首发英雄,3.三发英雄)
int: 训练顺序 % 几率(1.二发英雄,2.三发英雄,3.首发英雄)
int: 训练顺序 % 几率(1.三发英雄,2.首发英雄,3.二发英雄)
int: 训练顺序 % 几率(1.三发英雄,2.二发英雄,3.首发英雄)


技能选择顺序:
char[4*10]: 首发英雄的十个技能ID(如同首发英雄)
char[4*10]: 首发英雄的十个技能ID(如同二发英雄)
char[4*10]: 首发英雄的十个技能ID(如同三发英雄)
char[4*10]: 二发英雄的十个技能ID(如同首发英雄)
char[4*10]: 二发英雄的十个技能ID(如同二发英雄)
char[4*10]: 二发英雄的十个技能ID(如同三发英雄)
char[4*10]: 三发英雄的十个技能ID(如同首发英雄)
char[4*10]: 三发英雄的十个技能ID(如同二发英雄)
char[4*10]: 三发英雄的十个技能ID(如同三发英雄)


int: 建筑优先权的系数c
共有c个单个建筑优先权结构***
int: 采集优先权的系数d
共有d个单个采集优先权结构 *(4)
int: 目标优先权的系数e
共有e个单个目标优先权结构*(5)
int: 重复轮次
int: 最小力量: 攻击组索引(假如是首发英雄只需设置这个值为 char[4]:HAIA)
int: 初始化延迟
int: 攻击组的系数f
共有f个单个攻击组结构*(6)
int: 攻击轮次数的系数g
共有g个单个攻击轮次数结构*(8)
int: ???: 1
int:游戏选项
除非另外说明所有的选项包含在选项整数中(HiWord)
用下面的值检查存在的选项:

禁用战争迷雾: 0x0001
禁用胜利失败条件: 0x0002

int: 常规游戏速度
string: 地图文件路径
int: 玩家的数量h (0-2)
共有h个单个玩家结构 *(9)
int: ???


*环境定义结构:
int: 环境索引
String: 环境名称
int:  "b": 0=无(没有环境), 1=有环境
如果"b" = 1
String: 运算符函数名称
int: begin function: 1
共有x个单个参数结构**.x根据函数变化,是固定代码.
int: end function: 0


**参数结构:
int: 类型: 0=预设, 1=运算符函数, 2=函数, 3=字符串
String: 参数值(如果是函数,参数值不为0, begin function 使用'(' ,end function使用')' 。)
int: begin function (如果是函数或者运算符函数,设置为1;否则设置为0)
如果是函数,参数值不为0:
int: 类型: 3
String: 和参数值相同
int: begin function: 1
共有x个单个参数结构**.x根据函数变化,是固定代码.
int: end function: 0
如果是运算符函数:
int: begin function: 1
共有x个单个参数结构**.x根据函数变化,是固定代码.
int: end function
int: end function: 0


***发展优先结构:
int: 优先类型: 0
int: 类型: 0=单位, 1=科技, 2=扩张城镇
char[4]: 单位/科技 ID(如果是扩张的城镇,这个值设置为 XEIA)
int: 城镇: 0=主基地, 1-9=扩张区域 #1-9, 0xFFFFFFFD-0xFFFFFFF5=当前的金矿 #1-9, 0xFFFFFFFF=任意
int: 环境索引(如果为空,设置为0xFFFFFFFF, 如果为自定义,设置为0xFFFFFFFE)
只有1个单个环境定义结构*(不包括环境索引!)


*(4)资源优先结构:
int: 优先类型: 1
int: 资源类型: 0=金矿, 1=木材
int: 城镇: 0=主基地, 1-9=扩张区域 #1-9, 0xFFFFFFFD-0xFFFFFFF5=当前的金矿 #1-9, 0xFFFFFFFF=任意
int: 工人: 0-90=固定值 #0-90, 0xFFFFFFFF=全部, 0xFFFFFFFE=全部不攻击
int: 环境索引(如果为空,设置为0xFFFFFFFF, 如果为自定义,设置为0xFFFFFFFE)
只有1个单个环境定义结构*(不包括环境索引!)


*(5)目标优先结构
int: 优先类型: 2
int: 目标: 0=共同联盟目标, 1=新扩张区域, 2=敌方主要攻击,
3=敌方的扩张区域, 4=敌方任意城镇, 5=野兵营地, 6=被购买的地精飞艇
int: 野兵最小力量(如果目标不同于5,设置值为0xFFFFFFFF)
     假如目标= 5
     int: 野兵最大力量
     int: 允许飞行物: 0=否, 1=是
int: 环境索引(如果没有, 设置值为0xFFFFFFFF, 如果自定义,设置值为0xFFFFFFFE)
只有1个单个环境定义结构*(不包括条件索引!)


*(6)进攻队伍结构
int: 进攻队伍索引
string: 进攻队伍名称
int: 当前组的系数g
共有g个单个当前组结构 *(7)


*(7)当前组结构
char[4]: 单位ID (首发英雄: 1HIA, 二发英雄: 2HIA, 三发英雄: 3HIA)
int: 数量值: 0-90=数量 #0-90, 0xFFFFFFFF=全部
int: 最大数量: 0-90=数量#0-90, 0xFFFFFFFF=全部(如果数量值为0xFFFFFFFF, 最大数量代表了除#0-90以外的全部)
int: 环境索引(如果没有, 设置值为0xFFFFFFFF, 如果自定义,设置值为0xFFFFFFFE)
只有1个环境定义结构*(不包含条件索引!)


*(8)攻击轮次数结构
int:攻击组索引
int:延迟


*(9)玩家结构
int: 玩家索引
int: 队伍号码
int: 种族: 1=人族, 2=兽族, 8=不死族, 4=暗夜精灵, 20=随机
int: 颜色: 0=红, 1=蓝, 2=蓝绿, 3=紫, 4=黄, 5=橙, 6=绿, 7=粉, 8=灰,9=淡蓝, 10=深绿, 11=褐
int: 障碍 (0-100)
int: AI: 0=标准的, 1=使用者的, 4=自定义的, 12=现行的
int: AI难度: 0=简单, 1=正常, 2=疯狂
string: 自定义AI脚本路径

21) The others files
war3mapImported\\*.* = 导入文件并用WE保存 (也必须在.imp文件中定义)
(signature) = w3m文件的签名
(listfile) = 保存在w3m文件中的文件列表
(attributes) =w3m文件中所有文件的属性

回复

使用道具 举报

 楼主| 发表于 2008-5-22 09:39:30 | 显示全部楼层
写在最后:
感谢所有为魔兽争霸做出贡献的人们,感谢所有不懈研究并将之发表的人们,感谢所有看完这篇文章的人们,当然还要感谢暴雪。其实我更想说的是。。。。(感谢CCTV,感谢MTV,感谢我的父亲母亲,感谢我的女朋友,感谢默默支持着我的人,感谢这一路翻译中给予我帮助和鼓励的人)

本文到此结束


附赠本文电子书一本,方便大家收藏观看。

[翻译版]《inside w3m》.rar

656 KB, 下载次数: 907

回复

使用道具 举报

发表于 2008-5-22 21:27:42 | 显示全部楼层
嗯,好贴。
回复

使用道具 举报

发表于 2008-5-22 22:42:43 | 显示全部楼层
确实好贴。。不过怎么在水区呢?

PS:基本看不懂。。
回复

使用道具 举报

发表于 2008-5-23 17:52:45 | 显示全部楼层

支持
速度哦
回复

使用道具 举报

发表于 2008-5-27 14:12:54 | 显示全部楼层
呃 进度的确有点慢 不过忍忍还是值得的
回复

使用道具 举报

发表于 2008-5-27 18:56:53 | 显示全部楼层
恩恩又更新了
我可是很有耐心滴
嘿嘿 其实英文也看得懂
不过翻译了顺眼额
回复

使用道具 举报

发表于 2008-5-29 09:46:39 | 显示全部楼层
很好
收藏了
有空再去翻译个BLP转化的吧
嘿嘿
回复

使用道具 举报

发表于 2008-5-29 13:07:27 | 显示全部楼层
完结了 于是开始细细揣摩
回复

使用道具 举报

发表于 2008-6-6 13:19:12 | 显示全部楼层
这一个看起来还是有点费解,能说说应用在哪个地方么?
回复

使用道具 举报

发表于 2008-6-6 16:27:11 | 显示全部楼层
引用第12楼spark于2008-06-06 13:19发表的  :
这一个看起来还是有点费解,能说说应用在哪个地方么?
当然是做编辑器用的啦
可惜SC2快出来了
回复

使用道具 举报

发表于 2008-6-6 18:22:46 | 显示全部楼层
SC2应该也是这种格式
回复

使用道具 举报

发表于 2008-6-10 13:56:53 | 显示全部楼层
发现漏掉了很多重要内容啊
555


1.23 The war3map.w3u file : The Custom Unit File

我记得以前看到w3a和w3u还有个结构
好像是等级数据什么的
英雄等级 wu技能等级
那个咋找不到
回复

使用道具 举报

发表于 2008-6-10 13:59:20 | 显示全部楼层
Frozen Throne expansion pack format of "war3map.w3u / w3t / w3b / w3d / w3a / w3h / w3q" : The object data files :
的这个[int: level/variation (this integer is only used

These are the files that store the changes you make in the object editor.
They all have one format in common. They have an initial int and then there are 2 tables
Both look the same. The first table is the original table (Standard Objects by Blizzard).
The second table contains the user created objects (Custom units / items / abilities …)

Header:
int: File Version = (usually 1)
x bytes: Original objects table*
y bytes: Custom objects table*

Data:
*Table definition:
int: number n of objects on this table, if 0 on the original table, then skip the default object table. This is the number of following units. Even if we don't have any changes on original table, this value must be there.
n times a object definition structure*.

*Object definition structure:
char[4]: original object ID (see table at the bottom where you can get the object IDs*)
char[4]: new object ID. (if it is on original table, this is 0, since it isn't used)
int: number m of modifications for this object
m times a modification structure*

*Modification structure:
char[4] modification ID (see the table at the bottom where you can get the mod IDs*)
int: variable type* t
[int: level/variation (this integer is only used by some object files depending on the object type, for example the units file doesn’t use this additional integer, but the ability file does, see the table at the bottom to see which object files use this int*) in the ability and upgrade file this is the level of the ability/upgrade, in the doodads file this is the variation, set to 0 if the object doesn't have more than one level/variation]
[int: data pointer (again this int is only used by those object files that also use the level/variation int, see table*) in reality this is only used in the ability file for values that are originally stored in one of the Data columns in AbilityData.slk, this int tells the game to which of those columns the value resolves (0 = A, 1 = B, 2 = C, 3 = D, 4 = F, 5 = G, 6 = H), for example if the change applies to the column DataA3 the level int will be set to 3 and the data pointer to 0]
int, float or string: value of the modification depending on the variable type specified by t
int: end of modification structure (this is either 0, or equal to the original object ID or equal to the new object ID of the current object, when reading files you can use this to check if the format is correct, when writing a file

*Variable types:

Code:
Value      Variable Type      Value Format
0     Integer     int
1     Real     float (single precision)
2     Unreal (0 <= val <= 1)     float (single Precision)
3     String     string (null terminated)*Object data files:
This table shows where to get the object IDs and the modification IDs and if the files use the 2 additional level and data pointer integers.

Code:
Extension      Object Type      Object IDs                Mod IDs                          Uses Optional Ints
w3u           Units          Units\\UnitData.slk          Units\\UnitMetaData.slk                    No
w3t           Items          Units\\ItemData.slk          Units\\UnitMetaData.slk (those where useItem = 1) No
w3b           Destructables     Units\\DestructableData.slk     Units\\DestructableMetaData.slk               No
w3d           Doodads     Doodads\\Doodads.slk          Doodads\\DoodadMetaData.slk               Yes
w3a           Abilities     Units\\AbilityData.slk          Units\\AbilityMetaData.slk               Yes
w3h           Buffs          Units\\AbilityBuffData.slk     Units\\AbilityBuffMetaData.slk               No
w3q           Upgrades     Units\\UpgradeData.slk          Units\\UpgradeMetaData.slk               YesThese files can also be found in campaign archives with the exactly same format but named war3campaign.w3u / w3t / w3b / w3d / w3a / w3h / w3q

详细看
http://bbs.uuu9.com/viewthread.php?tid=929622&extra=page%3D1
回复

使用道具 举报

发表于 2008-6-10 15:53:17 | 显示全部楼层
很强大的东西~`
正好拿来做试验
回复

使用道具 举报

发表于 2008-6-10 17:45:20 | 显示全部楼层
LZ快来补全啊
郁闷
-load CvBa-bvrU-tHSX-TGUA-shWm-FqpB-cXC6-DwKS-2nwG-qmJP
回复

使用道具 举报

发表于 2008-6-11 00:06:19 | 显示全部楼层
char[4] modification ID (see the table at the bottom where you can get the mod IDs*)
int: variable type* t
[int: level/variation (this integer is only used by some object files depending on the object type, for example the units file doesn’t use this additional integer, but the ability file does, see the table at the bottom to see which object files use this int*) in the ability and upgrade file this is the level of the ability/upgrade, in the doodads file this is the variation, set to 0 if the object doesn't have more than one level/variation]
[int: data pointer (again this int is only used by those object files that also use the level/variation int, see table*) in reality this is only used in the ability file for values that are originally stored in one of the Data columns in AbilityData.slk, this int tells the game to which of those columns the value resolves (0 = A, 1 = B, 2 = C, 3 = D, 4 = F, 5 = G, 6 = H), for example if the change applies to the column DataA3 the level int will be set to 3 and the data pointer to 0]
int, float or string: value of the modification depending on the variable type specified by t

最麻烦的是在这里额
我一直想不通
怎么知道这个是level/variation还是
int, float or string: value of the modification depending on the variable type specified by t

  [s:186]  [s:186]  [s:186]  [s:186]
咋办捏

顺便占个位放黑暗侵袭的记录码(用户名hke)
-load l9AY-rOwx-Tgan-YoPu-W3iB-H1Ml-1nI1-smdw-uycV-M
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-11-22 12:50 , Processed in 0.371754 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表