Skip to content

其他 JSON 文件 ​

Difficulties.json ​

链接到原始文件

此可选文件定义玩家在开始新游戏时可以选择的难度级别。

基础规则集模组可以省略文件或提供空列表,尽管至少需要一种难度,在这种情况下,它们继承来自 Vanilla 规则集的那些。

每个难度级别具有以下结构:

属性类型默认值说明
nameString必需
baseHappinessInteger0
extraHappinessPerLuxuryFloat0
researchCostModifierFloat1
unitCostModifierFloat1
unitSupplyBaseInteger5
unitSupplyPerCityInteger2
buildingCostModifierFloat1
policyCostModifierFloat1
unhappinessModifierFloat1
barbarianBonusFloat0
barbarianSpawnDelayInteger0
playerBonusStartingUnitsList of Strings空也可以是 'Era Starting Unit',映射到 Eras 文件的 startingMilitaryUnit。所有其他单位必须在 Units.json 中。仅适用于人类玩家文明
aiDifficultyLevelString空从选择的难度对 AI 应用一些修饰符。诸如 unhappinessModifier 和 aiUnhappinessModifier 等修饰符会相乘堆叠。如果为空:默认为 "Chieftain" 或第一个可用的难度。
aiCityGrowthModifierFloat1
aiUnitCostModifierFloat1
aiBuildingCostModifierFloat1
aiWonderCostModifierFloat1
aiBuildingMaintenanceModifierFloat1
aiUnitMaintenanceModifierFloat1
aiUnitSupplyModifierInteger5
aiFreeTechsList of Strings空必须在 Techs.json 中
aiMajorCivBonusStartingUnitsList of Strings空与 playerBonusStartingUnits 相同的规则,请参阅上文。仅适用于 AI 主要文明
aiCityStateBonusStartingUnitsList of Strings空与 playerBonusStartingUnits 相同的规则,请参阅上文。仅适用于城邦文明
aiUnhappinessModifierFloat1
turnBarbariansCanEnterPlayerTilesInteger0
clearBarbarianCampRewardInteger25
uniquesList of Strings空选择此难度时将被视为 GlobalUniques 的一部分

Eras.json ​

链接到原始文件

此文件应包含你想要在模组中使用的所有时代。

每个时代可以具有以下属性:

属性类型默认值说明
nameString必需
researchAgreementCostInteger (≥0)300当科技最先进的文明处于此时代时,研究协议的成本
iconRGBList of 3× Integerwhite此时代的科技图标在科技屏幕中应具有的 RGB 颜色
startingSettlerCountInteger (≥0)1在此时代开始游戏时应生成的定居者单位数量(不建议将其设置为零 [^1])
startingSettlerUnitString"Settler"应用于前一个字段的单位名称。必须在 Units.json 中,或者必须存在具有 "Founds a new city" unique 的单位
startingWorkerCountInteger (≥0)0在此时代开始游戏时应生成的工人单位数量
startingWorkerUnitString"Worker"应用于前一个字段的单位名称。如果 startingWorkerCount>0,则它必须存在于 Units.json 中,或者必须存在具有 "Can build [filter] improvements on tiles" unique 的单位
startingMilitaryUnitCountInteger (≥0)1在此时代开始游戏时应生成的军事单位数量
startingMilitaryUnitString"Warrior"应用于前一个字段的单位名称。必须在 Units.json 中
startingGoldInteger (≥0)0每个文明在此时代开始游戏时应收到的金币数量
startingCultureInteger (≥0)0每个文明在此时代开始游戏时应收到的文化数量
settlerPopulationInteger (>0)1在此时代开始游戏时定居时每个城市应有的人口数量
settlerBuildingsList of Strings空在此时代开始游戏时每当建立城市时应自动建造的建筑
startingObsoleteWondersList of Strings空在此时代开始游戏时应无法建造的奇观(以及技术上建筑)。在基础游戏中用于移除所有早于 2 个时代的奇观
baseUnitBuyCostInteger200用于独特能力 "Can be purchased with [stat] [cityFilter]" 的默认值
embarkDefenseInteger3此时代中登船单位的默认防御力
startPercentInteger0开始时,在 Speed.json 中指定的总回合数中跳过的百分比([0]%-[100])
citySoundString"cityClassical"在此时代建立城市时使用的声音
uniquesList of Strings空进入此时代后应用这批uniques作为等价的全局uniques

