模组制作:修订间差异

本页面讲述的内容长期有效
第38行: 第38行:
It is recommended to use the game launcher to create the mod's initial files.
It is recommended to use the game launcher to create the mod's initial files.


==上传/更新mod==
==上传/更新mod==
 再次上传您的MOD更新,
 再次上传您的MOD更新,



2020年11月20日 (五) 21:39的版本

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

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

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

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

提示 & 指引

  • 创建一个mod对游戏进行修改: 即使是很小的改动,也不要直接修改CK3游戏本体的游戏文件,而是要单独创建一个mod。因为本体更新时会直接覆盖这些修改,并且没有任何提示。
  • 使用好的文本编辑器 用来编辑和搜索文件。以下软件均免费:
    • Visual Studio Code. 有一个粉丝自制的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. There is an extension for it released by the developers of Imperator which could be used with CK3: Sublime Tools. It adds colored highlighting for effects and triggers. If you want to toggle comments in Sublime, you also need to add this file to the same "User" folder.
  • 总是通过 error.log 文件检查mod运行中出现的bug。...\Documents\Paradox Interactive\Crusader Kings III\logs
  • The log folder also contains lists of effects, triggers and scopes. Use "script_docs" and "DumpDataTypes" console commands in the game to generate them.
  • Start the game with -debug_mode -develop launch options to use the console and "reload gui", "reload gfx" commands.
    • On Steam: right-click the game on Steam -> Properties -> Set Launch Options -> add -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
  • Clearly communicate whether your mod is ironman-friendly to players.
  • Remove your local mod when you subscribe to the Steam version, otherwise it may not work in the game.
  • Backup your work. Either manually or with a source control system like Git. Also consider using GitHub for team collaboration.
  • Use a proper merge tool (like WinMerge) to merge between folders and update modified files for a new patch.
  • 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: RegexOne, RegExr.

本地化文件

  • 本地化文件夹中的yml后缀结尾的文件必须以UTF-8 + BOM编码保存,以便游戏正确读取。
  • 为了保证游戏正确读取文件,文件名需要以*l_<language>.yml形式保存。例如council_l_english.yml

Creating a mod

主条目:Mod structure#Creating initial files

It is recommended to use the game launcher to create the mod's initial files.

上传/更新mod

再次上传您的MOD更新,

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

保存修改的内容

Save files are located in:

  • Windows: Documents\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.

  • On Steam: right-click the game on Steam -> Properties -> Set Launch Options -> add -debug_mode
  • Windows: Create a shortcut for the .exe file -> right-click it -> Properties -> add -debug_mode at the end of the Target field

PC(Windows):

  1. Find the save file in the save games folder.
  2. Right-click the save file and extract it like an archive with 7-Zip or WinRar.
  3. 将提取出的'gamestate'文件的扩展名重名为.ck3
  4. Right-click it and open with your text editor (Windows Notepad is not recommended as the save files are very big).
  5. Edit the file and save it.
  6. 游戏中会直接加载mod(不需要重复压缩)。

Autosaves can be edited directly 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

Contents of the gamestate file

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)
	female=yes # Optional
	culture=(culture index)
	faith=(faith index)
	dynasty_house=(dynasty house index) # Optional
	skill={ (diplomacy) (stewardship) (martial) (intrigue) (learning) (prowess) } # One value for each skill
	sexuality=(sexuality id) # Optional
	dna="(dna string)" # Optional
	mass=(value) # Optional
	traits={ (trait index...) } # List of trait indices
	inactive_traits = { (trait index...) } # Optional. List of trait indices
	
	# Optional (family_data)
	family_data={
		primary_spouse=(character id)
		spouse=(character id)
		child = { (character id...) } # List of character ids
	}

	alive_data={

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

		gold=(value) # Optional
		income=(value) # Optional
		location=(landed title index) # Optional
		fertility=(value)
		health=(value)
		piety={
			currency=(value)
			accumulated=(value) # Optional
		}
		prestige={
			currency=(value)
			accumulated=(value) # Optional
		}
		weight_update=(value)
	} # End of alive_data block

	court_data={
		# All keys within this block are optional
		employer=(character id)
		council_task=(council task index)
		regiment=(regiment index)
		knight=yes
	}

	# Optional (landed_data)
	landed_data={
		domain={ (landed title index...) } # List of landed title indices
		vassal_contracts={ (values) } # List of values
		became_ruler_date=(date)
		laws={ "(law id)"... } # List of law ids
		strength=(value)
		balance=(value)
		succession={ (character id...) } # List of character ids
		domain_limit=(value)
		vassal_limit=(value)
		vassals_towards_limit=(value)
		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
	} # 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)
  • known_secrets
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.

Extracting files From Microsoft Store version

If you want to read the files using the Microsoft Store version, you can use a program called UWPDumper to extract the files.

  1. Download the latest x64 binary of UWPDumper
  2. Enable Developer Mode (Windows Settings -> Update and Security -> For Developers -> Developer Mode).
  3. Run CK3.
  4. Run UWPInjector.exe from the program you just downloaded.
  5. Enter the number next to ck3.exe : ParadoxInteractive.ProjectTitus_zfnrdv2de78ny as the processID.
  6. Check where it is going to store the files (probably somewhere like C:\Users\%USERPROFILE%\AppData\Local\Packages\ParadoxInteractive.ProjectTitus_zfnrdv2de78ny\TempState\DUMP
  7. 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.

工具与实用程序

  • Exporters (Maya and Photoshop)
  • Clausewitz Maya Exporter: 一个可以创建和导出3D模型并且在CK3和其他Clausewitz游戏中使用的工具。
  • UWPDumper: 一个从微软商店游戏中提取文件的工具

外部链接


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