本指南旨在介绍自定义游戏制作和脚本编写。 简介 本指南假定你至少具备地图编辑器的基本使用知识,以及一般脚本和编程概念的基础。本指南仅作为自定义游戏制作和脚本编写的入门介绍,并非该语言的深入技术概述。但对于地图制作而言,其内容应足够详细。 开始制作 在地图编辑器中创建新地图时,地图类型默认设为【遭遇战】。遭遇战地图使用标准游戏规则集,且不支持任何脚本。若要制作具有自定义规则集的自定义地图,应将地图类型更改为【自定义】。要实现这一点,请点击【地图设置】(位于顶部栏),然后从地图类型下拉菜单中选择【自定义】选项。 玩家槽位 除了能够运行自定义脚本外,自定义地图还可以修改玩家槽位。总共有四个槽位,每个槽位可以设置为以下选项之一: - 开放:开放槽位可在开始游戏时从大厅中选择,可供人类玩家、AI机器人使用,或设为空位。 - 关闭:关闭槽位任何人都无法使用。仍可在地图编辑器中放置分配给该槽位的单位,但它们将缺乏集中式AI(被挑衅时仍会攻击其他队伍的单位)。 - AI:AI槽位无法从大厅中选择,但会拥有正常的AI行为。该内容为代码示例,与Uncrewed游戏无关,无法进行符合要求的汉化处理,故删除。布尔表达式 条件语句是一种布尔表达式——一种计算结果为真或假的语句。 该语言提供了多种可用于构建此类语句的运算符,它们分别是: 等于:==运算符 不等于:!=运算符 小于:<运算符 小于等于:<=运算符 大于:>运算符 大于等于:>=运算符 还有逻辑运算符可用于将较小的条件语句组合成更复杂的语句: 非:!运算符 与:&&运算符 或:||运算符 循环 循环用于执行一条语句或一组语句,直到满足某个条件为止。共有三种类型的循环可用。范围循环 范围循环旨在与列表等可迭代对象配合使用。它是对一组值执行操作的最简单方式。 for (x : 可迭代对象) { 操作语句 } 例如: element_sum = 0; for (x : list(1, 2, 3)) { element_sum = element_sum + x; } 此例中,变量element_sum将包含列表元素的总和,即6。 for循环 for循环是一种更通用的循环形式。它依赖于条件语句的结果为真。 for (初始化语句; 条件语句; 迭代语句) { 操作语句 } 首先执行初始化语句,完成循环准备所需的所有步骤。此语句仅执行一次。然后执行条件语句,如果条件语句的计算结果为 true,则执行操作语句,最后执行迭代语句。之后循环会重新从条件语句开始。当条件语句的计算结果为 false 时,循环停止。 例如: y = 0; for (i = 0; i < 5; i = i + 1) { y = y + 5; } 这里,首先初始化语句声明变量 i 并将其初始化为 0,然后条件语句检查变量 i 是否小于 5,如果是,则执行操作语句,即简单地将 5 加到变量 y 上。接着迭代语句将 i 加 1,循环重新从条件语句开始。这个循环总共会执行 5 次,最终变量 y 的值为 25。While循环 While循环与一般的For循环类似,但它没有初始化语句,也没有迭代语句。 while (条件语句) { 执行语句 } 条件语句会被执行,如果其计算结果为true,则执行语句会被执行。循环会重新从条件语句开始。当条件语句的计算结果为false时,循环停止。 y = 0; x = 0; while (x < 5) { y = y + 5; x = x + 1; } 这个循环总共会执行5次,最终变量y的值为25。 函数 函数是代码块。通过调用函数可以执行其包含的代码。调用函数时,函数可以接收多个参数,也可以不接收参数。函数还可以返回一个值。函数调用的形式如下: function-name(argument-0, argument-1, ..., argument-n) 大多数函数接受固定数量的参数。例如,函数min接受两个参数,并返回其中较小的那个: min(23, 9) 函数的结果可以绑定到变量: x = min(23, 9) 结果是变量x包含值9。 也有一些函数接受可变数量的参数。例如用于初始化列表的list函数: empty_list = list(); short_list = list(1, 2); longer_list = list("Cat", "Dog", "House", "Car", "Keys"); Lambda函数 Lambda(也称为匿名函数)是一种未绑定到特定名称的函数。Lambda函数的声明和定义如下: [capture-list] (parameter-list) { body } 首先,声明中的捕获列表部分指定了它可以使用其声明所在作用域中的哪些变量。 例如,以下lambda可以访问变量x和y,但不能访问z: x = 5; y = 7; z = 3; do_something = [x, y] () { x = 1; y = -6; }; do_something(); 请注意,lambda内部对变量x和y所做的更改不会影响外部变量,因为它们在lambda初始化时会被复制。 为了能够修改原始变量,需要在捕获列表中用ref限定符标记它们。x = 5; y = 7; z = 3; do_something = [ref x, ref y] () { x = 1; y = -6; }; do_something(); 如果 lambda 的捕获列表中包含 ref 或 val 限定符,它可以自动捕获引用的变量。 x = 5; modify_some_var = [ref] () { x = 1; // lambda 内部和外部的变量 x 现在都包含 1。 }; modify_some_var(); do_not_modify_some_var = [val] () { x = 10; // lambda 内部的变量 x 现在包含 10, // 但 lambda 外部的变量 x 仍保持不变,为 1。 }; do_not_modify_some_var(); 然后参数列表指定 lambda 函数的参数名称和数量。它也可以留空。 最后,函数体是一组表示函数代码块的语句。lambda表达式的最后一个语句的结果也会成为它的返回值。 和其他函数一样,为了发挥作用,lambda函数需要被调用。调用方式有以下几种: 1. lambda函数可以在接受函数对象的函数参数位置进行声明和定义,然后由该函数执行:min_element(list(2, 1, 3), [] (x, y) {x < y}) 函数min_element会执行lambda函数[] (x, y) {x < y},以找出列表中的最小元素并返回。 2. lambda函数可以绑定到一个变量,以便稍后调用。 square_and_add_one = [] (x) { x * x + 1 }; square_and_add_one(5) 3. lambda函数也可以在声明、定义后立即被调用。结果 = [] (文本) { 文本 + " :)"; } ("你好世界"); 注释 注释是不会被解释为代码的文本片段,并且会被脚本编译器完全忽略。它们可用于解释代码或暂时禁用部分代码。 有两种类型的注释:单行注释和多行注释。 单行注释以//(两个斜杠)开头,它指示编译器忽略该行末尾之前的所有内容。 // 这是一条注释,会被脚本编译器忽略 x = 2;// 这也是一条有效的注释。 多行注释以/* 需要忽略的文本 */的形式编写,这意味着/* */之间的所有内容都会被忽略。例如,如果你想制作一张PVE地图,让两名玩家组成一队对抗同样组队的两名AI敌人,那么槽位设置可能如下: 玩家一 (开放) 队伍(A) 玩家二 (开放) 队伍(A) 玩家三 (AI) 队伍(B) 玩家四 (AI) 队伍(B) 脚本对象 最后,要自定义地图规则,需要使用脚本对象。添加新脚本对象的方法是:进入【对象】->【工具】,然后搜索【空脚本】。 脚本对象自身有几个属性: 名称 - 脚本的名称;注意此名称无法在代码中的任何位置引用,更多是作为描述使用。运算符参考 以下是所有可用运算符的列表: 运算符 描述 示例 [] 下标 list(1, 2, 3)[0] () 函数调用 square(4) unary ! 逻辑非 !x unary - 一元减号 -x unary + 一元加号 +x * 乘法 x * y / 除法 x / y % 取模 x % y - 减法 x - y + 加法 x + y < 小于 x < y <= 小于等于 x <= y > 大于 x > y >= 大于等于 x >= y == 等于 x == y != 不等于 x != y && 逻辑与 x && y || 逻辑或 x || y = 赋值 x = y , 逗号 x, y 优先级 优先级 运算符 结合性 1 [] () 从左到右 2 unary ! unary - unary + 从左到右 3 * / % 从左到右 4 - + 从左到右 5 <= > >= == !=标准类型构造函数 标准类型构造函数是用于创建、初始化并返回标准类型对象的函数。 列表 list(参数0, 参数1, ..., 参数n) 根据任意数量的参数对象创建、初始化并返回一个列表对象。 参数 参数0, 参数1, ..., 参数n - 按调用时的顺序包含在列表中的对象 返回值 列表对象 示例 list(1, 2, 3, 4, 5) 返回: (1, 2, 3, 4, 5) 对 pair(第一个对象, 第二个对象) 创建、初始化并返回一个包含两个对象的对对象。参数 第一个对象 - 配对中的第一个对象 第二个对象 - 配对中的第二个对象 返回值 配对对象 示例 pair(true, 15) 返回:(true, 15) mapmap(参数0, 参数1, ..., 参数n) 根据任意数量的参数对象(每个参数应为键值对对象)创建、初始化并返回一个映射对象(关联容器)。 参数 参数0, 参数1, ..., 参数n - 要包含在映射中的配对(键值对) 返回值 映射对象 示例 map(pair("apple", "round"), pair("brick", "blocky")) rangerange(a, b) 创建、初始化并返回一个整数范围对象,其区间为[a, b),可进行迭代。参数 a - 第一个端点,包含在范围内 b - 第二个端点,不包含在范围内 返回 范围对象 示例 result = 0; for (x : range(0, 3)) { result = result + x }; result 返回:6 还有其他构造函数,但很少需要显式调用它们(布尔型、整数型、数字型)。本指南的字符串部分中讨论的另一个构造函数是string,它有助于将其他类型转换为字符串。 标准函数 count count(可迭代对象) 获取可迭代对象(如列表)的大小(元素数量)。参数 可迭代对象 - 一个可迭代对象(如列表) 返回 可迭代对象的大小(元素数量) 示例 count(list("cat", "dog", "bird")) 返回:3 min_element min_element(可迭代对象, 谓词) 获取可迭代对象中的最小元素。元素的顺序由提供的谓词决定。 参数 可迭代对象 - 一个可迭代对象(如列表) 谓词 - 一个函数对象,用于比较两个值,若第一个值小于第二个值则返回true。可以是以下形式的lambda函数: [] (a, b) { ...返回值 可迭代对象中的最小元素 示例 min_element(list(5, 47, 1, 20), [] (a, b) {a < b}) 返回:1 max_element max_element(可迭代对象, 比较函数) 获取可迭代对象中的最大元素。元素的顺序由提供的比较函数决定。 参数 可迭代对象 - 一个可迭代对象(如列表) 比较函数 - 一个比较两个值的函数对象,如果第一个值小于第二个值则返回true。可以是以下形式的lambda函数: [] (a, b) { ... }返回值 可迭代对象中的最大元素 示例 max_element(list(5, 47, 1, 20), [] (a, b) {a < b}) 返回:47 none_of none_of(可迭代对象, 谓词) 检查可迭代对象的所有元素是否都不满足所提供谓词的条件。 参数 可迭代对象 - 一个可迭代对象(如列表) 谓词 - 一个函数对象,它接受一个元素作为参数,如果满足条件则返回true,否则返回false。可以是以下形式的lambda函数: [] (x) { ... }返回值 如果所有元素都不满足提供的谓词条件,则返回true,否则返回false 示例 none_of(list(15, 2, 80, 54), [] (x) {x > 100}) 返回:true none_of(list(15, 304, 80, 54), [] (x) {x > 100}) 返回:false any_of any_of(可迭代对象, 谓词) 检查可迭代对象中是否至少有一个元素满足提供的谓词条件。 参数 可迭代对象 - 一个可迭代对象(如列表) 谓词 - 一个函数对象,接受一个元素作为参数,如果条件满足则返回true,否则返回false。可以是以下形式的lambda函数: [] (x) { ... }返回值 如果至少有一个元素满足提供的谓词条件,则返回true,否则返回false 示例 any_of(list(15, 2, 760, 54), [] (x) {x > 100})返回:true any_of(list(15, 2, 80, 54), [] (x) {x > 100})返回:false all_of all_of(可迭代对象, 谓词) 检查可迭代对象的所有元素是否都满足提供的谓词条件。 参数 可迭代对象 - 一个可迭代对象(如列表) 谓词 - 一个函数对象,接受一个元素作为参数,如果满足条件则返回true,否则返回false。可以是以下形式的lambda函数: [] (x) { ... }返回值 如果可迭代对象的所有元素都满足提供的谓词条件,则返回true,否则返回false。示例 any_of(list(150, 200, 760, 540), [] (x) {x > 100})返回:true any_of(list(150, 200, 14, 540), [] (x) {x > 100})返回:false for_each for_each(可迭代对象, 操作) 对可迭代对象中的每个元素调用提供的函数对象。 参数 可迭代对象 - 一个可迭代对象(例如列表) 操作 - 一个以元素为参数的函数对象。可以是以下形式的lambda函数: [] (x) { ... } 返回值 无 示例 for_each(list("Hello World!", "Test Message"), [] (msg) {send_text_message(msg)}) 显示两条消息:Hello World!半径 - 脚本对象检测圆的半径 - 这是一个重要属性,因为可以通过从任何脚本对象调用tracked_units函数来查询当前在检测范围内的单位。 自动启动 - 默认情况下,所有脚本在游戏开始时立即启动。可以通过取消勾选此选项来更改。然后,要启动此特定脚本,需要从其他某个脚本调用start_script函数。 代码 - 脚本对象的代码是可编辑的,这里是可以修改游戏行为的地方。 对象链接 - 这是另一个重要属性。通过点击相应按钮,可以将其他对象(单位、建筑、脚本等)链接到此脚本。测试消息 findfind(可迭代对象, 谓词) 查找并返回可迭代对象中第一个满足所提供谓词条件的元素。 参数 可迭代对象 - 一个可迭代对象(如列表) 谓词 - 一个函数对象,它接受一个元素作为参数,如果满足条件则返回true,否则返回false。可以是以下形式的lambda函数: [] (x) { ... } 返回值 包含以下内容的Pair对象: 索引0:若找到元素则为true,否则为false 索引1:找到的元素(若找到) 示例 find(list(1, 2, 3), [] (x) {x > 1}) 返回:(true, 2) transformtransform(可迭代对象, 转换器) 对可迭代对象中的每个元素调用所提供的转换器对象函数。然后,它会获取该函数对象的结果并将其添加到结果列表中。最后,返回结果列表。 参数 iterable_object - 一个可迭代对象(例如列表) transformer - 一个函数对象,它接受一个元素作为参数并返回一个新对象,该新对象随后被添加到结果列表中。如果该函数对象没有返回对象,则不会向列表中添加任何内容。可以是以下形式的lambda函数:[] (x) { ... } 返回值 返回对象组成的列表对象 示例 transform(list(1, 2, 3), [] (x) {x * 2})返回:(2, 4, 6) transform(list(1, 2, 3), [] (x) {if (x != 2) {x}})返回:(1, 3) randomrandom(a, b) 返回在[a, b]区间上均匀分布的随机数。参数 a - 区间的第一个端点 b - 区间的第二个端点 返回 区间 [a, b] 上的一个随机数 示例 random(0, 5) 返回:0 返回:0 返回:4 返回:5 min min(a, b) 返回 a 和 b 之间的较小值。 参数 a - 第一个值 b - 第二个值 返回 a 和 b 之间的较小值 示例 min(8, 3) 返回:3 max max(a, b) 返回 a 和 b 之间的较大值。 参数 a - 第一个值 b - 第二个值 返回 a 和 b 之间的较大值 示例 max(8, 3) 返回:8 游戏对象构造函数 resource resource(resource_name) 创建、初始化并返回一个游戏资源对象。参数 resource_type_name - 资源的类型名称(“pellets”、“heavypellets”、“slots”) 返回 资源对象 示例 resource("pellets") player player(player_name) 创建、初始化并返回一个玩家对象。 参数 player_name - 玩家名称(“Player One”、“Player Two”、“Player Three”、“Player Four”) 返回 玩家对象 示例 player("Player One") weapon_type weapon_type(weapon_type_name) 创建、初始化并返回一个武器类型对象。参数 weapon_type_name - 武器类型名称,可为以下之一: "" "等离子放电器" "旋转机枪" "左轮手枪" "加农炮" "榴弹发射器" "火箭发射器" "激光" "轨道炮" "微型发射器" "维修工具" "脉冲激光" "弹药打印机" "火炮" "破片发射器" "大型轨道炮" "EMP枪" "等离子喷射器" "等离子发射器" "大型旋转机枪" "大型左轮加农炮" "大型加农炮" "红外制导导弹发射器" 返回 武器类型对象 示例 weapon_type("旋转机枪") blueprintblueprint(unit_name) 创建、初始化并返回一个单位蓝图对象。 参数 unit_name - 单位名称;目前仅支持地图资源库中的单位。返回 蓝图对象示例 blueprint("Tank") 建筑类型 building_type(building_type_name) 创建一个建筑类型对象。 参数 building_type_name - 建筑类型名称,可为以下之一: "Armory"(军械库) "Explosives Lab"( explosives lab) "Propulsion Lab"(propulsion lab) "Rocket Lab"(rocket lab) "Energy Lab"(energy lab) "Laser Lab"(laser lab) "Reactor"(反应堆) "Repair Pad"(repair pad) "Repair Bay"(repair bay) "Resource Chute"(resource chute) "Field Factory"(field factory) "Barrier"(屏障) "Marine Factory"(marine factory) "Mount"(mount) 返回 建筑类型对象示例 building_type("Armory") 武器规格 weapon_spec(weapon_spec_name) 创建一个武器规格对象。参数 weapon_spec_name - 规格名称,可为以下之一: "damage" - 伤害值; "cooldown" - 冷却时间; "maxrange" - 最大有效射程; "saferange" - 安全射击范围; "exitspeed" - 弹丸出膛速度(仅限手榴弹/炮弹/等离子/火箭发射器); "ammoperpellet" - 每发弹丸的弹药单位消耗; 返回 武器规格对象 示例 weapon_spec("damage") order_type order_type(order_type_name) 创建单位指令对象。参数 order_type_name - 指令名称,可为以下之一: "moveto" - 移动至某点; "attack" - 攻击目标; "attack-moveto" - 移动至某点,并攻击遭遇的单位; "takeoff-land" - 起飞或降落; "ram" - 冲撞某点; "reorient" - 调整物体朝向; "liftup" - (用磁铁)提起物体; "drop" - 放下物体; "inflate-deflate" - 充放气垫; "extend-retract-beams" - 伸缩支撑梁; "attach" - 附着至最近的挂载点; "detach" - 从挂载点脱离; 返回 order_type 对象 示例 order_type("moveto") 通用游戏函数 create_timer create_timer(interval, function_object) 创建一个定时事件,在设定时间后执行。参数 interval - 调用函数对象的时间间隔 function_object - 要调用的函数对象 返回值 无 示例 create_timer(5.0, [] () {send_text_message("游戏内已过去5秒!")}) set_callback set_callback(callback_name, function_object) 设置全局游戏回调。参数 回调名称 - 全局回调名称,可为以下之一: "destruction" - 每当有单位被摧毁时调用此回调;此时函数对象的签名为: 回调函数(被摧毁单位) "kill" - 每当有单位摧毁另一个单位时调用此回调;此时函数对象的签名为: 回调函数(被摧毁单位, 击杀单位) 函数对象 - 要调用的函数对象 返回值 无 示例 set_callback( "destruction", [] (单位) { send_text_message(get_unit_name(单位) + " 刚刚被摧毁了!"); } ) elapsed elapsed() 返回自脚本启动以来经过的时间。然后,在代码中可以调用linked_units函数来查询这些对象。 脚本语言基础 每个脚本对象可以有四个子句,每个子句都有不同的用途: global_init - 此子句总是在游戏开始时执行,即使脚本未设置为自动启动。 init - 此子句在脚本首次启动时执行一次且仅执行一次。例如,对于非自动启动的脚本,在脚本被显式启动之前,它不会执行。 condition - 此子句在每个逻辑 tick 执行,直到其计算结果为 true。为了使其计算结果为 true,该子句的最后一条语句必须计算为 true。 action - 此子句在 condition 子句计算结果为 true 时执行一次且仅执行一次。elapsed 参数:无 返回值:脚本首次启动后经过的时间 示例:five_seconds_passed = elapsed() > 5 start_script start_script(script_object) 启动一个脚本。 参数:script_object - 要启动的脚本对象 返回值:无 示例:start_script(other_script) restart restart() 指示脚本在执行完动作子句后重新启动自身(必须从动作子句中调用)。 参数:无 返回值:无 示例:restart() this_location this_location() 获取调用者的位置对象。 参数:无 返回值:位置对象 tracked_units 变体1:tracked_units() 变体2:tracked_units(location_object) 检索以下对象跟踪的单位列表(圆圈内的单位): 变体1:当前位置。 变体2:另一个指定的位置。参数 变体1:无 变体2:location_object - 位置对象 返回值:单位对象列表 linked_units 变体1:linked_units() 变体2:linked_units(location_object) 功能:获取与以下对象关联的单位列表: 变体1:当前位置 变体2:另一个指定位置 参数 变体1:无 变体2:location_object - 位置对象 返回值:单位对象列表 send_text_message send_text_message(message) 功能:直接向主消息滚动栏发送文本消息 参数:message - 文本消息 返回值:无 send_transmission send_transmission(transmission) 功能:发送标准游戏传输信息(消息),该信息将显示在屏幕上参数 传输 - 传输文本 返回 无 玩家函数 get_unit_count get_unit_count(player) 返回玩家当前的单位数量。 参数 player - 玩家对象 返回 单位数量 fund_player fund_player(player, resource_list) 向玩家给予设定数量的资源。 参数 player - 目标玩家 resource_list - 资源对象与数量对的列表 返回 无 示例 fund_player(player("玩家一"), list(pair(resource("pellets"), 200), pair(resource("heavypellets"), 50))) can_charge_player can_charge_player(player, resource_list) 检查玩家是否拥有足够的资源。参数 player - 目标玩家 resource_list - 资源对象与数量的配对列表 返回 若玩家拥有足够资源进行操作则返回true,否则返回false 示例 can_charge_player(player("玩家一"), list(pair(resource("弹丸"), 200), pair(resource("重型弹丸"), 50))) charge_player charge_player(player, resource_list) 从玩家处扣除资源。 参数 player - 目标玩家 resource_list - 资源对象与数量的配对列表 例如 返回 无 示例 charge_player(player("玩家一"), list(pair(resource("弹丸"), 200), pair(resource("重型弹丸"), 50))) get_players get_players() 获取参与游戏的玩家列表 参数 无 返回 玩家列表 get_teams get_teams() 获取参与游戏的队伍列表。参数 无 返回 队伍列表 declare_defeat declare_defeat(player) 将指定玩家宣告为失败。 注意:允许后续调用此函数,但不会产生任何变化。 参数 player - 失败的玩家 返回 无 declare_victory declare_victory(player) 将指定玩家宣告为胜利。 注意:允许后续调用此函数,但不会产生任何变化。 参数 player - 胜利的玩家 返回 无 are_allies are_allies(first_player, second_player) 检查指定玩家是否为盟友。参数 first_player - 第一名玩家对象 second_player - 第二名玩家对象 返回值 如果玩家是盟友则返回true,否则返回false are_neutral are_neutral(first_player, second_player) 检查指定玩家是否处于中立状态。 参数 first_player - 第一名玩家对象 second_player - 第二名玩家对象 返回值 如果玩家彼此中立则返回true,否则返回false are_enemies are_enemies(first_player, second_player) 检查指定玩家是否为敌人。 参数 first_player - 第一名玩家对象 second_player - 第二名玩家对象 返回值 如果玩家是敌人则返回true,否则返回false 通用对象函数 通用对象函数目前适用于: 单位; 建造平台; 武器; 脚本对象。is_unitis_unit(object) 检查一个对象是否为单位。 参数 object - 要检查的对象 返回值 如果对象是单位则返回true,否则返回false 示例 // 从通用对象列表中生成单位列表。 units = list(); for (object : objects) { if (is_units(object)) { units = units + object; } } is_buildpadis_buildpad(object) 检查一个对象是否为建造平台。 参数 object - 要检查的对象 返回值 如果对象是单位则返回true,否则返回false 示例 // 从通用对象列表中生成建造平台列表。 buildpads = list(); for (object : objects) { if (is_buildpad(object)) { buildpads = buildpads + object; } } set_user_objectset_user_object(unit, user_object) 设置单位的用户对象。参数 unit - 单位对象 user_object - 用户对象(可以是任何对象) 返回值 无 get_user_object get_user_object(unit) 获取单位的用户对象。 参数 unit - 单位对象 返回值 单位存储的用户对象 单位函数 get_unit_name get_unit_name(unit) 获取单位的名称。 参数 unit - 单位对象 返回值 单位的名称 get_unit_player get_unit_player(unit) 获取单位所属的玩家。 参数 unit - 单位对象 返回值 玩家对象 get_health get_health(unit) 获取单位的当前生命值。 参数 unit - 单位对象 返回值 单位的生命值 get_max_health get_max_health(unit) 获取单位的最大生命值。 参数 unit - 单位对象 返回值 单位的最大生命值获取生命值上限 参数:单位 - 单位对象 返回值:单位的最大生命值 获取能量值 获取单位当前的能量值。 参数:单位 - 单位对象 返回值:单位的能量值 获取能量上限 获取单位的最大能量值。 参数:单位 - 单位对象 返回值:单位的最大能量值 是否着地 检查单位是否着地。 参数:单位 - 单位对象 返回值:若单位着地则为true,否则(飞行状态)为false 是否潜水 检查单位是否潜入水中。 参数:单位 - 单位对象 返回值:若单位处于潜水状态则为true,否则为false 是否锚定 检查单位是否锚定在锚点上。 参数:单位 - 单位对象参数 unit - 单位对象 返回值 如果单位已锚定则返回true,否则返回false can_drive can_drive(unit) 检查单位是否能在地面或水上移动。包括轮式单位、履带式单位、步行单位、水上载具和气垫船。 参数 unit - 单位对象 返回值 如果单位能在地面或水上移动则返回true,否则返回false can_fly can_fly(unit) 检查单位是否能飞行。 参数 unit - 单位对象 返回值 如果单位能飞行则返回true,否则返回false has_magnet has_magnet(unit) 检查单位是否有磁铁。 参数 unit - 单位对象 返回值 如果单位有磁铁则返回true,否则返回false can_attack can_attack(unit) 检查单位是否能(一般情况下)攻击。如果脚本不需要,任何子句都可以省略。 子句可以按以下方式声明和定义: 子句名称 { 主体内容 } 其中,子句名称是四个子句名称之一,主体内容是一组代码语句。 因此,包含所有四个子句的脚本对象可能如下所示: global_init { 语句 } init { 语句 } condition { 语句 } action { 语句 } condition子句与其他所有子句的不同之处在于,其最后一条语句的计算结果应为true或false。 语句 语句是代码逻辑的基本单位,它执行某些操作。例如: z = x * y 这条语句将变量x和y相乘,并将结果赋值给变量z。参数 unit - 单位对象 返回值 若单位可以攻击则返回true,否则返回false can_heal can_heal(unit) 检查单位是否可以治疗其他单位。 参数 unit - 单位对象 返回值 若单位可以治疗其他单位则返回true,否则返回false can_restock can_restock(unit) 检查单位是否可以为其他单位补充弹药。 参数 unit - 单位对象 返回值 若单位可以为其他单位补充弹药则返回true,否则返回false can_emp can_emp(unit) 检查单位是否至少拥有一件EMP武器。 参数 unit - 单位对象 返回值 若单位至少拥有一件EMP武器则返回true,否则返回false has_weapons has_weapons(unit) 检查单位是否拥有武器。参数 unit - 单位对象 返回值 若单位拥有武器则返回true,否则返回false get_weapons get_weapons(unit) 获取单位的武器列表。 参数 unit - 单位对象 返回值 武器列表 get_tools get_tools(unit) 获取单位的工具列表(纳米喷雾和弹药打印机)。 参数 unit - 单位对象 返回值 武器列表 get_cost get_cost(unit) 获取单位的成本列表。 参数 unit - 单位对象 返回值 成本列表(不包括槽位) set_damageable set_damageable(unit, damageable) 获取单位的武器列表。 参数 unit - 单位对象 damageable - 若单位可被伤害则为true,否则为false 返回值 无 inflict_damage inflict_damage(unit, damage) 对单位造成设定量的伤害。参数 unit - 单位对象 damage - 伤害数值 返回值 无 healheal(unit, hit_points) 按设定的生命值数量治疗单位。 参数 unit - 单位对象 hit_points - 要恢复的生命值数量 返回值 无 set_energyset_energy(unit, energy) 设置单位的能量值。 参数 unit - 单位对象 energy - 能量等级(以最大容量的百分比计,0-100) 返回值 无 move_tomove_to(unit, location) 指令单位移动至指定位置。 参数 unit - 单位对象 location - 位置对象 返回值 无 attack_move_toattack_move_to(unit, location) 指令单位移动至指定位置(同时攻击遭遇的敌方单位)。参数 unit - 单位对象 location - 位置对象 返回值 无 攻击 attack(unit, target) 指令单位攻击目标。 参数 unit - 单位对象 target - 目标单位 返回值 无 转移至 transfer_to(unit, player) 将单位的所有权转移给另一位玩家。 参数 unit - 单位对象 player - 单位的新所有者 返回值 无 下达指令 give_order(unit, order_type, [可选] target) 向单位下达指令。 参数 unit - 单位对象 order_type - 指令类型对象 target - 目标对象(部分指令(如起飞-降落)无需目标) 返回值 无 示例 give_order(unit, order_type("attack"), enemy_unit); give_order(flying_unit, order_type("takeoff-land")); // 抬起单位,并将其投放到指定位置。// 注意:指令会被放入队列,因此在这种情况下需要按相反顺序下达指令。 give_order(单位, order_type("drop"), 目标位置); give_order(单位, order_type("liftup"), 目标单位); cancel_orderscancel_orders(单位) 取消单位的所有指令(活动中和待处理的)。 参数 单位 - 单位对象 返回值 无 AI 函数 guard_thisguard_this(单位, 存在点名称) 命令单位守卫此位置(调用脚本对象的位置)。 守卫单位不会从该位置撤退(通常停留在该位置的圆圈范围内)。 注意:仅对 AI 机器人单位有效。 参数 单位 - 单位对象 存在点名称 - AI 机器人维护的存在点位置名称。guard_location guard_location(单位, 位置, 存在名称) 命令单位守卫某个位置。 执行守卫命令的单位不会从该位置撤退(通常会待在该位置的圆圈范围内)。 注意:仅对AI机器人单位有效。 参数 单位 - 单位对象 位置 - 位置对象(另一个脚本对象) 存在名称 - AI机器人维护的存在位置名称。如果该守卫命令未关联存在位置,则可以为空字符串"" 返回值 无 武器函数 get_weapon_type get_weapon_type(武器) 获取武器的武器类型。 参数 武器 - 武器对象 返回值 武器类型对象 示例 // 获取单位第一个武器的类型。if (has_weapons(unit)) { unit_weapons = get_weapons(unit); get_weapon_type(unit_weapons[0]); } // 检查单位是否至少拥有一把旋转机枪。 if (any_of(get_weapons(unit), [] (weapon) {get_weapon_type(weapon) == weapon_type("旋转机枪")})) { send_transmission("该单位拥有旋转机枪!") } get_ammoget_ammo(weapon) 获取武器当前的弹药量。 参数 weapon - 武器对象 返回 弹药量 示例 // 获取单位第一把武器的弹药量。 if (has_weapons(unit)) { unit_weapons = get_weapons(unit); get_ammo(unit_weapons[0]); } get_max_ammoget_max_ammo(weapon) 获取武器的最大弹药量。 参数 weapon - 武器对象 返回 最大弹药量 set_ammoset_ammo(weapon, ammo) 设置武器的弹药量。参数 weapon - 武器对象 ammo - 弹药数量 返回值 无 示例 // 为单位的所有武器补充弹药 for(weapon : get_weapons(unit)) { set_ammo(weapon, get_max_ammo(weapon)); } set_max_ammo set_max_ammo(weapon, max_ammo) 设置武器的最大弹药量。 参数 weapon - 武器对象 max_ammo - 最大弹药数量 返回值 无 示例 // 提升单位所有武器的最大弹药容量 for(weapon : get_weapons(unit)) { set_max_ammo(weapon, get_max_ammo(weapon) + 50); } set_weapon_spec set_weapon_spec(weapon, weapon_spec, value) 设置武器的某项武器参数。 参数 weapon - 武器对象 weapon_spec - 武器参数对象 value - 参数值 返回值 无 示例 // 将武器的伤害输出设为10。设置武器属性(武器, 武器属性("伤害"), 10); 生成函数 生成单位 生成单位(蓝图, 武器类型, 玩家, 位置) 生成一个新单位。 参数 蓝图 - 描述单位的蓝图对象 武器类型 - 用于单位主武器的武器类型对象 玩家 - 新生成单位所属的玩家 位置 - 生成位置 返回 单位对象 示例 生成单位( 蓝图("企鹅"), 武器类型("旋转机枪"), 玩家("玩家一"), 当前位置() ); 能否生成单位 能否生成单位(蓝图, 玩家) 检查是否可以生成单位。参数 blueprint - 描述单位的蓝图对象 player - 新生成单位所属的玩家 返回值 若单位可以生成则返回true,否则返回false 示例 if (can_spawn_unit(blueprint("Penguin"), player("Player One"))) { ... } spawn_building spawn_building(building_type, buildpad) 在指定建造平台上生成建筑。 参数 building_type - 描述建筑的建筑类型对象 buildpad - 生成建筑的位置 返回值 无 示例 buildpad = linked_objects()[0]; spawn_building("Armory", buildpad); destroy_building destroy_building(buildpad) 摧毁指定建造平台上的建筑。可以使用“;”(分号)字符分隔多个语句: z = x * y; w = z / 2; 这里,和之前一样,变量x和y相乘后赋值给变量z,然后在下一个语句中,变量z除以2并赋值给变量w。 变量 变量用于存储值。变量需要声明,并通过首次为其赋值进行初始化。 x = 3; 变量可以是局部变量、成员变量或全局变量。 局部变量仅在其声明的作用域内可见。 x = 7; 成员变量对整个脚本对象可见。 member y = "Hello World!"; 全局变量对所有人可见,包括其他脚本对象。参数 buildpad - 生成建筑的位置 返回值 无 has_building has_building(buildpad) 检查建造平台是否已部署建筑。 参数 buildpad - 生成建筑的位置 返回值 若建造平台已部署建筑则返回true,否则返回false 目标函数 set_objective_text set_objective_text(player, objective_name, object_text) 初始化目标并设置其文本。 参数 player - 玩家对象 objective_name - 目标名称 object_text - 目标文本 返回值 无 示例 set_objective_text(player("Player One"), "survive_objective", "存活15分钟") set_objective_status set_objective_status(player, objective_name, status) 设置目标的状态。参数 玩家 - 玩家对象 目标名称 - 目标的名称 目标状态 - 目标的状态(“已完成”) 返回值 无 示例 设置目标状态(玩家(“玩家一”), “生存目标”, “已完成”)全局游戏分数 = 1000; 若要从另一个脚本对象访问全局变量,必须先使用导入命令进行导入。 导入 游戏分数; 变量名称区分大小写。例如,SomeVariable、someVariable、somevariable 这三个名称分别指代三个不同的变量。 列表 列表用于存储值的集合。 列表通过 list 函数进行声明和初始化。列表(1, 2, 3) 列表本身是对象,可以像之前讨论的那样分配给变量: some_list = 列表(1, 2, 3) 两个或多个列表可以使用+运算符连接在一起: longer_list = 列表(1, 2, 3)+ 列表(4, 5) 可以使用[]运算符访问、读取和写入单个列表元素: some_list = 列表(1, 2, 3); some_list[0] = 9; 列表索引从0开始,这意味着列表的第一个元素的索引为0。 字符串 字符串是可以包含文本的对象(目前仅支持ASCII)。使用"(双引号)字符声明和初始化。 text = "Hello World!" 两个或多个字符串可以使用+运算符连接在一起: text = "Hello " + "World!" 字符串可以与非字符串对象连接,前提是这些对象可以转换为字符串。score = 1000; text = "游戏分数:" + score; 注意,在这种情况下,字符串必须位于其他对象的左侧。 其他对象(如数字)也可以通过调用string函数显式转换为字符串: string(20) + "是一个正数" 条件语句 条件语句用于在满足某些条件时执行代码。可以使用if和else关键字编写: if (条件) { 真语句 } else { 假语句 } 如果条件语句为真,则执行真语句,否则执行假语句。条件语句可以是任何可计算为真或假的语句。 例如: x = 14 if (x < 100) { send_text_message("此语句为真!"); } else { send_text_message("此语句为假")




换一换 



