[^1]: 在模组中成功将 startingSettlerCount 设置为零(想法:征服或死亡)并不容易。某些玩家控制的设置需要至少一个定居者,通过任何来源(请参阅难度设置以了解其他可能的定居者来源),否则你将无法开始游戏:一旦城市挑战需要所有玩家都有一个,并且允许任何城邦需要那些城邦有一个。还会影响失败规则。

Speeds.json ​

链接到原始文件

此可选文件应包含你想要在模组中使用的所有速度。

基础规则集模组可以省略文件或提供空列表,尽管至少需要一种游戏速度,在这种情况下,它们继承来自 Vanilla 规则集的那些。

每个速度可以具有以下属性:

属性类型默认值说明
nameString必需速度的名称
modifierFloat (≥0)1.0整体游戏速度修饰符
productionCostModifierFloat (≥0)modifier 值缩放单位和建筑的生产成本
goldCostModifierFloat (≥0)modifier 值缩放金币成本
scienceCostModifierFloat (≥0)modifier 值缩放科学成本
cultureCostModifierFloat (≥0)modifier 值缩放文化成本
faithCostModifierFloat (≥0)modifier 值缩放信仰成本
improvementBuildLengthModifierFloat (≥0)modifier 值缩放工人建造地块改良设施所需的时间
barbarianModifierFloat (≥0)modifier 值缩放野蛮人生成之间的时间
goldGiftModifierFloat (≥0)modifier 值缩放向城邦赠送金币获得的影响力
cityStateTributeScalingIntervalFloat (≥0)6.5玩家向城邦索要的金币数量增加 5 金币所需的回合数
goldenAgeLengthModifierFloat (≥0)modifier 值缩放黄金时代的长度
religiousPressureAdjacentCityInteger (≥0)6定义一个城市对附近城市施加的宗教压力
peaceDealDurationInteger (≥0)10和平协议持续的回合数
dealDurationInteger (≥0)30非和平协议(研究协议、开放边界等)持续的回合数
startYearFloat-4000游戏的起始年份(负数为公元前)
turnsList必需每回合的时间间隔列表,请参阅下文
uniquesList of Strings空选择此速度时将被视为 GlobalUniques 的一部分

每回合时间间隔 ​

"turns" 属性定义回合之间经过的年数。该属性由对象列表组成,每个对象具有 2 个必需属性:"yearsPerTurn"(Float)和 "untilTurn"(Integer)

属性类型默认值说明
yearsPerTurnInteger必需回合之间经过的年数
untilTurnInteger必需此间隔的结束(如果是最后一个对象,请参阅下文)

对于每一行,"yearsPerTurn" 应用于从 "untilTurn"-1 到 "untilTurn" 步骤。 列表中最后一个 "untilTurn" 在年份计算中被忽略,即如果游戏超过了该回合数,年份将继续按最后一个条目的 "yearsPerTurn" 增加。 但是,这在后期时代开始游戏时使用:Era.startPercent 相对于最后一个 "untilTurn"。

下面的代码是有效的 "turns" 定义的示例,它指定游戏的前 50 回合每回合持续 60 年,接下来的 30 回合(以及第 80 回合之后玩的任何回合)每回合持续 40 年。

json
"turns": [
    {"yearsPerTurn": 60, "untilTurn":  50},
    {"yearsPerTurn": 40, "untilTurn":  80}
]

Events.json ​

事件允许用户在触发器的选项之间进行选择以激活。

属性类型默认值说明
nameString必需用于通过 "Triggers a [event] event" unique 进行触发
textStringNone向用户显示的风味文字
presentationOne of: "None", "Alert", "Floating"Alert"Alert" 表示常规弹出窗口,"None" 表示随机选择,"Floating" 用于教程风格的指示器
civilopediaTextList可选请参阅 civilopediaText 章节
choicesList of EventChoices用户可以选择触发其中一个可行的选择

你可以使用 text 和/或 civilopediaText,如果两者都存在,则两者都显示(但为什么呢?)

事件选择由以下组成:

属性类型默认值说明
textString必需作为按钮显示给用户。应该是动作名称 - "Do X"
uniquesList of uniques to trigger or limit conditions必需此选择在被选中时激活的触发器,以及 "Unavailable" / "Only available" uniques
keyShortcutkey to select (name)none键名称请参阅 Gdx.Input.Keys
civilopediaTextList可选请参阅 civilopediaText 章节

