bannzai / bannzai/godotpractice
spiritboard: 札棋の盤面戦闘で霊を集めて戦う和風ホラーのローグライク (IdeaMemo #222 #223)
- Dominant language
- GDScript
- Stars
- 0
- Forks
- 0
- Avg merge
- 4h 10m
- Merged PRs (30d)
- 63
Description
## 概要
bannzai の考案 (IdeaMemo https://github.com/bannzai/IdeaMemo/issues/222 と https://github.com/bannzai/IdeaMemo/issues/223 ) を 1 本に合わせたローグライクを Godot 4.7 (GDScript) で `games/spiritboard/` に作る。
- **戦闘の骨格は「札棋」** (bannzai/boardgame-fudagi。カード x 将棋のアナログゲーム) のローグライク版: 小さな盤面 (3x2 と 5x2) に手札のカードを並べ、相手の王 (プレイヤー同士なら玉) に直接攻撃して 10 pt 削ったら勝ち
- **テーマと物語は「幽霊を集めて戦わせるホラー」**: 戦うカードは集めた霊。霊は墓を荒らしたり、欲しい霊がいる時は生き物を殺めたりして集める。集めるほど「闇堕ち度」が上がり、完全に闇堕ちするとゲームオーバー。警察 (取り締まり) イベントがあり、闇堕ち度が高いほど罰則が厳しい。逃げるか戦う (殺める) かでまた闇堕ち度が動く
- 見た目は薄暗く重厚な和風ホラー (水墨画風 + 彩色の雰囲気。原作の札棋の素材・名称は使わず「それっぽければよい」)。相手 (将軍・霊・警官) は Inspiration のように短い台詞を喋る
## ゲームの中核 (MVP)
- **ラン構造 (ローグライク)**: 1 ランは分岐する道 (ノード) を 8〜12 個進む。ノードの種類: 戦闘 / 強い将軍 (ボス。倒すとレアな霊カードが手に入る) / 墓場 (霊を集める。闇堕ち度が上がる) / 生き物を殺める (欲しい霊を狙って手に入れる。闇堕ち度が大きく上がる) / 警察イベント / 休息 (闇堕ち度を少し下げる・体力回復) / 商人。道の生成は乱数シードから決定的に再現でき、selfcheck で「最後のボスに到達できる・ノードの種類の出現数が範囲内」を検証する
- **盤面戦闘 (札棋)**: 自陣 3x2 (中盤以降は 5x2) のマスに、手札の霊カードを裏向きで置く (潜伏) か表向きにする (登場)。カードは ATK を持ち、隣接 (上下左右) の相手カードに攻撃宣言 → 攻撃されたカードは表向きになり ATK を比較、低い方は捨て場へ、勝ったカードは負けたカードのマスへ移動。相手の王に隣接して攻撃すると王の 10 pt を ATK ぶん削り、0 で勝ち。自分の王 (プレイヤー) も 10 pt で、0 なら敗北。ターンは ドロー → 配置換え・登場・潜伏・移動 (移動したカードはそのターン攻撃不可) → バトル → エンド。相手 (AI) も同じルールで動く
- **霊カード**: 12 種以上。ATK と 1 つの効果 (例: 隣接する味方の ATK +1、裏向きで攻撃されたら相手を道連れ、登場時に相手カードを 1 枚裏向きにする、王を 1 pt 回復する など)。レア度 3 段階。カードの定義はデータとして 1 箇所に置き、selfcheck で整合性 (ATK の範囲・効果の参照) を検証する
- **デッキと手札**: 開始時のデッキ 8 枚、手札 3 枚。ノードで得た霊がデッキに加わる。捨て場が使い切られたら山札に戻る
- **闇堕ち度**: 0〜100。墓荒らし・殺め・警察との戦闘で上がり、休息・逃走 (成功時) で下がる。50 以上で霊の ATK にボーナス、80 以上で王の最大 pt が減り、100 で闇堕ちエンド (ゲームオーバーの一種として結果画面へ)
- **警察イベント**: 闇堕ち度に応じた罰則 (カード没収・王の pt 減少)。「逃げる」(闇堕ち度と運で成功率が決まる) か「戦う」(警官カードを相手に盤面戦闘。勝つと闇堕ち度が大きく上がる)
- **台詞**: 戦闘の開始・攻撃・被弾・敗北時に相手が短い台詞 (1〜2 文) を喋る (キャラごとに 5 種以上のテキストをデータで持つ)。物語の導入と結末 (通常エンド・闇堕ちエンド) をテキストで見せる
- **勝敗と結果**: 最後の将軍を倒せばクリア。王の pt 0 か闇堕ち度 100 でゲームオーバー。結果画面に到達ノード数・集めた霊・最終闇堕ち度 → タイトル。ランの進行を `user://` に保存し、タイトルから再開できる。集めた霊の図鑑 (一度手に入れた霊の一覧) も保存する
- **操作**: マウス (カードのドラッグ / クリック)、キーボードとゲームパッド (カーソルで手札・マスを選ぶ)
- **演出**: カードの配置・裏返し・攻撃 (ぶつかる動き) と敗北 (霧になって消える) のアニメーション、王への直接攻撃の画面揺れとフラッシュ、闇堕ち度が上がる時の画面の暗転と赤み、墓場・警察・ボスの登場演出、ノード移動の地図のスクロール、場面ごとの BGM (地図・戦闘・ボス・警察・結果) と SE (カード・攻撃・霊の声)
## 見た目と手触りの基準 (第 1 ラウンドの品質向上ラウンドと同じ水準)
「最低限遊べる」で止めず、本番 (Steam で売るゲーム) の前の予行練習として、最初から次の水準で作る。
- **画像をキャラ・オブジェクトごとに分ける**: 主人公・敵や NPC の各種類・アイテム・UI 部品を、それぞれ独立した画像ファイル (または 1 キャラ 1 スプライトシート) にし、シルエット・配色・表情・装備で見分けられる固有デザインにする。3D は種類ごとに独立したメッシュ構成とマテリアルにし、色違いではなく形で見分けられるようにする
- **アニメーションを凝る**: キャラごとに待機 / 移動 / 行動 / 被弾 / 消滅 (ゲームに合わせて 4 種以上) のフレームアニメーション (`AnimatedSprite2D` か `AnimationPlayer`。3D は `AnimationPlayer` で各部位を動かす)。ヒットエフェクト・獲得・成長等をパーティクルと Tween で作り、ヒットストップ・画面揺れ・フラッシュを要所に入れる。画面遷移にフェードやスライドを入れる。UI はボタンのホバー / 押下、数値のカウントアップ、ダメージや獲得数のポップを持つ
- **グラフィックを凝る**: 背景は多層 (パララックス) にし、タイトル画面にロゴとキーアートを置く。カラーパレット・フォント・UI テーマ (`Theme` リソース) を統一し、HUD を本番相当のレイアウトにする。GL Compatibility の範囲で使える表現 (CanvasModulate・Light2D・簡単なシェーダ・環境光) を使い、レンダラは変えない
- **音**: BGM / SE を場面ごと (タイトル・プレイ・盛り上がり・結果) に用意し、単純な正弦波ではなく聞いて違いが分かる音色にする
## 受け入れ条件
- [ ] タイトル → プレイ → 結果 (ゲームオーバー / クリア) → タイトルまたは再開、のループが成立する
- [ ] 上記「ゲームの中核」がすべて遊べる状態で実装されている
- [ ] 上記「見た目と手触りの基準」を満たしている (キャラ別の画像・4 種以上のアニメーション・演出・多層背景・UI テーマ・場面ごとの BGM / SE)
- [ ] 画像 (キャラクター・背景・UI)・BGM・SE が入っていて、ゲームとして成立する見た目と音になっている。素材は CC0 等のフリー素材か生成物で、`assets/CREDITS.md` に記録済み (素材の探し方・生成は `~/.agents/skills/game-asset-search/SKILL.md`)
- [ ] キーボードとゲームパッドの両方で遊べる (InputMap にアクションを定義し、両方のイベントを割り当てる)。マウス操作が自然なゲームはマウスも対応する
- [ ] 1280x720 (16:9・canvas_items ストレッチ) で表示が崩れない。フルスクリーン切替 (F11) がある
- [ ] ゲームの純粋なロジック (計算・状態遷移・抽選・保存データの解釈など) が `scripts/dev/selfcheck.gd` で検証され、`make test GAMES=spiritboard` が exit 0
- [ ] `scripts/dev/screenshot.gd` の `_capture_scenes()` が代表画面 (タイトル・プレイ中・各キャラのアニメーションの連続フレーム・各演出の途中・結果) を撮影し、`make screenshot GAMES=spiritboard` が exit 0。PNG を目視して崩れがない
- [ ] `make movie GAMES=spiritboard` が exit 0 で、mp4 を目視して起動〜タイトル表示に崩れがない
- [ ] `scripts/dev/` の自動操作シナリオ (実入力イベントを時刻ごとに投入) で 20〜30 秒のプレイを録画する target (`movie-play` 等) があり、exit 0。mp4 を 2 秒間隔のフレーム一覧にして目視済み
- [ ] 通常終了と `--quit-after` の両方で、終了時に `ObjectDB instances were leaked` / `resources still in use` が出ない
- [ ] `make build-all GAMES=spiritboard` と `make build-web GAMES=spiritboard` が exit 0 (export templates はローカルに展開済み)
- [ ] webtunnel で自分のブランチの Web エクスポートを開き、実際に操作してタイトル → プレイ → 結果まで進めたスクリーンショットが PR body にある (前提が揃わず使えなかった場合は、何にブロックされたかを PR body に書く)
- [ ] PR body に撮影 PNG (各画面・キャラ別・アニメーション連続フレーム・プレイ録画のフレーム・webtunnel の画面) が `puts upload` で埋め込まれている
- [ ] PR の CI が全 pass で、artifact (`spiritboard-screenshot-and-movie`) の PNG と mp4 を目視確認済み
- [ ] 実装中に得た知見 (Godot のハマりどころと回避策・素材準備で効いた方法・検証で効いた方法・ジャンル固有の設計判断・skill やツールへの改善提案) を `documents/knowledge/spiritboard.md` に書いてある
- [ ] PR が ready for review になっている (マージは行わない)
## 制約
- 変更は `games/spiritboard/` と `documents/knowledge/spiritboard.md` の中に閉じる。ルートの共有物 (AGENTS.md・Makefile・`.github/`・他のゲーム) は変更しない。共有物の変更が必要になったら `documents/knowledge/spiritboard.md` に提案として書く
- 原作の名称・キャラクター名・画像・音・ロゴを使わない。素材は「それっぽければよい」で、完全な再現は求めない
- C# を導入しない。Steamworks SDK / GodotSteam を追加しない。レンダラは GL Compatibility から変えない (根拠: `documents/adr/0001-godot-gdscript-monorepo-unpublished.md`)
- その他の運用・制約・検証方法は AGENTS.md と documents/PROJECT.md を正とする
## セッション再開
```sh
cd /Users/bannzai/ghq/github.com/bannzai/godotpractice
claude --resume eb151efc-f6e3-4b4a-8bf9-2b09da784f53
```
Contributor guide
No contributing guide indexed for this repository
Research direction
Read AGENTS.md and documents/PROJECT.md, then inspect the existing games/spiritboard/ structure and the Godot project configuration. Use scripts/dev/selfcheck.gd and the make test, screenshot, movie, build-all, and build-web targets as the first validation points. Done means the full title-to-result loop and listed gameplay, input, presentation, save, export, and verification requirements pass within the permitted paths.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- godot
- Domain
- game-dev
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100