建筑修改

建筑是维多利亚3中提供生产、行政、军事单位等的主体,不同的建筑有着不同的产出与消耗,本页面旨在为各模组制作者提供指引。

结构组成

首先,我们要了解一个建筑由哪些部分组成,不同的建筑其实内部的结构都是一样,只是相关的代码不同其消耗与产出也不同。Documents/Paradox Interactive/Victoria 3/mods/mod名称/common/

  1. 建筑组(building groups),这是一个建筑的基础,建筑没有对应的建筑组便不会在游戏中正确的出现。建筑组的文件路径为common/building_groups,此为建筑组文件所在的文件夹,不同类型的建筑有其所属的建筑组,不同的建筑组对应着制造业、农业、基础设施等,而不同的建筑组其所拥有的效果也不同,在官方的建筑组文件里也有相关代码的说明。
  2. 建筑(buildings),这是建筑的本体,文件路径为common/buildings,根据建筑所属的建筑组的不同,可分为制造业、农业、种植园、政府建筑、军事建筑等。
  3. 生产方式组(production method groups),每一个建筑均包含若干生产方式组,文件路径为common/production_method_groups,生产方式组是单或多种生产方式的集合。
  4. 生产方式(production methods),建筑的消耗与产出由生产方式而决定,文件路径为common/production_methods,同时建筑的相关修正也由生产方式所提供。
  5. 图标(icons),建筑与生产方式都有对应的图标来显示在界面上。
  6. 模型,该建筑显示在地图上的模型,如工厂、兵营等,可为空。

建筑组

简易示例

我们以一个简单的建筑组来示例,首先,我们要在common/building_groups里创建一个带BOM的UTF-8格式的txt文件,名称为new_building_groups(new_bg等也可以)

bg_new = {   #这是建筑组的名称,格式必须为bg_xxxxxx
	category = urban    #这是建筑组所属的类别,urban(城市)、rural(乡村)、development(开发)
	always_possible = yes    #这是建筑组所属建筑是否能无限制修建,no即为有限制的修建(资源、等级限制等)
	economy_of_scale = yes    #这是建筑每级是否能获得吞吐量修正(自给建筑除外)
	cash_reserves_max = 25000    #建筑最高的储备金
	should_auto_expand = { 
		default_auto_expand_rule = yes    #自动扩建的条件
	}
	economy_of_scale_ai_factor = 2.0    #这是ai考虑吞吐量影响的因素数值
}

此为主组的示例,建筑组分为拥有完整条件的主建筑组与附属主建筑组的子建筑组,以下为子组的示例:

bg_new_industry = {
	parent_group = bg_new    #附属于哪一个主建筑组,可直接套游戏原有的建筑组
	lens = light_industry    #该建筑组内的建筑分属什么类型的建筑,此外还有重工业(heavy_industry)、农业(agriculture)等,如写在主建筑里则为一个大类(比如农业就包括了所有的农田)
	urbanization = 20    #每级城市化率
	infrastructure_usage_per_level = 2    #建筑每级所使用的基础设施值
}

一个主建筑组及其子建筑组,合起来就是一个完整的建筑组,虽然建筑可以分属在主建筑组内,但是多个子建筑组能分开对应不同的建筑类型,如轻工业与重工业分属在制造业内,制造业建筑组的条件属性均可应用轻重工业,如果只是新建一个子建筑组,那就可以直接附属在游戏原主建筑组内。

官方建筑组效果代码一览

