3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 论坛

注册 登录

QQ登录

只需一步,快速开始

查看: 3847|回复: 8
打印 上一主题 下一主题

[资料] 分享一些关于IR修改或制作mod的个人经验,如有错漏,理解万岁

[复制链接]

14

主题

333

帖子

2902

积分

游戏达人

Rank: 7Rank: 7Rank: 7

贡献度
501
金元
8780
积分
2902
精华
2
注册时间
2016-5-20
跳转到指定楼层
主题
发表于 2019-5-22 05:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 宰予昼寝 于 2019-5-23 04:03 编辑

一、工具篇
1.修改P社文件,最好准备一个专业一点的文本处理软件,推荐notepad++(当然你可以根据个人习惯选择)
2.图形文件处理软件,推荐PS。某些时候也可以用电脑自带的绘图软件,但不推荐
3.特殊插件:compare,这是notepad++的插件,用于比较文本差异
4.vs code及其插件cwtools,提供便利读写P社代码的功能
5.https://github.com/tboby/cwtools-ir-config 这是cwtools关于IR的一个分支,可以用于参考书写IR不同文件的格式
6.http://bbs.3dmgame.com/forum.php ... extra=#pid230168463,个人编写的一个小软件,目前还没有写完,也没有优化。可以放大查看地图,在点击省份地图时,即可查询得到省份信息和点击处位置坐标,辅助新增省份
7.wiki https://paradoxwikis.com/ wiki就是好老师
8.P社官方论坛,这个可能要科学上网
9.如果你登不上工坊,试试更改hosts文件
10.学习版下载工坊mod的方法,善用搜索引擎。如果你实在找不到,也可以试试这个http://bbs.3dmgame.com/thread-5883303-1-1.html,还没写完,可能体验不太好


二、方法篇
1.直接看原文件,了解每个目录的大概作用。学会在notepad++中使用"find in files"功能,这可以解决你大部分的问题。比如你可能想知道,如何实现关于省份的某个功能。你可以用"find in files",在events文件夹中搜索province
2.模仿。下载别人的mod,学习。这里可能会用到compare插件,方便比对mod对同名原文件的修改内容
3.或许,你可以了解一门编程语言,辅助处理P社的文本文件



三、具体修改篇
前提:
1.默认你已经了解如何自建mod了,因为这种教程网上太多了,善用搜索引擎
2.默认你已经了解备份文件的重要性了
3.默认你对P社代码里面的root、from、prev、this等scope有一定的了解,如果没有,请参考wiki,下面是EU4中的关于Dynamic scopes的说明,仅供参考
ROOT        The base scope.             The ROOT scope in a country event is the country that the event fires for.        
FROM        The calling scope.        The FROM scope in a country event would be the ROOT scope of another event that called it (via the country_event = {} effect).        
PREV        The previous scope.        If you change the scope to FRA = { } and then to change scope to capital_scope = { } within it, the PREV scope is FRA = { }.        
THIS        The current scope.        If you change scope to FRA = { } and then the THIS scope is FRA = { } whilst used within the FRA = { } scope.



