《维多利亚3》开发日志#164 - 精彩的模组星期一

0 点赞
维多利亚3号
转载

大家好,周一快乐!我是系统设计师图奈,这次我从“矿场”里出来,为大家带来本次更新中一些与模组相关的新亮点。我们有几个重要点需要说明,所以就不耽误时间了! 数据库条目模式 首先,本次更新**将会导致你的模组失效**,我想在此特别强调这一点,所以我要重复一遍:**本次更新将会导致你的模组失效**。 请先放下你们手中的“干草叉”,听我解释,这背后是有充分理由的。你们中有些人可能已经看过第85期《廷托访谈:模组制作》,或者在阅读本文时,已经亲自体验并为《欧陆风云5》制作过模组了!《维多利亚3》即将推出的更新中,也将引入这一功能。数据库条目模式是《欧陆风云5》中为脚本语言带来的一项重要改动,该功能允许你通过使用新的关键词,来控制模组中的某段脚本与主游戏或其他模组中已存在的脚本之间的交互方式。你需要根据我们现在强制推行的新语法,对模组进行相应调整!对于不了解的玩家,我将通过我的热门新模组【维多利亚微调模组2】中的几个例子来为大家介绍这个系统: 首先,我想重新设计并增强【农民征兵法】,以真正体现【乡村民众利益集团】的精神和力量。为此,我可以在法律本身的键名前使用【INJECT】关键字,将脚本插入到现有法律中。在这个案例中,我们希望通过略微提高平衡性来调整法律本身的修正模块。 在脚本中……

在游戏中

