制作礼品交换所

笔者将在本章解说商店画面的改造方法。

我们会制作可以用某个变量的值当成持有金,以进行物品交换的「礼品交换所」作为范例。

定义常量

到目前为止的范例中,比方说要参考 7 号变量的值时,我们都是用 $game_variables[7] 这样的方式直接指定数字。这么做是为范例必须简单易懂为主要的考虑,然而一般的情况,如果某个变量之后会常常改变值,不要用 7 而是用常量的形式去定义会是较好的做法。

关于常量,就跟在 Vocab 模块章节中解说过的一样,只要以英文大写字母为开头定义变量名称就好,只是习惯上常常会全部字母都用大写。

这次我们要制作的商店的规格是,在 20 号开关为 ON 的状态时,呼叫一般商店时会变成「礼品交换所」,而且将以变量 20 的值当作持有的金额。

PRIZE_SHOP_SID = 20
PRIZE_SHOP_VID = 20

我们将开关 ID 省略成 SID、变量 ID 省略成 VID 的形式命名。这个定义直接写在类的定义的外部就好。如果要在不同的地方使用同样的数值的话,像这样先用常数来定义好,后面想要更改常量的值的时候,发生有地方漏掉更改这种失误的风险就会消失。

在实作商店之前,考虑到等等需要测试,麻烦先制作一个事件,让变量 20 增加到适当的值、开关 20 为 ON 的状态,并且会呼叫出商店。

更改指令

第一步是要将商店画面的[买入]指令名称改成[兑换],然后移除[卖出]指令。

而对应选择[买入]等指令的窗口的类是 Window_ShopCommand。

class Window_ShopCommand
  alias xxx001_make_command_list make_command_list
  def make_command_list
    if $game_switches[PRIZE_SHOP_SID]
      add_command("兑换", :buy)
      add_command("离开", :cancel)
    else
      xxx001_make_command_list
    end
  end
end

我们让它参考了刚才定义的常量,如果特定的开关变成了 ON,就会显示[兑换]、[离开]两个指令。关於 add_command 方法,因为笔者已经在制作剧情提示画面中解说过,内容应该很容易理解。由于我们要直接使用一般商店的购买处理,所以符号 :buy 的部分就不作改动。

更改金额的显示

在显示持有金的窗口中,我们改成显示一个变量的值。这件事情通过重新定义 Window_Gold 类的 value 方法就能办到。

class Window_Gold
  alias xxx001_value value
  def value
    if $game_switches[PRIZE_SHOP_SID]
      $game_variables[PRIZE_SHOP_VID]
    else
      xxx001_value
    end
  end
end

同样地,需要改变货币的单位的缘故,我们重新定义 currency_unit 方法。笔者假想的是赌场的情况,所以单位就用「枚」来显示。

class Window_Gold
  alias xxx001_currency_unit currency_unit
  def currency_unit
    if $game_switches[PRIZE_SHOP_SID]
      "枚"
    else
      xxx001_currency_unit
    end
  end
end

在这个窗口显示的变量值和货币单位,在选择商品或是输入购买个数的时候,会自动沿用下去。

更改购买的处理

实际上决定购买商品之后,会调用 Scene_Shop 类的 do_buy 方法。通过重新定义这个方法,我们能让系统不扣掉金币,而是减少变量的值。

class Scene_Shop
  alias xxx001_do_buy do_buy
  def do_buy(number)
    if $game_switches[PRIZE_SHOP_SID]
      $game_variables[PRIZE_SHOP_VID] -= number * buying_price
      $game_party.gain_item(@item, number)
    else
      xxx001_do_buy(number)
    end
  end
end

number 表示购买数量,@item 是购买的物品本身,buying_price 则是物品的单价。

在这边调用的 gain_item 则是 Game_Party 类的方法,进行增加所购买的物品指定个数到物品栏中的处理。

追加关闭时的处理

如同在解读篇的场景管理中解说的,场景类中备有用来进行「处理开始」和「处理结束」的方法。

这次我们要向下面一样重新定义处理结束的方法 terminate。

class Scene_Shop
  alias xxx001_terminate terminate
  def terminate
    xxx001_terminate
    $game_switches[PRIZE_SHOP_SID] = false
  end
end

如此一来,在关闭商店画面的时候,用来识别礼品交换所的开关会自动关闭。