Appearance
AIドパガキ ゲーム仕様書
- 対象 issue: #15(土曜デモ本命)/ #29(ノーツレーン化)
- ステータス: v2.1(v2 ノーツレーン方式 + 2026-08 の実装追従。§0 に v2 からの差分を集約。実装詳細はエンジン設計)
- 前企画 Donack Adventure の仕様は
game-design.md(凍結・第2弾用)
0. v2 からの実装差分(2026-09-02 時点の正典)
§1〜§10 の本文は v2 策定時のまま残す。以下が現行実装で確定した仕様であり、本文と食い違う場合は本節が優先する。
0.1 ゲームフロー・進行
タイトル ─(10秒無入力)→ プロローグ(自動) → タイトル
├─ START → 入場(コーチ歩き) → 会話1 → 会話2 → チュートリアル(6ノーツ) → 会話3 → LETS DANCE → 本番(曲0)
├─ CONTINUE→ 本番(現在曲へ直行) / 全曲クリア後は曲選択
└─ PROLOGUE→ プロローグ(手動、Aで送る)
本番 ─[譜面完走]→ CLEAR(RANK D〜S) ─START→ RANK A以上: 次の未クリア曲 / A未満: 同じ曲リトライ
└[観客0]→ GAME OVER ─START→ 同じ曲リトライ
全4曲クリア → エンディング(曲4 + 12ページ) → タイトル- プロローグは 4 ページ × 3 行、手動時は A で送る(自動アトラクト時はスキップ不可)。エンディングは 12 ページ × 3 行、A で送り、最終ページで A/START
- 進行(現在曲・クリア済みマスク・難易度)は RAM の進行レコードでソフトリセットをまたいで保持(電源断で消える。セーブ機能ではない)
- 難易度: NORMAL / EASY(タイトルで ←→ または SELECT)。EASY は各小節 1・3 拍目のノーツを休符化
- 本番中 START = ポーズ(消音・PAUSE 表示)、SELECT = 曲替え(次曲へ切り替えて演奏やり直し、エンディング曲はスキップ)。チュートリアル中の SELECT は残りをスキップして最終セリフへ
- START+A+B でどこからでもタイトルへ
- 隠しコマンド: タイトルで ← → ← → ↑ ↓ B B = 全曲クリア扱い(曲選択解放)/ ポーズ中 A+B+SELECT = RANK S で即クリア
0.2 楽曲・譜面
| # | 曲 | BPM | 役割 |
|---|---|---|---|
| 0 | サニーステップ | 120 | 新規スタート曲・タイトル BGM |
| 1 | ネオン・ミッドナイト | 128 | |
| 2 | グルーヴ・サーキット | 116 | |
| 3 | クリムゾン・オーバードライブ | 152 | |
| 4 | トワイライト・スターズ | 96 | エンディング専用(譜面なし) |
- テンポは曲ごと(§4/§6 の「112.5 BPM 固定」はチュートリアルのみに残る)。拍ターゲットは
tools/export_charts_inc.pyがサウンドドライバと同一の丸めで事前計算し、カウントイン 96 フレーム後に BGM を開始することで同期する(行カウンタは共有しない) - サウンドは 5ch(pulse1 / pulse2 / triangle / noise / DPCM)。判定音・決定音は未実装。実装済み SE: メトロノーム(チュートリアル)/ セリフ声 / Lv4 歓声 / S ランク笛
- 譜面は
assets/charts/charts.json(譜面メーカー #45)が正典
0.3 判定・ランク
- 判定窓(±4f PERFECT / ±8f GOOD)と 4 拍集計の観客増減(+2 / +1 / −2)、観客 8→16・0 でゲームオーバーは v2 のまま
- 窓外の空振りはノーツを消費しない(MISS 表示のみ、集計・ランクに入らない。#62)
- CLEAR 画面の主表示は RANK(S = 全 PERFECT / A = MISS 0 / B = 命中 60% / C = 40% / D)。A 以上で次曲へ進行
- 判定文字は BG テキスト行
JUDGE:で表示(スプライト文字ではない) - 観客 13 人以上で A/B の PERFECT を出すと Lv4 演出(歓声 + 白フラッシュ)
0.4 アセット(§8 からの変更)
- アイ: 26 ダンスフレーム + ゲームオーバー 2 フレーム(4 コマ × 5f = 20f 固定、B スピンも同じ)
- お手本ガール: 専用スプライト 32 フレーム(アイの色違いではない)、CHR ストリーミングで表示
- 観客: 3 段 84 席・4 段階テンション。Donack のカメオは未実装
- プロローグ / エンディング用フォント追加(美咲フォント由来)
1. コンセプト
| 項目 | 内容 |
|---|---|
| タイトル | AIドパガキ |
| ジャンル | ノーツレーン型リズムゲーム |
| 画面 | 固定1画面(スクロールなし) |
| ターゲット | ファミコン実機(mapper 2 / PRG 128KB / CHR-RAM)・Mesen2 |
| デモ期限 | 2026-08-01(土)— 達成。以降は磨き込みと実機化 |
2. ストーリー
女子高生の主人公 AI(アイ)がいつものように SNS を見続けてると不思議な広告を発見。 タップすると突然スマホが光り出して 8Bit の世界に吸い込まれてしまった! 元の世界に戻るにはダンスをして視聴率を上げて、現実世界の SNS でバズらなければいけない。 いつもは見るだけで満足してたドパガキのアイは、見様見真似でダンスをしてこの電子世界から脱出しなければ!
- タイトル画面 → ストーリー画面(テキスト1〜3枚・Startでスキップ可)→ プレイ
- 表記は「SNS」で統一(実在サービス名は使わない。2026-07-28 ユーザー決定)
3. 画面レイアウト(プレイ中)
┌──────────────────────────────┐
│ 視聴率: 001234 ♥観客: 08 │ ← 上部UI(BGタイル)
│ │
│ ◎← → ↑ A │ ← ノーツレーン(右から左)
│ [お手本ガール] [アイ] │ ← ステージ(中央)16x32スプライト×2
│ ステージ床・スポットライト │
│ 🧍🧍🧍🧍🧍🧍🧍🧍 │ ← 観客列(BGタイル、0〜16人)
└──────────────────────────────┘- お手本ガールはアイのスプライトをパレット差し替え+水平フリップで共用(CHR節約)
- ビジョン内の左端に判定マーカーを置き、振りアイコンノーツ(← → ↑ ↓ A B)が右から左へ流れる
- 判定結果(PERFECT/GOOD/MISS)はアイの頭上にスプライト文字で表示
4. コアループ(ノーツレーン)
- 拍グリッドは 112.5 BPM = 32フレーム/拍。コール/レスポンスの区別は設けない
- ノーツは目標拍の96フレーム前から表示し、毎フレーム2pxずつ右から左へ進む(レーン幅192px)
- ノーツX座標は
判定マーカーX + 到達までの残りフレーム数 × 2 - お手本ガールは譜面の各目標拍で対応する振りを踊る。プレイヤーは同じ目標拍で一緒に踊る
- レーンには未判定ノーツを最大6枚と判定マーカー1枚をスプライト表示する
- 1スキャンライン上は最大7枚で、NESの8枚制限以内。アイとお手本ガールはレーンと異なるY範囲に配置する
- 本番譜面は
$FFで終了し、完走するとCLEARへ遷移する(ループしない)
チュートリアルも同じレーン方式を使う。4拍に1ノーツの超低密度グループを6回流し、6種の振りを1回ずつ練習する。
振り(6種)
| 入力 | 振り | モーション |
|---|---|---|
| ← / → | サイドステップ | 左右ポーズ |
| ↑ | ハンズアップ | 両手上げ |
| ↓ | しゃがみ | しゃがみポーズ |
| A | ジャンプ | ジャンプ |
| B | スピン | クルッと一回転(2フレームアニメ) |
5. 判定仕様
- 目標拍に対して: ±4フレーム = PERFECT(+100点) / ±8フレーム = GOOD(+50点) / それ以外・誤入力・無入力 = MISS
- 入力を検出したら判定結果にかかわらず、まずアイの「押した振り」4コマモーションを即座に開始する。タイミング外・誤ボタンでも押した振りで踊り、判定だけMISSになる
- 次に判定する未消化ノーツのインデックスを保持する。押下で判定したノーツ(MISSを含む)と、+8フレームを過ぎて無入力MISSになったノーツは消化し、二重判定しない
- 判定窓を広めに取るのは現代テレビの表示遅延対策
- 4譜面拍ごとの集計 → 観客増減:
- 全アクション PERFECT: 観客 +2(「フィーバー」歓声)
- MISS 0〜1(PERFECT/GOOD混在): 観客 +1
- MISS 2 以上: 観客 −2
- 観客: 初期 8 人・上限 16 人・0 人でゲームオーバー
- 視聴率 = スコア累積表示(6桁)
6. 楽曲・譜面
- 自作最小シーケンサを実装(famitone2 は使わない):
- テンポ 112.5 BPM = 32 フレーム/拍・8 フレーム/16分(整数フレームで割り切れる値を選定)
- チャンネル: パルス2(メロディ+ベース)、三角波(キック代用/ベース)、ノイズ(ハイハット/スネア)
- 音楽の行カウンタを判定システムと共有 → 音と譜面が構造的にズレない
- デモ譜面は有限長とし、終端
$FF到達でCLEARへ進む - 効果音: 判定音(PERFECT/GOOD/MISS)、歓声、決定音。SE はノイズ/パルス1を一時借用
7. ゲームフロー
会話1 → 会話2 → 6ノーツ練習 → 会話3 → LETS DANCE → 本番
├─ [譜面完走] CLEAR
└─ [観客0] ゲームオーバー- CLEAR画面には視聴率(スコア)と観客数を残し、Startで会話1からリスタートする
- ゲームオーバーも従来どおりStartでリスタートする
- チュートリアル譜面の
$FFはCLEARではなく会話3へ遷移し、セリフ3ページとLETS DANCEのフローを維持する
8. 必要アセット一覧
| アセット | サイズ | 内容 | issue |
|---|---|---|---|
| アイ(主人公) | 16×32 メタスプライト | idle / ←ステップ / →ステップ / ↑ハンズアップ / ↓しゃがみ / ジャンプ / スピン×2 / ミス の9パターン | 起票要 |
| お手本ガール | (アイと共用) | パレット差し替え(制服色違い)+フリップ | 同上 |
| ステージ背景 | BGタイル | ステージ床・スポットライト・電脳空間の背景(グリッド/ノイズ演出) | 起票要 |
| 観客 | 8×16 BGタイル×2種 | シルエット2種を並べて群衆表現。Donack(#9)を1体カメオ配置 | 同上 |
| UI | 8×8 | 数字フォント(#2と共用)・振りアイコン6種・♥ | 同上 |
| 判定文字 | スプライト | PERFECT / GOOD / MISS | 同上 |
9. 技術メモ
- 固定画面のためスクロールレジスタは固定。ミラーリングは現状の垂直のままで問題なし
- OAM割り当て: アイ
$0200-$021F、お手本$0220-$023F、レーン$0240-$025B - レーンは同じYにマーカー1枚+ノーツ最大6枚=7枚。8枚/スキャンライン制限内で、キャラクター2体は別Yのため加算されない
- RAM:
cfg/nes.cfgの BSS を $0300 起点に修正(PR #13 レビュー申し送り事項) - 乱数不要・セーブ不要
10. MVP 完了条件(土曜)— 達成状況
- [x] 通しフロー(会話→チュートリアル→本番→CLEAR/ゲームオーバー→リスタート)
- [x] 6振り判定・観客増減・視聴率表示
- [x] 楽曲1曲フル + 譜面同期(→ 4 曲固有譜面 + エンディング曲に拡張)
- [ ] 実機動作(魔界島カート)— SST39SF040 への書き込み・ベリファイまで完了(#34)。装着・起動確認が残
達成後の追加: タイトル / プロローグ / エンディング / 曲進行 / 難易度 / ポーズ / 隠しコマンド(§0)。未着手: プロローグ画像(#55〜#58)、キャリブレーション、Donack カメオ、判定音 SE