Mod 开发 -- 星露谷中的动态条件 Condition

Mod 开发 – 星露谷中的动态条件 Condition

前言

最近写了一个自定义生产模组, 需要用到如下功能

  1. 用到一个随机数, 当 roll 点到达界限值产出特定产物
  2. 产出对应季节的季节种子,
  3. 在齐先生飞机事件后产出谜之盒
  4. 在绿雨事件之后产出苔藓

机器应该 patch 到 Content\Data\Machines 中, 对应的 C# 代码解析应该在StardewValley.GameData.Machines.MachineData 中, 翻阅所有的使用用例, 发现作者只有用到了 RANDOM 这个检查, 对应的方法 StardewValley.GameStateQuery.DefaultResolvers.RANDOM, 对应的所有函数初始化注册在 StardewValley.GameStateQuery..cctor

使用

随机数

这里直接使用 RANDOM 0.5 达到 50% 的几率数

季节

这里直接使用 SEASON Spring 达到春节检查, 对应的枚举值在 StardewValley.Season

组合

StardewValley.GameStateQuery.Parse 方法中, 解析多重条件是在 StardewValley.GameStateQuery.SplitRaw 中, 以逗号分割 , 解析条件可以支持以感叹号修饰的非条件

齐先生事件

在游戏源码中, 事件代码在 StardewValley.Events.QiPlaneEvent 中, 可以看到持久化相关的代码行为 Game1.player.mailReceived.Add("sawQiPlane"); 因此搜索内部条件函数, 可以找到 StardewValley.GameStateQuery.DefaultResolvers.PLAYER_HAS_MAIL , 对应 Game1.player.mailReceived.Add("sawQiPlane") 的代码行是 case "received": return target.mailReceived.Contains(mailId); 因此, 这里的检查就为: PLAYER_HAS_MAIL Host sawQiPlane received

最终总和

功能检查最终汇总为: RANDOM 0.5,SEASON Spring,PLAYER_HAS_MAIL Host sawQiPlane received

对于苔藓事件, 可以检查格斯的当天邮件, 在 Content\Data\mail, key: GreenRainGus, 因此检查为 RANDOM 0.5,PLAYER_HAS_MAIL Host GreenRainGus received

使用

最终效果见 Nexus

另见

Resources Generators