偶久网

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索

网站魔兽热门地图

查看: 7375|回复: 17

Jass基础教程

  [复制链接]
无冕之王
发表于 2009-6-5 11:14:35
撰写: Greedwind(greedwind@163.com)
序言
这个教程假设你已经比较熟练地使用Trigger并有一定的逻辑基础和程序设计基础, Knowning engish is preferable
首先问个问题: 为什么要学JASS?
先看下面的例子:
以下例子可以实现在单位死亡的位置显示5秒的死亡信息(漂浮文字)后并清除死亡信息吗?
例子:
Events:
    A unit dies
Conditions:
Actions:
        -Floating Text - Create floating text at ((position of (Triggering Unit))
         with the message (("A "+(name of (Triggering Unit))) + " dies") with size 20 , red 100, green 100, blue 0, alpha 100.
        -Wait 5.00 seconds
        -Destroy (last created floating text)
象以上例子, 如果不使用用局部变量, 将无法准确销毁临时漂浮文字. 因为在等待5秒后(-Wait 5.00 seconds), 最近创建的漂浮文字(last created floating text)可能已经不是原来的那个了!)

要达到目的, 必须对JASS有些了解. 教程将对此TRIGGER作进一步的分析.

第一章 变量篇
学新的程序设计语言, 要先学它的变量类型.
首先提醒大家: Jass2是区分大小写的, 如ABcd和ABCD是不一样的.
Jass2 变量类型
变量相当于物件的储存箱子, JASS2很多的变量类型只是个指针(变量地址).
使用变量前必须要首先声明变量类型和变量名称.
看个简单的例子:
local string my1stvar        //声明1个字符型局部变量, 起名为my1stvar
set my1stvar = "GreedWind"    //把"GreedWind"赋值给变量my1stvar
以后的程序中就可以直接引用/重新赋值my1stvar
变量(除了数组变量)可以在声明语句中初始化, 上面可以简化成:
local string my1stvar = "GreedWind" //声明字符型局部变量my1stvar并赋值为"GreedWind"
JASS2有哪些变量类型呢?
我们用WORLD EDITOR和Jass2变量类型做对照便一目了然了
WORLD EDITOR和JASS变量类型对照表:

World Editor 变量名 Jass变量类型
Boolean boolean 布尔型(用于真/假判断)
Destructible destructable 可破坏物
Dialog dialog 对话
Dialog Button button 按钮
Floating Text texttag 漂浮文字
Integer integer 数值
Item item 物品
Leaderboard leaderboard 排行榜
Player player 玩家
Player Group force 玩家组
Point location 位置(点)
Real real 真值型数字
Region rect 地区
Special Effect effect 特效
String string 字符串
Terrain Deformation terraindeformation 地形
Timer timer 计时器
Timer Window timerdialog 计时器窗口
Unit unit 单位
Unit Group group 单位组
Player Score playerscore 积分(1.13版新类型)

World Editor中的Order(命令) , Ability(技能) , Unit Type(单位类型), Destructible type(可破坏物类型) 和 Item type(物品类型) 在JASS中对应的变量类型实际上是integer。
可以用单引号'Xxxx'(Xxxx为在World Editor用View as raw data(以行数据查看)中看到的代码)表示这些类型的值

Jass基本变量类型
integer
integer(数值)是的范围在 -2147483648 和 2147483647 之间的整数, 不能有小数位
在Jass中Integer的几中特殊形式:
1.'xxxx' 单引号加字符形式,该形式为256进制整数,每个字符代表其AscII码值,区分大小写,一般用来表示单位、物品、技能等代码。比如对战单位里剑圣的代码是 'Obla'(在物编中按Ctrl+D可以看到)
2.0xxx 8进制数字,首位为0表示8进制数字
3.0Xaa 16进制数字,以0x开头的表示16进制数字
real
real是范围很大的32字节数字, 可以有小数位, 123456.33就是real
小数点前或后是0的话,可以省略这个0;比如0.34=.34  4.0=4.   0.0可以写成0.或.0,但不能都省略
boolean
boolean的值只有true(真)和false(假), 多用于条件判断语句
if (条件==true)
then
  (符合条件做某事)
else
  (不符合条件就做另一件事)
endif
string
string是字符串变量, 可以是null(空值). 注意Jass的字符串是大小写区分的, 赋值时用双引号 "" 引用
handle
handle句柄, 可以是null(空值). 是用于指向Warcraft III定义的数据结构的指针. 比如上表中的location/player等除了integer/real/boean/string外的的变量实际上就是handle类型的子变量
code
code(程序代码), 可以是null(空值). 函数可以有code类型的传递参数, 表示该函数必须要有其他函数作为参数, 如:
function RunFunctionForAllPlayers takes code theFunction returns nothing
我们可以这样调用函数: call RunFunctionForAllPlayers(function someFunction) //先运行someFunction
也可以: call RunFunctionForAllPlayers(null) //不运行其他函数

用户定义变量类型
正如上面所说, 上表中location/player等除了integer/real/boean/string外的类型实际上就是handle类型的子类型, 这些变量就是用户类型变量, 实际就是一个数据结构的指针.
数组
是指一组同类型的有序列的变量. 数组中包含的元素可以用[n]来指明(n 表示第n + 1个元素, 从 0 算起).
以上所说的变量类型中除了code类型, 其他类型的变量都可以定义数组变量, 如
locate integer array dropitems
set dropitems[0] = 'Xxxx'
......
set dropitems[18] = 'Xbbb'
dropitems[18]指dropitems中第19个变量.
注意:
1) 数组所有元素初始值是"空", 比如integer类型的数组初始值为0, handle类型初始值的为null
2) 数组不能直接再次初始化, 只能数组按元素赋值, 如:
locate string array playername = "Greedwind" //数组非法赋值
locate string array playername      //数组元素只能逐个赋值
set playername[1] = "Greedwind"
set playername[2] = "Greedwind's girlfriend"
     unit array myUnits
     unit array yourUnits
...
     set myUnits = yourUnits         // 非法
     set myUnits[0] = yourUnits[10]  // 合法
3) 数组在函数间不能互相传递. 即是不能把数组作为函数参数, 而且函数也不能返回数组类型的变量.
4) 数组元素域在 0 和JASS_MAX_ARRAY_SIZE = 8192 之间, 即是最多有JASS_MAX_ARRAY_SIZE + 1 个元素. JASS_MAX_ARRAY_SIZE是在common.j中定义的常数

常见问题
1)什么是全局变量和局部变量, 怎样声明和使用变量?
首先要了解, 从作用范围来区分, 变量有全局变量和局部变量.
全局变量作用于Jass程序的全部分, 即是如果全局变量abc在某个函数中改变了值, 这个值也将影响其他引用了abc变量的函数.
全局变量声明格式:
    globals
         变量类型 变量名称 = 初始值         //有初始化的全局变量
         变量类型 变量名称                  //无初始化的全局变量
         变量类型  array 变量名称           //数组全局变量, 不能再次初始化赋值
         ...
    endglobals
局部变量只作用于函数内部, 即是如果在函数内部定义了局部变量abc, abc的值只影响该函数内部, 不影响全局变量abc的值.
局部变量声明格式:
    local 变量类型 变量名称 = 初始值        //有初始化的局部变量
    local 变量类型 变量名称                 //无初始化的局部变量
    local 变量类型 array 变量名称           //数组局部变量, 不能再次初始化赋值
   
注意:
1) 不论是全局变量还是局部变量, 必须在程序开始部分首先声明.
    即是全局变量声明总是在程序文件的最前端,
    而局部变量声明总是在函数的最前面.
2) 在Trigger Editor用变量管理器(Ctrl + B)中定义的变量都是全局变量
3) 在Trigger Editor的循环GUI语句 For Loop (Integer A)和For Loop (Integer B)中的(Integer A)(Integer B)都是全局变量
实例:
globals
    integer abc = 5188
endglobals
.......
function myfunc1 takes nothing returns nothing
    local integer abc
    set abc = 1233
endfunction
function myfunc1 takes nothing returns nothing
    local integer myint
    set myint = abc
    set abc = 0
endfunction
如果按顺序调用函数myfunc1 和 myfunc1, 那么在函数myfunc2中的myint的值是多少呢, abc最终值又是多少?
答案是: int = 5188, abc 最终值为 0


2)怎样在Trigger Editor(GUI)中使用局部变量?
(有关在Trigger Editor(GUI)中使用局部变量详细方法请参看我的签名中的链接 - 3c的内存泄漏)
GUI中不能直接引用局部变量,但是我们可以使用全局变量作为中介

首先声明定义变量类型。声明定义变量类型的语句只能放在TIGGER的开头,不然会出现编译错误
声明定义变量类型:
要用:Custom Script - Action
语法:
Custom Script: local <变量类型> <变量名>

变量类型请参看WORLD EDITOR和JASS变量类型对应表
例如:
--单位变量
Custom Script: local unit u
--单位组变量         
Custom Script: local group g  

然后将它们赋值给临时全局变量就可以在GUI里调用该值了,注意全局变量要加前缀"udg_"
Custom Script: set udg_TempUnit=u

局部变量的使用:
在变量表(Control + B)中先定义好同类型临时变量(不要加前缀udg_)的变量,该变量可以在多个触发里重复利用
(在变量表中定义此变量是为了方便TIGGER EDITOR引用该变量。)
以下例子实现了在单位死亡的位置显示5秒的死亡信息(漂浮文字)
(象这种例子, 如果不使用用局部变量, 将无法准确销毁临时漂浮文字(-Destroy (diesmessage)). 因为在等待5秒后(-Wait 5.00 seconds), 最近创建的漂浮文字(last created floating text)可能已经不是原来的那个了 )
例子:
Events:
    A unit dies
Conditions:
Actions:
        -Custom Script: local texttag diesmessage
        -Custom Script: set udg_TempTextTag = diesmessage    //注意要添加"udg_"前缀
        -Floating Text - Create floating text at ((position of (Triggering Unit))
         with the message ((A+(name of (Triggering Unit))) + "dies") with size 20 , red 100, green 100, blue 0, alpha 100.
        -Set TempTextTag= (last created floating text)
        -Wait 5.00 seconds
        -Custom Script: set udg_TempTextTag = diesmessage
        -Destroy (TempTextTag)

注意:不要利用同名覆盖的方法在GUI中使用局部变量!(即以udg_开头的局部变量与已定义全局变量名字相同)
该方法在触发内该类同名变量数量>=2时会出现严重Bug!

Jass基础教程 第二章 语法篇
 
本章主要介绍Jass的语句和语法.
所有程序语言都是由特定的语句按语法规则组成, 基本和人类的自然语言没什么两样. 只是程序语言要有严谨的逻辑和语法, 而人类的语言可以是模糊不清不知所云的--就象我现在写的可以离题千里却蕴涵禅机, 让你费解一样.
1) 赋值语句: set
   在第一章中我们已经接触过很多 set 语句了, 就是把 = 号右边的值赋个左边的变量
    语法格式:
   
         set 变量 = 值(表达式)              // (A)
         set 数组变量[index] = 值(表达式)   // (B)
    (A)是非数组变量的赋值语句.
    (B)数组变量的赋值语句, 其中[]中的index是指第index + 1个数组元素, index必须是integer类型的非负整数(可以是 0 )
   
    右边表达式的数据类型必须和左边的变量类型一致, 意思是说不能这样: set 人类 = 猪
   
