Overview
概要
1プレイ10〜20分の本格ローグライクです。rot.js等のライブラリを使わず、ダンジョン生成・視界計算・敵AIまで全ロジックを自前のTypeScriptで実装。描画はCanvas 2Dに等幅ASCII記号(@ # . g)を描く古典スタイルで、外部アセットはゼロ。ターン制でbump attack、満腹度やレベルアップを備え、地下15階のアミュレットを取って地上へ戻ればクリア、倒れれば終わりのパーマデスです。到達階・金貨・累計EXPからスコアを算出しランキングに記録します。
How to use
遊び方・使い方
矢印/WASD/vi(hjklと斜めyubn)で移動し、敵に向かって進むと攻撃(bump attack)します。ポーション・パン・武器・防具・巻物・金貨を拾って強化しつつ、満腹度を切らさないよう進行。視界は部屋と洞窟で変化し、一度見た地形は記憶されます。敵8種はそれぞれ追跡・ランダム・遠距離射撃・自然回復などの挙動を持ちます。地下15階のアミュレットを取得して地上へ帰還すればクリア。タッチ環境は8方向の仮想パッドで操作します。
Tech stack
技術スタック
TypeScriptNext.js 16React 19Canvas 2DTailwind CSS v4
追加npm依存はなく、地形レイヤーはオフスクリーンCanvasにキャッシュ。HUDのみuseSyncExternalStoreで公開し、盤面はReact外で描画します。効果音はWebAudioの矩形波・ノイズで手続き合成、OG画像はnext/ogで動的生成しています。
Highlights
工夫した点
- ダンジョンはBSPによる部屋型(再帰分割+L字通路+BFS接続性検証)とセルオートマトンによる洞窟型(45%壁初期化→平滑化→連結成分抽出)を階層で切替。乱数はシード再現可能なxorshift32を自作
- 視界は8オクタントの再帰シャドウキャスティングを純関数computeFovで実装し、可視セルはSet、探索済みはUint8Arrayで記憶マップを管理
- 敵AIはプレイヤー起点のDijkstraマップを毎ターン1回だけ計算して全追跡敵で共有し、遠距離型はBresenhamで射線を判定。ターン制ゆえにrAF常駐を避け、入力駆動の純関数reducerで状態遷移
To improve
改善したい点
- アイテム・敵・特殊床のバリエーションを増やし、戦略の幅を広げたい
- モバイルの仮想パッド操作の快適性に伸びしろがある
- スコアランキングはローカル保存で、オンライン比較には未対応
What's next
今後の展望
- 職業・種族やスキルなどビルド要素の追加
- アイテムの識別要素(未鑑定ポーション等)による探索の駆け引き強化
- 日替わりシード・チャレンジモードの実装