通过此次改动,【Doodlez的农民军】将成为乡村民众不可阻挡的武装力量! 正如部分玩家可能已经注意到的,向现有修正中注入新修正时采用叠加计算方式。例如,若在主游戏中已有一个使国家威望增加25%的修正,再次注入一个50%的相同修正后,总增加量将达到75%! 总共有六个关键词,为方便起见,在此全部列出: [c]INJECT:key - 此模式尝试将脚本注入现有条目。若相应条目不存在,则会报错。[/c] [c]REPLACE:key - 此模式用新条目替换现有条目。若相应条目不存在,则会报错。[/c] [c]TRY_INJECT:key - 与INJECT:相同,但当条目不存在时不会报错。[c]TRY_REPLACE:键与REPLACE:相同,但如果条目不存在也不会报错。[/c] [c]REPLACE_OR_CREATE:键 = { } #与REPLACE:相同,但如果条目不存在,将会创建它[/c] [c]INJECT_OR_CREATE:键 = { } #与INJECT:相同,但如果条目不存在,将会创建它[/c] 如果正确使用这些关键词,将帮助你完全避免许多兼容性问题,并且能让你更轻松地重新组织与多个现有模组的兼容性,当然前提是你要和其他模组制作者沟通! 请记住,你必须显式调用这些关键词,隐式替换将不再被允许,现在你有时间相应地更新你的模组![战争目标] = { 图标 = "gfx/interface/icons/war_goals/icon."### 类型列表 # 吞并国家 # 禁止奴隶制 # 将会转换为禁止奴隶制的法律承诺条约条款 # 殖民权 # 征服省份 # 遏制威胁 # 执行条约条款 # 强制国有化 # 外国投资权 # 将会转换为投资权条约条款 # 羞辱 # 增加自治度 # 独立 # 加入势力集团 # 离开势力集团 # 解放国家 # 解放附庸国 # 建立自治领 # 建立保护国 # 建立朝贡国 # 开放市场 # 降低自治度 # 政权更迭 # 归还省份 # 撤销所有宣称撤销宣称 分离 夺取条约港 将转换为条约港条约条款 移交附庸国 统一 统一领导权 自定义 无预定义效果。适用于仅需执行强制执行效果而无需其他操作的情况。 类型 = 战争目标类型 # 战争目标的类型定义了代码层面预定义的行为包,主要决定战争目标执行时产生的效果。### 设置列表 # require_target_be_part_of_war 目标国家必须处于战争状态,不能以中立国家为目标 # can_add_for_other_country 允许为其他参战国添加目标 # annexes_entire_state 用于标记该目标是否旨在吞并整个目标地区。此标记用于计算与其他目标的冲突 # annexes_entire_country 用于标记该目标是否旨在吞并整个目标国家此用于计算与其他目标的冲突[/c] [c] # country_creation[/c] [c] # 目标是否创建新国家的标志[/c] [c] # overlord_is_stakeholder[/c] [c] # 战争目标的利益相关者是否应为宗主国而非目标国家本身的标志[/c] [c] # can_target_decentralized[/c] [c] # 战争目标是否可针对非集权国家[/c] [c] # has_other_stakeholder[/c] [c] # 战争目标是否有与目标本身不同的利益相关者[/c] [c] # turns_into_subject[/c] [c] # 战争目标是否将目标国家转变为附庸国。【冲突解决用途】 # 跳过构建列表 # 战争目标是否可在外交博弈中选择 # 以敌方附庸为目标 # 战争目标是否专门针对敌方附庸,而非战争目标中的所有敌人 # 以敌方宣称地为目标 # 战争目标是否针对国家的宣称地,而非国家本身 # 需要利益 # 战争目标是否需要你在相关战略区域拥有利益 # 调试 # 无效果,用于代码调试目的# 验证主体关系 # 检查此战争目标产生的主体关系是否有效的验证行为 # 验证自身是否为编队候选者 # 确保目标持有者是编队候选者的验证检查 # 验证目标是否为编队候选者 # 确保目标对象是编队候选者的验证检查 # 验证唯一编队候选者 # 确保目标持有者是唯一编队候选者的验证检查 # 验证目标非条约港 # 确保目标地区不是条约港的验证检查 # 验证加入势力集团 # 针对加入势力集团战争目标类型的特殊验证 # 验证殖民权 # 特殊【殖民权战争目标类型验证】 【强制国有化验证】# 强制国有化战争目标类型的特殊验证 【外国投资权验证】# 投资权战争目标类型的特殊验证 【政权更迭验证】# 政权更迭战争目标类型的特殊验证 【遏制威胁验证】# 遏制威胁战争目标类型的特殊验证 【撤销宣称验证】# 撤销宣称战争目标类型的特殊验证 【增加自治度验证】# 增加自治度战争目标类型的特殊验证 【夺取条约港口验证】# 夺取条约港口战争目标类型的特殊验证 【独立验证】#独立战争目标类型的特殊验证 # 验证持有者的战争目标冲突 # 验证与持有者相同类型战争目标的冲突 # 验证所有战争目标冲突 # 验证与所有参战国相同类型战争目标的冲突 # 验证征服地区的冲突 # 验证与征服地区的战争目标冲突(即具有与吞并地区冲突的目标) # 验证吞并国家的冲突 # 验证与吞并国家的战争目标冲突(即具有与吞并国家冲突的目标) # 验证建立附庸国的冲突 # 验证与建立新附庸国的战争目标冲突(即存在与创建附庸国相关的冲突)[/c] [c] # 验证现有附庸国的冲突[/c] [c] # 验证与旨在创建新附庸国的战争目标之间的冲突(即最后,我在下方添加了此新系统适用的数据库列表:【acceptance_statuses】【ai_strategies】【amendments】【battle_conditions】【building_groups】【buildings】【buy_packages】【character_interactions】【character_templates】【character_traits】【cohesion_levels】【combat_unit_groups】【combat_unit_types】【combat_unit_experience_levels】【commander_orders】【company_charter_types】【company_types】【country_creation】【country_definitions】【country_formation】【country_ranks】【country_types】【culture_graphics】【cultures】【decisions】【decrees】【diplomatic_actions】【diplomatic_catalyst_categories】【diplomatic_catalysts】[与附庸化冲突] [/c] [c] # 与附庸化冲突[/c] [c] # 将战争目标标记为可能与附庸化战争目标冲突[/c] [c] # 与国家创建冲突[/c] [c] # 将战争目标标记为可能与国家创建战争目标冲突[/c] [c] # 与吞并国家冲突[/c] [c] # 将战争目标标记为可能与吞并国家战争目标冲突[/c] [c] # 与吞并地区冲突[/c] [c] # 将战争目标标记为可能与吞并地区战争目标冲突[/c] [c] # 与现有附庸冲突[/c] [c] # 将战争目标标记为可能与现有附庸战争目标冲突[/c] [c] 设置 = { # 设置进一步自定义战争目标在不同检查中的处理方式。一个战争目标只能有一种类型,但可以有多个设置。 设置_1 设置_2 } 执行优先级 = 80 ### 争夺类型列表 # 控制目标省份 # 控制目标国家首都 # 控制目标国家任意省份 # 控制目标国家任意已整合省份 # 控制己方省份 # 控制己方首都 # 控制所有己方省份 # 控制目标国家所有宣称省份 # 控制任意可释放省份 争夺类型 = 控制类型 ## 目标类型 #战争目标主要“针对”的实体类型。这主要定义了游戏在从外交博弈面板中选择战争目标类型时,如何为每种战争目标类型生成潜在的替代选项。大多数战争目标类型需要特定的目标类型才能正常生效,且无法更改(例如,【征服省份】不能有条约条款目标类型)。此字段主要允许你让自定义战争目标针对不同的实体。### 目标类型列表 # 国家 # 遍历敌方国家以生成战争目标选项 # 省份 # 遍历敌方国家所属的省份 # 条约条款 # 先遍历条款类型,再遍历敌方国家 target_type = target_type possible = { # 用于判断在外交博弈面板选择战争目标时,是否列出带有目标数据的目标的触发条件 # 作用域:root = 持有者、创建国、外交博弈、目标国、目标省份、利益相关方、目标地区、条款选项 } valid = { # 除了部分基础验证代码外的触发条件 # 作用域:root = 持有者、创建国、外交博弈无法识别内容,已删除。无上下文日志条目,或者我从现在开始将其称为“全局日志条目”,是一种新型的日志条目标记。在我们进入这个更新的精彩部分之前,我必须再次提醒你,此更新也会导致你的许多日志条目无法正常使用! 要解决此问题,你需要前往你的日志条目组(位于common/journal_entry_groups目录下),并确保你的自定义组已设置上下文。你只需为所有日志条目组添加以下两个上下文标记之一即可: “context = none/country” 其中,“country”是默认标记,你应将其附加到所有常规日志条目组,这些组通常会生成并附加到国家;而“None”是我们用于全局日志条目的新上下文。全局日志条目(Global JEs)的脚本编写方式与其他日志条目类似,但它们附带了一系列新的额外触发器和效果,以应对其可能作为多个国家共享对象的情况。总体而言,这应该相当易于理解,但它确实是一个非常酷且令人兴奋的功能,我们在未来会大量使用,也迫不及待地想看到大家亲自体验它! 秘鲁-玻利维亚邦联就是一个已有的内容示例,现已更新以使用这一新系统。外交博弈 歧视特质组 歧视特质 DNA数据 动态公司名称 动态国家名称 动态国家地图颜色 动态条约名称 科技 旗帜定义 游戏概念 地理区域 商品 政府类型 收获条件类型 意识形态 机构 利益集团特质 利益集团 日志条目组 日志条目 法律组 法律 正统性等级 独立倾向等级 军事编队旗帜 动员选项组 动员选项 目标子目标类别 目标子目标 目标 政党政治游说安抚(因素) 政治游说安抚(原因) 政治游说团体 政治运动类别 政治运动民众支持度 政治运动 人口需求 人口类型 势力集团联合政府要素 势力集团身份 势力集团地图纹理 势力集团名称 势力集团原则群体 势力集团原则 声望商品 生产方式组 生产方式 提案类型 宗教 社会阶层 社会等级 地图数据/州地区 州特性 战略区域 附庸类型 地形操纵器 地形 主题 教程课程 教程课程链[c]标签[/c] [c]战争目标类型[/c] [c]警报组[/c] [c]警报类型[/c] [c]指挥官等级[/c] [c]脚本按钮[/c] [c]脚本进度条[/c] [c]条约条款[/c] [c]图形/地图/城市数据/城市建筑特效[/c] [c]图形/地图/舰队模型[/c] [c]图形/地图/舰队实体[/c] [c]图形/地图/陆军模型[/c] [c]图形/地图/前线实体[/c] [c]州地区[/c] [c]声音/持续对象[/c] [c]音乐[/c] [c]通知[/c] [c]修正器类型定义[/c] [c]种族[/c] [c]脚本值[/c] [c]脚本界面[/c] [c]脚本列表[/c] [c]脚本修正器[/c] [c]界面动画[/c] [c]成就[/c] [c]修正器图标[/c] [c]图形/肖像/配饰[/c] [c]图形/肖像/肖像修正器[/c] 建筑组清理 说到那些会导致你的模组启动时崩溃的问题:首先,我们有重命名了一些建筑,当补丁发布后,你应该能很容易地识别出这些建筑,并且可以通过编辑器中的简单批量替换来处理它们。我们这样做是为了确保建筑键名具有更一致的命名规则。 第二个也是更重要的变化是,国家区域资源现在基于建筑类型而非建筑组进行运作。为了说明这一点,以下是map_data/state_regions中资源设置的新旧对比示例: 新: [c]可耕种资源 = { "building_wheat_farm" }[/c] [c] 有限资源 = {[/c] [c] building_fishing_wharf = 4[/c] [c] }[/c] [c] 资源 = {[/c] [c] 类型 = "building_oil_rig"[/c] [c] 未发现数量 = 40[/c] [c] }[/c] 旧: [c]可耕种资源 = { "bg_wheat_farms" }[/c] [c] 有限资源 = {[/c] [c] bg_fishing = 4[/c] [c] }[/c] [c] 资源 = {[/c] [c] 类型 = "bg_oil_extraction"[/c] [c] 未发现数量 = 40[/c] [c] }[/c] 做出此更改的原因是,我们之前有很多建筑组(例如bg_wheat_farms),它们的存在仅仅是为了能够在资源中定义它们,这使得整个建筑组系统变得非常之前的设计较为繁琐。现在,所有农场不再各自拥有独立的建筑组,而是统一归属于【bg_staple_crops】。出于遗留原因,已移除的建筑组目前仍存在于数据库中,但不再被使用,并将在1.13版本中彻底删除。 为了让过渡过程相对轻松一些,我们添加了反向读取支持。如果你在资源中输入建筑组,系统会尝试读取该建筑组的默认建筑类型。不过,此支持将在1.13版本中取消,因此建议你仍将模组更新为新格式! 可模组化战争目标 好了,解决完这个问题,让我们进入下一个主题:脚本化战争目标类型!我们知道这是很多人长期以来一直要求的功能,所以我很高兴终于可以宣布我们做到了。为此,我们最终添加了一个新的数据库,形式为common/war_goal_types文件夹。(感谢Alex!) 当更新到来时,这个文件夹将包含我们常规的战争目标,这些目标也已转移到这个系统中,但需要注意的是,许多原版目标的行为是由代码控制的,因此在修改它们时一定要小心,而不仅仅是添加新的目标。 我没有时间为VTM2添加一个很酷的新战争目标,所以我就做个顺水人情,在这里附上示例文档,希望大家喜欢!

