RT,最近用上了RimTalk - Enhanced Prompt and Announcement,也就是那个带通告板的mod。虽然自动捕获很方便,还能自己写些事件给小人讨论
但是我在mod设置里没找到、能精准地取消特定条目的捕获功能,比如专门取消杰作或发现矿脉的通告
所以自己搓了个过滤的代码块来解决这个问题,虽然写的有点野蛮,但用了几天没啥问题所以分享一下
代码块直接放在末尾了,虽然里面写了注释,但我这里还是讲下思路和功能并用【】标注我感觉需要注意的点,方便大伙操作,如果有人用的话
首先来看Colony_Status,这个是增强提示词给rimtalk高级设置添加的,它里面会把通告板、近况、地图的派系塞给ai去处理,其中{{colony_status}}给的就是通告板的内容,如下图所示

随后,我们打开预览功能就能看到给ai的通告板内容,如下图所示
不难注意到通告板的格式
## Colony Status 【这里就是开头】
### 条目类型 【这里的话则是区分各个条目,比如Event、Quest等等】
- [优先级] 标题: 描述 【条目类型之下的,就是各个条目了,其格式可以归纳为这样子】
...
### 条目类型
...
注意到,任何一个条目的开头,都必然是【- [优先级] 】这是无论如何都不变的,具体来说就是【-、空格、[、优先级、]、空格】,然后接上条目的【标题】、一个半角冒号(也就是英文冒号)、空格、【描述】
【- [优先级] 】【标题】: 【描述】
于是,就可以利用这一结构,通过关键词来匹配条目的内容,特别是通过必然的开头【- [优先级] 】与【标题】来过滤掉不想要的条目,但还是有几个问题需要注意
-标题中的全角冒号(也就是中文冒号)虽然可以不管,但是还是可能有半角冒号的,这会影响标题的获取,例如图中的【- [Normal] 矿脉: 钢铁: 查拉使用....】,在通告板中,其标题为【矿脉: 钢铁】,之后的才是【描述】,需要处理这种特殊情况。如图所示,【任务激活】后跟的是全角冒号,不用管,而【矿脉】后面跟的是半角冒号,大多数时候看间隔就能发现区别

-【描述】是可能会存在换行的,所以获取【描述】时也要允许换行,这说明,只得通过检索到下一个【- [优先级] 】或【###条目类型】或结尾来确认条目的【描述】结尾,并以此进行分隔。如上面图中的【任务激活:扫描低温锻铸号】里【描述】的情况一样
确认了问题后,我把准备设计的代码分成两块,第一块用来配置关键词,平时操作这个就行,第二块就是过滤功能,平时不用管它,如图所示,数组的功能也在图中了

对于标题中可能有英文冒号的问题,我就干脆放着不管了,仍然取【- [优先级] 】到【第一个英文冒号+空格】前的内容视作【标题】,并用and_group这个【数组套数组】的办法来处理整个条目的【标题+描述】,如上图所示,注意,修改的时候一定要确保是【数组套数组】而且【不要留空】,虽然我自己写的但我老忘记然后全删了
同理,fuzzy_keywords里也【不要留空】,不然全都会被删掉的
以及,配置关键词时,一定要用英文的引号【'】套住词,中文的不行的,整块玩意会坏掉动不起来的
需要注意的是,由于用【- [优先级] 】和【###条目类型】来判断各个条目的开头与结尾,所以如果你要自己写个条目,请务必避免用半角的【-】、【[】、【]】、【#】这些字符,同时各种非全角符号如!、$之类的也最好别用,因为我没搞转义,不然大概可能也许会出问题。中文输入法的那种宽宽的符号是绝对没问题的,比如。,!(【这些
至于过滤功能里的代码,就是先一个个匹配起来然后集中删掉,不是很有必要讲太多,因为写得还是挺野蛮的,稍微学下就能看懂,如果想diy的话肯定是有基础的。对于没diy想法的其实也没必要了解应该
总之这里再放俩过滤前后的对比图


要用的话,把{{colony_status}}去掉,然后把我的俩个代码块粘贴过去就行了

