灌木绽放模组

创作者: ncarigon
已更新:2024-04-17 15:38:21
30KB

前置 MOD

使用 灌木绽放模组 时将自动安装

关于此 MOD

允许自定义灌木盛开的时间表,以适配你期望的季节、日期、地点和物品。
你喜欢在地图上到处跑、点一下彩色灌木就能白拿道具吗?想不想这种事多来点,而且拿到的不是“鲑鱼莓”和“黑莓”而是别的好东西?

我也是!

这个模组本身并不直接实现那个功能,但它能让你(或其他人)通过内容包让这个梦想成真。

这原本是为了让杜松果在我的另一个模组中开花而做的。 铜制蒸馏器 并逐渐演变为一个通用框架。

通用特性:
  • 创建你自己的灌木开花时间表;
  • 摇晃以甩掉你所选中的物品;
  • 支持多组日程同时启用;
  • 支持为每个日程自定义浆果纹理;
  • 支持自定义暴击几率;
  • 仅支持在特定位置绽放,可通过包含或排除设置;
  • 仅在特定天气下支持绽放效果,可通过包含/排除方式(或破坏现有绽放效果)实现;
  • 日程可以短至一日,也可长达整年。
  • 仅支持特定年份开花;
  • 仅支持在特定地块上绽放;
  • 允许其他模组检测自定义花期时间表;
  • 根据你的其他模组,打开或关闭某些功能的配置选项。
  • 内置支持 豪华抓取器 重制版 (尚未更新至1.6版本,暂不可用)
  • 内置支持 年鉴 (该功能将在1.6版本更新后启用)
  • 内置支持 自动执行 (自动化功能现已原生支持自定义甩脱物品)
  • *1.2.0 新增* 现在支持加载和/或编辑的内容 内容补丁 (示例模组请见压缩包)

配置选项:
你可以在游戏内编辑这些配置文件。 通用模组配置菜单 界面,或直接在 config.json 文件中设置。

启用默认泛光:(真|false) 启用游戏默认的春秋季灌木开花周期。禁用此选项不会影响游戏中的其他逻辑、收集包、任务或剧情。请自行承担风险!

春枝配夏景:( 悲)真|false) 默认夏季开花灌木没有浆果。此处复用春季灌木以适配夏季开花效果。若您使用了其他添加夏季浆果灌木素材的模组,请禁用此项。

使用自定义冬莓:(真|false) 默认的冬季开花灌木不存在。这里使用了自定义精灵图以适应冬季开花。如果使用了其他添加冬季开花灌木精灵图的模组,请禁用此项。
                   
支持豪华版抓取器 重制版:(true|false) 启用此模组后,抓取器可收获灌木丛中的自定义物品。

支持手册:(true|false)使用该模组时,允许年鉴显示自定义采集日程。启用后,强烈建议关闭该模组的“页面:本地通知”>“显示采集”选项,以免重复显示默认采集日程。


自动支援: (true|false) 使用此模组时,允许箱子自动收集灌木丛中的自定义物品。

内容包详情:
该模组包含一个 示例 包含 manifest.json、content.json 及 assets/berry.png 的目录。这些文件可作为创建额外内容包的模板。以下为 content.json 可包含内容的示例。

你也可以看看我的另一个模组,作为参考示例: 矿石浆果

示例完整日程配置:

[{ "id": "btn_start", "text": "开始游戏" }, { "id": "menu_title", "text": "主菜单" }, { "id": "dialog_greeting", "text": "欢迎回来!" }]
// 可选;若缺失则默认启用
"启用": true

    // 可选:默认值为 'Mod目录名/StartSeason_ShakeOff'
    "Id": "[BBM] 灌木开花示例/春_0"

// 必填;数值可以为物品ID或名称,但必须存在
"挣脱": 0

// 必需;值必须为“春”、“夏”、“秋”或“冬”
"StartSeason": "春天",

// 必填;数值必须在1至28之间
"开始天数": 1

// 可选;缺失时默认使用StartSeason的值
"EndSeason": "冬季",

// 可选;如缺失,默认值为开始日期(StartDay)
"结束日": 28

   // 可选;默认为第一年
   "起始年份":1

   // 可选:默认无年份
   "EndYear": 2

// 可选;若缺失则默认使用内置纹理
"纹理": "assets\\berry.png" 

    (可选参数;若缺失则默认为0.2;取值范围0.0至1.0)
    // 计算总体概率。若数值超过1.0,则
    // 确保物品必定绽放,无视已有绽放状态
    // 或其他可能的日程安排,除非其数值也大于1.0。
“几率”:0.2

// 可选;若缺失或为空,则默认为所有地点
"地点":[ "森林","山脉" ]

