ストアは既製システムです。ゲームのショップ画面と、購入のサーバー側の処理がセットになっています。 棚と商品は ダッシュボードで設定し、購入のたびにサーバーが価格、上限、入れ替えを自分で確認します。ゲーム側から購入をごまかす ことはできず、ストアに自前のサーバーは要りません。
プレイヤーに見えるもの
- タブになった棚。 棚の最初のセクションはカルーセル、残りはカードのグリッドです。
- 受け取るまで光る無料の本日のギフト。
- カードのタイマー:「更新まで」「開始まで」「売り切れ」。
- 購入確認のポップアップ(スマホでは下から出るシート)。
- 「獲得」のアニメーション:報酬が残高のカウンターへ飛んでいきます。
- 無料商品が待っているときのストアのタブのバッジ。
ストアの構造
ストアはツリーです:棚 → セクション → スロット → 商品。
- 商品:売るもの。価格、報酬、上限、リボン(「お得」「x2」)。商品は1つのカタログにあります。
- スロット:棚の上の場所。商品はスロットを通してしか買えず、どのスロットにもない商品はまったく売られません。
- 入れ替え:スロットはプールから商品を表示し、スケジュールで入れ替えられます。本日のショップのように。 入れ替えはサーバーが計算するので、プレイヤーはどの端末でも同じストアを見ます。
価格
| プレイヤーが払うもの | 仕組み |
|---|---|
| ゲーム内通貨、アイテム | プレイヤーの残高から差し引き |
| 現金 | アプリストアでの購入。レシートはサーバーが確認 |
| 広告視聴 | プレイヤーが獲得した広告視聴を使う(広告のあるビルド) |
| なし | 無料商品。上限が必須で、ないとサーバーは販売しない |
取り消し線の「元の」価格を表示でき、割引率はサーバーが計算します。1つの商品に複数の価格オプションを付けることも できます。たとえばコインかジェム。
購入上限
- 通算:たとえばスターターパックは1回。
- 1日ごと:UTC の午前0時にリセット。
- クールダウン:決まった時間が過ぎると次の購入。
- 入れ替え期間ごと:この商品が棚にある間のスロットの上限。
「初回購入」「売り切れ」の表示とタイマーは、プレイヤーごとにサーバーが計算します。
ステップ 01プロジェクトにストアを追加する
放置 RPG テンプレートには、サンプルの棚付きのストアがすでにあります。ほかの プロジェクトでは AI コーダーが追加します。チャットに「ショップを追加して」と書いてください。ストアを一から書かず、 既製システムを入れます。ストアのタブは、売るものができた時点でプレイヤーに表示されます。
ステップ 02商品と棚を設定する
ダッシュボードを開き、プロジェクトを選んで ライブ運営 → v2 → ストア へ。
- 商品タブで商品を作ります:名前、価格、プレイヤーが得るもの、上限。
- 棚タブで棚を作り、セクションとスロットを追加して、スロットに商品を置きます。
- プリセットは、多くの商品にまとめて適用できる共通の設定です。
ダッシュボードはスロットのない商品と上限のない無料商品を警告します。ページの AI ボタンでアシスタントが開きます。 売りたいものを説明すると(「0.99ドルで500コインのパックと、毎日の無料の宝箱」)、変更を提案してくれるので、 確認して保存を押します。
ステップ 03テストしてリリースする
アプリのテスト版でストアを確かめます。設定は別の操作で本番アプリに送られるので、コードのリリースが設定を上書きする ことはありません。詳しくは公開とリンクを参照してください。
開発者向け
ストアは @idosgames/core の client.store で動きます。画面は getStorefront() から描きます。これはこの
プレイヤー向けにすでに計算された棚(入れ替え、上限、タイマー)です。getDefinitions() は全員に共通の設定にすぎません。
const res = await client.store.getStorefront()
if (!res.ok) return showError(res.error)
for (const store of res.data.Stores ?? [])
for (const section of store.Sections ?? [])
for (const slot of section.Slots ?? []) {
// 空のスロットは Offer === null で届きます:棚がずれないよう空の枠を描きます。
if (!slot.Offer) continue
drawCard(slot.Offer, slot.RefreshesAtUtc)
}
const buy = await client.store.purchase(offer.OfferID, 1, {
selectedOptionID: option.OptionID,
slot: { storeID: store.StoreID, sectionID: section.SectionID, slotID: slot.SlotID },
})- 購入が
OFFER_NOT_IN_ROTATIONを返したら、棚が変わっています。エラーを出さずに読み込み直します。 - リクエスト中は「購入」ボタンを無効にします。
purchaseの呼び出し1回が1回の購入です。 - タイマーは端末の時計ではなく、応答の
ServerTimeUtcから数えます。 - 残りの上限が
nullなら「上限なし」、0なら「売り切れ」です。
すべてのフィールドは、SDK の MCP サーバーが配るスキル store-system に説明があります。
よくある質問
カタログにあるのに買えない商品があるのはなぜですか?
商品は棚のスロットを通してしか買えません。どのスロットにもなければ、まったく買えません。ダッシュボードはそうした商品を「どの棚にもない」という警告の下にまとめて表示します。
無料の本日のギフトは作れますか?
はい。価格のない商品はふつうの無料商品ですが、1日1回のような上限が必要です。上限のない無料商品はサーバーが販売しません。
購入を自分のサーバーで検証する必要はありますか?
いいえ。購入のたびに iDos Games のサーバーが価格、上限、入れ替えを確認します。ゲームは棚を表示して購入を頼むだけです。
プレミアムの割引は適用されますか?
はい。プレミアムのランクの割引やボーナスはサーバーが自動で適用します。実際に引かれたものと付与されたものは、ゲームが購入の応答から読み取ります。
関連ページ
- ゲーム内クエスト:デイリータスクと報酬iDos Games の既製クエストの仕組み。デイリー、ウィークリー、1回限りのタスク、宝箱付きのポイントトラック、タスクのグループのボーナス、そしてダッシュボードでの設定方法。
- ゲーム内ランキング:順位、ラウンド、報酬iDos Games の既製ランキングの仕組み。ラウンドのあるボード、順位とポイントの報酬、水増しスコアの防止、そしてダッシュボードでの設定方法。
- 放置 RPG テンプレート:ヒーロー、ウェーブ、ボスiDos Games の完成済み放置 RPG テンプレート。ヒーローはモンスターのウェーブやボスと自動で戦い、プレイヤーがいない間もゴールドがたまり、ステータスはゴールドで強化します。中身と、自分のゲームに作り変える方法。
- 新しいプロジェクトに含まれるものiDos Games の新しいプロジェクトは、ログイン、ロビー、6つの既製システムから始まります。ストア、ランキング、イベント、マルチプレイなどのシステムはアプリに必要になったときに追加されます。
自分のゲームを作ろう
アイデアを一文で書くだけで AI コーダーが作り、ゲームは専用リンクで公開されます。