建筑、区划与区域
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)开头:
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_to | potential 失效时转换成列表中第一个可用的区划 |
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 的矿业槽:
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):
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 },以及:
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_production | AI 与殖民地自动化的选择依据 |
建筑
原版研究实验室(common/buildings/05_research_buildings.txt,省略了 potential 里给 AI 的限制):
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。