// 可选:若缺失或为空,默认无地点
"ExcludeLocations": [ "城镇" ],

   // 可选;若未填写或为空,则默认所有天气
   "天气": [ "雨天", "绿雨", "晴天", "大风" ]

   // 可选:如留空或缺失,默认无天气
   "ExcludeWeather": [ "暴风雨", "节日", "婚礼" ],

   // 可选:若缺失或为空,默认无天气
   "DestroyWeather": [ "雪" ]

    // 可选:仅在指定地块的灌木丛上产生开花效果。
    // 与特定“地点”设置搭配使用效果最佳
    // 为了让某批特定的灌木丛开花
    "图块": [
        { "X": 10, "Y": 20 }
        { "X": 23, "Y": 32 }
    ]
}] (翻译为空,或为保留方括号)


示例最小默认日程表:

[{ "categoryName": "优质" }]
"挣脱":296
"StartSeason": "春天",
"开始日": 15
"结束日": 18
}, {
"挣脱":410
"StartSeason": "秋季"
"开始日": 8
"结束天数":11
}] (注意:你提供的原文为“} ]”,这看起来像是语法错误或代码片段,可能是在复制时出现了格式问题。如果你希望我翻译的是其他内容,请重新发送完整的文本。)

Content Patcher 亦可用来修改日程或贴图,例如:

{
"格式版本":"2.0.0"
“变更”
{
// 此示例将修改现有的默认秋季黑莓
// 确保精灵心情极佳时触发绽放的时间安排
"Action": "编辑数据"
"NCarigon.BushBloomMod/Schedules" 的翻译结果为: 目标:灌木开花模组/日程
“字段”:{
// BBM 内容包中的条目 ID 将按以下格式显示:
// Mod目录名称/开始赛季_摆脱困境
// 除非在配置中指定了特定ID
"default/fall_410": "默认/秋日之落_410"
"几率": 1.0
}
}
**"当"**
// 也可以使用CP代币动态调整日程。
// 参考:https://github.com/Pathoschild/StardewMods/blob/develop/ContentPatcher/docs/author-guide/tokens.md
"查询: {{每日运气}} > 0.07": true // 今天心情特别好
}
}, (保留原样)
{
// 此示例将替换秋季黑莓开花结果的默认图像
"操作": "编辑图像"
"目标":"NCarigon.BushBloomMod/Textures/default/fall_410"
// 将绽放图案更换为其他图像
"FromFile": "assets/berry.png"
}
]
}

你还可以通过Content Patcher创建全新的日程,例如:

{
"Format": "2.0.0"
"变更"
{
"Action": "编辑数据"
"目标":"NCarigon.BushBloomMod/Schedules"
"条目":
// 这里的id应与默认值'ModDirectoryName/StartSeason_ShakeOff'保持一致
// 但实际上可以自定义任何内容,也可覆盖已有设置
// 通过使用相同ID来安排日程
"CPExampleBBM/spring_0": "春日之泉"
"挣脱": 0
"StartSeason": "春天",
"开始天数":1
}
}
}
{
"动作": "编辑图片"
"目标":"NCarigon.BushBloomMod/Textures/CPExampleBBM/spring_0"
"来源文件":"assets/berry.png"
}
]
}

关于日程ID生成:
当未提供日程ID时,默认将根据以下字段自动生成ID,示例如下:

Mod目录名称/开始赛季_振作精神
当多个排程生成了相同的ID时,从第二条记录起,每条后续记录的名称末尾将依次添加递增的后缀,例如:

Mod目录名称/季初震动_1
在通过 Content Patcher 动态修改日程时这一点尤为重要,因为你需要准确知道对应的 ID 才能进行修改。

集成详情:
如果你正在制作其他模组并希望与本模组的功能进行整合,请熟悉以下内容: Modding:模组开发者指南/API/集成

要在你的模组中引用此模组的逻辑,请在你的项目中创建以下接口,并包含你实际需要的特定方法:

公开接口 IBushBloomModApi
    您好,请您提供需要翻译的游戏文本内容,我会按照要求进行专业的本地化翻译。
返回所有可能处于开花期的(物品ID,开始日,结束日)数组
/// 根据指定的季节和日期安排日程,可选年份和/或地点。
/// </summary>
`GetActiveSchedules`(string 季节, int 日, int? 年 = null, GameLocation? 地点 = null, Vector2? 坐标 = null) 返回 (string, WorldDate, WorldDate)[]

    /// <summary>
    返回所有绽放计划的数组,每项包含(物品ID,开始日期,结束日期)。
    /// </summary>
    public (string, WorldDate, WorldDate)[] GetAllSchedules(); 获取所有日程();

    抱歉,您提供的内容中未包含需要翻译的文本。请粘贴具体内容。
    /// 清除并重新解析所有日程。
    /// </summary> (未提供具体待翻译文本,请补充需要本地化的内容。)
    重新加载日程表

    看起来您只提供了代码注释标记,没有包含需要翻译的具体文本内容。请提供待翻译的游戏文本,我会为您完成本地化翻译。
    /// 指定BBM是否成功解析所有时间表。
    /// </summary>
    public bool IsReady();

    /// <summary>
    /// 执行 Bush.shake() 函数的通用操作,不包含玩家与碎片相关逻辑
    ///以及UI逻辑。具体来说,当灌木丛处于开花状态时,此操作将返回物品ID并标记该灌木丛。
    /// 已不再绽放。你必须制作该物品并完成所有必要操作。
    /// </summary>
    public string FakeShake(Bush bush);
}


