有任何上古卷轴的问题,请直接到MOD社区发帖求助

Wizard单选/多选窗如何在不同的情况显示不同的选项

Wizard 生成单选窗口(或者多选窗口)很容易就可以实现,但是却不像 OMOD 可以自定义每个选项的显示条件……一开始不懂,只能每次在安装向导后面又加了判断语句(不符合条件的再自动取消勾选)。后来看了 Sensual Walks 的 Wizard 恍然大悟:可以借助 Exec 来实现。下面说下具体的实现方式:

因为只有有兴趣的人才愿意看这些内容,所以我就写少一点。

Leon CN Mod 安装 非官方补丁 的脚本如下:

Show the Content

SelectMany "Bug修复", \
	"|非官方修正 - 天际", "名字:Unofficial Skyrim Patch\n版本:1.2.3a\n作者:Kivan\n汉化:寂寞的魂\n介绍:\n非官方修复Mod,修复了原版游戏的各类Bug。", "", \
	"|非官方修正 - 黎明守卫", "名字:Unofficial Dawnguard Patch\n版本:1.1.1a\n作者:Kivan\n汉化:寂寞的魂\n介绍:\n非官方修复Mod,修复了DLC黎明守卫的各类Bug。", "", \
	"|非官方修正 - 炉火", "名字:Unofficial Hearthfire Patch\n版本:1.0a\n作者:Kivan\n汉化:寂寞的魂\n介绍:\n非官方修复Mod,修复了DLC炉火的各类Bug。", "", \
	"装备修正", "名字:Weapons and Armor Fixes\n版本:2.05\n作者:Headbomb\n汉化:寂寞的魂\n介绍:\n在非官方修复的基础上又修复了原版游戏内的武器装备Bug。", "", \
	"个人修正", "名字:Leon Fix\n版本:1.0\n作者:寂寞的魂\n介绍:\n替代LPA,LPA停止更新\n个人制作的修正Mod,修正了:“炼金+附魔”的循环Bug;   强化恢复系药剂对附魔装备的错误加成Bug;\n头盔与头环能够同时佩戴的Bug;\n按等级奖励的装备全部统一为原版最高属性;\n替换附魔药剂为夜视药剂。", ""
	Case "非官方修正 - 天际"
		SelectSubPackage "Unofficial Skyrim Patch"
		Break
	Case "非官方修正 - 黎明守卫"
		SelectSubPackage "Unofficial Dawnguard Patch"
		Break
	Case "非官方修正 - 炉火"
		SelectSubPackage "Unofficial Hearthfire Patch"
		Break
	Case "装备修正"
		SelectSubPackage "Weapons and Armor Fixes"
		Break
	Case "个人修正"
		SelectSubPackage "Leon Fix"
		Break
EndSelect

这个安装向导存在一个问题:不管玩家有没有安装 黎明守卫 或者 炉火 ,运行的时候都会默认勾选。然后那些没安装 黎明守卫 或者 炉火 的小白装了 Leon CN Mod 后就会跳出……到处求助

我们可以把代码修改成下面的形式

Show the Content

sSelect = 'SelectMany "Bug修复", "|非官方修正 - 天际", "", ""'
sCases = 'Case "非官方修正 - 天际"\n'
sCases += 'SelectSubPackage "Unofficial Skyrim Patch"\n'
sCases += 'Break\n'
If DataFileExists("Dawnguard.esm")
	sSelect += ', "|非官方修正 - 黎明守卫", "", ""'
	sCases += 'Case "非官方修正 - 黎明守卫"\n'
	sCases += 'SelectSubPackage "Unofficial Dawnguard Patch"\n'
	sCases += 'Break\n'
EndIf
If DataFileExists("HearthFires.esm")
	sSelect += ', "|非官方修正 - 炉火", "", ""'
	sCases += 'Case "非官方修正 - 炉火"\n'
	sCases += 'SelectSubPackage "Unofficial Hearthfire Patch"\n'
	sCases += 'Break\n'
EndIf
sSelect += ', "装备修正", "", ""'
sCases += 'Case "装备修正"\n'
sCases += 'SelectSubPackage "Weapons and Armor Fixes"\n'
sCases += 'Break\n'
sSelect += ', "个人修正", "", ""'
sCases += 'Case "个人修正"\n'
sCases += 'SelectSubPackage "Leon Fix"\n'
sCases += 'Break\n'
Exec(sSelect + "\n" + sCases + "EndSelect\n")


这样子,仅在检测到 Dawnguard.esm 的时候才会显示 非官方修正 – 黎明守卫,仅在检测到 HearthFires.esm 的时候才会显示 非官方修正 – 炉火 。

说一下原理:

我们都知道单选的实现方式:

SelectOne 'description', \
	'option 1', 'description 1', 'image 1', \
	'option 2', 'description 2', 'image 2'
	Case 'option 1'
		lines 1
		Break
	Case 'option 2'
		lines 2
		Break
EndSelect

然后

BAIN安装向导(后面直接称Wizard)里面,一行代表一条语句。 如果你想分成多行,必须用反斜杠“\”链接。

所以,省略掉为了美观而添加的空格,再把由\分行的重新恢复成单行,上面实际上可以写成

SelectOne 'description', 'option 1', 'description 1', 'image 1', 'option 2', 'de
scription 2', 'image 2'
Case 'option 1'
lines 1
Break
Case 'option 2'
lines 2
Break
EndSelect

