荒天の押し流しを入れた航海のレポートの読み方

数値は stats/voyage_storm.yaml にあります。 tests/diagnostics/voyageStormStatsReport.test.ts が、海区と筏を実体化した世界で 出航地点から本土まで実際に渡らせて測ったものです。海区の網・荒天の押し流し方・天気と風向きの 引き方を変更したら再生成します。

npm run stats:voyage-storm

この文書は手書きで、再生成しても書き換わりません。 持つのは読み方——何を測ったか、どこに線を 引いたか、何を数えていないか——だけです。数値そのものは1行も書きません(書けば、再生成した YAMLとずれます)。

静的に解いた側との分かれ目

VoyageStats.md が読む stats/voyage.yaml は、定義だけ から解いた値で、実行を通していません。押し流しだけはそこに乗せられません——何区間ぶん動くかが 実行時にしか決まらないからで(Voyage.md 3.8 節)、こちらは世界を回して測ります。

stats/voyage.yaml stats/voyage_storm.yaml
測り方 定義だけから解く 海区と筏を実体化して時計を進める
押し流し 数えない(起きなかった場合の下限) 数える
針路 出航地点ごとに近道と遠回りの両方 出航地点ごとに、区間の最も少ない1本だけ

押し流された先から先へ進む道は、残り区間の最も少ない辺を採ります。 遠回りを選ぶ理由は実り (Voyage.md 3.3 節)であって、押し流しの測りに要るのは最短で渡り切る形だけ なので、遠回りを最初から選ぶ針路はこの表に現れません。

YAMLの節

節 中身
meta 何本の世界を、1本の世界と出航地点につき何回渡らせたか
input_fingerprint シミュレーションの入力ファイルと、その中身のハッシュ
baseline 押し流しを数えない側の、出航地点×季節ごとの区間数と日数
course_storm 押し流しを入れた実日数の分布(出航地点×季節)
course_crossings 漕ぎ出した回数の分布。空振りになった渡りも数える
sweeps 1回の航海あたり、何回押し流され、何回の渡りが空振りになったか
storm_cost 押し流しが足した分——baseline との差

この表とYAMLが食い違うと npm test が赤くなります。 表に挙げた節がYAMLに在って空でないことと、 表に無い節がYAMLに無いことの両方を、生成元のテストが見ます。

指紋が見るもの

input_fingerprint が見るのは core.yaml と voyage.yaml だけです。世界を回す側が読むのはこの2つ ——天気と風向きの引き方(前者)と、海区の網・押し流しの卓(後者)——で、ここが変われば再生成しないと npm test が赤くなります。

日数の分母(1日ぶんの自由時間)は指紋の外です。 島の献立を触れば動きますが、そこまで含めると YAMLを1行直すたびに再生成を要求することになります。外れたぶんは baseline 節の再計算で 突き合わせます——あの節は押し流しを数えずに出る値なので、世界を回さずに作り直して比べられます。

どちらも見ないのは、シミュレーションのコードを変えて古くなったぶんです。 そこは regenerate-stats.yml が main で丸ごと作り直して 拾います。

押し流しはエンジンが起こす

海区も本土も筏も実体化して時計を進めるだけで、押し流しは src/assets/world-codex/voyage.yaml の宣言が 起こします——さらされた時間の溜まり方も、風下がどちら側かも、分かれ道でどちらへ流されるかもです。 シミュレーションが書いているのは乗り手の振る舞いだけで、どの辺を選び、いつ見張り、いつ漕ぎ出すかを 決めます。

島は作りません。 押し流しに要るのは world(天気と風向き)と海区と筏だけで、島の地形まで実体化すると 1 tick の仕事が数十倍になります。

日数の物差し

days は出航から到達までの実日数で、VoyageStats.md の days と同じ物差しに なるよう、航海の仕事は1日ぶんの自由時間しか進みません。残りの時間は筏が漂ったまま過ぎます。

この線は押し流しの量そのものに効きます。 押し流しは筏が浮かんでいる限り進む(乗り手が何を していようと関係ない)ので、実日数を詰めると嵐にさらされる時間が実際より短く出ます。

押し流しの起きない季節では、course_storm は baseline へ戻ります——同じ物差しであることは、 そこで確かめられます。

何を乗せて、何を乗せていないか

押し流された向きの読み方

sweeps の backwards・forwards は、本土までの残り海区数が増えたか減ったかで分けています。 宣言の側の「本土の側/島の側」とは分かれ目が違い、分かれ道から遠回りの側(沖の潮目)へ流された回は、 宣言では本土の側でも残り海区数は増えるので backwards に入ります (Voyage.md 3.8 節)。

鎖の端で風下の隣を持たない回は、どちらにも入りません——筏が動かないので、押し流しそのものが 起きなかった回と区別しません。

このレポートは判定を出さない

季節の窓が期限として働くかは、ここの数字を読んで Voyage.md が決めます。 ここが出すのは、その判断に要る差だけです。