岗位与人口阶层
pop_jobs 的岗位定义、swappable_data、准入条件与产出,以及 pop_categories 阶层
两个文件夹
| 位置 | 内容 |
|---|---|
common/pop_jobs/ | 岗位:谁能做、产出什么、消耗什么、给星球什么修正 |
common/pop_categories/ | 人口阶层(统治者、专家、劳工、各类无人机、平民……):等级、换岗规则、住房与宜居度消耗 |
common/pop_jobs/000_pretriggers.txt | 原版关于“预触发器”的说明 |
每个岗位都属于一个阶层,用 category = <阶层键> 指定。
一个真实的岗位
原版物理学家(common/pop_jobs/02_specialist_jobs.txt)删减后的骨架:
physicist = {
category = specialist
swappable_data = {
default = {
condition_string = SPECIALIST_JOB_TRIGGER
building_icon = building_research_lab_1
}
# 下面还有若干 swap_type
}
tags = { research }
possible_pre_triggers = {
has_owner = yes
is_being_purged = no
is_being_assimilated = no
is_sapient = yes
}
possible_precalc = can_fill_specialist_job
possible = {
complex_specialist_job_check_trigger = yes
}
resources = {
category = planet_physicists
produces = {
physics_research = 3
}
upkeep = {
consumer_goods = 1.5
}
}
weight = {
weight = @specialist_job_weight
modifier = {
factor = 0.2
has_citizenship_rights = no
NOT = { has_trait = trait_mechanical }
}
}
}字段说明
| 字段 | 说明 |
|---|---|
category | 所属阶层,必须是 pop_categories 里的键 |
tags = { ... } | 标签,供修正和触发器按类别引用岗位 |
possible_pre_triggers | 快速预检,见下文 |
possible_precalc | 引用一个预先计算好的准入条件;原版用 can_fill_specialist_job、can_fill_worker_job、can_fill_ruler_job、can_fill_drone_job、can_fill_precursor_job |
possible | 完整的准入触发器 |
weight | 人口在多个空岗位之间如何选择,modifier 里的 factor 相乘 |
resources | 产出与消耗;produces、upkeep 都可以带 trigger 只在条件成立时计入 |
overlord_resources | 宗主从附庸处抽取的那部分产出 |
planet_modifier / triggered_planet_modifier / country_modifier | 岗位被填满时施加的修正(例如宜居度) |
is_capped_by_modifier | 岗位数量是否受修正上限约束 |
first_come_first_served | 原版只在少数特殊岗位(如 purge)上设为 yes |
can_set_priority | 能否调整这个岗位的优先级;原版在罪犯等特殊岗位上写 no |
预触发器
000_pretriggers.txt 说明,possible_pre_triggers 是先于完整触发器执行的快速判断,用来尽早排除不可能就业的人口。只能写这几项 yes/no:
has_owner、is_enslaved、is_being_purged、is_being_assimilated、has_planet、is_sapient
没写的项不检查。能放进预触发器的条件就别写进 possible,人口多时差别很明显。
一个岗位,多种名字:swappable_data
很多岗位在不同条件下显示成不同的名字和图标,但本质还是同一个岗位(产出、修正共用)。swappable_data 的 default 是默认外观,每个 swap_type 是一种替换:
swap_type = {
trigger = {
physicist_is_astrometeorologist_trigger = yes
}
name = astrometeorologist
desc = astrometeorologist
icon = astrometeorologist
building_icon = building_astrometeorology_observation_center
condition_string = SPECIALIST_JOB_TRIGGER
weight = 5
}多个替换同时成立时取 weight 大的。只想换产出时不必新增岗位,像原版那样在 resources 里写带 trigger 的 produces 即可。
岗位从哪来
岗位只是“工种定义”,具体有几个空位由行星修正 job_<岗位键>_add 决定,这个修正是游戏为每个岗位自动生成的(modifiers.log 里能查到 job_physicist_add,同时还有 job_physicist_per_pop 等变体)。
建筑、区划、区域、特质、事件修正都可以加岗位:
planet_modifier = {
job_mymod_xenologist_add = 100
}原版把常用的组合写成 common/inline_scripts/jobs/*_add.txt,例如 jobs/researchers_add 会按国家类型(普通帝国、蜂巢、机械)加上对应的研究岗位。新岗位如果要给各种国家用,建议也照此写一个 inline_script。详见建筑、区划与区域。
人口阶层
原版 common/pop_categories/00_social_classes.txt 里的专家阶层开头:
specialist = {
rank = 3
change_job_threshold = 1.07 # A pop that is 2.3% better than me will displace me (1.023^3 = 1.07)
job_reshuffle_interval = 7
weight = {
weight = 2
}
automation_resources = {
category = planet_automated_jobs
upkeep = {
energy = @automation_upkeep_specialist
}
}
pop_group_modifier = {
pop_housing_usage_base = 1
pop_amenities_usage_base = 1
}
# ……
}| 字段 | 说明 |
|---|---|
rank | 阶层等级,原版统治者 4、专家 3、劳工 2 |
change_job_threshold | 更合适的人口要好到什么程度才会挤走当前在岗者(原版注释给出了换算) |
job_reshuffle_interval | 重新分配岗位的间隔 |
automation_resources | 岗位被自动化时的维护费 |
pop_group_modifier | 该阶层人口自带的修正,如住房、宜居度消耗 |
allow_resettlement | 能否迁移,人口作用域 |
文件开头的注释还列了两个开关:is_unemployment_job = yes 把该阶层当作失业,is_civilian_job = yes 当作平民。
新增阶层的情况很少,一般只新增岗位,挂到已有阶层上。
图标与本地化
- 图标:
gfx/interface/icons/jobs/job_<岗位键>.dds,例如原版的job_physicist.dds。swap_type的icon = astrometeorologist同理对应job_astrometeorologist.dds。 - 本地化:
job_<岗位键>、job_<岗位键>_plural、job_<岗位键>_desc;阶层用pop_cat_<阶层键>。
l_simp_chinese:
job_mymod_xenologist: "异星学家"
job_mymod_xenologist_plural: "异星学家"
job_mymod_xenologist_desc: "研究外星生命形态的学者。"检查清单
category指向已存在的阶层。- 有地方通过
job_<键>_add提供空位,否则岗位永远不会出现。 - 产出的资源类别
resources = { category = … }使用common/economic_categories/中已有的类别,新类别会影响修正生成,见原版99_README_ECONOMIC_CATEGORIES.txt。 - 补齐图标和三条本地化。