This commit is contained in:
33333-33333 2026-09-17 22:32:25 +09:00
commit 8a9fd9b304
252 changed files with 356 additions and 1487 deletions

View file

@ -319,3 +319,128 @@ node --test tests/simulation.test.cjs tests/modifications.test.cjs
- 500年: 28都市 / 都市人口18,545
短期的な減少は災害・戦争により残るが、都市老朽化による恒久的な下押しはなく、被害後に再成長できることを確認した。
## v13 追加修正(占領人口・占領確率・領域外人口)
### 実装意図
- 都市占領の影響を都市人口だけに限定せず、周辺の地域人口にも反映する。
- 戦争で都市が短期間に連続占領されすぎるのを抑えるため、都市占領判定だけを半減する。
- 国家領域外の人口が恒久的な人口供給源として増え続けないよう、国家成立後の未所属セルに人口減少圧力を与える。
### 変更内容
- `SimConfig.war.captureChanceMultiplier = 0.50` を追加。
- `applyWarPressure()` の既存都市占領確率へ0.5倍を適用。
- 戦争開始率・戦争損害率・戦争終結条件は変更していない。
- 征服系都市移転に `applyOccupationPopulationShock()` を追加。
- 対象: `warCapture` / `borderWar` / `militaryAnnexation` / `settlement` / `nomadConquest`。
- 都市中心セルは都市人口損害との二重計上を避け、周辺半径4セルの地域人口だけを距離減衰付きで減少させる。
- 基礎損失率は0.08で、既存の戦争損害倍率0.65も適用する。
- 通常の戦場タイル損害とは責務を分離した。
- `SimConfig.population.unclaimedTerritoryGrowthPenalty = 0.03` を追加。
- 国家が一つ以上成立した後、`territoryOwner < 0` のセルに年次人口成長ペナルティを適用。
- 現在の地域人口の最大基礎成長率を上回るため、未所属セルは長期的に減少する。
- 国家領域内セルにはこのペナルティを適用しない。
### 回帰テスト
`tests/modifications.test.cjs` に以下を追加。
- 占領時に都市中心とは別に周辺地域人口が減少すること。
- 旧占領確率なら成立する乱数値でも、0.5倍後は失敗し、より低い乱数値では成立すること。
- 国家成立後は未所属セル人口が減少し、領域内セルには同じペナルティを掛けないこと。
全回帰テスト: **51/51成功**。
### 長期・性能確認
- 32×32 / 初期人口8,000 / 500年スモークテスト: 例外なし。
- 500年時点の地域人口 約83,465。
- 国家領域内 約82,896、未所属 約569。
- 未所属人口だけが縮小し、国家領域内人口まで一律に減らさないことを確認。
- 160×160 / 初期人口50,000:
- 初期化 約0.666秒。
- 240週進行 約0.205秒。
- 今回の変更による目立った性能劣化なし。
新規ソースファイルは作成していない。既存の `config.js` / `engine.js` / `tests/modifications.test.cjs` と本記録のみ更新した。
## v14 追加修正(領域離脱人口・災害地域損害・処理整理)
### 仕様変更
- 国家領域外セルへの恒常的な人口減少を廃止。
- セルが **国家所属(owner >= 0)から未所属(owner < 0)へ変わった瞬間だけ**、地域人口を12%減少させる。
- `SimConfig.population.territoryExitPopulationLossRate = 0.12`
- 未所属のまま時間が経過しても、この理由による追加減少は発生しない。
- 領土再計算中の一時的な所有状態変更では二重に損害を出さず、再計算前後で実際に「所属→未所属」になった人口セルだけを対象とする。
- 災害が地域セル人口にも直接損害を与えるよう変更。
- 地域セル人口損失率: `damage * 0.42`、上限65%。
- 都市人口の基準 `damage * 0.25` より大きく設定。
- 災害履歴に `regionalPopulationLoss` を記録する。
### 整理・軽量化
- `unclaimedTerritoryGrowthPenalty` と、未所属状態そのものに毎年人口減少を掛ける処理を削除。
- 資源再生の全マップ走査を四半期4回から年1回へ集約。
- 年間再生量48週分は維持し、次回年次経済処理の直前にまとめて反映する。
- `updateCities()` 冒頭の重複した `updatePopulationCapacity()` を削除。
- 農地・都市圏をゼロクリアした直後に全マップ再計算していたため、負荷が大きく、直前まで有効だった都市・農地ボーナスも一時的に捨てていた。
- 新しい農地・都市圏を再構築した後の1回だけ再計算する。
- 単なる委譲だけだった `updateTradeRoutesFieldBased()` を削除し、`updateTradeRoutes(true)` を直接呼ぶ。
- `updatePolities()` 内の「常に存在するメソッドに対する存在確認」を削除し、責務と呼出関係を明確化。
- 静的参照確認では、現行 `engine.js` に定義のみで参照されないメソッドは残っていない。
### 検査
- Node回帰テスト: **53/53 成功**。
- 追加確認:
- 所属→未所属の瞬間だけ12%人口減少。
- 未所属のままでは恒常減少せず、通常条件なら人口成長可能。
- 災害中心セルで地域人口42%損失(都市基準25%より大きい)。
- 32×32・500年スモークテスト完走。人口・都市・国家・災害履歴に非有限値や例外なし。
- 160×160・240週、同一ベンチマークを各5回実行した中央値:
- v13: **178.5 ms**
- v14: **93.6 ms**
- 約47%短縮。
### 旧仕様の扱い
v13で導入した「国家成立後、未所属セルへ毎年人口減少圧力を掛ける」仕様と `unclaimedTerritoryGrowthPenalty` は、v14で完全に廃止した。v13節の記録は変更履歴としてのみ残す。
## v15 追加修正(人口希薄セル・年次負荷分散・ヘルプ更新)
### 仕様変更
- `SimConfig.population.humanDataMinPopulation = 1.0` を追加。
- 地域人口が1未満のセルでは、人口に付随する人文データを常にゼロ扱いにする。
- 農業知識: 0
- 冶金知識: 0
- 文化多様性: 0
- 主民族: なし(内部値 -1)
- タイル民族構成も削除する。
- 国家領域・支配・交易路・交通量・農地など、人口希薄でも成立し得る政治・インフラ情報はゼロ化対象にしない。
### 年次更新の軽量化
- 年境界に集中していた周期処理を、周期自体は維持したまま年内の別週へ分散。
- 地域人口移動: 四半期4コホートに分割し、各セルは年1回処理。
- 国家更新: 年境界から1か月後へ移動。
- 技術更新: 2年周期のまま年内へオフセット。
- 文化同化: 3年周期のまま年内へオフセット。
- 文化伝播: 年1回のまま年後半へ移動。
- 交易路更新: 5年周期のまま年内へオフセット。
- 民族吸収・分化: 年1回のまま年境界から分離。
- フェロモン変化のたびに全マップの人口収容力を再計算する処理を廃止し、四半期更新へ整理。
- 国家所属都市一覧を更新単位でキャッシュし、同一更新内での反復構築を削減。
- 国庫都市候補の選定で全候補ソートを廃止し、最高得点探索+許容帯の加重抽選へ変更。
- `updatePolities()` 内に残っていた不要な `syncTilePopulationCulture()` を削除。
- 未参照だった `emptyTraitSums()` / `averageTraits()` / `updatePopulationCapacityTiles()` を削除。
### ヘルプ更新
- 民族説明から「分化は抑制され、」を削除。
- 国庫説明を「国庫で戦争や都市建設を行います。反乱時はいくらかが奪取されます。」へ変更。
- 制度老朽化説明を「老朽化が進むと制度改革が起こり、制度が新陳代謝されることもありますが、もしかしたら失敗するかもしれません。」へ変更。
### 検査・性能
- Node回帰テスト: **56/56成功**。
- 固定シード96×96、180年まで進行後の20年間を計測:
- v14 年境界平均: 約41.1 ms / 最大: 約62.6 ms
- v15 年境界平均: 約14.4 ms / 最大: 約26.2 ms
- 年境界平均は約65%短縮。
- 本体JavaScriptの静的参照確認で、定義のみで未参照のメソッドが残っていないことを確認。