CK3 modding 笔记(2)

Override原版游戏文件

起因是1.12版本引入的瘟疫事件过于离谱,例如在贴吧臭名昭著的“君主之触”事件,由于没有内置CD所以甚至可以1分钟爆10次;从游戏roleplay的角度来看,就像是我作为一个国王不断在领地内瞬移,跟贱民们握手。这种问题就没办法,必须要对原版游戏文件进行override才能修改事件内容。

其实ck3的这个mod系统,基本上是等同于后来的覆盖先来的,而游戏原版文件是第一个被加载的,所以只需要使用正确的mod路径进行覆盖就会生效。

例如想要将原版游戏的eventsdlcce1physician_epidemic_events.txt内的physician_epidemic_events.1040事件进行修改,就只需要在mod文件夹的events里面建立一个.txt文件,里面包含以下内容:

namespace = physician_epidemic_events

physician_epidemic_events.1040 = {
    # 进行你的自定义
}

那么游戏加载的时候就会用你的mod的这个事件override掉原版的同ID事件。

如何实现“这是我直辖的地吗”的逻辑

起因是在解决physician_epidemic_events.1040轰炸的时候发现它的trigger是realm_has_any_epidemic,这是一个scripted trigger,内容是:

realm_has_any_epidemic = {
    any_sub_realm_county = {
        count >= $SIZE$
        any_county_province = {
            any_province_epidemic = {
                outbreak_intensity >= $INTENSITY$
            }
        }
    }
}Code language: PHP (php)

通过查阅游戏输出的triggers可以知道意思就是领地范围内任何公国有瘟疫,都要怪到你这个领主头上,无论你是不是直辖这个公国,甚至无论你是不是这个公国的持有者的直接领主。说好的封臣的封臣不是我封臣,我连间接封臣的地都不能拔,你却告诉我他管理不善爆瘟疫了要我受罚?我阐述你的梦啊!

这肯定不能忍,然后在继续翻事件的时候看到,有一个指令是province_owner,很多事件里用的是exist = province_owner,也有的事件是:

# 某个trigger块内
location.province_owner ?= {
    OR = {
        this = root
        any_liege_or_above = { this = root }
    }
}Code language: PHP (php)

再查阅event_targets.log可知这是一个在province scope下使用会输出该province的owner(character scope)的指令。那么只需要对realm_has_any_epidemic修改成这样就会实现这是我的直辖领地才为True的效果:

realm_has_any_epidemic = {
    any_sub_realm_county = {
        count >= $SIZE$
        any_county_province = {
            any_province_epidemic = {
                outbreak_intensity >= $INTENSITY$
            }
            province_owner ?= {
                this = root
            }
        }
    }
}Code language: PHP (php)

事件冷却

Wiki对此居然没有记录,看来是默认modder们都会去看原版文件了。这是一个顶级key(也就是跟typetitle这些key同级的):

namespace = physician_epidemic_events

physician_epidemic_events.1040 = {
    cooldown = { years = 5 }
    # ...
}

当然也可以接受years = { 1 2 }这样的形式。