素人が RPG のようなものを作ってみる 1

小さな王様と約束の国 (以下 FFCCLK) に触発されて似たようなゲームを作ってみたいと思った次第。

もっとも、今回作るのはプレイヤーが主人公を操作するのではなく、FFCCLK 同様、所謂 NPC を冒険に派遣して結果を待つだけのものを想定しているので、RPG と言うよりは冒険者派遣業シミュレーションとでも呼ぶべきかも知れないが、しかし、システム的にはプレイヤーが操作できない点を除けば世間一般で言う RPG に近いものになるだろうとの思い込みにより、ここでは RPG と強弁することにする。

一応不定期連載の予定ではあるが、私は無計画であることと飽きっぽいことでは特に定評があるので、完成は期待するだけ無駄であることを予めご了承願いたい。


RPG の真髄は戦闘にあり。WizardryNetHack には美麗なグラフィックや重厚な物語など付随していないが、これらコンピュータ RPG の始祖が今なお名作の評価を受けていることは広く知られている通りである。などと知ったかぶったようなことを言うつもりはなく、単にその方面への関心もスキルもないから手を出す気がないだけなのは言うまでもない。というか前に書いたな確か。


ではまず戦闘に必要なものを用意しよう。自分と敵だ。武器や魔法の種類などの余計な装飾は今は考える必要はない。私は RPG 開発のノウハウなどこれっぽっちも持ち合わせてはいないまったくの素人なので、いきなり凝ったことをやろうとすれば直ちに破綻するのは目に見えている。まずは最低限度、双方が交互に素手で殴り合う仕組みを作るところから始めたい。

  1. 先攻決定
  2. 先攻の攻撃
  3. 後攻の生存判定
  4. 後攻の攻撃
  5. 先攻の生存判定

ターン制の場合、大まかな流れはこの繰り返しである。両者に必要なパラメータは体力、攻撃力、防御力、敏捷度といったところか。これに便宜上名前を加える。attr_accessor はなるべく使わないのが好みだが、後で直せば済むことなので今は開発効率を優先。

class Character
  attr_accessor :name, :life, :power, :toughness, :fleetness
end

この辺で既に英語が怪しいが気にせず先に進む。

先攻はどうやって決めようか。両者の敏捷度を元にある程度のランダム性を加味した値を比較するところまでは普通に思い付くとして、問題は誰が判定を下すか。もちろん判定クラスだよな。

class Judge
  def initialize(a, b)
    @a, @b = a, b
  end

  def resolve
    @diffence, @offence = [@a, @b].sort{|a, b| fleetness(a) <=> fleetness(b)}
    puts "offence: #{@offence.name}"
  end

  def fleetness(c)
    c.fleetness + rand(c.fleetness) * 0.5
  end
end

補正は適当に、最大で 1.5 倍弱 *1 としてみた。では早速試してみよう。敏捷度 20 の adventurer 君と敏捷度 22 の monster 君に、10 ターンほど先手の取り合いをやってもらった。ドライバが雑なのは目をつぶって欲しい。

a = Character.new
a.name = 'adventurer'
a.nimbleness = 20

b = Character.new
b.name = 'monster'
b.nimbleness = 22

j = Judge.new(a, b)

1.upto(10) do
  j.resolve
end

結果はこちら。

offence: monster
offence: adventurer
offence: monster
offence: monster
offence: monster
offence: monster
offence: adventurer
offence: monster
offence: adventurer
offence: monster

まあまあか。


*1:rand の戻り値は 0 〜 (引数 - 1)