以下是我们内部测试中名为“利珀危机”的全球日志示例。 # 全球日志条目示例 je_global_test = { icon = "gfx/interface/icons/event_icons/event_map."dds"[/c] [c] [/c] [c] group = je_group_global_test[/c] [c] [/c] [c] is_shown_when_inactive = {[/c] [c] always = no[/c] [c] #always = yes[/c] [c] }[/c] [c] [/c] [c] modifiers_while_active = {[/c] [c] lippe_crisis_ongoing[/c] [c] }[/c] [c] [/c] [c] scripted_button = je_global_test_button[/c] [c] scripted_button = je_global_test_button_2[/c] [c] [/c] [c] should_be_involved = {[/c] [c] OR = {[/c] [c] country_rank >= rank_value:great_power[/c] [c] country_definition = cd:LIP[/c] [c] country_definition = cd:SCM[/c] [c] } [/c] [c] }[/c] [c] [/c] [c] should_show_when_not_involved = {[/c] [c] OR = {[/c] [c] country_rank >= rank_value:major_power[/c] [c] country_definition = cd:LIP[/c] [c] country_definition = cd:SCM[/c] [c] } [/c] [c] } [/c] [c] [/c] [c] possible = {[/c] [c] always =complete = { any_country = { count < 1 OR = { country_definition = cd:LIP country_definition = cd:SCM } } } fail = { any_country = { count > 2 OR = { country_definition = cd:LIP country_definition = cd:SCM } } } immediate_all_involved = { if = { limit = { exists = c:LIP } change_relations = { country = c:LIP value = -10 } } if = { limit = { exists = c:SCM } change_relations = { country = c:SCM value = -10 } } } on_become_involved_after_activation = { if = { limit = { exists = c:LIP }修改关系 = { 国家 = c:LIP 数值 = -10 } 如果 = { 条件 = { 存在 = c:SCM } 修改关系 = { 国家 = c:SCM 数值 = -10 } } } 不再参与时 = { 如果 = { 条件 = { 存在 = c:LIP } 修改关系 = { 国家 = c:LIP 数值 = 10 } } 如果 = { 条件 = { 存在 = c:SCM } 修改关系 = { 国家 = c:SCM 数值 = 10 } } } 所有参与方完成时 = { 添加修正 = { 名称 = lippe_crisis_averted 持续时间 = 10年 } } 所有参与方失败时 = { 添加修正 = { 名称 = lippe_crisis 持续时间 = 10年 } } 所有参与方超时未完成时 = { 添加修正 = { 名称 =地理区域 我们新增的另一项功能是地理区域,这些它们是可任意定义的静态脚本列表,可用于各种触发器和检查。地理区域还附带地图高亮功能!