以下说明基于百度翻译与个人校对

  • parent_group = parent_group_key 如果设置了主组,则该建筑组则会被视为指定建筑组的子组,默认无。
  • always_possible = yes/no 如果为是,则该建筑组内的建筑始终能无视所在省份的资源限制,默认否。
  • economy_of_scale = yes/no 如果为是,则任何非自给建筑或该组的子组的建筑将会获得每级大于1的规模经济吞吐量修正。默认否。
  • is_subsistence = yes/no 如果为是,则该建筑组内的建筑被视为符合特殊规则的自给建筑,默认否。
  • default_building = building_type_key 除非该省份指定其它建筑类型,否则指定的默认建筑类型将会建造,默认无。
  • lens = lens_key 如果指定,则确定此组中的透镜建筑将会分类,默认无。
  • auto_place_buildings = yes/no 是否自动放置建筑
  • capped_by_resources = yes/no 是否受限于资源
  • discoverable_resource = yes/no 是否为可发现资源
  • depletable_resource = yes/no 是否为可耗尽资源
  • can_use_slaves = yes/no 默认为否,设置为是将为所包含的建筑与建筑组启用奴隶。
  • land_usage = urban/rural 建筑使用的省份资源类型,城市=城市化,农村=耕地。默认无省份资源使用情况,如果未指定,将返回在主建筑组树中找到的第一个非默认土地使用类型。
  • cash_reserves_max = number 该组建筑的现金储备可存入的英镑最高金额(每级)。如果未指定或设置为0,则将使用主组中的值,默认值0
  • inheritable_construction =  yes/no 如果为是,这个建筑群的建筑将在国家易手或分裂国家合并后幸存下来。
  • stateregion_max_level = yes/no 如果是,则此组中具有has_max_level属性的任何建筑类型都将考虑其对省份区域而非省份级别的级别限制。
  • urbanization = number 该组建筑每级提供的城市化数值。
  • should_auto_expand = trigger 如果启用了自动扩展,则该组中的建筑应在何种条件下自动扩展(在更具体的组或建筑类型覆盖上触发)。如果该触发器有任何内容,则游戏将认为该建筑可能是自动扩展的,因此不要在此处写入无法计算为真的触发器。
  • hiring_rate = X 一周内建筑可以雇佣的最大人员数,(默认NDefines::NEeconomy::HIRING_RATE)
  • proportionality_limit = X 建筑对人群类型不成比例的容忍度有多高,默认(NDefines::NEeconomy::EMPLOYMENT_PROPORTIONALITY_LIMIT)
  • hires_unemployed_only = yes 如果为是,该组建筑只能从失业池中雇佣,默认否。

建筑

现在,让我们在common/buildings里创建一个带BOM的UTF-8格式的txt文件,名称为随意,以下为简单示范。

new_building = {   #这是建筑的名称
	building_group = bg_new_industry    #这是建筑所属的建筑组
	texture = "gfx/interface/icons/building_icons/new_industry.dds"    #这是建筑所用的图标路径,无则会使用默认占位符(恐怖笑脸)
	city_type = city    #这是建筑所属的城市类型,有则要在城市类型里添加模型路径,无则不用
	levels_per_mesh = 5    #建筑多少级在地图上生成一个模型
	unlocking_technologies = {    #由什么科技解锁
		manufacturies
	}
	production_method_groups = {    #该建筑的包含什么生产方式组
		pmg_new_default
		pmg_automation_new_building
		pmg_ownership_capital_new_building
	}
	required_construction = construction_cost_high    #修建所需的建造力花费条件,游戏文件里的common\script_values\building_values.txt有所有的花费数值
	ai_value = 2000    #这是ai修建该建筑的优先度
	possible = {    #不分私人与政府建造部门的限制条件
		owner = { is_player = yes }    #所有者为玩家操作
		error_check = {    #条件检查,该条件为与海相邻,无则不能建设
			severity = fail
			is_sea_adjacent = yes
		}
	}
#################
	can_build_government = {    #如需分开政府与私人建造部门则按照这个样式来写(来自福寿膏种植园)
		error_check = {
			severity = fail
			owner = { NOT = { is_banning_goods = g:opium } }    #该条件为所有者无商品(福寿膏)禁止
		}
	}
	can_build_private = {
		error_check = {
			severity = fail
			owner = { NOT = { is_banning_goods = g:opium } }
		}
	}
	expandable = no    #这是是否可扩大与缩小规模
	downsizeable = no
}

现在一个建筑已经弄好了,下一步就是设置该建筑的生产方式组与其包含的生产方式。

模组制作指引