RPGでMoose、その5:所持金

RPGMoose、その5:所持金

 RPGと言ったらアイテムの売買――なんだけど、長くなりそうだったのでまずは所持金のこと。

 設定が「現代日本退魔もの」なので、通貨は「円」です。

 ……が、それだといろいろと不都合があったので、「裏通貨」として「ビット」を設定しました。ネーミングがどうかと思うけど、当時としては他に思いつかなかったのです。

 ゲーム内でのアイテムの売買は基本的に「ビット」のみを使うことにしたんだけど、シナリオの都合とか一般的に売られているものは「円」でも売買できるようにしてました。

package TG::PC;
use Any::Moose;

# 所持金(円)
has 'yen' => (
  is => 'rw',
  isa => 'Int',
  writer => "_set_yen",
);

sub add_yen {
  my $self = shift;
  my($money) = @_;

  $self->_set_yen($self->yen + $money);

  # $money円入手しました。
  # $money円失いました。
  my $msg = ($money > 0)? "add_yen": "sub_yen";
  $pc->append_message($msg, abs($money));
}

#所持金(ビット)
has 'bit' => (
  is => 'rw',
  isa => 'Int',
  writer => "_set_bit",
);

sub add_bit {
  my $self = shift;
  my($money) = @_;

  $self->_set_bit($self->bit + $money);

  # $moneyビット入手しました。
  # $moneyビット失いました。
  my $msg = ($money > 0)? "add_bit": "sub_bit";
  $pc->append_message($msg, abs($money));
}

sub charge_bit {
  my $self = shift;
  my($bit) = @_;

  my $exchange_rate = $self->exchange_rate;
  my $yen = $bit * $exchange_rate;

  if ($yen > $self->yen) {
    $bit = int($self->yen / $exchange_rate);
    $yen = $bit * $exchange_rate;
  }

  $self->_set_yen($self->yen - $yen);
  $self->_set_bit($self->bit + $bit);

  $self->append_message("pay_yen", $yen);
  $self->append_message("get_bit", $bit);
}

sub exchange_rate {
  my $self = shift;
  TG::Trun->new($self->turn)->exchange_rate();
}

1;

 所持金未満になりうるようになってるのは、それで不都合が生じないため。

 基本的に所持金が減るのはアイテムの購入かクラスチェンジくらいで、そちらについてはそれぞれでチェックしているために問題は起こらない。

 上記(add_yen, add_bit)が呼び出されるのはシナリオ上で増減する時であり、所持金が減るようなシナリオは作らないように指導していたため(そういうシナリオはよほど上手く作らないとプレイヤーが不満をもつから)、マイナス値で呼び出されることはほとんどなかったのです。

(なので、今ウェブゲームとして作るならマイナス値にならないように変更するかもしれない)

 ちなみに昔とあるゲームで「借金したら(マイナス値になったら)、ターンの終わりにアイテムを売却する」という恐ろしいルールをリクエストされてシステムに組み込んだことがあります。

 「円」から「ビット」への両替は可能にしてました。それを「チャージ」と呼んでいるのは、ビットへの一方通行であるからと、当時ちょうどSuicaのサービスが始まったため*1

(したがって、キャラクター達はSuicaのようなカードを所持していて、それでアイテムなどを売買している設定だった)

 交換レートはゲームの進行に合わせて調整する予定だったので、ターン毎に設定するようにしていたので上記のようになっていますが、結局活用しなかったような気もします。

*1:ただし、当時はまだ電子マネー機能はなかった。