RPGの道具を実装する-設計編

RPGの道具を設計します。
これまでと同じ部分は省略しながら検討します。

分析

道具の基本は使うということです。道具は何回も使えるものや回数に限りがあるものがあります。


[Item|count|use()]

道具として考えられるのは、薬、鍵、イベント用、魔法と同じ効果の道具、後はステータスを恒久的に上昇させる道具(○○の種とか)あたりでしょうか。
大抵の場合、戦闘中と移動中を区別する必要があります。戦闘中かどうかの状態は「場」としてのWorldに実装します。
また、道具の使用は大抵使用者の能力に依存せず道具自身の効能で効果が決まります。


[World|mode]<-.-[Item||canUse()]
[Creature]<>-[Item||use()]
[Item||use()]-to[Target]

使う

道具を使用する対象は戦闘中なら敵か見方もしくは空間です。今後の一般化を考慮すると対象は扉や壁などもありえます。
よってTargetはインターフェースとなりますが、JavaScriptで実装することを前提とすると拘る必要はないと思います。
で、道具の作用についてはやはりストラテジーに任せることにします。
また、道具の使用可否は戦闘中かどうかに加えて使用可能な対象化どうかも考慮する必要があります。薬草なら属性値としてHPを持たない対象へは使用できません。また回復系(例えば毒消し)なら回復するべき症状(例えば毒に侵されている)である必要があります。
ただし、ゲームデザインとして効果が無くても使用できる(『特に何も起こらなかった』として道具を消費させる)のならチェックの必要はありません。

ItemStg.prototype.use = function(to) {
    if( !this.canUse() ) {
        return false; //使用できない
    }
    to ;//効能はさまざま
}

攻撃の実装でも検討しましたが、装備品も道具として使用できる場合があります。これは単純に考えるとItemを継承するかインターフェースを出すのですが、ここはもっとシンプルに装備オブジェクトにuse()メソッドを追加することにします。

薬草

簡単な例として薬草(herb)について検討します。薬草の作用は、対象のHPを一定量回復させることです。今回は対象の属性にHPが無かったり、HPがMAXなら使用できないことにします。

捨てる

道具のその他の要素ですが、捨てたり合成(錬金)したり、後は強化したりでしょうか。
とりあえず道具を捨てる場合について検討します。
道具は様々な理由で捨てられない場合があります(ゲーム上重要とか呪われているとか)。この責務もItemに持たせることにします。そして例によってStrategyに委譲します。

[Item||canDrop()]-[ItemStg||canDrop()]

また実際に「捨てる」のはCreatureに任せます。Creatureは同種の道具を複数保有しているかもしれません。その扱いはCreature自信に任せることにします。

[Creature||dropItem()]<>-[Item]

まあ道具の設計としてはこんなところでしょうか。

M. K. の紹介

IT屋さんです。プログラミングが大好きで今はJavascriptがお気に入りです。
カテゴリー: JavaScript, ゲーム作成   パーマリンク