查看“苏泽学习笔记”的源代码
←
苏泽学习笔记
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
个人学习的理解 == epScript、eudplib、euddraft 的关系 == [https://raw.githubusercontent.com/armoha/eudplib/master/docs/funclist.txt epScript] 是由 [https://github.com/phu54321 TriggerKing] 创造的脚本语言,用于利用星际争霸的触发器的 EUD 漏洞编写复杂的触发器逻辑 [https://github.com/armoha/eudplib eudplib] 是一个 Python 库,它提供了一系列可读性较好的编写触发器逻辑的 API,并且运行这些 Python 脚本(<code>*.py</code>)将会生成对应的星际争霸的触发器字节码 [https://github.com/armoha/euddraft euddraft] 先将编写好的 epScript 脚本(<code>*.eps</code>)编译成调用 eudplib 功能的 Python 脚本(<code>*.py</code>) 然后 euddraft 会按照一定顺序运行这些 Python 脚本(<code>*.py</code>),它们将会调用 eudplib 来生成与编写好的 epScript 脚本(<code>*.eps</code>)等效的实际的触发器字节码 最终 euddraft 再将这些触发器字节码插入地图中,在地图加载时生效,实现逻辑并产生效果 更多细节可参考 [[epScript 实现原理]] == 如何开始 == 以下操作,假如有遇到看不懂的地方,可以尝试搜索引擎解决 这里假设你已经会使用 SCMD 进行基本的地形设计,如果还不会,请先参考: [[SCMD]] === 环境准备 === 准备一台 Windows 10 以上的 PC,或者虚拟机 准备好 SCMD,如果还没准备,往回看几行 下载 [https://github.com/armoha/euddraft/releases/download/v0.9.9.7/euddraft0.9.9.7.7z euddraft0.9.9.7.7z] *将 euddraft 解压缩到一个纯英文没有空格的路径中,例如 D:\SCRMapDevTools\euddraft0.9.9.7 下载 [https://code.visualstudio.com/Download VSCode] *安装它,随便怎么安装都行 *从 VSCode 插件商店中安装 eps-server 这款插件 === 地图准备 === 准备一个普通的地图文件,可以用 SCMD 新建,然后保存成 Starcraft: Remastered Broodwar Map (*.scx) 格式的文件 依然保存到一个纯英文没有空格的路径中,例如 <code>D:\Projects\test\basemap.scx</code> === 建立工程 === 新建一个文本文档,并将它的扩展名改为 edd ,例如 <code>D:\Projects\test\test.edd</code> 使用 VSCode 打开这个 edd 文件(直接将文件往打开的 VSCode 界面中一拖就行),然后把它的内容改为 <source lang="js" line> [main] input: basemap.scx output: test.scx [main.eps] </source> 以上代码用相对路径做例子,实际它是支持绝对路径的 新建一个文本文档,并将它的扩展名改为 eps ,例如 <code>D:\Projects\test\main.eps</code> 使用 VSCode 打开这个 eps 文件,然后把它的内容改为 <source lang="js" line> function onPluginStart() { // 游戏开始将会执行一次这个函数 DisplayTextAll("Hello World"); } function beforeTriggerExec() { // 游戏每一帧会先执行一次这个,然后执行传统触发器 } function afterTriggerExec() { // 游戏每一帧在执行完传统触发器后,会执行一次这个函数 } </source> 新建一个文本文档,并将它的扩展名改为 bat ,例如 <code>D:\Projects\test\build.bat</code> 使用 VSCode 打开这个 bat 文件,然后把它的内容改为 <source lang="js" line> D:\SCRMapDevTools\euddraft0.9.9.7\euddraft.exe test.edd </source> * 以上代码假设你将 euddraft 解压到了 <code>D:\SCRMapDevTools\euddraft0.9.9.7</code> 这个位置,如果它不在这儿,你应该替换它 至此,工程就已经建立好了,直接双击运行 build.bat 就可以生成 test.scx,将这个地图放入星际重制版的地图目录中,然后进游戏就能看到它在屏幕上输出的 Hello World == 运行模式 == 是游戏开始后,执行一次 onPluginStart(),然后在所有玩家的机器上都循环执行 beforeTriggerExec()、触发器、afterTriggerExec() 例如有如下配置 main.edd: <source lang="js" line> [main] input: in.scx output: out.scx [a.eps] [b.eps] [c.eps] </source> 游戏开始后的执行顺序为: <source lang="js" line> a.onPluginStart() b.onPluginStart() c.onPluginStart() 每帧循环执行: a.beforeTriggerExec() b.beforeTriggerExec() c.beforeTriggerExec() SCMD 触发器 c.afterTriggerExec() b.afterTriggerExec() a.afterTriggerExec() </source> == 数据同步说明 == 如果将<code>非同步数据</code>(例如玩家鼠标位置)赋值给变量,该变量对于每个玩家都不一样,若以此判断做出更改<code>需要同步的数据</code>的动作,将会导致多人游戏中玩家<code>需要同步的数据</code>不同步而引发掉线 该类任务通常可以使用 MSQC 插件来辅助解决 == 当前玩家与本机玩家 == <code>当前玩家</code> 与 <code>本机玩家</code> 是两个不同的概念 === 当前玩家 === 是一个全局变量,有一些函数内部会使用它,<code>当前玩家</code>甚至可能不是指一个玩家,可能存储任何数值 setcurpl 是设置<code>当前玩家</code>这个全局变量值的函数 getcurpl 是获取<code>当前玩家</code>这个全局变量现在是什么值的函数 无论你将<code>当前玩家</code>设置为什么值,所有的代码都会在所有玩家的机器上执行 示例 <source lang="js" line> setcurpl(P1); StringBuffer(64).printf("给玩家 1 打印的内容"); setcurpl(P2); StringBuffer(64).printf("给玩家 2 打印的内容"); setcurpl(P3); StringBuffer(64).printf("给玩家 3 打印的内容"); // CurrentPlayer 是常量数字 13,它可以使一些与玩家相关的条件或动作去访问 当前玩家 的值 // CurrentPlayer != getcurpl() // 将 Fastest 游戏速度 x2 setcurpl(-122787 + 6); SetDeaths(CurrentPlayer, SetTo, 21, 0); </source> === 本机玩家 === getuserplayerid() 可以获取 本机玩家编号,它对每个机器都返回不同的值,与 setcurpl 函数设置的值毫无关联 可以使用 getuserplayerid() 来获取本机玩家的编号意味着你可以决定是否在本机执行或者不执行某些代码,当然你需要小心,千万不要试图以此直接或者间接污染`需要同步的数据`,它可能导致数据不同步而引发掉线 示例 <source lang="js" line> setcurpl(P1); StringBuffer(64).printf("当前玩家编号:{}", getuserplayerid()); setcurpl(P2); StringBuffer(64).printf("当前玩家编号:{}", getuserplayerid()); setcurpl(P3); StringBuffer(64).printf("当前玩家编号:{}", getuserplayerid()); </source> == epScript 文档 == [https://flowus.cn/share/be13eab2-87a4-46d6-b00a-98a2dc03dbe2 基本语法] [https://flowus.cn/share/6bd3cc42-5bcf-4150-8f01-e8f7be0ddcf2 使用变量] [https://flowus.cn/share/1c80ec1f-9dab-4051-8e1c-20060f902b28 使用函数] [https://flowus.cn/share/8fecf89e-bb1c-4e25-a1e9-8a702dc63fdf 使用对象] [https://flowus.cn/share/456dc8a7-3b5c-441c-8af9-9fa17fad7701 内置基本对象类型] [https://flowus.cn/share/07106b95-5941-4e3b-9afd-659cfa24a88e 内置扩展对象类型] [https://flowus.cn/share/97e2df11-2d33-4e67-b915-40874d8428a7 常量对照表] [https://flowus.cn/share/d0d040f9-17ed-46d8-a71e-6fec6d5d29f7 内置函数库]
返回至“
苏泽学习笔记
”。
导航菜单
个人工具
登录
名字空间
页面
讨论
变体
视图
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
分类目录
常见问题
工作笔记
制图工具
所有页面
工具
链入页面
相关更改
特殊页面
页面信息