Mod 开发 -- 星露谷中的动态条件 Condition
Mod 开发 – 星露谷中的动态条件 Condition
前言
最近写了一个自定义生产模组, 需要用到如下功能
- 用到一个随机数, 当 roll 点到达界限值产出特定产物
- 产出对应季节的季节种子,
- 在齐先生飞机事件后产出谜之盒
- 在绿雨事件之后产出苔藓
机器应该 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