商店与合成
在冒险中,收集材料并将它们合成为有用的道具是常见的玩法。ADVMaker 提供了商店/合成系统,允许你定义“配方”(Goods),玩家可以通过消耗指定数量的其他物品来获得该商品。
在游戏中,玩家通过菜单栏中的商城选项进行操作,你也可以通过调用 void Adv.showShopPanel() 自动打开。
其异步形态 await Adv.showShopPanel() 会阻塞程序直到用户关闭面板。
声明一个商品
你可以使用 defineRecipe 函数中声明商品配方,其结构如下:
Adv.defineRecipe('Water', {
need: { Herb: 2 },
default: 10,
})- 外层的
HealthPotion是商品的唯一 ID,请填写该配方的获得物(是一个物品)的 ID。此物品必须在全局配置中在items中定义。 default和need是商品的核心配置项,下文逐一说明。
配置项详解
need
类型:一个对象或一个由对象组成的数组,每个对象都是一组需求映射。
need 定义了合成该商品时必须消耗的原材料及其数量。配置项必须不为空,否则框架会报错。
请注意,原材料和产物必须在 items 中声明。
单个需求组:当
need直接填写一个对象时,表示只需要这一组材料。例如:typescriptneed: { Water: 2, Herb: 1 }表示合成需要消耗背包中的 2 个 Water 和 1 个 Herb。
多个需求组:当需要提供多种可选的合成配方时,可以将
need填写为一个数组。玩家只需满足其中任意一组需求即可合成。例如:typescriptneed: [ { Gold: 50 }, { Wood: 15, Stone: 10 }, ]表示可以用 50 金币购买,或者用 15 木材 + 10 石头来兑换。
带有 id 的需求组:当需要辨识哪一个需求组时,可以为需求组添加一个 id 属性,例如:
typescriptneed: [ { Gold: 50, id: 'MainRecipe' }, ]
程序在内部会将单个需求组自动包装为数组,因此你可以放心地使用两种写法。
default
类型:number,默认值为 Infinity。
default 表示该商品在游戏中的默认总库存数量。每当玩家成功合成一次,库存就会减少 1。当库存归零时,该配方将无法继续使用。
如果你希望某种道具可以被无限次合成(例如基础药水),可以省略 default 属性,它将默认为 Infinity;如果希望商品是限量供应的(例如传奇武器),就设置一个具体的数字。
读取与修改库存值
游戏运行时,你可以通过 Adv.goods 来读取或修改任意状态属性。
读取当前值
// 获取生命值
const current = Adv.goods.Water;
console.log(current); // 80修改当前值
直接赋值即可更新状态。界面会自动刷新。若设置为负值,则表示隐藏商品。
// 将库存设置为 10
Adv.status.Water = 10;
// 下架 15 件物品
Adv.status.Water -= 15;增加/删除配方
使用以下代码获取配置对象
Adv.recipeControl('Water');该函数会返回一个 ADVRecipeController 类型对象,其拥有以下方法:
removeRecipe('MainRecipe')此方法用于删除物品的一个配方,其参数为配方的 id。
你不应该让一个商品没有配方,这样会让框架报错。
defineRecipe(
{ Wood: 15, Stone: 10 },
{ Gold: 50, id: "co-recipe" },
)此方法用于增加一个配方,可以使用逗号分隔增加多组配方。
如何在游戏中使用
配置完成后,玩家可以通过游戏内的菜单栏进行购买。购买后会自动加入背包。