第一章 ★ Trigger事件
Trigger是由事件、条件、动作组成。事件是Trigger的开端,所有事件都是并行的,也就是说,在多个事件的情况下,只要触发一个事件就会执行触发器。大部分事件可以直接指定,但有部分事件却需要后期添加或者必须要有指定类型的变量才可以添加,后期添加也比较方便,后面会介绍到“动态注册事件”,这里我们先说一下具体的事件内容。
还有需要注意到触发的关联性,比如“玩家事件”产生的触发是不可能会有“触发单位”这样的单位函数的,对应的只是“触发玩家”之类的玩家函数,但可以通过一些特殊情况转换,比如可以通过单位组动作的条件来选取玩家的单位,而且“触发单位所属玩家”就是一个很典型的单位事件调用玩家的函数。
第一节 ☆ 单位事件
这里先说明一下“指定单位”的定义,顾名思义,这个需要针对已经存在的可以直接选取的具体的单位;不单单是事件,还包括一些条件和动作;不过不同事件可以用“动态注册”来达到添加事件的目的,而条件和动作可以通过“单位类型”的变量来读取。
三种单位事件所对应的事件稍有不同,如下表:
在制作触发的时候,我们先要考虑到,自己需要在什么样的情况下运行这个触发器,然后再有选择的添加事件。
例题1:如何让敌对的某某玩家(玩家6)某某单位(圣骑士0000)死亡后执行游戏胜利
这里分别对应三种事件来说明各自的用法:
1、指定单位事件:
事件:
(圣骑士 0000) 死亡
条件:
(死亡单位)所属是(玩家6)
动作:
游戏-设置 (凶手单位)所属玩家 胜利
2、玩家单位事件
事件:
(玩家6)的单位死亡
条件:
(死亡单位)是(圣骑士0000)
动作:
游戏-设置 (凶手单位)所属玩家 胜利
3、一般单位事件
事件:
任意单位死亡
条件:
(死亡单位)是(圣骑士 0000)
(死亡单位)所属是(玩家6 )
动作:
游戏-设置 (凶手单位)所属玩家 胜利
“单位进入区域”和“单位离开区域”这个就很好理解了,以练功房为例简单说明。
例题2:当(大法师0001)进入(区域0000)的时候开始刷兵,单位离开(区域0000)的时候停止刷兵-练功房区域。
1、 单位进入区域
事件:
单位进入(区域0000)
条件:
触发单位 等于 (大法师0001)
动作:
运行触发器 <刷兵>
2、 单位离开区域
事件:
单位离开(区域0000)
条件:
触发单位 等于 (大法师0001)
动作:
关闭触发器 <刷兵>
3、 刷兵<暂时只简单的调用一下,后面会细说>
事件:
每2秒触发事件
条件:
无
动作:
创建1个 步兵 在 区域0000 的中心点,面向 默认的建筑角度
PS:这里的刷兵事件触发器默认是初始关闭的。
“接近指定单位事件”就像前面所说,需要用到具体的可指定的单位才可以使用。
例题3:(大法师0001)靠近(圣骑士0000)500码内会召唤水元素。
事件:
单位进入500 范围距离 (圣骑士0000)
条件:
触发单位 等于 (大法师0001)
动作:
单位 - 对 (触发单位) 发布 人族大法师 - 召唤水元素 命令
“单位生命值变化”和“单位法力值变量”这个同样属于“指定单位”事件。
例题4:当(大法师0001)生命值少于100的时候使物品“生命药水”。
事件:
单位 - (大法师0001)的生命值变为小于 100.00
条件:
略
动作:
英雄 - 命令 (大法师0001) 使用 (大法师0001) 所持有的 生命药水
第二节 ☆ 玩家事件
玩家事件就是和玩家相关的事件(废话—。—),这个在制作事件的时候需要判断事件事件发生源是哪一个,这样才可以正确使用事件;另外玩家事件是针对单一玩家设置的,所以如果你想有几个玩家都可以触发就必须对应每一个需要触发的玩家添加事件。
聊天信息事件,是指捕获的玩家输入的信息,一般像输入密技之类都属于聊天信息;但这里需要说明的是,官方默认的密技是无法通过聊天信息捕获的,因此无法防止,也就是像现在大家为了防作弊而制作的各种各样的演示的原因。
聊天信息捕获有两种方式,一是完全匹配,二是部分匹配,以实例说明:
例5:让玩家输入GO来执行增加1000金币。
1、完全匹配
事件:
玩家 - 玩家1(红色) 输入的聊天信息包含 GO ,匹配方式: 完全匹配
条件:
动作:
玩家 - 增加 1000 (触发玩家) 的 现有黄金
2、 部分匹配
事件:
玩家 - 玩家1(红色) 输入的聊天信息包含 GO ,匹配方式: 包含字符串
条件
动作:
玩家 - 增加 1000 (触发玩家) 的 现有黄金
PS:这两个触发器运行会有什么不同呢?完全匹配的需要你输入的就是GO,而不能附带其它任何多余的字符,而包含字符串的话,类似于GOO或者GGO之类的,都会执行。
按下ESC键和键盘事件同属于按键事件,默认的键盘事件可以按方向键上下左右来触发,键盘事件和按下ESC事件的区别还在于,可以分别捕获按下和放开按键事件。
例6:按下ESC键来显示玩家当前的金币数
事件:
玩家 - 玩家1(红色) 按下Esc键
条件:
动作:
游戏 - 对 (所有玩家) 发送文本信息: (转换 ((触发玩家) 现有黄金) 为字符串)
PS:因为显示出来的文本必须是字符串,所以需要把属于整数的黄金数转换成字符串(后面详解)
选择事件,就是玩家选择了一个单位后执行的事件,选择事件包括选择和取消选择两个类型。
例7:使玩家锁定选择(血魔法师0003),无法选择其它单位<默认设置已选择该单位>
事件:
玩家 - 玩家1(红色) 取消选择 一个单位
条件:
(触发单位) 等于 血魔法师 0003 <预设>
动作:
选择 - 选择 (触发单位) 对 (触发玩家)
属性变化事件,是指玩家的某个属性发生改变,来执行触发,属性类型有如下:
例8:当中立敌对的(兵步)只有2个以后,再次刷新10个兵步,步兵占用人口数2。
事件:
玩家 - 玩家1(红色) 的 已使用人口数 变为 小于或等于 4.00
条件:
动作:
单位 - 创建 10 个 步兵 给 (触发玩家) 在 ((可用地图区域) 的中心点) ,面向角度为 默认建筑朝向 度
PS:这里需要说明一下,属性必须是发生变化的时候才会触发的;一般情况下,我们做地图会先选择英雄,然后就会占用5个人口(默认情况下),这个时候属性就已经发生变化了,不过进行比较的话,就需要改成小于或等于5才会触发。
同盟改变(任何)/ 同盟改变(指定),是基于同盟关系发生变化而触发事件,前者只需要任何一项关系发生改变就会执行,后者需要在特定的情况下才会执行,同盟关系如下:
例9:当玩家1(红色)对玩家2(蓝色)设置结盟(不侵犯)后奖励玩家1(红色)1000金币。
事件:
玩家 - 玩家1(红色) 更改 结盟(不侵犯) 设置
条件:
((触发玩家) 对 玩家2(蓝色) 开启 结盟(不侵犯)) 等于 TRUE
动作:
玩家 - 增加 1000 玩家1(红色) 的 现有黄金
PS:这里需要说明的是,同盟改变是单向设置,也就是说,如果玩家1(红色)对玩家2(蓝色)设置结盟,而玩家2(蓝色)没有设置结盟;那结果就是玩家1(红色)的单位不会主动攻击玩家2(蓝色)的单位,而玩家2(蓝色)还会主动攻击玩家1(红色)的单位,因此在设置结盟的时候必须要双方都进行操作。
游戏胜利 / 游戏失败 / 离开游戏
这三个都是玩家的游戏状态,都是单独执行的,很容易进行判断。
例10:当玩家2(蓝色)离开游戏后,把所有金币给玩家1(红色)
事件:
玩家 - 玩家2(蓝色) 离开游戏
条件:
动作:
玩家 - 增加 (玩家2(蓝色) 现有黄金) 玩家1(红色) 的 现有黄金
PS:在一些地图的设置中,当其中一个玩家离开就把金钱分给其它在线的玩家,就个只需要把离开玩家的金币除以在线的玩家数量,再把这个值给所有在线玩家(利用玩家组动作,后详)。
第三节 ☆ 游戏事件&普通事件&时间事件&可破坏物事件
游戏中的时间事件通过游戏时间流逝来进行判断,可利用不同时间做不同事。而实数变量,操作方式和时间事件是一样的,区别在于,必须创建一个实数变量才可以使用这个事件,而且必须要在游戏中制造改变这个变量的事件,就像游戏时间改变会触发游戏时间变化事件一样。
例11:当每天6点和18点的时候,给玩家1发放500金币的工钱。
事件:
游戏 - 游戏时间变为 等于 6.00
游戏 - 游戏时间变为 等于 18.00
条件:
动作:
玩家 - 增加 500 玩家1(红色) 的 现有黄金
PS:这里用到了两个事件,前面已经提过,事件是并行的,所以这两个事件是会分别触发增加玩家黄金的事件。
游戏读取&游戏保存&按下英雄升级技能&按钮按下建造按钮
这几个事件基本上和现在的主流事件无关,适用于单机游戏时候;前两者就不用介绍了,看字面意思应该就能了解。而后两者,分别是英雄学习技能的那个红色十字被按下和农民建造按钮被按下,这两个都无法捕获触发单位,因此这几个事件可以忽略掉了。
普通事件只有地图初始化事件,就是在读取地图的最后阶段执行的事件,一般作用于对变量进行赋值等并不涉及改变游戏数据的动作(比如创建多面版之类的不会被执行)。
时间流逝事件,在正式进入地图以后开始计时,在一定程度上可以当成对游戏事件的补充,比如将时间经过设为0.01的话,就可以执行一些初始化操作而不受地图初始化的一些限制。周期性事件和时间流逝事件的区别在于,当周期性事件定义的时间到达的时候,会执行触发并重新计时,而时间流逝事件只会执行一次。
例12:每隔10秒创建3个骑士在(区域000),并命令他们攻击移动到(区域001)
事件:
时间 - 每 10.00 秒触发事件
条件:
动作:
For循环整数A从 1 到 3, 做动作
Loop - 动作
单位 - 创建 1 个 骑士 给 玩家1(红色) 在 (矩形区域 000 <预设> 的中心点) ,面向角度为 默认建筑朝向 度
单位 - 对 (最后创建的单位) 发布 攻击移动 命令到目标点: (矩形区域 001 <预设> 的中心点)
例12:每隔10秒创建3个骑士在(区域000),并命令他们攻击移动到(区域001)
事件:
时间 - 每 10.00 秒触发事件
条件:
动作:
For循环整数A从 1 到 3, 做动作
Loop - 动作
单位 - 创建 1 个 骑士 给 玩家1(红色) 在 (矩形区域 000 <预设> 的中心点) ,面向角度为 默认建筑朝向 度
单位 - 对 (最后创建的单位) 发布 攻击移动 命令到目标点: (矩形区域 001 <预设> 的中心点)
PS:这里用到了FOR循环语句,执行3次同样的动作,这样可以针对每一个创建的单位发布命令而不需要担心因为数量过多而有些单位没有获得命令(超过12只时)。
可破坏物,就像树、门之类的装饰物,有一定生命值,会被破坏。
例13:当区域001内的夏树墙被摧毁后(区域判断上限为64),5秒后复活。
事件:
可破坏物 - 可破坏物在 矩形区域 001 <预设> 内死亡
条件:
((死亡的可破坏物) 的类型) 等于 夏季树木
动作:
等待 5.00 秒
可破坏物 - 复活 (死亡的可破坏物) 并设置生命值为 ((死亡的可破坏物) 的最大生命值) , 显示 复活动画
PS:这里利用了等待语句,但如果死亡的可破坏物过多可能会造成无法复活或无法判断的情况,还有个方式就是利用周期性事件来执行刷新动作,利用选区范围内的可破坏物来复活(后详)。
第二章 ★ Triggert条件
Trigger是由事件、条件、动作组成。条件是执行动作之前的门槛,正确的使用条件,对增加触发执行准确率有至关重要的影响。一个触发器可以添加多个条件,默认情况下条件是串行的(AND),也就是说,必须全部达成这些条件才会开始执行动作;也可以设定并行(OR),只需要达成一个条件就会执行动作。条件的内容取值于触发事件相关的函数,就像如果是玩家事件,就无法直接调用“触发单位”的函数。
说判断函数之前,先说一下“变量”,变量可以通过赋值来保存和调用数据。很多人可能对“变量”有些理解,却不知道“变量”可以调用哪一些数据。通过下面对一些条件的分析,大家应该可以比较清楚的理解“变量”可使用的一些类型。如果变量是布尔值,那么,这个变量的值就是TRUE(真)或者FALSE(假);如果变量是单位,那么这个值就是“指定单位”,已存在的单位;如果变量是单位类型,这个值就可以赋值我们在物体编辑器里设定的单位类型的数据,然后通过调用这些变量来创建新的单位。变量组是对变量的扩展方式,同一个变量组的变量类型相同,变量组的格式是“变量名[下标值]”,下标值必须为整数,每一个变量组中的变量都是独立的。
说判断函数之前,先说一下“变量”,变量可以通过赋值来保存和调用数据。很多人可能对“变量”有些理解,却不知道“变量”可以调用哪一些数据。通过下面对一些条件的分析,大家应该可以比较清楚的理解“变量”可使用的一些类型。如果变量是布尔值,那么,这个变量的值就是TRUE(真)或者FALSE(假);如果变量是单位,那么这个值就是“指定单位”,已存在的单位;如果变量是单位类型,这个值就可以赋值我们在物体编辑器里设定的单位类型的数据,然后通过调用这些变量来创建新的单位。变量组是对变量的扩展方式,同一个变量组的变量类型相同,变量组的格式是“变量名[下标值]”,下标值必须为整数,每一个变量组中的变量都是独立的。
第一节 ☆ 布尔值
布尔值采用TRUE(真)FALSE(假)来进行判断,同时也可以对两个不同数据的比较进行判断,也就是说双重判断。布尔值包含了所有非对称(同类)比较的默认函数,涉及范围非常之广,因此当你发现其它条件中没有自己需要的时候,就要仔细查找布尔值的条件,很可能就找到你要的。因为布尔值的函数太多,所以我就不全部帖出来了,只取几个重要的做一些例子。
单位类别检查,这个就是检查单位的分类,最常用的就是判断单位是否英雄。
例14:如果玩家1的英雄死亡,那么就让这个英雄在玩家1的初始地点复活。
事件:
单位 - 玩家1(红色) 的单位 死亡
条件:
((触发单位) 是 英雄) 等于 TRUE
动作:
英雄 - 立即复活 (触发单位) 在 (玩家1(红色) 的游戏开始位置) , 显示 复活动画
PS:这只是一个简单的例子,具体要判断的内容是会比较丰富的,如下例。
例15:在(区域000内)的(玩家1)的(同盟,包含玩家1)的(英雄)死亡后复活在(各自的初始地点)。
事件:
单位 - 任意单位 死亡
条件:
((触发单位) 是 英雄) 等于 TRUE
(地区 000 <预设> 内存在 (触发单位)) 等于 TRUE
((触发玩家) 是 玩家1(红色) 的盟友) 等于 TRUE
动作:
英雄 - 立即复活 (触发单位) 在 (((触发单位) 的所有者) 的游戏开始位置) , 显示 复活动画
第二节 ☆ 单位&单位类型
单位和单位类型是两个不同的概念,单位就是“指定单位”,具体化存在的单位;单位类型就是游戏中已设定的数据,可用来创建单位或判断条件。
先说一下单位,前面已经介绍过,单位的函数(设定好的数据调用方式)必须通过“单位事件”才可以调用,而且不同的单位事件对应不同的单位函数。除了一个总而概括的“触发单位”可以替代大部分的单位函数以外,跟据事件的不同,可调用的单位函数也是不同的。另外,在动作中也同样需要调用这些函数来执行动作。单位函数如下表:
例16:当(剑圣0005)杀死(先知0006)的时候,执行动作复活(先知0006)。
事件:
单位 - 任意单位 死亡
条件:
(死亡单位) 等于 先知 0006 <预设>
(凶手单位) 等于 剑圣 0005 <预设>
动作:
英雄 - 立即复活 (死亡单位) 在 ((触发单位) 的位置) , 显示 复活动画
PS:看看这里有没有什么奇怪的地方呢?应该可以发现,在复活的位置上,我用了“触发单位”,前面已经提到过,“触发单位”是一个通用型的函数,是跟据事件而变化的。在这个触发里,“触发单位”所代表的含义就是“死亡单位”,因为触发的事件是“单位死亡”,这个是相对应的,所以在这个触发中我们所有的“死亡单位”和“触发单位”都是可以互换的。
例17:当(先知0006)对(剑圣0005)施放闪电链技能,修改先知力量属性添加10点。
事件:
单位 - 任意单位 开始施放技能
条件:
(施法单位) 等于 先知 0006 <预设>
(技能施放目标) 等于 剑圣 0005 <预设>
(施放技能) 等于 闪电链
动作:
英雄 - 修改 力量 对 (触发单位) : 添加 10 点
PS:这里应该比较好理解了,同样对于“触发单位”的定位跟据事件,就是“施法单位”,也就是(先知0006)。
单位类型的判断就是基于对事件数据和游戏设定数据进行比较,比较常用的是“单位的类型”,就是调用“单位”函数来判断单位类型再进行比较。
例18:如果暗影猎手死亡,奖励凶手单位所属的玩家1000金币。
事件:
单位 - 任意单位 死亡
条件:
((死亡单位) 的类型) 等于 暗影猎手
动作:
玩家 - 增加 1000 ((凶手单位) 的所有者) 的 现有黄金
第三节 ☆ 玩家&玩家颜色&玩家游戏状态&玩家控制者
玩家函数并不多,“选取的玩家”和“匹配的玩家”在后面的“玩家组”动作中会使用到;而转化索引就是把整数转换成玩家索引,在Trigger是从1开始到12分别是玩家,13是中立敌对,14是中立受害,15是中立特殊,16是中立被动。玩家索引在多人游戏中调用的很频繁,主要作用于变量组的应用。玩家函数列表如下:
例19:当玩家1(红色)的单位杀死玩家2(蓝色)的英雄时,奖励玩家1(红色)1000金币。
事件:
单位 - 任意单位 死亡
条件:
((凶手单位) 的所有者) 等于 玩家1(红色)
((触发单位) 的所有者) 等于 玩家2(蓝色)
((触发单位) 是 英雄) 等于 TRUE
动作:
玩家 - 增加 1000 ((凶手单位) 的所有者) 的 现有黄金
有很多人想知道怎么输入密码得到隐藏英雄;这,其实很简单。如果想多个玩家都可以获得,就要多添加几个事件才可以。
例20:当玩家1(红色)输入“SS”,创建一个“巫妖”给玩家1(红色)。
事件:
玩家 - 玩家1(红色) 输入的聊天信息包含 SS ,匹配方式: 完全匹配
条件:
略
动作:
单位 - 创建 1 个 巫妖 给 (触发玩家) 在 ((触发玩家) 的游戏开始位置) ,面向角度为 默认建筑朝向 度
玩家颜色的比较用得不多,实际上感觉用这个比较反而不如直接调用玩家函数。而玩家游戏状态和玩家控制者在“玩家组”的动作中应用很多,一般是做为判断是否在线或者是否由玩家或电脑在控制。这里就略过了,以后在“玩家组”动作进行详细解说。
第四节 ☆ 物品&物品分类&物品类型
同单位一样,物品和物品类型分别是指存在的物品(指定物品)和物品类型的数据,而物品分类是指“可充的”或者“人造的”之类的归类,每个物品都可以调整分类。物品的函数表如下:
事件响应对应的是单位事件中的对物品进行操作的事件,其中“获得物品”“丢弃物品”“使用物品”对应 “被操作物品”(类似于触发物品的意思,比较通用),而“出售物品”和“购买物品”都对应“出售的物品”,一般类似于物品栏移动或者单位发布的右键点击等命令就会用到“指令目标物品”。
例21:当英雄获得类型为“可充的”物品的时候,输出提示“获得的物品名字”。
事件:
单位 - 任意单位 获得物品
条件:
((被操作物品) 的分类) 等于 可充
动作:
游戏 - 对 (所有玩家) 发送文本信息: ((被操作物品) 的名字)
例22:当使用物品“装备合成”的时候,如果英雄身上物品栏第一格为“攻击之爪”,第二格为“影子之球”,那合成物品“影子之爪”。
事件:
单位 - 任意单位 获得物品
条件:
((被操作物品) 的类型) 等于 装备合成
(((触发单位) 物品栏第 1 格的物品) 的类型) 等于 攻击之爪
(((操作物品的单位) 物品栏第 2 格的物品) 的类型) 等于 影子之球
动作:
物品 - 删除 ((操作物品的单位) 物品栏第 1 格的物品)
物品 - 删除 ((操作物品的单位) 物品栏第 2 格的物品)
英雄 - 创建 影子之爪 给 (触发单位)
PS:这里有一个需要注意的地方,我用了“操作物品的单位”和“触发单位”,前面已经说过“触发单位”是通用型的,在很多情况下都可以代替一些函数,这里就是代替“操作物品的单位”。另外,像“装备合成”这个物品,可以利用书本或者符文等不需要判断物品栏是否有空位并直接使用的物品来制作,就不会因为物品栏满而无法实现升级。
例23:英雄不管任何一件物品都只充许获得一个,再次捡到就被丢弃
事件:
单位 - 任意单位 获得物品
条件:
(被操作物品) 不等于 ((触发单位) 所持有的 ((被操作物品) 的类型))
动作:
英雄 - 丢弃 (被操作物品) ,从 (触发单位) 身上
PS:像这样不管捡到什么物品,都只能捡一个,同样的物品再次捡到就会被丢弃,如果希望特定物品只充许捡一个的话,就再添加一些条件,比如物品分类为“人造”,那么只要是“人造”的物品都只能捡一个。
第五节 ☆ 整数&实数&字符串
之所以把这三项放在一节里说,是因为它们有一定的共通性,在特定情况下可以相互转换。整数,我想大家都理解吧,标准的阿拉伯数字;实数是带有小数点后两位数的,一般实数的作用于没有精确到整数的数值,比如游戏的时间以及单位的生命等都属于实数;字符串看似和前面两个数值没有关系,但在输出显示文本的时候,整数和实数必须要转换成字符串,而如果字符串的内容是数值的话,同样可以转换成整数或实数。
关于这三个分类的函数实在太多了>。<,而且这些内容的应用非常广,所以这里只是举一些实例来说明一些用法,只要你知道标准的数字就是整数,带小数点的就是实数,文本的就是字符串就OK了;达到必要条件的时候相互都可以转换。
例24:当英雄“骑士”升级到20级的时候,自动转职成“圣骑士”。
事件:
单位 - 任意单位 提升等级
条件:
((触发单位) 的类型) 等于 骑士
((触发单位) 的英雄等级) 等于 20
动作:
单位 - 将 (触发单位) 替换为 圣骑士 使用 新单位的最大 生命和魔法
英雄 - 设置 (最后替换的单位) 的英雄等级为 1 , 隐藏 升级动画
PS:这里用了一个“单位-替换”动作,会把单位整个替换掉,但物品全部保留,也可以保留生命值百分比。而第二个动作“英雄-设置英雄等级”为1,主要是为了让转职显得更加真实,当然不修改的话,转职后的单位就会是20级;属性方面,和转职后单位自己的设定有关,和转职前的单位的设定无关。
例25:当8级英雄大法师-吉安娜死亡以后,等待死亡英雄的等级*2秒的时间,复活死亡的英雄在自己开始位置,然后输出文字“英雄名字+英雄等级+‘已经复活!’”
事件:
单位 - 任意单位 死亡
条件:
((触发单位) 是 英雄) 等于 TRUE
动作:
等待 ((转换 ((触发单位) 的等级) 为实数) x 2.00) 秒
英雄 - 立即复活 (触发单位) 在 (((触发单位) 的所有者) 的游戏开始位置) , 显示 复活动画
游戏 - 对 (所有玩家) 发送文本信息: (((触发单位) 的称谓) + ((Lv + (转换 ((触发单位) 的英雄等级) 为字符串)) + 已经复活!))
PS:这里可以看到,因为计算的方式不同,显示的内容也不同。在等待语句中,因为等待是时间,也就是实数,而英雄等级是整数,因此必须要把整数转换成实数,然后再乘以2.00,取得正确的等待时间。而游戏中输出的,是字符串的计算方式;字符串相加的话,就是把字符串连在一起,所以输出的是“吉安娜lv8已经复活!”
例26:当中立敌对的单位死亡以后,有30%的机率掉落物品。
事件:
单位 - 中立敌对 的单位 死亡
条件:
(随机整数,最小值: 1 最大值: 100) 小于或等于 30
动作:
物品 - 创建 (等级 8 的随机 任何 物品类型) 在 ((触发单位) 的位置)
PS:在这个例子里,用到了两个随机,一个是条件中的随机整数(整数函数里面),取一个从1到100之间的数,再判断这个数小于或等于30,也就是达到30%的机率的目的。而后面一个是创建物品动作里面的一个函数,按物品的等级来算,等级8就有机率掉落“国王之冠”“死亡面罩”“能量之书”其中之一。随机数的用处很多,基本上一些带概率的事件都可以利用随机数来做,掌握随机数会让触发更加有意思。
第六节 ☆ AND&OR&废话
条件的内容的确还有,但一般都很少用到,所以这里就不详细介绍了,大体上和其它的几种条件比较的方式是差不多的,如可破坏物,就是指树或大门之类的,这种比较和单位比较没啥大的区别。再简单介绍一下条件的通配符。
“AND”就是“与”的意思,使用AND做为通配符连接两个条件的话,是并行的,也就是说,必须完全达成这些条件才可以执行动作,默认采用的是AND方式。“OR”就是“或”的意思,是串行的,OR中的条件只要达成一个,就会执行动作。这两个存在于条件的最下面,“标准”和“多个条件”的区别也只是在条件的数量上,默认的是两个,多个就不限数量了。
例27:当英雄“牧师”“法师”“祭祀”到10级以上的时候,获得“圣光的预言”,会转职成为“大预言师”。
事件:
单位 - 任意单位 获得物品
条件:
((触发单位) 的英雄等级) 大于或等于 10
((被操作物品) 的类型) 等于 圣光的预言
任一条件成立
条件
((触发单位) 的类型) 等于 牧师
((触发单位) 的类型) 等于 法师
((触发单位) 的类型) 等于 祭祀
动作:
单位 - 将 (触发单位) 替换为 大预言师 使用 新单位的最大 生命和魔法
英雄 - 设置 (最后替换的单位) 的英雄等级为 1 , 隐藏 升级动画
PS:这里可以看到,前面两个条件,英雄等级和物品类型是默认的,也就是AND的条件模式,必须完全达成,而后面的“任一条件成立”就是OR的模式,只要达成其中之一就可以了。
第三章 ★ Triggert动作
Trigger是由事件、条件、动作组成。在完成事件的触发,条件的判断以后,才会执行动作;作是触发器执行的步骤,也是触发器的灵魂,我们需要的功能都是由动作来执行。正因为动作的内容如此丰富,就像积木一样由我们自己搭配;因此,对每一块积木的形态的掌握至关重要,不要好高骛远,等你熟悉各条动作的作用,你就可以组合出各种自己需要的触发器。
第一节 ☆ 基础动作
这些动作不包括在各个分类中,但对于具体的执行却有至关重要的影响。如下表:
脚本就是利用触发器的API界面来运行JASS,但受限于API的功能,无法像JASS一样随性的书写,因此这个只能作为辅助动作来使用。
等待的话,就是在一定的时间或条件达成以后再执行下面的动作,一般情况下等待语句尽量少用,特别是在各个触发相互调用数据的时候,可能会造成冲突;当然,事情也并没有这么严重,等待的使用频率还是会很高的,必要的时候还可以用计时器。
设置变量,这个是非常重要的一个动作,其使用方式是赋值“设置 变量名=被赋值的同类型内容”,注意这里的“=”不是“等于”的意思,是把后面的数据赋值给变量,而使变量可以代替这个数据。例如“设置 单位变量Unit=大法师0001”,那么再次对“Unit”变量赋值之前,对“Unit”的操作就等同于对“大法师0001”的操作。不同的变量对应不同的数据类型,所以我们在需要对数据进行赋值到变量的操作的时候,先要确定这个数据是什么类型,然后再创建同一类型的变量来执行赋值语句。
跳过余下动作就是不再执行剩下的动作,在一个触发的动作中,也显得比较重要,一般是在达成一定的条件以后,跳过余下不再需要执行的动作,但有一点,在组动作执行的时候无效。
正因为该变量是一直在变化的,所以我们可以利用这个变化来执行我们需要的一些重复动作,还可以对该变量进行赋值以达到跳跃执行或重复执行的效果。
例28:创建12个单位,并命令他们攻击移动到区域000。
动作:
For循环整数A从 1 到 12, 做动作
Loop - 动作
单位 - 创建 1 个 步兵 给 玩家1(红色) 在 ((可用地图区域) 的中心点) ,面向角度为 默认建筑朝向 度
单位 - 对 (最后创建的单位) 发布 攻击移动 命令到目标点: (矩形区域 000 <预设> 的中心点)
PS:可以看到,这里的基础值是1,上限值是12,也就是说,这个循环会执行12次,每次会创建一个步兵,然后会命令这个步兵攻击移动到区域000。另外,还有需要说明的是“最后创建的单位”只对应一个单位,而且是在这条语句执行前创建的单位,所以如果一次创建2个或更多单位的时候,也只会对一个单位发布命令;利用FOR循环就可以对每一个单位独立发布命令了。
例29:设定单位变量组保存步兵、女巫、骑士、火枪手四个单位类型,每五秒创建同一种类型12个单位,并命令他们攻击移动到区域000。
动作:
设置 Unit[1] = 步兵
设置 Unit[2] = 女巫
设置 Unit[3] = 骑士
设置 Unit[4] = 矮人火枪手
For循环整数A从 1 到 4, 做动作
Loop - 动作
For循环整数B从 1 到 12, 做动作
Loop - 动作
单位 - 创建 1 个 Unit[(循环整数A)] 给 玩家1(红色) 在 ((可用地图区域) 的中心点) ,面向角度为 默认建筑朝向 度
单位 - 对 (最后创建的单位) 发布 攻击移动 命令到目标点: (矩形区域 000 <预设> 的中心点)
等待 5.00 秒
PS:这里用到了变量组,关于变量组的设定就是同一个名称的变量因为下标值的不同也可以每一个当成独立的变量,这里分别赋值了四个单位的类型。然后可以看到FOR的嵌套,作用就是利用两个或两个以上的循环以达到复数执行动作的目的。
比如例中循环A的上限是4,也就是该循环会执行4次,然后在这个循环里包含了循环B,上限是12,会执行12次,也就是说,每一次循环A的执行都会执行循环B的动作12次,一共是4*12=48次循环B的动作。
然后可以看到,Unit[(循环整数A)]这个值,前面可以看到,我们分别对应Unit[1]到Unit[4]进行了赋值,而循环数A在执行的过程中会分别变成1、2、3、4,所以这就好理解了,当把循环数A为1的时候放置在下标值中,那么Unit[(循环整数A)]就等同于Unit[1]了。
例30:当随机整数1-100小于30的时候,结束循环动作(已设定整数变量X)。
动作:
For X 从 1 到 2, 做动作
Loop - 动作
如果所有条件成立则做动作1,否则做动作2
If - 条件
(随机整数,最小值: 1 最大值: 100) 小于 30
Then - 动作
设置 X = 2
Else - 动作
设置 X = 1
PS:这里利用了自定义值X来做循环,虽然这个循环从1到2只能执行两次,但是里面有一个IF的动作,其作用就是判断取得的随机值是不是小于30,当这个值小于30的时候,对变量X进行赋值为2.。前面已经提过,FOR循环每执行一次就会对整数变量做增加1的动作,那么当X=2的时候,本循环结束后X=2+1=3了,已经超过上限值2,所以不会再执行了。而如果值不小于30,也就是条件没有成立的时候,X=1,执行结束以后X=1+1=2,还会继续执行。如果条件继续不成立,X结束时还是2,还是会执行,直到条件达到为止。
第二节 ☆ 单位动作
单位动作是我们使用频率最高的动作,所以这里只是简单分析一下动作的使用方式,而在其它章节中,会多次使用这些动作。
创建单位,在我们刷兵之类的触发中经常利用到,尸体的话,除了一些利用尸体的技能,主要是做为装饰物而存在吧。创建单位的格式如下:
单位 - 创建 1 个 步兵 给 玩家1(红色) 在 ((可用地图区域) 的中心点) ,面向角度为 默认建筑朝向 度
其中,“1个”表示创建的单位数量,“步兵”是单位的类型,“玩家 1(红色)”是创建的单位所属,就是这个单位创建以后是归谁的,“((可用地图区域)的中心点)”这个是创建单位的位置,“面向角度”就是单位的朝向,默认是270度,可自已改。另外需要说明的是,这个动作所对应的单位函数是“最后创建的单位”,在调用时会利用到。
一般来说,当我们不再使用这个单位的时候,就需要从地图上抹掉该单位。“杀死单位”的功能就像说明一样,让这个单位死亡,但同时会触发单位死亡事件的触发器,“爆炸”的话和杀死单位一样,但会出现爆炸死亡的动画效果。如果不希望触发到事件,那么就用“删除单位”,把这个单位从地图中不留痕迹的抹掉。
“替换单位”的作用比较奇特,普通单位的替换就是将一个单位完全替换成另一个单位,而英雄的替换会保留物品和经验值。这个动作的单位函数是“最后替换的单位”,可以在替换以后调用。“隐藏”和“解除隐藏”就是让单位可见或不可见,被隐藏的单位无法选择到,在使用的时候要用变量来保存以便控制。“改变所有者”就是改变控制权到指定玩家,同时可以决定是否改变颜色,而“改变颜色”的动作只会变化颜色。“共享视野”在特定的情况下可以给其它玩家一起看到指定单位的行动,同盟并共享视野的情况下并不需要这个动作。
“移动单位”就是将指定的单位从一个区域瞬间移动到另一个区域,和后面要讲的发布命令不同,这个是直接移动的。“面向角度”和“面向点”在创建单位的时候就有看到过了,作用是相同的,在制作影片的时候可以考虑使用来达到一些效果。
“集结点”在对战时用得很多,基于建造单位的方式而使用,指定训练的单位攻击移动到某个点,最快的训练单位速度是1秒,可以做为另类的刷兵触发使用。
“设置生命”和“设置法力”就是设定当前生命和法力值,前面是按百分比来设的,后面是具体数值,也可以利用这些直接加减来对单位造成伤害的模拟,只是没有伤害源。
“设置无敌状态”简单的说和添加“无敌”技能效果是一样的。“暂停”的动作主要是用在电影制作上,以防止一些单位自由行动。“生命周期”就是该单位可以存活的时间,现在用得最多的就是对T技能的辅助单位设定以达到自动消除的效果。
前面已经提到过单位爆炸死亡的动作,不过那个直接导至单位死亡,而现在这个动作就是设置单位的死亡形式,当单位死亡在其它方式死亡以后也会以设置的形式来死亡。“暂停尸体腐烂”是作用于单位死亡以后尸体腐烂之前,用来保存死亡的尸体在便在特殊的时候使用。“重置技能CD”就是直接将单位所有技能的冷却时间设为到期,显示技能可使用状态。
这里设定的是按百分比来计算的,不管是建造的还是升级的都是如此,在特殊情况下可以利用这个来做“加速建造”的特殊使用方式。
控制单位直接睡眠的话,该单位必须要有“一直睡眠”的技能,设置夜晚睡眠的单位只对中立单位有效,醒来就是让单位清醒,但并不影响“催眠魔法”的效果。“警戒范围”只对建筑有效。
营救是一种特殊状态,当开启营救状态以后,指定可营教的单位进入营救范围,就会改变这个单位所属(被营救,可设定营救后所属玩家),同时可以设定是否改变颜色等。
对指定单位开关占用人口,也就是说,把该单位所需要的人口数降为0。
这个在前面已经遇到好多次了,主要是设定单位的前面角度。在电影的制作中,可以设定单位面向单位以取得对话效果;面向地点可以在播放某些动作的时候设定所有单位面对的方向,点是不动的,每个单位所设定的角度是不同的;单位面向角度就是对单位设定具体的角度。
单位的移动速度如果设为0的话,这个单位就不会移动了,可以利用这个把单位变成类似于建筑的守卫,上限是522。“碰撞开关”是一个很有趣的东西,设定了以后,该单位可以穿越其它单位而不会被阻撞,但这个是单向的,也就是说,其它单位依然无法越过该单位。现在比较常用的就是利用在T技能的辅助单位上,让两个单位重叠以实现技能从原始单位身上发出的效果。
“主动攻击范围”就是当敌人进入这个范围以后会自动攻击,可以通过T来改变范围大小。“自定义数值”简单的说,就是把单位当成一个整数变量,可以对单位设定整数以达到一些效果,比如做为ID区别单位等等。
移除持续魔法效果,前一个全移除全部效果,后一个可以设定移除有益或有害的BUFF,最后面一个是移除“指定的技能”的魔法效果。
添加技能,可以直接给单位添加各个技能,删除正好相反。降低和提升技能等级都只是对原来技能等级进行加减1的动作,最低是1级,最高是技能上限,如果单位没有指定技能则不执行动作,设定技能等级就是直接改变到一定等级。因为技能的目标选择和单位分类有直接关系,所以如何设定不同分类也是区分不同单位的重要部分。
对单位发布命令,是制作AI的最基础部分,不同的命令发布对应不同的命令。比如需要攻击一个单位,那么就发布目标是单位的命令,选择里面的“攻击”命令来执行,同时也可以发布针对单位施放的技能(说明一下,自定义技能的命令发布方式是对原技能进行发布命令);目标是一个点的作用是对一个点的动作和施放技能,比如大法师的暴风雪等,而在一些守护图中,也经常用到命令单位“攻击移动”到指定点,然后单位就会跑过去,并且遇到敌人就会主动攻击。像“采集”之类的技能针对的是树木(可破坏物)。而没有目标的命令就是不指定单位或点,直接施放的,例如山丘之王的震击,或者一些带有自动施放能力的技能的开关等等都在这个选项。“训练”“研究”“建造”这个就不需要多说明了,玩过对战的都知道。
这些是对单位身上的物品栏是行操作,我们可以设定一个带有单位物品栏的单位帮忙捡取物品,然后交给我们的英雄,可以通过这些动作来实现。
这个动作的最大作用,现在来看就是做属性强化伤害时使用。例如一个技能附加智力*3的伤害,那么就可以利用这个对目标单位增加伤害。简单的例子:
单位 - 命令 (伤害来源) 对 (被攻击单位) 造成 ((转换 (智力 对 (伤害来源) (不包括 加成)) 为实数) x 3.00) 点伤害,攻击类型: 法术 伤害类型: 普通
单位动作是我们使用频率最高的动作,所以这里只是简单分析一下动作的使用方式,而在其它章节中,会多次使用这些动作。
创建单位,在我们刷兵之类的触发中经常利用到,尸体的话,除了一些利用尸体的技能,主要是做为装饰物而存在吧。创建单位的格式如下:
单位 - 创建 1 个 步兵 给 玩家1(红色) 在 ((可用地图区域) 的中心点) ,面向角度为 默认建筑朝向 度
其中,“1个”表示创建的单位数量,“步兵”是单位的类型,“玩家 1(红色)”是创建的单位所属,就是这个单位创建以后是归谁的,“((可用地图区域)的中心点)”这个是创建单位的位置,“面向角度”就是单位的朝向,默认是270度,可自已改。另外需要说明的是,这个动作所对应的单位函数是“最后创建的单位”,在调用时会利用到。
“替换单位”的作用比较奇特,普通单位的替换就是将一个单位完全替换成另一个单位,而英雄的替换会保留物品和经验值。这个动作的单位函数是“最后替换的单位”,可以在替换以后调用。“隐藏”和“解除隐藏”就是让单位可见或不可见,被隐藏的单位无法选择到,在使用的时候要用变量来保存以便控制。“改变所有者”就是改变控制权到指定玩家,同时可以决定是否改变颜色,而“改变颜色”的动作只会变化颜色。“共享视野”在特定的情况下可以给其它玩家一起看到指定单位的行动,同盟并共享视野的情况下并不需要这个动作。
对指定单位开关占用人口,也就是说,把该单位所需要的人口数降为0。
单位的移动速度如果设为0的话,这个单位就不会移动了,可以利用这个把单位变成类似于建筑的守卫,上限是522。“碰撞开关”是一个很有趣的东西,设定了以后,该单位可以穿越其它单位而不会被阻撞,但这个是单向的,也就是说,其它单位依然无法越过该单位。现在比较常用的就是利用在T技能的辅助单位上,让两个单位重叠以实现技能从原始单位身上发出的效果。
添加技能,可以直接给单位添加各个技能,删除正好相反。降低和提升技能等级都只是对原来技能等级进行加减1的动作,最低是1级,最高是技能上限,如果单位没有指定技能则不执行动作,设定技能等级就是直接改变到一定等级。因为技能的目标选择和单位分类有直接关系,所以如何设定不同分类也是区分不同单位的重要部分。
对单位发布命令,是制作AI的最基础部分,不同的命令发布对应不同的命令。比如需要攻击一个单位,那么就发布目标是单位的命令,选择里面的“攻击”命令来执行,同时也可以发布针对单位施放的技能(说明一下,自定义技能的命令发布方式是对原技能进行发布命令);目标是一个点的作用是对一个点的动作和施放技能,比如大法师的暴风雪等,而在一些守护图中,也经常用到命令单位“攻击移动”到指定点,然后单位就会跑过去,并且遇到敌人就会主动攻击。像“采集”之类的技能针对的是树木(可破坏物)。而没有目标的命令就是不指定单位或点,直接施放的,例如山丘之王的震击,或者一些带有自动施放能力的技能的开关等等都在这个选项。“训练”“研究”“建造”这个就不需要多说明了,玩过对战的都知道。
这个动作的最大作用,现在来看就是做属性强化伤害时使用。例如一个技能附加智力*3的伤害,那么就可以利用这个对目标单位增加伤害。简单的例子:
单位 - 命令 (伤害来源) 对 (被攻击单位) 造成 ((转换 (智力 对 (伤害来源) (不包括 加成)) 为实数) x 3.00) 点伤害,攻击类型: 法术 伤害类型: 普通
第三节 ☆ 英雄动作
英雄动作是单位动作的衍生动作,主要是针对英雄的特性来执行一些动作。
学习技能的话,就是英雄自带的英雄技能,在还有技能点数的情况下,可以自动让他学习,制作AI的又一个基础要素。
设置等级,就是改变英雄的当前等级,并设定经验为当前等级的初始值。设置经验,改变英雄的当前经验,就是累计经验,只可以升不可以降。增加经验,和前面一样,但不同的是增加在累计基础上,同样只升不降。开启和关闭经验就是决定是否让英雄获得经验,设置经验比率对改变游戏难度有帮助,设置英雄获得的经验值百分比。
这里有一个很有趣的东西,“设置等级”是可以改变等级,在改变等级的情况下,比如7级改6级,就会回到6级的初始值。而“设置经验”是只可以增长而不能降低的,但如果把两者结合呢?
演示31:随意改变英雄的经验值,只需要输入数值就可以改变经验。
事件:
玩家 - 玩家1(红色) 输入的聊天信息包含 <空字符串> ,匹配方式: 包含字符串
条件:
动作:
英雄 - 设置 血魔法师 0000 <预设> 的英雄等级为 1 , 隐藏 升级动画
英雄 - 设置 血魔法师 0000 <预设> 的经验值为 (转换 (输入的聊天信息) 为整数) , 隐藏 升级动画
PS:因为前面已经说过了,改变等级就会重置经验,等级1的初始值为0,然后再设定经验值的话就完成了改变经验的过程,因为只是增加而不是减少。如果在高级界面里修改掉有关“等级”的数据为空格的话,就不会显示等级了,可以做成随意控制的能量条哦。
第四节 ☆ 玩家动作
玩家动作,针对“指定玩家”执行的动作,主要作用于属性的变化上面。
例32:设置所有玩家初始金钱为1500,而且打开每一个玩家的金钱奖励(玩家之间杀死单位增加金钱)。
事件:
地图初始化
条件:
动作:
玩家组 - 选取 (所有玩家) 内所有玩家做动作
Loop - 动作
玩家 - 设置 (选取玩家) 的 现有黄金 为 1500
玩家 - 设置 给予奖励 打开 对 (选取玩家)
PS:这里用到了“选取玩家”,这个是玩家组应用的方式,对应玩家组选择的每一个玩家。
开关睡眠只影响夜晚中立生物的睡眠状态,不会对催眠技能产生影响。设置同盟只对同盟和敌对各方面关闭进行设定,而设定同盟状态,是设置同盟之间的细节关系。
这两个动作的作用很相似,都是充许和禁用。其中禁用技能的话,指定玩家的单位就不能使用这个技能。而设置单位可用性,被禁止的单位不可以训练也不可以建造,但不影响触发的创建动作。
演示33:在酒馆当有玩家购得一个英雄以后,其它玩家无法再购得同类型英雄。
事件:
单位 - 任意单位 出售单位
条件:
((被贩卖单位) 是 英雄) 等于 TRUE
动作:
玩家组 - 选取 (所有玩家) 内所有玩家做动作
Loop - 动作
玩家 - 设置 ((被贩卖单位) 的类型) 可取得的 对 (选取玩家)
PS:关于科技增强难度,首先需要确定一下科技的属性,比如增加生命值的科技,设每级增加100生命,然后把这个科技给予所有需要受到影响的单位(单位编辑“使用科技”栏),同样可以设定攻击力等数值的科技。这样在必要的时候只要修改科技等级就可以达到改变难度的效果了。
第五节 ☆ 单位组&玩家组动作
组的作用就是对多个的单位或玩家或物品或可破坏物进行同一个操作。把单位组和玩家组放在一起是因为两者的操作方式很相似,在一些函数应用上也差不多。这里先稍稍解释一下组动作中常用的函数:选取和匹配,前者的作用是在选择好的单位组中可以针对发布命令,而后者是在选择的过程中的条件中使用。
事件:
时间 - 游戏开始 5.00 秒
单位 - 玩家10(淡蓝) 的单位 死亡
条件:
动作:
如果所有条件成立则做动作1,否则做动作2
If - 条件
(G 中所有单位死亡) 等于 TRUE
Then - 动作
单位组 - 清空 G 内所有单位
For循环整数A从 1 到 12, 做动作
Loop - 动作
单位 - 创建 1 个 骑士 给 玩家10(淡蓝) 在 (玩家10(淡蓝) 的游戏开始位置) ,面向角度为 默认建筑朝向 度
单位组 - 添加 (最后创建的单位) 到 G
单位 - 对 (最后创建的单位) 发布 攻击移动 命令到目标点: (玩家5(黄色) 的游戏开始位置)
Else - 动作
无动作
PS:这个演示特殊的地方,在于用了两个并不冲突的事件,一个是在游戏开始时进行刷兵的时间,另一个是单位死亡以后再判断的是否所有单位死亡后执行的刷兵动作,两个不冲突的事件是可以并行使用的,不过需要注意细节问题,比如不同事件对应不同的函数,必须要通用的函数才会被正确执行。单位组G在这里的应用就是判断单位的存活数,只有当单位死完以后才可以执行动作。
例35:选择地图中所有的步兵,并执行转换为骑士动作,这里用了两种方式:
1.利用匹配单位比较
事件:
时间 - 游戏开始 5.00 秒
条件:
动作:
单位组 - 选取 ((可用地图区域) 内满足 (((匹配单位) 的类型) 等于 步兵) 的所有单位) 内所有单位做动作
Loop - 动作
单位 - 将 (选取单位) 替换为 骑士 使用 旧单位的百分比 生命和魔法
2.利用选取单位比较
事件:
时间 - 游戏开始 5.00 秒
条件:
动作:
单位组 - 选取 ((可用地图区域) 内的所有单位) 内所有单位做动作
Loop - 动作
如果所有条件成立则做动作1,否则做动作2
If - 条件
((选取单位) 的类型) 等于 步兵
Then - 动作
单位 - 将 (选取单位) 替换为 骑士 使用 旧单位的百分比 生命和魔法
Else - 动作
无动作
PS:以上两个演示很好的阐述了组动作的两个函数的作用,在我们选取单位进行执行判断的时候,经常会用到判断语句来筛选我们需要的单位。
玩家组的操作方式和单位组基本相同的,而且在前面已经介绍过具体的玩家动作,所以这里就不再多解释了。不过有一点需要注意的,就是在对玩家组进行操作的时候,不能同时对玩家组中的玩家数进行判断。因为玩家组的执行方式是移出(就是把执行过动作的玩家移出玩家组),所以不要在执行玩家组动作时添加额外的操作,单位组不存在此问题。