季节 Seasons
季节由世界的季节组件推进,按秋季、冬季、春季、夏季循环,并同时影响昼夜分配、环境温度、降雨与积雪,以及部分生物和首领的活动。默认友好世界中,秋季和春季较长,冬季和夏季较短;实际长度还会受世界设置影响。
季节长度与推进
季节组件 scripts/components/seasons.lua 按 autumn → winter → spring → summer 的顺序循环。默认长度由以下平衡常量提供:
| 季节 | 默认长度 |
|---|---|
| 秋季 | 20 天 |
| 冬季 | 15 天 |
| 春季 | 20 天 |
| 夏季 | 15 天 |
季节长度在运行时存入世界状态;每经过一个世界日,当前季节的剩余天数减少,归零后切换到下一个启用的季节。季节组件支持 cycle、endless 和 always 三种模式:正常循环会按启用季节轮换;只启用一个季节时,组件会使用永久季节相关逻辑;世界设置改变季节长度后,当前季节的剩余时间会按当前进度重新计算。
季节切换并不只在边界瞬间改变环境。温度和降雨组件读取 seasontick 的 progress,因此季节中的温度、降雨等效果会随季节进度渐变。秋季和春季在新世界开始时会以中段进度初始化相关环境数据,以避免开局立即处于极端天气状态。
昼夜分配
每个季节仍由总计 16 个时钟格组成,但白天、黄昏和夜晚的比例不同。默认分配为:
| 季节 | 白天 | 黄昏 | 夜晚 |
|---|---|---|---|
| 秋季 | 8 格 | 6 格 | 2 格 |
| 冬季 | 5 格 | 5 格 | 6 格 |
| 春季 | 5 格 | 8 格 | 3 格 |
| 夏季 | 11 格 | 1 格 | 4 格 |
季节接近交替时,组件会在前后季节的时钟分配之间进行过渡,再将结果修正为总计 16 格。世界设置或其他系统可以修改季节时钟分配;因此表中的分配是源码内置的默认值,而非所有世界都不可变的固定规则。
温度与季节特征
环境温度由 scripts/components/worldtemperature.lua 计算,主要由季节温度、昼夜温度和噪声共同组成,之后还会应用世界温度倍率与基准偏移。季节温度的变化规律如下:
- 秋季:从夏季侧的交叉温度逐渐降向冬季侧的交叉温度。
- 冬季:以正弦曲线从冬季交叉温度降至环境最低端,再回升。
- 春季:从冬季交叉温度线性升向夏季交叉温度。
- 夏季:以正弦曲线从夏季交叉温度升至环境最高端,再回落。
源码中的交叉温度为 35 等 TUNING 之外的局部环境常量,实际温度还会叠加昼夜项和随机噪声,因此不能仅用季节名称判断角色当前体感温度。夏季白天还会启用额外的夏季光照 bloom 效果;天气组件同时会在夏季生成花粉效果。
季节还会改变生存压力:冬季通常需要准备保暖、热源和防雪方案;夏季则需要降温、防自燃与灭火方案。worldtemperature.lua 中确认的过热阈值为 70,但角色是否过热还取决于体温组件、装备和环境位置。
降雨、湿度与积雪
降水由 scripts/components/weather.lua 根据季节进度、当前湿度和温度决定。四季的降水趋势不同:
- 秋季:降水处于中等范围,湿度变化较温和。
- 冬季:降水可能转为降雪;季节开始阶段会特别处理湿度速率,使早期更容易形成初始积雪。低于当前季节的开始降雪温度时,降水类型会选择雪;温度升过停止降雪温度后才会停止积雪效果。
- 春季:湿度和降水速率最高,连续降雨更容易使角色潮湿;源码还将春季的植物生长倍率设为 0.75。
- 夏季:降雨速率较低,且在季节中段进一步降低;夏季降雨会带来额外的降温项 -20,但不能替代完整的降温装备与热源管理。
天气组件会把季节状态转换为世界状态中的 precipitation、israining、issnowing、snowlevel、wetness 等变量。下雨会增加潮湿;不下雨时,干燥速度还受温度影响。冬季在低于冻结温度时有专门的快速干燥分支,不能简单地把四季的干燥速度视为相同。
生物、资源与世界事件
季节通过 worldstate 向实体广播 season、isautumn、iswinter、isspring、issummer 以及当前季节进度,许多系统据此切换行为:
- 冬季会影响鸟类变体、企鹅相关行为、鹿群迁移,以及冬季惊喜和礼物袋等冬季生成系统。
- 春季会触发
moose巢穴初始化;春季还会改变蜜蜂、捕蝇草和部分植物相关行为。 - 秋季、冬季、春季和夏季会使用不同的树木、蘑菇、植物或资源再生逻辑;是否再生取决于具体实体代码,而不是所有资源都遵循同一套季节规则。
- 世界状态同时记录
elapseddaysinseason、remainingdaysinseason和seasonprogress,实体可以据此在季节开始、季节中段或季节末执行一次性事件。
月岛冰雹等特殊天气属于独立的降水类型,不应与普通四季降雨或冬季降雪混为一谈;worldstate.lua 将它单独暴露为 islunarhailing。
季节首领与准备
首领的出现通常由各自的生成组件控制,并不只是“进入某季节就立即生成”。当前源码确认的主要季节关联如下:
- 独眼巨鹿:
deerclopsspawner.lua的默认条件要求世界度过保护期,并且当前季节为冬季;组件会选择符合条件的玩家和附近建筑作为目标,再通过计时器安排攻击。准备重点是冬季保暖、战斗空间和建筑保护。 - 熊獾:
beargerspawner.lua在秋季季节事件中更新生成机会,并要求世界度过保护期;秋季开始时会重算相关生成数量。准备重点是把战斗引离基地,并预留处理其破坏建筑行为的空间。 - 麋鹿鹅:
moosespawner.lua在春季状态开始且世界度过保护期后初始化部分巢穴,随后通过巢穴计时器安排生成。准备重点是春季高湿环境下的移动与战斗,以及避免把巢穴和基地布局混在一起。
源码中的保护期统一引用 26;不同首领仍有各自的计时器、生成机会和目标选择逻辑,不能据此推断每个首领必定在季节开始当天出现。实际准备应在对应季节前完成:冬季先准备保暖与热源,春季准备防雨和战斗场地,秋季准备基地防破坏与首领引导路线。
世界状态与代码参考
季节组件通过 seasontick 事件发布当前季节、进度和剩余时间;worldstate 接收后更新以下可观察变量:
season:autumn、winter、spring或summer。isautumn、iswinter、isspring、issummer:对应季节布尔值。elapseddaysinseason、remainingdaysinseason、seasonprogress:季节进度数据。autumnlength、winterlength、springlength、summerlength:当前世界设置下的季节长度。
主要代码依据:
scripts/components/seasons.lua:季节顺序、长度、推进、模式和昼夜分配。scripts/components/worldstate.lua:季节事件到世界状态变量的转换。scripts/components/worldtemperature.lua:季节温度曲线、昼夜温度和夏季 bloom。scripts/components/weather.lua:季节降雨、降雪、湿度、积雪和降水类型。scripts/components/deerclopsspawner.lua:独眼巨鹿的季节条件。scripts/components/beargerspawner.lua:熊獾的秋季生成条件。scripts/components/moosespawner.lua:麋鹿鹅的春季巢穴初始化。scripts/tuning.lua:季节长度、温度、降雨和相关平衡常量。
独眼巨鹿
熊獾