euddraft 参考
文档资料来源:
http://www.staredit.net/topic/17037/
基本配置
-
创建一个配置文件,配置文件的扩展名为 .eds/edd
.eds 格式表示它仅仅会编译一次
.edd 格式表示它会守护模式编译,监控项目状态,在当前目录有文件被更改之后自动重新编译[main]input : 这里写上输入地图的文件名output : 这里写上输出地图的文件名[插件名1]:: 插件的输入参数键1 : 值1键2 : 值2[插件名2]:: 如果插件没有参数就啥也不用写[插件名3] -
使用配置文件中的配置编译
可能的用法如下euddraft.exe 配置文件.eds或者这样
euddraft.exe 配置文件.edd -
如果顺利,那么就编译完成并且会输出地图,如果不顺利,会有错误信息提示。
euddraft 内置了几个插件[dataDumper]:: ZergAI.bin 将会被转存到 0x68C104 这个内存位置上ZergAI.bin : 0x68C104, copy[unlimiter]:: 解除子弹限制,不用参数[eudTurbo]:: EUD 轮询加速,大幅降低触发器轮询间隔[MSQC]:: 参数很多,一言难尽[freeze]freeze : false
脚本/插件编写
euddraft 使用脚本编写的方式编写 EUD 触发器,编写脚本的方式有两种
一种是直接使用 Python 的一种伪语法调用 eudplib 来完成
另一种是使用专门为此设计的 epScript (它将会编译成 Python 伪语法并且最终也是调用 eudplib 来完成工作)
-
Python 伪语法
from eudplib import *# Variable definition.a = EUDVariable() # 创建一个星际内可以使用的变量的引用,初始值是 0b = EUDVariable(1) # 创建一个星际内可以使用的变量的引用,初始值是 1# IMPORTANT : Every variable is static.c = a + b # 以 a + b 的结果创建一个星际内可以使用的变量的引用,赋值给 cc << a * b # 将 a * b 的值赋给 c 所引用的那个星际内可用的变量,不是给 c 赋值,是给 c 引用的那个变量赋值# Almost every C operator works here too, with division being // instead of /# -----------------------------------------------------------------------------# Ifif EUDIf()([cond1, cond2, cond3]):pass # Codeif EUDElseIf()(cond4):pass # codeif EUDElse()():passEUDEndIf()# While / LoopNif EUDWhile()(conds):pass # CodeEUDEndIf()# EUDLoopListfor ptr, epd in EUDLoopList(ptr):pass# EUDLoopRangefor i in EUDLoopRange(0, 100):pass# EUDLoopUnitfor ptr, epd in EUDLoopUnit():pass# EUDLoopUnit2for ptr, epd in EUDLoopUnit2():pass# EUDLoopCUnitfor cunit in EUDLoopCUnit():pass# EUDLoopNewUnitfor ptr, epd in EUDLoopNewUnit():pass# EUDLoopNewCUnitfor cunit in EUDLoopNewCUnit():pass# EUDLoopPlayerUnitfor ptr, epd in EUDLoopPlayerUnit(player):pass# EUDLoopPlayerCUnitfor cunit in EUDLoopPlayerCUnit(player):pass# Break & Continue# While / LoopNif EUDWhile()(conds):EUDBreak() # Break outEUDBreakIf(cond) # Break ifEUDContinue() # Goto continue pointEUDContinueIf(cond) # Continue if# Some codesEUDSetContinuePoint() # Here is continue point.# Do some i++ thing herepass # CodeEUDEndWhile() # NOT EUDEndIf# there's also EUDWhileNot, EUDIfNot, EUDBreakIfNot, EUDContinueIfNot etc.if EUDLoopN()(100):pass # codeEUDEndLoopN()if EUDPlayerLoop()():pass # codeEUDEndPlayerLoop()EUDSwitch(variable) # OR EPDSwitch(epd_address)# you can add bitmask on EUDSwitch too: like EUDSwitch(variable, 0xFF)if EUDSwitchCase()(0):pass # codeEUDBreak()if EUDSwitchCase()(1, 2):pass # codeEUDBreak()if EUDSwitchCase()(3, 4, 5, 6):pass # codeEUDBreak()EUDEndSwitch()# Function definition. no recursion allowed@EUDFuncdef funcname(arg1, arg2):# Use arguments to do stuff.# All arguments are EUDVariable type# EUDReturn to return valueEUDReturn(arg1 + arg2)# Legacy support, but use this only on the very end of the function.return arg1 + arg2# -----------------------------------------------------------------------------# Resource declarationa = Db(4) # Create empty space with size 4bytea = Db(b'\x04\x01\x06\x08') # Create memory with initial value 04 01 06 08 -
epScript
详见:epScript 参考
运行模式
脚本文件扩展名区别
-
假如是 py 格式的脚本,那么在 eds/edd 文件中是可以不写扩展名的,eps 格式得把扩展名加上
[main]input: basemap.scxoutput: outputmap.scx[eudTurbo]:: 它实际是加载的一个文件名为 eudTurbo.py 的脚本[main.eps]:: 如果是 eps 格式就这么加载
加载顺序
-
配置文件中的插件名的先后顺序与其在游戏开始后它们的加载顺序是相关联的,游戏开始后,会执行一次脚本中的 onPluginStart(),然后在所有玩家的机器上都循环执行 beforeTriggerExec()、触发器、afterTriggerExec()
例如有如下配置 main.edd:
[main]input: in.scxoutput: out.scx[eudTurbo][a.eps][b.eps]游戏开始后的执行顺序为:
eudTurbo.onPluginStart()a.onPluginStart()b.onPluginStart()每帧循环执行:eudTurbo.beforeTriggerExec()a.beforeTriggerExec()b.beforeTriggerExec()SCMD 触发器b.afterTriggerExec()a.afterTriggerExec()eudTurbo.afterTriggerExec()