ゲームの中のキャラクター
カードはウェブで遊ぶものとは限りません。ほかの人のゲームの中のキャラクターにもなれます。プレイヤーがゲームの中でそのキャラクターに会うと、カードが返事をします。『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 つの手順です。
startSession({ world, variables }):セッションを始め、最初の状態とあいさつを受け取るapplyVariables(world, state, values):game.inputsに並んだ変数にゲームのデータを書き込むbuildTurnPrompt({ world, state, history, userText, model }):モデルに送るメッセージを受け取り、プレイヤーのキーで送るfinishTurn({ world, state, userText, rawText }):モデルの返事を解析して、きれいなセリフと新しい状態を受け取り、state.variablesからgame.outputsに並んだ変数を読む
カードの JSON では、game はこうなります。
"game": {
"name": "Slay the Spire 2",
"inputs": ["hp", "max_hp", "gold", "act"],
"outputs": ["affection_delta", "choices", "action"]
}カードは Studio で書き、データだけの JSON をダウンロードしてゲームに入れます。キャラクターの話し方を変えるのは、ファイルを差し替えるだけです。
