bannzai / bannzai/godotpractice

spiritboard: 札棋の盤面戦闘で霊を集めて戦う和風ホラーのローグライク (IdeaMemo #222 #223)

Open
#58 2 comments 0 reactions 0 assignees View on GitHub
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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.