「のっぱらに楽園を作る神様の真似事」——EdenCodeのテーマをそのままショートRPGで体験させる。プレイ時間は5〜10分。難しくしない。むしろ死なない設計。ゆるくて愛嬌があって、最後はちょっといい話になってる、そんなゲームを1ファイルHTMLで作り切る。
主役は エデニー(Edeny)——自称勇者・金の亡者。相棒は クラナ(Clana)——AIエルフ・ツッコミ専門。なんだかんだ二人でボスを倒して、気づいたら英雄になってた、というコンセプト。
🏷️ ゲーム名 「Edeny Arcadia」〜のっぱらに楽園を〜
タイルマップ・カメラ・移動・バトル・スクリプトシステム
20×24タイル(TS=32px)のマップをゼロから設計。カメラはキャンバス中心にプレイヤーを追いかけて、マップ端でクランプ。移動はLERP(係数0.14)でぬるぬる滑らか。壁衝突はT.WALLタイルチェック。
統一スクリプトシステム runScript(lines, onDone) を最初に設計したのが最大の正解。宝箱・ツボ・看板・NPC・バトル後——全部同じ仕組みでセリフを流せる。
Web Audio BGM・SE・パーティクル・状況対応NPCセリフ
BGMはライブラリゼロ。Web Audio APIで音符データ配列をルックアヘッドスケジューラ(80msインターバル・0.3s先読み)で鳴らす自作シンセ。SE(攻撃・魔法・宝箱・撃破など)は全部 beep(freq, dur, vol, type) 1関数で完結。
パーティクルはワールド座標系で管理。重力あり・ライフ減衰あり。NPCのセリフはボス出現前・バトル中・撃破後で自動的に変わる getLines() 設計。
画面シェイク・歩行アニメ・タイトル画面フル刷新
ヒット時・魔法時・撃破時に画面シェイク。指数関数減衰(0.78倍)で自然なゆれ。歩行はsin波アニメ——足と腕が逆位相でスイングする。
タイトル画面はゼロから描き直し。ユートピア都市シルエット・140個の星・流れ星・エデニーとクラナのキャライラスト。全部 Canvas 2D だけで描いた。
endBattle() 内で bt.victoryIdx が配列長を超え TypeError → ゲームループが完全停止。if (bt.victoryIdx >= bt.victoryLines.length) return; をフェーズ冒頭に追加。foff = [[0,-1],[0,1],[-1,0],[1,0]][player.dir]「Edeny Arcadia」——金の亡者エデニーが気づいたら英雄になってた短編RPGを、HTML5 Canvas 1ファイルで3フェーズかけて完成させた。骨格→味付け→磨くの順で作ったのでバグが最小限で済んだ。特に「runScript() で全セリフ統一」「Web Audioルックアヘッド」は今後も使い回せる強力な設計。タイトルのユートピア都市シルエットは、EdenCodeのテーマ「のっぱらから楽園を作る神様の真似事」そのものが絵になった瞬間だった。🏛️⚔️