2) 调用函数: call
   用于调用函数. 当使用 call MyFunction(), 则运行了函数MyFunction
    语法格式:
     
  call 函数名(参数1, 参数2, ...., 参数n)
   
    ()号内的的用逗号(,)分割开的参数表. 如果被调用的函数要求输入参数, 则 call 语句中必须包含被调用函数要求输入参数类型相同数据类型或用空值.
    这句另人费解的话用人类的模糊语言来说就是:
        我(被调用的函数)要爱情(参数)才可以工作, 你(call 过程)就不要给我面包(传递的参数)
    这个是用Jass写的要爱情和面包但什么也不做而且还不高兴的空函数:
    function isHappy takes unit whichunit, item needbread returns boolean
        return false    //函数返回值为"假"
    endfunction
    这个是用Jass写的总是高兴傻笑的空函数:
    function IamAlwaysHappy takes nothing returns boolean
        return true //函数返回值为(真)
    endfunction
   
    在函数中isHappy()要求传递2个参数, 参数数据类型分别是unit和item
    而函数IamAlwaysHappy()没有要求传递任何参数, 就不要多此一举给它爱情和面包了
   
    假设girl是unit类型变量, bread是item类型变量. 我们可这样调用:
    call isHappy(girl, bread)   //给了爱情又给面包, 真是贴心人啊
    call isHappy(null, bread)   //不给爱情只给面包, 不要饿死他
    call isHappy(girl, null)    //给爱情不给面包, 为了爱情故, 我把面包抛
    call isHappy(null, null)    //两者皆不给, 反正给了也返回"假"值
    call IamAlwaysHappy()       //IamAlwaysHappy()没有要求任何参数
   
    //把PickaGirl()返回的值(unit类型或null)作为参数
    call isHappy(PickaGirl(), null)

    以下非法调用
    call isHappy()              //非法调用
    call isHappy(girl)          //非法调用
    call IamAlwaysHappy(girl)   //非法爱情(不要给我二奶)
3) 条件分支: if then else
  
  此语句效果就是: 如果条件成立, 那么做某事, 否则做另一件事
    语法格式:
            if 条件表达式1 then
                语句
                    语句
              ...
             elseif 条件表达式2 then
                语句
                    语句
              ...
             elseif 条件表达式3 then
             ...
             else
                语句
                    语句
              ...
             endif
   
    其中条件表达式必须是布尔型(boolean)的值(真true和假false).
   
    这是某人的论坛签名JASS版, 他企盼着当他进入论坛时就....
    事件:单位进入论坛时
    if GetTriggerUnit() == 他 then
        call CreateNUnitsAtLoc( 1, GetUnitTypeId(美女),
                GetOwningPlayer(GetTriggerUnit()),
                GetUnitLoc(GetTriggeringUnit()), bj_UNIT_FACING )
    else
    endif
   
4) 循环语句 loop 和循环退出语句 exitwhen
    loop 是执行循环的语句, exitwhen 则是控制循环退出的条件
    语法格式:
    loop
        exitwhen 条件表达式 //(A)在循环语句执行前检查循环条件
        ....   
    endloop
    或
    loop
        ....   
        exitwhen 条件表达式 //(B)在循环语句执行后检查循环条件
    endloop
    同样的, 条件表达式必须布尔型的值
   
    (A)和(B)的差别相当于先买票再猴戏和看玩猴戏再給钱
   
    loop 语句可以不用exitwhen. 在没有exitwhen和return语句的情况下, loop ... endloop将成为永久循环(也称死循环), 一般应该避免死循环的产生.
   
    例:
   
    在Trigger Editor的GUI语句有: For Loop (Integer A) 的语句, 如
   
    For each (Integer A) from 1 to 10, do (Set unit_temp[(Integer A)] = 恐龙)
   
    转化成Jass就是:
    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = 10
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        set udg_unit_temp[bj_forLoopAIndex] = 'A001'
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop

5) 函数返回语句: return
    当执行到 return 语句时, 退出此函数, 程序运行点将返回到该函数的调用点.
    语法格式:
   
    return              //(A)
    或
    return 表达式       //(B)
   
    如果函数声明中没要求返回值, 则用(A), 如:
        function Iwanteverthing takes unit whichunit returns nothing
            return  //上面函数定义中为returns nothing, 即是没要求返回值
        endfunction
    如果函数声明中要求返回值, 则用(B). 注意, 返回值类型必须和函数声明中要求返回值类型一致.即是声明中要求返回美女, 执行函数后就不能返回恐龙.
        function IamAlwaysHappy takes nothing returns boolean
            return true //函数定义要求返回布尔型的值
        endfunction

常见问题
1) 本教程的表达式是指什么?
    表达式可以是直观可见的值, 如:
        数值型/真值型:  1, 3, 5565.33, ........
        字符串: "Xasfsfs", "Greedwind", ........
        布尔型: true, false
        单位: 'A001', 'Obla', ....
        ........
    也可以是函数, 计算式等, 如
        return GetTriggeringUnit()  //返回触发单位
        
        //将触发单位所在点赋值給udg_loc
        set udg_loc = GetUnitLoc(GetTriggeringUnit())
        
        return a + b    //返回 a + b 的值

2) Jass 有那些操作符?
    数学计算:
        +       加
        -       减
        *       乘
        /       除
        
    比较符号:
        >, <, >=, <=        分别是大于,小于, 大于等于, 小于等于
        ==                  等于
        !=                  不等于
        
        注意: 双=号(==)才是比较, 单=号是赋值, 不要搞错了!!!
    布尔条件
        and         条件和
        or          条件或
        not         否定条件
        
        使用:
        //条件表达式1和2都是true, 则下式为true, 否则下式为false
        条件表达式1 and 条件表达式2     
        //在条件表达式1或2中只要有一个是true, 则下式为true
        条件表达式1 or 条件表达式2
        //不是表达式的值, 如 return (not true)则返回false
        not 表达式
    字符串操作符
        +           字符串叠加, 如"Greed" + "wind"的结果"Greedwind"
3) Jass里还有什么特殊用途的字符和字串?
    //      注释, 以 //开头的语句将不执行
    ()      函数参数列表, 如 call myfunction()
    []      数组元素标记, 如 myarray[0]
    ""      字符串引用符, 如 "I love Greedwind"
    ''      单位/物品/技能代码引用符号, 如 'A001', 'Hpal'
            注意: Jass中可以用单引号括起4个字母表示数值型的值(integer)
    \       跳脱符号(与Java/C一样),
            如: 在字符串里使用双引号 set mystring = "This is a \"string\""
            mystring 的值实际上是: This is a "string"
            如果直接 set mystring = "This is a "string"" 将出错
            因为""是字符串引用符
    0       用于数字前面, 则表示八进制的数, 如 016
    0x      用于数字前面, 则表示十六进制的数, 如 0x1FA0

Jass基础教程 第三章 函数篇
 
如果你仔细读完并读懂前面两章, 应该对Jass函数并不陌生了. 也许我在前两章写的太过综合紧凑, 所以写到这觉得没什么好写了. 不管怎样, 还是需要进一步深入了解Jass函数规范和注意事项.

注意, 在此章中不是教你动手写Jass函数, 而是让你基本可以读懂别人写的Jass脚本-->如果你英文足够好而且不傻(这是Jass中布尔并立条件, 上一章提到过).
可以在Trigger Editor中把一些简单的触发器(Trigger)转化成自定义脚本, 因为事先知道程序逻辑, 这样读起来也比较容易.

1)函数定义要素
   
语法格式
   
        function 函数名 takes 参数表 returns 返回类型
            局部变量声明
            局部变量声明
             ...
             表达式
             表达式
             表达式
             ...
             return 返回表达式
        endfunction
   
