diff --git a/plan/scenarios.md b/plan/scenarios.md index c79ea63..08c41bd 100644 --- a/plan/scenarios.md +++ b/plan/scenarios.md @@ -30,6 +30,8 @@ Forces come from helm, which already indexes year, BV, role and tonnage. assumption about north and south. Three of the suite's 24 scenarios fail, all on `Map Set 4/16x17 River Delta 1`; the other 21 pass. `--allow-uncrossable` demotes it to a warning +- [x] **Drop `River Delta 1` from the map pool** and regenerate the suite, so + the check has nothing left to reject. Epoch 3 - [ ] Asymmetric scenarios, once the mirrored baseline is stable - [ ] Objective scenarios, which [goals](goals.md) needs @@ -43,6 +45,8 @@ why the connectivity check treats any water as closed: depth 1 is the line that separates `River Delta 1`, which never produced a fight, from `Large Lakes 1`, which is wetter and plays fine. At depth 2 the check flags nothing. -The three `River Delta 1` scenarios are still in the suite. Regenerating them -out changes the suite fingerprint and makes every recorded baseline -incomparable, so it is its own change. +`River Delta 1` is now out of `MAPS` and the suite is regenerated without it; +`sds validate --suite scenarios/suite` passes all 24. That changes the suite +fingerprint and makes every earlier baseline incomparable, which is what +epoch 3 records. It is the only board of the twelve that fails, so no other +exclusion was needed. diff --git a/scenarios/suite/1v1-clan-invasion-s101011.mms b/scenarios/suite/1v1-clan-invasion-s101011.mms index 862fe24..209a52e 100644 --- a/scenarios/suite/1v1-clan-invasion-s101011.mms +++ b/scenarios/suite/1v1-clan-invasion-s101011.mms @@ -12,7 +12,7 @@ Name=1v1-clan-invasion-s101011 Description=Mirrored 1v1, clan-invasion era, 1838 BV a side, seed 101011. BoardWidth=1 BoardHeight=1 -Maps=Map Set 4/16x17 River Delta 1 +Maps=Map Set 5/16x17 Deep Canyon 1 Factions=North,South Location_North=N Location_South=S diff --git a/scenarios/suite/1v1-jihad-s102011.mms b/scenarios/suite/1v1-jihad-s102011.mms index 5fab681..14b07ba 100644 --- a/scenarios/suite/1v1-jihad-s102011.mms +++ b/scenarios/suite/1v1-jihad-s102011.mms @@ -12,7 +12,7 @@ Name=1v1-jihad-s102011 Description=Mirrored 1v1, jihad era, 1325 BV a side, seed 102011. BoardWidth=1 BoardHeight=1 -Maps=Map Set 5/16x17 Open Terrain 1 +Maps=Map Set 2/16x17 Mountain Lake Factions=North,South Location_North=N Location_South=S diff --git a/scenarios/suite/1v1-succession-wars-s100010.mms b/scenarios/suite/1v1-succession-wars-s100010.mms index e20e581..507a3ab 100644 --- a/scenarios/suite/1v1-succession-wars-s100010.mms +++ b/scenarios/suite/1v1-succession-wars-s100010.mms @@ -12,7 +12,7 @@ Name=1v1-succession-wars-s100010 Description=Mirrored 1v1, succession-wars era, 1319 BV a side, seed 100010. BoardWidth=1 BoardHeight=1 -Maps=Map Set 4/16x17 River Delta 1 +Maps=Map Set 5/16x17 Deep Canyon 1 Factions=North,South Location_North=N Location_South=S diff --git a/scenarios/suite/1v1-succession-wars-s100011.mms b/scenarios/suite/1v1-succession-wars-s100011.mms index fc1fe92..127cb4f 100644 --- a/scenarios/suite/1v1-succession-wars-s100011.mms +++ b/scenarios/suite/1v1-succession-wars-s100011.mms @@ -12,7 +12,7 @@ Name=1v1-succession-wars-s100011 Description=Mirrored 1v1, succession-wars era, 1242 BV a side, seed 100011. BoardWidth=1 BoardHeight=1 -Maps=Map Set 5/16x17 Open Terrain 1 +Maps=Map Set 5/16x17 Deep Canyon 1 Factions=North,South Location_North=N Location_South=S diff --git a/scenarios/suite/2v2-clan-invasion-s101020.mms b/scenarios/suite/2v2-clan-invasion-s101020.mms index a9e8015..6b3cb35 100644 --- a/scenarios/suite/2v2-clan-invasion-s101020.mms +++ b/scenarios/suite/2v2-clan-invasion-s101020.mms @@ -12,7 +12,7 @@ Name=2v2-clan-invasion-s101020 Description=Mirrored 2v2, clan-invasion era, 2847 BV a side, seed 101020. BoardWidth=1 BoardHeight=1 -Maps=Map Set 4/16x17 River Delta 1 +Maps=Map Set 5/16x17 Deep Canyon 1 Factions=North,South Location_North=N Location_South=S diff --git a/scenarios/suite/2v2-clan-invasion-s101021.mms b/scenarios/suite/2v2-clan-invasion-s101021.mms index 6229816..838f4c6 100644 --- a/scenarios/suite/2v2-clan-invasion-s101021.mms +++ b/scenarios/suite/2v2-clan-invasion-s101021.mms @@ -12,7 +12,7 @@ Name=2v2-clan-invasion-s101021 Description=Mirrored 2v2, clan-invasion era, 2736 BV a side, seed 101021. BoardWidth=1 BoardHeight=1 -Maps=Map Set 5/16x17 Deep Canyon 1 +Maps=Map Set 5/16x17 Large Mountain 1 Factions=North,South Location_North=N Location_South=S diff --git a/scenarios/suite/2v2-jihad-s102021.mms b/scenarios/suite/2v2-jihad-s102021.mms index 00c2f83..fff4449 100644 --- a/scenarios/suite/2v2-jihad-s102021.mms +++ b/scenarios/suite/2v2-jihad-s102021.mms @@ -12,7 +12,7 @@ Name=2v2-jihad-s102021 Description=Mirrored 2v2, jihad era, 2694 BV a side, seed 102021. BoardWidth=1 BoardHeight=1 -Maps=Map Set 5/16x17 Open Terrain 1 +Maps=Map Set 5/16x17 Deep Canyon 1 Factions=North,South Location_North=N Location_South=S diff --git a/scenarios/suite/4v4-clan-invasion-s101040.mms b/scenarios/suite/4v4-clan-invasion-s101040.mms index 4b1388f..da8989e 100644 --- a/scenarios/suite/4v4-clan-invasion-s101040.mms +++ b/scenarios/suite/4v4-clan-invasion-s101040.mms @@ -12,7 +12,7 @@ Name=4v4-clan-invasion-s101040 Description=Mirrored 4v4, clan-invasion era, 4898 BV a side, seed 101040. BoardWidth=1 BoardHeight=1 -Maps=Map Set 5/16x17 Large Mountain 1 +Maps=Map Set 5/16x17 Open Terrain 1 Factions=North,South Location_North=N Location_South=S diff --git a/scenarios/suite/4v4-succession-wars-s100040.mms b/scenarios/suite/4v4-succession-wars-s100040.mms index 5a3243e..90f5bc4 100644 --- a/scenarios/suite/4v4-succession-wars-s100040.mms +++ b/scenarios/suite/4v4-succession-wars-s100040.mms @@ -12,7 +12,7 @@ Name=4v4-succession-wars-s100040 Description=Mirrored 4v4, succession-wars era, 4427 BV a side, seed 100040. BoardWidth=1 BoardHeight=1 -Maps=Map Set 5/16x17 Large Mountain 1 +Maps=Map Set 5/16x17 Open Terrain 1 Factions=North,South Location_North=N Location_South=S diff --git a/scenarios/suite/4v4-succession-wars-s100041.mms b/scenarios/suite/4v4-succession-wars-s100041.mms index 754d9f4..ca729bd 100644 --- a/scenarios/suite/4v4-succession-wars-s100041.mms +++ b/scenarios/suite/4v4-succession-wars-s100041.mms @@ -12,7 +12,7 @@ Name=4v4-succession-wars-s100041 Description=Mirrored 4v4, succession-wars era, 4545 BV a side, seed 100041. BoardWidth=1 BoardHeight=1 -Maps=Map Set 5/16x17 Deep Canyon 1 +Maps=Map Set 5/16x17 Large Mountain 1 Factions=North,South Location_North=N Location_South=S diff --git a/scenarios/suite/8v8-clan-invasion-s101080.mms b/scenarios/suite/8v8-clan-invasion-s101080.mms index c789211..b812c48 100644 --- a/scenarios/suite/8v8-clan-invasion-s101080.mms +++ b/scenarios/suite/8v8-clan-invasion-s101080.mms @@ -12,7 +12,7 @@ Name=8v8-clan-invasion-s101080 Description=Mirrored 8v8, clan-invasion era, 15006 BV a side, seed 101080. BoardWidth=2 BoardHeight=1 -Maps=Map Set 5/16x17 Open Terrain 1,Map Set 2/16x17 BattleTech +Maps=Map Set 2/16x17 BattleTech,Map Set 5/16x17 Open Terrain 1 Factions=North,South Location_North=N Location_South=S diff --git a/scenarios/suite/8v8-jihad-s102080.mms b/scenarios/suite/8v8-jihad-s102080.mms index d2b5a6c..906e748 100644 --- a/scenarios/suite/8v8-jihad-s102080.mms +++ b/scenarios/suite/8v8-jihad-s102080.mms @@ -12,7 +12,7 @@ Name=8v8-jihad-s102080 Description=Mirrored 8v8, jihad era, 14834 BV a side, seed 102080. BoardWidth=2 BoardHeight=1 -Maps=Map Set 2/16x17 Lake Area,Map Set 5/16x17 Deep Canyon 1 +Maps=Map Set 2/16x17 Lake Area,Map Set 5/16x17 Large Mountain 1 Factions=North,South Location_North=N Location_South=S diff --git a/scenarios/suite/8v8-succession-wars-s100081.mms b/scenarios/suite/8v8-succession-wars-s100081.mms index d018f98..153397f 100644 --- a/scenarios/suite/8v8-succession-wars-s100081.mms +++ b/scenarios/suite/8v8-succession-wars-s100081.mms @@ -12,7 +12,7 @@ Name=8v8-succession-wars-s100081 Description=Mirrored 8v8, succession-wars era, 7809 BV a side, seed 100081. BoardWidth=2 BoardHeight=1 -Maps=Map Set 2/16x17 Lake Area,Map Set 5/16x17 Deep Canyon 1 +Maps=Map Set 2/16x17 Lake Area,Map Set 5/16x17 Large Mountain 1 Factions=North,South Location_North=N Location_South=S diff --git a/sds/epoch.py b/sds/epoch.py index fdf0907..dcd1058 100644 --- a/sds/epoch.py +++ b/sds/epoch.py @@ -19,7 +19,7 @@ Add a line to `CHANGES` when you bump it. A number with no note is worse than no number. """ -EPOCH = 2 +EPOCH = 3 CHANGES = { 1: "First measured harness: BV-destroyed victory at 70%, 40-round limit.", @@ -28,6 +28,12 @@ CHANGES = { "destroyed Mek left a 0-BV MekWarrior on the board, so a wiped-out side " "was still a live enemy and the game ran to the round limit." ), + 3: ( + "`Map Set 4/16x17 River Delta 1` is out of the suite's map pool. No " + "water-free path joins its deployment edges, so a match on it could " + "only ever reach the round limit at 100% BV a side. `sds validate` " + "rejects such a board." + ), } diff --git a/sds/scenario.py b/sds/scenario.py index 7913eb8..6150293 100644 --- a/sds/scenario.py +++ b/sds/scenario.py @@ -49,7 +49,13 @@ MAPS = [ "Map Set 3/16x17 Desert Mountain 1", "Map Set 4/16x17 Heavy Forest 1", "Map Set 4/16x17 Large Lakes 1", - "Map Set 4/16x17 River Delta 1", + # "Map Set 4/16x17 River Delta 1" is deliberately absent. No water-free + # path joins its two deployment edges: 119 of its 272 hexes are water and + # they band across the middle. Two Princesses never make contact and the + # game runs to the round limit at 100% BV a side. Of the twelve boards this + # list started with it is the only one that fails - water fraction is not + # the test, connectivity is, and `Large Lakes 1` is 50% water and plays + # fine. `sds validate` now checks this; see scenarios.md. "Map Set 5/16x17 Deep Canyon 1", "Map Set 5/16x17 Large Mountain 1", "Map Set 5/16x17 Open Terrain 1", diff --git a/tests/test_crossing.py b/tests/test_crossing.py index 2229cb4..7895eea 100644 --- a/tests/test_crossing.py +++ b/tests/test_crossing.py @@ -128,9 +128,15 @@ class TestSuiteMaps(unittest.TestCase): bottom = {(x, y) for x in range(width) for y in range(height - self.ZONE, height)} return connects(dry, top, bottom) - def test_river_delta_is_the_only_uncrossable_map(self): + def test_every_map_in_the_pool_is_crossable(self): blocked = sorted(name for name in MAPS if not self.crossable(name)) - self.assertEqual(blocked, ["Map Set 4/16x17 River Delta 1"]) + self.assertEqual(blocked, []) + + def test_river_delta_is_why_the_pool_excludes_it(self): + # Named rather than drawn from MAPS: it was removed from the pool, and + # the reason it was removed is the thing worth keeping a test on. + self.assertFalse(self.crossable("Map Set 4/16x17 River Delta 1")) + self.assertNotIn("Map Set 4/16x17 River Delta 1", MAPS) if __name__ == "__main__":