维护提醒

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.weatherGame1.weatherForTomorrow 等字段现在都是字符串型的,且可以支持自定义模组天气 ID。原版天气的变化对于 Content Patcher 内容包并无影响,因为新的天气 ID 能够自动匹配 Content Patcher 使用的旧版天气 ID(例如 SunRainSnowStormWind)。C# 模组也可以使用 Festival 天气,而 Content Patcher 只能对此使用 SunGame1.weather_sunny 等常量现在有了新的字符串值(Game1.legacy_weather_sunny 等常量用于旧版数值)。

游戏本体会将无效天气视作晴天。C# 模组可以通过 UpdateTicked正常的 SMAPI 时间来实现自定义天气效果,也可通过修改 Game1.ApplyWeatherForNewDayGame1.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 事件前)。

游戏遵循如下步骤来决定次日的天气和落花/落叶:

  1. 对于每个地点,加载新的一天可能天气。该值早在当天开始时就已经被设置了。
  2. 检查强制天气
  3. 若新的一天为婚礼,则将天气设为 Wedding
  4. 同步每个地点的 WeatherForTomorrow 字段。
  5. 基于是否有雨设置 Game1::wasRainingYesterday
  6. 清空落花落叶数组。
  7. 重置所有天气标识,并按如下方法重新设置:
    1. 若即将下雨,将下雨标识设为 true(不包括绿雨)。
    2. 若即将绿雨,将绿雨标识设为 true。
    3. 若即将暴风雨,将下雨和暴风雨标识设为 true。
    4. 若即将刮风,将刮风标识设为 true。
    5. 若即将下雪,将下雪标识设为 true。
  8. 准备新的一天的下一天的可能天气:
    1. 默认为 Sun
    2. 若新的一天的下一天为主动节日,则将天气设为 Festival 并返回;
    3. 若新的一天的下一天为被动节日,则将天气设为 Sunny 并返回;
    4. 应用地点上下文数据中随机化的天气条件来获取一个可能的天气。
  9. 对指定了 CopyWeatherFromLocation 的地点复制源地点的天气。
  10. 同步天气。
  11. 将所有天气标识应用于星露谷地区。
  12. 若为风天,填充落花落叶数组。
  13. 重置(每月第 1 天)或增加每个地点的 monthlyNonRainyDayCount
  14. 应用绿雨反应逻辑(例如,显示全局消息、送信等)。

此时设置天气的主函数已经运行完毕。

电视频道

电视会检查天气并显示如下信息:

天气 消息
Festival "明天将是个大晴天……对节日来说将是完美的天气!活动将在地点举行,将于时间之间开始。别迟到了!"

获取数据失败:"嗯……奇怪啊。我的信息表显示为“空”。真尴尬……"

Snow 等概率:
  • "都多穿点,各位,明天将会下雪!"
  • "明天的降雪可能会达到几英尺。"
Rain "明天全天有雨。"
GreenRain "呃……读数好像有点……异常……我……我不知道是什么意思……"
Storm "好像有场风暴正在接近。预计将会有雷电。"
Wind 根据条件:
  • 春季:"部分地区多云,并伴有微风。空气中会有大量花粉!"
  • 秋季:"今天多云,一整天都会狂风大作。"
  • 默认:"一整天都要下雪。一定要多穿些,伙计们!"
默认 等概率:
  • "明天天气晴朗,风和日丽!"
  • "全天都会风和日丽,万里无云。",

注意:除非节日、每月 1 日和春季 3 日外,电视在其他任何日子都不一定准确,这是由 Game1::newDayAfterFade 方法强制设置的。农场帮手(而不是房主)甚至可能无法准确获得每月 1 日和春 3 日的信息。

注 2:夜市等被动节日不被视为“节日”天气。实际上,所有被动节日都是“晴朗”天气。

天气图标

Game1::updateWeatherIcon 设置天气图标,该方法设置 LooseSprite/Cursors.xnb 中的索引:

  1. 下雪:7
  2. 晴天:2
  3. 婚礼:0
  4. 节日:1
  5. 下雨:4
  6. 暴风雨:5
  7. 春季风天:3
  8. 秋季风天:3
  9. 夏季:未定义(默认为晴天)
  10. 秋季:6
  11. 冬季:7(和下雪相同)
  12. 绿雨: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。
  • 您可以随时设置雪天和风天,只是游戏不会这样做。
  • 不能同时设置风天和雨天。