模组制作:修订间差异

本页面讲述的内容长期有效
(en)
无编辑摘要
 
(未显示11个用户的29个中间版本)
第1行: 第1行:
{{Version|timeless}}
{{Version|timeless}}{{ 需要翻译}}
{{evt
'''模组制作''' ('''Modding''' 或者 建[[ 模组]] ,是 一种 修改游戏 资源或 行为的 方式 有时候仅仅是为了 个人使用, 有时候制作者也会 发布 出来供 玩家 一起使用。可以 通过 以下途径了解mod制作[https://mods.paradoxplaza.com/games/ck3 Paradox Mods] [https://steamcommunity.com/app/1158310/workshop/ Steam Workshop]。
| service= youtube
| id= uu_Zxf4ul2g
| description= CK3 Modding #1 -Brief introduction to modding. ''Roll1D2 Games'' guide on useful tools and how-to mod beginner's guide.
| alignment= right
| container=frame
| dimensions=320
}}
'''模组制作''' (Modding )或者 模组,是修改游戏行为的 活动 无论 个人使用, 还是公开 发布 玩家 ,譬如 通过 [https://mods.paradoxplaza.com/games/ck3 Paradox Mods] 或者 [https://steamcommunity.com/app/1158310/workshop/ Steam 创意工坊]。


As with all Paradox games, Crusader Kings III is moddable to a great extent. Motivations of modders may vary widely; better translation to native language, more events or decisions, better map, major overhaul, cheating, etc.
在所有的P社游戏中,十字军之王3的可修改程度都是相当高的。mod制作者可以修改的内容也相当宽泛,比如语言翻译,更多的事件和决议,更优秀的地图,更大程度上的内容修改和作弊。


This guide is intended to lower the entry barriers to the world of Crusader Kings III modding. However, there is still a learning curve to it, and it cannot replace the need to read some working vanilla code and do lots of trial and error experimentation.
这篇引导的目的在于降低制作mod的门槛。但是学习的曲线总是曲折的,这需要你通过不断的练习和阅读他人优秀mod代码来提升自己制作mod的水平。


== Tips & guidelines==
大多数模组会改变校验码,这在1.9版本之前的游戏中将禁用成就。在{{Cite file|Crusader Kings III\game}}中的{{Cite file|checksum_manifest.txt}}查看校验文件夹和文件。不会改变校验码的是替换纹理、字体、着色器或音乐的模组。
* '''Create a mod for your modifications''': use a personal mod even for minor changes, and never directly modify the game files in the CK3 game folder as they may be overwritten without warning.
* '''Use a good text editor''' to edit files and search into multiple files.
* '''Use the error.log file to get execution errors'''. <nowiki>...\Documents\Paradox Interactive\Crusader Kings III\logs</nowiki>
* '''The directory for the CK3 folder on Linux is''' <nowiki>/.local/share/Paradox Interactive/Crusader Kings III</nowiki>


=== Localization Files ===
== 提示 & 指引==
* *.yml files in the localization folder must be saved with '''UTF-8 + BOM''' encoding to be read properly by the game.


== Tags for Mods ==
*'''创建一个mod对游戏进行修改''': 即使是很小的改动,也不要直接修改CK3游戏本体的游戏文件,而是要单独创建一个mod。因为本体更新时会直接覆盖这些修改,并且没有任何提示。
*'''使用好的文本编辑器''' 用来编辑和搜索文件。以下软件均免费:
**[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://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://www.sublimetext.com/ Sublime Text]. 这个链接本身是《大将军:罗马》的扩展,但是也可以用在ck3上: [https://forum.paradoxplaza.com/forum/index.php?threads/sublime-tools-for-imperator.1274246/ Sublime Tools]. 这个扩展为效果和触发器添加了不同的颜色高亮。如果你想要在sublime里切换注释就还需要在同一个User文件夹里添加[https://cdn.discordapp.com/attachments/563655919892692996/649656191173263370/PDXComments.tmPreference this file] 。
*'''总是通过 error.log 文件检查mod运行中出现的bug'''。<nowiki>...\Documents\Paradox Interactive\Crusader Kings III\logs</nowiki>
*'''日志文件夹还包含效果、触发器和作用域列表。'''在游戏中使用控制台命令"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系统的路径 ''' <nowiki>~/.local/share/Paradox Interactive/Crusader Kings III</nowiki>
* '''清晰明了的传达你的MOD的关键内容'''
**你的MOD说明应当以简短并清晰的描述开始,说明你的MOD为游戏增添或更改的内容。切忌以长篇大论、长长的告示列表、前提条件以及安装介绍等等开头。
**不要假设用户已经了解过这个mod了。(如果他们已经了解了这个mod就不会再读你的描述了)
**标明这个mod支不支持成就和铁人模式。 (即使你觉得这已经很明显了也要标出来)
*当你订阅这个mod的steam版本时,记得移除你放在本地的mod,否则这个mod可能会出现问题或者无法运行。
*记得保存和备份。要么手动保存要么存在github一类的地方。Github同时也是合作制作mod的好工具。
*用[https://winmerge.org/?lang=en WinMerge]一类的工具来合并文件夹,更新、修改文件以及打补丁。
*当你想要换掉大量的文字时,最好使用正则表达式。 所有上面提到的编辑器都可以用. 资源: [https://regexone.com/ RegexOne], [https://regexr.com/ RegExr].


Overhaul
===本地化文件===


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


[[Exporters]] (Maya and Photoshop)
==创建一个模组==
{{main|Mod structure#Creating initial files}}


== Creating immortal traits ==
推荐使用游戏官方登陆器来创建初始文件。
As with the previous game, traits that grant immortality are not present in the game at launch but are already programmed and can be easily created. It only requires adding the following parameter to a trait: <code>immortal = yes</code>


For your immortals to look forever young, you can use the effect immortal age. Such as, <code>set_immortal_age = 30</code>
==上传/ 更新模组==
再次上传您的模组更新,


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


PC:
==保存修改的内容==
# Right-click, select "7-Zip: extract here"
 
# Rename the extracted 'gamestate' file to something with a .ck3 extension
保存的文件被放在:
# Edit this plain-text save
 
# Load it directly in the game (no need to re-compress)
*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):
 
#在保存游戏的文件夹内找到你保存的游戏
# 右键单击此文件用7-Zip 或者 WinRar提取出压缩文件.
# 将提取出的'gamestate' 文件的扩展名重名为.ck3
# 右键单击并且用编辑器打开 (不推荐使用windows notepad,因为这些文件很大).
#编辑并保存文件。
# 游戏中会直接加载mod(不需要重复压缩)。
 
你可以直接编辑自动保存的游戏without extracting the gamestate.


Mac:
Mac:
# Open Terminal
# Ensure that the directory is set to the correct folder
# Type in "unzip FileName.ck3"
# Rename the extracted 'gamestate' file to something with a .ck3 extension
# Edit this plain-text save
# Load it directly in the game (no need to re-compress)


'''Autosaves''' use a different format and '''cannot''' be edited the same way.
#打开终端
#确认当前路径是正确的
#输入命令 "unzip FileName.ck3"
#将提取出的'gamestate' 文件的扩展名重名为.ck3
#保存此纯文本
#游戏中会直接加载mod(不需要重复压缩)


{| class="wikitable"
{| class="wikitable"
! OS !! Save type !! Location           
! 平台!! 保存方式!!路径
|-
|Windows||本地||<code>C:\Users\%USERPROFILE%\Documents\Paradox Interactive\Crusader Kings III\save games</code>
|-
|Windows||Steam 云端||<code>C:\Program Files (x86)\Steam\userdata\####\1158310\remote\save games</code>
|-
|Mac||本地||<code>$HOME/Documents/Paradox Interactive/Crusader Kings III/save games</code>
|-
|Linux||本地||<code>$HOME/.local/share/Paradox Interactive/Crusader Kings III/save games</code>
|}
 
=== gamestate文件中的内容 ===
The table below contains the possible first-level blocks in the gamestate file. Entries are provided in order of appearance.
{| class="wikitable mw-collapsible mw-collapsed"
! 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.
{| class="wikitable"
! 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:
{| class="wikitable"
! Sub-block
! Description
|-
| dynamic_templates
|
|-
| landed_titles<br>''(repetition)''
| Contains an entry for each landed title in the game, in the format:
<pre>
# 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
}
</pre>
In vanilla CK3, this block ends at entry ~12369.
|-
| index=(value)<br>''(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:
<pre>
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
}
 
}
 
</pre>
|-
|-
| Windows || Local || <code>C:\Users\%USERPROFILE%\Documents\Paradox Interactive\Crusader Kings III\save games</code>
| dead_unprunable
| Contains character entries.
|-
|-
| Windows || Steam Cloud || <code>C:\Program Files (x86)\Steam\userdata\####\1158310\remote\save games</code>
| 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
|-
|-
| Mac || Local || <code>$HOME/Documents/Paradox Interactive/Crusader Kings III/save games</code>
| character_lookup
|
|-
|-
| Linux || Local || <code>$HOME/.local/share/Paradox Interactive/Crusader Kings III/save games</code>
| 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.
 
|}
|}


== Tools & utilities ==
== 从Microsoft Store版本中提取文件==
* [https://forum.paradoxplaza.com/forum/threads/information-and-faq.924764/ Clausewitz Maya Exporter]: a tool to create and export 3D models to use in CK3 and other Clausewitz games.
你可以用UWPDumper来提取文件。
 
#下载最新的x64版本的[[Modding#Tools & utilities|UWPDumper]]。
#打开开发者模式 (Windows设置 ->更新和安全> 开发者选项-> 开发人员模式)。
#运行ck3.
#运行你刚刚下载的UWPInjector.exe.
#输入ck3.exe旁边的数字作为processID: ParadoxInteractive.ProjectTitus_zfnrdv2de78ny.
#查看他储存文件的地址 (可能类似于 C:\Users\%USERPROFILE%\AppData\Local\Packages\ParadoxInteractive.ProjectTitus_zfnrdv2de78ny\TempState\DUMP
#等待程序运行完毕。
 
之后这些文件就会被放到上面提到的地址处。如果你想修改这些文件,创建一个mod并且把你想改的文件复制进去。
 
== 工具与实用程序==
 
*[https://marketplace.visualstudio.com/items?itemName=dragon-archer.paradox-highlight Paradox Highlight]: 一个为CK3和其它Paradox游戏代码文件提供语法高亮的VSCode插件。
*[[Exporters]] (Maya and Photoshop)
*[https://forum.paradoxplaza.com/forum/threads/information-and-faq.924764/ Clausewitz Maya Exporter]: 一个可以创建和导出3D模型并且在CK3和其他Clausewitz游戏中使用的工具。
*[https://github.com/Wunkolo/UWPDumper UWPDumper]:一个从微软商店游戏中提取文件的工具。
 
==外部链接==


== External links ==
*[https://forum.paradoxplaza.com/forum/forums/crusader-kings-iii-user-mods.1080/ CK3 User Mods] P社论坛
* [https://forum.paradoxplaza.com/forum/forums/crusader-kings-iii-user-mods.1080/ CK3 User Mods] on the Paradox Forum.
*[https://discord.gg/ck3 Crusader Kings] 官方Discord模组频道。Go to the server-roles channel and choose CK3 Modding in the [https://discordapp.com/channels/616881873506795550/710484698924711976/710490306788982804 Channel Access post].
* [https://discord.gg/ck3 Crusader Kings] official Discord modding channel. Go to the server-roles channel and choose CK3 Modding in the [https://discordapp.com/channels/616881873506795550/710484698924711976/710490306788982804 Channel Access post].
*[https://discord.gg/apEvxDZ CK3 Mod Coop] A community Discord server dedicated to modding for CK3.
* [https://discord.gg/apEvxDZ CK3 Mod Coop] A community Discord server dedicated to modding for CK3.


<br>
<br>
第80行: 第596行:
[[Category:模组制作]]
[[Category:模组制作]]
[[en:Modding]]
[[en:Modding]]
{{Mechanics navbox}}

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:一个从微软商店游戏中提取文件的工具。

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


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