Skip to content

商店与合成

在冒险中,收集材料并将它们合成为有用的道具是常见的玩法。ADVMaker 提供了商店/合成系统,允许你定义“配方”(Goods),玩家可以通过消耗指定数量的其他物品来获得该商品。

在游戏中,玩家通过菜单栏中的商城选项进行操作,你也可以通过调用 void Adv.showShopPanel() 自动打开。

其异步形态 await Adv.showShopPanel() 会阻塞程序直到用户关闭面板。

声明一个商品

你可以使用 defineRecipe 函数中声明商品配方,其结构如下:

typescript
Adv.defineRecipe('Water', {
    need: { Herb: 2 },
    default: 10,
})
  • 外层的 HealthPotion 是商品的唯一 ID,请填写该配方的获得物(是一个物品)的 ID。此物品必须在全局配置中在 items 中定义。
  • defaultneed 是商品的核心配置项,下文逐一说明。

配置项详解

need

类型:一个对象或一个由对象组成的数组,每个对象都是一组需求映射。

need 定义了合成该商品时必须消耗的原材料及其数量。配置项必须不为空,否则框架会报错。

请注意,原材料和产物必须在 items 中声明。

  • 单个需求组:当 need 直接填写一个对象时,表示只需要这一组材料。例如:

    typescript
    need: { Water: 2, Herb: 1 }

    表示合成需要消耗背包中的 2 个 Water1 个 Herb

  • 多个需求组:当需要提供多种可选的合成配方时,可以将 need 填写为一个数组。玩家只需满足其中任意一组需求即可合成。例如:

    typescript
    need: [
        { Gold: 50 },
        { Wood: 15, Stone: 10 },
    ]

    表示可以用 50 金币购买,或者用 15 木材 + 10 石头来兑换。

  • 带有 id 的需求组:当需要辨识哪一个需求组时,可以为需求组添加一个 id 属性,例如:

    typescript
    need: [
        { Gold: 50, id: 'MainRecipe' },
    ]

程序在内部会将单个需求组自动包装为数组,因此你可以放心地使用两种写法。

default

类型number,默认值为 Infinity

default 表示该商品在游戏中的默认总库存数量。每当玩家成功合成一次,库存就会减少 1。当库存归零时,该配方将无法继续使用。

如果你希望某种道具可以被无限次合成(例如基础药水),可以省略 default 属性,它将默认为 Infinity;如果希望商品是限量供应的(例如传奇武器),就设置一个具体的数字。

读取与修改库存值

游戏运行时,你可以通过 Adv.goods 来读取或修改任意状态属性。

读取当前值

typescript
// 获取生命值
const current = Adv.goods.Water;
console.log(current); // 80

修改当前值

直接赋值即可更新状态。界面会自动刷新。若设置为负值,则表示隐藏商品。

typescript
// 将库存设置为 10
Adv.status.Water = 10;

// 下架 15 件物品
Adv.status.Water -= 15;

增加/删除配方

使用以下代码获取配置对象

typescript
Adv.recipeControl('Water');

该函数会返回一个 ADVRecipeController 类型对象,其拥有以下方法:

typescript
removeRecipe('MainRecipe')

此方法用于删除物品的一个配方,其参数为配方的 id。

你不应该让一个商品没有配方,这样会让框架报错。

typescript
defineRecipe(
    { Wood: 15, Stone: 10 },
    { Gold: 50, id: "co-recipe" },
)

此方法用于增加一个配方,可以使用逗号分隔增加多组配方。

如何在游戏中使用

配置完成后,玩家可以通过游戏内的菜单栏进行购买。购买后会自动加入背包。