v
Skip to content

ゲームの中のキャラクター ​

カードはウェブで遊ぶものとは限りません。ほかの人のゲームの中のキャラクターにもなれます。プレイヤーがゲームの中でそのキャラクターに会うと、カードが返事をします。『Slay the Spire 2』の SpireTalk という mod はこのしくみで、8 人の古の存在と商人がそれぞれ 1 枚の Yumina カードです。

ゲームとカードは変数だけでやりとりします。ゲームは毎ターン自分のデータをカードの変数に書き込み、AI が返事をしたあと、AI が書いたいくつかの変数を読み取ります。

ゲーム連携をオンにする ​

キャンバスの このカード をクリックし、カードの設定で ゲーム連携 を探して このカードはゲームの中のキャラクター をオンにし、ゲーム名 を入れます。

オンにすると、キャンバスの プレイヤー画面 ブロックはチャットの代わりに 3 つの列を表示します。ゲームが毎ターン AI に伝えること → AI が演じる相手 → AI が毎ターンゲームに返すこと。カードが何なのかがひと目で分かります。

ゲームの変数に印をつける ​

それぞれの変数の設定に ゲーム連携 という行が増え、3 つから選べます。

  • なし:ゲームとは関係のない普通の変数
  • ゲームから:ゲームが毎ターン書き込む値。体力、ゴールド、階層、持っているレリックなど。AI は読むだけです。カードに入れた値はテスト用の仮のデータで、ゲームの中では本物に置き換わります
  • ゲームへ:AI が毎ターン書き、ゲームがそれに従う値。好感度の変化、プレイヤーが選ぶ 3 つの返事、報酬を渡すかどうかなど

印をつけた変数の ID はロックされ、名前を変えられません。ゲームは ID で変数を探すので、名前が変わるとゲームとのつながりが黙って切れてしまいます。作成アシスタントや外部 AI も、これらの変数には触らないことを知っています。

報酬や取引などは、ゲームが自分のルールでもう一度確かめる必要があります。AI は話すだけで、本当に渡すかどうかはゲームが決めます。

mod の作者へ:カードの動かし方 ​

mod は Yumina のサイトにつなぐ必要も、アカウントもいりません。Yumina のエンジン(オープンソースです:yumina-oss)をゲームに組み込み、カードの JSON を読み、プレイヤー自身のキーでモデルを呼びます。1 ターンは 4 つの手順です。

  1. startSession({ world, variables }):セッションを始め、最初の状態とあいさつを受け取る
  2. applyVariables(world, state, values):game.inputs に並んだ変数にゲームのデータを書き込む
  3. buildTurnPrompt({ world, state, history, userText, model }):モデルに送るメッセージを受け取り、プレイヤーのキーで送る
  4. finishTurn({ world, state, userText, rawText }):モデルの返事を解析して、きれいなセリフと新しい状態を受け取り、state.variables から game.outputs に並んだ変数を読む

カードの JSON では、game はこうなります。

json
"game": {
  "name": "Slay the Spire 2",
  "inputs": ["hp", "max_hp", "gold", "act"],
  "outputs": ["affection_delta", "choices", "action"]
}

カードは Studio で書き、データだけの JSON をダウンロードしてゲームに入れます。キャラクターの話し方を変えるのは、ファイルを差し替えるだけです。