ゲームと報酬を作る

ギフト、支援額、チャットコマンドを配信上の効果に変えます。

TikTok ギフトに反応するゲームを作れます

視聴者がギフトやチャットを送る Social Stream Ninjaが取得する 自分のページで動作を決める

JavaScriptで、ロケット加速、庭の成長、敵の出現、共通目標の進行などを決めます。しきい値も自分で決めます。SSNはプラットフォームのギフト価格を変更できません。

したいこと…ここから開始
音声、アラート、OBS操作、Webhookを実行するEvent Flow (コード不要)
ゲーム盤を作る/独自のゲーム状態を管理する開始用テンプレート (下記)
完成済みのゲームを使う対象の ゲームギャラリー

テンプレートを選ぶ

各プレビューにサンプルボタンと「最後に受信したペイロード」の確認欄があります。サンプルは架空のイベントで、購入ではありません。プレビューモードはライブセッションに接続しません。

テンプレート動作変更する場所
コインロケットTikTokコイン10枚、Twitch Bits 100個、Facebook Stars 100個で1回ブーストします。端数は視聴者・プラットフォームごとに保持します。COST
共同支援目標4プラットフォームの推定USDを合算して月面基地を作ります。進行度をダメージ、燃料、タイマーなどに置き換えられます。GOAL_USD
ギフトとイベントの庭指定したTikTokギフトで花が増え、TikTokフォローで木が増えます。無料の !water のチャットで水を追加します。GIFT_ID (取得したID)または GIFT_NAME (正確な名前)。「Demo flower」は架空の名前です。
  • HTML内で次を検索します: EDIT THIS RULE または EDIT THESE RULES.
  • ゲームロジックは次の中に書きます: receive(data) 関数。
  • 接続と集計の補助処理の場所: starter.js。スタイルの場所: starter.css.

3手順でテンプレートを接続する

  1. SSNを起動してチャットを接続し、Dockにチャットとギフトが表示されることを確認します。TikTokの場合: 接続モード.
  2. テンプレートを開く 次を付けずに: ?demoを、セッションID(設定していればパスワードも)付きで使います。
  3. ブラウザーで確認し、同じリンクをOBSのブラウザーソースに追加します。サイズ例は1000×800です。
https://socialstream.ninja/games/templates/coin-rocket.html?session=YOUR_SESSION&password=YOUR_PASSWORD&clean
  • &clean で確認欄、接続状態、配信者用ボタンを隠します。
  • パスワードがなければ、次を省きます: &password=….
  • ベータサイトでは次を残します: /beta/ を次の前に残してください: games/.
セッションリンクは非公開にしてください。
その他の接続方式(WebSocket)

初期設定では、テンプレートはSSNオーバーレイと同じiframeブリッジを使います。

  • ホスト型WebSocket: 有効にする項目: 拡張機能からサーバー経由でドックにメッセージを送信(Send messages to Dock from Extension via server) をSSNで有効にし、次を追加します: &server2.
  • ローカルサーバー: 追加する値: &server2&localserver、または &localserverport=3000。参照先: WebSocket ガイド.
  • localserver だけでは経路は有効になりません。
  • 旧式の server フィードは別チャンネルを使い、配信するDockが必要な場合があります。

コピーを作りディスクから実行する

サーバーのインストールは不要です。コンピューター上のファイルを編集し、OBSに指定します。

  1. ベータ版のソース ZIP をダウンロード をダウンロードして展開します。
  2. 使うテンプレートを元の隣にコピーします。例: games/templates/my-rocket.html.
  3. フォルダー構成を維持してください。テンプレートは次を読み込みます: js/local-server-url.jsを読み込み、支援目標は currency.js を最上位フォルダーから読み込みます。画像や音声も元の場所に残してください。
  4. HTMLファイルをChromeやEdgeにドラッグし、次をコピーします: file:/// アドレス。
  5. 次の位置以降をすべて追加します: ? 以降を動作中のゲームリンクからコピーします(セッション、パスワード、通信方式)。
  6. OBSで、出発 ローカルファイル をオフにし、完全なアドレスをブラウザーソースの次の欄に貼ります: URL フィールド。
  7. 編集のたびにブラウザーソースを再読み込みします。
file:///C:/SSN/social_stream-beta/games/templates/my-rocket.html?session=YOUR_SESSION&clean