在这里,civilopediaText 显示在活动按钮之外,在 triggeredUniques 之前。

ModOptions.json ​

此文件略有不同:

  • 在 Vanilla 规则集中不存在
  • 完全是可选的,但在下载模组后会创建

请注意,此文件控制_声明性模组兼容性_(进行中)- 例如,有 uniques 表示你的模组应该只或从不作为'永久视觉模组'使用。 不兼容性过滤目前适用于扩展模组和基础模组之间,但请随意使用相同的 Unique 记录已知的扩展到扩展的不兼容性。敬请期待!

该文件可以具有以下属性,不包括 Unciv 自动设置的值:

属性类型默认值说明
isBaseRulesetBooleanfalse如果为 true,则替换 vanilla 规则集
uniquesList空模组范围的特性,请参阅此处
techsToRemoveList空要移除的技术或technologyFilter列表(仅适用于 isBaseRuleset=false)
buildingsToRemoveList空要移除的建筑或奇观或buildingFilter列表(仅适用于 isBaseRuleset=false)
unitsToRemoveList空要移除的单位或unitFilter列表(仅适用于 isBaseRuleset=false)
nationsToRemoveList空要移除的国家或nationFilter列表(仅适用于 isBaseRuleset=false)
policyBranchesToRemoveList空要移除的政策分支列表(仅适用于 isBaseRuleset=false)
policiesToRemoveList空要移除的政策列表(仅适用于 isBaseRuleset=false)
variableMenuThresholdInteger0显示的变量数超过此值时,顶栏折叠为仅显示始终显示的变量;0 = 不限制。见 Variables.json
alwaysDisplayVariableCountInteger0变量菜单折叠时顶栏保留的始终显示变量数量;0 = 全部保留。见 Variables.json
beliefsToRemoveList空要移除的信仰列表(仅适用于 isBaseRuleset=false)
religionsToRemoveList空要移除的宗教列表(仅适用于 isBaseRuleset=false)
constantsObject空请参阅 ModConstants
tilesetString空仅适用于基础规则集
unitsetString空仅适用于基础规则集

通常从 github 元数据自动设置的值是:

属性类型默认值说明
modUrlString从中下载模组的 github 页面,或者如果使用了免费托管的 zip 则为空
defaultBranchStringmaster仓库的默认分支

为了澄清:当你的模组通过 github 分发时,在模组仓库中包含这些没有任何影响。 但是,当模组在_没有_ github 仓库的情况下分发时,这些值可以_应该_由作者在分发的 ModOptions.json 中设置。

版本要求(UncivCN) ​

模组可以声明版本号与兼容性要求,使用时会被以警告(不阻止)方式检查:

属性类型默认值说明
modVersionString0.0.1模组版本号,格式 n.n.n;显示在模组管理器中,并用于依赖版本检查
recommendedGameVersionString空本模组版本针对制作的游戏版本,精确匹配(n.n.n、n.n.n.n 或带 -patchN 后缀);空 = 未声明
modDependenciesList空依赖模组列表,每项为对象 { "name": ..., "recommendedVersion": ... };recommendedVersion 为依赖模组应采用的精确版本(精确匹配),空 = 任意版本

示例:

json
{
  "modVersion": "0.1.0",
  "recommendedGameVersion": "4.21.7.1",
  "modDependencies": [
    { "name": "UCCC", "recommendedVersion": "1.5.0" },
    { "name": "MyOtherMod", "recommendedVersion": "3.0.0" }
  ]
}

什么时候会看到警告? ​

  • 游戏版本:当前游戏版本与 recommendedGameVersion 不完全一致时,例如模组声明 recommendedGameVersion: "4.21.7.1" 而玩家运行的是 4.21.7.2——模组管理器的已安装列表直接显示版本号与推荐游戏版本、该模组旁显示警告标记、信息面板显示黄色警告行,新建游戏模组选择时弹出提示,模组检查器(选项 → 定位模组错误)中也会列出该警告。
  • 依赖模组:依赖模组未加载,或其 modVersion 与声明的 recommendedVersion 不完全一致。
  • 声明格式错误:版本号或范围写错(如笔误)也会被报告,方便模组作者发现并修正。

所有情况下模组都保持可用——警告从不阻止任何操作。

