游戏达人
  
- 贡献度
- 501
- 金元
- 8780
- 积分
- 2902
- 精华
- 2
- 注册时间
- 2016-5-20
|
本帖最后由 宰予昼寝 于 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
查看全部评分
-
|