diff --git a/scripts/generate_pack.py b/scripts/generate_pack.py index 2c173f3c..6843b4f3 100644 --- a/scripts/generate_pack.py +++ b/scripts/generate_pack.py @@ -1257,7 +1257,9 @@ def generate_emulator_pack( os.makedirs(output_dir, exist_ok=True) region_drops: set[str] = ( - emulator_region_drops(selected, standalone, regions) if regions else set() + emulator_region_drops(selected, standalone, regions, required_only) + if regions + else set() ) total_files = 0 diff --git a/scripts/packextras.py b/scripts/packextras.py index 8b108c30..4c3d1c52 100644 --- a/scripts/packextras.py +++ b/scripts/packextras.py @@ -709,7 +709,10 @@ def platform_region_groups( return groups, extra_dests def emulator_region_drops( - selected: list[tuple[str, dict]], standalone: bool, regions: list[str] + selected: list[tuple[str, dict]], + standalone: bool, + regions: list[str], + required_only: bool = False, ) -> set[str]: """Destinations an emulator-mode `--region` withdraws. @@ -726,7 +729,10 @@ def emulator_region_drops( region_groups: dict[str, list[tuple[str, str]]] = {} for emu_name, profile in sorted(selected): structure = profile.get("pack_structure") - for fe in filter_files_by_mode(profile.get("files", []), standalone): + # Decided over what the pack keeps, as on the platform side: an + # optional winner removed afterwards left its slot empty. + entries = filter_files_by_mode(profile.get("files", []), standalone) + for fe in _kept(entries, required_only): dest = _resolve_destination(fe, structure, standalone) if dest: group_id = _emulator_region_group(emu_name, profile, fe) diff --git a/tests/test_region_required_only.py b/tests/test_region_required_only.py index 40ab2f6f..f361b33b 100644 --- a/tests/test_region_required_only.py +++ b/tests/test_region_required_only.py @@ -42,5 +42,20 @@ class RequiredOnlyBeforeRegion(unittest.TestCase): self.assertIn("required_only", {kw.arg for kw in call.keywords}) +class EmulatorModeToo(unittest.TestCase): + """--emulator mednafen_pce_fast --region us --required-only shipped 0 files: + the optional US cards won the group, then --required-only removed them.""" + + def test_the_required_card_survives(self): + from packextras import emulator_region_drops # noqa: PLC0415 + + profile = {"systems": ["nec-pc-engine"], "files": [ + {"name": "syscard3.pce", "required": True, "region": ["japan"]}, + {"name": "syscard3u.pce", "required": False, "region": ["north-america"]}, + ]} + drops = emulator_region_drops([("pce", profile)], False, ["north-america"], True) + self.assertNotIn("syscard3.pce", drops) + + if __name__ == "__main__": unittest.main()