recommendedGameVersion 表达"本模组版本是为游戏版本 X 制作的"——它直接显示在模组管理器中(如 Version 0.1.0 · game 4.21.7.1),警告文案也读作推荐而非要求。模组在所有游戏版本都能工作时留空。

版本格式细节 ​

  • 接受任意数量的点分数字段(1、1.2、1.2.3、4.21.5.3),但 modVersion 建议使用 n.n.n。
  • 支持可选的 -patchN 后缀,作为附加段参与比较:4.21.5.3 < 4.21.5.3-patch1 < 4.21.5.3-patch2 < 4.21.6。
  • 段数不足时按补 0 比较:1.2 == 1.2.0。
  • 未声明 recommendedVersion 的依赖接受该模组的任意版本。

与 ModRequires / ModIncompatibleWith uniques 的关系 ​

Unciv 已有声明式模组兼容 uniques(ModRequires、ModIncompatibleWith):不满足时模组在模组选择中不可选。上述版本要求是更柔和的一层(UncivCN 专属):不满足只产生警告。用 ModRequires 表达“该模组需要另一个模组才能运行”,用 modDependencies 额外推荐依赖模组的具体版本。

最佳实践 ​

  • 每次发版都提升 modVersion,让依赖版本检查保持有意义。
  • 用 recommendedGameVersion 钉住本模组版本制作的游戏版本(精确匹配);模组在所有游戏版本都能工作时留空。

ModConstants ​

存储在 ModOptions.constants 中,这是 Unciv 内部使用的常量集合。 这是唯一_逐字段_从模组合并的结构,而不是覆盖,因此你可以在一个模组中更改来自野蛮人的 XP,在另一个模组中更改城市距离。在冲突的情况下,无法保证哪个模组获胜,只保证忽略_默认_值。

属性类型默认值说明
maxXPfromBarbariansInt30[^A]
cityStrengthBaseFloat8.0[^B]
cityStrengthPerPopFloat0.4[^B]
cityStrengthFromTechsMultiplierFloat5.5[^B]
cityStrengthFromTechsExponentFloat2.8[^B]
cityStrengthFromTechsFullMultiplierFloat1.0[^B]
cityStrengthFromGarrisonFloat0.2[^B]
baseCityBombardRangeInt2[^S]
cityWorkRangeInt3[^T]
cityExpandRangeInt5[^U]
cityAirUnitCapacityInt6[^W]
unitSupplyPerPopulationFloat0.5[^C]
minimalCityDistanceInt3[^D]
minimalCityDistanceOnDifferentContinentsInt2[^D]
unitUpgradeCostObject请参阅下文[^J]
naturalWonderCountMultiplierFloat0.124[^E]
naturalWonderCountAddedConstantFloat0.1[^E]
ancientRuinCountMultiplierFloat0.02[^F]
spawnIceBelowTemperatureFloat-0.8[^G]
maxLakeSizeInt10[^H]
riverCountMultiplierFloat0.01[^I]
minRiverLengthInt5[^I]
maxRiverLengthInt666[^I]
religionLimitBaseInt1[^K]
religionLimitMultiplierFloat0.5[^K]
pantheonBaseInt10[^L]
pantheonGrowthInt5[^L]
workboatAutomationSearchMaxTilesInt20[^M]
maxSpyRankInt3[^N]
spyRankSkillPercentBonusFloat30[^O]
minimumWarDurationInt10[^P]
baseTurnsUntilRevoltInt4[^Q]
cityStateElectionTurnsInt15[^R]
maxImprovementTechErasForwardIntNone[^S]
goldGiftMultiplierFloat1[^T]
goldGiftTradeMultiplierFloat0.8[^U]
goldGiftDegradationMultiplierFloat1.0[^V]