其中:
       a) 定义函数的关键字有: function ... endfunction, takes, returns
        b) 函数名的首个字母不能是数字, 函数名中不能有第2章中所说的操作符, 特殊字符和多数非字母符号(如: 空格~`!@#$%^&*()-+=|\{}[];:'"<>?,./), 也不能使用中文. 函数命名要尽量简明易懂, 突出函数功能.
        c) 参数表是规定传递入函数的数据类型和参数数量, 作用是函数间的数据交换(输入), 参数之间用逗号( , )分开. 不能定义数组作为参数, 这点在的第一章已经做了说明.
           参数必须规定数据类型或者是无参数, 如
                function myfunction1 takes nothing returns nothing
                endfunction
               
                function myfunction2 takes integer creatnum, unit myunit returns boolean
                    call CreateNUnitsAtLoc(creatnum, GetUnitTypeId(myunit), Player(1),
                         GetUnitLoc(GetTriggeringUnit()), bj_UNIT_FACING )
                    return true
                endfunction
            myfunction1为无参数的函数, 调用时不需要传递参数, 即是用 call myfunction1()
            myfunction1为2参数函数, 参数类型规定为 integer 和 unit. 调用myfunction2时必须同时传递数据类型分别integer和unit的参数, 或者传递入空值(参看第二章的举例).
            注意: 数字的空值为 0, handle(句柄)类型及其子类别的空值为 null. 关于handle类型请参看第一章. 我在本章背后会列出各数据类型所对应的空值.
        d) 返回类型是规定函数返回的数据类型, 作用同样是函数间的数据交换(输出), 可以用returns nothing 说明没有返回参数
        e) 局部变量声明必须写在函数开始部分. Jass总是先声明, 再使用. 如:
                function myfunction3 takes nothing returns nothing
                    local integer i = 5
                    local integer j = 10
                    call myfunction2(i,美女 )
                    sleep(360)
                    call myfunction2(j,美女 )
                endfunction
         
  下面的函数是错误的:
                function myfunction3 takes nothing returns nothing
                    local integer i = 5
                    call myfunction2(i,美女 )
                    local integer j = 10
                    sleep(360)
                    call myfunction2(j,美女 )
                endfunction
     
   f) 表达式是函数的骨干, 是逻辑的实现部分. 写好这部分, 需要对common.j, blizzar.j,commond.ai有一定的了解.
        g) 返回表达式的值必须和该函数声明时的返回类型一致, 不要声明返回为恐龙类型, 却偷梁换柱返回个美女. 返回值不能是数组.
2) 程序执行入口函数
    每个Jass脚本文件都需要定义执行程序的入口函数
    在触发器脚本文件war3map.j中, config()和main()是入口函数.
    config()函数作用是在开始游戏之前初始化地图, 如按设计时指定点放置单位/可破坏物,初始化单位状态等.
    main()函数在游戏开始才执行.
    在AI脚本文件中, 用户需自定义main()函数作为该脚本文件的程序入口.
    脚本文件执行入口函数的固定格式:
        function main takes nothing returns nothing     //触发器和AI脚本均使用
        function config takes nothing returns nothing   //触发器脚本使用
    注意: 一张地图中只能有1个触发器脚本文件war3map.j, 此文件包含在w3m或w3x中
          一张地图中可以包含多个AI脚本文件, 输入AI脚本文件的目录为: \scripts\

常见问题
1) 什么是空值? 不同数据类型的空值是什么?
    当变量声明时, 如果在声明语句中不直接赋值, 则该变量的初始化值为空值, 表示没有赋值. 如:
        local unit myunit
    在上句声明中, myunit没有直接赋值, 那么myunit在声明后值是null
   
    以下是数据类型的空值对应表

WORLD EDITOR和JASS变量类型对照表:

World Editor
变量名
Jass变量类型空值
Boolean boolean 布尔型(用于真/假判断)false
Destructible destructable 可破坏物null
Dialog dialog 对话null
Dialog Button button 按钮null
Floating Text texttag 漂浮文字null
Integer integer 数值0
Item item 物品null
Leaderboard leaderboard 排行榜null
Player player 玩家null
Player Group force 玩家组null
Point location 位置(点)null
Real real 真值型数字null
Region rect 地区0
Special Effect effect 特效null
String string 字符串null
Terrain Deformation terraindeformation 地形null
Timer timer 计时器null
Timer Window timerdialog 计时器窗口null
Unit unit 单位null
Unit Group group 单位组null
Player Score playerscore 积分(1.13版新类型)null
无冕之王
 楼主| 发表于 2009-6-5 11:15:53
由上表可以看出, 除了integer, real的空值为 0 和 boolean 的空值为false以外, 其他数据类型的空值都是null. 原因很简单: 除了integer, real, boolean外, 其他数据类型都是handle(句柄)的子类型, handle类型的空值为null, 它的儿子们也跟着null到底了.
2) 什么是common.j, Blizzard.j, common.ai?
    这3个文件都是支持War3 Jass的公共库文件, 文件里面包含和声明了所有(几乎是所有)Jass可以调用的函数和全局变量.
    common.j 是最基础的API库文件, 在Trigger Jass和AI Jass中都可以调用.
    Blizzard.j 包含使用Trigger Editor时生成的Trigger Jass中经常调用的库函数/全局变量, 实际上是基于common.j写的子函数. Blizzard.j只能在Trigger Jass中调用.
    common.ai 只能在AI Jass中调用, 它有AI中需要使用的函数和全局变量.
    注意: 在Trigger Jass中, 不能调用common.ai中的函数和全局变量; 同样地, 在AI Jass中, 也不能使用Blizzard.j的函数和全局变量.
   
3) 如何获得最新的common.j, Blizzard.j, common.ai?
    在war3.mpq/war3x.mpq/war3patch.mpq都有common.j/Blizzard.j/common.ai, 要获得最新版本的文件, 可以用WINMPQ打开war3patch.mpq, 在WINMPQ右上方的输入框中输入: scripts\* ,如果你的war3patch.mpq没有"加密"过, 那么可以找到这3个文件. 如果是"加密"过的, 则需要把war3patch.mpq的文件全部解压到临时目录, 然后用Ultra-Edit中的在文件中搜索字符的功能寻找这3个文件.
   
4) 可以在自己的地图中使用自定义的common.j, Blizzard.j, common.ai吗?
    可以. 用输入管理器输入自定义的common.j, Blizzard.j, common.ai, 输入目录应为\scripts\. 这样, 运行地图中的脚本时, War3就不会到war3patch.mpq寻找这3个文件了而直接从地图中的\scripts\目录调用. 这样做的好处就是可以使库文件的同步一致. 通常, 版本相同的WAR3, 其库文件也相同, 所以多数时候不需要在地图中输入这3个文件. 但如果你更改了这3个基本文件来支持你的Jass, 或者确保为了库文件的一致性, 便可以在地图中输入基础库文件.
   
5) 怎么解读公共库文件(common.j, Blizzard.j, common.ai)的函数/全局变量?
    Blizzard对函数/全局变量的命名是相当规范简明易懂的(当然需要一定的英文基础), 它定义的函数/全局变量的名基本上是英语语句. 我举些例子:
   
        native CreateUnit takes player id, integer unitid, real x, real y, real face returns unit
    本地函数CreateUnit() 即是Create Unit, 意思为创建单位, 从参数表(takes 和 returns之间的声明)来看, 这个函数需要输入玩家, 单位编码, 坐标x, 坐标y, 方向角度, 返回值是单位类型变量.
    从函数的名字和参数表, 可以猜测/确认CreateUnit()是用来在地图的x/y坐标中为指定玩家创建指定单位, 并且使创建单位面向所定义的角度, 返回值是创建单位.
    在地图入口函数main()中, CreateUnit()被大量调用, 用来重现地图设计时用WORLD EDITOR(GUI)放置的单位.
    注意: 就如前面所说过, integer可以用单引号括起4个英文字母/数字来表示. 所以CreateUnit()中integer unitid参数可以用 'Xxxx'来表示. 如:
        set u = CreateUnit( Player(5), 'ndgt', -2944.0, -3136.0, 270.000 )
    上句意思是为玩家5在地图坐标(-2944.0, -3136.0)中创建编码为'ndgt'的单位, 并使创建单位面向角度为270度, 然后把创建单位保存在变量u中.
   
   总结下Blizzard函数名/全局变量名的规律:
        a) 前坠Get           取得某属性, 此类函数一般有返回值
        b) 前缀Set           设置某属性
        c) 前缀Is              是否判断, 此类函数返回类型都是boolean, 返回true或false
        d) 中间有2            数据类型转化函数, 如S2I(), I2R, I2S()等
        e) 有Item/Unit/...  肯定是与物品/单位/...相关的函数
        f) 后缀BJ               此函数肯定是在Blizzard.j中定义的, 不能在AI中使用.
        g) 前缀bj_             在Blizzard.j中定义声明的全局常量(常量是指定义并赋值后不能再改变的值)
        h) 前缀Create        创建
        i)  前缀Remove      移除
        k) 全部大写           在common.j中定义声明的全局常量
6) 实用问题: 如何创建外观随机可变的地图?
    上面说过, main()是地图入口函数, 在main()调用了一些再现地图设计时原貌的子函数如CreateAllUnits(). 因此, 我们可以在CreateAllUnits()中加入随机函数GetRandomInt()来控制单位/物品/可破坏物等初始化过程.
    我们可以用WINMPQ打开要修改的地图, 提取war3map.j来修改main()函数及其相关函数. 修改完war3map.j后, 再用WINMPQ导入修改后的war3map.j.
   
    a) 函数修改/增加方法:
   
    这是3C地图中的CreateAllUnits()函数
        function CreateAllUnits takes nothing returns nothing
            call CreateNeutralPassiveBuildings()    //用户自定义函数
            call CreatePlayerBuildings()            //用户自定义函数
            call CreateNeutralHostile()             //用户自定义函数
            call CreateNeutralPassive()             //用户自定义函数
            call CreatePlayerUnits()                //用户自定义函数
        endfunction
    注意: CreateAllUnits()也不是库函数, 是用户自定义函数):
   
    我们可以根据CreateAllUnits()创建另一个函数:
        function CreateAllUnitsRandom takes nothing returns nothing
            // randomint 是 1,2,3中的随机数
            local integer randomint = GetRandomInt(1, 3)   
            call CreateNeutralPassiveBuildingsRandom(randomint)
            call CreatePlayerBuildingsRandom(randomint)
            call CreateNeutralHostileRandom(randomint)
            call CreateNeutralPassiveRandom(randomint)
            call CreatePlayerUnitsRandom(randomint)
        endfunction
        
    因为原来调用的函数都是无参数函数, 所以相应的函数应该做些修改, 如:
        //创建玩家单位, 以CreatePlayerUnits()为蓝本增加新函数
        function CreatePlayerUnitsRandom takes integer randomint returns nothing
            //此函数以CreateUnitsForPlayer0为蓝本增加新函数
            call CreateUnitsForPlayer0Random(randomint)
            ......
            
        endfunction
        
        //创建中立敌对单位
        //此函数以CreateNeutralHostile为蓝本增加新函数
        function CreateNeutralHostileRandom integer randomint returns nothing
            local player p = Player(PLAYER_NEUTRAL_AGGRESSIVE)
            local unit u
            local integer unitID
            local trigger t
            local real life
        
            //加入条件控制, 根据随机数创建不同单位组合.
            if randomint == 1 then
                //可掉宝物的单位
                set u = CreateUnit( p, 'nC26', -6533.2, 445.1, 220.680 )
                set t = CreateTrigger(  )
                call TriggerRegisterUnitEvent( t, u, EVENT_UNIT_DEATH )
                call TriggerRegisterUnitEvent( t, u, EVENT_UNIT_CHANGE_OWNER )
                call TriggerAddAction( t, function Unit000012_DropItems )
               
                //不掉宝物单位
                set u = CreateUnit( p, 'nelb', -373.5, 3533.4, 44.518 )
                set u = CreateUnit( p, 'nomg', -233.6, 3436.2, 140.871 )
            elseif randomint == 2 then
                //不掉宝物单位
                set u = CreateUnit( p, 'a001', -373.5, 3533.4, 44.518 )
                set u = CreateUnit( p, 'a002', -233.6, 3436.2, 140.871 )
            else               
                ......
            endif           
        endfunction
               
        别忘了修改main()
        function main takes nothing returns nothing
            ........
            //call CreateAllUnits()     //原版的单位初始化函数, 不再使用
            call CreateAllUnitsRandom() //使用新的单位初始化函数
            ........        
        endfunction
        
   
    b) 初始设置复制方法:
    问题的关键就是, 这么多初始单位, 怎么样修改起来不累人?
    这里介绍一种方法:
        1. 先把要修改的地图复制
        2. 修改复制地图初始单位的类型/位置/宝物等, 删除所有TRIGGER, 并保存
        3. 用WINMPQ打开复制地图, 提取war3map.j
        4. 复制war3map.j中对应函数中创建单位的语句
        5. 把复制的语句粘贴在原地图中相应函数的适当位置
        6. 重复1-5, 复制更多的随机初始化设置
        
    注意: 如果用World Editor再次修改并保存, main()将使用GUI默认生成的call CreateAllUnits(), 而不是call CreateAllUnitsRandom(). 此时还需要打开war3map.j修改main()函数.
   
    同样, 使可破坏物等初始设置有随机变化也可以用此方法.
Jass基础教程 第四章 库函数

 
这章是Jass基础教程中最难的部分, 也是最实用的部分.
Jass的关键字有26个, 跟英文字母一样多. 我们来回顾一下:
    and, array, call, constant, else, elseif, endfunction, endglobals,  endif, endloop, exitwhen, extends, function, globals,  if, local, loop, native, not, or, return,  returns, set, takes, type, then
以此看来, Jass是语法结构最简单的一种准计算机语言. Jass实现功能基本依靠调用common.j, blizzad.j, common.ai中的库函数.

本章所述内容不属于Jass语法部分, 最主要讲述:
   触发器(Triggers)                                
    跨脚本通讯(Inter-Script Communication)         
    队列(Enumerations)                              
    队列过滤器(Filters)                             
    线程(Threads)                                   
   
1) 触发器(Triggers)
    触发器用于地图触发器脚本(Trigger Jass), 用于响应特定事件. 它是种响应信号(callback), 触发器不能应用于AI, 即是说AI Jass中不能有触发器的语句.
    触发器包含创建触发器, 设置触发条件, 设置动作.  
   
    a)创建触发器
       触发器的数据类型为trigger(触发器), 是handle(句柄)的子类型.
        
        创建触发器的函数在common.j中的声明:
            native CreateTrigger takes nothing  returns trigger
        
        参数:
            nothing         //无参数
        返回:
            trigger         //返回创建的触发器
        
        使用格式:  set 表达式 = CreateTrigger()
        其中表达式是trigger类型的变量
        新数据类型:
            trigger类型: 是handle的子类型, 用于调用和处理触发器
            
    b)触发事件
        触发事件的数据类型为event(事件). 可以引起触发响应的触发器必须先在游戏中注册触发事件, 用于监视游戏事件发生.
        注册触发事件的函数在common.j中的声明:
            native TriggerRegister*Event takes
                    trigger whichTrigger, ... returns event
        函数名:
            根据事件对象的不同, 有不同的事件响应. TriggerRegister*Event中的 * 号为对象名, 如: TriggerRegisterUnitEvent, TriggerRegisterEnterRegion 等, 注册不同对象的事件要求传递相应指定对象作为参数, 有些事件注册要求传递下面所说的过滤器(Filters)
       参数:
            trigger whichTrigger    //触发器变量
            ...                     //相应指定对象的变量
        返回:
            event                   //返回该事件
        
        使用方法(举注册单位事件的例子):
            call TriggerRegisterUnitEvent(哪个触发器, 哪个单位, 哪种类型的单位事件)
        
        新数据类型:
            event       //事件
            
    c)触发条件
        触发条件是一组布尔表达式(boolexpr)数据, 它的数据类型为条件函数(conditionfunc), 是布尔表达式(boolexpr)类型的子类型.
        
        建立触发条件的函数在common.j中的声明:
            native Condition takes code func returns conditionfunc
        
        参数:
            code func       //函数代码作为参数
        返回:
            conditionfunc   //返回建立的条件
        其中takes code func是指需要函数代码func作为参数, 参数函数 func 必须的声明格式必须是: takes nothing returns boolean. 即是说, 用作参数的函数本身应该是无参数且返回值为布尔型(boolean).
        使用格式:  set 表达式 = Condition(function 布尔型函数名)
        其中表达式是条件函数(conditionfunc)
        
        新数据类型:
            boolexpr            布尔表达式
            conditionfunc       条件函数, 是布尔表达式的子类型
        
        比如:
   
            function Girl1 takes nothing returns boolean
                ...
                return true
            endfunction
            function Girl2 takes integer i returns boolean
                ...
                return true
            endfunction
            
            function Girl3 takes nothing returns nothing
                ...
                return
            endfunction
            // 假设 c 为conditionfunc类型变量
            set c = Condition(function Girl1)   //(A)
            set c = Condition(function Girl2)   //(B) 本身要求参数
            set c = Condition(function Girl3)   //(C) 返回值不是boolean类型
            
        解释: Girl1() 是无参数且返回为boolean的函数, 可以用作 Condiction() 中的参数函数code func. 而Girl2() - 本身要求参数, Girl3() - 返回值不是boolean类型, 所以(B)(C)函数不可作为Condiction()的参数.
            
       在第一章变量篇中我没有详细说明code类型的数据, 因为怕读者不能理解. 现在我说明下code类型数据. 我们用例子说明, 比如:
            call myfuction1(IsGirl())           //(A)
            call myfuction2(function IsGirl())  //(B)
        (A)和(B)之间有什么不同呢? 按我的理解: (A)(B)都把IsGirl()运行返回后的值当作myfunction1()/myfunction2()的参数. IsGirl()在(A)中是一次性的处理过程. 而(B)是创建了一个运行IsGirl()逻辑的监视线程, 只要线程没给清除/终止, IsGirl()将一直监视变化. 注意这里所说的线程跟下面要说的AI线程是两码事.
        
    d) 增加触发条件:
        触发条件可以用TriggerAddCondition()增加
        增加触发条件的函数在common.j中的声明:
            native TriggerAddCondition takes trigger whichTrigger,
                    boolexpr condition returns triggercondition
        
            参数:
                trigger whichTrigger    //触发器变量
                boolexpr condition      //触发条件变量
            返回:
                triggercondition        //返回该触发条件的handle(句柄)
               
        使用格式:
            set tc = TriggerAddCondition(触发器, 触发条件)
            其中 tc 为triggercondition类型变量
            
       新数据类型:
            triggercondition        触发条件句柄
        
        (注意: 触发条件和上面要说的触发事件是不一样的!!!)
        
        例:
            这是增加/移除/改变触发条件的例子
            
            //文件头声明个全局变量tc
            globals
                ...
                triggercondition    tc  = null
                trigger             mytrigger = null
                ...
            endglobals
            function Girl takes nothing returns boolean
                ...
                return true
            endfunction
            function notGirl takes nothing returns boolean
                ...
                return false
            endfunction
            //为 mytrigger 增加触发条件
            function addcondition takes nothing returns nothing
                ...
                set mytrigger = CreateTrigger()
                set tc = TriggerAddCondition(mytrigger, Condition(function Girl))
                ...
            endfunction
            
            //因为tc是mytrigger触发条件的句柄, 把tc清空便清除了指向的触发条件.
            function removecondition takes nothing returns nothing
                ...
                set tc = null
                ..
            endfunction
            
            //改变 mytrigger 的触发条件
            function modifycondition takes nothing returns nothing
                ...
                set tc = null       //先把原来的触发条件移掉
                set tc = TriggerAddCondition(mytrigger, Condition(function noGirl))
                ...
            endfunction
   e)触发器动作
       触发器动作是当指定事件发生并符合触发条件的执行的语句.
        增加触发器动作的函数在common.j中的声明:
            native TriggerAddAction takes trigger whichTrigger,
                              code actionFunc returns triggeraction
        
        参数:
            trigger whichTrigger    //触发器变量
            code actionFunc         //执行函数
            
            注意: 执行函数必须是无参数无返回值(takes nothing returns nothing)的函数
        返回:
            triggeraction           //触发动作
        
        新数据类型:
            triggeraction           //触发动作, handle字类
        
    把有关触发器主要函数糅合在一起, 我们来看个例子, 研究下触发器是怎么创建的:
            
        //文件头声明全局变量mytrigger
        //假设mytrigger是监视单位死亡事件的触发器
        globals
            ...
            trigger             mytrigger = null
            ...
        endglobals
        
        //判断是否掉物品
        function isDrop takes nothing returns boolean
            local boolean conditcion
            ...
            if conditcion = true then
                return true
            else
                return false
            endif
        endfunction
        
        //掉物品
        function DropItems takes nothing returns nothing
            //获得触发单位
            local unit trigUnit = GetTriggerUnit()
            ....   
            call UnitDropItem( trigUnit, 'IC21' )
            ...
        endfunction
        
        function ThisIsMyTrigger takes nothing returns nothing
            local unit u
            
            //在-5630.5, -4723.1坐标为玩家5创建单位'n00I', 面向90.260度
            set u = CreateUnit(Player(5), 'n00I', -5630.5, -4723.1, 90.260 )
            
            //创建触发器(相当于mytrigger的初始化)
            set mytrigger = CreateTrigger()
            
            //为mytrigger注册触发器事件, 让游戏系统监视所创建单位u的死亡事件
            //EVENT_UNIT_DEATH是common.j中定义的常量
            call TriggerRegisterUnitEvent( mytrigger, u, EVENT_UNIT_DEATH )
            
            //为mytrigger增加触发条件
            //isDrop是无参数返回为布尔值的函数
            set tc = TriggerAddCondition(mytrigger, Condition(function isDrop))
            
            //为mytrigger增加触发器动作 - 掉宝物
            //DropItems是无参数无返回值的函数
            call TriggerAddAction(mytrigger, function DropItems )   
            ...
        endfunction
   
    可以看出, 创建触发器顺序是:
        1. 触发器初始化 - CreateTrigger()
        2. 触发器事件注册 - TriggerRegister*Event()
        3. 定义触发条件(可选) - TriggerAddCondition()
        4. 触发器动作   - TriggerAddAction()
   
    注意:
        1. 创建触发器必须先用CreateTrigger()初始化.
        2. 没有注册事件的触发器只是个处理过程, 不会响应事件执行程序
        3. 触发器可以不加触发条件, 因为可以用触发动作调用的函数来控制逻辑.
2)线程(Threads)
    (这部分属于AI部分, 作为入门者做一般性了解就行了, 因为AI都是纯JASS写的, 也没有真正好的AI EDITOR. 本人也对此一知半解, 关于AI的文章也不多, 没什么好参考的.)
   
    线程只应用于AI脚本(AI JASS), 不能用于触发器脚本(Trigger Jass). 通常, 当AI脚本开始运行时只创建一个线程, 创建更多的线程可以用comman.j的本地函数:
        native StartThread takes code func returns nothing
   
    调用 call StartThread(function myfunc) 将创建一个从函数myfunc开始执行的线程.
    每个玩家最多可以拥有6个线程, 包括一开始执行的主线程. 当一个玩家有6个线程数时, 调用StartThread()的语句将被忽略. 线程不能回收, 当你为某玩家创建了5个自定义线程, 将无法为该玩家创建更多的线程.
    当新线程创建时, 线程立即生效. 当线程让步执行时, 创建此线程的父线程将继续执行.
    在同一玩家中的所有线程都共享全局状态(包括变量). 即是修改某个全局变量, 修改后的值在此玩家的所有线程中都是可见的.
   
    线程在以下的情况让步执行, 返回父线程
    a) 当线程中的操作码(opcode)超出限制, 线程会自动休眠 1 秒
    b) 当线程中用使用 Sleep(n), 线程将休眠 n 秒, 然后继续执行.
   
    线程在以下情况会中止, 返回父线程
    a) 如果 call StartThread(null)中, 线程中止
    b) 当线程的主函数返回, 线程中止.
       (StartThread()中之间调用的函数就是主函数.)
    c) 当线程中使用没有声明的变量, 线程中止. 在使用之前, 变量必须声明.
    d) 当线程中出现零为被除数时, 线程中止
    e) 线程主函数出现语法错误.
   
    注意: 虽然AI脚本可以使用大部分common.j的库函数, 但有些类型的函数在AI不能正常工作, 如:
    a) 返回字符串类型(string)的本地函数, 如I2S(), SubString()等
    b) 需要以code, trigger, boolexpr 等类型数据为参数的本地函数, 如触发器函数, 队列函数(ForGroup, 等)
   
    注意: AI中不可以使用Blizzard.j的函数, 触发器中也不可以使用common.ai的函数, AI和触发器都可以使用common.j的函数(当然, 对于AI, 还受上面所说的限制)
   
    common.ai和common.j是写AI时可以调用和参考库文件, 要研究AI, 先去读这2个文件.
3) 跨脚本通讯(Inter-Script Communication)
    在游戏中, 可能会有多个独立的Jass脚本文件同时运行. 比如在对战地图中的游戏, 运行触发器脚本文件的同时, 也可能运行了每个电脑玩家的AI脚本文件. 每个脚本文件之间的全局变量不是共享的. 所以, 一个电脑玩家的AI脚本中设置的全局变量不会影响另一个电脑玩家的AI脚本的执行.
   
    触发器脚本也不可以和AI脚本共享全局变量. 但可以用传递命令的方法进行脚本之间的数据交换. 命令由一对数值型数据(integer)组成: 命令值(command value)和数据值(data value).
   
    从触发器脚本向AI脚本发出通讯命令, 可以使用common.j中定义的以下本地函数:
        native CommandAI takes player num,
            integer command, integer data returns nothing
        
        参数:
            player num              //玩家
            integer command         //命令
            integer data            //命令数据
   
    以下是AI中使用的common.j函数, 注意: 每个电脑玩家都会有独立的AI脚本, 所以, 以下函数都没有要求玩家作为函数参数.
   
    每个电脑玩家都有命令堆来堆放接受到的命令. 想知道有多数个命令堆放在命令堆, 可以用下面的函数:
        native CommandsWaiting takes nothing returns integer
        
        参数: 无
        返回: 命令堆的命令数(integer)
        
    获得存放在命令堆中最顶端的命令():
        //返回命令
        native GetLastCommand takes nothing returns integer
        
        //返回命令数据
        native GetLastData takes nothing returns integer
        
    上面2个函数都不会移除命令堆中的命令, 要移除堆中的命令, 可以用:
        native PopLastCommand takes nothing returns nothing


4) 队列(Enumerations)
    虽然JASS不能自定义数据结构(因为JASS缺少指针操作符), 但API库中提供了一些实现队列操作的函数. 如一组单位为单位组(group), 一组玩家为势力(force), 虽然一组可破坏物没有明确定义它的数据类型, 但也可以用API函数来操作.
   
    单位组和势力的操作函数很类似.
   
    单位组处理函数
        // 初始化单位组
        native CreateGroup takes nothing returns group
        
        // 在指定单位组中增加指定单位
        native GroupAddUnit takes group whichGroup, unit whichUnit returns nothing
        
        // 在指定单位组中移除指定单位
        native GroupRemoveUnit takes group whichGroup, unit whichUnit returns nothing
        
    势力处理函数
        // 初始化势力
        native CreateForce takes nothing returns force
        
        // 在指定势力中增加指定玩家
        native ForceAddPlayer takes force whichForce, player whichPlayer returns nothing
        
        // 在指定势力中移除指定玩家
        native ForceRemovePlayer takes force whichForce, player whichPlayer returns nothing
    JASS不能直接操作队列里面的元素, 它是通过callback类型的函数来实现对队列的操作:
        // 对指定单位组中的每个单位都运行指定callback函数callback
        // (对应GUI语言的For Each Unit in <Group>)
        native ForGroup takes group whichGroup, code callback returns nothing
        
        // 对指定势力中的每个玩家都运行指定callback函数callback
        // (对应GUI语言的For Each Player in <Force>)
        native ForForce takes force whichForce, code callback returns nothing
        
        输入上面两个函数的callback函数必须是无参数无返回值函数(takes nothing returns nothing)
        
    同样, 操作可破坏物也可以用在区域内的可破坏物作为队列, 可以以用类似的方法:   
        // 在指定区域r内符合指定过滤器filter的都运行指定callback函数actionFunc
        // (过滤器见下节的讲解)
        native EnumDestructablesInRect takes rect r,
                boolexpr filter, code actionFunc returns nothing
   
    在callback函数, 可以用下面的函数获得队列中的下一个元素:
        // 获得单位组中的下一个单位
        // (对应GUI语言的Pick Every Unit in <Group>)
        constant native GetEnumUnit         takes nothing returns unit
        // 获得势力中的下一个玩家
        // (对应GUI语言的Pick Every Player in <Force>)
        constant native GetEnumPlayer       takes nothing returns player
        // 获得可破坏物组中的下一个可破坏物
        // (对应GUI语言的Pick Every Destructables in <Region>)
        constant native GetEnumDestructable takes nothing returns destructable
   
    注意: AI中不支持队列函数的使用.
   
   
    这是杀死单位组中所有单位的实例:
        // 这是callback函数, 无参数并无返回值
        function KillGroupCallback takes nothing returns nothing
             // 获得单位组中的下一个单位
             local unit nextUnit = GetEnumUnit()
             // 杀死该单位
             call KillUnit(nextUnit)
        endfunction
        // 调用ForGroup
        // 对单位组groupToKill中的每个单位都运行函数KillGroupCallback
        call ForGroup(groupToKill, function KillGroupCallback)
   
    另一个经常是用的例子是在队列中查找特定条件的元素. 不幸的是, 因为JASS只支持callback函数来处理队列中的元素, 所以只有用全局变量来保存不同单位的属性. 下面是找出单位组里生命最高的单位的例子:
   
        //定义全局变量
        globals
            //用于储存两单位比较后较高的生命值, 初始化为 0
            real mostLifeSoFar
            //用于储存两单位比较后有较高生命值的单位, 初始化为 null
            unit unitWithMostLifeSoFar
        endglobals
        
        //比较单位生命值的callback函数
        function MostLifeCallback takes nothing returns nothing
            //获得单位组中的下一个单位
            local unit nextUnit = GetEnumUnit()
            //获得单位属性 - 生命
            //UNIT_STATE_LIFE是common.j中定义的常量
            local real life = GetUnitState(nextUnit, UNIT_STATE_LIFE)
            
            //比较生命值
            if life > mostLifeSoFar then
                //把较大的生命值储存
                set mostLifeSoFar = life
                //把有较大生命的单位储存
                set unitWithMostLifeSoFar = nextUnit
            endif
        endfunction
        
        ...
             //初始化全局变量的值为空值
             set mostLifeSoFar = 0
             set unitWithMostLifeSoFar = null
             //调用ForGroup
             //对单位组myGroup中的每个单位都运行函数MostLifeCallback比较生命
             call ForGroup(myGroup, function MostLifeCallback)
             //上句运行后, 全局单位类型变量unitWithMostLifeSoFar便指向单位组myGroup中最高生命的单位, 或:
             //如果单位组myGroup是空组, 那么unitWithMostLifeSoFar便是空值null
        ...
   
    当然, 实现队列操作, 也可以用数组的方法来处理. 但, 数组不能使用紧接着要说的队列过滤器, 也不能定义数组中包含数组. 这些都是队列所拥有的优势, 如可以有数组型的单位组(相当于数组中包含数组), 也可以用队列过滤器.
无冕之王
 楼主| 发表于 2009-6-5 11:16:43
5)队列过滤器(Filters)
    队列过滤器用于在队列中增加符合条件的元素. 比如, 在创建一个法力小于20的单位组时, 便可以用队列过滤器(Filters)来创建.
   
       //在单位组中增加指定单位名为unitname, 并符合队列过滤器filter的单位
        native GroupEnumUnitsOfType takes group whichGroup, string unitname,
              boolexpr filter returns nothing
        
        //在单位组中增加指定玩家为whichPlayer, 并符合队列过滤器filter的单位
        native GroupEnumUnitsOfPlayer takes group whichGroup, player whichPlayer,
              boolexpr filter returns nothing
        
        //在单位组中增加指定玩家为whichPlayer, 并符合队列过滤器filter的单位
        native GroupEnumUnitsOfTypeCounted takes group whichGroup, string unitname,
              boolexpr filter, integer countLimit returns nothing
        
        //在单位组中增加指定区域为r, 并符合队列过滤器filter的单位
        native GroupEnumUnitsInRect takes group whichGroup, rect r, boolexpr filter
              returns nothing
        
        //在单位组中增加countLimit个指定区域为r, 并符合队列过滤器filter的单位
        native GroupEnumUnitsInRectCounted takes group whichGroup, rect r,
          boolexpr filter, integer countLimit returns nothing
        
        //在单位组中增加在指定点坐标范围之内, 并符合队列过滤器filter的单位
        native GroupEnumUnitsInRange takes group whichGroup, real x, real y,
          real radius, boolexpr filter returns nothing
        
        //在单位组中增加在指定点范围之内, 并符合队列过滤器filter的单位
        native GroupEnumUnitsInRangeOfLoc takes group whichGroup,
          location whichLocation, real radius, boolexpr filter returns nothing
        
        //在单位组中增加指定个数, 在指定点坐标范围之内, 并符合队列过滤器filter的单位
        native GroupEnumUnitsInRangeCounted takes group whichGroup, real x, real y,
          real radius, boolexpr filter, integer countLimit returns nothing
        
        //在单位组中增加指定个数, 在指定点范围之内, 并符合队列过滤器filter的单位
        native GroupEnumUnitsInRangeOfLocCounted takes group whichGroup,
          location whichLocation, real radius, boolexpr filter,
          integer countLimit returns nothing
        
        //在单位组中增加被指定玩家选中, 并符合队列过滤器filter的单位
        native GroupEnumUnitsSelected takes group whichGroup, player whichPlayer,
          boolexpr filter returns nothing
        
    类似地, 对于势力也有相应的操作函数
        
       //在势力中增加符合队列过滤器filter的玩家
        native ForceEnumPlayers takes force whichForce, boolexpr filter returns nothing
        
        //在势力中增加指定个数, 并符合队列过滤器filter的玩家
        native ForceEnumPlayersCounted takes force whichForce, boolexpr filter,
          integer countLimit returns nothing
        
        // Add all units that are allies of 'whichPlayer' that satisfy 'filter'
        //在势力中增加和指定玩家同盟, 并符合队列过滤器filter的玩家
        native ForceEnumAllies takes force whichForce, player whichPlayer,
          boolexpr filter returns nothing
        
        //在势力中增加和指定玩家敌对, 并符合队列过滤器filter的玩家
        native ForceEnumEnemies takes force whichForce, player whichPlayer,
          boolexpr filter returns nothing

    以上函数中boolexpr filter在本章第1)节触发器中有提到, 通常可以使用过滤器(filterfunc).过滤器跟触发器的条件函数(conditionfunc)类似. 创建过滤器可以用以下语句:
        native Filter takes code func returns filterfunc
   
    其中参数函数code func必须是无参数返回值为布尔值的函数(takes nothing returns boolean), 过滤器用于在创建队列时增加额外的条件. 在过滤器中, 可以使用下面的函数获得下一个待查的单位/玩家/不可破坏物:
        //获得下个待查单位
        constant native GetFilterUnit         takes nothing returns unit
        //获得下个待查玩家
        constant native GetFilterPlayer       takes nothing returns player
        //获得下个待查可破坏物
        constant native GetFilterDestructable takes nothing returns destructable

    我们来看个创建一个法力小于20的单位组例子:
       //过滤函数, 是无参数返回值为布尔值的函数
        function LessThan20ManaCallback takes nothing returns boolean
             //获得下个检查的单位
             local unit nextUnit = GetFilterUnit()
             //检查待查单位的法力是否小于20
             //小于20则返回true, 否则返回false
             return GetUnitState(nextUnit, UNIT_STATE_MANA) < 20
        endfunction
        ...
             //创建过滤器, 过滤函数是LessThan20ManaCallback
             local filterfunc myFilter = Filter(function LessThan20ManaCallback)
             //在单位组中增加指定区域, 符合过滤条件的单位
             call GroupEnumUnitsInRect(myGroup, someRect, myFilter)
             // Destroy the filter if we are not going to use it again
             //不再使用过滤器, 销毁过滤器, 避免内存泄漏
             call DestroyFilter(myFilter)

Jass 操作符

    数学计算:
        +       加
        -       减
        *       乘
        /       除
        
    比较符号:
        >, <, >=, <=        分别是大于,小于, 大于等于, 小于等于
        ==                  等于
        !=                  不等于
        
        注意: 双=号(==)才是比较, 单=号是赋值, 不要搞错了!!!
    布尔条件
        and             条件和
        or              条件或
        not                 否定条件
        
        使用:
        //条件表达式1和2都是true, 则下式为true, 否则下式为false
        条件表达式1 and 条件表达式2     
        //在条件表达式1或2中只要有一个是true, 则下式为true
        条件表达式1 or 条件表达式2
        //不是表达式的值, 如 return (not true)则返回false
        not 表达式
   字符串操作符
        +           字符串叠加, 如"Greed" + "wind"的结果"Greedwind"


Jass特殊字符

    //      注释, 以 //开头的语句将不执行
    ()      函数参数列表, 如 call myfunction()
    []      数组元素标记, 如 myarray[0]
    ""      字符串引用符, 如 "I love Greedwind"
    ''      单位/物品/技能代码引用符号, 如 'A001', 'Hpal'
              注意: Jass中可以用单引号括起4个字母表示数值型的值(integer)
    \        跳脱符号(与Java/C一样),
             如: 在字符串里使用双引号 set mystring = "This is a \"string\""
                mystring 的值实际上是: This is a "string"
               如果直接 set mystring = "This is a "string"" 将出错
               因为""是字符串引用符
    0        用于数字前面, 则表示八进制的数, 如 016
    0x      用于数字前面, 则表示十六进制的数, 如 0x1FA0
Jass 数据类型一览表  
数据类型 解释
integer  整数
real  真值型
string  字符串
boolean  布尔型
handle  句柄
code  代码
ability  技能
aidifficulty  对战AI难度
alliancetype  盟友类型
blendmode  合成算法
boolexpr  布尔表达式
buff  缓冲
button  对话按钮
camerafield  镜头区域
camerasetup  镜头物体
conditionfunc  条件函数
defeatcondition  失败条件
destructable  可破坏的
dialog  对话
dialogevent  对话事件
effect  特效
effecttype  特效类型
event  事件
eventid  事件代码
fgamestate  游戏状态(f)
filterfunc  过滤函数
fogmodifier  可见修改器
fogstate  可见状态
force  玩家组
gamecache  游戏缓存
gamedifficulty  游戏难度
gameevent  游戏事件
gamespeed  游戏速度
gamestate  游戏状态
gametype  游戏类型
group  单位组
igamestate  游戏状态(I)
item  物品
itempool  物品池
itemtype  物品类
leaderboard  排行榜
limitop  比较算符
location  点
mapcontrol  玩家控制者
mapdensity  地图密度
mapflag  地图标记
mapsetting  地图设置
mapvisibility  地图可见性
multiboard  多面板
multiboarditem  多面板项目
placement  起始位置分布
player  玩家
playercolor  玩家颜色
playerevent  玩家事件
playergameresult 玩家游戏结果
playerscore  玩家得分
playerslotstate  玩家槽状态
playerstate  玩家属性
playerunitevent  玩家单位事件
quest  任务
questitem  任务要求
race  种族
racepreference  种族优选
raritycontrol  动画珍品
rect  地区
region  地区
sound  声音
startlocprio  起始位置优先权
terraindeformation 地形变形
texmapflags  地图涂层标志
texttag  漂浮文字
timer  计时器
timerdialog  计时器窗口
trackable  可跟踪
trigger  触发器
triggeraction  触发器动作
triggercondition 触发器条件
unit  单位
unitevent  单位事件
unitpool  单位池
unitstate  单位属性
unittype  单位类型
version  版本
volumegroup  音量频道
weathereffect  气候效果
widget  有生命的对象
widgetevent  容器事件
无冕之王
 楼主| 发表于 2009-6-5 11:17:29
常数表

aidifficulty 常数表:

AI_DIFFICULTY_INSANE AI难度-令人发疯的

AI_DIFFICULTY_NEWBIE AI难度-新手

AI_DIFFICULTY_NORMAL AI难度-正常
alliancetype 常数表:

ALLIANCE_HELP_REQUEST 联盟帮助要求

ALLIANCE_HELP_RESPONSE 联盟帮助响应

ALLIANCE_PASSIVE 被动联盟

ALLIANCE_RESCUABLE 联盟可营救

ALLIANCE_SHARED_ADVANCED_CONTROL 联盟共享高级控制

ALLIANCE_SHARED_CONTROL 联盟共享控制

ALLIANCE_SHARED_SPELLS 联盟共享魔法

ALLIANCE_SHARED_VISION 联盟共享视野

ALLIANCE_SHARED_VISION_FORCED 联盟势力共享视野

ALLIANCE_SHARED_XP 联盟共享优先权
blendmode
常数表:

BLEND_MODE_ADDITIVE 合成算法-附加混合

BLEND_MODE_BLEND 合成算法-普通混合

BLEND_MODE_DONT_CARE 合成算法-

BLEND_MODE_KEYALPHA 合成算法-关键的alpha混合

BLEND_MODE_MODULATE 合成算法-调整混合

BLEND_MODE_MODULATE_2X 合成算法-调整2x混合

BLEND_MODE_NONE 合成算法-无混合

boolean
常数表:

FALSE 假

TRUE 真

camerafield
常数表:

CAMERA_FIELD_ANGLE_OF_ATTACK 镜头区域-攻击角度

CAMERA_FIELD_FARZ 镜头区域-远端

CAMERA_FIELD_FIELD_OF_VIEW 镜头区域-区域观看

CAMERA_FIELD_ROLL 镜头区域-滚动

CAMERA_FIELD_ROTATION 镜头区域-旋转

CAMERA_FIELD_TARGET_DISTANCE 镜头区域-距离到目标

CAMERA_FIELD_ZOFFSET 镜头区域-高度位移

dialogevent
常数表:

EVENT_DIALOG_BUTTON_CLICK 事件-对话按钮点击

EVENT_DIALOG_CLICK 事件-对话点击

effecttype
常数表:

EFFECT_TYPE_CASTER 特效类型-施法者特效

EFFECT_TYPE_EFFECT 特效类型-受影响特效

EFFECT_TYPE_SPECIAL 特效类型-特殊特效

EFFECT_TYPE_TARGET 特效类型-目标特效

fgamestate
常数表:

GAME_STATE_TIME_OF_DAY 游戏状态-时间
fogstate
常数表:

FOG_OF_WAR_FOGGED 可见效果-战争迷雾

FOG_OF_WAR_MASKED 可见效果-黑色迷雾

FOG_OF_WAR_VISIBLE 可见效果-可见
gamedifficulty
常数表:

MAP_DIFFICULTY_EASY 地图难度-容易

MAP_DIFFICULTY_HARD 地图难度-困难

MAP_DIFFICULTY_INSANE 地图难度-令人发疯的

MAP_DIFFICULTY_NORMAL 地图难度-正常

gameevent
常数表:

EVENT_GAME_BUILD_SUBMENU 游戏事件-创建子菜单

EVENT_GAME_END_LEVEL 游戏事件-游戏本关结束

EVENT_GAME_ENTER_REGION 游戏事件-进入区域

EVENT_GAME_LEAVE_REGION 游戏事件-离开区域

EVENT_GAME_LOADED 游戏事件-游戏装载完毕

EVENT_GAME_SAVE 游戏事件-储存

EVENT_GAME_SHOW_SKILL 游戏事件-显示技能

EVENT_GAME_STATE_LIMIT 游戏事件-游戏状态限制

EVENT_GAME_TIMER_EXPIRED 游戏事件-游戏超时

EVENT_GAME_TOURNAMENT_FINISH_NOW 游戏事件-比赛完成

EVENT_GAME_TOURNAMENT_FINISH_SOON 游戏事件-比赛即将完成

EVENT_GAME_TRACKABLE_HIT 游戏事件-可跟踪打击

EVENT_GAME_TRACKABLE_TRACK 游戏事件-可跟踪跟踪

EVENT_GAME_VARIABLE_LIMIT 游戏事件-游戏变量限制

EVENT_GAME_VICTORY 游戏事件-游戏胜利

gamespeed
常数表:

MAP_SPEED_FAST 地图-较快游戏速度

MAP_SPEED_FASTEST 地图-最快游戏速度

MAP_SPEED_NORMAL 地图-正常游戏速度

MAP_SPEED_SLOW 地图-低游戏速度

MAP_SPEED_SLOWEST 地图-最低游戏速度

gametype
常数表:

GAME_TYPE_BLIZ 游戏类型-官方地图

GAME_TYPE_FFA 游戏类型-自由竞赛

GAME_TYPE_FOUR_TEAM_PLAY 游戏类型-4队竞赛

GAME_TYPE_MELEE 游戏类型-对战

GAME_TYPE_ONE_ON_ONE 游戏类型-1 对 1

GAME_TYPE_THREE_TEAM_PLAY 游戏类型-3队竞赛

GAME_TYPE_TWO_TEAM_PLAY 游戏类型-2队竞赛

GAME_TYPE_USE_MAP_SETTINGS 游戏类型-使用地图设置

igamestate
常数表:

GAME_STATE_DISCONNECTED 游戏状态-断开

GAME_STATE_DIVINE_INTERVENTION 游戏状态-干涉

integer
常数表:

CAMERA_MARGIN_BOTTOM 镜头空白-底部

CAMERA_MARGIN_LEFT 镜头空白-左边

CAMERA_MARGIN_RIGHT 镜头空白-右边

CAMERA_MARGIN_TOP 镜头空白-顶部

JASS_MAX_ARRAY_SIZE 数组最大域值

PLAYER_NEUTRAL_AGGRESSIVE 中立敌对玩家

PLAYER_NEUTRAL_PASSIVE 中立被动玩家

itemtype
常数表:

ITEM_TYPE_ANY 物品类型-任何种类

ITEM_TYPE_ARTIFACT 物品类型-人造物品

ITEM_TYPE_CAMPAIGN 物品类型-战役

ITEM_TYPE_CHARGED 物品类型-可充

ITEM_TYPE_MISCELLANEOUS 物品类型-混杂

ITEM_TYPE_PERMANENT 物品类型-永久

ITEM_TYPE_POWERUP 物品类型-升级

ITEM_TYPE_PURCHASABLE 物品类型-可购买

ITEM_TYPE_TOME 物品类型-书

ITEM_TYPE_UNKNOWN 物品类型-未定义种类

limitop
常数表:

EQUAL 等于

GREATER_THAN 大于

GREATER_THAN_OR_EQUAL 大于或等于

LESS_THAN 小于

LESS_THAN_OR_EQUAL 小于等于

NOT_EQUAL 不等于

mapcontrol
常数表:

MAP_CONTROL_COMPUTER 地图控制者-电脑

MAP_CONTROL_CREEP 地图控制者-野生

MAP_CONTROL_NEUTRAL 地图控制者-中立

MAP_CONTROL_NONE 地图控制者-无

MAP_CONTROL_RESCUABLE 地图控制者-营救

MAP_CONTROL_USER 地图控制者-用户
无冕之王
 楼主| 发表于 2009-6-5 11:18:01
mapdensity
常数表:

MAP_DENSITY_HEAVY 地图-高密度

MAP_DENSITY_LIGHT 地图-小密度

MAP_DENSITY_MEDIUM 地图-中等密度

MAP_DENSITY_NONE 地图-无密度

mapflag
常数表:

MAP_ALLIANCE_CHANGES_HIDDEN 地图-隐藏改变联盟

MAP_CHEATS 地图-容许作弊码

MAP_CHEATS_HIDDEN 地图-隐藏作弊码

MAP_FIXED_COLORS 地图-固定颜色

MAP_FOG_ALWAYS_VISIBLE 地图迷雾-总是可见

MAP_FOG_HIDE_TERRAIN 地图迷雾-隐藏地形

MAP_FOG_MAP_EXPLORED 地图迷雾-地图已探索

MAP_LOCK_ALLIANCE_CHANGES 地图-锁定改变联盟

MAP_LOCK_RANDOM_SEED 地图-不容许随机游戏速度

MAP_LOCK_RESOURCE_TRADING 地图-锁定资源交易

MAP_LOCK_SPEED 地图-锁定游戏速度

MAP_OBSERVERS 地图-允许有观察者

MAP_OBSERVERS_ON_DEATH 地图-默认为观看者

MAP_RANDOM_HERO 地图-随机英雄

MAP_RANDOM_RACES 地图-随机种族

MAP_RELOADED 地图-地图转换

MAP_RESOURCE_TRADING_ALLIES_ONLY 地图-容许联盟资源交易

MAP_SHARED_ADVANCED_CONTROL 地图-共享高级控制

MAP_USE_HANDICAPS 地图-使用障碍

placement
常数表:

MAP_PLACEMENT_FIXED 地图-玩家固定放置

MAP_PLACEMENT_RANDOM 地图-玩家随机放置

MAP_PLACEMENT_TEAMS_TOGETHER 地图-同一联盟玩家放置在一起

MAP_PLACEMENT_USE_MAP_SETTINGS 地图-使用地图设置的玩家放置

playercolor
常数表:

PLAYER_COLOR_AQUA 玩家颜色-浅绿

PLAYER_COLOR_BLUE 玩家颜色-蓝

PLAYER_COLOR_BROWN 玩家颜色-棕色

PLAYER_COLOR_CYAN 玩家颜色-青

PLAYER_COLOR_GREEN 玩家颜色-绿

PLAYER_COLOR_LIGHT_BLUE 玩家颜色-亮蓝

PLAYER_COLOR_LIGHT_GRAY 玩家颜色-亮灰

PLAYER_COLOR_ORANGE 玩家颜色-橙

PLAYER_COLOR_PINK 玩家颜色-粉红

PLAYER_COLOR_PURPLE 玩家颜色-紫

PLAYER_COLOR_RED 玩家颜色-红

PLAYER_COLOR_YELLOW 玩家颜色-黄

playerevent
常数表:

EVENT_PLAYER_ALLIANCE_CHANGED 玩家事件-盟友设置变化

EVENT_PLAYER_ARROW_DOWN_DOWN 玩家事件-按下键

EVENT_PLAYER_ARROW_DOWN_UP 玩家事件-释放下键

EVENT_PLAYER_ARROW_LEFT_DOWN 玩家事件-按左键

EVENT_PLAYER_ARROW_LEFT_UP 玩家事件-释放左键

EVENT_PLAYER_ARROW_RIGHT_DOWN 玩家事件-按右键

EVENT_PLAYER_ARROW_RIGHT_UP 玩家事件-释放右键

EVENT_PLAYER_ARROW_UP_DOWN 玩家事件-按上键

EVENT_PLAYER_ARROW_UP_UP 玩家事件-释放上键

EVENT_PLAYER_CHAT 玩家事件-聊天

EVENT_PLAYER_DEFEAT 玩家事件-失败

EVENT_PLAYER_END_CINEMATIC 玩家事件-结束电影

EVENT_PLAYER_LEAVE 玩家事件-离开

EVENT_PLAYER_STATE_LIMIT 玩家事件-状态限制

EVENT_PLAYER_VICTORY 玩家事件-胜利

playergameresult
常数表:

PLAYER_GAME_RESULT_DEFEAT 玩家结果-失败

PLAYER_GAME_RESULT_NEUTRAL 玩家结果-不确定

PLAYER_GAME_RESULT_TIE 玩家结果-平局

PLAYER_GAME_RESULT_VICTORY 玩家结果-胜利

playerscore
常数表:

PLAYER_SCORE_FOOD_MAXPROD 玩家积分-最大的人口数量

PLAYER_SCORE_FOOD_MAXUSED 玩家积分-最大所使用的人口数量

PLAYER_SCORE_GOLD_GIVEN 玩家积分-给予盟友的金子

PLAYER_SCORE_GOLD_LOST_TAX 玩家积分-由于税而损失的金子

PLAYER_SCORE_GOLD_LOST_UPKEEP 玩家积分-因为维修费而损失的金

PLAYER_SCORE_GOLD_MINED_TOTAL 玩家积分-所采集的金子 (总共)

PLAYER_SCORE_GOLD_MINED_UPKEEP 玩家积分-所采集的金子(带有维修

PLAYER_SCORE_GOLD_RECEIVED 玩家积分-从盟友那里收到的金子

PLAYER_SCORE_HERO_TOTAL 玩家积分-总的英雄得分

PLAYER_SCORE_HEROES_KILLED 玩家积分-杀死英雄

PLAYER_SCORE_ITEMS_GAINED 玩家积分-获得物品

PLAYER_SCORE_LUMBER_GIVEN 玩家积分-给予盟友的木材

PLAYER_SCORE_LUMBER_LOST_TAX 玩家积分-由于税而损失的木材

PLAYER_SCORE_LUMBER_LOST_UPKEEP 玩家积分-由于维修费而损失的木

PLAYER_SCORE_LUMBER_RECEIVED 玩家积分-从盟友那里收到的木材

PLAYER_SCORE_LUMBER_TOTAL 玩家积分-采集到的木材

PLAYER_SCORE_MERCS_HIRED 玩家积分-雇佣兵

PLAYER_SCORE_RESOURCE_TOTAL 玩家积分-总的资源得分

PLAYER_SCORE_STRUCT_BUILT 玩家积分-已建造建筑

PLAYER_SCORE_STRUCT_RAZED 玩家积分-被毁建筑

PLAYER_SCORE_TECH_PERCENT 玩家积分-科技百分比

PLAYER_SCORE_TOTAL 玩家积分-总的整体得分

PLAYER_SCORE_UNIT_TOTAL 玩家积分-总的单位得分

PLAYER_SCORE_UNITS_KILLED 玩家积分-消灭单位

PLAYER_SCORE_UNITS_TRAINED 玩家积分-已训练单位
无冕之王
 楼主| 发表于 2009-6-5 11:18:18
playerunitevent
常数表:



EVENT_PLAYER_HERO_LEVEL 玩家英雄事件-提升一个等级

EVENT_PLAYER_HERO_REVIVABLE 玩家英雄事件-变得可重生的

EVENT_PLAYER_HERO_REVIVE_CANCEL 玩家英雄事件-取消重生

EVENT_PLAYER_HERO_REVIVE_FINISH 玩家英雄事件-完成重生

EVENT_PLAYER_HERO_REVIVE_START 玩家英雄事件-开始重生

EVENT_PLAYER_HERO_SKILL 玩家英雄事件-学习一项技能

EVENT_PLAYER_UNIT_ATTACKED 玩家单位事件-被攻击的

EVENT_PLAYER_UNIT_CHANGE_OWNER 玩家单位事件-变化拥有者

EVENT_PLAYER_UNIT_CONSTRUCT_CANCEL 玩家单位事件-取消建造

EVENT_PLAYER_UNIT_CONSTRUCT_FINISH 玩家单位事件-完成建造

EVENT_PLAYER_UNIT_CONSTRUCT_START 玩家单位事件-开始建造

EVENT_PLAYER_UNIT_DEATH 玩家单位事件-死亡

EVENT_PLAYER_UNIT_DECAY 玩家单位事件-衰退

EVENT_PLAYER_UNIT_DESELECTED 玩家单位事件-取消选择

EVENT_PLAYER_UNIT_DETECTED 玩家单位事件-被发现

EVENT_PLAYER_UNIT_DROP_ITEM 玩家单位事件-丢失一件物品

EVENT_PLAYER_UNIT_HIDDEN 玩家单位事件-隐藏

EVENT_PLAYER_UNIT_ISSUED_ORDER 玩家单位事件-发布一个无目标的

EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER 玩家单位事件-发布一个锁定一个

EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER 玩家单位事件-发布一个目标指令

EVENT_PLAYER_UNIT_ISSUED_UNIT_ORDER 玩家单位事件-发布一个锁定一个

EVENT_PLAYER_UNIT_LOADED 玩家单位事件-装进了传送门

EVENT_PLAYER_UNIT_PAWN_ITEM 玩家单位事件-抵押物品(到商店)

EVENT_PLAYER_UNIT_PICKUP_ITEM 玩家单位事件-获得一件物品

EVENT_PLAYER_UNIT_RESCUED 玩家单位事件-被营救了

EVENT_PLAYER_UNIT_RESEARCH_CANCEL 玩家单位事件-取消研究

EVENT_PLAYER_UNIT_RESEARCH_FINISH 玩家单位事件-完成研究

EVENT_PLAYER_UNIT_RESEARCH_START 玩家单位事件-开始研究

EVENT_PLAYER_UNIT_SELECTED 玩家单位事件-被选择

EVENT_PLAYER_UNIT_SELL 玩家单位事件-贩卖一个单位

EVENT_PLAYER_UNIT_SELL_ITEM 玩家单位事件-购买物品(从商店)

EVENT_PLAYER_UNIT_SPELL_CAST 玩家单位事件-开始施放一种技能

EVENT_PLAYER_UNIT_SPELL_CHANNEL 玩家单位事件-开始一种持续性技

EVENT_PLAYER_UNIT_SPELL_EFFECT 玩家单位事件-开始一种技能的效

EVENT_PLAYER_UNIT_SPELL_ENDCAST 玩家单位事件-停止施放一种技能

EVENT_PLAYER_UNIT_SPELL_FINISH 玩家单位事件-施放技能结束

EVENT_PLAYER_UNIT_SUMMON 玩家单位事件-产生一个召唤单位

EVENT_PLAYER_UNIT_TRAIN_CANCEL 玩家单位事件-取消训练一个单位

EVENT_PLAYER_UNIT_TRAIN_FINISH 玩家单位事件-完成训练一个单位

EVENT_PLAYER_UNIT_TRAIN_START 玩家单位事件-开始训练一个单位

EVENT_PLAYER_UNIT_UPGRADE_CANCEL 玩家单位事件-取消升级

EVENT_PLAYER_UNIT_UPGRADE_FINISH 玩家单位事件-完成升级

EVENT_PLAYER_UNIT_UPGRADE_START 玩家单位事件-开始升级

EVENT_PLAYER_UNIT_USE_ITEM 玩家单位事件-使用一件物品

race
常数表:

RACE_DEMON 恶魔族

RACE_HUMAN 人族

RACE_NIGHTELF 暗夜精灵族

RACE_ORC 兽族

RACE_OTHER 其他族

RACE_UNDEAD 不死族

racepreference
常数表:

RACE_PREF_DEMON

RACE_PREF_HUMAN

RACE_PREF_NIGHTELF

RACE_PREF_ORC

RACE_PREF_RANDOM

RACE_PREF_UNDEAD

RACE_PREF_USER_SELECTABLE

raritycontrol 常数表:

RARITY_FREQUENT 频率控制-普通频率

RARITY_RARE 频率控制-罕见的

startlocprio 常数表:

MAP_LOC_PRIO_HIGH 起始位置分布优先权-高

MAP_LOC_PRIO_LOW 起始位置分布优先权-低

MAP_LOC_PRIO_NOT 起始位置分布优先权-无

texmapflags
常数表:

TEXMAP_FLAG_NONE 地图涂层标志-无

TEXMAP_FLAG_WRAP_U 地图涂层标志-重叠(U)

TEXMAP_FLAG_WRAP_UV 地图涂层标志-重叠(UV)

TEXMAP_FLAG_WRAP_V 地图涂层标志-重叠(V)
unitevent
常数表:

EVENT_UNIT_ACQUIRED_TARGET 单位事件-获得一个目标

EVENT_UNIT_ATTACKED 单位事件-被攻击

EVENT_UNIT_CHANGE_OWNER 单位事件-变化拥有者

EVENT_UNIT_CONSTRUCT_CANCEL 单位事件-取消建造

EVENT_UNIT_CONSTRUCT_FINISH 单位事件-完成建造

EVENT_UNIT_DAMAGED 单位事件-接受伤害

EVENT_UNIT_DEATH 单位事件-死亡

EVENT_UNIT_DECAY 单位事件-衰退

EVENT_UNIT_DESELECTED 单位事件-取消选择

EVENT_UNIT_DETECTED 单位事件-被发现

EVENT_UNIT_DROP_ITEM 单位事件-丢失一件物品

EVENT_UNIT_HERO_LEVEL 英雄单位事件-提升一个等级

EVENT_UNIT_HERO_REVIVABLE 英雄单位事件-变得可重生的

EVENT_UNIT_HERO_REVIVE_CANCEL 英雄单位事件-取消重生

EVENT_UNIT_HERO_REVIVE_FINISH 英雄单位事件-完成重生

EVENT_UNIT_HERO_REVIVE_START 英雄单位事件-开始重生

EVENT_UNIT_HERO_SKILL 英雄单位事件-学习一项技能

EVENT_UNIT_HIDDEN 单位事件-隐藏

EVENT_UNIT_ISSUED_ORDER 单位事件-发布一个无目标的指令

EVENT_UNIT_ISSUED_POINT_ORDER 单位事件-发布一个锁定一个点的

EVENT_UNIT_ISSUED_TARGET_ORDER 单位事件-发布一个锁定目标的指

EVENT_UNIT_LOADED 单位事件-装进了传送门

EVENT_UNIT_PAWN_ITEM 单位事件-抵押物品(到商店)

EVENT_UNIT_PICKUP_ITEM 单位事件-获得一件物品

EVENT_UNIT_RESCUED 单位事件-被营救

EVENT_UNIT_RESEARCH_CANCEL 单位事件-取消研究

EVENT_UNIT_RESEARCH_FINISH 单位事件-完成研究

EVENT_UNIT_RESEARCH_START 单位事件-开始研究

EVENT_UNIT_SELECTED 单位事件-被选择

EVENT_UNIT_SELL 单位事件-贩卖一个单位

EVENT_UNIT_SELL_ITEM 单位事件-购买物品(从商店)

EVENT_UNIT_SPELL_CAST 单位事件-开始施放一种技能

EVENT_UNIT_SPELL_CHANNEL 单位事件-开始一种持续性技能

EVENT_UNIT_SPELL_EFFECT 单位事件-开始一种技能的效果

EVENT_UNIT_SPELL_ENDCAST 单位事件-停止施放一种技能

EVENT_UNIT_SPELL_FINISH 单位事件-施放技能结束

EVENT_UNIT_STATE_LIMIT 单位事件-状态限制

EVENT_UNIT_SUMMON 单位事件-产生一个召唤单位

EVENT_UNIT_TARGET_IN_RANGE 单位事件-注意范围内的一个目标

EVENT_UNIT_TRAIN_CANCEL 单位事件-取消训练一个单位

EVENT_UNIT_TRAIN_FINISH 单位事件-完成训练一个单位

EVENT_UNIT_TRAIN_START 单位事件-开始训练一个单位

EVENT_UNIT_UPGRADE_CANCEL 单位事件-取消升级

EVENT_UNIT_UPGRADE_FINISH 单位事件-完成升级

EVENT_UNIT_UPGRADE_START 单位事件-开始升级

EVENT_UNIT_USE_ITEM 单位事件-使用一件物品
无冕之王
 楼主| 发表于 2009-6-5 11:18:33
playerslotstate
常数表:

PLAYER_SLOT_STATE_EMPTY 空的玩家槽

PLAYER_SLOT_STATE_LEFT 玩家离开的玩家槽

PLAYER_SLOT_STATE_PLAYING 正在使用的玩家槽

playerstate
常数表:

PLAYER_STATE_ALLIED_VICTORY 玩家状态-联盟胜利

PLAYER_STATE_FOOD_CAP_CEILING 玩家状态-食物最大容量

PLAYER_STATE_GAME_RESULT 玩家状态-游戏结果

PLAYER_STATE_GIVES_BOUNTY 玩家状态-给予奖励

PLAYER_STATE_GOLD_GATHERED 玩家状态-已收集金钱

PLAYER_STATE_GOLD_UPKEEP_RATE 玩家状态-金钱维护率

PLAYER_STATE_LUMBER_GATHERED 玩家状态-已收集木材

PLAYER_STATE_LUMBER_UPKEEP_RATE 玩家状态-木材维护率

PLAYER_STATE_NO_CREEP_SLEEP 玩家状态-野生生物不睡眠

PLAYER_STATE_OBSERVER 玩家状态-观看者

PLAYER_STATE_OBSERVER_ON_DEATH 玩家状态-默认为观看者

PLAYER_STATE_PLACED 玩家状态-放置

PLAYER_STATE_RESOURCE_FOOD_CAP 玩家状态-食物容量

PLAYER_STATE_RESOURCE_FOOD_USED 玩家状态-食物使用

PLAYER_STATE_RESOURCE_GOLD 玩家状态-金钱资源

PLAYER_STATE_RESOURCE_HERO_TOKENS 玩家状态-使用英雄

PLAYER_STATE_RESOURCE_LUMBER 玩家状态-木材资源

PLAYER_STATE_UNFOLLOWABLE 玩家状态-不可跟随
unitstate
常数表:

UNIT_STATE_LIFE 单位状态-生命

UNIT_STATE_MANA 单位状态-法力

UNIT_STATE_MAX_LIFE 单位状态-最大生命

UNIT_STATE_MAX_MANA 单位状态-最大法力

unittype
常数表:

UNIT_TYPE_ANCIENT 单位类型-古代的

UNIT_TYPE_ATTACKS_FLYING 单位类型-可以攻击飞行单位

UNIT_TYPE_ATTACKS_GROUND 单位类型-可以攻击地 单位

UNIT_TYPE_DEAD 单位类型-死亡单位

UNIT_TYPE_FLYING 单位类型-飞行单位

UNIT_TYPE_GIANT 单位类型-巨人

UNIT_TYPE_GROUND 单位类型-地面单位

UNIT_TYPE_HERO 单位类型-英雄

UNIT_TYPE_MECHANICAL 单位类型-机械的

UNIT_TYPE_MELEE_ATTACKER 单位类型-肉搏攻击者

UNIT_TYPE_PEON 单位类型-苦工

UNIT_TYPE_PLAGUED 单位类型-中了瘟疫的

UNIT_TYPE_RANGED_ATTACKER 单位类型-远程攻击者

UNIT_TYPE_SAPPER 单位类型-工兵

UNIT_TYPE_SNARED 单位类型-被诱捕的

UNIT_TYPE_STRUCTURE 单位类型-建筑单位

UNIT_TYPE_STUNNED 单位类型-被晕眩的

UNIT_TYPE_SUMMONED 单位类型-被召唤的

UNIT_TYPE_TOWNHALL 单位类型-城镇大厅类型单位

UNIT_TYPE_UNDEAD 单位类型-不死的

version
常数表:

VERSION_FROZEN_THRONE 版本-冰封王座

VERSION_REIGN_OF_CHAOS 版本-混乱之治

volumegroup
常数表:

SOUND_VOLUMEGROUP_AMBIENTSOUNDS 场景配音

SOUND_VOLUMEGROUP_COMBAT 战斗声音

SOUND_VOLUMEGROUP_FIRE 火焰声音

SOUND_VOLUMEGROUP_MUSIC 音乐

SOUND_VOLUMEGROUP_SPELLS 动画和法术声音

SOUND_VOLUMEGROUP_UI 用户界面声音

SOUND_VOLUMEGROUP_UNITMOVEMENT 单位移动声音

SOUND_VOLUMEGROUP_UNITSOUNDS 单位回应声音

widgetevent
常数表:

EVENT_WIDGET_DEATH 事件-容器死亡
wenxijun
发表于 2009-10-6 21:17:17
DDDDDDDDDDDDDDDDDDDDDDDDDDD
iau2007
发表于 2010-4-16 03:58:14
这是什么{:6_258:}
616007518
发表于 2010-4-22 12:36:19
看不懂
快速回复 返回顶部 返回列表