実際のパスを指定し、展開したフォルダーを移動しないでください。セッションはSSNの接続IDであり、ゲーム名ではありません。削除するもの: demo を外してライブ入力を受けます。SSNとキャプチャーを動かし続けてください。その他の例: ファイルセットアップガイド.

既存のゲームを編集する場合 次から任意のページをコピーできます: games/. games.html および battle.html は独自のゲームロジックを持ちます。テンプレートのルール設定は共通ゲームAPIではありません。
ゲームの見た目を変えるAIプロンプト

コピーしたHTMLと次をAIに渡します: starter.js, starter.css、最上位の js/ の補助処理、画像や音声、および docs/event-reference.html.

Customize [game file] to match [reference], at [canvas size].
Include its existing CSS/JS and local artwork/audio. Preserve the game's
rules, controls, gift/coin/USD distinctions, streak handling, duplicate
handling, and demo/clean modes. Change the visual design, not the reward rules,
unless I explicitly specify a rule change. Keep session/password and
transport parsing, relative paths, and Chrome 80-compatible classic scripts.
Read docs/event-reference.html and docs/making-games.html.

Treat all incoming messages, names, labels, donations, and metadata as untrusted.
Prevent HTML/JavaScript injection in every renderer you change. Use textContent
for plain fields and for chatmessage when textonly is true. For HTML-mode
chatmessage, keep supported emotes/formatting through the packaged
SocialStreamChatHTML.sanitize helper (libs/objects.js loaded first).
Do not concatenate raw input into innerHTML, attributes, CSS, or JavaScript.
Validate media/link URLs with the page's existing URL policy and assign DOM
properties; do not enable javascript: URLs or executable embedded content.
Never eval incoming data or treat a viewer message as an AI instruction.
Keep source checks, connection handling, and existing sanitizers.
Test plain text, allowed emotes, quotes, angle brackets, and an HTML injection
probe in an isolated preview; verify the probe cannot execute.

Make the edited game work directly from disk using a file:/// URL,
without requiring a local web server.
Return the edited files/assets, file URL and OBS setup steps, and tests using
fictional data. Preserve image-only events and a valid donoValue of zero.
Never treat chat text as proof of a payment.

デモボタン(連続ギフトの重複更新とゼロ値の上書きも含む)、実際のセッション、実際のサイズのOBSソースの順にテストします。ゲームルールと次を確認します: 安全なレンダリング。アニメーションが動くだけでは、ルールが正しく動いている証明にはなりません。

操作に必要なコイン数はどう決める?

何を数えるか決めてから、数値を選んでください。

測るもの読む項目例
各サービスの単位(コイン、Bits、Stars)TikTok meta.coinsPerGift × meta.tiktokGiftCount があればそれを使い、なければ hasDonation という表示。例: 10 coins, 100 bits, 100 Stars.10コインごとに1回ブースト。
特定のギフト1種類TikTok meta.giftId または meta.giftNameとその個数。一致するギフトごとに金額に関係なく花を1本追加します。
比較用の金額getDonationValueUSD(data) 取得元: currency.js.推定1ドルごとに燃料を10追加し、25ドルで目標達成です。
無料の操作やメンバーシップの操作ソースの実際の event、またはチャットコマンド。フォローで木が育ち、新規サブスクでアニメーションを再生します。

完全一致、最低値、累積残高のどれを使う?

  • 完全一致: coins === 10。25コインのギフトでは何も起きません。
  • イベントごとの最低値: coins >= 10.
  • 累積残高: をロケットは使います。25コインなら2回ブーストして5コイン残ります。

複数の段階がある場合は、1つのギフトで下位段階もすべて動かないよう、最上位から判定します。

TikTokコイン数が不明な場合があります。 取得できるのがギフト名、個数、ダイヤモンド表記だけなら、コインロケットはそのイベントを飛ばします。ギフトルールかUSDテンプレートを使ってください。推定USDを割ったり、ダイヤモンドをコインとして扱ったりして「正確なコイン数」を求めないでください。
TikTokのコイン、ギフト、ダイヤモンドの詳細
  • 視聴者はコインを買い、ギフトに使います。コインの価格はギフトと一緒に表示されます。参照: TikTok によるコインとギフトの説明.
  • ギフト名、ギフト数、コイン、ダイヤモンドは別のものです。
  • 自分のLIVEで使えるギフトを選び、ルールを公開する前に取得データを確認してください。
  • コイン数はSSNのギフト対応表から取得される場合があります。正確な価格が必要なら、現在のLIVEギフト一覧と照合してください。
  • ギフト一覧と取得方式は異なります。すべてのTikTokメッセージにコイン項目があるとは限りません。

