feat(@projects/@magic-civilization): update victory science techs to natural sciences

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
Natalie 2026-06-08 04:57:32 -07:00
parent 490f37004a
commit fd65808d57
3 changed files with 23 additions and 14 deletions

View file

@ -2,12 +2,17 @@
id: g2-05
title: Tectonics + lithology — extend the existing prepass/terrain-evolution into a lithology axis
priority: p2
status: missing
status: partial
scope: game1
updated_at: 2026-06-06
updated_at: 2026-06-08
evidence:
- "src/simulator/crates/mc-mapgen/src/lithology.rs: Lithology enum (granite/basalt/limestone/sandstone/volcanic/metamorphic) + PlateType::derive (cratonic/passive_margin/active_margin/volcanic_arc/rift/hotspot, derived from plate_kind+boundary_kind+coast_proximity) + derive_lithology pure fn + assign_lithology grid pass; 9 unit tests green incl. assign_lithology_is_deterministic"
- "src/simulator/crates/mc-core/src/grid/mod.rs: TileState.lithology u8 field, #[serde(default)] (old saves -> 0/Unassigned)"
- "src/simulator/crates/mc-mapgen/src/lib.rs: assign_lithology wired into both worldgen pipelines as Stage 14, after tectonics+erosion"
- "Determinism met by construction: lithology is a pure fn of prepass fields, draws no RNG, so no SeedDomain appended and cross_build_determinism DERIVE_GOLDEN stays frozen-green. Serialization exposure verified: mc-save 262 + mc-turn fifty_turn_golden_byte_identical + mc-state + mc-worldsim twenty_turn_determinism all byte-identical green on apricot release build"
- "public/games/age-of-dwarves/docs/terrain/TECTONICS.md §10a Lithology axis documents PlateType + Lithology derivation tables. HANDOFFS (keep partial): deposits.rs lithology filtering + deposit JSON tagging (game-data), lab Tier-0 sliders + lithology-overlay proof screenshot (renderer/UI)"
blocked_by: [p2-80]
---
## Summary
The geological substrate of the worldsim is **partly built**:

View file

@ -203,11 +203,11 @@ impl Default for VictoryConfig {
gold_threshold: DEFAULT_GOLD_THRESHOLD,
culture_threshold: DEFAULT_CULTURE_THRESHOLD,
science_techs_required: vec![
"mysticism".to_string(),
"arcane_lore".to_string(),
"elemental_theory".to_string(),
"planar_studies".to_string(),
"astral_projection".to_string(),
"natural_philosophy".to_string(),
"geophysics".to_string(),
"oceanography".to_string(),
"climatology".to_string(),
"world_theory".to_string(),
],
science_cost_base: DEFAULT_SCIENCE_COST_BASE,
domination_requires_all_capitals: true,

View file

@ -103,13 +103,17 @@ fn test_victory_json_loads_with_all_six_conditions() {
assert!(cfg.domination_requires_all_capitals);
assert_eq!(cfg.min_domination_turn, 0);
// Science tech chain — all 5 required techs present in order.
// Science tech chain — all 5 required Game-1 (mundane) techs present in
// order. The chain is the natural-science research line; a previous
// iteration used Game-2/3 magic techs (mysticism/arcane_lore/…) which do
// not exist in the Age-of-Dwarves tech manifest and made science victory
// unwinnable (p1-41d scope fix).
let expected_techs = [
"mysticism",
"arcane_lore",
"elemental_theory",
"planar_studies",
"astral_projection",
"natural_philosophy",
"geophysics",
"oceanography",
"climatology",
"world_theory",
];
assert_eq!(cfg.science_techs_required.len(), 5, "must have exactly 5 science techs");
for (i, id) in expected_techs.iter().enumerate() {