建筑、区划与区域

4.x 的行星建设三层结构:区划、区域槽、区域与建筑,以及各自的关键字段

三层结构

4.x 的行星建设分三层,模组改动前先弄清楚你要改的是哪一层:

层文件夹说明
区划(district)common/districts/行星上可建造的“格子”,自带岗位与住房,并提供若干区域槽
区域槽(zone slot)common/zone_slots/区划里的一个位置,规定能放哪些区域
区域(zone)common/zones/区划的特化方向(科研、工业……),提供建筑槽,并限制能放哪些建筑
建筑(building)common/buildings/放进区域建筑槽里的建筑

原版各自带有说明文件:districts/00_DOCUMENTATION.txt、zones/99_HOW_TO_ZONE.txt、zone_slots/99_HOW_TO_ZONE.txt、buildings/00_example.txt(后者注释写着“可能过时”)。

它们之间靠“集合”连接:

  • 区划的 zone_slots = { ... } 列出它有哪些区域槽;
  • 区域槽用 included_zone_sets / include 决定接受哪些区域;
  • 区域用 zone_sets = { ... } 声明自己属于哪些区域集合,用 included_building_sets / include 决定接受哪些建筑;
  • 建筑用 building_sets = { ... } 声明自己属于哪些建筑集合。

注意 buildings/00_example.txt 写明:除总督府邸(Overlord Holdings)和分部建筑(Branch Office)之外,每个建筑都必须属于至少一个建筑集合,否则任何区域都放不下它。区域同理,必须属于至少一个区域集合。

区划

原版城市区划 district_city(common/districts/00_urban_districts.txt)开头:

Clausewitz 脚本
district_city = {
	base_buildtime = 480

	exempt_from_ai_planet_specialization = yes
	default_starting_district = yes
	overlay_icon = GFX_district_government

	zone_slots = {
		slot_city_government
		slot_city_01
		slot_city_02
	}
	# ……potential、allow、convert_to 等
}

常用字段:

字段说明
base_buildtime建造天数
zone_slots区域槽列表
potential行星作用域;不成立时区划在这颗星球上不存在
allow能否建造(不成立时变灰)
show_on_uncolonized未殖民时是否在行星界面显示
is_uncapped什么条件下不受数量上限约束;文档说明此块非空时会自动生成上限修正
shared_capacity_modifier与哪种区划共用上限池
convert_topotential 失效时转换成列表中第一个可用的区划
resources建造费用、维护费、产出,category 通常是 planet_districts 一类
planet_modifier / triggered_planet_modifier给行星的修正,岗位和住房通常写在这里
prerequisites前置科技
on_built / on_destroy / on_queued / on_unqueued行星作用域效果

区划数量上限来自自动生成的修正,例如 district_mining_max_add、district_mining_max_mult(见 modifiers.log)。

区域槽

原版 common/zone_slots/00_zone_slots.txt 的矿业槽:

Clausewitz 脚本
slot_minerals = {
	included_zone_sets = {
		minerals
	}
	unlock = { # planet scope
		custom_tooltip = {
			fail_text = zone_unavailable_tech_mineral_purification_1
			exists = owner
			owner = {
				has_tech_or_functional_civic = {
					TECH = tech_mineral_purification_1
				}
			}
		}
	}
}
字段说明
start新区划建成时自动放进这个槽的区域
include / exclude直接列出允许、排除的区域;include 里可以写 all
included_zone_sets / excluded_zone_sets按区域集合允许、排除
potential槽在这颗星球上是否存在
unlock槽是否已解锁;上例要求研究某项科技

区域

原版科研区域只有几行,主体放在 inline_script 里(common/zones/00_zones.txt):

Clausewitz 脚本
zone_research = {
	inline_script = {
		script = zones/shared_research_zone
		AMOUNT = @scaling_district_3_jobs
	}

	zone_sets = {
		urban
		polytechnic
	}

	inline_script = {
		script = zones/shared_city_non_urban_zone_modifiers
	}

	ai_weight_coefficient = 1.2
}

