Skip to content

Latest commit

 

History

History
106 lines (74 loc) · 3.33 KB

File metadata and controls

106 lines (74 loc) · 3.33 KB

アルゴリズム概要

この文書は、taQu の公開可能なルール実行モデルを説明します。

ここでは運営用の内部実装、認証、非公開 API、不正対策の詳細は扱いません。

基本構成

ルールエンジンは次の情報を持ちます。

  • ルール名
  • 説明文
  • 定数
  • 初期値
  • イベントハンドラ
  • x, y, z, maxAns などの表示・進行設定

プレイヤー状態は、おおむね次の形です。

  • x, y, z: 基本スコア
  • カスタム変数
  • status: playing, win, lose
  • isLocked: 個人ロック
  • isTeamLocked: チームロック
  • mt: チーム判定用の値

実行の流れ

一般的なホストアプリケーションでは、次のような順序でイベントを呼びます。

  1. 参加時またはルール適用時に initialization
  2. 早押し時に push
  3. 判定時に correct, wrong, through
  4. 問題終了後に next
  5. ホストの手動判定時に judge

maxAns や進行方式によって、next を呼ぶタイミングはホスト側で調整します。 judge は順位未確定のプレイヤーへ勝ち抜け・失格判定をまとめて適用したい場合に使います。

パース

ルール文字列は次の情報に変換されます。

  • メタデータ
  • 定数
  • 初期代入
  • イベントごとのコマンド列
  • 式の RPN 表現

構文エラーがある場合は、行番号つきのエラーを投げます。

実行

engine.execute(eventName, player) は次の流れで動きます。

  1. プレイヤー状態を実行用オブジェクトへコピーする
  2. 初期値と定数を補う
  3. 指定イベントのコマンド列を実行する
  4. 更新後のプレイヤー状態を返す

無限ループに近いルールで処理が止まらないよう、実行ステップ数には上限があります。

勝敗・ロック

ルール内のコマンドは、プレイヤー状態に結果を反映します。

  • win(): 勝利
  • lose(): 敗退
  • lock(): 解答不可
  • unlock(): 個人ロック解除
  • tLock(): チームロック
  • tUnlock(): チームロック解除

参考実装では、低レベルのエンジンは一時的に _status を返すことがあります。公開用 wrapper の applyAction はこれを status に反映します。

複数プレイヤー効果

単体エンジンは、基本的に「1人の状態に対するイベント実行」を担当します。

一方で、次の機能は複数プレイヤーの文脈が必要です。

  • scope
  • othersAdd
  • othersSet
  • uAdd
  • uSet
  • giveAns
  • tProd, tAdd, tMax, tMin, tCount
  • rankVal
  • countIf
  • getPushRank

これらは、ホストアプリケーションが全プレイヤーの状態・チーム情報・早押し順位を持って評価します。

ホスト側が持つべき責務

外部ツールやカスタムクライアントで taQu 互換の挙動を再現する場合、ホスト側は次を用意します。

  • プレイヤー一覧
  • チーム情報
  • 早押し順位
  • 各プレイヤーの現在状態
  • scopeothersAdd などのキュー適用処理
  • next を呼ぶタイミング

この公開キットは、非公開の通信イベントや本番サービス運用手順には依存しない設計にしています。