模组制作:修订间差异

本页面讲述的内容长期有效
(翻译)
无编辑摘要
 
(未显示5个用户的7个中间版本)
第1行: 第1行:
{{Version|timeless}}{{需要翻译}}
{{Version|timeless}}{{需要翻译}}
'''模组制作'''('''Modding'''),或者说创建模组,是一种修改游戏资源或行为的方式,有时候仅仅是为了个人使用,有时候制作者也会发布出来供其它玩家一起使用。可以通过以下途径了解mod制作[https://mods.paradoxplaza.com/games/ck3 Paradox Mods]和[https://steamcommunity.com/app/1158310/workshop/ Steam Workshop]。
'''模组制作'''('''Modding'''),或者说创建[[ 模组]] ,是一种修改游戏资源或行为的方式,有时候仅仅是为了个人使用,有时候制作者也会发布出来供其它玩家一起使用。可以通过以下途径了解mod制作[https://mods.paradoxplaza.com/games/ck3 Paradox Mods]和[https://steamcommunity.com/app/1158310/workshop/ Steam Workshop]。


 在所有的P社游戏中,十字军之王3的可修改程度都是相当高的。mod制作者可以修改的内容也相当宽泛,比如语言翻译,更多的事件和决议,更优秀的地图,更大程度上的内容修改和作弊。
 在所有的P社游戏中,十字军之王3的可修改程度都是相当高的。mod制作者可以修改的内容也相当宽泛,比如语言翻译,更多的事件和决议,更优秀的地图,更大程度上的内容修改和作弊。
第6行: 第6行:
 这篇引导的目的在于降低制作mod的门槛。但是学习的曲线总是曲折的,这需要你通过不断的练习和阅读他人优秀mod代码来提升自己制作mod的水平。
 这篇引导的目的在于降低制作mod的门槛。但是学习的曲线总是曲折的,这需要你通过不断的练习和阅读他人优秀mod代码来提升自己制作mod的水平。


''重要'': 大多数模组会改变校验码,将禁 止玩家获得 成就。在{{Cite file|Crusader Kings III\game}}中的{{Cite file|checksum_manifest.txt}}查看校验文件夹和文件。 唯一安全 的是替换纹理、字体、着色器或音乐的模组。
大多数模组会改变校验码, 这在1.9版本之前的游戏中 将禁 成就。在{{Cite file|Crusader Kings III\game}}中的{{Cite file|checksum_manifest.txt}}查看校验文件夹和文件。 不会改变校验码 的是替换纹理、字体、着色器或音乐的模组。


== 提示 & 指引==
== 提示 & 指引==
第12行: 第12行:
*'''创建一个mod对游戏进行修改''': 即使是很小的改动,也不要直接修改CK3游戏本体的游戏文件,而是要单独创建一个mod。因为本体更新时会直接覆盖这些修改,并且没有任何提示。
*'''创建一个mod对游戏进行修改''': 即使是很小的改动,也不要直接修改CK3游戏本体的游戏文件,而是要单独创建一个mod。因为本体更新时会直接覆盖这些修改,并且没有任何提示。
*'''使用好的文本编辑器''' 用来编辑和搜索文件。以下软件均免费:
*'''使用好的文本编辑器''' 用来编辑和搜索文件。以下软件均免费:
**[https://code.visualstudio.com/ Visual Studio Code]. 有一个粉丝自制的CWTools扩展,具有Paradox语法高亮、验证以及触发器和效果的工具提示。要安装它,请到VS左侧面板的扩展,搜索CWTools。(注意:验证规则是不完整的,会在gui和本地化文件中显示许多错误)
**[https://code.visualstudio.com/ Visual Studio Code].  可使用[https://marketplace.visualstudio.com/items?itemName=dragon-archer.paradox-highlight Paradox Highlight]插件为Crusader Kings III和其它Paradox Games提供最新版的语法高亮。还 有一个粉丝自制的CWTools扩展,具有Paradox语法高亮、验证以及触发器和效果的工具提示。要安装它,请到VS左侧面板的扩展,搜索CWTools。(注意:验证规则是不完整的,会在gui和本地化文件中显示许多错误)
**[https://notepad-plus-plus.org/downloads/ Notepad++]。选择Perl作为你的语言,因为它可以提供良好的高亮显示,并允许折叠代码块和注释。要将其设置为默认语言,请进入“设置”,“样式器配置器”,在左侧列表中找到Perl,并在底部的“User ext.”字段中添加“gui txt”(不加引号)。
**[https://notepad-plus-plus.org/downloads/ Notepad++]。选择Perl作为你的语言,因为它可以提供良好的高亮显示,并允许折叠代码块和注释。要将其设置为默认语言,请进入“设置”,“样式器配置器”,在左侧列表中找到Perl,并在底部的“User ext.”字段中添加“gui txt”(不加引号)。
**[https://atom.io/ Atom]。不包括本地化文件所需的UTF-8-BOM编码。除此之外,其可自定义程度高。选择Perl 6作为你的语言以获得更好的效果。要将其设置为默认,请到文件,配置,找到“core:”,并在下面添加:“customFileTypes: "source.perl6"。["txt""gui"]",比如[https://discuss.atom.io/t/how-do-i-make-atom-recognize-a-file-with-extension-x-as-language-y/26539 这个例子]。
**[https://atom.io/ Atom]。不包括本地化文件所需的UTF-8-BOM编码。除此之外,其可自定义程度高。选择Perl 6作为你的语言以获得更好的效果。要将其设置为默认,请到文件,配置,找到“core:”,并在下面添加:“customFileTypes: "source.perl6"。["txt""gui"]",比如[https://discuss.atom.io/t/how-do-i-make-atom-recognize-a-file-with-extension-x-as-language-y/26539 这个例子]。
第24行: 第24行:
* '''清晰明了的传达你的MOD的关键内容'''
* '''清晰明了的传达你的MOD的关键内容'''
**你的MOD说明应当以简短并清晰的描述开始,说明你的MOD为游戏增添或更改的内容。切忌以长篇大论、长长的告示列表、前提条件以及安装介绍等等开头。
**你的MOD说明应当以简短并清晰的描述开始,说明你的MOD为游戏增添或更改的内容。切忌以长篇大论、长长的告示列表、前提条件以及安装介绍等等开头。
**Don't assume the person reading the description has ever heard of the mod before (if they had, they wouldn't generally be reading the description).
** 不要假设用户已经了解过这个mod了。( 如果他们已经了解了这个mod就不会再读你的描述了)
**Clearly and visibly state whether your mod is Ironman-compatible. (Even if it seems obvious to you.)
** 标明这个mod支不支持成就和铁人模式。 ( 即使你觉得这已经很明显了也要标出来)
*Remove your local mod when you subscribe to the Steam version, otherwise it may not work in the game.
* 当你订阅这个mod的steam版本时,记得移除你放在本地的mod,否则这个mod可能会出现问题或者无法运行。
*Backup your work. Either manually or with a source control system like Git. Also consider using GitHub for team collaboration.
* 记得保存和备份。要么手动保存要么存在github一类的地方。Github同时也是合作制作mod的好工具。
*Use a proper merge tool (like [https://winmerge.org/?lang=en WinMerge]) to merge between folders and update modified files for a new patch.
* [https://winmerge.org/?lang=en WinMerge] 一类的工具来合并文件夹,更新、修改文件以及打补丁。
*If you're replacing text across dozens or hundreds lines of code, you may want to use regular expressions. They are available in all of the text editors above. Learning resources: [https://regexone.com/ RegexOne], [https://regexr.com/ RegExr].
* 当你想要换掉大量的文字时,最好使用正则表达式。 所有上面提到的编辑器都可以用. 资源: [https://regexone.com/ RegexOne], [https://regexr.com/ RegExr].


===本地化文件===
===本地化文件===
第36行: 第36行:
*为了保证游戏正确读取文件,文件名需要以'''*l_<language>.yml'''形式保存。例如'''council_l_english.yml'''。
*为了保证游戏正确读取文件,文件名需要以'''*l_<language>.yml'''形式保存。例如'''council_l_english.yml'''。
** 你必须使用美式拼写"localization"。使用英式拼写"localization"会无法运行。
** 你必须使用美式拼写"localization"。使用英式拼写"localization"会无法运行。
* To overwrite existing localization values, put your files with changes into a folder named "replace" within the localization folder.
* 如果要重写原始的本地化数值, 将你修改过的文件放入名为localization文件夹内名为"replace" 的文件夹.


==创建一个模组==
==创建一个模组==
{{main|Mod structure#Creating initial files}}
{{main|Mod structure#Creating initial files}}


It is recommended to use the game launcher to create the mod's initial files.
推荐使用游戏官方登陆器来创建初始文件。


==上传/更新模组==
==上传/更新模组==
第60行: 第60行:
==保存修改的内容==
==保存修改的内容==


Save files are located in:
保存的文件被放在:


*Windows: Documents\Paradox Interactive\Crusader Kings III\save games
*Windows: Documents\Paradox Interactive\Crusader Kings III\save games
*Linux: ~/.local/share/Paradox Interactive/Crusader Kings III/save games
*Linux: ~/.local/share/Paradox Interactive/Crusader Kings III/save games


''It is not possible to edit an ironman save!''
'' 铁人档是不可修改的!''


First start the game in the debug mode and save.
首先在debug模式下开一局游戏并且保存。


*On Steam: right-click the game on Steam -> Properties -> Set Launch Options -> add -debug_mode
*Steam: 在Steam上右键单击游戏 -> Properties -> Set Launch Options -> 勾选debug_mode


*Windows: Create a shortcut for the .exe file -> right-click it -> Properties -> add -debug_mode at the end of the Target field
*Windows: .exe 文件创建一个快捷方式 -> 右键单击-> Properties -> add -debug_mode at the end of the Target field


PC(Windows):
PC(Windows):


#Find the save file in the save games folder.
# 在保存游戏的文件夹内找到你保存的游戏
#Right-click the save file and extract it like an archive with 7-Zip or WinRar.
# 右键单击此文件用7-Zip 或者 WinRar 提取出压缩文件.
#将提取出的'gamestate'文件的扩展名重名为.ck3
#将提取出的'gamestate'文件的扩展名重名为.ck3
#Right-click it and open with your text editor (Windows Notepad is not recommended as the save files are very big).
# 右键单击并且用编辑器打开 ( 不推荐使用windows notepad,因为这些文件很大).
#Edit the file and save it.
# 编辑并保存文件。
#游戏中会直接加载mod(不需要重复压缩)。
#游戏中会直接加载mod(不需要重复压缩)。


Autosaves can be edited directly without extracting the gamestate.
你可以直接编辑自动保存的游戏without extracting the gamestate.


Mac:
Mac:
第105行: 第105行:
|}
|}


===Contents of the gamestate file===
=== gamestate 文件中的内容 ===
The table below contains the possible first-level blocks in the gamestate file. Entries are provided in order of appearance.
The table below contains the possible first-level blocks in the gamestate file. Entries are provided in order of appearance.
{| class="wikitable"
{| class="wikitable mw-collapsible mw-collapsed"
!Block
! Block
!Description
! Description
|-
|-
|meta_data
| meta_data
|Contains metadata about the game, such as the game version. Used by the main menu screen.
| Contains metadata about the game, such as the game version. Used by the main menu screen.
|-
|-
|ironman_manager
| ironman_manager
|Related to ironman saving.
| Related to ironman saving.
|-
|-
|(various variables)
| (various variables)
|These variables do not belong in a block.
| These variables do not belong in a block.
{| class="wikitable"
{| class="wikitable"
!Variable
! Variable
|-
|-
|date
| date
|-
|-
|bookmark_date
| bookmark_date
|-
|-
|first_start
| first_start
|-
|-
|speed
| speed
|-
|-
|random_seed
| random_seed
|-
|-
|random_count
| random_count
|}
|}
|-
|-
|variables
| variables
|Contains script flags.
| Contains script flags.
|-
|-
|game_rules
| game_rules
|Contains the save's current game rules.
| Contains the save's current game rules.
|-
|-
|provinces
| provinces
|Contains province data, including buildings.
| Contains province data, including buildings.
|-
|-
|landed_titles
| landed_titles
|Contains the following sub-blocks:
| Contains the following sub-blocks:
{| class="wikitable"
{| class="wikitable"
!Sub-block
! Sub-block
!Description
! Description
|-
|-
|dynamic_templates
| dynamic_templates
|
|
|-
|-
|landed_titles<br>''(repetition)''
| landed_titles<br>''(repetition)''
|Contains an entry for each landed title in the game, in the format:
| Contains an entry for each landed title in the game, in the format:
<pre>
<pre>
# Exact formatting in file is different in terms of spaces and lines
# Exact formatting in file is different in terms of spaces and lines
第216行: 第216行:
In vanilla CK3, this block ends at entry ~12369.
In vanilla CK3, this block ends at entry ~12369.
|-
|-
|index=(value)<br>''(variable)''
| index=(value)<br>''(variable)''
|
|
|}
|}
|-
|-
|dynasties
| dynasties
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* dynasty_house (ends at entry ~6401)
*dynasty_house (ends at entry ~6401)
* dynasties (ends at entry ~6239)
*dynasties (ends at entry ~6239)
* static_dynasties (list of numbers)
*static_dynasties (list of numbers)
* static_dynasty_houses (list of numbers)
*static_dynasty_houses (list of numbers)
|-
|-
|deleted_characters
| deleted_characters
|
|
|-
|-
|living
| living
|Contains entries of living characters. The following format is used for each character:
| Contains entries of living characters. The following format is used for each character:
<pre>
<pre>
index={
index={
first_name="..."
first_name="..."
birth=(date)
birth=(date) # Format: yyy.m.d
female=yes # Optional
female=yes # Optional
culture=(culture index)
was_playable=yes # Optional
faith=(faith index)
nickname="nick_..." # Optional
dynasty_house=(dynasty house index) # Optional
culture=(culture index) # Optional if dynasty_house is specified, defaults to dynasty_house culture. Required if no dynasty_house, or culture different from that of dynasty_house.
faith=(faith index) # Optional if dynasty_house is specified, defaults to dynasty_house faith.  Required if no dynasty_house or faith different from that of dynasty_house.
dynasty_house=(dynasty house index) # Optional, must specify culture and faith if omitted
skill={ (diplomacy) (stewardship) (martial) (intrigue) (learning) (prowess) } # One value for each skill
skill={ (diplomacy) (stewardship) (martial) (intrigue) (learning) (prowess) } # One value for each skill
sexuality=(sexuality id) # Optional
prowess_age=(value) # Optional. Negative value.
dna="(dna string)" # Optional
dna="(dna string)" # Optional
mass=(value) # Optional
mass=(value) # Optional, exclusive with weight
traits={ (trait index...) } # List of trait indices
weight={ # Optional, exclusive with mass
base=(value)
current=(value) # Optional
target=(value) # Optional
}
 
sexuality=(value) # Optional. Defaults to heterosexual. Valid values: ho, bi, as, none. None is for children under 10.
traits={ (trait index...) } # Optional. List of trait indices. Typically omitted for young children.
recessive_traits = { (trait index...) } # Optional. List of trait indices
inactive_traits = { (trait index...) } # Optional. List of trait indices
inactive_traits = { (trait index...) } # Optional. List of trait indices
# Optional (family_data)
# Optional (family_data)
family_data={
family_data={
primary_spouse=(character id)
real_father=(character id) # Optional
spouse=(character id)
betrothed=(character id) # Optional
child = { (character id...) } # List of character ids
primary_spouse=(character id) # Optional. Equal to one of the spouse ids.
spouse=(character id) # Optional. First spouse
spouse=(character id) # Optional. Second spouse
spouse=(character id) # Optional. Third spouse
spouse=(character id) # Optional. Fourth spouse
concubine=(character id) # Optional. First concubine
concubine=(character id) # Optional. Second concubine
concubine=(character id) # Optional. Third concubine
former_spouses={ (character id...) } # Optional. List of character ids
former_concubines={ (character id...) } # Optional. List of character ids
former_concubinists={ (character id...) } # Optional. List of character ids
child = { (character id...) } # Optional. List of character ids
}
}


第262行: 第282行:
# (...)
# (...)
}
}
}
# Optional (modifiers), various locations in alive_data
modifier={
modifier="(modifier)"
expiration_date=(date)
}
}


第267行: 第293行:
income=(value) # Optional
income=(value) # Optional
location=(landed title index) # Optional
location=(landed title index) # Optional
stress=(value) # Optional
fertility=(value)
fertility=(value)
health=(value)
health=(value)
piety={
piety={
currency=(value)
currency=(value)
accumulated=(value) # Optional
accumulated=(value) # Optional. Devotion
}
}
prestige={
prestige={
currency=(value)
currency=(value) # Optional
accumulated=(value) # Optional
accumulated=(value) # Optional. Fame
}
focus={ # Optional
type="(value)" # Education or lifestyle
date=(date)
changes=(value)
progress=(value)
}
secrets= { (id...) } # Optional. List of ids
targeting_secrets={ (id...) } # Optional. List of ids
schemes={ (id...) } # Optional. List of ids
targeting_schemes={ (id...) } # Optional. List of ids
heir={ (ids...) } # Optional. List of ids
pretender={ (ids...) } # Optional. List of ids
claim={ { # Optional. List of claims
title=(title id)
pressed=yes # Optional
}
}
used_punishments={ # Optional. List of reasons
(value)={
imprisonment_reason=yes # Optional
revoke_title_reason=yes # Optional
}
}
lifestyle_xp={ # Optional
diplomacy_lifestyle=(value) # Optional
martial_lifestyle=(value) # Optional
stewardship_lifestyle=(value) # Optional
intrigue_lifestyle=(value) # Optional
learning_lifestyle=(value) # Optional
}
perk={ ... } # Optional. List of perks
prison_data={ # Optional
imprisoner=(character id)
date=(date)
imprison_type_date=(date)
type="(value)" # house_arrest or dungeon
}
}
weight_update=(value)
weight_update=(value) # Optional
kills={ (character ids... } # Optional. List of character ids
pool_history=(date) # Optional
wars={ (value) (value) (value) (value) } # Optional
} # End of alive_data block
} # End of alive_data block


court_data={
court_data={
# All keys within this block are optional
# All keys within this block are optional
host=(value)
employer=(character id)
employer=(character id)
council_task=(council task index)
council_task=(council task index)
special_council_tasks={ (value...) }
army=(value)
regiment=(regiment index)
regiment=(regiment index)
knight=yes
knight=yes
wants_to_leave_court=yes
leave_court_date=(date)
}
}


第292行: 第364行:
domain={ (landed title index...) } # List of landed title indices
domain={ (landed title index...) } # List of landed title indices
vassal_contracts={ (values) } # List of values
vassal_contracts={ (values) } # List of values
units= { (values...) } # Optional
last_war_finish_date=(date) # Optional
last_raid=(date) # Optional
became_ruler_date=(date)
became_ruler_date=(date)
laws={ "(law id)"... } # List of law ids
laws={ "(law id)"... } # List of law ids
strength=(value)
strength=(value)
strength_for_liege=(value) # Optional
liege_tax=(value) # Optional
balance=(value)
balance=(value)
dread=(value) # Optional
known_schemes={ (ids...) } # Optional. List of ids
succession={ (character id...) } # List of character ids
succession={ (character id...) } # List of character ids
is_powerful_vassal=yes # Optional
vassal_power_value=(value) # Optional
domain_limit=(value)
domain_limit=(value)
vassal_limit=(value)
vassal_limit=(value) # Optional
vassals_towards_limit=(value)
vassals_towards_limit=(value) # Optional
government="(government id)"
government="(government id)"
realm_capital=(value
realm_capital=(value)
ai_allowed_to_marry=yes
ai_allowed_to_marry=yes
council={ (value...) } # List of values
council={ (value...) } # List of values
第307行: 第388行:
diplo_centers={ (value...) } # List of values
diplo_centers={ (value...) } # List of values
election_titles={ (landed title index...) } # List of landed title indices
election_titles={ (landed title index...) } # List of landed title indices
absolute_control=yes # Optional
interaction_cooldowns={ # Optional
(interaction)=(date)
}
} # End of landed_data block
} # End of landed_data block


第319行: 第404行:
</pre>
</pre>
|-
|-
|dead_unprunable
| dead_unprunable
|Contains character entries.
| Contains character entries.
|-
|-
|characters
| characters
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* dead_prunable (contains character entries)
*dead_prunable (contains character entries)
* prune_queue
*prune_queue
* dummy_female (contains a character entry)
*dummy_female (contains a character entry)
* dummy_male (contains a character entry)
*dummy_male (contains a character entry)
* unborn (contains unborn data entries)
*unborn (contains unborn data entries)
* natural_deaths
*natural_deaths
* current_natural_death
*current_natural_death
* sexuality_chances
*sexuality_chances
|-
|-
|character_lookup
| character_lookup
|
|
|-
|-
|units
| units
|
|
|-
|-
|activities
| activities
|
|
|-
|-
|opinions
| opinions
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* active_opinions (contains opinion entries)
*active_opinions (contains opinion entries)
|-
|-
|relations
| relations
|Encompasses hooks, alliances, Contains the following sub-blocks:
| Encompasses hooks, alliances, Contains the following sub-blocks:
 
* active_relations
*active_relations
|-
|-
|schemes
| schemes
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* active (contains scheme entries)
*active (contains scheme entries)
|-
|-
|stories
| stories
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* active (contains story entries)
*active (contains story entries)
* next=(date) ''(variable)''
*next=(date) ''(variable)''
|-
|-
|pending_character_interactions
| pending_character_interactions
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* data
*data
* player
*player
|-
|-
|secrets
| secrets
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* secrets (contains entries of secrets) ''(repetition)''
*secrets (contains entries of secrets) ''(repetition)''
** indices
*known_secrets
*** type
*** target
**** type
**** identity=(id)
*** owner=(id)
*** relation_type
*** participants = { (ids)}
* known_secrets = {
** secret=(id)
** owner=(id)
|-
|-
|armies
| armies
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* regiments
*regiments
* army_regiments
*army_regiments
* armies
*armies
|-
|-
|religion
| religion
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* religions
*religions
* faiths
*faiths
* great_holy_wars
*great_holy_wars
* holy_sites
*holy_sites
|-
|-
|wars
| wars
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* active_wars
*active_wars
* names
*names
|-
|-
|sieges
| sieges
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* sieges ''(repetition)''
*sieges ''(repetition)''
|-
|-
|raid
| raid
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* raid ''(repetition)''
*raid ''(repetition)''
|-
|-
|succession
| succession
|
|
|-
|-
|holdings
| holdings
|
|
|-
|-
|ai
| ai
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* war_coordinator_db
*war_coordinator_db
* war_plan_db
*war_plan_db
* ai_stategies
*ai_stategies
|-
|-
|county_manager
| county_manager
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* counties
*counties
* monthly_increase (list of values)
*monthly_increase (list of values)
|-
|-
|fleet_manager
| fleet_manager
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* fleets
*fleets
|-
|-
|council_task_manager
| council_task_manager
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* active
*active
|-
|-
|important_action_manager
| important_action_manager
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* active
*active
|-
|-
|faction_manager
| faction_manager
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* factions
*factions
|-
|-
|culture_manager
| culture_manager
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* cultures
*cultures
* template_cultures (list of numbers)
*template_cultures (list of numbers)
* era_discovery
*era_discovery
|-
|-
|mercenary_company_manager
| mercenary_company_manager
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* mercenary_companies
*mercenary_companies
|-
|-
|holy_orders
| holy_orders
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* holy_orders
*holy_orders
* religion_name
*religion_name
* faith_name
*faith_name
|-
|-
|coat_of_arms
| coat_of_arms
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* coat_of_arms_manager_name_map
*coat_of_arms_manager_name_map
* coat_of_arms_manager_database (ends at entry ~17278)
*coat_of_arms_manager_database (ends at entry ~17278)
* next_id=(id) ''(variable)''
*next_id=(id) ''(variable)''
|-
|-
|(triggered events)
| (triggered events)
|Each triggered event has its own block, started using triggered_event={
| Each triggered event has its own block, started using triggered_event={
|-
|-
|next_player_event_id=(value) ''(variable)''
| next_player_event_id=(value) ''(variable)''
|
|
|-
|-
|played_character
| played_character
|Contains the following sub-blocks:
| Contains the following sub-blocks:
 
* name="..." ''(variable)''
*name="..." ''(variable)''
* character=(character id) ''(variable)''
*character=(character id) ''(variable)''
* player=(value) ''(variable)''
*player=(value) ''(variable)''
* important_decisions
*important_decisions
* legacy
*legacy
* rally_points
*rally_points
|-
|-
|currently_played_characters={ (character id...) }
| currently_played_characters={ (character id...) }
|List of character ids.
| List of character ids.


|}
|}


==Extracting files From Microsoft Store version==
== 从Microsoft Store 版本中提取文件==
If you want to read the files using the Microsoft Store version, you can use a program called UWPDumper to extract the files.
你可以用UWPDumper来提取文件。


#Download the latest x64 binary of [[Modding#Tools & utilities|UWPDumper]]
# 下载最新的x64版本的[[Modding#Tools & utilities|UWPDumper]]
#Enable Developer Mode (Windows Settings -> Update and Security -> For Developers -> Developer Mode).
# 打开开发者模式 (Windows 设置 -> 更新和安全> 开发者选项-> 开发人员模式)
#Run CK3.
# 运行ck3.
#Run UWPInjector.exe from the program you just downloaded.
# 运行你刚刚下载的UWPInjector.exe.
#Enter the number next to ck3.exe : ParadoxInteractive.ProjectTitus_zfnrdv2de78ny as the processID.
# 输入ck3.exe 旁边的数字作为processID: ParadoxInteractive.ProjectTitus_zfnrdv2de78ny.
#Check where it is going to store the files (probably somewhere like C:\Users\%USERPROFILE%\AppData\Local\Packages\ParadoxInteractive.ProjectTitus_zfnrdv2de78ny\TempState\DUMP
# 查看他储存文件的地址 ( 可能类似于 C:\Users\%USERPROFILE%\AppData\Local\Packages\ParadoxInteractive.ProjectTitus_zfnrdv2de78ny\TempState\DUMP
#Wait for the program to finish.
# 等待程序运行完毕。


The files should then be present in the directory specified earlier. If you want to edit the files, create a mod and copy the desired files there.
之后这些文件就会被放到上面提到的地址处。如果你想修改这些文件,创建一个mod并且把你想改的文件复制进去。


==工具与实用程序==
==工具与实用程序==


*[https://marketplace.visualstudio.com/items?itemName=dragon-archer.paradox-highlight Paradox Highlight]: 一个为CK3和其它Paradox游戏代码文件提供语法高亮的VSCode插件。
*[[Exporters]] (Maya and Photoshop)
*[[Exporters]] (Maya and Photoshop)
*[https://forum.paradoxplaza.com/forum/threads/information-and-faq.924764/ Clausewitz Maya Exporter]: 一个可以创建和导出3D模型并且在CK3和其他Clausewitz游戏中使用的工具。
*[https://forum.paradoxplaza.com/forum/threads/information-and-faq.924764/ Clausewitz Maya Exporter]: 一个可以创建和导出3D模型并且在CK3和其他Clausewitz游戏中使用的工具。

2024年3月29日 (五) 18:15的最新版本

模组制作Modding),或者说创建模组,是一种修改游戏资源或行为的方式,有时候仅仅是为了个人使用,有时候制作者也会发布出来供其它玩家一起使用。可以通过以下途径了解mod制作Paradox ModsSteam Workshop

在所有的P社游戏中,十字军之王3的可修改程度都是相当高的。mod制作者可以修改的内容也相当宽泛,比如语言翻译,更多的事件和决议,更优秀的地图,更大程度上的内容修改和作弊。

这篇引导的目的在于降低制作mod的门槛。但是学习的曲线总是曲折的,这需要你通过不断的练习和阅读他人优秀mod代码来提升自己制作mod的水平。

大多数模组会改变校验码,这在1.9版本之前的游戏中将禁用成就。在Crusader Kings III\game中的checksum_manifest.txt查看校验文件夹和文件。不会改变校验码的是替换纹理、字体、着色器或音乐的模组。

提示 & 指引[编辑 | 编辑源代码]

  • 创建一个mod对游戏进行修改: 即使是很小的改动,也不要直接修改CK3游戏本体的游戏文件,而是要单独创建一个mod。因为本体更新时会直接覆盖这些修改,并且没有任何提示。
  • 使用好的文本编辑器 用来编辑和搜索文件。以下软件均免费:
    • Visual Studio Code. 可使用Paradox Highlight插件为Crusader Kings III和其它Paradox Games提供最新版的语法高亮。还有一个粉丝自制的CWTools扩展,具有Paradox语法高亮、验证以及触发器和效果的工具提示。要安装它,请到VS左侧面板的扩展,搜索CWTools。(注意:验证规则是不完整的,会在gui和本地化文件中显示许多错误)
    • Notepad++。选择Perl作为你的语言,因为它可以提供良好的高亮显示,并允许折叠代码块和注释。要将其设置为默认语言,请进入“设置”,“样式器配置器”,在左侧列表中找到Perl,并在底部的“User ext.”字段中添加“gui txt”(不加引号)。
    • Atom。不包括本地化文件所需的UTF-8-BOM编码。除此之外,其可自定义程度高。选择Perl 6作为你的语言以获得更好的效果。要将其设置为默认,请到文件,配置,找到“core:”,并在下面添加:“customFileTypes: "source.perl6"。["txt""gui"]",比如这个例子
    • Sublime Text. 这个链接本身是《大将军:罗马》的扩展,但是也可以用在ck3上: Sublime Tools. 这个扩展为效果和触发器添加了不同的颜色高亮。如果你想要在sublime里切换注释就还需要在同一个User文件夹里添加this file
  • 总是通过 error.log 文件检查mod运行中出现的bug。...\Documents\Paradox Interactive\Crusader Kings III\logs
  • 日志文件夹还包含效果、触发器和作用域列表。在游戏中使用控制台命令"script_docs"和"DumpDataTypes"来生成它们。
  • 使用-debug_mode -develop开始游戏 启动选项使用控台以及"reload gui", "reload gfx"命令
    • Steam:右键点击游戏->属性->启动选项->填入 -debug_mode -develop
    • Windows: Create a shortcut for the .exe file -> right-click it -> Properties -> add -debug_mode -develop at the end of the Target field
  • CK3文件夹在Linux系统的路径 ~/.local/share/Paradox Interactive/Crusader Kings III
  • 清晰明了的传达你的MOD的关键内容
    • 你的MOD说明应当以简短并清晰的描述开始,说明你的MOD为游戏增添或更改的内容。切忌以长篇大论、长长的告示列表、前提条件以及安装介绍等等开头。
    • 不要假设用户已经了解过这个mod了。(如果他们已经了解了这个mod就不会再读你的描述了)
    • 标明这个mod支不支持成就和铁人模式。 (即使你觉得这已经很明显了也要标出来)
  • 当你订阅这个mod的steam版本时,记得移除你放在本地的mod,否则这个mod可能会出现问题或者无法运行。
  • 记得保存和备份。要么手动保存要么存在github一类的地方。Github同时也是合作制作mod的好工具。
  • WinMerge一类的工具来合并文件夹,更新、修改文件以及打补丁。
  • 当你想要换掉大量的文字时,最好使用正则表达式。 所有上面提到的编辑器都可以用. 资源: RegexOne, RegExr.

本地化文件[编辑 | 编辑源代码]

  • 本地化文件夹中的yml后缀结尾的文件必须以UTF-8 + BOM编码保存,以便游戏正确读取。
  • 为了保证游戏正确读取文件,文件名需要以*l_<language>.yml形式保存。例如council_l_english.yml
    • 你必须使用美式拼写"localization"。使用英式拼写"localization"会无法运行。
  • 如果要重写原始的本地化数值, 将你修改过的文件放入名为localization文件夹内名为"replace"的文件夹.

创建一个模组[编辑 | 编辑源代码]

主条目:Mod structure#Creating initial files

推荐使用游戏官方登陆器来创建初始文件。

上传/更新模组[编辑 | 编辑源代码]

再次上传您的模组更新,

  1. 打开启动器,
  2. 导航到“Mods”部分,
  3. 点击“Mod工具”,从下拉菜单中选择你的模组。
  4. 选择什么平台上传它。
  5. 输入任何描述。(如果更新,请确保启动器从网站上复制最新的描述。)
  6. 添加一个缩略图
    • 对于Steam创意工坊,把thumbnail.png放在mod文件夹里。使用1:1的比例,最大1MB。创意工坊显示的最大缩略图约为600x600像素。
    • 对于Paradox Mods,将缩略图拖到描述下方的区域。建议最小尺寸为900x500,png或jpg,最大1MB。
  7. 点击“上传MOD”。
    • 在Steam上,模组将以私人模式上传,并出现在你的Steam资料->创意工坊项目中。打开它,并将侧栏上的可见性改为 “公开”,即可实际发布。
    • 在Paradox Mods上,mod将在验证过程后被发布。你可能需要编辑你的描述,因为网站通常会删除换行符和BBCode格式。

保存修改的内容[编辑 | 编辑源代码]

保存的文件被放在:

  • Windows: Documents\Paradox Interactive\Crusader Kings III\save games
  • Linux: ~/.local/share/Paradox Interactive/Crusader Kings III/save games

铁人档是不可修改的!

首先在debug模式下开一局游戏并且保存。

  • Steam: 在Steam上右键单击游戏 -> Properties -> Set Launch Options -> 勾选debug_mode
  • Windows: 为.exe文件创建一个快捷方式 -> 右键单击-> Properties -> add -debug_mode at the end of the Target field

PC(Windows):

  1. 在保存游戏的文件夹内找到你保存的游戏
  2. 右键单击此文件用7-Zip 或者 WinRar提取出压缩文件.
  3. 将提取出的'gamestate'文件的扩展名重名为.ck3
  4. 右键单击并且用编辑器打开 (不推荐使用windows notepad,因为这些文件很大).
  5. 编辑并保存文件。
  6. 游戏中会直接加载mod(不需要重复压缩)。

你可以直接编辑自动保存的游戏without extracting the gamestate.

Mac:

  1. 打开终端
  2. 确认当前路径是正确的
  3. 输入命令 "unzip FileName.ck3"
  4. 将提取出的'gamestate'文件的扩展名重名为.ck3
  5. 保存此纯文本
  6. 游戏中会直接加载mod(不需要重复压缩)
平台 保存方式 路径
Windows 本地 C:\Users\%USERPROFILE%\Documents\Paradox Interactive\Crusader Kings III\save games
Windows Steam 云端 C:\Program Files (x86)\Steam\userdata\####\1158310\remote\save games
Mac 本地 $HOME/Documents/Paradox Interactive/Crusader Kings III/save games
Linux 本地 $HOME/.local/share/Paradox Interactive/Crusader Kings III/save games

gamestate文件中的内容[编辑 | 编辑源代码]

The table below contains the possible first-level blocks in the gamestate file. Entries are provided in order of appearance.

Block Description
meta_data Contains metadata about the game, such as the game version. Used by the main menu screen.
ironman_manager Related to ironman saving.
(various variables) These variables do not belong in a block.
Variable
date
bookmark_date
first_start
speed
random_seed
random_count
variables Contains script flags.
game_rules Contains the save's current game rules.
provinces Contains province data, including buildings.
landed_titles Contains the following sub-blocks:
Sub-block Description
dynamic_templates
landed_titles
(repetition)
Contains an entry for each landed title in the game, in the format:
# Exact formatting in file is different in terms of spaces and lines
# It is usually more compact.
# It has been edited here for clarity and demonstration.


# Index for titles starts at 0
index={
	key="(title id)" # The one used in 00_landed_titles.txt, e.g. k_england

	de_facto_liege=(title index) # Optional
	de_jure_liege=(title index) # Optional. The number at the start of a similar block, NOT the title id
	de_jure_vassals={ (title index...) } # Optional, list of title indices.
	holder="(character id)" # Optional

	name="..."
	adj="..." # Optional
	pre="..." # Optional
	article="..." # Optional

	date=2020.10.27 # yyyy.mm.dd
	heir={ (character id...) } # Optional. List of character ids.
	claim={ (character id...) } # Optional
	history = { (...) } # Optional 
	capital=(province id)
	capital_barony=yes # Optional
	theocratic_lease=yes # Optional
	history_government="(government id)" # Optional
	laws={ "(law id)"... } # Optional. List of law ids.

	# Optional (succession_election).
	succession_election={
		electors = {  (character id...) }
		candidates={ (character id...) }
		nominations={
			{
				elector=(character id)
				candidate=(character id)
				strength=(value)
			}
		
		}
	} # end of succession_election block

	coat_of_arms_id=(coat of arms id)
	localization_key="(localization key)" # Optional

	# All below is used for mercenary bands
	special={
		type=mc
		identity=(id)
	}
	color=rgb { (r) (g) (b) }
	landless=yes
	destroy_if_invalid_heir=yes
	no_automatic_claims=yes
	definite_form=yes
}

In vanilla CK3, this block ends at entry ~12369.

index=(value)
(variable)
dynasties Contains the following sub-blocks:
  • dynasty_house (ends at entry ~6401)
  • dynasties (ends at entry ~6239)
  • static_dynasties (list of numbers)
  • static_dynasty_houses (list of numbers)
deleted_characters
living Contains entries of living characters. The following format is used for each character:
index={
	first_name="..."
	birth=(date) # Format: yyy.m.d
	female=yes # Optional
	was_playable=yes # Optional
	nickname="nick_..." # Optional
	culture=(culture index) # Optional if dynasty_house is specified, defaults to dynasty_house culture. Required if no dynasty_house, or culture different from that of dynasty_house.
	faith=(faith index) # Optional if dynasty_house is specified, defaults to dynasty_house faith.  Required if no dynasty_house or faith different from that of dynasty_house.
	dynasty_house=(dynasty house index) # Optional, must specify culture and faith if omitted
	skill={ (diplomacy) (stewardship) (martial) (intrigue) (learning) (prowess) } # One value for each skill
	prowess_age=(value) # Optional. Negative value.
	dna="(dna string)" # Optional
	mass=(value) # Optional, exclusive with weight
	weight={ # Optional, exclusive with mass
		base=(value)
		current=(value) # Optional
		target=(value) # Optional
	}

	sexuality=(value) # Optional. Defaults to heterosexual. Valid values: ho, bi, as, none. None is for children under 10.
	traits={ (trait index...) } # Optional. List of trait indices. Typically omitted for young children.
	recessive_traits = { (trait index...) } # Optional. List of trait indices
	inactive_traits = { (trait index...) } # Optional. List of trait indices
	
	# Optional (family_data)
	family_data={
		real_father=(character id) # Optional
		betrothed=(character id) # Optional
		primary_spouse=(character id) # Optional. Equal to one of the spouse ids.
		spouse=(character id) # Optional. First spouse
		spouse=(character id) # Optional. Second spouse
		spouse=(character id) # Optional. Third spouse
		spouse=(character id) # Optional. Fourth spouse
		concubine=(character id) # Optional. First concubine
		concubine=(character id) # Optional. Second concubine
		concubine=(character id) # Optional. Third concubine
		former_spouses={ (character id...) } # Optional. List of character ids
		former_concubines={ (character id...) } # Optional. List of character ids
		former_concubinists={ (character id...) } # Optional. List of character ids
		child = { (character id...) } # Optional. List of character ids
	}

	alive_data={

		# Optional (variables), contains flags
		variables={
			data={
				# (...)
			}
		}

		# Optional (modifiers), various locations in alive_data
		modifier={
			modifier="(modifier)"
			expiration_date=(date)
		}

		gold=(value) # Optional
		income=(value) # Optional
		location=(landed title index) # Optional
		stress=(value) # Optional
		fertility=(value)
		health=(value)
		piety={
			currency=(value)
			accumulated=(value) # Optional. Devotion
		}
		prestige={
			currency=(value) # Optional
			accumulated=(value) # Optional. Fame
		}
		focus={ # Optional
			type="(value)" # Education or lifestyle
			date=(date)
			changes=(value)
			progress=(value)
		}
		secrets= { (id...) } # Optional. List of ids
		targeting_secrets={ (id...) } # Optional. List of ids
		schemes={ (id...) } # Optional. List of ids
		targeting_schemes={ (id...) } # Optional. List of ids
		heir={ (ids...) } # Optional. List of ids
		pretender={ (ids...) } # Optional. List of ids
		claim={ { # Optional. List of claims
			title=(title id)
			pressed=yes # Optional
			}
		}
		used_punishments={ # Optional. List of reasons
			(value)={
				imprisonment_reason=yes # Optional
				revoke_title_reason=yes # Optional
			}
		}
		lifestyle_xp={ # Optional
			diplomacy_lifestyle=(value) # Optional
			martial_lifestyle=(value) # Optional
			stewardship_lifestyle=(value) # Optional
			intrigue_lifestyle=(value) # Optional
			learning_lifestyle=(value) # Optional
		}
		perk={ ... } # Optional. List of perks
		prison_data={ # Optional
			imprisoner=(character id)
			date=(date)
			imprison_type_date=(date)
			type="(value)" # house_arrest or dungeon
		}
		weight_update=(value) # Optional
		kills={ (character ids... } # Optional. List of character ids
		pool_history=(date) # Optional
		wars={ (value) (value) (value) (value) } # Optional
	} # End of alive_data block

	court_data={
		# All keys within this block are optional
		host=(value)
		employer=(character id)
		council_task=(council task index)
		special_council_tasks={ (value...) }
		army=(value)
		regiment=(regiment index)
		knight=yes
		wants_to_leave_court=yes
		leave_court_date=(date)
	}

	# Optional (landed_data)
	landed_data={
		domain={ (landed title index...) } # List of landed title indices
		vassal_contracts={ (values) } # List of values
		units= { (values...) } # Optional
		last_war_finish_date=(date) # Optional
		last_raid=(date) # Optional
		became_ruler_date=(date)
		laws={ "(law id)"... } # List of law ids
		strength=(value)
		strength_for_liege=(value) # Optional
		liege_tax=(value) # Optional
		balance=(value)
		dread=(value) # Optional
		known_schemes={ (ids...) } # Optional. List of ids
		succession={ (character id...) } # List of character ids
		is_powerful_vassal=yes # Optional
		vassal_power_value=(value) # Optional
		domain_limit=(value)
		vassal_limit=(value) # Optional
		vassals_towards_limit=(value) # Optional
		government="(government id)"
		realm_capital=(value)
		ai_allowed_to_marry=yes
		council={ (value...) } # List of values
		at_peace_penalty=(value)
		diplo_centers={ (value...) } # List of values
		election_titles={ (landed title index...) } # List of landed title indices
		absolute_control=yes # Optional
		interaction_cooldowns={ # Optional
			(interaction)=(date)
		}
	} # End of landed_data block

	# Optional (playable_data)
	playable_data={
		knights={ (character id...) } # List of character ids
		was_player=yes
	}

}

dead_unprunable Contains character entries.
characters Contains the following sub-blocks:
  • dead_prunable (contains character entries)
  • prune_queue
  • dummy_female (contains a character entry)
  • dummy_male (contains a character entry)
  • unborn (contains unborn data entries)
  • natural_deaths
  • current_natural_death
  • sexuality_chances
character_lookup
units
activities
opinions Contains the following sub-blocks:
  • active_opinions (contains opinion entries)
relations Encompasses hooks, alliances, Contains the following sub-blocks:
  • active_relations
schemes Contains the following sub-blocks:
  • active (contains scheme entries)
stories Contains the following sub-blocks:
  • active (contains story entries)
  • next=(date) (variable)
pending_character_interactions Contains the following sub-blocks:
  • data
  • player
secrets Contains the following sub-blocks:
  • secrets (contains entries of secrets) (repetition)
    • indices
      • type
      • target
        • type
        • identity=(id)
      • owner=(id)
      • relation_type
      • participants = { (ids)}
  • known_secrets = {
    • secret=(id)
    • owner=(id)
armies Contains the following sub-blocks:
  • regiments
  • army_regiments
  • armies
religion Contains the following sub-blocks:
  • religions
  • faiths
  • great_holy_wars
  • holy_sites
wars Contains the following sub-blocks:
  • active_wars
  • names
sieges Contains the following sub-blocks:
  • sieges (repetition)
raid Contains the following sub-blocks:
  • raid (repetition)
succession
holdings
ai Contains the following sub-blocks:
  • war_coordinator_db
  • war_plan_db
  • ai_stategies
county_manager Contains the following sub-blocks:
  • counties
  • monthly_increase (list of values)
fleet_manager Contains the following sub-blocks:
  • fleets
council_task_manager Contains the following sub-blocks:
  • active
important_action_manager Contains the following sub-blocks:
  • active
faction_manager Contains the following sub-blocks:
  • factions
culture_manager Contains the following sub-blocks:
  • cultures
  • template_cultures (list of numbers)
  • era_discovery
mercenary_company_manager Contains the following sub-blocks:
  • mercenary_companies
holy_orders Contains the following sub-blocks:
  • holy_orders
  • religion_name
  • faith_name
coat_of_arms Contains the following sub-blocks:
  • coat_of_arms_manager_name_map
  • coat_of_arms_manager_database (ends at entry ~17278)
  • next_id=(id) (variable)
(triggered events) Each triggered event has its own block, started using triggered_event={
next_player_event_id=(value) (variable)
played_character Contains the following sub-blocks:
  • name="..." (variable)
  • character=(character id) (variable)
  • player=(value) (variable)
  • important_decisions
  • legacy
  • rally_points
currently_played_characters={ (character id...) } List of character ids.

从Microsoft Store版本中提取文件[编辑 | 编辑源代码]

你可以用UWPDumper来提取文件。

  1. 下载最新的x64版本的UWPDumper
  2. 打开开发者模式 (Windows设置 ->更新和安全> 开发者选项-> 开发人员模式)。
  3. 运行ck3.
  4. 运行你刚刚下载的UWPInjector.exe.
  5. 输入ck3.exe旁边的数字作为processID: ParadoxInteractive.ProjectTitus_zfnrdv2de78ny.
  6. 查看他储存文件的地址 (可能类似于 C:\Users\%USERPROFILE%\AppData\Local\Packages\ParadoxInteractive.ProjectTitus_zfnrdv2de78ny\TempState\DUMP
  7. 等待程序运行完毕。

之后这些文件就会被放到上面提到的地址处。如果你想修改这些文件,创建一个mod并且把你想改的文件复制进去。

工具与实用程序[编辑 | 编辑源代码]

  • Paradox Highlight: 一个为CK3和其它Paradox游戏代码文件提供语法高亮的VSCode插件。
  • Exporters (Maya and Photoshop)
  • Clausewitz Maya Exporter: 一个可以创建和导出3D模型并且在CK3和其他Clausewitz游戏中使用的工具。
  • UWPDumper:一个从微软商店游戏中提取文件的工具。

外部链接[编辑 | 编辑源代码]


机制 
角色 角色属性特质资源生活方式宗族亲族文化革新传统修正宝物
领地与管理 领地封臣内阁宫廷谋略政体法律决议头衔男爵领伯爵领朝廷建筑
战争 战争宣战理由同盟军队受雇军队
信仰 宗教信仰教义核心教义圣地
模组制作补丁可下载内容开发者日志成就术语