common/inline_scripts/zones/shared_research_zone.txt 里能看到真正的字段:icon、base_buildtime、potential、unlock、resources(category = planet_zones)、included_building_sets = { research urban_automation origin },以及:

Clausewitz 脚本
planet_modifier = {
	zone_building_slots_add = 3
}

区域独有的字段(据 zones/99_HOW_TO_ZONE.txt):

字段说明
max_buildings建筑槽数量
districts_per_building每多少级区划解锁一个建筑槽
district_planet_modifier / district_country_modifier乘以区划等级的修正
triggered_district_planet_modifier 等上面两者的触发式版本
include / exclude / included_building_sets / excluded_building_sets能放哪些建筑
zone_sets自己属于哪些区域集合(必填)
show_in_tech显示在哪项科技卡的“解锁”里
swap_type / swap_type_weight该区域占主导时区划使用哪种外观
ai_priority / ai_weight_coefficient / ai_resource_productionAI 与殖民地自动化的选择依据

建筑

原版研究实验室(common/buildings/05_research_buildings.txt,省略了 potential 里给 AI 的限制):

Clausewitz 脚本
building_research_lab_1 = {
	can_build = yes
	base_buildtime = @b1_time
	category = research

	building_sets = {
		research
	}

	inline_script = {
		script = jobs/researchers_add
		AMOUNT = @building_static_jobs_3
	}

	resources = {
		category = planet_buildings
		cost = { minerals = @b1_minerals }   # 原版这里是一个 inline_script,按是否游牧切换资源
		upkeep = {
			energy = @b1_upkeep
		}
	}

	prerequisites = {
		"tech_basic_science_lab_1"
	}

	upgrades = {
		"building_research_lab_2"
	}
}

常用字段(据 buildings/00_example.txt):

字段说明
category建筑类别,用于界面分组和部分触发器
building_sets属于哪些建筑集合(必填,见上文)
potential是否出现在建造列表中,行星作用域
allow能否建造(不成立时变灰)
destroy_trigger + convert_to条件成立时摧毁,或转换成列表中的建筑(例如被征服后)
empire_limit / planet_limit全国、单个星球的数量上限,base 加 modifier
upgrades可以升级成哪些建筑
capital = yes首都建筑
can_build / can_demolish / can_be_ruined / can_be_disabled各种开关
position_priority在建筑列表中的排序,默认 200,首都建筑为 0
planet_modifier、country_modifier、army_modifier、system_modifier 及其 triggered_ 版本修正,见修正
on_queued / on_unqueued / on_built / on_destroy / on_repaired效果钩子

ai_weight 在 4.x 的建筑里基本不再使用,文档说明 AI 的建造决策由 common/economic_plans/ 驱动,除非你改掉经济计划。

岗位从哪来

建筑、区划和区域本身不“声明”岗位,而是通过行星修正 job_<岗位>_add 添加。原版把这类修正收进 common/inline_scripts/jobs/ 下的脚本,AMOUNT 是岗位数。common/scripted_variables/100_scripted_variables_zones.txt 的注释说明:区划和区域的岗位数一般取 100 的倍数。岗位本身的定义见岗位与人口阶层。

图标与本地化

  • 建筑图标按键名读取 gfx/interface/icons/buildings/<建筑键>.dds(例如 building_research_lab_1.dds),原版没有为它们定义 sprite。
  • 区划用 icon(不写时按区划名查找)和 overlay_icon(一个 GFX_ sprite);区域用 icon = GFX_...。
  • 本地化键都是 <键> 加 <键>_desc:building_research_lab_1、district_city、zone_research 等。

在脚本里操作

效果(殖民地/行星作用域)说明
add_building = <键>添加建筑;也可写成 { district = … zone = … building = … } 指定位置
remove_building = <键>移除一个
add_district = <键> / remove_district = <键>增减区划
add_zone = { district = … zone = … zone_slot = … replace = yes }在指定区划里放区域

触发器 has_building、num_buildings = { type = … value > 2 } 可用于检查,完整参数见 triggers.log。