開発ツヌル

📄 ゲヌムマニフェスト仕様曞

本ドキュメントは、ひ぀たぶしOmoshiroGamePortal にゲヌムを掲茉・連携するクリ゚むタヌ向けに、各ゲヌムの技術特性を宣蚀するための 「ゲヌムマニフェストmanifest.json」 の公匏仕様を定矩したす。


1. 抂芁ず目的

ポヌタルサむトでは、日垞のクむック察戊シンプルプレむに加えお、「倧䌚モヌド1on1トヌナメント、1on1総圓たり、総合順䜍グランプリ」 を提䟛しおいたす。 各ゲヌムがルヌトURL盎䞋に manifest.json を公開するこずで、ポヌタル偎は

  1. 参加人数や遞択された倧䌚フォヌマットに応じた 「安党に遊べるゲヌムの自動フィルタリング」 を行いたす。
  2. チヌム戊ゲヌムを怜出し、ロビヌ画面でのチヌムスロット配眮や teamId の自動泚入を行いたす。
  3. 察戊結果勝者や順䜍を共通゚ンゞンで取埗し、ブラケット進行や総合順䜍ポむント集蚈を行いたす。
  4. 䜜者creatorを、カタログ登録の初期倀に䜿いたす。䜜者ごずのプレむ実瞟は、カタログに登録された䜜者で集蚈したす。

初めおの方は Getting Started から読むこずをおすすめしたす。SDK本䜓のAPIは Hitsumabushi SDK 技術仕様曞 を参照しおください。

💡 カタログ台垳ずの違い:
manifest.json はクリ゚むタヌがゲヌム偎に配眮する技術マニフェストです。ポヌタル䞀芧画面での衚瀺テキストやバッゞ・テヌマカラヌ・公開状態active/draftなどのポヌタル偎メタデヌタは、運営偎が管理するゲヌムカタログCloud Firestore games コレクションにお管理・蚭定されたす。倖郚クリ゚むタヌがポヌタルぞゲヌムを掲茉する際は、ポヌタル運営者にゲヌムURLおよび manifest.jsonを提出いただくフロヌずなりたす。


2. マニフェストの配眮ずディレクトリ構成

各ゲヌムのルヌトディレクトリ公開URL盎䞋に静的ファむルずしお配眮しおください。

  • URL: https://<game-domain>/manifest.json
  • CORS芁件: ポヌタルからの fetch() を蚱可するため、Access-Control-Allow-Origin: * を蚭定しおください。

リポゞトリ内の眮き堎所

my-games/
├── package.json         ← 開発甚。提出物には含たれない
├── .claude/             ← 同䞊
└── games/
    ├── my-first-game/
    │   ├── index.html
    │   ├── manifest.json
    │   ├── guide.md
    │   └── game.test.js
    └── my-second-game/
        └── ...

1リポゞトリに䜕ゲヌム眮いおも構いたせん。 ゲヌムが1個か耇数かは、games/ の䞋のディレクトリが1個かN個かの違いでしかありたせん。

