TrigEditPlus

来自星际争霸重制版地图研究所
Pere讨论 | 贡献2022年4月24日 (日) 13:26的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

简介

scmd的trigger editor在使用体验上有诸多不便之处,比如无法把一个地图的触发直接复制到另一个地图上、无法批量写触发、可读性较差、触发量较大时很难查找与定位等等。

TrigEditPlus(简称TEP)是一个scmd插件,它可以将触发全部代码化,可以批量写触发,自由复制粘贴、轻松查找定位,是编辑高级地图时必不可少的利器。

TEP可以将地图中已有的触发以lua代码的形式呈现出来,也可以通过编写lua代码来修改地图中的触发或向地图中加入新的触发。

推荐的下载版本为armoha大神修改过的0.88版,详见下载


TEP原作者是Trigger King大神,他的github链接:

https://github.com/phu54321

这里面有一些旧版的TEP

下载

方式一:

直接去Armoha的Github下载:

https://github.com/armoha/TrigEditPlus/releases

下载最新版的release中的TrigEditPlus.sdp文件即可。为区分不同版本的TEP,下载之后可自行修改TrigEditPlus.sdp的文件名,如修改为TrigEditPlus_armoha_2021-06-01.sdp。修改文件名不影响其功能。

方式二:

在工具箱内下载(不保证为最新版)

点我进入星际制图工具箱

在工具箱中找到TrigEditPlus,点击“点我下载”即可下载,百度网盘提取码为qwer

下载之后解压,会出来一个 拓展名为sdp的文件

使用方法

将sdp文件复制粘贴到你的scmd的安装路径里面的plugins文件夹中。本教程使用的地图编辑器是最新版SCMD2020-06-24,如图所示

P01.png


Put TEP in folder.png


然后使用最新版scmd随便打开一个星际地图,在菜单的Triggers里面就会有TrigEdit++这个选项了,如下图所示。如果你没有看到这个选项,说明你的插件可能没放对地方,你可能拥有多个scmd版本,你要重新确定你把插件放在了SCMD2020-06-24的plugins文件夹中。

Open TEP in scmd.png


此时点击TrigEdit++,就可进入TEP的代码界面。如果你打开的地图内含有已经写好的触发,那么你会看到地图中已有的触发被转化为了lua代码呈现出来,如下图所示。

P05 re.png

点“-”可以折叠相应代码,点“+”可以展开已折叠的代码。你也点选择左上角的View - Fold All或者Unfold All来折叠全部代码或者展开全部代码。

你可以在这里面直接写代码,写完代码之后可以按Ctrl+S保存并编译。如果你的代码有误,就会报错,无法保存。保存成功之后即可关掉这个窗口,你打开Triggers - Classic Map Triggers就可以看到编译完成后的触发。

注意!该TEP版本有一个特点:TEP代码界面写的代码在编译成功后,当你退出这个界面之后再重新打开这个界面时,你看到的将是编译好的结果(一堆Trigger),而不是你的源代码!所以强烈建议在另外的文本编辑器内写好全部代码,最后直接把全部代码复制粘贴到TEP代码编辑界面内,然后直接编译保存。

而其他版本的TEP可能会依然保存源代码,并且会在触发列表里面自动加一个很奇怪的SetDeath触发。由于本教程是以armoha修改的TEP0.087版本为例,并且只有此版本可以完美解决中文字符显示问题,所以关于其他版本TEP的特性我就不做赘述。

举一个最简单的例子:

新建一张空地图,打开TEP代码界面,输入如下代码

for x = 1, 5 do
    Trigger { 
        players = {P1},
        conditions = {
            Always();
        },
        actions = {
            SetResources(P1, Add, x, Ore);
        },
    }
end

P06 re.png


然后按Ctrl+S保存,然后关掉窗口再打开,你会看到:

P07 re.png

可以看到,代码被编译成了5个触发,储存在了地图中。并且再次打开TEP后,TEP将这5个触发以lua代码的形式呈现了出来。当然,你没有机会再看到源代码了。

下面介绍一下TEP的工作原理:

TEP的本质是一个lua代码编译器,它可以将lua代码编译为星际触发,并仍以lua代码的形式呈现这些触发。

我们先来谈一谈一般情况下的代码:

在平时我们写代码的时候,一般会将“代码的运行结果”理解为代码中print出来的内容。毕竟代码的运行过程相当于计算机内部的操作,而最终我们能看到的只有print出来的部分。比如以下lua代码:


x = 1
y = x^2 + 2*x
print(y)

该代码的运行结果(输出)为

3

解释:

编译器首先阅读第一行代码,在计算机内部创建一个变量x,赋值为1

然后阅读第二行代码,将新变量y赋值为x的平方加2倍的x(计算结果为3),故将y赋值为3

最后阅读第三行代码,将y的值print出来。

这三行代码非常容易理解,我相信,即使是从来没有学过编程的外行也能一眼看出它们的含义。

编译器阅读代码、运行代码的过程是在计算机内部进行的,我们看不到。我们只能看到“3”这个结果。

再看这个例子:

x = 1
y = x^2 + 2*x

该代码的运行结果(输出)为:什么都没有

解释:

编译器阅读前两行代码的过程同上,在计算机内部创建了x和y两个变量并赋值,然而由于没有print,所以我们看不到任何东西呈现出来。我们可以说,代码写得再天花乱坠,只要没有“print”,这个代码就可以被视为没有运行结果。相当于内部黑箱操作一通,最后什么东西也没让我们看到。

下面我们来谈一谈TEP内的代码:

TEP的“运行结果”不是print出来的内容,而是一个一个的形如Trigger{...}的东西。

举例:

在打开scmd中的TEP窗口,在里面写代码:

x = 1
y = x^2 + 2*x
print(y)

然后编译保存,再打开会发现什么都没有。这就是说,这一串代码在TEP中执行之后并没有“运行结果”

再举例:

a = P1
b = add
x = 1
y = x^2 + 2*x
Trigger {
    players = {a},
    conditions = {
        Always();
    },
    actions = {
        SetResources(a, b, y, 0);
        CreateUnit(1, 2, 64, 1);
    },
}

这个代码在TEP中的运行结果就是生成一个触发,具体生成什么触发请自己实践。生成的这个触发就可以视为这个代码在TEP中的运行结果。我们可以看到,代码中的“Trigger”部分就好比平常代码中的print,决定着代码的最终输出结果。TEP编译器的作用就是运行每一行代码,然后将运行过程中遇到的所有Trigger作为结果来输出。输出结果自然就是一堆触发。

上面的a=P1和b=add这两行代码,以及CreateUnit括号内的数字,会在之后的教程做详细解释。

注:lua代码中的变量名不区分大小写,但是table中的key名区分大小写