rimworld吧 关注:288,301贴子:5,292,424
  • 14回复贴,共1

写了个Rimtalk增强提示词拓展的通告过滤代码块

只看楼主收藏回复

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
~}


IP属地:浙江1楼2026-02-14 16:14回复
    2楼自占


    IP属地:浙江2楼2026-02-14 16:20
    收起回复
      2026-04-16 06:58:38
      广告
      不感兴趣
      开通SVIP免广告
      nb啊大佬!这个功能真的很需要,挖山挖出屋顶塌方的时候整个殖民地的小人都在吐槽负责建造的殖民者,弄得我出戏得脑壳疼


      IP属地:江苏来自iPhone客户端3楼2026-02-14 17:19
      收起回复
        大佬,最后一行是不是少了一个花括号}


        IP属地:河北4楼2026-02-14 21:00
        收起回复


          IP属地:广东来自Android客户端5楼2026-02-15 20:28
          回复

            只不过我这是“地下资源”而不是矿脉


            IP属地:上海6楼2026-02-15 21:57
            回复
              肘击了DS,把排版改了一下,原来的空行有点多了

              {{~ # ===== 过滤用代码块(不用操作) =====
              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
              cs = colony_status
              for p in patterns
              # 替换匹配到的整个事件(从事件开头到下一个事件或标题)
              cs = cs | regex.replace '(?m)' + p + '[\\s\\S]*?(?=^###|^- \\[|\\Z)' ''
              end
              # 压缩所有连续两个及以上换行为单个换行(消除事件内部空行)
              cs = cs | regex.replace "(?:\\r?\\n){2,}" "\n"
              # 在每个事件标题前添加一个换行,以在事件之间恢复一个空行(两个换行)
              # 使用 $1 作为反向引用,恢复原始标题行
              cs = cs | regex.replace "(?m)(^- \\[.*?\\])" "\n$1"
              # 移除文档开头的所有连续换行,避免开头有空行
              cs = cs | regex.replace "^\\n+" ""
              cs
              ~}}


              IP属地:广西8楼2026-03-03 14:59
              收起回复
                好像要长脑子了


                IP属地:湖南来自iPhone客户端10楼2026-03-10 16:26
                回复