Hatena::ブログ(Diary)

NumericSteps

2012-07-17

ローグライクをつくる15のステップ

| 15:14

RogueBasinのHow to Write a Roguelike in 15 Stepsを適当に訳したメモ。
元記事はどちらかと言うと7DRLなどの小規模開発向けではあるものの、ゼロから創ってみたいという人には参考になるかも。
あるいはローグライクに含まれる要素のまとめと整理用。

Step 1 Decide to write a game(がんばるぞ!)

これを読んでいるほとんどの人は、この段階をすでに過ぎているのでしょう。しかし、ここで最初の一歩を踏み出すためのヒントをいくつか。オリジナルのローグライクを作りはじめる一番良い動機は、自分が遊んで楽しめるゲームを創りたいと思うことです。
決してローグライクとは何かを周りの人に尋ねたりしないことです。そんな必要はないのですから。たとえ、あなたが創ったゲームはローグライクではないと他人に言われたとしても、自分が楽しんで遊ぶことができるのであれば、それは成功といえるからです。これは決められた要求を満たすゲームを創る大会ではないのです。
計画を立てすぎないことです。もちろん、ある程度の計画を立てることは必要と感じるでしょうが、そこには必ず余裕を持たせましょう。でも、あらゆる状況を想定して計画するようなことはしてはいけません、無理ですから。設計書を書く際には、たくさんのことを決めなければいけないでしょう。その多くは、先にテストを書いて決めるのが、良い方法です。
ただ計画通りに制作を続けるのは楽しくありません。いくらかの改善できる余地を残しておきましょう。実装に失敗するのを恐れてはいけません。もし、柔軟に対応できない実装をしてしまったとしても、必要になった時に直せば問題ありません。そして、大抵の場合は、それでうまくいくものなのです。


Step 2 Hello world!(環境を整えよう)

開発環境を整えます。使用する言語とプラットフォームコンパイラインタプリタエディタ、バージョン管理、自動ビルド、その他に使うものを決め、快適な環境を用意しましょう。
使用するライブラリも決めてしまいます。これは、あとで変えることもできますが、変更の作業は大変かもしれません。移植性については考え過ぎないようにしましょう。あとで考えることもできます。自分にとって何が必要で、やりやすいかを考えてみて下さい。
ソースコード内のコメントや説明を書く際には、英語を使うとアドバイスを広く多くもらいやすくなります。*1
国際化については気にしなくても問題ありません。翻訳は大体、開発プロセスの後の方に行われます。
さあ、コードを書きはじめましょう。


Step 3 It's a boy!(画面表示とキー入力)

画面表示とキー入力から始めましょう。簡単に、画面のレイアウトを決め(あとで変えてもいいです)マップとキャラクター、ステータスやメッセージを出すルーチンを作ります。
キー入力を取得するルーチンを作成します(コンフィグファイルや、キーの再定義は使わないように)
@が何もない画面を歩きまわるデモを作りましょう。
メッセージを扱うルーチンを作成します、特にデバッグメッセージの部分はこれからよく使うことになるでしょう。