第一例:国家决议
以Imperator Rome\game\decisions\enshrine_equal_rights.txt里面的决议为例,首先分析内容
country_decisions = {  #国家决议,默认root指向当前国家
        
        enshrine_social_equity = {  #采用性别平等
                potential = {  #可能性条件
                        num_of_cities >= 1  #城市数量不小于1
                        gender_equality = no  #性别平等:不平等
                        gender_rules = yes  #开启了性别平等的开局设置,gender_rules
                }
                allow = {  #可行性条件
                        oratory_power >= 100  #雄辩点数不小于100点
                        trigger_if = {  #如果存在AAA = TRUE,要求BBB = TRUE
                                limit = {
                                        has_variable = social_equity_var  #这一段代码可能看起来有点绕,为何limit要求有social_equity_var ,下面又要求没有
                                }
                                custom_tooltip = {
                                        text = social_equity_tooltip
                                        NOT = {
                                                has_variable = social_equity_var  #其实,这只是要求你没有,如果有,等它变为没有
                                        }
                                }
                        }
                }
                effect = {  #效果
                        add_oratory_power = -100  #雄辩点数扣100
                        set_variable = {  #添加一个有时限的flag,social_equity_var,持续7300天,20年
                                name = social_equity_var
                                days = 7300
                        }
                        set_gender_equality = yes  #****核心语句****,开启性别平等
                }
               
                ai_will_do = {  #ai执行的factor = 0,我不是很确定这是否完全限制了ai执行该决议的可能性,个人习惯是在判断语句里面还要加上is_ai=no
                        factor = 0
                }
        }
        
        abolish_social_equity = {  #废除性别平等
                potential = {  #可能性条件
                        num_of_cities >= 1  #城市数量不小于1
                        gender_equality = yes  #性别平等:平等
                        gender_rules = yes  #开启了性别平等的开局设置,gender_rules
                }
                allow = {  #可行性条件
                        oratory_power >= 100  #雄辩点数不小于100点
                        NOT = {  #当前统治者不是女性
                                current_ruler = {
                                        is_female = yes
                                }
                        }
                        trigger_if = {  #如果存在AAA = TRUE,要求BBB = TRUE,其他分析同上
                                limit = {
                                        has_variable = social_equity_var
                                }
                                custom_tooltip = {
                                        text = social_equity_tooltip
                                        NOT = {
                                                has_variable = social_equity_var
                                        }
                                }
                        }
                }
                effect = {  #效果
                        add_oratory_power = -100  #雄辩点数扣100
                        set_variable = {    #添加一个有时限的flag,social_equity_var,持续7300天,20年
                                name = social_equity_var
                                days = 7300
                        }
                        set_gender_equality = no  #****核心语句****,关闭性别平等
                        every_character = {  #每个角色,你可能会困惑于使用了every_character这种看起来消耗系统性能比较疯狂的语句,但是这里应该是有一个隐藏的限定范围的,root,指向当前国家
                                limit = {  #继续限定范围
                                        is_female = yes  #是女性
                                        OR = {  #OR,顾名思义,一真即真
                                                has_any_office = yes  #八位大臣之一
                                                has_tech_office = yes  #科研专家之一
                                                AND = {  #AND,顾名思义,一假则假
                                                        is_general = yes  #是将领
                                                        loyalty >= 33  #忠诚度不小于33
                                                }
                                                AND = {  #AND,顾名思义,一假则假
                                                        is_admiral = yes  #海军将领
                                                        loyalty >= 33  #忠诚度不小于33
                                                }
                                                is_governor = yes  #总督
                                        }
                                }
                                remove_all_positions = yes  #六部尚书、顾命大臣、两院学士、军队统帅、地方督抚,是个妹子就罢免了
                        }
                }
               
                ai_will_do = {  #ai执行的factor = 0
                        factor = 0
                }
        }
        
}

综上,可以发现,如果你在开局的时候没有点混合性别,这两个决议,你一个也用不了。
那么,如果你想用又不想点混合性别,你可以注释掉这两个决议里面的gender_rules = yes
注释:在代码前面加#,比如“# gender_rules = yes


第二例:事件
以个人制作的修改特质的事件代码为例,取其中部分(注:这个事件里面大部分的代码都是编程自动生成的,如果你了解一下如何处理文本的相关语句,有的时候会方便很多)
namespace = mt_aor  #事件文件的命名空间,避免出现事件编号冲突

mt_aor.100 = { # add or remove traits
        type = country_event  #事件类型:国家事件,注意IR里面的事件有多种类型,比如角色事件、省份事件等,不同类型的事件scope:root的指向类型也会有所区别
        title = "mt_aor.100.t"  #事件标题
        desc = "mt_aor.100.desc"  #事件说明
        picture = greek_court  #事件配图
        
        left_portrait = scope:mt_aor_ruler  #事件弹窗,左侧人物头像
        right_portrait = scope:mt_aor_taget  #事件弹窗,右侧人物头像
        #right_portrait = scope:mt_aor_taget  #你可以像这样写多个,会由上至下顺序显示

        trigger = {  #触发条件,这个事件我使用自定义on_action来触发的
                root = {
                        is_ai = no  #root指国家,要求国家不是ai
                }
                root.current_ruler = {  #root.current_ruler指国家当前统治者
                        is_alive = yes  #要求存活
                        prisoner = no  #不是囚犯
                }
                scope:target = {  #你右键的目标对象
                        is_alive = yes
                        prisoner = no
                }
        }

        immediate = {  #立即执行
                hidden_effect = {  #隐藏效果
                        root.current_ruler = {
                                save_scope_as = mt_aor_ruler  #将当前统治者另存到scope:mt_aor_ruler中
                        }
                        scope:target = {
                                save_scope_as = mt_aor_taget  #将目标对象另存到scope:mt_aor_taget中
                        }
                }
        }

        option = { #事件选项
                name = "mt_aor.100.a"  #事件选项,内容
                custom_tooltip = "mt_aor.100.a.custom"  #事件选项,鼠标移动到选项上的时候的提示内容
                #trigger = {}  #可以在这里加一个判断,如果满足什么条件,才会出现这个选项
                hidden_effect = {  #隐藏效果
                        trigger_event = {  #触发一个事件,可以利用这一点,实现事件选项的翻页功能
                                id = mt_aor.200  #事件ID是:mt_aor.200
                                days = 0  #等待时间:0天,就是立即执行
                        }
                }
        }
        
        #......略去重复的一段
        
        option = {
                name = "mt_aor.100.exit"
                custom_tooltip = "mt_aor.100.exit.custom"  #什么效果都不写,直接结束事件
               
        }
}