添加这些地理区域非常简单,你只需先在common/geographic_regions文件夹中创建一个新文件,然后将列表写入其中:中亚的一些新地理区域

我也会附上相关文档: [代码]geographic_region_key = {[/代码] [代码] # 所有州/战略区域组合在一起形成一个地理区域[/代码] [代码] [/代码] [代码] # 在脚本列表中访问此项的键,例如<any/..区域生产方式 与地理区域紧密相关的一项新功能是能够定义特定于世界某一地区的生产方式,这使我们能够为现有的建筑增加更多的多样性,通过例如在【湿润咖啡带】地理区域解锁特殊的咖啡生产方法。 请注意,您在下方看到的所有数字和名称都还处于开发阶段! 虽然部分地理区域的范围较为有限,但湿润咖啡带横跨了世界上较大的一部分区域:

文化定义的姓名顺序 现在,你可以通过文化数据库中的新标志来定义姓名的显示顺序。默认设置为“名在前姓在后”,但你现在也可以选择“姓在前名在后”,即姓氏或家族名称在前,个人名或名字在后。 朝鲜文化就是采用这种新命名方式的文化之一。这里我们有明敬王后,等等,她一直都在这里吗?

我们已将此系统应用于全球范围内我们认为适用的文化中。说实话,你们当中有多少人知道,传统上匈牙利语也是将姓氏放在前面的? 控制台 控制台按钮也进行了一些外观改进,新增了许多用于常用命令和作弊码的按钮。 眼尖的玩家可能已经注意到新增的【查看国家】按钮,点击该按钮将为你当前选中或观察的国家打开脚本运行窗口。你也可以通过控制台命令打开查看器。例如,输入“inspect_country GBR”将打开英国的窗口。 看看我的按钮吧,你们这些强者!

受《十字军之王3》启发,我们在其他地方也添加了一些更多的情境调试按钮,例如右键菜单中用于杀死选中角色的按钮。当然,这纯粹是出于测试目的! 我们计划在未来添加更多此类功能。 请欢迎我们的新员工!

仅脚本修正项 我们终于添加了正确定义仅脚本修正项的功能,我个人喜欢称其为“伪修正项”。只需在common/modifier_type_definitions中的修正项添加“script_only = yes”标记,这样就能抑制原本会出现的错误,也不会再让错误日志变得混乱。 法律修正案 正如维多利亚在上篇开发日志中介绍的那样,法律修正案当然也是完全可模组化的!你可以在新创建的common/amendments数据库中定义修正案,然后通过新效果将其添加到法律中。我将再次在下方添加一个示例:[c]amendment_test = {[/c] [c] parent = law_peasant_levies # 可选的法律引用,用于规定利益集团和运动对此修正案的立场[/c] [c] [/c] [c] allowed_laws = { # 可添加此修正案的法律列表[/c] [c] law_professional_army[/c] [c] law_national_militia[/c] [c] law_mass_conscription[/c] [c] law_census_voting[/c] [c] }[/c] [c] [/c] [c] modifier = {}[/c] [c] [/c] [c] tax_modifier_very_low = {}[/c] [c] tax_modifier_low = {}[/c] [c] tax_modifier_medium = {}[/c] [c] tax_modifier_high = {}[/c] [c] tax_modifier_very_high = {}[/c] [c] [/c] [c] possible = {[/c] [c] always = yes[/c] [c] }[/c] [c] [/c] [c] can_repeal = { always = yes }[/c] [c] [/c] [c] ai_will_revoke = {[/c] [c] always = yes[/c] [c] }# 效果: ## add_amendment 为范围内的法律添加修正案。 add_amendment = { type = amendment_example sponsor = interest_group cooldown = 120 # 月 timeout = 240 # 月(可选,0 = 无) } 支持的范围:law 回顾过去,内容确实不少,但并非全部!和往常一样,我们为游戏的模组制作添加了一系列新的触发器、修正器类型、效果以及小改进。不过,由于我们已经列出了相当长的清单,且开发日志也逐渐变长,剩下的内容我会在几周后的更新日志中呈现。再次感谢大家一直以来的支持,以及你们创作的那些精彩模组! 下一次我们将在本周四的开发日志中与大家见面,届时我们将详细介绍西班牙在1.12版本更新和【伊比利亚黄昏】中的相关内容。

说点好听的...

收藏

0

0

发送
取消