ポストエフェクトとルートプール:ひとつのチェストを成す二つの側面
ルートプールの重みがドロップ内容を決め、/posteffect コマンドがその見え方を決める。どちらもデータパックを書く前に確認できる数値だ。例えばrolls2のプールでは、重み4分の1のエントリも約半分の確率で出現する。
重み付きルートプールと /posteffect コマンドは、たいてい別々のファイルに別々の人間が書き、そして同じように失敗する。データパックを出す前に数値を確認しないのだ。どちらも最初に検証するのは簡単だ。
ルートプールは算数であって、勘ではない
プールのエントリには weight があり、各エントリの確率はその重みをプール内の全重みの合計で割ったものだ。隠れた正規化も下限もない。重みが 0 ならそのエントリは決して抽選されず、重みの合計がいくつであってもプールの挙動は同じだ。罠はロール回数の混同にある。rolls: 2 を持つプールは 2 回抽選するので、重みが 4 分の 1 のエントリは全チェストのおよそ 4 分の 1 ではなく、およそ半分に出現する。
| エントリ | 重み | 1 回の抽選での割合 |
|---|---|---|
| 鉄インゴット | 20 | 20 ÷ 40 = 50% |
| 金インゴット | 12 | 30% |
| ダイヤモンド | 8 | 20% |
重み 40 の 4 番目のエントリを追加すると、上のすべての数値が半分になる。これがバランス調整のすべてであり、「ダイヤモンドの排出率がおかしい」と感じるのは、ほぼ常にスケールし忘れた重みのせいなのだ。
ルートテーブルはゲーム内でも特に大きなレジストリ群のひとつで、このサイトが計測している 26.3 のデータでは 1,447 個が登録されている。つまり、数値的に理解できないプールは、手作業で調整し終えることのないプールだ。
/posteffect は Java 26.3 の新機能
Java の /posteffect は 26.3 でリリース済みコマンドとして登場し、26.2 以前には存在しない。これは Java のコマンドであり、Bedrock に同名のものはないので、ここにある Java 向けチュートリアルはそのまま移植できない。
このコマンドは、プレイヤー群に対して識別子でスクリーンエフェクトを追加または削除する。/posteffect add <targets> <effect> に加えて remove、clear <targets>、list <target>(プレイヤー 1 人)がある。強度の引数はなく、エフェクトはオンかオフかのどちらかだ。バニラクライアントに同梱されているのは blur、creeper、entity_outline、invert、spider の 5 つだけなので、識別子のリストは推測せず手で確認できるほど短い。存在しないエフェクトを指定してもサーバーはチェックしないため成功が報告される。これがコミット前に確認すべき第 2 の理由だ。
二つが出会う場所
レアアイテムを落とすチェストとよくあるアイテムを落とすチェストは、同じ見た目であるべきではない。まずプールを抽選して実際の分布を求め、次にプレイヤーがそれを実際に目にする頻度に合ったポストエフェクトを選ぶ。逆の順序でやると、常時発動する派手なエフェクトが生まれ、ノイズのように感じられる。
町の建築なら、通常はよくあるプールには blur のような控えめなエフェクトを、最も重みの小さいエントリには invert のような派手なエフェクトを取っておく。これはすでに計算した比率と同じだ。
/posteffect コマンドを組み立て、重み付きプールを ポストエフェクト&ルートツール で抽選しよう。