レアリティ
レアリティの定義方法
レアリティは、さかなをどのくらいの割合で抽選するか、そして釣り上げたときの価値をどう計算するかをまとめた定義です。
さかな定義の rarity から ID で参照され、表示名は翻訳システムに登録されてゲーム内の表示に使われます。
配置場所
レアリティ定義は Core のデータフォルダから読み込まれます。
plugins/MoripaFishing/rarity/**/*.json起動時にディレクトリが無ければ作成され、サブディレクトリも含めたすべての .json が読み込まれます。
レアリティ ID は JSON 本体の id から決まるため、ファイル名は自由です。慣習としてファイル名を ID と揃えておくと分かりやすくなります。
Format
{
"$schema": "https://fishing.plugin.morino.party/schema/rarity/v1.json",
"id": "legendary",
"displayName": {
"ja_JP": "<gold>ヌシ",
"en_US": "<gold>Legendary"
},
"weight": 0.4,
"worth": "(length_rate ^ 2) * 1000 + 500"
}| フィールド | 型 | 既定値 | 説明 |
|---|---|---|---|
id | string | 必須 | レアリティ ID。さかな定義の rarity から参照される |
displayName | map | 必須 | ロケールごとの表示名。MiniMessage の記法が使える |
weight | number | 必須 | 抽選時の相対的な重み。0 以上で、パーセンテージではない |
worth | string | 必須 | 価値を求める数式。変数 length_rate を使える |
読み込みは厳密に行います。$schema キーは無視されますが、それ以外の未知のキー(タイプミスや古い形式の color / cacheCommand / worthExpression など)を含むファイル、不正な JSON、不正な数式のファイルは警告をログに出してスキップされます。
レアリティごとの色付けは displayName に MiniMessage タグを直接書いて表現してください。
表示名と翻訳
displayName の各エントリは、moripa_fishing.rarity.<id>.name という翻訳キーとしてロケールごとに登録されます。
そのためレアリティ名も 翻訳 の仕組みに乗り、プレイヤーのロケールに応じた表示が行われます。翻訳ファイルに同じキーがある場合は翻訳ファイルが優先されます。
値は MiniMessage として解釈されるので、<gold> や <gradient:...> などのタグで装飾できます。
weight による抽選
weight は確率そのものではなく相対的な重みです。
抽選時は、その釣りワールドの条件(天候・ワールド)を満たすさかなが 1 匹以上いるレアリティだけを候補にして weight の合計を求め、その合計に対する比率で 1 つが選ばれます。
weight の合計を 100.0 にしておくと、weight の値をそのままパーセンテージとして読めます(下の構成例がその例です)。
ただしレアリティを追加・削除したり、条件を満たすさかながいないレアリティがあったりすると、他のレアリティの出現率も一緒に変化します。
worth による価値の計算
worth は、釣り上げたさかなの価値を求める数式を文字列で書いたものです。
式の中の変数 length_rate には、そのさかなのサイズを正規分布の累積分布関数に通した値が入ります。
つまり同じレアリティでも、そのさかなの中で大きい個体ほど length_rate が 1 に近づき、価値が高くなります。
四則演算や ^ による累乗などが利用できます。数式は読み込み時に検証され、構文が不正な場合や length_rate 以外の変数を使っている場合はファイルごとスキップされます。
価値の計算では、さかな定義側の worth が優先されます。レアリティの worth はさかな側に指定が無い場合に使われます。
構成例
プラグインはレアリティとさかなの定義を同梱していません。初回起動時の rarity/ と fish/ は空で、定義が無い間は釣りの結果がバニラのままになります。
次の 6 つは、weight の合計を 100.0 にした構成例です。
| ID | weight | worth |
|---|---|---|
junk | 1.0 | 1 |
common | 70.0 | (length_rate ^ 2) * 5 + 5 |
rare | 22.0 | (length_rate ^ 2) * 10 + 10 |
epic | 6.5 | (length_rate ^ 2) * 50 + 100 |
legendary | 0.4 | (length_rate ^ 2) * 1000 + 500 |
mythic | 0.1 | (length_rate ^ 2) * 2000 + 2000 |
再読み込み
レアリティ定義を編集したあとは、次のコマンドで再読み込みできます。
/mf reload必要な権限は moripafishing.command.reload です。再読み込みではレアリティをすべて読み直すため、API の RarityManager.register で追加したレアリティは破棄されます。
注意点
- 同じ
idを複数のファイルに書いた場合は、パス順で先に読み込んだファイルが使われ、後のファイルは警告を出してスキップされます。 - さかな定義の
rarityに存在しない ID を指定すると、そのさかなのファイルが警告を出してスキップされます。 weightを 0 にしたレアリティは抽選されなくなりますが、定義自体は残るため参照は可能です。