- UID
- 55647
- UCC
-
- 声望
-
- 好评
-
- 贡献
-
- 最后登录
- 1970-1-1
|
实用脚步编辑
———————————————————————————————————————
目录
· 启动脚本编辑器 手把手的教你如何在游戏中使用脚本编辑器.
· 创建第一个脚本 一步一步的指导你创建一个可用的脚本.
· 添加命令 -- 修改金钱 一步一步的讲解如何添加脚本命令, 以增加玩家的金钱作为例子.
· 运行脚本 学习如何手动运行脚本.
· 使用要多个参数的命令-- 声望修改 了解如何在脚本中选择和编辑参数, 这个例子展示了如何增加某个种族的声望.
· 创建语言文件 学习如何创建包含字符串资源的外部文件, 并且在脚本编辑器中加载这些字符串资源.
· 使用命令插槽 介绍了如何使用命令插槽来把你的脚本添加到飞船或空间站的菜单里面去.
· 条件语句 介绍了 if, else/if, while, skip if 这些语句的使用.
· 脚本参数 介绍了脚本参数的用途.
· 创建物品 如何创建在游戏中使用的物品, 包括使用内建的, EMP, 以及 Plugin Manager 的方式来创建.
· 使用快捷键 学习如何使用快捷键, 实例程序实现了通过快捷键来摧毁目标. 这里也介绍了全局变量和安装脚本的一些东西.
· AL插件 学习如何使用基本的 AL 插件来启用和禁用你的脚本.
· 字符串使用 作为从语言文件中载入字符串的后续, 你将看到如何在脚本中创建包含变量内容的字符串.
· 交互问卷 介绍了如何创建问卷形式的交互界面, 以及菜单系统的实现.
· 附录: 命令列表(由Boron Ol Fh'art提供)
启动脚本编辑器
在主菜单中选择 "personal"(个人信息) 菜单:
然后选择 "pilot"(飞行员) 菜单:
最后选择 "Rename"(重命名) 选项:
现在输入 "Thereshallbewings" 作为你的名字, 注意 "T" 必须大写, 还有这里有两个 "l"
游戏会卡一下, 之后脚本编辑器就启用了.现在你只需要保存你的游戏, 并在加入了新脚本后重新载入你的游戏.
创建第一个脚本
进入脚本编辑器
进入后会看到一个文件的列表, 选择最上面的 "new script"(新建脚本) 选项
然后输入脚本的名字, 这也是你编辑的脚本的文件名
进入代码区域, 选中 "new line"(新建一行) 项
按回车键进入脚本命令菜单
添加命令-- 修改金钱
在脚本命令菜单中选择 "Trade commands"(交易命令) 项
再选择 "add money to player"(为玩家添加金钱) 项
然后你会看到一个让你输入第一个参数的对话框, 在这个命令中它是要添加的金钱数量, 这里我们选择 "number"(数字) 那一项
输入你想要的数量
完成后, 这个命令会显示在编辑区域中, 现在只需要按 ESC 键来关闭窗口并保存脚本
运行脚本
向下滚动脚本列表, 找到你刚才创建的脚本
选中你创建的脚本后它会变成高亮状态, 按 "r" 键来运行你的脚本
接下来, 游戏将会询问你在哪个对象上运行你的脚本, 对象包括飞船或者空间站, 在这个脚本中, 我们不需要特定的对象, 只需要选择 "null" 即可.
然后, 游戏将会显示你要执行的脚本, 敲回车就行了, 之后脚本就会开始运行
使用需要多个参数的命令-- 声望修改
在脚本命令菜单中选择 "Global Object Commands"(全局对象命令)
选择 "add notoriety"(增加声望) 项
现在该输入第一个参数了, 第一个参数是你想要增加声望的种族, 我们使用 "Select Race"(选择种族) 按钮来进行选择
在列出来的种族列表中选择你想增加声望的种族, 比如 Argon
完成之后回到脚本编辑器, 但是这里还有其他参数需要设置
使用键盘上的左右方向键来选择你要改变的参数, 然后按回车, 这里我们选择第二个参数
这个参数表示要给谁增加声望, 我们当然是给自己增加声望了, 这就需要使用 "Player" 种族. 不过在列表中并没有 "Player" 这项, 而是显示的飞行员的名字. 选择这个名字, 在脚本中它会自动变成 "Player" 的. [adie: 原文这里还有一句 Goto "Select Race" again then choose "Argon" 应为笔误, 直接删除了没有翻译.]
现在只剩下最后一个参数了, 它表示要添加的声望数量
选择 "<Number>"(数字) 项
输入要增加的声望点数, 通常为 1 到 40
现在这个脚本就完成了, 用 ESC 键保存并退出, 以后当你想要提升 Argon 的声望时就运行这个脚本吧
创建语言文件
[adie: 语言文件的原文是 "Text File", 直译的话叫文本文件, 但这样的称呼太笼统了, 而作者的意思应该是表示一种包含了游戏中使用的字符串文本资源的文件. 这个文件格式其实是 XML 的, 并且游戏支持的每种语言都有一份, 其作用就是为了把游戏中用到的字符串集中到一起, 便于翻译出不同语言的版本, 所以我这里就把它翻译成 "语言文件" 了.]
语言文件包含了游戏中需要的所有文本, 比如命令, 商品名字等.
要创建语言文件, 你首先需要获得一个 ID 号(FILE_ID), FILE_ID 通常是一个 7000 到 9000 之间的 4 位数字. 在 egosoft(X3的开发团队) 的网站上列出了现有脚本所使用的 FILE_ID, 你最好选择一个上面没有的, 以避免和现有的脚本冲突. 点击这里查看 FILE_ID 列表.
[adie: 不明白为什么要设计这么一个 ID, 其实完全可以用一个字符串来标示, 这样脚本开发者们就可以用 "组织名+功能名" 的方法来避免冲突了. 接下来的部分会有好几种不同的 ID, 为了清晰, 这些 ID 都用英文简写来描述, 并先做一些介绍:
1. LANG_ID, language id, 语言 ID. 在游戏中用于标识使用的语言, 其实是各个地区的电话号码的区号, 英国 44, 中国 86, 德国 49... 更多号码参考这里.
2. FILE_ID, text file id, 语言文件 ID. 为每一个资源文件分配的 ID. 同一个 ID 的文件包含的文本意义应该是相同的, 但是使用的语言可能不同. 是字符串资源的物理分组.
3. PAGE_ID, page id, 页面 ID. 用来标识一组字符串, 这组字符串也可能是从好几个不同的文件中加载起来的. 是字符串资源的逻辑分组. 一个分组称为 page, 下面的翻译中的 "页面" 即指的一个这样的分组.
4. TEXT_ID, text id, 字符串文本 ID. 用来标识一个页面中具体的某一个字符串. 由于是在页面中的, 所以只需要在同一个 PAGE_ID 下的没有重复即可.
]
现在可以开始创建文件了, 文件名必须是 LANG_ID 加上你刚刚选择的 FILE_ID. 英语的 LANG_ID 是 44, 如果你获得的 FILE_ID 是 9000, 那么文件名就是 "449000.xml", 另外你还需要把文件放到 x3/t 目录下.
你可以用任何你喜欢的文本编辑器(比如记事本)来编辑这个文件, 文件的第一行基本上都是这样的:
<?xml version="1.0" encoding="UTF-8" ?>
这样表示了你的文件是一个使用 utf-8 编码的 xml 文件, utf-8 编码包含了其它语言(比如俄语)中的特殊字符, 这样才能让其它语言也正常显示.
接下来的一行是 LANG_ID, 在文件名中使用过的, 英语为 44.
<language id="44">
文件中的其余部分需要按分页的方式来组织, 每一页都有一个 ID (PAGE_ID), 脚本编辑器中将使用 PAGE_ID 来加载对应的页面内容.
有一些 PAGE_ID 是有特殊含义的, 他们被用来添加命令或是物品. 这里我们只是添加点文本给脚本用, 可以按照获得 FILE_ID 的方法来获得 PAGE_ID. PAGE_ID 通常也在 7000 到 9000 之间, 所以使用 FILE_ID 来作为 PAGE_ID 是个很不错的注意. 下面是开始一个页面的代码:
<page id="9000" title="my script text">
其中的 title 参数主要是作为参考, 不是必须的. 在页面里面就是一条一条的字符串了, 每个字符串都有它们自己的 ID (TEXT_ID). 它们被放到 t 标签中.
<t id="1">Some text</t>
注意末尾的 </t> 结束标签. 像 HTML 文件一样, 所有的标签都必须被关闭. 因此, 我们需要关闭 page 标签.
</page>
你还可以根据情况添加更多的 page 标签. 在文件的最后, 我们需要关闭 lauguage 标签.
</language>
现在, 你已经做好了语言文件了. 完整的文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<language id="44">
<page id="9000" title="my script text">
<t id="1">Some text</t>
</page>
</language>
然后, 我们还需要从游戏中的脚本编辑器来访问这些字符串.
首先要做的是把语言文件加载到游戏中来, 这通常都是通过名字以 setup 开头的脚本文件来自动运行的. 如果你喜欢, 你也可以用其它名字, 然后手动运行它. 创建一个新脚本, 然后从 "General Commands"(普通命令) 中选择 "load text:id" 命令: [adie: 原文误为 load id ]
这里只有一个 "number"(数字) 类型的参数, 表示要加载的文件的 ID (FILE_ID), 我们这里使用的是 9000, 所以选择 "number"(数字) 然后输入 9000.
这样安装脚本就制作完了, 在游戏载入的时候我们的语言文件也会被载入了. 要使用里面的字符串, 需要用到 "General Commands"(普通命令) 中的 "read text" 命令.
第一个参数是返回值, 它要求使用一个变量, 字符串会被保存到这个变量里面. 选择 "varible"(变量) 然后输入变量名. 在这个例子中, 我使用 "message" 作为变量名. 之后就会创建出一个 $message 变量来存储语言文件中的字符串.
下一个参数是 PAGE_ID, 表示了你要加载的字符串所在的页面. 我们刚刚添加的语言文件页面的 PAGE_ID 是 9000. 语言文件加载的时候, 整个文件都会被读入内存中, 如果你的一些文件中有相同的页面, 它们会互相覆盖. 使用 "read text" 时, 游戏会查找所有加载了的语言文件来获得正确的页面.
最后一个参数是 TEXT_ID, 也就是文件里面 t 标签中的 ID, PAGE_ID 为 9000 时, TEXT_ID 设为 1 就会返回 "Some Text" 字符串了.
[adie: 原文中上面的贴图也贴错了, 还是贴的 id 为红色问号的图.]
现在 $message 变量中应该已经包含字符串 "Some Text" 了, 为了验证一下, 我们把它写到 logbook(航行日志) 中. 在 "Logbook Commands"(航行日志命令) 菜单中选择 "write to player logbook"(写入玩家日志) 命令.
唯一的参数就是要写入到 logbook(航行日志) 中的文本, 我们使用刚刚创建的变量. 在变量列表中选择 "message".
运行这个脚本后, 就可以在 logbook(航行日志) 看到 "Some Text" 这个字符串了.
使用命令插槽
如果你想让你的脚本和某个命令菜单(command menus, 比如 special, combat, trade 等)关联起来, 那你就需要使用一个游戏的命令插槽了.
首先, 你需要选择一个插槽, 每一种类型的命令下面都有 64 个插槽. 在 egosoft 的论坛上有一份列表, 里面有所有可用的插槽, 以及现有的脚本使用了哪些. 所以, 你在选择命令插槽的时候最好先检查一下这份列表.
到这里去查找可用的命令插槽吧, 下面是它们的类型:
Command Name ID Description
COMMAND_TYPE_NAV_?? 2 导航命令, 显示在 Navigation(导航) 菜单中
COMMAND_TYPE_FIGHT_?? 3 战斗命令, combat 菜单中
COMMAND_TYPE_TRADE_?? 4 贸易命令, trade 菜单中
COMMAND_TYPE_SPECIAL_?? 5 特殊命令, special 菜单中
COMMAND_TYPE_PIRACY_?? 6 非法命令(piracy), 原版游戏中不会用到, 但是许多脚本会用它
COMMAND_TYPE_CUSTOM_?? 7 自定义命令, customs 菜单中
COMMAND_TYPE_GENERAL_?? 8 普通菜单(general), 作弊脚本使用的地方
COMMAND_TYPE_TURRET_?? 9 炮塔命令, 像 X2 中的 AEGIS 一样
COMMAND_TYPE_STATION_?? 11 空间站命令, 空间站的命令菜单中出现
COMMAND_TYPE_SHIP_?? 12 飞船额外命令, 脚本最常用的, 不会激活飞船的自动驾驶(autopilot)
你应该首先确定命令的类型, 然后再选择对应的插槽, 最好是选择别人没有用过的, 否则你的脚本就会和其它的脚本不兼容. 插槽编号通常在 16 到 63 之间, 小于 16 的是游戏保留有特殊用途的.
选好了插槽后你就可以把它加入到游戏中了, 这是通过在语言文件中添加特殊的文本项来完成的.
这里是一个例子, 它选择了一种命令类型后用 40 作为插槽编号.
每一个命令插槽都有一个 ID, 通常是 3 到 4 位数. 末尾两位是你选择的插槽编号, 这个例子中为 40. 前面的部分代表了命令的类型, 比如导航(navigation)命令是 2, 编号为 40 的插槽 ID 就是 240. 其余类型的命令分别是: Fight = 3, Trade = 4, Special = 5, Piracy = 6, Custom = 7, General = 8, Turret = 9, Station = 11, Ship = 12.
<?xml version="1.0" encoding="UTF-8" ?>
<language id="44">
<page id="2008" title="Script Cmd Names" descr="">
<t id="240">COMMAND_TEST_TRADE_COMMAND</t>
</page>
<page id="2010" title="Script Cmd Names" descr="">
<t id="240">Test Trade Command</t>
</page>
<page id="2011" title="Script Cmd Shorts" descr="">
<t id="240">Test</t>
</page>
</language>
你需要为你的命令插槽创建 3 个页面, 第一个是 PAGE_ID 为 2008 的, 这里面写的是命令的名字, 也就是脚本引擎显示的你的命令时所用的名称. 如果你省略了这个页面, 它会显示一个默认值, 比如 COMMAND_TYPE_NAV_40.
这就是从脚本编辑器中选择命令时的样子. 如果使用了上面的语言文件, 命令就会变成 COMMAND_TEXT_TRADE_COMMAND:
你可以把上面的名字改成任何你喜欢的, 最好是让它能描述出命令的功能, 这样选择命令时就更容易判断出你选择的是什么命令了.
下面一个是 PAGE_ID 为 2001 的页面, 它是命令的主要名字, 就是你在游戏中使用命令时看到的名称.
最后一个是 PAGE_ID 为 2002 的, 他是命令的缩写, 显示在命令主要名字右边的方括号中的名称.
还有一个也许有用的页面, PAGE_ID 是 2022, 它里面可以放一段关于命令的描述. 有了这个描述后, 在显示的命令名字后面会有一个字符 "i", 当你按 "i" 键的时候就会显示你这段命令描述了.
把命令的显示完成后, 下一步就是创建使用这个命令的脚本了. 这至少需要两个脚本. 第一个为命令脚本, 是激活命令后要运行的脚本. 另外一个是安装脚本, 它用来向游戏注册命令脚本, 让命令在游戏中可用. 还有一个可选的脚本是用来检查命令是否可用的, 在判断是否显示命令的时候会调用这个脚本.
编写命令脚本时, 改变上面的 "Command Name"(命令名称) 设置, 就可以改变在正在运行这个脚本的飞船的状态显示. 选择 "Command Name" 项, 滚动到你的命令名字后选中它.
[adie: 注意这个截图和前一个截图中的 Command Name 的变化]
现在, 这个脚本在运行的时候, 这个名字就会显示在飞船的状态那里. 比如, 在你的财产界面中(your owned property menu), "Current Orders"(当前指令) 那一列上就会显示你的命令名称.
在你的脚本运行完后, 它会重置成 "None".
最后, 你还需要创建一个安装脚本来让你的命令可以使用. 这个脚本名字最好用 "setup" 开头, 这样游戏启动的时候就会自动执运行它了. 在这里我使用的名字为 setup.test.command. 脚本里面要使用的第一个命令就是 "General Commands"(普通命令组) 中的 "set script command upgrade"(设置命令等级) 命令.
第一个参数就是我们添加的命令, 选择 "Select Command/Signal"(选择命令/信号) 项:
选择我们所添加的那条命令
第二个参数是需要的等级, 这通常是指某种物品, 或是某种提升等级的东西(upgrade, 就是飞船需要安装的某些升级系统, 在 Equipment Dock 可以看到很多, 比如 Navigation Software MK1 这种.), 这是命令能够使用的前提条件. 把它设置成 Navigation Software MK1(一级导航软件) 就意味着这个命令只有在安装了 Navigation Software MK1 的飞船上才会显示. 把它设置成 [TRUE] 可以让这个命令一直显示.
需要添加的第二个命令设置了我们的命令要使用的脚本, 它也在 "General Commands"(普通命令组) 中, 是 "global script map: set"(设置全局脚本映射) 命令.
第一个参数又是我们添加的命令
第二个参数是命令可用的类别, 比如, 要让这个命令只在 M6 上可用, 你可以选择 M6. 要让所有飞船都可用, 在 "Select Object Class"(选择目标类型) 中选择 "Ship"(飞船) 就可以了.
第三个参数是脚本工作的种族, 我们选择 Player(玩家) 族就好了.
第四个参数是要运行的脚本, 这里我们选择刚才创建的 "test.command".
最后一个参数是优先级, 通常设置为 1 就足够了. 如果还有其它脚本也使用了这个命令插槽, 只有优先级最高的才会生效. 由于作弊脚本使用的是 0, 设置为 1 将会让你的脚本取代作弊脚本.
这个脚本到这里就完成了. 在运行完安装脚本(不管是手动运行还是重新加载游戏来让它自动运行) 之后你添加的命令就可以使用了.
条件语句
条件语句用来控制脚本的逻辑, 他让你可以选择在不同的条件下执行不同的命令.
主要的条件语句是 if 和 while 语句块, 另外还有只对后面的一个命令起效的 skip if 语句.
· if 语句
· skip if 语句
· else 语句
· else if 语句
· while 语句
· 条件组合
if 语句
添加 if 语句时, 你必须按块来创建, 并且用 "end" 命令来结束它.
要创建 if, 你还得使用表达式才行.
选了 "if" 命令后, 接下来:
然后你需要填充表达式的部分, 你可以使用许多的命令来进行填充. 一个简单的例子是比较一个变量是否和某个值相等. 第一个变量是你要检查的那个, 这个例子中我们使用 $varible.
下一步, 使用相等命令, 也就是 "==" 命令. 你将使用 "..." 来为表达式添加更多的命令, 并且可以一直加下去.
最后是你要比较的对象, 它可以是另外一个变量(比较两个变量是否一样), 或者是数字, 或者是字符串. 这个例子中我们使用字符串 "test".
现在, 在这个语句下添加的任何命令都只有在 $varible 等于 "test" 这个字符串时才有效, 否则他们会被跳过. 在这个例子中, 我们只是向飞行日志(logbook) 中添加一条消息.
最后我们需要用 "end" 语句来结束 if 块. 它在 "General Commands"(普通命令组) 菜单, "Flow Control"(流程控制) 子菜单下.
这样 if 块就关闭了. 注意在 if 和 end 之间的命令被稍微的缩进了. 你可以在这个块之间创建任意多的命令, 也可以嵌套使用 if 语句块等等.
skip if 语句
skip if 语句和 if 语句差不多, 但是它不使用语句块, 只能使用一个单一命令. 并且当条件判断为真(true)时, 它跳过了下面的命令, 这条命令必须严格的在 skip if 那一行的下面. skip if 语句和 if 语句相反, if 语句下面的命令在条件为真(true)的时候执行, skip if 语句下面的命令在条件为假(false)的时候执行. 要让它的作用和 if 语句一样, 你可以使用 skip if not 语句, 它可以把结果为真(true)的表达式变成结果为假(false).
else 语句
else 语句紧跟在 if 语句后面, 如果 if 的条件为假(false), 将会执行 else 命令块. 要添加 else 命令块, 你需要在把 "else" 命令放到 if 语句中 "end" 命令的位置, 然后把 "end" 命令放到 "else" 命令块结束的地方. 所有在 "else" 和 "end" 之间的命令将会在条件表达式为假(false)的时候执行.
你只能在 if 语句块和 "end" 之间添加一个 "else" 语句.
else if 语句
和 else 命令类似, 你也可以添加 else if 命令. 和 else 不一样的是, 你还可以增加另外一个条件表达式. 下面的例子展示了随机选择一条命令来执行的办法.
你也可以在最后添加一个 "else" 命令, 那样在之前的条件都不为真(true)的时候就会执行这个 "else" 块中的命令了.
只有第一个为真(true)的语句块会被执行.
在上图的例子中, 如果 $rand 为 0, 那么第一和第二个表达式都为真(true). 但是只有第一个命令块会被执行. 在整个命令块中, 它只会选择其中一个分支的语句块来执行.
while 语句
while 语句的工作方式和 if 语句类似, 在最开始的地方使用 while 语句, 在结尾处使用 "end" 语句. 不同的是, 只要条件表达式为真(true), 它就一直重复执行中间的语句块. 你可以使用它来让一个命令执行固定的次数. 创建语句的方法和 if 语句一样, 只是在第一步的时候选择 "while" 命令.
在下面的例子中, 只要 $count 的值大于 0 中间的命令块就会一直运行, 每执行一次, $count 的值就会减少 1, 直到降为 0.
"dec $count =" 命令表示减少变量 $count 的值, 这只在变量的类型是数字时才有效. 因此 $count 的值会从 10 变到 9, 再变到 8 ..., 最终, 你运行完脚本后会在你的飞行日志(logbook)中看到 10 条消息.
条件组合
你可以组合多个条件语句, 比如, 你可以判断两个变量是否等于某个值. 组合条件语句的时候, 你需要在每两个语句之间使用 "AND" 或者 "OR" 命令. 每一个条件语句要么为真(true)要么为假(false), 如果你使用 "AND" 语句, 那么只有当两个语句都为真(true)的时候后面的语句才会执行. 如果使用了 "OR" 语句, 只要其中任意一个语句为真后面的语句就会执行. 你可以组合任意数量的条件语句, 只要保证他们之间用 AND 或者 OR 来分割就可以了.
在这个例子中, $varible1 和 $varible2 都需要是 "test" 字符串才能执行中间的命令.
你可以使用括号来改变条件语句组合的优先级.
在这个例子中, 括号里的条件语句会先被求值. 如果你用 true 或 false 来代替上面的语句, 你会得到类似下面的东西:
if ( true or true ) and true if ( true ) and true true
if ( true or false ) and true if ( true ) and true true
if ( false or false ) and true if ( false ) and true false
if ( false or true ) and false if ( true ) and false false
第一列把条件语句用 true 和 false 进行了替换, 第二列去除了括号, 第三列是整个表达式的结果.
你可以使用 "Home" 和 "End" 键来添加和删除表达式中的语句. 如果你创建完整个表达式后想添加括号, 你可以移动光标到让表达式中的变量高亮的位置, 然后按 "Home" 键, 这将会在它之前添加一个命令, 你可以把这个命令设置为括号 (.
脚本参数
在脚本编辑器窗口的上面, 在 version 这类脚本信息的下面, 你可以看到一个叫 "Arguments"(参数) 的区域.
你可以添加任意数量的参数, 你每添加一个, 它就会出现在这个区域的列表中. 选择 "<New Argument>"(新建参数) 可以让你添加一个参数到列表中.
参数用来向脚本传递数据. 当你在另一个脚本中调用这个脚本时, 你可以把使用的变量传递给它.如果是通过命令调用的这个脚本, 它会向用户询问各个参数, 这和你手动运行这个脚本的时候是一样的.
参数包含了 3 个值, 你需要连续的输入他们. 第一个是变量的名字
下一个是参数的类型, 手动运行或通过命令运行脚本时, 这个类型决定了显示什么菜单给用户输入参数. 比如, 设置为 "var/Sector" 会显示星区图给用户选择星区.
最后一个是提示字符串, 选择对象时它会显示在窗口上面, 或者在执行 "call script"(调用脚本) 命令时作为提示.
输入完所有数据之后, 它就被添加到参数列表中了.
你可以再次选择这个参数来编辑它, 也可以用 "Delete" 键来删除它. 要添加另外的参数, 你再次移动到 "<New Argument>"(新建参数) 即可.
运行脚本时, 游戏会询问你每个参数的值. 第一个是你要运行的对象, 这里我们选择 null. 下面就是有效的参数了.
之后, 将会按照参数的顺序让你依次输入每一个参数. 输入的方法由参数的类型来决定.
你可以选择输入 null 或者对应的参数类型, 这里是 Select Ship(选择飞船). 确定要输入一艘飞船作为参数后, 你就需要选择一艘飞船了. 对于这种类型的参数, 你必须先选择一个星区, 然后再选择那个星区里的飞船.
正如你看到的, 选择的方法是由你的参数类型来决定的. 比如类型是 Var/Ware, 你就会看到一个所有可用的物品列表给你选择.
一旦你输入了所有的参数, 脚本就开始运行了.
如果是作为飞船的命令, 它会跳过显示参数的部分, 包括 null 和参数类型的选择. 在这个例子中, 它会直接显示星区图给你选择飞船.
"call script"(调用脚本) 命令
"call script" 命令用来调用另外一个脚本. 命令中已经为你显示了所有需要的参数.
可以看到, 这个字符串参数就是你刚刚输入的: "Select Ship"(选择飞船). 选择它就会出现和手动运行脚本时一样的界面. 你也可以使用变量来代替. 但是, 你无法让它在运行的时候弹出选择界面来让玩家选择这个参数的值, 要实现这样的效果只能是为当前的脚本也添加一个这样的参数.
这样在 $ship 变量中的飞船对象就会传递给被调用的脚本了.
创建物品
· 创建物品的方法主要有三种:
1. 使用标准的内建物品位置
2. 使用 EMP 模块
3. 使用 Plugin Manager 的自定义物品功能
· 在脚本中使用物品
· 添加物品的脚本库
· 调整库存的脚本库
选择创建物品的方法
每种方法都有它的优点和缺点
标准方法: 标准的内建物品有数量限制, 可能会和其它脚本冲突. 他们的价格和声望要求也是固定的, 不能改变. 但是他们不需要安装额外的模块(mod)和程序, 只需要添加脚本就可以了. 和其它方法不不同, 这些物品会被显示在飞船扩展(Ships Extensions)的列表里面. 他们也可以在脚本中使用而不需要要什么额外的东西. 和其它的飞船扩展(ship extensions)一样, 每样物品飞船只能安装一个, 而空间站的库存总是无限的.
EMP: EMP 是一个为游戏添加物品的 MOD(模块), 使用之前你需要先安装它, 所有使用你脚本的用户也需要安装它. 和内建物品一样, 你不可以编辑它的价格和声望, 虽然它也有数量限制, 但是它有更大的范围, 和其它脚本冲突的几率更小. 所有的 EMP 物品都和普通物品一样, 会显示数量为 1. 和内建物品不同, 你可以在一艘飞船上安装多个 EMP 的物品, 但是如果你需要的话, 也可以把它做得像飞船扩展(ship extensions)一样. 另外, 你还需要像工厂里的物品一样手动调整它们的库存.
自定义物品: 自定义物品是 Plugin Manager 提供的一种新特性, 它也可以让你往游戏中添加物品, 要让自定义物品起效, 脚本必须由 Plugin Manager 创建. 和其它方法不同, 你可以自己设置价格, 大小, 数量, 货仓类型, 声望需求等, 你甚至还可以定义它们的外观. 用 Plugin Manager 你可以创建各种类型的物品, 而前面的两种方法只能创建科技升级("tech")物品. 除了你不能在脚本中直接使用它们外其余特性和 EMP 一样: 它们会显示在货仓中而不是飞船扩展(hip extensions)里, 需要手动调整库存. 而且在脚本中使用它们的方法也不一样, 你需要调用其它的的脚本来获取物品对象, 而不是直接使用它们.
方法一: 使用标准的内建物品位置
有几个内建的物品位置可以给脚本使用, 它们只能用来做飞船扩展(ship extensions), 在查看货物列表的时候会显示在扩展(extensions)区域内.
使用内建物品位置最大的麻烦是它们有数量限制, 因此很容易和其它也使用了这个物品位置的脚本冲突. 还有就是限制了物品的价格, 无法修改.
可用的物品位置(slots)如下:
28;0;0;0;0;59;5753;0;35714;1;1;0;35714;-100000;0;0;SS_WARE_SW_NEW1; 1,002,677 credits
28;0;0;0;0;60;5763;0;17;1;1;0;17;-100000;0;0;SS_WARE_SW_NEW2; 477 credits
28;0;0;0;0;61;5773;0;14;1;1;0;14;-100000;0;0;SS_WARE_SW_NEW3; 393 credits
28;0;0;0;0;62;5783;0;56;1;1;0;56;-100000;0;0;SS_WARE_SW_NEW4; 1572 credits
28;0;0;0;0;63;5793;0;88;1;1;0;88;-100000;0;0;SS_WARE_SW_NEW5; 2470 credits
28;0;0;0;0;64;5803;0;283;1;1;0;283;-100000;0;0;SS_WARE_SW_NEW6; 7945 credits
28;0;0;0;0;65;5813;0;383;1;1;0;383;-100000;0;0;SS_WARE_SW_NEW7; 10752 credits
28;0;0;0;0;66;5823;0;1389;1;1;0;1389;-100000;1043;0;SS_WARE_SW_NEW8; 38,996 credits
28;0;0;0;0;67;5833;0;3396;1;1;0;3396;-100000;0;0;SS_WARE_SW_NEW9; 95,343 credits
28;0;0;0;0;68;5843;0;4215;1;1;0;4215;-100000;0;0;SS_WARE_SW_NEW10; 118,336 credits
28;0;0;0;0;69;5853;0;5635;1;1;0;5635;-100000;0;0;SS_WARE_SW_NEW11; 158,203 credits
28;0;0;0;0;70;5863;0;65735;1;1;0;65735;-100000;0;0;SS_WARE_SW_NEW12; 1,845,522 credits
28;0;0;0;0;71;5873;0;17857;1;1;0;17857;333;1043;0;SS_WARE_SW_NEW13; 501,338 credits
28;0;0;0;0;72;5883;0;21428;1;1;0;21428;0;0;0;SS_WARE_SW_NEW14; 601,595 credits
28;0;0;0;0;73;5893;0;324515;1;1;0;324515;-100000;0;0;SS_WARE_SW_NEW15; 9,110,822 credits
28;0;0;0;0;74;5903;0;638508;1;1;0;638508;-100000;0;0;SS_WARE_SW_NEW16; 17,926,236 credits
28;0;0;0;0;75;5913;0;225755;1;1;0;225755;-100000;0;0;SS_WARE_SW_NEW17; 6,338,115 credits
28;0;0;0;0;76;5923;0;1931535;1;1;0;1931535;1000;0;0;SS_WARE_SW_NEW18; 54,228,222 credits
28;0;0;0;0;77;5933;0;2209150;1;1;0;2209150;-100000;0;0;SS_WARE_SW_NEW19; 62,022,317 credits
28;0;0;0;0;78;5943;0;6727565;1;1;0;6727565;-100000;0;0;SS_WARE_SW_NEW20; 188,877,701 credits
你需要选择一个价格和你想要的价格最接近的, 价格显示在每行的最后一列. 要检查这个位置是否可用, 到 Egosoft 论坛的 Community Scripts Sticky 里去吧, 在里面的 2 楼(the second post)可以找到当前脚本使用了哪些物品位置.
看看上面的其中一行, 你可以为你要添加的物品找到一些信息.
28;0;0;0;0;59;5753;0;35714;1;1;0;35714;-100000;0;0;SS_WARE_SW_NEW1; 1,002,677 credits
在这个物品中, 价格是 1,002,677 credits, 你也可以直接用第 1 列和第 9 列(28 和 35714)相乘来得到价格. 第 7 列是物品名字的 TEXT_ID, 5753, 你需要用它来添加物品. 还有第 14 列, -100000, 是购买这个物品需要的声望.
找到你要使用的物品位置后, 你需要为你的物品创建文本资源. 创建时需要用上面找到的那个 TEXT_ID(比如 5753). 创建一个语言文件, 然后添加 PAGE_ID 为 17 的页面. 之后添加字符串条目, 第一个是物品名字, 第二个是物品描述, 物品描述的 TEXT_ID 就是物品名字的 TEXT_ID 加 1. 物品名字的 TEXT_ID 通常以 3 结尾的. 物品描述的 TEXT_ID 通常是以 4 结尾的.
<?xml version="1.0" encoding="UTF-8" ?>
<language id="44">
<page id="17" title="wares" descr="0">
<t id="5753">My Ware</t>
<t id="5754">My Wares Description</t>
</page>
</language>
方法二: 使用EMP 模块
EMP 是由玩家社区开发的一个模块(MOD), 用来向游戏添加物品. 制作 EMP 的初衷是因为标准物品位置的数量限制. 和标准物品一样, 你不能改变价格和其它东西, 你只能选择一个和你想要的最接近的.
首先, 你需要到论坛(Main Forum Page)去下载 EMP, 或者也可以下载它的 SPK版本
如果是下载的模块包(mod package), 里面会有一个列出了所有物品的文本文件. 忽略前面的部分, 直到你看到一个以 SS_WARE_SW_CUSTOM 结尾的分组. 这些都是自定义的物品. 他们被分成很多组, 里面的内容和标准物品一样, 不同的分组之间有不同的声望需求. 在行尾的物品标示都用了两个数字结尾, 比如 SS_WARE_SW_CUSTOM1_1, 其中第一个是物品在组里面的编号, 相当于标准物品的那个, 第二个是组的编号.
28;0;0;0;0;81;10053;0;35714;1;1;0;35714;-10000;0;0;SS_WARE_SW_CUSTOM1_1;
要得到物品的价格, 可以用第 1 列的值(28) 乘以第 9 列的值(35714). 第 14 列, -10000, 是物品的声望需求, 同一组的物品声望需求通常是一样的. 要找你想用的物品时, 先找到声望匹配的组, 然后再去找价格匹配的. 你可以到 论坛 EMP 页面(EMP Forum page)去检查你要使用的物品位置有没有被其它脚本使用. 上面的第二页列出了现有脚本所使用的物品. 第 6 列是物品的编号(81), EMP 页面里就是按这个编号来显示的, 所以你需要用这个编号去做检查. 后面那列是物品的 TEXT_ID (10053), 你需要用它来创建语言文件里的文本项.
一旦你选好了物品位置, 你就要为这个物品创建语言文件了, 上面那个 TEXT_ID(10053) 就是用来创建这个的. 创建一个语言文件, 然后添加 PAGE_ID 为 17 的页面. 之后添加字符串条目, 第一个是物品名字, 第二个是物品描述, 物品描述的 TEXT_ID 就是物品名字的 TEXT_ID 加 1. 物品名字的 TEXT_ID 通常以 3 结尾的. 物品描述的 TEXT_ID 通常是以 4 结尾的.
<?xml version="1.0" encoding="UTF-8" ?>
<language id="44">
<page id="17" title="wares" descr="0">
<t id="10053">My Ware</t>
<t id="10054">My Wares Description</t>
</page>
</language>
方法三: 使用Plugin Manager 的自定义物品功能
要使用自定义物品, 你需要启动 Script Packager 然后切换到 "Wares"(物品) 选项卡.
在第一个列表框里面点右键, 然后选择菜单中的 "Add Ware"(添加物品).
"Ware ID"(物品标识) 是你在脚本里面访问这个物品时用的, 具体参考它的帮助页面.
这里也需要添加语言文件, 它决定了在游戏里显示的物品名字.
要在游戏里使用这些物品, 你需要使用 Plugin Manager 附带的 "getware" 脚本, 具体名字是 "plugin.scriptmanager.getware", 它需要 1 个参数, 就是上面 Script Packager 里的 Ware ID(物品标识), 比如 SS_WARE_CY_MYWARE 这种. 这个标识的格式和名称并不重要, 不过我建议你加上你的名字或是某种标志, 这样可以防止别人使用和你相同的名字. 比如, 两个脚本里面都包含了助推器(afterburner)的脚本, 他们可能都使用了 SS_WARE_AFTERBURN 这样的名字, 于是就产生冲突了. 因此, 如果你在里面加上你的名字, 这两个脚步就会用不同的标识了(SS_WARE_CY_AFTERBURN).
在脚本中使用物品
按照上面的方法创建了你的物品后, 这些物品就可以在游戏里面使用了. 不过我们还需要在宇宙空间里能够买到这个物品. 通常的做法是把物品加入到空间站里面, 比如 Equipment docks, Trading Stations 等.
要出售物品, 只需要使用一条简单的命令, 它运行在空间站对象上. 你可以在 "General Object Commands" 菜单中找到它.
第一项是空间站对象, 你必须在添加产品之前完成它. 方法有很多, 为了简单, 我们这里使用了一个参数来完成.
最后一个是要添加的产品或物品(product/ware). 如果使用的是标准物品或 EMP, 只需要从物品列表里面选择就可以了, 首先, 把滚动条拉到底部, 选择 "Select Ware"(选择物品) 项, 然后物品列表就出来了. (对自定义物品, 可直接查看这里)
然后选择你添加的那个物品, 名字是你在语言文件中填写的名字. 注意, 你必须保证已经加载了语言文件, 否则是无法正确显示的.
这样命令就添加完了, 你可以运行这个脚本, 然后选择要添加物品的空间站.
对于自定义物品, 情况就有些不同了, 你需要在添加这个命令之前先使用 getware 脚本, 你可以在这个命令的上面插入一行. 方法是在当前命令上按 INSERT 键, 新的一行就插入到当前命令上面了.
现在, 你需要添加 "call script"(调用脚本) 命令, 它在 "General Command"(普通命令) 菜单的 "Script Calls"(脚本调用) 子菜单下.
然后选择要调用的脚本, 我们需要的是 getware 脚本, 即 plugin.scriptmanager.getware.
这样 call script 命令就添加进来了, 第一个参数是脚本的返回值, 对 getware 脚本来说, 它返回的是物品对象.
把它设置成保存物品对象的变量, 比如 ware
接下来的参数是脚本要运行的对象, 这个脚本不需要在某个对象上运行, 使用 [THIS] 就足够了. 最后一个参数是物品的名字, 这就是在 Script Packager 中添加物品时的 Ware ID(物品标识). 你需要选择一个字符串类型的值.
然后输入你的 Ware ID(物品标识), 比如: SS_WARE_CY_MYWARE.
最后, 你需要用 ware 变量来做为产品使用, 修改 add product 命令的参数, 用这个变量来代替那个直接使用的物品.
这里还可以增加一个对物品有效性的检查, 并且我强烈建议你这么做. 如果 Plugin Manager 没有安装这个物品, 你调用的那个脚本就会返回 "null", 因此, 你可以这样检查: 如果它是 null, 你就跳过后面的命令. 你可以在 ware 对象上使用 if 语句或者 skip if 语句.
这样, 当 $ware 无效的时候, 添加物品的命令就会被跳过.
添加物品的脚本库
我已经创建了一些很有用的脚本库, 其中一个就是 lib.cycrow.add.ware. 曾经在 bonus pack 中也有一个叫 lib.cy.add.ware 的, 他们基本一样, 只是版本不同. 这两个脚本用来向一组空间站中添加物品. 比如, 你可以把你的物品添加到所有的 Argon Equipment Docks 中.
要使用这个脚本, 你首先要从这里下载它, 然后把它解压到 X3 的脚本目录中. 然后, 你就可以用 "Call Script" 命令来使用那个脚本了.
这里没有返回值, 也不需要在某个对象上运行, 因此这两个地方随便设置下就好了.
第一个参数是你要添加物品的空间站的类型
第二个参数是空间站的种族, 设置为 Argon 的话就会把物品添加到类型匹配的所有 Argon 的空间站中.
最后一个参数是要添加的物品, 在物品列表中选择吧.
调整库存的脚本库
这些脚本是用来调整你的物品的库存的, 这样就可以保证空间站里你的物品总是有货. 对于标准物品, 这个并不需要, 它们永远也不会卖完的. 但是, 对于 EMP 和自定义的物品, 你需要去保证货物总是能够买到.
从这里下载, 然后把它解压到 X3 的脚本目录里面.
这个包里面有 4 个脚本:
1. lib.cycrow.keepstock: 这个脚本完成实际的保证库存工作
2. lib.cycrow.keepstock.add: 这个脚本用来把物品添加到需要保证库存的物品列表里面
3. lib.cycrow.keepstock.remove: 这个脚本用来把物品从列表里面删除
4. lib.cycrow.keepstock.perm: 这是一个需要持续运行的脚本, 保证所有的物品都有充足的库存.
这里面只有 lib.cycrow.keepstock.add 和 lib.cycrow.keepstock.remove 这两个脚本是你会用到的. 其它两个会被其它脚本调用. 使用添加脚本来把物品添加到列表中, 你只需要添加, 脚本会自动完成剩下的工作.
第一个参数是要保证库存的物品
下一个是空间站类型, 这和你添加物品的时候是一样的.
然后是空间站的种族, 也和你添加物品时一样.
最后一个是你想要空间站里保持的数量, 比如设置为 1 就可以保证空间站里始终有 1 个物品可以购买.
使用快捷键
创建快捷键非常的简单, 你只需要在游戏中注册一下, 然后把脚本附加上去就好了. 这样就可以简单的用一个按键来运行脚本, 不必通过命令插槽或者在命令控制台中手动运行了.
在这个例子中, 我们会创建一个简单的摧毁目标的脚本, 它会摧毁当前选中的目标.
· 第一步: 创建脚本
· 第二步: 注册快捷键
· 第三步: 使用快捷键
· 第四步: 自动注册快捷键
· 第五步: 多语言支持
· 第六步: 注销快捷键
第一步: 创建脚本
首先要做的事情是创建一个脚本, 这个脚本会在快捷键被按下的时候调用. 用快捷键来调用的脚本总是作为全局脚本调用的, 由于没有在某个对象上运行, 所以 [THIS] 指针是无效的, 如果你要使用玩家当前的飞船, 就需要使用 [PLAYERSHIP] 指针了.
第一个命令是用来获得当前目标的, 这个命令是 "<RetVar/IF> get player tracking aim", 它在 "Fly Commands"(飞行命令) 菜单里.
它没有任何参数, 只有一个返回值, 我们选择一个变量(比如 "target"(目标))来接收这个返回值.
下一步我们要检查目标是否有效, 方法是检查对象 $target 是否存在. 如果玩家没有选择目标, 我们就返回 null. "exists" 命令在 "General Object Commands"(普通对象命令) 菜单中.
把第一个值设为 "Skip If", 这样如果对象存在的话就会跳过下一条语句.
然后, 把参数设置为目标对象, $target. 这样就会检查返回的对象是否存在, 如果不存在, 就会执行下面的一条语句, 在这里结束这个脚本.
在 "General Commands"(普通命令) 菜单下的 "Script Calls Commands"(脚本调用命令) 子菜单下可以找到 "return"(返回) 命令.
由于我们不需要返回什么, 所以选择 "null" 来作为它的参数.
这个命令会结束脚本, 所以之后的任何命令都不会被执行了. 如果你从另外一个脚本中调用这个脚本, 里面的 "call script" 命令的返回值就是这里你写在 "return" 后面的值, 在上面的例子里就是 "null".
现在我们可以继续剩下的部分了. 现在的脚本已经会检查玩家的目标是否有效了, 对后面的脚本来说, 目标总是存在的. 接下来我们使用摧毁目标的命令, 它在 "General Object Commands"(普通对象命令) 菜单里.
第一个参数是命令要运行的对象, 这里我们要使用的对象在 $target 变量里.
最后一个参数是爆炸相关的, 它的值是 True 或 False. 设置为 [TRUE] 表示命令执行的时候不显示爆炸效果, 目标只是消失掉. 设置为 [FALSE] 表示如果你在附近时显示爆炸效果. 不显示爆炸效果可以让脚本运行得更快, 因为不需要去计算和渲染爆炸的帧了. True 和 False 在 Constants(常量) 菜单中.
选择你喜欢的那个, 我在这里选了 TRUE
第二步: 注册快捷键
要在游戏中使用快捷键, 你需要先向游戏注册一个新的快捷键, 并指定一个按下快捷键后要执行的脚本. 这只需要一个简单的命令就完成了. 在这个的例子中, 我们创建另外一个手动运行的脚本来注册快捷键. 自动注册的方法在稍后再介绍.
首先, 我们创建一个新的脚本, 然后添加这个唯一的 "register hotkey"(注册快捷键) 命令, 这个命令在 "General Commands"(普通命令) 菜单中.
这个命令有一个返回值, 是注册的快捷键的 ID, 我们稍后再解释这个 ID, 现在用一个变量(比如 key)来保存它就好了.
下一个是显示在 "controls"(控制) 选项里的字符串, 用户在这里设置快捷键时用来提示快捷键的作用. 这里把它设置成字符串 "Destruct Targetted Object"(摧毁目标对象).
最后一个参数是要调用的脚本, 这个参数是快捷键触发时要运行的脚本. 也就是第一步的时候制作的脚本. 选择脚本的时候你会看到所有可用的脚本列表.
这个脚本就只需要这一个命令了, 当你手动运行完这个脚本后就可以使用快捷键了.
注意, 当你注册了一个快捷键后, 它会存储在你保存的游戏里面, 如果你再去注册的话, 就会同时显示几个相同的快捷键. 这样使用安装脚本(脚本名以 setup 开头的脚本)来注册快捷键就不太合适了, 那样你每次进入游戏的时候就会多产生一个快捷键项. 解决这个问题的方法稍后再详细介绍.
第三步: 使用快捷键
当你运行完注册快捷键的脚本后, 就可以设置快捷键了. 快捷键需要在游戏里的 control(控制) 选项里进行设置.
所有脚本添加的快捷键都在 "Interface"(接口) 标签页底部的 "Extensions"(扩展) 区里面.
然后需要找到你添加的那个, 显示的名字就是你在 register(注册快捷键) 命令中使用的字符串.
设置快捷键的方法和游戏中其它的控制选项一样. 设置好之后你只需要在战斗中按下这个键就好了. 如果你选中了一个目标, 它就会被摧毁, 否则什么都不会发生.
第四步: 自动注册快捷键
我们目前系统的用户友好度还远远不够, 它要求用户在每次新开的存档中都手动运行一次注册脚本. 使用安装脚本会更好一些, 这些脚本会在载入游戏的时候自动运行. 这样的问题在于, 每次你载入游戏就会增加一个重复的快捷键项. 要避免这种现象, 你需要检查快捷键是否已经被注册过了.
要实现这些, 我们需要在存档中存储一个键值(key). 然后, 如果这个键值存在, 就不必再注册快捷键了. 这个可以通过全局变量来实现. 全局变量和其它变量不同, 它可以让你把一个值或对象和一个字符串关联起来, 并存储在游戏存档中. 这些保存的值可以在任何时候, 任何脚本中进行访问.
所以, 我们第一步需要创建一个安装脚本, 这很简单, 和创建普通脚本差不多, 唯一的区别是文件名, 如果脚本的名字是以 "setup." 开头的, 它就是安装脚本. 比如 "setup.register.hotkey".
首先, 我们需要通过我们的变量来检查快捷键是否存在. 这需要使用 "General Object Commands"(普通对象变量) 中的 "get global varible"(获取全局变量) 命令.
返回值是全局变量中当前存储的值, 这里设置为 key 变量.
下一个参数是变量名字, 这是一个字符串, 你可以使用任意数量的全局变量. 按照惯例, 这个名字使用脚本名字做为前缀, 比如: "destruct.key".
现在, 你需要检查 $key 变量是否有效, 如果它没有被赋值过, 就会返回 "null". 你可以使用条件表达式, if 语句来检查 key 变量. 如果它无效, 你就可以使用 "register" 命令来注册快捷键了.
现在, 添加和之前注册快捷键一样的命令, 记得把注册快捷键的返回值存储起来.
现在, 把 $key 的值存储在全局变量中, 到下次运行的时候就能检测到它被用过了. 为此, 我们需要使用 "General Commands"(普通变量) 中的 "set global varible" 命令.
第一个参数是变量名, 这应该是和你在 "get global varible" 中使用的一样, "destruct.key".
最后一个参数是你要赋的值, 也就是你使用 "get global varible" 命令时的返回值. 因此, 我们把 $key 变量中存储的值传递给它.
最终, 我们要关闭 if 语句来结束这个脚本. 这样, 下次你加载游戏的时候, 这个脚本就会运行, 完成快捷键注册. 这个变量在注销快捷键的时候也需要使用.
|
|