newtonerdai 发表于 2020-11-3 16:27:54

检测字符串表mod是否成功载入:多语种支持的利器


什么是字符串表mod?字符串表有什么用?

不懂的朋友可以先看这个帖子了解一哈→
《[教程整合] 字符串表mod/文本mod :多语种支持的利器》
鄙人认为,在不久的将来,利用字符串表mod来替换掉游戏自带的文本的战役会越来越多。事实上cxt的DE战役《火杯守护者》等战役已经大规模使用了替换的文本,实现了更多效果!比如对改过名的英雄使用自定义科技,修改各种单位的训练说明、科技的研发说明等。

对于战役汉化者而言,你可以联系原作者,利用字符串表mod来提供多语种支持,直接整合到原作者的战役模组里。

但是这会带来一个致命的问题——
由于字符串表mod必须通过重启游戏、开一局标准游戏或者测试一次场景才能真正生效,所以心急不看提示的玩家可能会直接进入战役开玩,结果所有文本都是游戏原版的,根本没法玩下去(鄙人在第一次玩《火杯守护者》时就遇到这种问题)

现在这个致命问题已经可以解决,请诸位认真看看下面的方法:


1、创建一对AI文件
(1)新建2个文本文档
(2)其中一个拓展名改为.ai,另一个改为.per(如何修改文件拓展名请自行百度)
(3)两个文件必须同名
(4)放到你的游戏根目录ai文件夹里↓


C:\Program Files\Steam\steamapps\common\AoE2DE\resources\_common\ai
    └AItest-new.ai
    └AItest-new.per




2、做一套字符串表mod(按照上面的整合教程)
我这里先假设你的字符串表mod里的内容是:
zh(简体中文):


29001 "张飞"
29002 "赵云"



en(英文):


29001 "Zhangfei"
29002 "ZhaoYun"






3、在.per文件中写入以下代码,然后另存为文件,选择UTF-8编码。

保存文件示意图:




;///////////////////////////////////////////////////////////
;//            检测字符串表mod是否成功载入            //
;///////////////////////////////////////////////////////////
;=====常数定义=====
;给modded-text-X的中文、英文分别指定内容。稍后用于判断字符串内容是否与它们相符合。
(defconst modded-text-1-zh "张飞")
(defconst modded-text-1-en "ZhangFei")
(defconst modded-text-2-zh "赵云")
(defconst modded-text-2-en "ZhaoYun")

;变量目标(ID=100)。记录有多少条字符串是正确的。(特别注意,这个#100别和其他目标的ID冲突了~)
(defconst corrects 100)   

;=====初始化(先把计数归零)=====
(defrule
    (true)
    =>
    (set-goal corrects 0)
    (disable-self)
)

;===========检验字符串#29001是否正确===========
    (defrule
      (true)
      =>
      ;把字符串内容存到缓冲区。如果玩家用英文,会存英文内容;中文则会存中文内容。
      (up-store-text c: 29001)
      (disable-self)
    )
    (defrule
      ;判断缓冲区里,有没有“张飞”或“ZhangFei”。二者中有一个即可。
      (or (up-compare-text c: modded-text-1-zh c:>= 0)
            (up-compare-text c: modded-text-1-en c:>= 0))
      =>
      ;字符串正确,那么计数+1
      (up-modify-goal corrects c:+ 1)
      (disable-self)
    )

;===========检验字符串#29002是否正确===========
    (defrule
      (true)
      =>
      ;把字符串内容存到缓冲区
      (up-store-text c: 29002)
      (disable-self)
    )
    (defrule
      ;判断缓冲区里,有没有“赵云”或“ZhaoYun”。二者中有一个即可。
      (or (up-compare-text c: modded-text-2-zh c:>= 0)
            (up-compare-text c: modded-text-2-en c:>= 0))
      =>
      ;内容符合,那么计数+1
      (up-modify-goal corrects c:+ 1)
      (disable-self)
    )

;===========检验字符串#29003是否正确(以此类推)===========
;===========检验字符串#29004是否正确(以此类推)===========

;===========最终判断:是否所有字符串都正确===========
    (defrule
      ;如果字符串正确的数量达到2个……
      (up-compare-goal corrects c:== 2)
      =>
      ;发送AI信号#1。用于告知触发系统。
      (set-signal 1)
      ;注:如果不希望AI说这句话,可以用分号将其转为注释。
      (chat-to-all "字符串表mod已成功载入!")
      (chat-to-all "String Table mod successfully imported!")
      (disable-self)
    )
    (defrule
      ;如果正确数量为0……则不发送AI信号。
      (up-compare-goal corrects c:== 0)
      =>
      (chat-to-all "字符串表mod未载入, 请回到战役选关界面查看说明!")
      (chat-to-all "String Table mod hasn't imported, please return to scenario selection screen to check the tips!")
      (disable-self)
    )
    (defrule
      ;如果正确数量为0~2……则不发送AI信号。
      (up-compare-goal corrects c:> 0)
      (up-compare-goal corrects c:< 2)
      =>
      (chat-to-all "字符串表mod与其他mod冲突了, 请将本战役mod置于最高优先级!")
      (chat-to-all "String Table mod conflicts with other mods, please give this campaign mod top priority!")
      (disable-self)
    )




如果你想多核对几条字符串,可以自行拓展。
如果你的AI里已经用过了100号目标(goal),那请务必更换其他目标编号,以免造成冲突。

4、有些人的记事本编辑出来的AI文件,测试时反而会出问题(原因及解决方法见这个贴)

5、在编辑器里写下触发:


触发0||初始开启不循环
    条件0||收到AI信号AI信号1
    效果0||显示指南“触发收到AI信号0,字符串mod已成功载入,请开始游戏吧!”
    效果1||关闭触发器触发1
    效果2||(其他你想要的效果,比如允许玩家继续游戏)

触发1||初始开启不循环
    条件0||收到AI信号[反向条件]AI信号1
    效果0||显示指南“检测到字符串mod没有成功载入。请:1、将本战役的模组优先级提到最高,2、开任意一局标准游戏,3、重新进入本战役。”
    效果1||关闭触发器触发0
    效果2||(其他你想要的效果,比如禁止玩家继续游戏)




6、在编辑器里,给任意一个电脑玩家设置上面写好的AI
(若列表里未出现那个ai,测试一下再返回编辑器即可)


7、测试:三种效果如下:
成功载入:


未载入:


载入成功一部分,另一部分被其他字符串表mod占用:


页: [1]
查看完整版本: 检测字符串表mod是否成功载入:多语种支持的利器