ゲーバフでゲームを公開する
ゲーバフ(by AIGameDeck)は、ブラウザゲームをアップロードすると、ランキング・シェア・プレイ記録・リアルタイム対戦つきで遊べるようになるサイトです。 この資料は、人と AI(コーディングエージェント)の両方に向けて書いています。AI にはこのページ(https://gebuff.com/llms.txt)をそのまま渡してください。
1. 公開までの流れ
- https://gebuff.com/login/ でログインする(Google アカウントかメールアドレス)
- https://gebuff.com/dashboard/ の「新しいゲーム」で、URL に使う名前(例:
tanetori)とタイトルを決める - ゲームのファイルをアップロードする
- HTML 1 枚、またはフォルダを zip にしたもの(中に
index.html) - 画像・音・JS などは相対パスで読み込む(例:
./img/hamster.png)
- HTML 1 枚、またはフォルダを zip にしたもの(中に
https://gebuff.com/play/<名前>で遊べるようになる。アップロードし直すと新しいバージョンになる(前のバージョンに戻すこともできる)
AI やコマンドからアップロードする
ダッシュボードの「AI やコマンドからアップロード」でトークンを作り、次のコマンドを使います。
# zip の場合
curl -X POST --data-binary @game.zip \
-H "Content-Type: application/zip" \
-H "Authorization: Bearer <トークン>" \
https://gebuff.com/api/games/<名前>/upload
# HTML 1 枚の場合
curl -X POST --data-binary @index.html \
-H "Content-Type: text/html" \
-H "Authorization: Bearer <トークン>" \
https://gebuff.com/api/games/<名前>/upload
返事の url が遊ぶページです。ゲームの作成も API でできます:
curl -X POST -H "Authorization: Bearer <トークン>" -H "Content-Type: application/json" -d '{"id":"<名前>","title":"<タイトル>"}' https://gebuff.com/api/games
2. ゲームの紹介文とサムネイル(検索に出すために必要)
ゲームを載せる前に、ダッシュボードで一度だけ「運営がゲームのプレイ動画・紹介動画を作り、本サイトや YouTube などで公開すること」への同意が必要です(トークンでのアップロードも同じ)。
ゲームページは検索エンジンの入口になります。説明と遊び方がそれぞれ 20 文字以上ないページは、検索に出しません(中身の薄いページはサイト全体の評価を下げるため)。 アップロードするときに、次のどちらかでゲームの情報を入れてください(ダッシュボードの「設定」からも書けます)。
zip の場合は、index.html と同じ場所に aigamedeck.json を置きます。
{
"title": "タネ取り合戦",
"description": "ハムスターになって、ひまわりのタネを友達と取り合う 45 秒の対戦ゲーム。",
"howToPlay": "ステージに落ちているタネに触れると 1 こゲット。45 秒でいちばん多く集めた人の勝ち。招待リンクで友達を呼べます。",
"controls": "矢印キー/WASD、スマホは行きたい場所をタッチ",
"tags": ["action", "versus", "kids"],
"thumbnail": "thumbnail.png",
"video": "https://youtu.be/xxxxxxxxxxx"
}
HTML 1 枚の場合は、<head> の中に同じ内容を書きます。
<script type="application/json" id="aigamedeck-meta">
{ "description": "…", "howToPlay": "…", "controls": "…", "tags": ["puzzle"] }
</script>
description: 検索結果に出る紹介文(1〜3 文、300 文字まで)howToPlay: ルール・目的・コツ(1000 文字まで)controls: 操作方法(200 文字まで)tags: ジャンル(5 つまで)。actionアクション /puzzleパズル /shootingシューティング /racingレース /rhythm音ゲー・リズム /quizクイズ /boardボード・カード /rpgRPG /adventureアドベンチャー /simulationシミュレーション /sportsスポーツ /brain脳トレ /netaネタ・バカゲー /versusオンライン対戦 /kids子ども向けvideo: 紹介動画(なくてもよい)。YouTube の動画 URL か、"omakase"(運営が動画を作ります)thumbnail: サムネイル画像(1200×630 の PNG・JPEG・WebP がおすすめ)。thumbnail.pngという名前なら書かなくても使われます。無い場合は自動で作ります
3. SDK
サイトにアップロードしたゲームには、SDK が自動で読み込まれ、window.aigamedeck として使えます。
何も書かなくても、プレイ回数・遊んだ時間・どこから来たかは記録されます。
手元で試すときにも動くように、ゲームのスクリプトの先頭に次の 1 行を入れるのがおすすめです(サイト上では同じものが使われます)。
const aigamedeck = window.aigamedeck ?? (await import("https://gebuff.com/v1/aigamedeck.js")).aigamedeck;
<script type="module"> の中に書いてください(await を使うため)。
以前の名前(window.arcade、arcade.json、<script id="arcade-meta">)で書いたゲームも、そのまま動きます。
4. ランキング
const r = await aigamedeck.submitScore(1234);
// r = { best, isBest, rank, total } 自己ベスト・今回がベストか・順位・参加人数
- ランキングの表示はサイトの枠(ゲームの横)が自動でやります。ゲームの中にランキング画面を作る必要はありません
- スコアは数値。小さいほうが良いゲーム(タイムなど)は
aigamedeck.submitScore(秒数, { order: "asc" }) - 1 つのゲームで複数のランキングを持つときは
boardを付ける:aigamedeck.submitScore(n, { board: "hard" }) - 送るのは1 回のプレイが終わったときに 1 回。毎フレーム送らない
- 枠のランキングを目立たせたいとき:
aigamedeck.showLeaderboard() - ゲームの中で順位を表示したいとき:
const lb = await aigamedeck.leaderboard({ period: "day" })(period:"day"/"week"/"all")
5. シェア
aigamedeck.share({ score: 1234 });
- 枠に「X でポスト」「LINE で送る」「リンクをコピー」が出ます
- 共有リンクには、スコア入りの画像が付きます
- リンクから来た人は「共有から来た人」として記録されます
- 結果画面に「シェア」ボタンを置いて、押されたときに呼ぶのがおすすめです
6. プレイヤー
await aigamedeck.ready; // サイトとのやりとりの準備ができるまで待つ
aigamedeck.player; // { id, name, loggedIn }
aigamedeck.on("player", (p) => { /* 名前が変わった */ });
名前の変更やログインは枠でできます。ゲームの中に名前入力を作る必要はありません。
7. リアルタイム対戦
const room = await aigamedeck.join({ max: 4 });
- URL に
?room=xxxxがあればその部屋、無ければ同じゲームの空いている部屋に入ります(クイックマッチ) room.inviteUrlを友達に送ると同じ部屋に入れます(サイトのページの URL になります)- つながり方は自動です(直接 P2P → だめなら中継 → だめならサーバー経由)
同期のやり方は 3 つ。ゲームに合うものを選びます(混ぜて使えます)。
| 型 | 向いているゲーム | 書くこと |
|---|---|---|
| 自分の状態を配る | レース、アクション、かくれんぼ | 毎フレーム room.me.set({ x, y })。相手は for (const p of room.others) draw(p.state) |
| ホストが仕切る | 共通の敵・アイテム・スコアがある | ホストだけが room.world.set({...})。ほかの人は room.toHost("名前", データ) でお願いする |
| 出来事を送る | カード、ボード、クイズ | room.send("名前", データ) と room.on("名前", (データ, 送った人) => {}) |
主な API:
room.me.set(obj)/room.me.state/room.me.idroom.others— 自分以外。p.stateは少し遅らせて数値をなめらかにしたものroom.players— 全員(入った順)room.isHost— ホストが抜けると自動で次の人に移る(room.on("host", p => {}))room.world.get()/room.world.set(obj)— ホストだけが書ける共有の状態(room.on("world", w => {}))room.send(name, data)/room.toHost(name, data)/room.on(name, (data, from) => {})room.on("join" | "leave" | "status", fn)room.now()— 全員でそろった時計(ミリ秒)。Date.now()の代わりに使うroom.seed— 部屋ごとの乱数の種room.lock()— 試合開始時にホストが呼ぶ(クイックマッチで人が増えなくなる)room.leave()
8. 動作確認
- 手元で開く(ファイルや localhost): ランキングとシェアは仮の動き(手元だけ)になり、エラーになりません
- ボットと練習: URL に
?dev=1を付けると、サーバーを使わずにボット 1 体と対戦できます。ボットの動きはaigamedeck.join({ bot: (bot) => ({ tick(dt) { ... } }) })で書けます - 本物の対戦: サイトの
/play/<名前>?room=testを 2 つのタブで開く - つながり方の確認:
?relay=1(中継だけ)、?p2p=0(サーバー経由だけ)
9. AI 向けチェックリスト
- ゲームは
index.htmlから始まり、ほかのファイルは相対パスで読み込む aigamedeck.json(または<script id="aigamedeck-meta">)に説明・遊び方・操作・ジャンルを書く。1200×630 のthumbnail.pngもあるとよい- スクリプトの先頭に
const aigamedeck = window.aigamedeck ?? (await import("https://gebuff.com/v1/aigamedeck.js")).aigamedeck; - 1 プレイが終わったら
aigamedeck.submitScore(スコア)を 1 回。タイムなら{ order: "asc" } - 結果画面に「シェア」ボタン →
aigamedeck.share({ score }) - ランキング画面・名前入力・ログイン画面はゲームの中に作らない(サイトの枠がやる)
- 対戦ゲームなら
aigamedeck.join()。位置はroom.me.set、取り合うものはホストが決める、時間はroom.now() - 手元で開いてエラーが出ないことを確かめてから、アップロードする
10. 利用条件
- このサイトにアップロードして遊ばせる場合は無料です。サイトはゲームの周りに広告を表示します
- SDK・API・対戦サーバーを、このサイトの外(自分のサイトなど)で単独で使う場合は有料プランが必要です。契約なしの単独利用はできません
- 詳しくは利用規約を見てください