图例:

  • [^A]: 可以从与野蛮人的战斗中获得的最大经验值
  • [^B]: 城市力量公式: 力量 = baseStrength + strengthPerPop + strengthFromTiles + ((%techs * multiplier) ^ exponent) * fullMultiplier + (garrisonBonus * garrisonUnitStrength * garrisonUnitHealth/garrisonUnitMaxHealth) + defensiveBuildingStrength 其中 %techs 是科技树中已完成的科技的百分比 garrisonUnitHealth 为驻军单位当前生命值,garrisonUnitMaxHealth 为其最大生命值(可模组化,默认 100)——两者之比即驻军生命百分比 如果此规则集中不存在科技,则 %techs = 0.5(=50%)
  • [^S]: 城市可以攻击的距离
  • [^T]: 城市中人口可以工作的地块的距离。注意:较高的值可能会导致性能问题并可能导致错误。cityWorkRange 可以大于 cityExpandRange。
  • [^U]: 城市可以扩展其边界的距离。注意:较高的值可能会导致性能问题并可能导致错误。
  • [^C]: 单位供应公式: 供应 = unitSupplyBase(difficulties.json) unitSupplyPerCity * amountOfCities +(difficulties.json) unitSupplyPerPopulation * amountOfPopulationInAllCities unitSupplyBase 和 unitSupplyPerCity 可以在 difficulties.json 中找到 unitSupplyBase、unitSupplyPerCity 和 unitSupplyPerPopulation 也可以通过 uniques 增加
  • [^D]: 任何两个城市之间必须的最小距离,不包括城市所在的地块 数字是两个城市之间的地块数,不包括城市所在的地块。 例如,"C__C",其中 "C" 是有城市的地块,"_" 是没有城市的地块,距离为 2。 第一个常量适用于同一大陆上的城市,第二个适用于不同大陆上的城市。
  • [^E]: NaturalWonderGenerator 使用这些来确定给定地图大小要生成的自然奇观数量。数量与地图半径线性缩放:#wonders = radius * naturalWonderCountMultiplier + naturalWonderCountAddedConstant。默认值实际上意味着 Tiny - 1,Small - 2,Medium - 3,Large - 4,Huge - 5,自定义半径 >=109 - 所有 G&K 奇观。
  • [^F]: MapGenerator.spreadAncientRuins:遗迹数量 = 合适地块数量 * 此值
  • [^G]: MapGenerator.spawnIce:在 T < 此值的地方生成冰,其中 T 从温度极端、纬度和 perlin 噪声计算。
  • [^H]: MapGenerator.spawnLakesAndCoasts:最多此地块数量的水体变成湖泊
  • [^I]: RiverGenerator:河流频率和长度边界
  • [^J]: UnitUpgradeCost 子结构。
  • [^K]: 可发现的最大宗教数量 = religionLimitBase + floor(MajorCivCount * religionLimitMultiplier)
  • [^L]: 万神殿的成本 = pantheonBase + CivsWithReligion * pantheonGrowth
  • [^M]: 当 AI 决定是否建造工作船时,从城市中心搜索可改进地块的回合数
  • [^N]: 任何间谍可以达到的最大等级
  • [^O]: 每个等级给予的技能加成
  • [^P]: 文明在谈判和平之前必须等待的回合数
  • [^Q]: 在生成叛乱之前的回合数
  • [^R]: 城邦选举之间的回合数
  • [^S]: 如果设置,改进选择器将静默跳过技术要求比你的当前时代 + 此值更先进的改进。例如:使用 0 时,贸易站在中世纪之前不会显示,使用 1 时,它们将在古典时代显示。
  • [^T]: 单边贸易的金币价值乘数,作为礼物存储。
  • [^U]: 常规贸易的金币价值乘数,作为礼物存储。设置为 0 以禁用双边贸易中的金币赠送。
  • [^U]: 修改 "GaveUsGifts" 外交修饰符耗尽的速度。较高的值使其耗尽得更快。通常,根据外交关系,默认值每回合减少约 2.5%。
  • [^W]: 可以驻扎在城市中的空中单位数量,不包括携带/运输的空中单位。

UnitUpgradeCost ​

这些值不会单独合并,只会合并整个子结构。

属性类型默认值说明
baseFloat10
perProductionFloat2
eraMultiplierFloat0
exponentFloat1
roundToInt5

单位升级的金币成本公式是(向下舍入到 roundTo 的倍数): ( max((base + perProduction * (new_unit_cost - old_unit_cost)), 0) * (1 + eraNumber * eraMultiplier) * civModifier ) ^ exponent 其中 civModifier 是适用于 "[relativeAmount]% Gold cost of upgrading" uniques 的乘法聚合。

GlobalUniques.json ​

链接到原始文件

GlobalUniques 定义全局应用的 uniques。例如,Vanilla 规则集在此定义不满意的效果。

基础规则集模组可以省略文件,在这种情况下,它们继承来自 Vanilla 规则集的那些。 或者,它们可以提供带有空对象({})的文件,意味着该模组没有全局 Uniques。

它具有以下结构:

属性类型默认值说明
nameString"GlobalUniques"name 字段未使用,但仍必须设置(规则集验证器可能会显示它)。
uniquesList of Strings空全局应用的独特能力列表
unitUniquesList of Strings空应用于每个单位的独特能力列表

当扩展规则集定义 GlobalUniques 时,所有 uniques 都会合并。目前,无法更改/移除基础模组设置的 uniques。

Variables.json ​

此可选文件定义整数模组变量,并提供四档存储作用域:

  • city:每座城市一份数值,可用于忠诚度、住房、宜居度等
  • civ:每个文明一份数值,可用于厌战度等
  • global:全局一份数值,可用于世界紧张度、温室效应、核污染指数等
  • unit:地图上每个单位实例一份数值,可用于魔法值、护盾值、怒气值等

scope 字段必填,可填写 city、civ、global 或 unit(推荐使用小写;读取时也兼容首字母大写)。

变量本身不像资源或属性那样携带固定玩法语义。它可以通过对应作用域的条件与触发 unique、基础产出、百分比产出加成、购买成本和生产转换使用:

  • 文明级条件:when above [5] [WarWeariness]
  • 城市级条件:when above [5] [Loyalty] in this city
  • 全局级条件:when above [50] [WorldTension] globally
  • 单位级条件:when above [5] [Mana] on [this unit](或其他 [mapUnitFilter],如 on [Melee])
  • 文明级触发:Instantly provides [2] [WarWeariness]
  • 城市级触发:Instantly provides [2] [Loyalty] in this city
  • 全局级触发:Instantly provides [2] [WorldTension] globally
  • 单位级触发:Instantly provides [2] [Mana] on [this unit](或其他 [mapUnitFilter])
  • 每回合产出:[+2 Loyalty](与属性产出使用相同的 [stats] 参数);单位级产出使用独立通道 [+2] [Mana] per turn
  • 百分比产出加成:[+50]% [Loyalty];单位级:[+50]% [Mana] per turn
  • 生产转换:Enables conversion of city production to [Loyalty]
  • 购买成本:May buy [Melee] units for [10] [WarWeariness] [in this city]
  • Lua:civ.getVariable、city.getVariable、game.getGlobalVariable、unit.getVariable 及对应的 set/add 方法

四套条件/触发通道有意保持独立:城市级变量不能写入文明级 unique,全局级变量不能写入城市级 unique。基础产出和百分比加成共用写法,再按变量声明的作用域结算(单位级产出只作用于 unit 档变量)。

每个变量具有以下结构:

属性类型默认值说明
nameString必填不得与任何属性、地块资源或生产项目同名
scopeString必填city、civ、global 或 unit
defaultInteger0该作用域没有记录时使用的值
minInteger无可选下限;每次写入都会截断到该值
maxInteger无可选上限;每次写入都会截断到该值
isDisplayBooleantrue是否在变量相关界面显示
isAlwaysDisplayBooleanfalse顶栏折叠时是否仍保持显示
uniqueToString无将 city、civ 或 unit 变量限制给一个文明;其他文明不能读写或使用它;global 变量填写此项会报错

示例:

jsonc
[
  {
    "name": "Loyalty",
    "scope": "city",
    "default": 50,
    "min": 0,
    "max": 100,
    "isDisplay": true
  },
  {
    "name": "WarWeariness",
    "scope": "civ",
    "default": 0
  },
  {
    "name": "WorldTension",
    "scope": "global",
    "default": 0,
    "min": 0
  },
  {
    "name": "Mana",
    "scope": "unit",
    "default": 0,
    "min": 0,
    "max": 100,
    "isDisplay": true
  }
]

城市级变量存储在每座 City 中,文明级变量存储在每个 Civilization 中,全局级变量存储在 GameInfo 中,单位级变量存储在每张地图的每个 MapUnit 中。缺少记录时回退到 default;min/max 会在 set、add、触发器、每回合结算和 Lua 写入时生效。存储值本身是整数逻辑计数器,永不随游戏速度缩放;但挂在带 (modified by game speed) 修正的 unique 下的文明级变量条件(如 when above [5] [WarWeariness])仍会按速度缩放,城市级与全局级变量条件则不受影响。[stats] 来源的每回合结算按城逐座执行,因此一个全文明来源喂给文明级或全局级变量时,每回合贡献 数值 × 城市数。