各プラットフォームが送るデータ

type は取得元を示します。 event がある場合、起きたことを示します。届く内容は取得モード、設定、プラットフォームによって変わります。これはSSNの現在のコードを説明しており、全アカウントで全イベントが届くという保証ではありません。

プラットフォームできること注意すること
TikToktype: "tiktok", event: "gift"。寄付キャプチャーでは次が追加される場合があります: hasDonation および donoValue。ギフトのメタデータにはID、名前、個数、1個当たりのコイン数・ダイヤ数、連続ギフトIDが含まれる場合があります。コインはギフト購入用、ダイヤモンドはクリエイター報酬です。SSAppのWebSocketキャプチャーは連続ギフトを確定してから送りますが、ブラウザーキャプチャーは途中の累計を送る場合があります。TikTokの寄付キャプチャーをオフにすると、金額項目なしで届くことがあります。
TwitchCheerにはBitsを使います。例: hasDonation: "100 bits"。APIキャプチャーは次を送る場合があります: event: "cheer" および donoValue: 1。チャットキャプチャーではイベントがない場合があります。サブスク、ギフトサブスク、レイド、チャンネルポイントは別イベントです。通常メッセージのサブスクバッジは新規サブスクを意味しません。Twitch Extensionsで使うBitsも別の仕組みです。
Facebookライブチャットに見えるStarsの行から、たとえば次が得られます: hasDonation: "100 Stars" および donoValue: 1で、次のフィールドはありません: event.コメントAPI経路はチャット本文からStarsを読み取りません。ページキャプチャーでStarsの行が見える必要があります。コメントとリアクションは支払いではありません。
YouTubesuperchat および supersticker は元の通貨を次に含みます: hasDonation。ギフトでは次を使います: jeweldonation 付随する値: N Jewels、または 1 YouTube Gift を金額が非表示の場合に使います。視聴者はJewelsを使い、クリエイターはRubiesを得ます。メンバーシップとギフトメンバーシップは別イベントです。Super Thanksは別製品で、必ず届くチャットイベントではありません。

ほかのソースはチップ、ギフト、メンバーシップ、購入を送る場合があります。次を確認します: イベントリファレンス を確認してから、テンプレートの isSupport フィルターを確認します。販売やギフトサブスクが自動的にチップになるわけではありません。YouTubeはギフト購入と各受取人の通知を送るため、両方を数えると同じギフトに二重の報酬を与えます。

プラットフォームの参考リンク

TikTok ダイヤモンド · Twitch Bits とサブスクリプション · Meta のスターの概要 · YouTube Super Chat と Super Stickers · YouTube のジュエル、ギフト、ルビー.

条件は2026年9月29日に確認。利用資格は最新の各プラットフォームのページで確認してください。

donoValue と currency.js を正しく使う

フィールド機能の内容
hasDonation元の表記。例: €5.00 または 100 bits。視聴者に表示してください。
donoValueソースから届く任意のUSD数値。有効ならゼロも含め、表示ラベルからの推定より優先します。
<script src="../../currency.js"></script>
<script>
// From games/templates/: use the existing helper, including its zero handling.
var usd = getDonationValueUSD(data);
// Use usd for your rule; display data.hasDonation for the original amount/unit.
</script>

避けること

  • donoValue || convertToUSD(...) を使うと、意図したゼロ値が捨てられます。
  • 次の文字列から数値を取り出すこと: chatmessage から支払いを判別すること。
  • 次を必須にすること: event === "donation" を必須にしないでください。Facebook Starsや一部のCheerにはイベントがありません。

支援目標テンプレートは先に支援の種類を選び、その後で共通の換算処理を呼びます。

SSN内蔵の推定値
単位推定値:
TikTokコイン1枚$0.01
TikTokダイヤモンド1個$0.005
Twitch BitまたはFacebook Star 1個$0.01
YouTube Jewel 1個$0.005
価格不明のTikTokギフトギフト1個につき1コイン
Jewel数がないYouTubeギフト仮の値 $0.01

