JASS脚本
JASS
(Just Another Scripting Syntax) is an event driven scripting language used in Blizzard Entertainment’s Warcraft III game. Map creators can use it in the World Editor to create triggers and AI scripts.
JASS
(仅仅是另一个脚本语法)是一个事件驱动型的脚本语言,被用在War3中。用户可以在地图编辑器中使用它来创建触发器和AI脚本。
——Jass Coding | Warcraft 3 World Editor Wiki | Fandom
http://jass.sourceforge.net/doc/ 是一个非官方的JASS手册。
本篇目标是尝试在触发器中使用JASS脚本。并讨论一些相关的内容。
触发器中运行“单行脚本”
在触发器的动作
中,有一个类型是Custom Script
这个“动作”代表运行一个单行的JASS脚本。
例如call DisplayTextToPlayer(GetLocalPlayer(), 0,0, "Hello, yaksue!")
将显示“Hello, yaksue!”给玩家
接着,我设置这个触发器的事件
为“当一个单位死亡”
测试:
触发器转换为“自定义文本”
上述的使用方式中,只能运行简单的命令,但有时逻辑必须使用多行来表示。
为此,可以将一个触发器转换为“自定义文本”
正如编辑器所提示,这个转换是不可逆的:(其实这也意味着转换之后,对逻辑的控制更加底层了)
转换之后生成了多行代码。对这个结构暂时先不研究。
不过可以看到:之前定义的逻辑,在Trig_Untitled_Trigger_001_Actions
这个函数中:
现在稍微改变Trig_Untitled_Trigger_001_Actions
其中的逻辑,加一个循环,让它计数10次然后输出信息:
function Trig_Untitled_Trigger_001_Actions takes nothing returns nothing
local integer i=0
loop
exitwhen i==10
call DisplayTextToPlayer(GetLocalPlayer(), 0,0, "yaksue count:"+I2S(i))
set i=i+1
endloop
endfunction
//===========================================================================
function InitTrig_Untitled_Trigger_001 takes nothing returns nothing
set gg_trg_Untitled_Trigger_001 = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Untitled_Trigger_001, EVENT_PLAYER_UNIT_DEATH )
call TriggerAddAction( gg_trg_Untitled_Trigger_001, function Trig_Untitled_Trigger_001_Actions )
endfunction
测试:
地图的脚本
地图可以导出脚本
不过我并没有找到“导入脚本”的操作。我觉得这可能意味着,存在于地图中的数据,并没有全部都能被导出到脚本中,否则的话二者就可以无缝转换,而不是现在这样只能地图单向到脚本。
通过比较差异来学习脚本操作
我能想象到的一个利用地图的“导出脚本”功能来学习JASS的一些函数的方法是:
比较操作前后的差异。
例如:
我新建一个空白的地图,导出脚本到test_a.j
然后在地图中做些操作,例如放置几个农民:
再导出脚本到test_b.j
这样,可以比较两个脚本的差异(比较差异的软件我使用了Meld):
经过简单的分析,就可以明白CreateUnitsForPlayer0
中有放置4个农民的操作:
function CreateUnitsForPlayer0 takes nothing returns nothing
local player p= Player(0)
local unit u
local integer unitID
local trigger t
local real life
set u=BlzCreateUnitWithSkin(p, 'hpea', - 209.7, 79.4, 109.955, 'hpea')
set u=BlzCreateUnitWithSkin(p, 'hpea', - 90.2, 74.0, 66.645, 'hpea')
set u=BlzCreateUnitWithSkin(p, 'hpea', 30.3, - 11.6, 155.725, 'hpea')
set u=BlzCreateUnitWithSkin(p, 'hpea', - 21.9, - 131.8, 169.700, 'hpea')
endfunction
而其中BlzCreateUnitWithSkin
就是放置单位的操作了。
接下来,我可以在一个新的地图中,建立一个触发器,使用Map initialization
作为事件
,转换为“自定义文本”,然后将生成农民的代码拷贝到函数体中:
之后,我虽然在地图编辑器内看不到农民,但是因为有了一个在地图初始化阶段就触发的触发器,其中有逻辑放置农民。所以我运行游戏的时候可以看到4个农民:
如何查阅原生函数
DisplayTextToPlayer
用来显示信息,BlzCreateUnitWithSkin
用来放置单位,这些函数都是“原生函数(Native functions )”
在 http://jass.sourceforge.net/doc/globals.shtml#native中有如下描述:
Native functions are functions that are implemented within the Warcraft III engine. They form the API which the game exports to JASS programmers. Unless you have access to Warcraft III’s source code, you probably will not be defining a new native function, but you will probably call them. Their prototypes are declared in common.j, common.ai, and Blizzard.j.
原生函数(Native functions)是War3引擎所实现的函数,他们构成了导出给JASS程序员的API。除非你可以获取War3的源代码,否则你不可能定义新的原生函数,只能调用他们。函数的声明被放在了common.j
,common.ai
,Blizzard.j
中。
我通过搜索,在我的C:\Users\admin\Documents\Warcraft III\JassHelper
路径发现了common.j
和Blizzard.j
:
其中DisplayTextToPlayer
和BlzCreateUnitWithSkin
都能在common.j
中找到:
native DisplayTextToPlayer takes player toPlayer, real x, real y, string message returns nothing
native BlzCreateUnitWithSkin takes player id, integer unitid, real x, real y, real face, integer skinId returns unit