单位级变量在单位每回合结束时按单位自身 unique 结算([+2] [Mana] per turn,百分比加成按加法叠加),isDisplay 为 true 时显示在单位面板与单位总览。特殊单位过滤器 this unit 只作用于上下文单位(如挂在单位自身的 unique);在无单位上下文时(如建筑/政策上的触发)它无法定位目标,因此跨层给单位加值请使用显式过滤器(如 on [Melee])。

图标从模组文件夹的 image/Variable/<name>.png 加载;未提供图片时显示短文本标签。可显示变量会出现在世界地图顶栏、资源概览和 Variables 概览中;城市级数值还会显示在城市界面,单位级数值显示在单位面板与单位总览。

使用变量支付的购买成本按整数原值结算,不按十位取整。

变量完整用法可参考 CoeHarMod 的 Variables.json。

Tutorials.json ​

链接到原始文件

注意基础规则集模组可以通过添加名称等于模组名称的 "Tutorial" 在此处定义"欢迎页面"! 作为一般规则的例外,基础规则集模组中的此文件不会_替换_默认值,而是像扩展模组一样添加到其中。 此外,即使原始文件在 vanilla json 之上找到一级,通常也将它放在 <mod>/jsons/ 下。

每个教程具有以下结构:

属性类型默认值说明
nameString必需条目名称
categoryString可选此教程将显示的类别。"Tutorials" 是默认值。
civilopediaTextList可选请参阅 civilopediaText 章节
stepsList of Strings可选纯文本

如果条目同时包含 steps 和 civilopediaText 属性,则首先显示 civilopediaText。 显示为 Popup 的教程可以显示外部图像(不是纹理图集的一部分),如果 ExtraImages 中(直接位于资源或模组文件夹下)有同名的图像。 这是搜索到的,意味着定义教程的模组无关紧要,模组可以覆盖内置的 ExtraImages,区分大小写取决于操作系统。

VictoryTypes.json ​

链接到原始文件

这些文件包含此模组提供的胜利,以及要实现胜利必须达到的里程碑。 文件的大部分包含在胜利屏幕上向用户显示的字符串,其余部分是获胜的要求。

基础规则集模组可以省略文件或提供空列表,尽管至少需要一种胜利类型,在这种情况下,它们继承来自 Vanilla 规则集的那些。

每个胜利具有以下结构:

属性类型默认值说明
nameString必需胜利的名称
victoryScreenHeaderStringnone显示在胜利屏幕中"我们的状态"中的胜利页脚中
victoryStringStringnone当你用此胜利赢得游戏时,显示在胜利屏幕的页脚中
defeatStringStringnone当其他人用此胜利赢得游戏时,显示在胜利屏幕的页脚中
hiddenInVictoryScreenBooleanfalse此胜利的进度是否在胜利屏幕中隐藏
requiredSpaceshipPartsList of Strings空必须添加到首都以实现相应里程碑的太空船部件
MilestonesList of Strings必需必须完成以获胜的里程碑列表,请参阅下文
uniquesList of Strings空此胜利拥有的 unique 能力,请参阅下文
civilopediaTextList可选请参阅 civilopediaText 章节

胜利 uniques ​

与任何其他规则集对象一样,胜利也可以携带 uniques。

Only available <...> 与 Unavailable <...> 决定谁可以达成该胜利。它们针对文明进行判定,因此任何 civFilter 或针对游戏状态的条件都有效。未通过判定的文明永远不会赢得该胜利,不会在胜利屏幕中作为自身目标之一被提供,不会被列为该胜利的竞争者,也不会朝它努力。其里程碑本身不受影响。

json
[
    {
        "name": "Reach the goal",
        "uniques": ["Only available <for [Human player] Civilizations>"],
        "milestones": ["Build [Monument]"]
    }
]

Will not be chosen for new games 决定该胜利是否在新游戏选项中被提供,其行为与国家完全一致。此类胜利不会获得复选框,"所有胜利"默认项也永远不会启用它——自带游戏或场景的基础规则集可在其中自行启用。

它是独立 unique 是有意为之:在游戏设置阶段,没有任何文明可供判定 Only available / Unavailable,因此除非模组另有说明,限定于某国家、玩家类型或游戏速度的胜利仍可被选择。基于同样的原因,Will not be chosen for new games 上的条件句永远不会成立——请不加条件地使用它。

里程碑 ​

目前支持以下里程碑:

里程碑要求
Build [building]在任何城市建造建筑 [building]
Anyone should build [building]所有人必须建造建筑 [building] 才能使所有玩家拥有此里程碑
Add all [comment] in capital将此胜利的 requiredSpaceshipParts 字段中的所有单位添加到首都
Destroy all players你必须是唯一剩下城市的主要文明
Capture all capitals捕获游戏中所有主要文明的原始首都
Complete [amount] Policy branches完全完成至少 [amount] 个政策分支
Win diplomatic vote在游戏中的任何时候赢得外交投票(联合国)。你以后可能会失去,但仍保留此里程碑
Become the world religion使你的宗教成为所有主要文明中大多数城市的主流宗教
Have highest score after max turns基本上是时间胜利。启用"最大回合"滑块并在达到该数量时计算分数
Have at least [amount] [countable]至少拥有给定 countable 的 [amount] 个。与下一项里程碑不同,它不依赖其他玩家,因此规则集可以要求若干具体事项——建筑、政策、已耕作地块——以任意顺序达成
Have more [countable] than each player's [countable]使你给定的 countable 多于每个其他文明的 countable 以实现此胜利。这对于模拟类似于美丽新世界中的文化胜利很有用。

Civilopedia 文本 ​

在 json 中定义并列在文明百科中的任何"东西"都可以提供额外的文本,特别是针对文明百科的。当自动生成的显示不足时,这可以用来更好地解释特殊考虑,或者用于"风味"、背景故事等。此类文本可以格式化并链接到其他文明百科条目,在限制范围内。

格式示例:

json
"civilopediaText": [
    { "text": "古代遗迹在探索时提供一次性的随机奖励" },
    { "separator": true },
    {
        "text": "这一行是红色的,并链接到侦察兵,包括图标",
        "link": "Unit/Scout",
        "color": "red"
    },
    {
        "text": "带有金色星号的粗大标题",
        "header": 1,
        "starred": true,
        "color": "#ffeb7f"
    },
],

属性列表 - 注意并非所有组合都有效:

属性类型说明
textString要显示的文本
linkString创建链接和图标,格式:Category/Name 或 外部 链接('http://'、'https://'、'mailto:')
iconString显示图标而不链接,格式:Category/Name
extraImageString显示图像而不是文本。可以是在纹理集中找到的路径,或者是 ExtraImages 文件夹中的 png 或 jpg 的名称
imageSizeFloat[extraImage] 的世界单位大小,较小的坐标在保持纵横比的情况下计算。可用宽度
headerInteger标题级别。1 表示双倍文本大小,并从那里递减
sizeInteger文本大小,是 18。使用 size 或 header 但不要同时使用
indentInteger缩进级别。0 表示文本将跟随图标,1 与所有图标的右侧对齐,每进一步是 30 单位
paddingFloat行之间的垂直填充,5 单位
colorString设置文本颜色,接受名称或 6/3 位 Web 颜色(例如 #FFA040)
separatorBoolean渲染分隔线而不是文本。只能与 color 和 size(线宽,默认 2)结合使用
starredBoolean用星号图标装饰文本 - 如果设置,它接收 color 而不是文本
centeredBoolean居中该行(并关闭自动换行)。对于 extraImage,启用裁剪到内容以平衡透明边框
iconCrossedBoolean在 icon 或 link 图像上绘制红色 X

来自 json 的行将"包围"自动生成的行,使得后者刚好插入在第一个带有链接的 json 行上方(如果有)。如果没有 json 行有链接,它们将插入在自动标题和自动信息之间。然而,此方法将来可能会更改。

注意:text 现在也支持内联颜色标记。插入 «color» 开始为文本着色,«» 停止。color 可以是名称或 6/8 位十六进制符号,如 #ffa040(与 color 属性符号不同仅在于不允许 3 位代码,但允许 alpha 通道)。 实际上,«» 标记在翻译_之后_被替换为 [],然后传递到 gdx 标记语言。

注意:在模组中使用 ExtraImages 文件夹直到版本 4.11.5 才能正常工作。

RGB 颜色列表 ​

某些对象可以指定具有自己的独特颜色。颜色由以下顺序的 3× Integer 列表定义:红色、绿色、蓝色。颜色范围从 [0, 0, 0](黑色)到 [255, 255, 255](白色)。

注意:某些对象的默认值是 gdx 颜色类。常量的值如下:

名称值
gold[225, 215, 0]
white[255, 255, 255]
black[0, 0, 0]