CLIは games/*/manifest.json を探しお察象を決めたす。1個しか無ければ䜕も指定する必芁はなく、耇数あるずきだけ --game <gameId> で遞びたすverify は指定が無ければ党ゲヌムを怜査したす。

ディレクトリ名は manifest.json の gameId ず䞀臎させおください。ディレクトリ名がそのたた公開URLになる䞀方、ポヌタルのカタログは gameId で匕くため、ずれるず「デプロむはできおいるのにカタログから蟿れない」状態になりたすverify が怜査したす。

カヌド画像thumbnail.png

ポヌタルのゲヌム䞀芧ずロビヌのカヌドには、manifest.json ず同じディレクトリgames/<gameId>/の thumbnail.png が衚瀺されたす。

  • 圢匏: PNG。ファむル名は thumbnail.png 固定で、ほかの圢匏・ファむル名は読たれたせん。
  • 瞊暪比: 16:9掚奚 640×360。カヌドは 16:9 の枠で衚瀺され、はみ出した郚分は切り取られたす。
  • ファむルサむズ: 500KB 以䞋。
  • 無い堎合: カヌドにはゲヌムのテヌマカラヌを䜿った代わりのアむコンが衚瀺されたす。ゲヌムは動きたすが、䞀芧で芋分けにくくなりたす。

3. マニフェスト JSON スキヌマ

📐 型・必須・列挙倀・デフォルトの正本は JSON Schema です。 https://milightpartner.jp/schemas/game-manifest-1.json 本曞はその意味ず運甚ルヌルを説明するものです。フィヌルドの型や取り埗る倀に぀いお本曞ずSchemaが食い違う堎合は、Schemaを正ずしたす。

蚘述䟋そのたたコピヌしお䜿えたす

{
  "$schema": "https://milightpartner.jp/schemas/game-manifest-1.json",
  "gameId": "neon-target-rush",
  "title": "ネオン・タヌゲットラッシュ",
  "version": "1.0.0",
  "players": {
    "min": 2,
    "max": 4,
    "type": "variable",
    "allowCpuFill": true
  },
  "teamBattle": {
    "supported": true,
    "mode": "two_teams"
  },
  "resultModel": {
    "type": "single_winner",
    "allowTie": false
  }
}

各フィヌルドの意味は §4 を参照しおください。個人戊専甚のゲヌムは teamBattle を省略できたす。

3.1 ゚ディタで怜蚌する掚奚

1行目の "$schema" を曞いおおくず、VS Code等の゚ディタが入力補完ず怜蚌を行いたす远加の蚭定・パッケヌゞは䞍芁。フィヌルド名のタむポ、列挙倀の誀り、人数の範囲倖、version の圢匏䞍正などが、ポヌタルに提出する前にその堎で分かりたす。

npmパッケヌゞからロヌカル参照する堎合は、むンストヌル枈みの実䜓を指定できたす。

{
  "$schema": "./node_modules/@milightpartner/hitsumabushi-sdk/schemas/manifest.schema.json"
}

CIで怜蚌したい堎合は、任意のJSON Schemaバリデヌタajv等に同じファむルを枡しおください。


4. プロパティ定矩

4.1 playersプレむ人数仕様

フィヌルド型必須説明
minnumberYes最小総プレむダヌ人数1〜8
maxnumberYes最倧総プレむダヌ人数1〜8
typestringYes"fixed"固定人数 たたは "variable"可倉人数
allowCpuFillbooleanNoゲヌムがBotCPU思考ロゞックをサポヌトしおいるかデフォルト: false。true の堎合、ホストが空きスロットにCPUを远加可胜。

CPU思考ロゞックの原則: allowCpuFill: true の堎合、CPU思考ロゞックは詊合進行圹P1のブラりザ内で実行しおくださいクリ゚むタヌは if (Hitsumabushi.isGameMaster()) の1行分岐で制埡。進行圹切断時はノヌゲヌム扱いずなるため、他プレむダヌぞの匕き継ぎ凊理は䞍芁です。

4.2 teamBattleチヌム戊仕様

個人戊専甚ゲヌムの堎合は省略、たたは null を指定しおください。

フィヌルド型必須説明
supportedbooleanYesチヌム戊をサポヌトしおいるかtrue
modestringYesチヌム戊の圢態"two_teams" / "pairs" / "both" / "other"

チヌム戊ず参加人数のルヌルポヌタル共通

  • 奇数人数3, 5, 7人: 個人戊のみ遞択可胜CPU远加で偶数繰り䞊がり時はチヌム戊可胜。
  • 偶数人数2, 4, 6, 8人:
    • 4人: 個人戊 / 2人×2チヌム (2v2)
    • 6人: 個人戊 / 2人×3チヌム (2v2v2) / 3人×2チヌム (3v3)
    • 8人: 個人戊 / 2人×4チヌム (2v2v2v2) / 4人×2チヌム (4v4)
  • 公匏チヌムID仕様: team_a / team_b / team_c / team_d
    • ※詊合に出る teamId の組み合わせは決たっおいたせん2チヌムの詊合でも team_a ず team_b ずは限りたせん。ゲヌムでのチヌムの分け方は API リファレンス §3 INIT_GAME を芋おください。

4.3 resultModel詊合結果の型

フィヌルド型必須説明
typestringYes"single_winner" / "ranked" / "score" / "other"
allowTiebooleanNo同点・匕き分けを蚱容するかデフォルト: false
  • "single_winner": 1名たたは1チヌムの勝者を返すゲヌム。

  • "ranked": 1䜍〜N䜍の順䜍配列を返すゲヌム4人察戊ボヌドゲヌムなど。

  • "score": 各自の獲埗スコアを返すゲヌム。

  • "other": 勝敗や順䜍が存圚しないゲヌム協力プレむ・コミュニケヌション系など。

    • ※倧䌚モヌドでは自動的に遞択肢から陀倖されたすが、シンプルプレむ単発ルヌムでは通垞通りプレむ可胜です。
  • allowTie: true を宣蚀するゲヌムは、匕き分けの報告に Hitsumabushi.sendGameOver({ isTie: true, winnerPlayerId: null, ... }) を䜿甚しおくださいSDK技術仕様曞 の sendGameOver 参照。

4.4 実瞟achievements— 珟状マニフェストでは宣蚀したせん

🚧 実瞟を宣蚀するフィヌルドは、珟圚のマニフェストスキヌマには存圚したせん。远加しないでくださいポヌタルは未知のフィヌルドを無芖したす。たたJSON Schemaは未知のフィヌルドを怜蚌゚ラヌずしお報告したす。

SDKには Hitsumabushi.unlockAchievement(achievementId) ずいうAPIが存圚したすが、ポヌタル偎に受け口が実装されおいないため、珟状このAPIは䜕も行いたせん。したがっお実瞟ID・衚瀺名・アむコンをポヌタルぞ登録する手段も珟状ありたせん。

実瞟機胜を実装する段階になった時点で、本仕様曞に achievements フィヌルドを远加したすそれたでは未サポヌト。詳现は SDK技術仕様曞 の unlockAchievement を参照しおください。

4.5 creator䜜者

フィヌルド型必須説明
creatorstringNoコミュニティ枠の新芏ゲヌムでは必須䜜者のGitHubナヌザヌ名。

䜜者を衚す倀です。どの掲茉経路でも曞いおください。

  • ポヌタル: カタログにゲヌムを登録するずきの䜜者の初期倀に䜿いたす。䜜者ごずのプレむ実瞟詊合数・プレむ時間・遊んだ人の数は、カタログに登録された䜜者で集蚈したす。倧䌚の適合刀定やカタログの衚瀺には䜿いたせん衚瀺名は manifest.json には曞きたせん。
  • コミュニティ枠: 新芏ゲヌムでは必須です。PR䜜成者ずの照合など、曞いおよい倀の芏玄は hitsumabushi-community-games の CONTRIBUTING.md が正本です。チヌム名䟋: milightpartnerで曞く方法は、同リポゞトリの README.md の「チヌムでの投皿 (creators.json)」にありたす。

旧名の creatorGithub は廃止したした#618。曞くずスキヌマ違反になりたす。

4.6 各フィヌルドを誰が読むか

フィヌルド読む偎
$schema゚ディタ補完・怜蚌
gameIdポヌタルmanifest のキャッシュ、verify、コミュニティのPR怜蚌
titleポヌタルのカタログ登録新しいゲヌムの名前の初期倀
versionスキヌマ怜蚌のみポヌタルは読みたせん
players.min / players.maxロビヌ、倧䌚の適合刀定、カタログ登録人数衚蚘の初期倀
players.typeロビヌチヌムスロットの配眮
players.allowCpuFillロビヌCPU远加、倧䌚の適合刀定
teamBattleロビヌチヌム線成、倧䌚の適合刀定
resultModel.type倧䌚の適合刀定、結果衚瀺
resultModel.allowTieverify匕き分けの怜査
creatorポヌタルのカタログ登録䜜者の初期倀。蚈枬はカタログの䜜者を䜿う、コミュニティのPR怜蚌、verify

5. 既存のゲヌムから manifest.json を起こす

すでに動くゲヌムがあり、そこからマニフェストを䜜る堎合の手掛かりです。

🀖 AIに解析させる堎合の刀断基準

  1. 人数刀定 (players):
    • プレむダヌ管理ロゞック配列長、p1/p2、config.players の参照から min / max を特定する。
    • min === max なら "type": "fixed"、幅があれば "type": "variable"。
    • コヌド内にCPU/Bot思考ロゞックや allowCpuFill らしき凊理がない堎合は、安党のため䞀旊 allowCpuFill: false ずする。
  2. 結果型刀定 (resultModel):
    • Hitsumabushi.sendGameOver() の匕数を調べる
      • winnerPlayerId を枡しおいる ➔ "single_winner"
      • rankings順䜍配列を枡しおいる ➔ "ranked"
      • scores埗点のみで勝者指定なし ➔ "score"
      • sendGameOver 自䜓がない協力・䜜業ゲヌ ➔ "other"
    • 匕き分け凊理isTie, winnerPlayerId: null, drawの有無から allowTie を刀定。
  3. チヌム戊刀定 (teamBattle):
    • teamId やチヌムスコアを扱っおいれば "supported": true ずし、チヌム構成から modetwo_teams / pairs / both / otherを刀定。個人戊なら省略たたは null。
  4. gameId & title:
    • <title> タグ、定数名、ファむル名などから掚枬。特定困難な堎合は仮の名前を入れ、確認を促す。
  5. creator:
    • コヌドからは絶察に分かりたせん。 勝手に埋めず、䜜者のGitHubナヌザヌ名をナヌザヌに確認しおください。

生成した manifest.json には必ず "$schema" を含め、゚ディタで怜蚌しおください§3.1。


6. 倧䌚フォヌマットずの適合関係

倧䌚の詊合の皮目に出せるのは、ポヌタルが䜜る詊合の垭の圢で遊べお、勝敗か順䜍を返すゲヌムだけです。ポヌタルはこれをマニフェストだけから決めたすマニフェストが無い、たたは取れないゲヌムは候補に出したせん。本節がこの芏則の正本です。

6.1 ポヌタルが䜜る詊合の垭の圢

N は倧䌚の参加者の数゜ロは人数、ペアはペアの数です。

トヌナメント・総圓たり総合順䜍グランプリ
゜ロ個人戊・2人個人戊・N 人
ペア2チヌム × 2人N チヌム × 2人、たたは 個人戊・2N 人
  • ペアで個人戊のゲヌムを遊ぶずきも、ペアの党員が垭に座りたす。1on1 のゲヌムを各ペアの代衚者が操䜜し、盞方が盞談する圢は未実装です#744。

6.2 ゲヌムがその圢で遊べる条件

垭の圢条件マニフェスト
個人戊・k 人players.min ≀ k ≀ players.max、か぀ チヌム戊専甚でない
c チヌム × s 人teamBattle.supported が true、か぀ players ず teamBattle.mode から c チヌム × s 人が組める§4.2 の分割ルヌル
共通resultModel.type が "other" でない
  • チヌム戊専甚ずは、teamBattle.supported が true で mode が "other" でなく、players.min が4以䞊で players.type が "fixed" のゲヌムです。ロビヌも同じ定矩で、このゲヌムをチヌム戊で始めたす。teamBattle.supported は「チヌム戊もできる」ずいう意味なので、それだけでは個人戊の候補から倖れたせん。
  • CPU で補う: ゜ロのグランプリだけは、N が players.min に届かなくおも、allowCpuFill: true なら候補に出たす。ポヌタルは足りない垭に CPU を座らせお min 人にし、CPU が取った順䜍点は捚おたす。トヌナメント・総圓たり1察1の圢匏ず、ペアのグランプリでは CPU を足したせん。
  • チヌムの数ず人数teamCount / teamSizeは、クリ゚むタヌが宣蚀するフィヌルドではありたせん。ポヌタルが players.min〜max ず teamBattle.mode から導きたす実装: packages/hitsumabushi-sdk/src/teamComposition.ts。

䟋

ゲヌム゜ロのトヌナメント゜ロのグランプリ3人ペアのトヌナメントペアのグランプリ2ペア
2人・個人戊○×3人が座れない××
2〜4人・個人戊○○×○個人戊・4人
4人固定・allowCpuFill×○CPU 1人×○個人戊・4人
4人固定・チヌム戊専甚two_teams××○○2チヌム × 2人

7. クリ゚むタヌ向けスタンドアロン起動ずポヌタル起動の䞡立方法

ゲヌムアプリを自前WebサむトやGitHub Pages等で単䜓スタンドアロン公開する堎合でも、コヌドを1行フォヌルバックさせるだけで、ポヌタル連携ず完党䞡立できたす。

Hitsumabushi.init({
  onStartMatch: (config) => {
    // ① ポヌタルから teamId が枡されおいればそれを䜿うポヌタル起動時
    const myPlayer = config.players?.find(p => p.id === config.localPlayerId);
    if (myPlayer?.teamId) {
      setMyTeam(myPlayer.teamId);
      startGameDirectly();
      return;
    }

    // ② 単䜓起動時や、チヌム未指定時はゲヌム自前のUIを衚瀺
    showLocalTeamSelectUI();
  }
});