现在的情况是:
SelectOne ‘description’, ‘option 1’, ‘description 1’, ‘image 1’, ‘option 2’, ‘description 2’, ‘image 2’ 这一长串用 sSelect 代替
Case ‘option 1’\nlines 1\nBreak\nCase ‘option 2’\nlines 2\nBreak 这一长串用 sCases 代替

最后多选框的实现方式就是:sSelect + “\n” + sCases + “EndSelect\n”

Exec 是用来执行命令的,我们把 sSelect + “\n” + sCases + “EndSelect\n” 传给 Exec ,于是 Wrye Bash 便能将 sSelect + “\n” + sCases + “EndSelect\n” 编译出来。

上面就像是一个公式,我们剩下只要定义下 sSelect 和 sCases 就可以出线各种形式的单选框(或多选框)

平时,我们使用的 sSelect、sCases 都是死的,但是借助于 条件判断语句 ,我们可以把这两个参数变成活的,同时把整个 单选/多选窗 的选项变得多样化。

以上面的向导为例,当检测到 Dawnguard.esm 时,便会有

sSelect += ', "|非官方修正 - 黎明守卫", "", ""'

这个命令会增加一个新的选项 非官方修正 – 黎明守卫

sCases += 'Case "非官方修正 - 黎明守卫"\n'
sCases += 'SelectSubPackage "Unofficial Dawnguard Patch"\n'
sCases += 'Break\n'

这几条则增加选项 非官方修正 – 黎明守卫 对应的命令。

估计我讲到 多选框的实现方式就是:sSelect + “\n” + sCases + “EndSelect\n” 时,你已经看的懂整个安装向导了。

最后我再讲几点需要注意的地方……

上面我没有写上每个 option 的 description,现在我把它们补齐

Show the Content

sSelect = 'SelectMany "Bug修复", "|非官方修正 - 天际", "名字:Unofficial Skyrim Patch\\n版本:1.2.3a\\n作者:Kivan\\n汉化:寂寞的魂\\n介绍:\\n非官方修复Mod,修复了原版游戏的各类Bug。", ""'
sCases = 'Case "非官方修正 - 天际"\n'
sCases += 'SelectSubPackage "Unofficial Skyrim Patch"\n'
sCases += 'Break\n'
If DataFileExists("Dawnguard.esm")
	sSelect += ', "|非官方修正 - 黎明守卫", "名字:Unofficial Dawnguard Patch\\n版本:1.1.1a\\n作者:Kivan\\n汉化:寂寞的魂\\n介绍:\\n非官方修复Mod,修复了DLC黎明守卫的各类Bug。", ""'
	sCases += 'Case "非官方修正 - 黎明守卫"\n'
	sCases += 'SelectSubPackage "Unofficial Dawnguard Patch"\n'
	sCases += 'Break\n'
EndIf
If DataFileExists("HearthFires.esm")
	sSelect += ', "|非官方修正 - 炉火", "名字:Unofficial Hearthfire Patch\\n版本:1.0a\\n作者:Kivan\\n汉化:寂寞的魂\\n介绍:\\n非官方修复Mod,修复了DLC炉火的各类Bug。", ""'
	sCases += 'Case "非官方修正 - 炉火"\n'
	sCases += 'SelectSubPackage "Unofficial Hearthfire Patch"\n'
	sCases += 'Break\n'
EndIf
sSelect += ', "装备修正", "名字:Weapons and Armor Fixes\\n版本:2.05\\n作者:Headbomb\\n汉化:寂寞的魂\\n介绍:\\n在非官方修复的基础上又修复了原版游戏内的武器装备Bug。", ""'
sCases += 'Case "装备修正"\n'
sCases += 'SelectSubPackage "Weapons and Armor Fixes"\n'
sCases += 'Break\n'
sSelect += ', "个人修正", "名字:Leon Fix\\n版本:1.0\\n作者:寂寞的魂\\n介绍:\\n替代LPA,LPA停止更新\\n个人制作的修正Mod,修正了:“炼金+附魔”的循环Bug;   强化恢复系药剂对附魔装备的错误加成Bug;\\n头盔与头环能够同时佩戴的Bug;\\n按等级奖励的装备全部统一为原版最高属性;\\n替换附魔药剂为夜视药剂。", ""'
sCases += 'Case "个人修正"\n'
sCases += 'SelectSubPackage "Leon Fix"\n'
sCases += 'Break\n'
Exec(sSelect + "\n" + sCases + "EndSelect\n")


如果认真观察的话,会看到
(1)sSelect += , “|非官方修正 – 黎明守卫”, “名字:Unofficial Dawnguard Patch\\n版本:1.1.1a\\n作者:Kivan\\n汉化:寂寞的魂\\n介绍:\\n非官方修复Mod,修复了DLC黎明守卫的各类Bug。”, “”
最外边用的是单引号”
(2)sSelect += ‘, “|非官方修正 – 黎明守卫”, “名字:Unofficial Dawnguard Patch\\n版本:1.1.1a\\n作者:Kivan\\n汉化:寂寞的魂\\n介绍:\\n非官方修复Mod,修复了DLC黎明守卫的各类Bug。”, “”‘
\n变成了\\n,这是在字符串里面,\必须用\\来表示
(3)sCases += ‘Case “个人修正”\n
sCases 每次后面都要加上 \n ,不然所有的 Case XXX 都回联成一行。

icedream

About icedream

其实我知道的东西很少,只是翻译了一些东西,悲催的是翻译过后很快就忘了。

, ,

Comments are closed.