← ゲームへ地域とイベントの紐付け
直接・間接影響の登録例
# 地図・出来事・地域影響の紐付け
## 定義の単位
歴史的な出来事を1レコード、その出来事から生じる地域別の影響を `impacts` に登録する。史実の発生自体と、ある人物がその影響を経験する抽選は別である。出来事が実際に起きた年を確率で変えない。
| 層 | データ | 実行すること |
| --- | --- | --- |
| 史実 | 発生年・元の暦・日付精度・出典・記述 | 歴史背景と発生時点を保持 |
| 地理 | 対象地域・除外地域・居住地・根拠・粗さ | 人物がその範囲にいるか判定 |
| 影響 | direct / indirect / none / unknown | 適用方式を選ぶ。unknownをnoneにしない |
| 経路 | local / food-trade / transport / migration / political / labor、起点の説明、遅延、根拠 | 直接影響と、別地域への遅れた波及を分離 |
| 人物 | 年齢・身分・職業 | すべての条件が合う人物だけを対象にする |
| 抽選 | 確率、単位、根拠、仮定/統計推定の区別 | 1人・1出来事・1影響期間につき一度だけ判定 |
| 結果 | 既知の計算profile、期間 | 数値・台帳・対応選択肢へ接続 |
## 状態
- **直接影響**:現地の揺れ・食料不足など。
- **間接影響**:価格・交易・交通・移住・政治・労働機会を通じた別地域の負担など。地理的に隣接するだけでは自動発生させない。
- **影響なし**:定義上の対象外。資料で確認したものか、どの範囲のモデル上の設定なのかをbasisへ記す。単に未登録の地域ではない。
- **資料不足**:効果・確率を適用しない。被害がなかったという意味ではない。
- 実行中の判定状態は、開始前/条件不一致/対象外/資料不足/抽選成功/抽選失敗/期間終了に分ける。
現在は同一イベント内の地域範囲を重複させない。直接・間接や異なる影響同士が同じ地域へ重なるデータは検証で止め、分割・統合方針を定めてから採用する。複数経路の相関や加算を勝手に推定しない。
## 時間と確率
`window.mode` は地震のような一時点を `instant`、飢饉・価格負担など継続する状況を `sustained` とする。`window.durationYears` は影響を経験し得る期間、`transmission.lagYears` は元の出来事からの遅延。秒数ではなく年内比率で計算し、速度変更では結果を変えない。
瞬間型はその発生時点で外にいた人物に後から発生させない。継続型は期間内に対象地へ移った場合に判定する。一度抽選した影響は、失敗も保存する。転出・再入場、毎秒の更新、年送りで同じ抽選を増やさない。同一人生のseed・出来事ID・影響IDから再現可能な乱数を計算する。ページ再読込では従来どおり人生自体が引き直される。
確率の単位は `per-person-per-event-window`。毎秒35%や毎年35%ではない。統計推定には方法と出典が必要。不明な確率を人口割合や死者数から自動算出しない。暫定確率を採用する場合は `game_design_assumption` と理由を明示する。1回のイベント期間を年次記録へ分けるときは、それぞれが別の年の負担・別の抽選であることを明示する。
## 実装例:享保の飢饉
国立公文書館の説明では、1732年の西日本の凶作・虫害、救援米の移送に伴う江戸の米価上昇が扱われる。
- 部分的な直接対象:土佐・安芸・出雲・播磨・大和。史料の広域記述を既存の地域索引へ対応させた簡略モデルで、各旧国の全域・全住民の一律被害を示すデータではない。
- 間接対象:武蔵。史料の江戸という都市の記述を現在の粗い地域索引で扱う。武蔵全域への同じ負担を実証したものではない。
- 直接65%、間接35%、3か月の波及遅延はすべて試作値。個人の歴史的な実測被害率ではない。
- 間接効果は食料購入負担profileを用い、建物の減損や地震の健康低下を流用しない。
- その他の地域はunknown。隣接地への自動伝播・多段階の交易ネットワークはまだ推定しない。必要な経路と対象を明示的に登録する。
出典:https://www.archives.go.jp/exhibition/digital/tenkataihen/famine/index.html
## 新しい情報の追加
1. `catalog.json` の元の出来事に発生時点と史料を登録。
2. 直接対象と間接対象のimpactを分ける。それぞれに対象/除外地域、人物条件、出典、経路と遅延の根拠を書く。
3. 確率・単位・根拠、既存profile、開始からの期間を定める。分からなければunknownまたはdraftで保存。
4. `npm run history:check` で日付・範囲・確率・競合・二重抽選・収支を検証。
5. 公開後はゲームと地図が同じ定義を参照する。地図の表は地域の基準値、実際の人物にはさらに条件を判定する。
既存の `history-pack.example.json` はこの形式の実例。新しい経路名だけを登録しても計算方式は自動生成しない。既知のprofile以外の効果は専用処理を追加してから採用する。
## 地図の完成範囲
全国の地形と1862年頃266藩の復元面、検索、選択、ズーム、ドラッグ、キーボード、地域参照点、出生/居住の区別、参照年、イベントの地域状態表まで接続。地形は現代参照、藩領は参考復元。南西諸島・南方の島々は別枠。
1542〜1930の全年度の支配ポリゴンは未整備。1862年以外へ藩領の色を外挿しない。イベント記号は地域参照点であり、正確な被災境界ではない。旧国ごとの実ポリゴンを未確認の形で作らず、精密な地理がそろったときに置換する。
## 処理量
イベントは年の索引から候補を取り、抽選済みの影響は再評価しない。地図は参照年・レイヤー・人物の地域が変わったときに更新。人生の詳細は状態・季節・選択などの変化時に描き、時計と再生状態は軽い更新に分ける。数値や履歴を表示するためだけに毎秒全DOMを作り直さない。
一般の歴史イベントは `type: historical-event` と `regional-event-v1` で登録できる。既知のprofileはfood-price(購入負担)、trade-disruption(交通・交易の収入負担)、migration-pressure(移住圧力の生活負担)。移住圧力だけで本人を強制転居させず、権利や通行許可も変更しない。史料が確認できる新規のイベントをこの方式へ登録すれば、同じ地域判定・抽選・表示を利用できる。