第三例:on_action
说明:on_action的行为模式应该有点像鼠标点击按钮,当你双击一个文本文件,就会打开。预定义的on_action定义了很多游戏里面可能发生的事情,比如有孩子出生啦、有个office离职啦、时间走了一个月啦等等
当这些已经被定义的事情发生,对应的on_action就会被触发
比如在Imperator Rome\game\common\on_action\00_specific_from_code.txt这个文件中的on_giving_birth,这个on_action会处理新生儿的系列事件
on_giving_birth = {
        #scope:newborn is child, root is mother  #这里说明了这个on_action的scope
        effect = {  #每个新生儿都要经过这个影响效果
                on_giving_birth_effect = yes  #预定义的on_giving_birth_effect ,可以在Imperator Rome\game\common\scripted_effects\00_on_action_effects.txt中看到效果,主要是昵称
                scope:newborn = {
                        inbreeding_effect = yes  #文件所在位置同上,近亲结婚的危害,概率获得inbred属性
                }
                scope:newborn = {
                        trigger_event = {
                                id = character_events.35  #触发一个事件,这是用于判断血脉遗传的
                                days = 1
                        }
                }
                if = {
                        limit = {
                                root = {  #注意这里,上面已经说过了,root是孩子妈妈
                                        has_variable = affair_pregnancy  #存在这个变量
                                }
                                employer = {
                                        has_land = yes  #有领地
                                }
                        }
                        root = {
                                remove_variable = affair_pregnancy  #移除这个变量
                        }
                        scope:newborn = {
                                save_scope_as = bastard_child  #将新生儿另存到新的scope:bastard_child
                        }
                        root.employer = {  #妈妈的雇主触发一个事件ip_monarchy.39
                                trigger_event = {
                                        id = ip_monarchy.39
                                }
                        }
                }
                scope:newborn = {  #以下决定新生儿是否获得lisp特质,口齿不清
                        if = {
                                limit  = {
                                        NOT = {
                                                has_trait = lisp
                                                is_alive = yes
                                        }
                                }
                                random_list = {#加权随机,1%的概率获得
                                        1 = {
                                                add_trait = lisp
                                        }
                                        99 = {  }
                                }
                        }
                }
        }
        events = {  #引导触发事件character_events.5
                character_events.5
        }
        random_events = {  #根据权重,随机触发下列事件
                1 = health.1
                1 = health.3
                1 = health.4
                30 = 0
                30 = health.5
        }
}

第四例:杂项
可能在Imperator Rome\game\common里面还有一些零散的可能会用到的文件夹
deathreasons:死亡原因,你可以自定义各种千奇百怪的死因
结构也很简单death_xxxx = {},xxxx是你自定义的文本,补上汉化文件
defines:游戏的定义文件,慎重修改里面的内容,可能会导致游戏不稳定
event_themes:定义不同主题的音效
event_pictures:结合不同音效、图片组成事件图片
modifiers:各种各样的修正buff
traits:定义了非常多的特质
prices:干什么都需要点数,万恶的文件夹
trade_goods:贸易商品,可能在新增贸易商品或者修改buff的时候需要用到
scripted_effects、script_values、scripted_triggers:可能你需要自定义一些可以在多处使用的代码块,考虑使用一下
。。。还有很多,具体效果,好好摸索吧
第五例:翻译
一个字,抄!
你要添加的文本类型,基本都在Imperator Rome\game\localization\simp_chinese下面的文件中出现过了
善用find in files,而且IR天然支持汉语,也不用转码,这一块基本问题不大


To be continued...


玩P社游戏时间长了,你就会慢慢成为一个改派,先抛砖引玉一下。
个人水平有限,mod的制作涉及的内容确实挺杂的,很多东西也没有接触过,如果出现错漏,理解万岁

评分

2

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|3DMGAME ( 京ICP备14006952号-1  沪公网安备 31011202006753号

GMT+8, 2026-4-1 06:35 , Processed in 0.278284 second(s), 18 queries , Memcached On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表