天気のノイズ
天気のノイズ
天候の方針 random (WeatherPolicy.Random) は、乱数をそのまま引くのではなく、時間軸に沿ってなだらかに変化するノイズから天候を決めています。このページでは、そのノイズがどう作られ、どう天候へ変換されるかを説明し、パラメータを変えたときの傾向をシミュレーターで確かめられるようにしています。
設定キーそのものの正式な説明は 気候の設定 を参照してください。
ノイズの作り方
天候は次の 4 段階で決定されます。
- 基準日時 2023-10-01 00(
world.timeZoneのタイムゾーン)からの経過時間からoffsetHoursを引き、intervalHours(既定 8 時間)で割って切り捨て、ステップ番号xを求めます。つまりノイズの 1 ステップはintervalHours時間分に相当し、offsetHoursだけ切り替わりのタイミングがずれます。 ワールドID + seed + xの文字列を SHA-256 でハッシュ化し、その先頭 8 文字を 16 進数として読み取ります。この値を 101 で割った余りを、0 から 100 の整数の乱数とします。- すべてのステップで乱数を引くと値が飛び跳ねてしまうため、乱数を引くのは
check = floor(100 / maxInclination)ステップごとの節目だけです。その間のステップは、前後の節目の値を線形補間して埋めます。maxInclinationは 1 ステップあたりの変化量の上限を意味し、値を大きくすると天候が短い周期で入れ替わり、小さくすると同じ天候が長く続きます。 - 得られた 0 から 100 の値を
weightsの合計値に正規化し、weightsを先頭から累積していって最初に上回った天候を採用します。どれも上回らなかった場合はweightsの最後の天候を採用します。
同じワールド ID と seed であればいつ計算しても同じ結果になるため、天候は再起動をまたいでも再現されます。逆に seed を変えると、同じワールドでもまったく別の天候系列になります。
適用される条件
このノイズが天候を決めるのは、ワールドの気候の weather が次のいずれかの場合です。
{"type": "random", ...}。その設定値でノイズを計算します。{"type": "external", ...}で、一致するWeatherSourceが登録されていない場合。randomの既定値でノイズを計算します。
fixed や vanilla、登録済みのソースを指す external ではノイズは使われません。
ワールド側の climate が null の場合は、config.json の world.defaultClimate が使われます。
設定に書く天候名
weights のキーには列挙型の識別子をそのまま書きます。指定できるのは SUNNY / CLOUDY / RAINY / THUNDERSTORM / SNOWY / FOGGY の 6 種類で、既定値は SUNNY: 4、CLOUDY: 1、RAINY: 2、THUNDERSTORM: 1 です。
注意
RAIN や THUNDER、および「雨」「雷」といった日本語の表示名では設定を読み込めません。正しい識別子は RAINY と THUNDERSTORM です。
シミュレーター
世界 にはワールド ID (FishingWorldId)、seed には weather.seed(既定値は pepper)に相当する値を入力します。サイズ は描画するステップ数で、既定の intervalHours では 1 ステップが 8 時間なので 1 年分はおよそ 1095 ステップです。
シミュレーターはあくまで傾向をつかむためのもので、プラグインの計算と完全には一致しません。扱えるのは晴れ・曇り・雨・雷の 4 種類のみで SNOWY / FOGGY は検証できず、maxInclination は 30 に固定されています。また補間の計算はプラグイン側が整数除算、シミュレーター側が浮動小数のため、同じ入力でも節目の間の値がずれることがあります。