{{~ # ========== 条目过滤配置 ==========
#精确匹配:标题内容必须与列表中某个词完全相同,才会删除该条目
#模糊匹配:标题内容只要包含列表中某个词,就会删除该条目
#组合匹配:如果某组中的所有词都在条目(标题+描述)中出现,就会删除该条目
exact_titles = ['杰作','传奇作品'] #精确匹配
fuzzy_keywords = ['厄兆噬树'] #模糊匹配
and_groups = [['矿脉','钢铁'],['矿脉','铀'],['矿脉','白银']] #组合匹配
# ==================================================== ~}}
{{~ # ===== 过滤用代码块(不用操作) =====
patterns = []
event_header = '(?m)^- \\[.*?\\] '
if exact_titles.size > 0
p = event_header + '\\b(' + (exact_titles | array.join '|') + ')\\b:[ ]'
patterns = array.add patterns p
end
if fuzzy_keywords.size > 0
p = event_header + '[^:]*(' + (fuzzy_keywords | array.join '|') + ')[^:]*:[ ]'
patterns = array.add patterns p
end
for group in and_groups
lookaheads = []
for keyword in group
lookaheads = array.add lookaheads '(?=(?:(?!(?m)^###|(?m)^- \\[)[\\s\\S])*?' + keyword + ')'
end
p = event_header + (lookaheads | array.join '') + '[^:]*:[ ]'
patterns = array.add patterns p
end
result = colony_status
for p in patterns
# 替换匹配到的整个事件(从事件开头到下一个事件或标题)
result = result | regex.replace '(?m)' + p + '[\\s\\S]*?(?=^###|^- \\[|\\Z)' ''
end
result
~}
但是我在mod设置里没找到、能精准地取消特定条目的捕获功能,比如专门取消杰作或发现矿脉的通告
所以自己搓了个过滤的代码块来解决这个问题,虽然写的有点野蛮,但用了几天没啥问题所以分享一下
代码块直接放在末尾了,虽然里面写了注释,但我这里还是讲下思路和功能并用【】标注我感觉需要注意的点,方便大伙操作,如果有人用的话
首先来看Colony_Status,这个是增强提示词给rimtalk高级设置添加的,它里面会把通告板、近况、地图的派系塞给ai去处理,其中{{colony_status}}给的就是通告板的内容,如下图所示

随后,我们打开预览功能就能看到给ai的通告板内容,如下图所示

不难注意到通告板的格式
## Colony Status 【这里就是开头】
### 条目类型 【这里的话则是区分各个条目,比如Event、Quest等等】
- [优先级] 标题: 描述 【条目类型之下的,就是各个条目了,其格式可以归纳为这样子】
...
### 条目类型
...
注意到,任何一个条目的开头,都必然是【- [优先级] 】这是无论如何都不变的,具体来说就是【-、空格、[、优先级、]、空格】,然后接上条目的【标题】、一个半角冒号(也就是英文冒号)、空格、【描述】
【- [优先级] 】【标题】: 【描述】
于是,就可以利用这一结构,通过关键词来匹配条目的内容,特别是通过必然的开头【- [优先级] 】与【标题】来过滤掉不想要的条目,但还是有几个问题需要注意
-标题中的全角冒号(也就是中文冒号)虽然可以不管,但是还是可能有半角冒号的,这会影响标题的获取,例如图中的【- [Normal] 矿脉: 钢铁: 查拉使用....】,在通告板中,其标题为【矿脉: 钢铁】,之后的才是【描述】,需要处理这种特殊情况。如图所示,【任务激活】后跟的是全角冒号,不用管,而【矿脉】后面跟的是半角冒号,大多数时候看间隔就能发现区别

-【描述】是可能会存在换行的,所以获取【描述】时也要允许换行,这说明,只得通过检索到下一个【- [优先级] 】或【###条目类型】或结尾来确认条目的【描述】结尾,并以此进行分隔。如上面图中的【任务激活:扫描低温锻铸号】里【描述】的情况一样
确认了问题后,我把准备设计的代码分成两块,第一块用来配置关键词,平时操作这个就行,第二块就是过滤功能,平时不用管它,如图所示,数组的功能也在图中了

对于标题中可能有英文冒号的问题,我就干脆放着不管了,仍然取【- [优先级] 】到【第一个英文冒号+空格】前的内容视作【标题】,并用and_group这个【数组套数组】的办法来处理整个条目的【标题+描述】,如上图所示,注意,修改的时候一定要确保是【数组套数组】而且【不要留空】,虽然我自己写的但我老忘记然后全删了
同理,fuzzy_keywords里也【不要留空】,不然全都会被删掉的
以及,配置关键词时,一定要用英文的引号【'】套住词,中文的不行的,整块玩意会坏掉动不起来的
需要注意的是,由于用【- [优先级] 】和【###条目类型】来判断各个条目的开头与结尾,所以如果你要自己写个条目,请务必避免用半角的【-】、【[】、【]】、【#】这些字符,同时各种非全角符号如!、$之类的也最好别用,因为我没搞转义,不然大概可能也许会出问题。中文输入法的那种宽宽的符号是绝对没问题的,比如。,!(【这些
至于过滤功能里的代码,就是先一个个匹配起来然后集中删掉,不是很有必要讲太多,因为写得还是挺野蛮的,稍微学下就能看懂,如果想diy的话肯定是有基础的。对于没diy想法的其实也没必要了解应该
总之这里再放俩过滤前后的对比图


要用的话,把{{colony_status}}去掉,然后把我的俩个代码块粘贴过去就行了

{{~ # ========== 条目过滤配置 ==========
#精确匹配:标题内容必须与列表中某个词完全相同,才会删除该条目
#模糊匹配:标题内容只要包含列表中某个词,就会删除该条目
#组合匹配:如果某组中的所有词都在条目(标题+描述)中出现,就会删除该条目
exact_titles = ['杰作','传奇作品'] #精确匹配
fuzzy_keywords = ['厄兆噬树'] #模糊匹配
and_groups = [['矿脉','钢铁'],['矿脉','铀'],['矿脉','白银']] #组合匹配
# ==================================================== ~}}
{{~ # ===== 过滤用代码块(不用操作) =====
patterns = []
event_header = '(?m)^- \\[.*?\\] '
if exact_titles.size > 0
p = event_header + '\\b(' + (exact_titles | array.join '|') + ')\\b:[ ]'
patterns = array.add patterns p
end
if fuzzy_keywords.size > 0
p = event_header + '[^:]*(' + (fuzzy_keywords | array.join '|') + ')[^:]*:[ ]'
patterns = array.add patterns p
end
for group in and_groups
lookaheads = []
for keyword in group
lookaheads = array.add lookaheads '(?=(?:(?!(?m)^###|(?m)^- \\[)[\\s\\S])*?' + keyword + ')'
end
p = event_header + (lookaheads | array.join '') + '[^:]*:[ ]'
patterns = array.add patterns p
end
result = colony_status
for p in patterns
# 替换匹配到的整个事件(从事件开头到下一个事件或标题)
result = result | regex.replace '(?m)' + p + '[\\s\\S]*?(?=^###|^- \\[|\\Z)' ''
end
result
~}

老爹









