COMPETITIVE
勝敗を正しく決めるだけで、こんなに難しかった
HPを0にしたら勝ち、だけでは極端な長期戦や同時KOを一意に扱えません。既存カード性能を変えず、試合終了だけを保証するPhase Aを作りました。
普通の勝敗条件だけでは決められない場面
攻撃の反動や継続効果で両者のHPが同時に0以下になる、回復と防御で試合が極端に長引く、同じ完全状態を繰り返す。これらは毎試合起こる問題ではありませんが、競技結果をサーバー側で確定するなら曖昧にできません。
Phase Aではカード性能、CharacterRecipe、オンライン同期方式を変えず、『いつ、どの理由で試合を終えるか』だけを明示しました。
同時KOはDRAWとして先に確定する
一つのアクション内で両者が0以下になった場合、処理順だけで勝者が変わらないよう同時KOをDRAWとして扱います。勝利判定の前に、カード効果、反動、状態効果を決めた順序で解決します。
結果画面では勝敗だけでなく終了理由を表示できるため、プレイヤーは突然のDRAWではなく『同時KO』として理解できます。
山札切れは累積疲労で前へ進める
採用したFatigue Candidate Aは山札を再利用せず、引けないたびに1、2、3…と累積ダメージを受けます。カードを引き続けるだけで状態が永久に同じになることを防ぎ、時間とともに終了へ近づけます。
通常のカジュアルルールとは分け、Competitive Experimentalを選んだ試合だけへ適用します。現在は実験的な1対1を中心に扱い、ランク全体へは未適用です。
Loop Detectionは完全なprivate stateを使う
HPだけが同じでも手札や山札順が違えば、同じ試合状態ではありません。ループ判定では公開情報だけでなくサーバーが持つ完全なprivate stateからfingerprintを作り、不可逆な進行がない同一状態の3回反復を検知します。
fingerprintそのものや秘密状態を相手・観戦者へ公開する必要はありません。外へ出すのは終了理由と確定結果だけです。
最大50アクションは最後の安全網
疲労にも反復にも到達しない長期戦へ備え、最大50アクションでDRAWにします。HP差による判定勝利は採用せず、上限到達は勝者なしです。
上限30・40・50を比較した結果、30は6.7%、40は0.6%で上限へ達し、50では比較1,000戦で0件でした。最終10,000戦では上限DRAWが8件、0.08%でした。