
街机框架
一个依赖框架,用于将你自己的迷你游戏插入街机柜,包含共享票券钱包、高分榜和奖品兑换处。它提供C# API,以及一个添加了三个可玩游戏的工作示例。支持可选的Generic Mod Config Menu。本身不执行任何操作。
查看大图Arcade Framework
一个让 C# 模组能够在街机柜上注册自己的小游戏的框架,包含共享的票据钱包、高分榜和奖品兑换柜。这个模组本身不做任何事情,它是其他模组的依赖项。街机柜只是一种普通的大型可制作物品,你可以用任何你喜欢的方式添加它,例如使用 Content Patcher,或通过 C# 模组添加。这个框架只负责街机层,包括启动游戏、处理票据、分数和奖品。
需求
- 星露谷物语 1.6 或更高版本
- SMAPI 4.0.0 或更高版本
Generic Mod Config Menu 是可选依赖项。如果安装了它,它会为框架添加一个配置界面。
游戏
框架本身不附带任何游戏。游戏由使用该框架的模组提供。内容包可以将柜子绑定到此类模组注册的任何游戏 ID,而无需编写任何 C# 代码。捆绑的示例提供了三个可以开箱即用的游戏:tomokisan.timingbar、tomokisan.runner 和 tomokisan.memory(参见示例部分)。
面向 C# 模组作者
要与框架交互,请将 IArcadeFrameworkApi 和 IArcadeContext 接口复制到你的项目中。然后,在游戏启动后请求该 API。
var api = this.Helper.ModRegistry.GetApi<IArcadeFrameworkApi>("tomokisan.arcadeFramework");
api.RegisterGame("your.gameId", ctx => new YourGame());
RegisterGame 方法接受一个游戏标识符和一个工厂函数。工厂函数接受一个 IArcadeContext 并返回一个 StardewValley.Minigames.IMinigame。IArcadeContext 提供 Player、CabinetItemId 和 CostPaid。如果你不需要上下文,完全可以忽略它。
简单路径
创建游戏最简单的方法是继承 ArcadeGameBase。可以重写 UpdatePlay、DrawPlay、OnKeyDown、OnClick 和 OnStart 方法。在构造函数中,将游戏标识符传递给基类并设置 Title 属性。当游戏结束时,调用 EndGame 来传递分数和获得的票据。
提供了辅助方法。你可以使用 FillRect、DrawTextCentered 和 PlaySound。手柄支持是自动处理的。按 A 或 Start 开始游戏,A 键充当空格键,方向键充当箭头键,B 或 Back 退出。全屏布局通过传递给 DrawPlay 的边界矩形来处理。
高级路径
你可以直接实现 IMinigame。如果你选择这条路,必须在游戏结束时调用 api.SubmitScore 来记录分数和获得的票据。提醒一下,小游戏拥有自己的 sprite batch。你必须自己调用 Begin 和 End。ArcadeGameBase 会自动为你完成这些操作。
从 C# 注册柜子和奖品亭
你可以直接从 C# 代码注册柜子和奖品亭,而无需内容包。
- RegisterCabinet 接受一个符合条件的物品标识符、一个游戏标识符和一个票据费用。
- RegisterPrizeBoothFromJson 接受一个符合条件的物品标识符和一个 JSON 格式的奖品字符串。
自省与事件
你可以使用 IsGameRegistered 检查游戏是否已注册。使用 GetRegisteredGames 获取所有已注册游戏的列表。你还可以使用 AddGameEndedListener 添加监听器。监听器将收到游戏标识符、玩家标识符、分数和获得的票据。请注意,报告给监听器的票据是应用了票据倍率后的计入金额。
票据钱包和分数
票据和分数按玩家存储在玩家存档数据中。该数据在多人游戏中通过网络同步。游戏结束画面显示所有玩家的前三名排行榜。
- GetTickets 返回玩家的票据余额。
- AddTickets 向玩家余额添加票据。
- TrySpendTickets 尝试花费票据,如果成功则返回 true。
- GetHighScore 返回特定游戏和玩家的最高分。
面向内容包作者
框架的内容包可以包含一个 cabinets.json 文件和一个 prizes.json 文件。将柜子绑定到游戏不需要代码。柜子和亭子是普通的大型可制作物品,你可以用任何你喜欢的方式添加,例如使用针对 Data/BigCraftables 的 Content Patcher,或通过 C# 模组。框架只需要它们的符合条件的物品 ID。
柜子
cabinets.json 文件包含一个对象列表。每个对象需要 ItemId、GameId 和 Cost。一个柜子也可以使用 Games 数组列出多个游戏。Games 数组是游戏标识符的列表。如果提供了 Games 数组,点击柜子会显示一个游戏选择器。Cost 是每次游戏所需的票据。当费用大于零时,玩家会被要求在付费前进行确认。
包含多个柜子,以及一个提供多个游戏的柜子的示例:
[
{
"ItemId": "(BC)tomokisan.TimingBarCabinet",
"GameId": "tomokisan.timingbar",
"Cost": 0
},
{
"ItemId": "(BC)tomokisan.RunnerCabinet",
"GameId": "tomokisan.runner",
"Cost": 0
},
{
"ItemId": "(BC)tomokisan.MultiCabinet",
"Games": ["tomokisan.runner", "tomokisan.memory"],
"Cost": 5
}
]
奖品
prizes.json 文件定义奖品亭。每个对象需要一个用于亭子的 ItemId 和一个 Prizes 列表。每个奖品需要 ItemId、Count、Quality、Cost,以及可选的 Condition、OncePerDay 布尔值和 Stock。Condition 是一个 GameStateQuery。Stock 是每天的整数数量,其中 -1 表示无限。
示例:
[
{
"ItemId": "(BC)tomokisan.PrizeBooth",
"Prizes": [
{ "ItemId": "(O)MysteryBox", "Count": 1, "Cost": 10 },
{ "ItemId": "(O)395", "Count": 1, "Cost": 20 },
{ "ItemId": "(O)72", "Count": 1, "Cost": 50, "OncePerDay": true, "Stock": 1 }
]
}
]
配置
如果安装了 Generic Mod Config Menu,则可以使用配置界面。票据倍率选项可缩放玩游戏获得的票据。免费游玩选项使柜子和奖品无需花费任何票据。
控制台命令
- arcade_tickets [n] 打印当前玩家的票据余额,如果提供了参数,则添加 n 张票据。
- arcade_play 直接启动一个已注册的游戏。
示例
捆绑的示例展示了完整流程,并分为三个文件夹:
- [AF]arcadeFrameworkExample,一个注册了三个示例小游戏(Timing Bar、Runner 和 Memory,ID 为 tomokisan.timingbar、tomokisan.runner、tomokisan.memory)的 C# 模组。游戏就在这里;框架本身不附带任何游戏。
- [CP]arcadeFrameworkExample,一个 Content Patcher 包,添加了四种大型可制作物品:Timing Bar 柜、Runner 柜、Memory 柜和奖品亭。
- [AFdata]arcadeFrameworkExample,一个框架内容包,其 cabinets.json 将每个柜子绑定到其中一个游戏 ID(无需任何代码),其 prizes.json 填充奖品亭。
要在游戏中尝试,请添加大型可制作物品(例如使用控制台命令 player_add (BC)tomokisan.RunnerCabinet 1),放置它们并互动。使用 arcade_tickets 100 获取一些票据用于奖品亭。
我的模组: Arcade framework:一个依赖框架,可将你自己的小游戏挂载到街机柜上,包含共享的票据钱包、高分榜和奖品亭。它提供了 C# API,以及一个包含三个可玩游戏的工作示例。可选支持 Generic Mod Config Menu。本身不做任何事情。 This week in Pelican Town:打开电视,让当地新闻主播根据你自己的行为实时回顾你在山谷的一周。可与其他电视模组配合使用。 Interactive objects framework:一个模组框架,允许内容包和 C# 模组为任何大型可制作物品或家具附加交互菜单,包含条件、费用、冷却时间和效果。需要 Content Patcher 来创建物品。 SWAPI - Stardew Valley Web API:让你的游戏向自定义 Web 服务器发送事件。 highRollerSlots:为老虎机添加更高下注的可能性。 geodeCrusherPlus:为晶球粉碎机添加粉碎任何晶球的能力,包括谜之盒、文物宝藏和金色椰子。 TV Shopping channel:添加一个电视购物频道。 Prize Machine Custom Prizes:让你轻松完全自定义奖品机的奖品列表。 Better Statue Of Blessings:允许你每天从祝福雕像获得一次祝福,而不是每天只能获得一次祝福。 Custom Blessings Framework:允许模组开发者轻松地从祝福雕像添加祝福。 Custom Wake Up Time:让你配置每天的醒来时间。 Anti Tool Exhaustion:防止你因意外使用工具而变得筋疲力尽。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。