Step 4 The Map(マップとマップオブジェクト

マップの構造を考えます。汎化にとらわれ過ぎないようにしましょう。あとで追加することもできます。(空の)マップを画面に表示します。必要ならスクロールさせます。幾つかの要素をマップに配置して、正しく表示されるか確認しましょう(ハードコードで構いません。マップ生成は後で作成します)
@を画面に登場させます。スクロールのテストを行い、'look'コマンドを実装してみましょう。
@を動かせるようにしましょう。壁との当たり判定などを加えます。必要ならば、ドアやその開閉用のコマンドも作成します。

Step 5 Saving/Loading(保存と読み込み)

ハードコードにしていたマップのデータを、ファイルから読み込めるようにします。マップを可読性のあるものにしておくと、いろいろな設定を試すことができます。
ゲームの状態を保存するsaveコマンドを作ります。まずマップ、それからゲームに登場するすべての要素を保存します。ここから先、保存する必要がある要素を作成する際には、保存する部分をできるだけ先に作って下さい。
保存ファイルと保存の仕方についてはhttp://roguebasin.roguelikedevelopment.org/index.php/Save_Filesに詳しい記事があります。saveの仕様を決める際に一読してみて下さい。
ファイルに関する部分を作成したら、ゲームやキーの設定ファイルを作ることができます。ここを可読にしておくことで、いろいろな問題を避けられるでしょう。


Step 6 It's alice! Alive!(モンスターとターン制)

モンスターの配置と、ターンのシステムを追加します。モンスターを一体作り、単純なAI(話す、その場に留まる、ランダムに移動する)持たせます。
単純な先手/後手のターン制を作ってみましょう。それから、自分の考えたターンシステムを実装していきます(単純なものからはじめて、しだいに複雑化させます)
開発が進行するごとにテストすることを忘れないで下さい。


Step 7 Interaction(戦闘システム)

生物(プレイヤ/モンスター)たちにステータスを持たせます。できるだけ単純なものにしておきましょう。必要になった時に追加するようにするのが一番ですが、「かっこいいから」という理由で追加してしまうのもわからなくはないです。
複数のモンスターが、互いに影響し合うような動作を食わます。それぞれがぶつかったり、攻撃したりできるようにします。モンスターのAIを発展させていき、プレイヤーを追ってくるようになります。
戦闘システムの実装とテストを行います。装備については考えず、様々な値で試してみましょう。


Step 8 Data files(データファイル)

生物のデータやマップの設定などをデータファイルに移動してまとめておきます。現段階では移せないものはそのままにしておきましょう。


Step 9 Items(アイテム)

アイテムを加えます。まずは、ただ拾えるようなアイテムを作ります。それから、アイテムにステータスや特徴を増やしていきましょう。インベントリ*2を見る、アイテムを拾う、捨てるコマンドを実装します。アイテムを装備したり使用できるようにしましょう(まだ効果はなくてもいいです)。あなたが望むなら、複数所持や入れ物などを実装してください。
この段階ではバランスを取るテストが必要となってきます。


Step 10 Magic(アイテム効果と特殊攻撃)

アイテムの効果や、モンスターの特殊攻撃、呪文などを追加します。それらを追加したらテストをします。全ての効果をすぐに実装する必要はありません。とりあえず、次の段階に進める程度のものを用意しておきましょう。


Step 11 Simple game(テストプレイ)

ハードコードされたシンプルなゲームを創ることを心がけて下さい。友人に遊んでもらい、あなたが実装した部分についてテストを繰り返します。そしてそのゲームが楽しいかどうか確認してみて下さい。
変更する必要があると感じたところを直していきます。テストを繰り返すことを忘れないで下さい。面白さがどこにあるかを遊んだ人に聞いてみて下さい。あるいは、自分で遊んでみて考えて下さい。時には、遊んですぐには気づかないこともあるかもしれません。
このステップは長く取る必要があります。ここで、あなたが楽しく思えるミニゲームを完成させてください。


Step 12 Levels(階の生成と移動)

マップ生成システムを作ります。階の移動や全体/ローカルマップの切り替え、街への移動などを実装します。移動時に階の状態を永続に保存するようにすれば、メモリを使いきることもなくなります。
深さによってモンスターやアイテムの配置を変えられるようにします。さらに、新たなモンスターやアイテムを加え、その能力や効果も増やして行きましょう。


Step 13 Experience(成長とスキル

成長やスキルのシステムを作りこみます。モンスターとアイテムのステータスを調節していきます。キャラ作成画面をつくり、クラスや種族などを増やして行きましょう。
テストプレイを頻繁に行なっていきます。


Step 14 Citizens(店・クエスト・それ以外)

NPCや商人、クエストのシステムなど増やします。それ以外のシステムを拡張していきます。


Step 15 Free at last(あとは自由だ!)

一番最初に自分の考えたオリジナルの要素を実装し、テストします。自分のアイデアを、今作成しているゲームに合うように再構築していきましょう。
ついにあなたの考えたユニークなシステム*3が、ゲームの中で実際に動くことになるのです。

*1:英語の記事だから&オープンソース開発が前提。相談する相手に合わせてください。

*2:所持アイテムリスト

*3:元記事ではいくつか例が挙げられている。 pet random plot generator, factions system, infinite wilderness generator, neural network AIなどなど

トラックバック - http://d.hatena.ne.jp/countable/20120717/1342505647
Connection: close