# 利用可能な処理

カード変数変更は物理個体別です。部分選択・山の結合分離・入力再開でも値を保持します。所属タブ・同名変数の型・カウンター等の取得は[個体値と共通参照](physical-card-values.md)に従ってください。タイマーの型付き「値」は実行時点の秒数です。

条件分岐・数値引数・共通処理から、[実カードの配置枠](card-grid-values.md)を参照できます。単体カードの一時値でも登録済み`grids/<grid-id>/filled|occupied`を読み取れます。入力待ちから再開しても同じ個体を解決します。未登録の`branches.0.left.source`のような部分bindingは作らず、正式な数値引数全体へ接続してください。

選択・入力の回答画面は×で一時的に閉じ、未回答の対象者が上部バーの「回答画面を開く」から再表示できます。選択中・入力中の値は同じ画面内で保持します。閉じる操作は回答・取消・後続処理の再開ではなく、回答期限や状態変更の制限も維持します。確認通知の再表示は「確認画面を開く」です。

対象者の通常／プレイヤー／チームタブを開く`openTab`の引数・権限・省略時動作は[タブを開く](game-options-and-tabs.md#タブを開く)を参照。

サムネイルのJPEG化はゲーム処理ではなく、編集・サーバー保存時の画像処理です。カード移動やカード変数の処理で `thumbnailOriginal` を参照しません。[保存仕様](game-data-spec.md#サムネイル画像)。

オンラインで仮想席へ視点を切り替えた参加プレイヤーは、その席として処理を実行・回答できます。「実行者」は操作した仮想席であり、通信の認証本人とは別です。実参加者の代理操作・観戦者操作は不可。手番・公開範囲・部品権限は操作席のものを維持します。作者JSONへ特別な設定を追加する必要はありません。

## 通知・確認

`type:"notice"`、`notice:{"mode":"notify"|"acknowledge","title":"タイトル","buttonLabel":"任意のボタン文言"}`、`playerTarget`で表示対象、`messageParts`または固定`message`で本文を指定します。コードは`notify(players: ..., mode: NoticeMode.ACKNOWLEDGE, title: "確認", message: "本文")`。選択肢・最少／最多選択数・回答変数・期限・messageConfigは設定しません。旧choice/inputWindow/messageは別処理として維持します。

`notify`は表示後すぐ次へ進み、既定「閉じる」または×で閉じます。進捗なし。連続通知は既存の通知枠の最新1件です。`acknowledge`は対象者全員が既定「確認しました」を1回押した後だけ進みます。×／Escは未確認のまま閉じ、本人は上部の「確認画面を開く」で再表示できます。「確認中：完了人数／対象人数」以外に回答や対象IDを進捗へ出しません。

対象は要求作成時に固定。途中参加で追加せず、途中退出・切断でも確認済みにせず待機を維持します。再接続後も同じ確認状態です。閲覧と許可済みの手動操作は継続できますが、別の処理開始は競合防止で待機します。本文の参照先は既存の秘密情報検査を受け、対象外へ本文・私有継続を配信せず、公開ログへ本文を追加しません。一時値は`temporaryBindings.messageParts`と既存の文字結合／明示的文字化を使えます。実行者のない自動処理では対象を明示してください。[完全サンプル](examples/notification-confirmation.json)。

## カード変数の整列基準

`sort.cardSortKeys`は優先順の配列：`[{"variableKey":"strength","type":"number","direction":"ascending"},{"variableKey":"suit","type":"text","direction":"ascending"}]`。各キーのtypeはnumber／text、directionはascending／descending。最大64基準。同値は元順、未設定は昇降順とも末尾。数値の空欄・非有限値は未設定、文字の空文字は有効で未定義だけ未設定。文字はUTF-16コード単位順。各収納先を独立して並べ、定義・ID・表裏・公開範囲は維持。秘密属性の参照だけでなく導かれる順序も公開制約の検査対象。

省略／`[]`は従来のカード定義順とmode。変数基準があればmodeではなく各基準のdirectionを使う。カード定義を並べ替えて代用しない。コード形式は`sortCards(cardSortKeys: [CardSortKeyValue(variableKey: "strength", type: CardSortValueType.NUMBER, direction: CardSortDirection.ASCENDING)])`。引数と定数はTAB補完に対応。[完全例](examples/card-variable-sort.json)。

`canMove:false`は手動移動の制限で、手札のselect権限とは別。選択中カードを`move`で出す処理は作成できる。手動ドラッグの制限を理由に作者処理を止めず、他人の手札・秘密情報・ボタン権限は検査する。

標準トランプレイアウトの更新は新規生成・テンプレートの明示適用に限る。処理・座標・移動枚数・公開範囲の意味は変更しない。[保存初期値](examples/trump-default-layout.json)。

## 文字の全体変数と同時ダイス

`variable`の`source:'global:<id>'`は宣言型に従う。文字には`mode:'set'`と`variableValue:{kind:'fixed-text',value:''}`、文字参照、または`temporaryBindings.variableValue`の文字式を指定する。数値を結合する場合は`to-text`が必要。文字への加減算、異なる型の代入、秘密情報の無許可公開は拒否する。従来の数値処理は維持する。

`dice`は`diceTargets:['die-a','die-b']`または`temporaryBindings.diceTargets`の部品単体／配列を使う。各個体の面重みで独立抽選する。`showAnimation:true`は全対象同時に1回の待機、OFFは即時。`[]`は抽選・演出・待機なし。省略時の旧`source`は有効で、両方あれば一覧優先。[機能例](examples/global-text-batch-dice.json)。

## ピースの指定マス配置

`move`（コード編集では`moveCards`）の`targetKind:"piece"`で、`destinationGridId`と0始まりの`destinationGridRow` / `destinationGridColumn`を指定する。行列を両方省略すれば自動探索。片方のみ・負数・小数は禁止。`temporaryBindings.destinationGridRow` / `.destinationGridColumn`は数値単体の式に対応する。別タブ・非表示倉庫からの移動も成功時だけ所属を変更し、`face`は受入判定前に仮適用する。

一括は入力順の部分成功。任意の`placementSuccess`（真偽値）、`placementReason`（文字列）、`placementCount`（数値）は既存の単体一時変数ID。分割計画を集約し、全件成功・最初の失敗コード（成功時空文字）・成功個数を後続処理で利用できる。失敗個体は面・位置・所属を維持する。出力省略時は実行者へ警告。権限拒否・秘密情報保護は従来の操作拒否／処理停止であり、この成否出力による回避はできない。

例（Action断片。実ゲームのIDに置き換える）：

```json
{"id":"place-stone","type":"move","target":"actor","targetKind":"piece","source":"reserve-stones","destination":"board-card","amount":{"kind":"number","value":1},"destinationGridId":"board-grid","destinationGridRow":3,"destinationGridColumn":4,"face":"down","placementSuccess":"placed-ok","placementReason":"placed-reason","placementCount":"placed-count"}
```

保存先は事前に`variable`処理の`temporaryDefinition`で定義する。理由は`out-of-bounds`、`occupied`、`acceptance`、`size-mismatch`、`grid-not-found`、`invalid-coordinates`、`missing-piece`、`missing-definition`、`no-space`。[配置と失敗時の組み方](authoring-patterns.md#ピース盤面大量処理の組み方)も参照。

表示・活性の「カード選択条件」は場所・種類・比較・枚数で設定。JSONはcomparison.left.card-count.cardsのlocationとselected-by-actor／card-type／card-variableのANDで表現し、並び順・取得数を付けない。0枚も判定可能、山は実枚数、ピース・ボックス自体は除外。[サンプル](examples/selected-cards-button.json)。

盤面を見る向きは処理ではなくタブ設定`viewpoint`で指定する。移動・配置・カードの回転・範囲選択の引数は従来の正規盤面座標のまま。閲覧者の向きに合わせて処理側のx/yやカード回転値を変更しない。閲覧方向は権限や秘密情報の公開範囲を変更しない。

ターンマーカーも`multipleAllowed:true`にできます。markerのmoveは指定全員へ付け替え、giveは追加、removeは指定者だけ除去します。全解除は手番なし、再付与も可能です。終了・開始は所有者集合の切替ごと各1回、全解除は終了だけ、空からの付与は開始だけ。現在基準のturn対象は全所有者、順番基準は1人です。チーム条件で所属全員を対象にできます。例：`examples/multiple-turn-owners.json`。手番のみ操作ONで空から付け直すボタンには、作者が明示的な操作許可を用意してください。

`commonCall` の呼び出し先は `commonProcessId` です。旧 `source` がなくても設定済みとして保存できます。解決順は `commonProcessId ?? source`。未選択・存在しない共通処理・必須引数の不足は拒否します。例：`examples/common-call-save.json`。

タブの `hidden:true` は倉庫として画面から隠す設定で、秘密権限ではありません。倉庫内の表向き・全員公開カードを条件検索して移動できます。カード自体の本人限定・チーム限定・裏向きの保護は維持します。倉庫から出すだけのために `temporaryPublish` は不要です。

非表示タブの予備札も、`move`で固定のカード部品を移動元に指定して公開ホルダーへ出せます。`destinationLocations`に移動先を指定し、表向きなら`face:"up"`。回収条件は指定収納先の実候補だけで評価し、同じカード定義の別在庫を検査対象に混ぜません。実際の秘密カードを属性で選別する処理は引き続き公開制約を受けます。`temporaryPublish:true`を移動へ付けて制約を回避しないでください。例：`examples/hidden-stock-transfer.json`。

一時値の公開範囲は保存前にも検証します。限定公開の値やその値に依存する条件結果を全員公開のログ・変数・共有処理へ渡す明確な矛盾は保存エラー、対象者・カード状態等で変化するものは保存可能な警告です。警告には該当処理へのリンクがあります。実行時の安全チェックは維持し、該当処理・参照元・公開先・停止理由を表示します。秘密の値・回答・カード内容は表示しません。公開が意図された場合に限り、既存の `temporaryPublish:true`（variable/message/logのみ）を編集者が明示します。自動的に公開設定へ変更せず、警告を消すために公開を有効化しないでください。保存形式の項目・版は変わりません。自動送信や専用送信機能はありません。

## テキストの所有者を参照する

プレイヤー対象`{kind:"part-owner"}`は、テキストの文章・変数表示ではそのテキストの`playerBoxOwnerId`または`playerTabOwnerId`を参照します。表示者・手番・実行者へのフォールバックはしません。コード定数は`partOwner`（項目表示名「このテキストの所有者」）です。例えば`{kind:"value",value:{kind:"player-variable",variableId:"score",players:{kind:"part-owner"}}}`で各所有者の得点を表示できます。部品ファミリー内の保存済み部品ID参照は、実行時に同じ座席の対応部品へ解決します。共通処理の内部対象は明示引数を使用してください。

## 一時変数を通常処理で使う（形式20／処理形式4）

専用の「一時変数プログラム」／type:temporary／temporaryProgramは廃止しました。旧形式は保存・読み込みで廃止済みエラーにし、自動変換も無断削除もしません。旧ポーカーデータを利用する場合は通常の処理で作り直してください。保存形式は構造化されたAction列で、コード文字列をJSONへ保存しません。

### 変数を変更

通常のtype:variableでsourceをtemporary:<ID>とし、temporaryDefinition:{id,name,type,collection,nullable?,schemaId?}で定義します。以降の代入ではtemporaryDefinitionを省略できます。値はtemporaryValue:TemporaryExpressionへ指定し、mode:setで上書きします。型はnumber/text/boolean/card/player/team/marker/part/object、収まりはsingle/arrayです。型と単体／配列の不一致、未定義・未初期化の参照は拒否します。数値のadd/subtractも既存方式と同じですが、配列・文字・参照には使いません。オブジェクト型はtemporarySchemasへ定義します。

編集画面では「変数を変更」→対象→「この操作の一時変数」から定義・既存変数を選びます。名前・型・単体／配列を決め、「代入値」でゲーム参照・一時変数・値・計算・配列操作を選びます。専用プログラム画面はありません。数字や文字は直接入力でき、必要な参照は選択して組み立てます。

### 繰り返し

既存のtype:loopを使います。「繰り返し方法」で回数・条件・プレイヤーごと・配列の要素ごとを選びます。配列方式はloop:{mode:"array",array:TemporaryExpression}。開始時の配列順を固定し、内部の式でloop-itemとloop-indexを参照できます。sourceを省略すると最も内側の対応する繰り返しを参照し、明示する場合はActionのIDを使います。現在位置は0始まりで、入れ子と既存loopBreakに対応します。配列専用の別ループ処理は作りません。

### 値・配列・寿命

型付き式には固定値、一時変数、登録済みゲーム値、オブジェクト項目、算術・比較・AND/OR/NOT、配列の抽出・結合・並べ替え・重複除去・件数・合計・平均・最大最小などを使います。通常行のtemporaryBindingsでカード・プレイヤー・収納先・部品・数値・文章・条件の登録済み引数へ接続します。通常の変数設定、条件分岐、メッセージ、カード移動で同じ値を再利用します。

一つのボタン操作内の分岐・ループ・共通処理で共有し、入力／演出待ちでも保持します。終了・エラー・全体リセットで破棄し、次の操作へ引き継ぎません。初期／フェーズ／ターンの自動イベントは独立したスコープです。得点など次の操作にも残す値は通常の全体／プレイヤー／チーム変数へ明示反映します。

共通処理はreturnTypeとreturnValueを持ち、通常のcommonCallのtemporaryResultへ受取先の一時変数IDを指定します。全処理と待機の完了後に代入し、ゲーム終了などの終端処理後は返しません。

### コード編集と定数

選択式UIは日本語、コード編集はmoveCards、setVariable、repeat、showMessageなどの英語識別子を使い、同じActionを往復編集します。引数はcards、count、face等、固定選択肢はCardFace.UP/DOWN/KEEP、MessageDisplay.TOAST/DIALOG/LOGなどの定数です。自由な数字・文章はそのまま入力します。Tabで候補を開き、定数を入力する位置では型に合う候補だけを表示します。↑↓で選択、もう一度Tabで確定、Escで閉じ、Enterは改行します。処理・引数・値・参照の候補もコード欄に重なる小ウィンドウとし、開閉で編集欄を移動しません。引数内の改行も許可し、保存時・入力欄を離れたときに整形します。引用文字列は変更しません。編集コードと内部構文の文字数上限は100万UTF-16文字、2万トークン・2000処理です。整形後の上限超過もエラーとして表示し、入力を保持したまま保存を拒否します。ユーザーが付けた名前と文章は翻訳しません。未定義の定数・型違い・未選択のある状態は保存できません。JavaScriptの実行、任意通信、未登録のプロパティ参照は行いません。

### 公開範囲・安全性

ゲーム値はgame.players、game.actor、game.turn-player、game.turn-players、game.parts、game.cards、game.markers、game.phase、game.playerCount、game.input.number/text/texts、game.global.<ID>、チーム有効時のgame.teamsから取得します。属性は登録済み項目のみ。プレイヤー名はpath:["name"]、参加プレイヤーIDは["id"]、手札カードは["hand","cards"]、プレイヤー変数は["variables","変数ID"]です。partの["id"]は部品ID、playerの["id"]は選択回答との照合用の既存参加プレイヤーIDです。カードのid属性や別のアカウント属性は参照できません。[参照と引数の完全表](reference-contract.md)を参照してください。

一時値の秘密ラベルを維持し、秘密条件・秘密配列による派生値も公開先を検査します。表示OFFは秘密設定と同義ではありません。明示公開を許す通常のvariable/message/logだけtemporaryPublish:trueを使えます。runtimeTemporary*、runtimeLoopState、runtimeLoopFramesは実行中専用で、作者JSONには生成しません。サーバーで確定し、参加者へ一時値や秘密の継続を配信しません。

式の深さは64、処理の入れ子は深さ64を独立に数えます。値オブジェクト・登録パスは各12、変数128、配列10000、全ループ1000回、実行10000ステップ、概算2MB等の安全上限を維持します。配列の空は合計0、平均・最大最小・要素取得はエラーです。

[通常処理の一時変数サンプル](examples/integrated-temporary-actions.json)はactionsの抜粋です。ボタンや初期処理のactionsへ配置し、[JSON Schema](schema/game.schema.json)と照合してください。

## gameEnd：ゲーム終了

引数なし。`{"id":"end","type":"gameEnd","target":"actor","amount":{"kind":"number","value":1}}`。target／amountは既存処理形式の共通既定値で、結果の対象指定には使わない。settings.resultから結果を固定しリザルトを表示する。この処理以降は同じ配列だけでなく共通処理の呼出元、条件・ループの続きを含め実行されない。終了後は盤面・各手札・タブを閲覧できるが操作不可。手動のゲーム中断は別で結果を作らない。再戦は新しい部屋を使用する。

## 処理編集のデータ構造

処理編集の「このゲームのデータ構造」で、実際の変数・部品・タブ・フェーズ名と型を確認できます。ゲーム直下のプレイヤー[]・チーム[]・タブ[]・部品[]・全体変数[]・人数別変数[]・マーカー[]・フェーズ[]をたどります。設定欄も同じ構造を使い、引数に合わない型、空一覧、未使用のチームは出しません。変数の参照は変数名→値、カード対象は場所→カード[]→条件→並び順→選択数、収納先は場所で終わります。編集時点で未確定の参加者・手札や、ルームの秘密データを取得する機能ではありません。ツリーは表示専用でJSONへ保存せず、既存のPlayerTarget／CardSelector／CardLocation／値参照へ変換します。JSON Schemaの現行形式は20／処理形式4です。


編集・確認画面は2026-10-19に一本化しました。マイゲームの「編集する」と各ボタンの処理編集はメソッド形式、確認・実部屋はスクロール盤面を使います。旧UI用のクエリや処理コード文字列をJSONへ生成しないでください。新規JSONはschemaVersion 20／operationSchemaVersion 4です。通常処理に統合した一時変数は型付き編集・保存・再読込・実行に対応し、新規オンライン部屋はserver-v1で評価します。


## 保存エラーの修復リンクとリセット

保存時の未選択検査は、正式な処理配列（actions／initialActions／elseActionsおよび進行イベントのstart／end）と条件式の参照に限定する。カード・サイコロのテンプレートlayersのtype:variableや、盤面部品のkind:box等を処理・値参照として扱わない。表示項目のために架空の処理設定を要求しない。

編集画面の保存エラーには、部品・ボタン・初期処理・フェーズイベント・共通処理の名称を含む「開く」リンクを出す。内部では検査時の構造化パスを現在のゲームに照合して所有者と処理IDを解決し、翻訳済みエラー文を解析して配列位置を推測しない。入れ子の処理も既存ダイアログで選択・表示し、新画面では対象行へフォーカス・スクロールする。通信エラーなど修復先を特定できないものに誤ったリンクを出さない。移動だけでデータを変更しない。sourceが空の変数処理は編集専用の未選択として開き、対象変数を選ぶまでは保存を許可しない。

リセットの新規編集はゲーム全体だけとし、方式・参照元・プレイヤー・対象種類は表示しない。実行前確認は維持する。新規メソッドはリセット（）で、JSONは既存のtype:reset、mode省略またはgameを使う。過去の対象限定リセットを黙って全体リセットへ変更することは危険なため、読み込み・実行互換を残し、「ゲーム全体のリセットに変更」を押した時だけ対象指定を除去する。新規JSONやAI生成で対象限定方式を提案しない。現行形式はschemaVersion 20／operationSchemaVersion 4。


## 部分設定・文章・処理順の編集

編集中の専用設定（通知・選択表示・入力表示・操作権限・カード文章操作）は必須の兄弟項目が未設定でも処理行を表示する。保存時の検査は維持し、不足項目を行内の未選択から設定できる。通知の表示場所だけは実行器の既定値（画面上部/toast）を使うため、秒数や通知種類のみを確定してもその既定値を補って保存できる。その他の必須項目を推測して保存しない。1行の変換エラーはその行に表示し、他の行や分岐を隠さない。未完成時は保存不可で、戻る・取消・コード確認を維持する。

プレイヤーの条件なしは「全プレイヤー」と表示し、選ぶと並び順へ進む。カード条件の「条件なし」とは区別する。プレイヤー情報の「プレイヤー名（文字）」は既存の player-name 参照であり、内部コードは .名前 とする。変数の .変数.名前 と混同しない。メッセージ・ログの「組み立てる」で文字と変数・参照値を順に追加し、「この文章にする」で一度だけ反映する。途中の閉じるは元の文章を保持する。

処理行の専用ハンドルはPointer Eventsで同じブロック内のドラッグ並び替えを行う。分岐とループは中身ごと動かし、ID・未登録の保持項目を維持する。上下移動と戻る／進むも残す。通常の入力やスクロールはドラッグ開始に使わない。編集画面・設定・処理ダイアログの？から既存の60秒診断を開ける。診断は編集イベントと文字数など数値メタデータだけを記録し、文章・ゲームJSON・名前・認証情報を送らない。送信はユーザー操作のみ。JSON形式19／処理形式3は変更しない。


## 自明な選択の省略・条件追加・処理行操作

一つに決まる対象（実行者・表示者・ボタン所有者・ループ中・単独ターン指定（複数不可または順番基準）・単独所持マーカー）は選んだ時点で確定し、並び順・選択数・追加の確定を省略する。ANDで単一対象を絞る場合も一件以下だが、ORで別候補を加えると複数になる。最大／最小は同点があり得るため単一扱いしない。引数だけが一件限定なら並び順を残して選択数の画面だけ省略する。一人の手札という収納先は一件でも、その中のカードは複数なのでカードの並び順・選択数は別に指定する。新規の条件・AND／OR追加は条件全体を未選択にし、最初と同じ条件ナビゲーションを開く。比較式や対象値を自動挿入しない。処理行は複製・上へ・下へを持ち、同じブロック内で移動する。複製は直下へ追加して入れ子の処理・分岐に新IDを付け、参照先IDと未登録の保持項目は維持する。並び替えと戻る／進むは元のIDを維持する。既存条件が変換できない場合は元データを保持してエラー表示し、空の分岐として上書きしない。既存JSONを読み込んだだけで対象指定を書換えず、新規・再指定の単一対象は既存のactor/turn等の形式で保存する。JSON形式19／処理形式3は変更しない。

## 条件導線と保存制約（2026-10-18）

条件編集は参照先→判定→値の段階選択を使用する。マーカー条件はマーカー→所持／未所持→対象プレイヤーを選び、条件行に対象プレイヤー・マーカー名・所持有無を表示する。全条件／いずれか・常に成立／不成立・値比較・フェーズ所属ボタンのフェーズ条件は新規候補に出さず、AND／OR／NOT／括弧と参照選択へ統合する。既存条件と内部のsource順序は読み込みで変更しない。sourceは新規の並び順候補に出さず、元の順とも表示しない。所属フェーズを持たない盤面ボタンではフェーズ→実行中／実行中ではないも選べる。新規カード・収納先選択は名前の昇順。新規プレイヤー選択はターン順昇順、単一マーカーは表示と確定値とも選択数1。並び替え値は対象の変数、同値は候補の取得順を維持する。未選択の編集はルール確定不可。保存済み処理でも必須対象が欠けていれば、配布データ作成とサーバー公開で拒否し、処理の経路・不足項目を返す。文字列としての「未選択」は拒否しない。JSON形式19／処理形式3は変更しない。

## 共通対象クエリ

PlayerTargetは`{"kind":"select","condition":PlayerTarget,"selection":{"order":"source|ascending|descending|random","key":"変数IDまたは$name/$turn","count":"allまたは1以上の整数"}}`で指定できます。conditionは`{"kind":"and|or","targets":[PlayerTarget,...]}`で入れ子にできます。ターンは`{"kind":"turn","position":"offset","offset":0,"basis":"current|order"}`（番号0始まり、循環）。チーム条件は`{"kind":"team","teamId":"登録チームID"}`または`{"kind":"team","basis":"current|order","index":0}`です。チーム無効時は指定しません。単一マーカーへの対象はcount:1とします。

CardSelector.selectionも同じorder/key/countを使い、カードはkeyに変数名または$nameを指定します。複数収納先はCardLocationのkind:multiple、locations、selectionを使用します。収納先の並び替えキーは$name。条件→並び順→選択数の順で評価します。省略した既存データは全件・元の順です。処理のamountとクエリのcountを混同しないでください。完成例は[共通対象選択](examples/target-selection.json)です。

タブに任意の盤面幅・高さ `background.width` / `background.height` を設定した場合、移動元／移動先の判定・ホルダー配置は対象タブの論理寸法を使用します。編集で盤面を縮めた場合、初期表示範囲の高さとyを新盤面内へ自動調整しますが、処理の座標解釈は変えません。初期表示範囲 `initialViews` は処理の対象・座標・権限に影響せず、処理JSONにカメラ座標を指定しません。

## 計算式とボタン配置先、手札整列

`variable` の数値代入値 `variableValue` に `kind: "formula"` を指定できます。`tokens` は1〜60項目で、`{kind:"value",value:NumericValue}`、`{kind:"operator",operator:"+"|"-"|"*"|"/"}`、`{kind:"parenthesis",value:"("|")"}` を並べます。値に式・固定文字・実行時入力を入れません。括弧は深さ12まで。×÷優先、同順位は左から計算。`rounding` はnone（省略時）、floor、round、ceil。不正な構文は拒否され、0除算・非有限値は変数を上書きせずエラーになります。自由入力コードや数式文字列は使いません。

`PlayerTarget.kind: "button-owner"` はプレイヤータブ上の盤面ボタンの所有者。押した人とは別です。通常タブ・チームタブでは個人所有者はなく、対象なしとなります。`sort` の移動元には個人／チーム手札も指定でき、対象カードのスロットを一覧順の昇順・降順に整列します。表裏・公開範囲は変更しません。例: `examples/composed-values.json`。

ピース移動でボックスを移動元にすると、その箱のカードに載ったピースも対象になります。山の途中のカードへの付属も含み、ピースだけを外して移動します。別タブ・別ホルダー・ゴミ箱内のカード上のピースは対象外です。カード自体を一緒に移動する指定ではありません。フィルター・個数は従来どおり適用します。

カード／ダイスのレイアウトの枠外編集は作者用機能で、処理の項目追加はありません。枠外部分はゲーム中に表示せず、処理がレイヤーを削除することもありません。削除整理は編集画面の「枠外・重複項目の整理」の削除操作だけで行います。

`playerBoxVisibility`／`teamBoxVisibility` は以後入るカードの初期表示設定を変更します。在庫カードの公開範囲は変更しません。在庫を変える場合はカードを対象に公開範囲の変更処理を指定してください。移動先の入庫初期値は移動処理の確定時に適用され、後続のカード操作を上書きしません。

## ログを追加

`{"id":"announce","type":"log","target":"actor","amount":{"kind":"number","value":0},"logParts":[{"kind":"player-name","players":{"kind":"actor"}},{"kind":"text","text":"の得点："},{"kind":"value","value":{"kind":"player-variable","variableId":"score","players":{"kind":"actor"}}}]}`

`logParts` は1〜30項目。`text` は500文字まで、`player-name` はPlayerTarget、`value` はNumericValueで全体・個人・チーム・カード変数、カウンター、ダイスなどを参照します。上から結合し実行時点の最大1000文字を記録します。変数が後から変わっても過去の本文は変わりません。全員に公開されるため秘密情報を指定しないでください。`activityLogEnabled` がfalse／省略なら表示しません。例は `examples/activity-log.json`。

自動ログは実行者名を付け、ボタンは「〇〇が『ボタン名』ボタンを実行しました」と表示します。名前はボタンIDから参照します。`activityEvents` と `runtimeActivityStarted` は実行時専用で作者のJSONには書きません。

## 収納済みカードの公開範囲変更（reveal）

`type: "reveal"` は `cardSelector` の実カードを移動せず表向きにし、`mode` で公開範囲を変更します。`all`（省略時・全員）、`owner`（本人のみ）、`others`（本人以外）、`team`（所属チームのみ）、`non-team`（所属チーム以外）を使います。限定公開は `playerTarget` で基準プレイヤーを必ず1人指定します。チーム方式には有効なチーム設定と対象者の所属が必要です。全員の場合は基準プレイヤー不要。コード名 `revealCards()` は既存コードとの互換のため維持します。

位置・順序・個体IDとボックスの次回入庫設定を維持し、現在の実カードだけを変更します。山札の一部だけを選ぶとエラーです。ショーダウンでは残存者の手札だけを対象にし、フォールドした捨て札を含めません。次ハンドは本人限定の配札で再初期化します。手札・ホルダーの非公開領域でも許可された人には表示されますが、既存のタブ閲覧権限は変更しません。例：`examples/in-place-hand-reveal.json`。

数値の変数更新と同じカードの全員公開を続けて行う場合の適用条件は[秘密情報の扱い](authoring-patterns.md#秘密情報を安全に扱う)を参照してください。

## カードの入力内容変更（cardTextChange）

`cardSelector` で選んだカードへ `messageParts`（通常のメッセージと同じ文字・変数・プレイヤー名・計算値）を組み合わせて入力します。既存の固定文 `message` は引き続き読込可能、両方ある場合はmessagePartsを優先。`mode` はset（上書き）、append（追加）、replace（置換）、clear（消去）。置換時だけ `cardEdit.search` に検索文字が必要です。描画の追加・変更はしません。秘密変数・一時値の公開制約も既存の実行検証に従います。例：`examples/card-visibility-and-input.json`。

共通の文章編集の「＋計算式」で数値・参照値・四則演算・括弧を組み立てます。計算はmessagePartsのvalue.kind=formula（既存NumericValue形式）として保存し、通常の文字結合とは区別します。コード編集では `数値式（式：2 + 3）` のような明示的な式を文章へ埋め込みます。既存の `"文字" + 値` の文字結合の意味は変えません。

## 演出

`move`・`flip`・`shuffle`・`dice`・`token` は `showAnimation: true` は表示演出を順番に再生します。オンラインの計算は演出では止めず、入力・確認待ちまたは終了まで一括確定し、最終状態と参加者別の演出列を1回で返します。演出完了のAPI呼出や途中保存はありません。最終的に本人に公開される結果は先に受信できますが、他人の非公開情報は送信しません。入力画面は再生後に開き、回答期限はその分延長します。確認モードも端末内で先に計算を確定し、表示だけを順番に再生します（`flip` は120ms、他は900ms）。省略／falseは無音で、自分の処理順に到達した時点で即時反映します。先行演出を追い越しません。ONの移動（カード・ピース・トークン）・めくり・シャッフル・サイコロは表示対象数に応じて最大3回、通常90ms／めくり40ms間隔で効果音を鳴らします。複数の移動先は1処理として見せます。演出中は全員の更新操作を停止しますが、スクロール・倍率・視点・タブ・ログ・手札窓の閲覧は可能です。`presentation`、`pendingAutomation.animation`、`acknowledged`、`shuffleId` は実行時専用で作者のJSONへ書きません。例は `examples/presentation-actions.json`。

## リセット

`type: "reset"` を使います。`mode: "game"`（省略時も同じ）は部屋の参加者・チーム分け・順番を維持して盤面・手札・変数・権限・マーカーを開始時へ戻し、旧後続処理を破棄して初期処理→フェーズ1開始を実行します。終了イベントは呼びません。初期処理から全体リセットを無条件に繰り返さないでください。

新規生成と編集ではゲーム全体だけを使用します。例は `examples/reset-actions.json` を参照してください。旧データの互換に限り、`mode: "part" | "global" | "player" | "team" | "marker"` と `source: "定義ID"`（変数もプレフィックス不要）を保持します。個人・チーム変数は `playerTarget` を使用します。旧対象指定は他の状態を維持して後続処理を実行します。カード部品は移動済みカードも出所ごとに全て戻し、入力・描画・変数・枚数・面を初期化します。ボックスとゴミ箱は中のカードを変えず部品自体だけ戻します。ターンマーカーの対象リセットでは終了・開始イベントを呼びません。

## 同じ人へのターン移動

### チーム別の独立進行と全解除後の再開

ターン操作に`turnTeamId:"red"`のような登録チームIDを指定すると、対象チームの所有者だけ更新します。`settings.teams.enabled:true`とターンマーカーの`multipleAllowed:true`が必要です。省略は全体です。編集画面では「進行範囲：全体／チーム名」で選び、コードモードでは`moveMarker`の`turnTeamId`にTAB候補から選択できます。

チーム内順を使って次／前／差分を解決し、他チームは進めません。初回は順番基準の0番へ明示付与します。所有者が全員除去されても実行状態に直前位置を保持し、次の人で再開できます。除去中の条件・権限・ハイライトは「手番なし」のままです。対象チームの開始・終了処理だけを各1回実行し、その中のターン参照も対象チームに限定します。全体リセットでは位置を初期化します。サンプル：[独立チーム進行](examples/independent-team-turns.json)。`turnPositions`は実行状態で、作者JSONに指定しません。

`{ "id": "restart-turn", "type": "marker", "source": "turn", "mode": "move", "playerTarget": { "kind": "turn", "position": "current" }, "amount": { "kind": "number", "value": 1 } }` は、同じ人のターンを終了して開始し直します。`mode` の省略も `move` です。終了処理→所有者・ターン世代の更新→開始処理→後続処理の順で、「現在のターン終了まで」の権限も失効します。1人のゲームの `next` も同じ扱いです。所有者の変わらない `give` / `remove`、通常マーカー、無効なターン、状態の同期だけでは再開始しません。回答待ちを挟んでも終了・開始は一度ずつです。イベントから移動を無条件に呼び続ける構成は避けてください。無中断の実行内で100回に達した連鎖は停止して通知します。例は `examples/same-player-turn.json` を参照してください。

チーム手札は移動先だけでなく移動元、カード変数参照の `cards.location` にも指定できます。`players` はチームに所属するプレイヤーを指定し、同じチームは一度だけ対象になります。

チーム所属は準備部屋で確定できます。カードをプレイヤーの手札へ移す処理の `handVisibility` では `team` / `non-team` を指定でき、受取人の所属チームを基準に公開状態を決めます。対象プレイヤーの `kind: "team-turn"` では独立したチーム順・チーム内順から一人を選べます。カード・ピースの移動元や移動先に `kind: "team-tab"` を指定すると、選んだプレイヤーの所属チームに生成されたタブまたはそのボックスを対象にできます。同じチームのプレイヤーを複数選んでも対象チームは重複しません。チーム変数は `source: "team:変数ID"` の `variable` 処理で変更し、`playerTarget` で選んだプレイヤーの所属チームごとに一度だけ更新します。値の参照は `kind: "team-variable"`、`variableId`、`players` を使用します。

共有チーム手札は `kind: "team-hand"` と `players` で指定します。指定プレイヤーの所属チームを一度ずつ対象にし、個人手札とは別の状態で保存します。盤面・個人手札とのカード移動、処理による移動元・移動先として利用できます。チームメンバーだけが手動操作でき、チーム外からは表を見られません。チームIDを個人のプレイヤーIDとして指定しないでください。

通常タブのチームボックスは1つの共通設定とチーム別の配置を持ちます。処理で場所を指定するときは1枠目の `boxId` と `players` を渡し、対象プレイヤーの所属チームの枠を選びます。表示面の変更は `teamBoxVisibility` 処理の `source` に1枠目のID、`playerTarget` に対象プレイヤー、`mode` に `all` / `team` / `non-team` を指定します。

通常マーカーの定義で `ownerScope: "team"` を設定すると、`marker` 処理の対象プレイヤーをその所属チームに変換して一度だけ付与・移動・除去します。`marker-owner` の対象条件はチーム全員に展開します。ターンマーカーは常にプレイヤー所有です。

- `move`: カードを移動。編集画面で新規追加すると枚数の適用先は「各移動先」（`sourceAmountMode: "per-destination"`）です。`cardSelector` と `destinationLocations` を併せて保存します。例えば2枚・3つの移動先なら合計6枚を移動元の選択順に取り出して振り分けます。`total` は全移動先への合計、`per-location` は各移動元の枚数です。既存JSONで省略されている場合は従来どおり合計として扱います。
- `shuffle`: シャッフル。ボックスのシャッフルボタンも同じ順序変更を行うが、ボタンの枠外5pxの配置は表示だけの変更で、処理JSONの設定項目は変わらない。
- `flip`: 表裏を変更
- `sort`: カード一覧順に整列
- `rotate`: 回転
- `counter`: カウンターを変更
- `dice`: サイコロを振る・変更

サイコロの `random` は `diceFaces[].copies` を重みとして面を選びます。現在の出目は面一覧の1始まりの番号です。処理による抽選は `showAnimation` が省略またはfalseなら操作音・アニメーションを出さず即時反映します。trueなら処理単位の演出・待機を行い、表示対象数に応じて最大3回、90ms間隔で効果音を鳴らします。手動で振る場合は、同じ面でも転がる演出・カラカラ音を出します。`diceCanRoll: false` でもボタン処理からは振れます。現在の面の文字・数値変数は条件や `variable` 処理の設定値で `{ "kind": "dice-variable", "partId": "dice-id", "variableKey": "name" }` の形で参照できます。
- `timer`: `mode` に toggle / start / pause / reset / add / subtract / set を指定する。

旧スキーマv5の `draw` は移動先を手札とする `move`、`recall` は `move.mode: "recall"`、`shift` は `move.mode: "box-cycle"` へ統合済み。通常の移動は `move.mode: "standard"`。旧 `timerRun`／`timerChange` も `timer` へ変換する。これらの旧型は現行JSONの新規作成に使用しない。
- `variable`: 変数を変更

`variable` の変更先は `source: "global:<id>"`（宣言した数値・文字型）または `"player:<id>"`（数値・文字）です。数値は `mode: "set" | "add" | "subtract"`、文字は `mode: "set"` のみ。新形式では `variableValue` に設定値を指定します。文字は `{ "kind": "fixed-text", "value": "生存" }`、数値は `{ "kind": "fixed", "value": 1 }`、他のプレイヤー変数は `player-variable` と対象プレイヤーを指定します。`hand-count` は手札枚数です。手札カードの変数を読む場合は `card-variable` にカード部品、変数名、`cards.location: { "kind": "hand", "players": { "kind": "actor" } }`、カード条件を指定します。変更先がプレイヤー変数なら `players: { "kind": "assignment-target" }` も使用でき、`playerTarget` で選んだ各変更先プレイヤーの手札を個別に参照します。`actor` はボタンを実行したプレイヤーを指したままです。手札の表示領域は一つで、数値は `aggregate` で集計可能です。文字は各変更先で一致カードがちょうど1枚のときだけ代入されます。該当なし、複数一致、型不一致ではそのプレイヤーの変数を変更しません。`variableValue` のない旧処理は従来の数値 `amount` を使用します。
- `playerBoxVisibility`: `source` にプレイヤーボックスの1人目のID、`playerTarget` に対象プレイヤー、`mode` に `all` / `owner` / `others` を指定し、ボックスへ入庫するカードの初期表示を変更します。入庫後の手動公開設定を継続的に上書きする処理ではありません。
- `marker`: マーカーを操作
- `phase`: フェーズを変更
- 旧 `cursor` 処理は互換性のため読み込めますが、実行時は何もしません。新規作成では使用しません。
- `condition`: 条件分岐
- `message`: メッセージ表示
- `choice`: 選択ウィンドウ。`choice.sourceKind` に `players`、`card-types`、`piece-types`、`card-location`、`boxes` 等を指定できる。`boxes` の回答値はカードではなくボックスID。表示時には一番上のカードを表裏の状態どおりに描画する。`players` にはアイコンと名前を表示する。`candidateConditions` は `{ variableKey, operator, value }` の配列（最大8件）で、`candidateConditionMode` は `and`（既定）または `or`。`players` は各プレイヤー変数、`card-types` / `card-location` は各カード変数、`piece-types` は各ピース変数、`boxes` は公開中の最上部カード変数で候補を絞る。存在しない変数は不一致。比較値は文字列として扱い、大小比較は双方を数値へ変換できる場合だけ成立する。

操作ボタンの表示・操作条件とフェーズメッセージの表示条件には同じ `CommonCondition` を指定します。`comparison` の演算子は `=`、`!=`、`>`、`>=`、`<`、`<=`、`in-right`、`one-of` です。`in-right` は左辺が右辺の文字列に含まれる従来の部分文字列判定で、左辺が空なら不成立です。`one-of` は `right` と `rightValues`（追加候補は最大19件）のいずれかに左辺が等しい場合に成立します。条件の固定文字は `{ "kind": "fixed-text", "value": "文字" }` とします。選択中の手札だけでなく手札全体のカード種類・カード変数も判定でき、構造は `game-data-spec.md` に記載しています。

盤面ボタン・フェーズボタンの「常に表示する」「常に操作可能にする」は条件なしを表します。「目的から選ぶ」へ切り替えた直後は「手札を選択している」を仮の条件として表示し、目的・条件を選び直せます。`button-state` の `predicate: "always"` を指定した既存JSONは引き続き無条件として扱います。カード・ピースの場所と移動先にプレイヤーボックスを選ぶ場合は、1人目の共通部品IDと `players` を組にして指定します。

手札のカード種類を複数調べる場合は `button-state` 条件に `cardDefinitionIds` を指定します。`cardPresence: "has"` はいずれかを含む、`"not"` はどれも含まない判定です。従来の `cardDefinitionId` 1件指定も有効です。

標準の読み取り専用値「参加人数」は `{ "kind": "participant-count" }` で参照できます。観戦者を含まない参加プレイヤー数で、数値の代入元・比較条件・処理の枚数に使えます。旧式の処理量・条件式では `{ "kind": "participantCount" }` とします。変更先には指定できません。

処理には一意なIDを付け、対象を必要とする処理では存在するIDだけを参照してください。

## トークンを移動（token）

`source` はトークン族の先頭部品ID。`playerTarget`／`target` で対象プレイヤーを選び、チーム所属ならそのプレイヤーのチームを重複なく対象にする。`mode: "set"` は `tokenX`・`tokenY`（0～100、既定50）の盤面％座標へ移動、`mode: "recall"` は編集で指定した各個体の初期位置へ戻す。所属なしの場合は `tokenSlot`（1～99）を選ぶ。0または省略で全個体。手動移動の設定を変更・解除せずに処理として実行する。

盤面の表示既定: スマホ縦の未設定範囲は左上・全幅×100px、PC・スマホ横は盤面全体。明示範囲を優先し、全体指定は全体フィット。新規タブは950×500px、既存サイズ・初期表示は保持。表示範囲と手札スクロールは処理の座標や権限を変更しません。


## プレイヤー参照の対象指定（2026-10-17）

Expr hand/playerのplayersで参照先を指定。未指定は条件全体の対象／従来の処理対象を維持し、明示指定は実行者・現在ターン・配置先などを選ぶ。複数は数値合計、単一プレイヤー変数の比較は文字を保持。ボタン目的条件のplayersは各人が満たすかを全員判定し、合計ではない。選択中の手札は本人のみ。[JSON仕様](game-data-spec.md#プレイヤー参照の対象指定2026-10-17)・[例](examples/player-value-targets.json)を参照。

条件分岐の組合せは `branches[].conditionMode`（and／or、省略and）と `additionalConditions`（最大4件のCommonCondition）を使用する。元のleft/operator/right等は第一条件として維持し、分岐間は上から最初の成立を実行する。追加なしは旧形式と同じ。追加条件の深さ免除は不可。操作条件のプレイヤー文字比較はcomparisonValueKind="text"とtextValueを明示し、数値はvalue（旧形式は数値のまま）。固定テキストは候補に限定しない。内部IDを名称へ書き換えず、UI表示だけ名称を解決する。例: examples/compound-branch.json。

進行処理の組み方は[公開実装パターン](authoring-patterns.md#タイマー確認終局)を参照。phaseは同一sourceでも終了→開始を実行。messageParts（LogMessagePart配列）は実行時に解決し、messageConfig.severityはerror/warning/message。PlayerTarget.player-variableのoperator=max/minは数値の同点全員を返す。loopはmode=count/while/playersとbranches[0].actions、loopBreakで最内ループを終了、loop-playerで対象を参照する。実行中のruntimeLoopState/runtimeLoopFramesは作者JSONに保存しない。最大1000反復・10000ステップ・100フェーズ移動で停止する。旧データは変換不要、新操作を旧クライアントで実行する互換性は保証しない。

## 現行の操作と文章参照の範囲

現行Action型と型付き引数は[登録表](reference-contract.md)を参照。cursorは旧互換の無動作処理で、新規生成しない。上の個別例だけを全操作の一覧として扱わない。textParts / messageParts / logPartsのvalueはfixed-textと数値・変数等の参照を受け付けるが、既存NumericValueの有界formula（四則・丸め）は直接指定できる。式の中に式や固定文字を入れず、runtime-inputは型付きbindingまたは変数を経由する。フェーズメッセージのPhaseMessagePartは別形式であり、LogMessagePartへ混在させない。メソッド形式の編集画面は既存Actionと通常処理に統合した一時変数を読み書きする。画面上のメソッド文字列をJSONとして保存しない。通常の代入値・配列繰り返し・正式引数は型付き参照を使用し、入力待ちでは私有スコープを復元します。


新しい編集画面の一行UIと「コードで編集」は、同じ型付きの条件・処理・参照を既存形式へ変換する編集UIです。コード文字列そのもの、編集中のエラー・履歴・復元用入力をゲームJSONへ追加しないでください。型・参照・利用先の制約に反するコードは確定できません。設定呼出・括弧をAI向けJSONの新しいキーとして出力せず、従来どおりAction等の構造で記述してください。


新コードUIのユーザー変数は `全体.変数.名前`、`実行者.変数.状態`、`実行者.チーム.変数.状態` で参照します。これは画面の式であり、JSONの変数ID・Action・Expr・NumericValueの構造は変わりません。JSON Schema、JSONサンプルと生成プロンプトにはコード用の「変数」キーを追加しません。元のIDと明示的なplayersを保持してください。専用設定とマーカー所持・選択手札などの条件は新UIの型付きメソッドから既存JSONへ変換します。未来の未知条件・未知の専用項目は保存を停止し、黙って変換・削除しません。


新UIの選択・入力・権限・専用条件の互換例は `examples/method-specialized-actions.json`。メソッド文字列や「設定」キーを新たにJSONへ書かず、引き続き現在のAction・Expr等を出力してください。既存のJSON Schemaと生成プロンプトの形式は変更しません。


### 新しい編集画面での手札整列

並び替えの参照元「手札」は `source:"actor-hand"`、「選択中の手札」は `source:"selected-hand"` として保存する。所有者指定は既存の `sourcePlayerTarget` を使用する。UIの日本語ラベルをJSON値へ書かない。カード定義・表裏・公開範囲は変えず、対象のスロットだけを整列する。Schemaと生成プロンプトの出力形式は変更しない。


### 行内編集の対象表示とJSON

「全プレイヤー.手札.カード（変数.pont > 3）」は画面上の表示であり、JSONではCardSelectorのlocation={kind:"hand",players:{kind:"all"}}、condition={kind:"card-variable",cardSetId:"対応するカード部品ID",variableKey:"pont",operator:">",value:{kind:"fixed",value:3}}とする。収納先のシャッフル・整列はtype=shuffle／sort、cardSelector.condition.kind=allを使用し、場所ごとに処理する。複数場所はlocation.kind=multipleとlocations配列。UIの型名・候補・編集中の経路・ドット表記を保存しない。schemaVersion19とoperationSchemaVersion3は維持する。例はexamples/inline-target-editing.json。


編集画面の赤い［未選択］は編集中だけの表示です。ゲームJSONへ未選択という文字・値・フィールドを出力しないでください。対象・回数・値を指定してから既存の型へ変換します。既存の省略値とJSON Schemaの既定値は変更しません。繰り返しは従来のloop.mode=count／while／playersとcount・condition・playerTargetを使います。例と生成プロンプトのJSON形式、schemaVersion19／operationSchemaVersion3は維持します。

配列の更新も通常の変数変更の代入値で行う。append（単体追加）、concat（同型配列の結合）、replace（位置と置換値）、remove（指定位置削除）、clear（空配列）は新しい配列値を返し、入力を変更しない。追加先の型・単体／配列・位置・上限を検査し、値と添字の秘密ラベルを保持する。専用の配列更新Actionは設けない。

テキスト部品を対応する部品引数で選ぶ場合は、表示文章ではなくitem.nameの部品名で選択する。名前変更・動的文章の表示で部品IDは変えない。textContentは固定表示文字専用であり、カード入力のmessageとは別。部品名を付けても、その処理で未対応の部品操作が追加されるわけではない。

## プレイヤー選択の回答と動的な比較値

`choice.candidateConditions`の既存の0〜7番目の`value`は、`temporaryBindings["choice.candidateConditions.N.value"]`へ文字単体式を設定できます。数値は`to-text`で明示変換します。条件の新設・未登録パス・存在しない番号は拒否します。本人限定の比較値を使う場合は、選択ウィンドウもその本人だけを回答者にし、`answerVisibility:respondent`を使います。

プレイヤーの`property.path:["id"]`は参加プレイヤーIDです。回答の`game.input.texts`にそのIDが含まれるプレイヤーを抽出し、`temporaryBindings.playerTarget`へ型付き配列を渡せます。回答を公開変数や他人向け効果に使う場合の公開保護は維持します。意図した公開だけ`variable/message/log`の`temporaryPublish:true`で明示してください。[完全サンプル](examples/player-choice-continuation.json)。

## プロジェクトLの手番操作

操作はフェーズ別ボタンへ統一する。回数は通常の変数・条件で管理し、汎用のセーブポイント・条件／配置検査・操作制限を組み合わせる。旧設定は読込時だけ変換し、進行中の旧部屋は新規開始する。私有記録と秘密情報の参加者別配信を維持する。

`savepoint`（作成・復元・破棄・制限変更）と`stateCheck`（条件・配置検査）は汎用の制御処理です。初期値、制約、回答待ちからの復元、旧形式の読込変換は[フェーズ別ボタンとセーブ・復元](phase-savepoints.md)を参照してください。

## 場所付きカード選択の結果

`choice.sourceKind:"card-location"` と `cardSelector` を併用すると、候補を見られる回答者にだけカード画像と名前を表示し、回答を不透明な物理個体で保持します。候補一覧にも `choice.description` の案内、必要数・選択済み数・残数を表示します。画像用の作者JSON項目は追加しません。後続の `game.input.cards` は card 配列であり、`move.temporaryBindings.cardSelector` に指定できます。同名札が複数あっても選んだ個体だけを移動します。別の選択・入力前に必要な結果は通常の一時変数へ保存してください。

`answerVisibility:"all"` は選んだ不透明な個体だけを公開し、候補一覧や未選択札・面属性を公開しません。本人限定／回答対象限定の結果はその範囲を維持し、公開の移動には渡せません。属性を読むと元の面の公開制約を再適用します。他人の秘密手札を選ばせる場合は、先にルールで許された `reveal` を実行してください。

候補不足は利用できる枚数まで最小・最大を縮め、0枚なら待機せず空配列を返します。選択結果は回答再開時にも同じ場所・条件で照合します。従来の source だけのカード選択は回答形式を変更しません。旧JSONの移行は不要ですが、この参照を使うJSONには対応したアプリとサーバーが必要です。例：[カード個体を選んで出す](examples/physical-card-choice.json)。

場所付きの実カード選択では「候補の基準プレイヤー」を `choice.candidatePerspective:"respondent"` にすると、それぞれの回答者について候補の「実行者」を解決します。全員が自分の手札から選ぶ場合は、回答対象を全プレイヤー、候補を実行者の手札にします。各人へ自分の候補だけを配信します。省略時の `executor` は従来どおり処理実行者が基準です。後続処理の実行者や、先に評価した一時値バインドの意味は変えません。

「候補不足時」は `choice.shortageBehavior` で選びます。`available`（省略時）はある枚数で続行、`skip` は最小数に足りない人の選択を空にして続行、`error` は理由を表示して停止します。空の人は自動回答として集計し、未完了の人だけが回答します。全体の対象人数を減らす操作ではありません。新設定2項目は `card-location` と `cardSelector` の併用時のみ使用できます。[各回答者の実カード選択](examples/respondent-card-choice.json)。

確認画面では未回答のままでも、選択画面を閉じて上部の「リセット」から初期状態へ戻せます。回答待ち・入力途中の内容・進行中の行動と取消情報を破棄し、既存の初期処理から再開します。ゲーム画面の権限や待機中の操作制限は変わりません。セーブ・復元と検査は通常のフェーズボタンの処理として編集します。

公開盤面での選択有無・枚数だけを使う判定は、カードの種類・秘密属性を読む判定と区別します。種類・変数で絞る場合と、公開を保証できない所在は検査を維持します。保存前の警告は同じ分類をまとめ、各箇所を展開して該当処理を開けます。分類数は処理の問題数と同じではありません。ドラッグ中はUI検査を待機し、保存時は最新データを検査します。

公開範囲の警告は外部JSONの「読込」と「サーバーに保存」で検査します。同じ参照元と理由は1件にまとめ、公開先と該当箇所を展開できます。JSON読込の「全文をコピー」には全箇所を含めます。編集中・ドラッグ後の自動検査は行いません。警告だけなら読込・保存は可能です。実行時も現在の対象と秘密情報の公開範囲を検査します。


実カードを手札・ホルダー・盤面で直接選択する場合は、場所付きカード選択に `choice.display:"surface"` を指定します。複数枚を選んで上部バーで一度に確定できます。ピース・独自候補には使えません。省略時は従来の一覧表示です。サーバーの候補・枚数・公開範囲・継続処理の検査は同じです。詳細は [カード個体の選択](physical-card-values.md) を参照してください。
# 山札の先頭カードを選ぶ

`choice` のActionに `topOnly:true` を指定すると、各所在の先頭1枚だけを選びます。`choice.sourceKind:"card-location"` と `cardSelector.condition:{kind:"all"}` を指定し、並べ替え・件数指定・候補変数条件は併用しません。`choice.display:"surface"` なら山を展開せず先頭を盤面で選びます。裏向きカードは裏面のみを配信し、回答後も属性の公開権限を維持します。[完全例](examples/blind-top-card-choice.json)。

演出とタブ切替：showAnimation付きの処理とopenTabが同じ処理列にある場合、openTabの処理位置で、先行演出を待ってタブを切り替えます。後続演出の終了までは待ちません。処理結果は先に確定し、演出ごとの回答送信や待機用の追加ボタンは不要です。

表示順：演出の有無にかかわらず、カード移動・変数表示・手番・ボタン・タブ・通知等は元の処理順に表示します。演出なしは先行演出の後に無音で即時反映します。連続する待ち時間0の変更は同じ描画境界へまとめます。選択・入力・確認画面は先行表示の完了後に操作可能になり、回答時間もその時点から確保します。確認画面とオンラインで共通です。JSON形式20／4と既定値は変更しません。

共通処理呼出の編集表示は、保存IDを現在の共通処理一覧の名前へ対応付けます。旧source指定も同じ名前で確認できます。commonProcessIdとsourceの併存時は専用IDを優先し、同名定義ではIDを保持します。見つからない定義を別の共通処理へ自動置換しません。JSON20/4の変更はありません。

## カードを拡大表示：showCard

`type: "showCard"`、`cardSelector`、`playerTarget`を指定します。既存の場所・条件・並び順・取得数で**実カード1枚**に絞り、一時カードを`temporaryBindings.cardSelector`へ渡すこともできます。0枚・複数枚は停止理由を表示します。対象者は本人・指定プレイヤー・全員から選びます。

任意の`message`（固定文）または`messageParts`（固定文・プレイヤー名・変数）をカード拡大画面に表示します。一時値は登録済みの`messageParts` bindingを使います。空欄は本文なし、改行は保持します。コード編集名は`showCard()`です。秘密の本文は閲覧できる対象者だけに送り、公開範囲を広げて回避しません。

同じ拡大通知は端末内で1回だけ表示します。視点を切り替えると現在の拡大を閉じ、次の行動で古い拡大を再表示しません。別端末や、新しく実行した拡大通知はそれぞれ表示します。全員の確認を待つ用途は「通知・確認」を使用してください。

表示後は後続へ進みます。閉じる操作を待つ場合は別の「通知・確認」で確認待ちを組み合わせます。カードの移動・表裏・公開範囲は変えず、各対象者が閲覧できる面だけ表示します。非公開のカードを公開する場合は別途`reveal`を設定します。[単体で読める例](examples/card-inspection.json)。

`token` の移動も `showAnimation:true` で既存の移動演出（900ms）を行います。set／recall、所属・枠番号の対象は従来どおりです。省略／falseは即時反映。[サンプル](examples/animated-token.json)。
## 動的な移動先とボタン権限

`temporaryBindings.source`／`destination`はそれぞれの式を型検査し、検査用の仮IDが一致しても行先が同一とは扱いません。実行時の参照・秘密情報・実値の検査は維持します。操作ボタンの権限対象には、盤面ボタンと`settings.actionButtons[]`のフェーズボタンの両方のIDを使えます。存在しないIDやボックス等の別種の部品は指定できません。新しいJSON項目・形式番号は追加しません。[設定例](examples/validation-reference-compatibility.json)。