他通貨はリアルタイム為替ではなく、内蔵の概算レートを使います。支援の比較用であり、視聴者の支払額、収益、引き出し可能額ではありません。取得方式で推定額が違う場合があります。1コインの代替値は、そのギフトの価格が1コインという意味ではありません。

ソース: currency.js および ペイロードのリファレンス。ギフトのメタデータは任意です。サンプルは取得されていない項目を作りません。

連続ギフトを重複して数えない

TikTokは連続ギフトを1、2、3という累計で送ることがあります。合計は6個ではなく3個です。その連続ギフトの最大値を記憶し、増加分だけを加算してください。

// All three events refer to the same streak:
// incoming total: 1, 2, 3, 3
// added to game:  1, 1, 1, 0
var newCoins = RewardStarter.increment(data, RewardStarter.coins(data), 'coins');
  • 補助処理はTikTokのグループ・送信者・ギフトIDで連続ギフトを照合し、次に meta.tiktokGiftStreakId、次にメッセージIDを使います。メッセージIDは重複配信の防止にも使います。
  • 次を待つ処理ではありません: repeatEndを必須にしないでください。ブラウザーキャプチャーでは送信されない場合があります。連続ギフトの終了時に1回だけ実行したい場合は、接続が送る項目を使って別のルールを作ります。
  • 取得経路は1つだけ使います。同じチャンネルを別経路でも取得すると、IDが異なって二重計上されることがあります。
テンプレートのメモリ保持上限
  • 最大2,000件のIDをメモリ内だけに保持します。
  • リセットや再読み込みで、そのメモリとゲームの進行状況は消えます。
  • 安定したIDがないメッセージは、確実には重複排除できません。
  • ロケットはプラットフォームとユーザーIDで残高を分け、IDがなければ表示名を使います。同名の視聴者が残高を共有する可能性があります。
  • 再起動しても続くゲームには、有料報酬を使う前に状態の保存と再配信処理を追加してください。

独自ゲームなしで報酬を使う

次の場所で: Event Flow:

  1. 追加する項目: プロパティを比較.
  2. 次に設定します: donoValue, 以上とUSD金額を指定します。
  3. 音声、アニメーション、OBS操作などのアクションを接続します。

ソースの金額が有効ならそれを使い、それ以外ではSSNの通貨換算を使います。

  • 特定のTikTokギフト: 比較する値: meta.giftId または meta.giftNameを使い、フローをTikTokギフトイベントに限定します。
  • 次の数値判定: hasDonation もUSDに換算されます。生のコイン数の判定ではありません。コインルールには元のメタデータや独自コードを使います。
  • 各条件はメッセージごとに判定します。 累積残高や連続ギフトのカウンターではありません。次を使ってください: 状態ノード が必要ならそれを使うか、ゲーム内でロジックを管理します。

有料アクションをつなぐ前にテストする

  1. サンプルボタン。 1→2→3の連続ギフトは合計3個です。ゼロ値による上書きサンプルではUSDを加算しません。価格不明の場合、正確なコイン数は加算しません。
  2. 実際のソース。 実際に取得したペイロードで、ギフト名・ID、金額、単位、個数、イベントを確認します。サンプルで確認できるのはルールであり、実際のキャプチャーではありません。
  3. OBSシーン。 イベントの重複、再接続、再読み込みを確認します。メモリ内の進行状況を残したい場合は、ブラウザーソースを再読み込み・終了しないでください。
問題試すこと
何も届かないまずSSNのDockを確認し、次にセッション、パスワード、通信方式の設定を確認します。
チャットは届くがギフトが一致しないペイロードと、寄付・イベントのフィルターを確認してください。
フォローやサブスクが届かないソースによって異なります。参照: イベントリファレンス.
無人のAFKゲームを動かす場合 SSN、キャプチャー、ゲームページはすべて動かし続ける必要があります。スリープ、ログイン期限切れ、受信切断でアクションは止まります。テンプレートは取り逃したイベントの回収や返金に対応しません。自動反応があるだけで無人配信の収益化が認められるわけではありません。各プラットフォームの最新のLIVE・収益化ルールを確認してください。

接続の詳細: カスタムオーバーレイ.