この文書は、taQu の公開可能なルール実行モデルを説明します。
ここでは運営用の内部実装、認証、非公開 API、不正対策の詳細は扱いません。
ルールエンジンは次の情報を持ちます。
- ルール名
- 説明文
- 定数
- 初期値
- イベントハンドラ
x,y,z,maxAnsなどの表示・進行設定
プレイヤー状態は、おおむね次の形です。
x,y,z: 基本スコア- カスタム変数
status:playing,win,loseisLocked: 個人ロックisTeamLocked: チームロックmt: チーム判定用の値
一般的なホストアプリケーションでは、次のような順序でイベントを呼びます。
- 参加時またはルール適用時に
initialization - 早押し時に
push - 判定時に
correct,wrong,through - 問題終了後に
next - ホストの手動判定時に
judge
maxAns や進行方式によって、next を呼ぶタイミングはホスト側で調整します。
judge は順位未確定のプレイヤーへ勝ち抜け・失格判定をまとめて適用したい場合に使います。
ルール文字列は次の情報に変換されます。
- メタデータ
- 定数
- 初期代入
- イベントごとのコマンド列
- 式の RPN 表現
構文エラーがある場合は、行番号つきのエラーを投げます。
engine.execute(eventName, player) は次の流れで動きます。
- プレイヤー状態を実行用オブジェクトへコピーする
- 初期値と定数を補う
- 指定イベントのコマンド列を実行する
- 更新後のプレイヤー状態を返す
無限ループに近いルールで処理が止まらないよう、実行ステップ数には上限があります。
ルール内のコマンドは、プレイヤー状態に結果を反映します。
win(): 勝利lose(): 敗退lock(): 解答不可unlock(): 個人ロック解除tLock(): チームロックtUnlock(): チームロック解除
参考実装では、低レベルのエンジンは一時的に _status を返すことがあります。公開用 wrapper の applyAction はこれを status に反映します。
単体エンジンは、基本的に「1人の状態に対するイベント実行」を担当します。
一方で、次の機能は複数プレイヤーの文脈が必要です。
scopeothersAddothersSetuAdduSetgiveAnstProd,tAdd,tMax,tMin,tCountrankValcountIfgetPushRank
これらは、ホストアプリケーションが全プレイヤーの状態・チーム情報・早押し順位を持って評価します。
外部ツールやカスタムクライアントで taQu 互換の挙動を再現する場合、ホスト側は次を用意します。
- プレイヤー一覧
- チーム情報
- 早押し順位
- 各プレイヤーの現在状態
scopeやothersAddなどのキュー適用処理nextを呼ぶタイミング
この公開キットは、非公開の通信イベントや本番サービス運用手順には依存しない設計にしています。