然后在你的 Entry 方法中调用该 API:

var bbm = helper.ModRegistry.GetApi<IBushBloomModApi>("NCarigon.BushBloomMod");
你需要更新草丛检测逻辑,加入API调用。

例如,若你原有的方法是:

private void 收获(灌木丛 bush) {
var season = (bush.overrideSeason.Value == -1) ? Game1.GetSeasonForLocation(bush.currentLocation) : Utility.getSeasonNameFromNumber(bush.overrideSeason.Value);
if (bush.size.Value == 1 && bush.inBloom(season, Game1.dayOfMonth)) {
var shakeOff = -1;
if (season == "spring") shakeOff = 296; // 美洲大树莓
else if (season == "fall") shakeOff = 410; //黑莓
if (shakeOff != -1) {
bush.tileSheetOffset.Value = 0;
Game1.player.addItemToInventory(new SObject(shakeOff, 1));
}
}
}


***全新*** 星露谷物语 1.6版本大幅简化此功能:

private void 采集(灌木 bush) {
    如果 (bbm 不为空) {
        var shakeOff = bbm.FakeShake(bush);
        if (shakeOff != null) {
            Game1.player.addItemToInventory(new SObject(shakeOff, 1));
        }
    } else {
        var season = (bush.overrideSeason.Value == -1)
            Game1.GetSeasonForLocation(bush.currentLocation)
            :Utility.getSeasonNameFromNumber(bush.overrideSeason.Value);
    if (bush.size.Value == 1 && bush.inBloom(season, Game1.dayOfMonth)) { ```
    var shakeOff = -1;
    if (season == "spring") shakeOff = 296; // 美洲大树莓
    否则如果(季节 == “秋季”)抖落数 = 410; //黑莓
    if (shakeOff != -1) {
    bush.tileSheetOffset.Value = 0;
    Game1.player.addItemToInventory(new SObject(shakeOff, 1));
    }
    }
    }
}


再举个例子,若要列出某日期的盛开物品,原始代码可能如下:

private IEnumerable<(Item, WorldDate, WorldDate)> GetBloomSchedules(Bush bush, WorldDate date)
如果(灌木.正值花期(当前季节,当前日期)){
id = -1
if (date.SeasonIndex == 0) id = 296; // 美洲大树莓
否则如果(date.季节索引 == 2)id = 410; // 黑莓
如果(id != -1) {
如果(当前日期为每月1号 或 灌木在前一天未处于开花期)
int last = date.DayOfMonth;
for (int d = date.DayOfMonth + 1; d <= 28; d++) {
如果灌木不在当前季节开花
中断;
last = d;
}
返回(新对象(ID,1),新世界日期(年:日期.年,季节:日期.季节,日:日期.当月天数),新世界日期(年:日期.年,季节:日期.季节,最后天数:最后))
}
}
}
}


而整合后的代码将如下所示:

private IEnumerable<(Item, WorldDate, WorldDate)> GetBloomSchedules(Bush bush, WorldDate date)
if (bbm 不为空) {
foreach (var sched in bbm.GetActiveSchedules(date.Season, date.DayOfMonth)) { 遍历 bbm 中当前季节与日期的所有活跃日程
生成返回(新物品(sched.Item1, 1),sched.Item2,sched.Item3)
}
} else if (bush.inBloom(date.Season, date.DayOfMonth)) {
id = -1
if (date.SeasonIndex == 0) id = 296; // 美洲大树莓
否则如果(日期.季节索引 == 2)则 id = 410;// 黑莓
如果(id 不等于 -1){
if (date.DayOfMonth == 1 || !bush.inBloom(date.Season, date.DayOfMonth - 1))
最后一天 = date.DayOfMonth
for (int d = date.DayOfMonth + 1; d <= 28; d++)
如果(灌木未在当季开花)
中断;
last = d;
}
返回(新SObject(id, 1),新WorldDate(date.Year, date.Season, date.DayOfMonth),新WorldDate(date.Year, date.Season, last))
}
}
}
}


请提供需要翻译的源文本。 ncarigon/星露谷物语Mod合集 (github.com)

我的模组:
铜制蒸馏器
花园盆 - 自动
尚可的作物
灌木开花模组
矿石浆果
树木摇晃模组
花盆选项

使用 Xmod 解锁 星露谷物语 的全部潜力 — 今天就探索这些顶级 MOD!