なんて言ってはじめたわけなんですが、今のところ挫折せずにちょこちょこやってます。
ミニゲームに使えるくらいにはなったんじゃないかな?
ローグライクRPGですNetHackにインスパイアされてます。みなさんもっとNethackやりましょう。
http://ympbyc.github.com/coffeehack
viやLivedoor Reader, GmailやNetHackと同じくhjklで移動します。h-左, j-下, k-上, l-右です。一応矢印キーもサポートしてるはずなんですが、onkeypressでやってるのでブラウザによってはキーコードとれなくて使えないかもしれません。
階段では>で下に降り、<で上に上がります。
罠があります。びっくりしますので気をつけましょう。
白いマークがあるマスは、ニンジュツフィールドです。忍術のリストからランダムに選ばれたニンジュツを一つ使うことができます。回復の術、隠れ身の術、階層テレポートの術、周囲8マスの敵虐殺の術とかがあります。
挫折しないために、いくつか工夫したことがあります。手抜きポイントとも言います。
手抜きポイントその一 - マップの生成
http://racanhack.sourceforge.jp/rhdoc/index.html このページを見てやりました。id:mizchi さんとこに貼られてたやつです。Cのソースは読むの面倒くさかったので、雰囲気だけ感じ取って作りました。二次元配列に定数を格納してます。 手を抜いたのは道生成のところで、読んでもわけわかんなかったのでズルして区画線をほんとにそのまんま利用する手法を取りました。各部屋は真ん中からひとマス通路を延ばして区画線に突き当たることを期待してるだけです。
手抜きポイントその二 - アイテム、インベントリシステムがない
これをやろうと思ったらですね、もう一つマップサイズの二次元配列を作るか、そもそものマップのマスを配列にして3次元にしちゃうかしないといけないと思うんですよ。ひとマス1個ならもうちょっと楽かもしれないけど。 それからインベントリの表示とかアイテムの選択、重さの管理…とかやることが多いので、まずはアイテムシステム抜きで作り始めました。その代わりがニンジュツフィールドです。でもやっぱりアイテムがないと潜るモチベーションが湧かない気がするので、そのうち作ることになると思います。
手抜きポイントその3 - めんどくさかったらランダム
罠とニンジュツフィールドのことですね。これはマスに乗る度にランダムに選んでます。位置の固定は面倒くさいな、とまゆしぃは思うのです。
手抜きポイントその4 - 敵の移動
プレイヤーまでの最短経路の探索とかやってると遅くなりそうなので、プレイヤーがいる方向に進むだけにしました。なのでよく部屋の隅に引っ掛かったりします。1/3くらいの確率でランダム移動もするので、一応大丈夫かな
手抜きポイントその5 - ニンジュツや罠は、関数の配列
ニンジュツや罠の効果を実現するために、関数を配列に持っています. Gameクラスのインスタンスからは、ゲーム内のほとんどの情報にアクセスできるので、こいつを渡してやってごにょごにょさせます。ほんとだったらDSLとか使うところなんだと思います。
ninjutulist = [ { name : 'jistu of healing', jitsu : ((game) -> game.player.hp = game.player.getMaxHP()), description : 'heals your hp to the maximum', message : 'You spelled the jitsu of healing. You are fully recovered.' }, ... ]
手抜きポイントその6 - タイルは後付け
これは手抜きとはちょっと違うんですが… 内部は完全にキャラクタベースにしたかったので、タイルはこの文字列を見て後から張っつけたます。今のところは1キャラクタが1タイルに対応しているのでこの方法で問題は出てないです。
逆に手を抜かなかったポイントもちょっとだけあります。
手を抜かなかったポイントその一 - 経験値とか階層レベルとかモンスターの出現階層とか
ここらへんはしっかりやらないとゲームっぽさが出ません。地下0階でドラゴンはマズすぎます…
手を抜かなかったポイントその二 - タイル版
RogueやHackやNetHack, Dungeon CrawlやAngbandや変愚蛮怒なんかのキャラクタベースのゲームをやったことがない人でも取っ付きやすいようにタイル版を用意しました。タイル画像はNetHackのデフォルトのものを借用してます。多分パブリックドメインなんじゃないかと思ってるんですが違ったらやばいので知ってたら教えてください。 タイル領域の描画には最近流行のキャンバスを使ってます。めちゃくちゃ速いですね!1ターンごとに全部のマスを書き換えても動くレベルなんですが、さすがにそれはリソースの無駄遣いなので、変更があったマスだけを書き換えるようにしてます。
メッセージの分離
あとで日本語メッセージも作ろうと思ってるので、メッセージはハードコードせずに1~2ファイルにまとめておきました。
そんなかんじです。
ゲーム作るのって楽しいね!(これが初めてだったりします)
みんなももっとRPG作ろう!
というわけで。
Fork me on github !!