BWIKI 全站将于 9 月 3 日(全天)进行维护,期间无法编辑任何页面或发布新的评论。
模组:天气数据
← 目录
此页面记录了游戏如何生成天气。
数据
字符串字段 Game1::weatherForTomorrow 决定了天气类型。可用的取值为:
取值 | 常量 | 天气 |
---|---|---|
Sun | weather_sunny | 晴天 |
Rain | weather_rain | 雨天 |
GreenRain | weather_green_rain | 绿雨 |
Wind | weather_debris | 风天 |
Storm | weather_lightning | 暴风雨 |
Festival | weather_festival | 节日 |
Snow | weather_snow | 雪天 |
Wedding | weather_wedding | 婚礼 |
算法
现在您可以通过编辑 地点上下文数据 来更改天气算法,也可以(使用 C# 模组)自定义天气。
Game1.weather 和 Game1.weatherForTomorrow 等字段现在都是字符串型的,且可以支持自定义模组天气 ID。原版天气的变化对于 Content Patcher 内容包并无影响,因为新的天气 ID 能够自动匹配 Content Patcher 使用的旧版天气 ID(例如 Sun、Rain、Snow、Storm 和 Wind)。C# 模组也可以使用 Festival 天气,而 Content Patcher 只能对此使用 Sun。Game1.weather_sunny 等常量现在有了新的字符串值(Game1.legacy_weather_sunny 等常量用于旧版数值)。
游戏本体会将无效天气视作晴天。C# 模组可以通过 UpdateTicked 等 正常的 SMAPI 时间来实现自定义天气效果,也可通过修改 Game1.ApplyWeatherForNewDay 或 Game1.populateDebrisWeatherArray 等方法来达成目的。
强制天气
特定日期总是有特定天气:
日期 | 天气 |
---|---|
春 1 日 | weather_sunny |
第 1 年春 2 日 | weather_sunny |
第 1 年春 3 日 | weather_rain |
第 1 年春 4 日 | weather_sunny |
夏 1 日 | weather_sunny |
夏 13 日 | weather_lightning |
夏 26 日 | weather_lightning |
秋 1 日 | weather_sunny |
冬 1 日 | weather_sunny |
绿雨只可能出现在夏 5、6、7、14、16、18、23 日。
主动节日(Data/Festivals 中的节日)的天气总是为 Festival,而被动节日(Data/PassiveFestivals 中的节日)的天气总是为 Sun。
生成天气
星露谷物语中的 Game1::newDayAfterFade() 负责设置天气(在变更日期代码后,但在 SaveEvents.BeforeSave 事件前)。
游戏遵循如下步骤来决定次日的天气和落花/落叶:
- 对于每个地点,加载新的一天可能天气。该值早在当天开始时就已经被设置了。
- 检查强制天气。
- 若新的一天为婚礼,则将天气设为 Wedding。
- 同步每个地点的 WeatherForTomorrow 字段。
- 基于是否有雨设置 Game1::wasRainingYesterday。
- 清空落花落叶数组。
- 重置所有天气标识,并按如下方法重新设置:
- 若即将下雨,将下雨标识设为 true(不包括绿雨)。
- 若即将绿雨,将绿雨标识设为 true。
- 若即将暴风雨,将下雨和暴风雨标识设为 true。
- 若即将刮风,将刮风标识设为 true。
- 若即将下雪,将下雪标识设为 true。
- 准备新的一天的下一天的可能天气:
- 默认为 Sun
- 若新的一天的下一天为主动节日,则将天气设为 Festival 并返回;
- 若新的一天的下一天为被动节日,则将天气设为 Sunny 并返回;
- 应用地点上下文数据中随机化的天气条件来获取一个可能的天气。
- 对指定了 CopyWeatherFromLocation 的地点复制源地点的天气。
- 同步天气。
- 将所有天气标识应用于星露谷地区。
- 若为风天,填充落花落叶数组。
- 重置(每月第 1 天)或增加每个地点的 monthlyNonRainyDayCount。
- 应用绿雨反应逻辑(例如,显示全局消息、送信等)。
此时设置天气的主函数已经运行完毕。
电视频道
电视会检查天气并显示如下信息:
天气 | 消息 |
---|---|
Festival | "明天将是个大晴天……对节日来说将是完美的天气!活动将在地点举行,将于时间之间开始。别迟到了!"
获取数据失败:"嗯……奇怪啊。我的信息表显示为“空”。真尴尬……" |
Snow | 等概率:
|
Rain | "明天全天有雨。" |
GreenRain | "呃……读数好像有点……异常……我……我不知道是什么意思……" |
Storm | "好像有场风暴正在接近。预计将会有雷电。" |
Wind | 根据条件:
|
默认 | 等概率:
|
注意:除非节日、每月 1 日和春季 3 日外,电视在其他任何日子都不一定准确,这是由 Game1::newDayAfterFade 方法强制设置的。农场帮手(而不是房主)甚至可能无法准确获得每月 1 日和春 3 日的信息。
注 2:夜市等被动节日不被视为“节日”天气。实际上,所有被动节日都是“晴朗”天气。
天气图标
Game1::updateWeatherIcon 设置天气图标,该方法设置 LooseSprite/Cursors.xnb 中的索引:
- 下雪:7
- 晴天:2
- 婚礼:0
- 节日:1
- 下雨:4
- 暴风雨:5
- 春季风天:3
- 秋季风天:3
- 夏季:未定义(默认为晴天)
- 秋季:6
- 冬季:7(和下雪相同)
- 绿雨:999
雨水图腾
雨水图腾(物品 #681)受控于 Object::rainTotem,此方法被 Object::performUseAction 调用。若明天为节日,则会消耗一个图腾但是什么也不会发生。否则,会消耗图腾并将明天天气设为 weather_rain 以及显示消息。
不同种类天气概率
本节介绍各种天气类型的概率。仅适用于非强制天气的日子。
晴天
晴朗天气涵盖了天气变量 0、4 和 6。
- 春季:下雨的基础概率为 18.3%(其他天气剩余概率为 81.7%)。如果不下雨,有 80% 的概率保持晴朗(除了春季第 3 天,这一天总是下雨)。这意味着春季晴朗天气的概率为 66.4%。
- 夏季:从夏季第 1 天的 87.4% 逐渐减少到夏季第 28 天的 79.9%,晴朗天气的概率每天稳步下降。每天的确切概率为 1 - [12% +(0.3% × 当月日期)],第 1 天的概率为 0%。
- 秋季:与春季相同,不考虑强制天气。
- 冬季:降水概率为 63%,因此晴朗天气的概率只有 37%。
下雨
- 春季:下雨的基础概率为 18.3%。如果下雨,除了第 1 年外,有 25% 的概率出现暴风雨。所以春季第 1 年下雨的概率为 18.3%,第 2 年或之后下雨的概率为 13.725%。春季第 3 天(第 1 年)总是下雨。
- 夏季:下雨天气的概率从夏季第 2 天的 12.6% 逐渐增加到夏季第 27 天的 20.1%。下雨变成暴风雨的概率为 85%。因此,你可以通过 [12% +(0.3% × 当月日期)] × 0.15 这个公式来确定下雨的概率。
- 秋季:与春季相同,但第 1 年的秋季可能会出现暴风雨,所以概率为 13.725%。
- 冬季:从不下雨。
风天
风天涵盖了天气变量 2。
- 春季:下雨后有 20% 的概率出现风天,所以风天的大致概率为 16.6%。
- 夏季:没有风天。
- 秋季:下雨后有 60% 的概率出现风天,所以风天的大致概率为 49.8%。
- 冬季:没有风天。
暴风雨天气
暴风雨天气涵盖了天气变量 3。
- 春季:出现暴风雨的概率为 4.57%。
- 夏季:暴风雨的概率是变化的;从 10.71% 开始,增加到 17.085%。
- 秋季:出现暴风雨的概率为 4.57%。
- 冬季:没有暴风雨天气。
下雪天气
在冬季,有 63% 的概率下雪。其他季节没有雪。
存档文件
存档文件是第二天早上 0600 时这一天的快照。WeatherForTommorow 字段用于计算天气,但更改它对天气没有影响,因为此时天气标识已经设置好了。要改变天气,您需要设置如下标识的组合:
天气 | isRaining | isDebrisWeather | isLightning | isSnowing | isGreenRain |
---|---|---|---|---|---|
晴天 | ☐ | ☐ | ☐ | ☐ | ☐ |
雨天 | ☑ | ☐ | ☐ | ☐ | ☐ |
暴风雨 | ☑ | ☐ | ☑ | ☐ | ☐ |
风天 | ☐ | ☑ | ☐ | ☐ | ☐ |
雪天 | ☐ | ☐ | ☐ | ☑ | ☐ |
节日 | ☐ | ☐ | ☐ | ☐ | ☐ |
婚礼 | ☐ | ☐ | ☐ | ☐ | ☐ |
绿雨 | ☐ | ☐ | ☐ | ☐ | ☑ |
注意: changing isDebrisWeather during an active game will not create the array. You'll need to call Game1::populateDebrisWeatherArray to get the debris populated. Correspondingly, if you're removing the debris weather flag, remember to call Game1::debrisWeather::Clear.
说明/问答
- 可以通过重写来修复电视,或者直接使用 Entoroax's Framework。
- 您可以随时设置雪天和风天,只是游戏不会这样做。
- 不能同时设置风天和雨天。