235 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			235 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from typing import Callable, List
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from BaseClasses import CollectionState
							 | 
						||
| 
								 | 
							
								from ..Data import get_era_required_items_data
							 | 
						||
| 
								 | 
							
								from ..Enum import EraType
							 | 
						||
| 
								 | 
							
								from ..ProgressiveDistricts import convert_items_to_progressive_items
							 | 
						||
| 
								 | 
							
								from ..Items import get_item_by_civ_name
							 | 
						||
| 
								 | 
							
								from . import CivVITestBase
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def collect_items_for_era(test: CivVITestBase, era: EraType) -> None:
							 | 
						||
| 
								 | 
							
								    era_required_items = get_era_required_items_data()
							 | 
						||
| 
								 | 
							
								    items = [
							 | 
						||
| 
								 | 
							
								        get_item_by_civ_name(item, test.world.item_table).name
							 | 
						||
| 
								 | 
							
								        for item in era_required_items[era.value]
							 | 
						||
| 
								 | 
							
								    ]
							 | 
						||
| 
								 | 
							
								    test.collect_by_name(items)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def collect_items_for_era_progressive(test: CivVITestBase, era: EraType) -> None:
							 | 
						||
| 
								 | 
							
								    era_progression_items = get_era_required_items_data()
							 | 
						||
| 
								 | 
							
								    progressive_items = convert_items_to_progressive_items(
							 | 
						||
| 
								 | 
							
								        era_progression_items[era.value]
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								    items = [
							 | 
						||
| 
								 | 
							
								        get_item_by_civ_name(item, test.world.item_table).name
							 | 
						||
| 
								 | 
							
								        for item in progressive_items
							 | 
						||
| 
								 | 
							
								    ]
							 | 
						||
| 
								 | 
							
								    for item in items:
							 | 
						||
| 
								 | 
							
								        test.collect(test.get_item_by_name(item))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def verify_eras_accessible(
							 | 
						||
| 
								 | 
							
								    test: CivVITestBase,
							 | 
						||
| 
								 | 
							
								    state: CollectionState,
							 | 
						||
| 
								 | 
							
								    collect_func: Callable[[CivVITestBase, EraType], None],
							 | 
						||
| 
								 | 
							
								) -> None:
							 | 
						||
| 
								 | 
							
								    """Collect for an era, then check if the next era is accessible and the one after that is not"""
							 | 
						||
| 
								 | 
							
								    for era in EraType:
							 | 
						||
| 
								 | 
							
								        if era == EraType.ERA_ANCIENT:
							 | 
						||
| 
								 | 
							
								            test.assertTrue(state.can_reach(era.value, "Region", test.player))
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            test.assertFalse(state.can_reach(era.value, "Region", test.player))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    eras = [
							 | 
						||
| 
								 | 
							
								        EraType.ERA_ANCIENT,
							 | 
						||
| 
								 | 
							
								        EraType.ERA_CLASSICAL,
							 | 
						||
| 
								 | 
							
								        EraType.ERA_MEDIEVAL,
							 | 
						||
| 
								 | 
							
								        EraType.ERA_RENAISSANCE,
							 | 
						||
| 
								 | 
							
								        EraType.ERA_INDUSTRIAL,
							 | 
						||
| 
								 | 
							
								        EraType.ERA_MODERN,
							 | 
						||
| 
								 | 
							
								        EraType.ERA_ATOMIC,
							 | 
						||
| 
								 | 
							
								        EraType.ERA_INFORMATION,
							 | 
						||
| 
								 | 
							
								        EraType.ERA_FUTURE,
							 | 
						||
| 
								 | 
							
								    ]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for i in range(len(eras) - 1):
							 | 
						||
| 
								 | 
							
								        collect_func(test, eras[i])
							 | 
						||
| 
								 | 
							
								        test.assertTrue(state.can_reach(eras[i + 1].value, "Region", test.player))
							 | 
						||
| 
								 | 
							
								        if i + 2 < len(eras):
							 | 
						||
| 
								 | 
							
								            test.assertFalse(state.can_reach(eras[i + 2].value, "Region", test.player))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestNonProgressiveRegionRequirements(CivVITestBase):
							 | 
						||
| 
								 | 
							
								    options = {
							 | 
						||
| 
								 | 
							
								        "progression_style": "none",
							 | 
						||
| 
								 | 
							
								        "boostsanity": "false",
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_eras_are_accessible_without_progressive_districts(self) -> None:
							 | 
						||
| 
								 | 
							
								        state = self.multiworld.state
							 | 
						||
| 
								 | 
							
								        verify_eras_accessible(self, state, collect_items_for_era)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestNonProgressiveRegionRequirementsWithBoostsanity(CivVITestBase):
							 | 
						||
| 
								 | 
							
								    options = {
							 | 
						||
| 
								 | 
							
								        "progression_style": "none",
							 | 
						||
| 
								 | 
							
								        "boostsanity": "true",
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_eras_are_accessible_without_progressive_districts(self) -> None:
							 | 
						||
| 
								 | 
							
								        state = self.multiworld.state
							 | 
						||
| 
								 | 
							
								        verify_eras_accessible(self, state, collect_items_for_era)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestProgressiveDistrictRequirementsWithBoostsanity(CivVITestBase):
							 | 
						||
| 
								 | 
							
								    options = {
							 | 
						||
| 
								 | 
							
								        "progression_style": "districts_only",
							 | 
						||
| 
								 | 
							
								        "boostsanity": "true",
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_eras_are_accessible_with_progressive_districts(self) -> None:
							 | 
						||
| 
								 | 
							
								        state = self.multiworld.state
							 | 
						||
| 
								 | 
							
								        verify_eras_accessible(self, state, collect_items_for_era_progressive)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestProgressiveDistrictRequirements(CivVITestBase):
							 | 
						||
| 
								 | 
							
								    options = {
							 | 
						||
| 
								 | 
							
								        "progression_style": "districts_only",
							 | 
						||
| 
								 | 
							
								        "boostsanity": "false",
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_eras_are_accessible_with_progressive_districts(self) -> None:
							 | 
						||
| 
								 | 
							
								        state = self.multiworld.state
							 | 
						||
| 
								 | 
							
								        verify_eras_accessible(self, state, collect_items_for_era_progressive)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_progressive_districts_are_required(self) -> None:
							 | 
						||
| 
								 | 
							
								        state = self.multiworld.state
							 | 
						||
| 
								 | 
							
								        self.collect_all_but(["Progressive Encampment"])
							 | 
						||
| 
								 | 
							
								        self.assertFalse(state.can_reach("ERA_CLASSICAL", "Region", self.player))
							 | 
						||
| 
								 | 
							
								        self.assertFalse(state.can_reach("ERA_RENAISSANCE", "Region", self.player))
							 | 
						||
| 
								 | 
							
								        self.assertFalse(state.can_reach("ERA_MODERN", "Region", self.player))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.collect(self.get_item_by_name("Progressive Encampment"))
							 | 
						||
| 
								 | 
							
								        self.assertTrue(state.can_reach("ERA_CLASSICAL", "Region", self.player))
							 | 
						||
| 
								 | 
							
								        self.assertFalse(state.can_reach("ERA_RENAISSANCE", "Region", self.player))
							 | 
						||
| 
								 | 
							
								        self.assertFalse(state.can_reach("ERA_MODERN", "Region", self.player))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.collect(self.get_item_by_name("Progressive Encampment"))
							 | 
						||
| 
								 | 
							
								        self.assertTrue(state.can_reach("ERA_RENAISSANCE", "Region", self.player))
							 | 
						||
| 
								 | 
							
								        self.assertFalse(state.can_reach("ERA_MODERN", "Region", self.player))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.collect(self.get_item_by_name("Progressive Encampment"))
							 | 
						||
| 
								 | 
							
								        self.assertTrue(state.can_reach("ERA_MODERN", "Region", self.player))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestProgressiveEraRequirements(CivVITestBase):
							 | 
						||
| 
								 | 
							
								    options = {
							 | 
						||
| 
								 | 
							
								        "progression_style": "eras_and_districts",
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_eras_are_accessible_with_progressive_eras(self) -> None:
							 | 
						||
| 
								 | 
							
								        state = self.multiworld.state
							 | 
						||
| 
								 | 
							
								        self.collect_all_but(["Progressive Era"])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def check_eras_accessible(eras: List[EraType]):
							 | 
						||
| 
								 | 
							
								            for era in EraType:
							 | 
						||
| 
								 | 
							
								                if era in eras:
							 | 
						||
| 
								 | 
							
								                    self.assertTrue(state.can_reach(era.value, "Region", self.player))
							 | 
						||
| 
								 | 
							
								                else:
							 | 
						||
| 
								 | 
							
								                    self.assertFalse(state.can_reach(era.value, "Region", self.player))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        progresive_era_item = self.get_item_by_name("Progressive Era")
							 | 
						||
| 
								 | 
							
								        accessible_eras = [EraType.ERA_ANCIENT]
							 | 
						||
| 
								 | 
							
								        check_eras_accessible(accessible_eras)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # Classical era requires 2 progressive era items
							 | 
						||
| 
								 | 
							
								        self.collect(progresive_era_item)
							 | 
						||
| 
								 | 
							
								        accessible_eras += [EraType.ERA_CLASSICAL]
							 | 
						||
| 
								 | 
							
								        check_eras_accessible(accessible_eras)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.collect(progresive_era_item)
							 | 
						||
| 
								 | 
							
								        accessible_eras += [EraType.ERA_MEDIEVAL]
							 | 
						||
| 
								 | 
							
								        check_eras_accessible(accessible_eras)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.collect(progresive_era_item)
							 | 
						||
| 
								 | 
							
								        accessible_eras += [EraType.ERA_RENAISSANCE]
							 | 
						||
| 
								 | 
							
								        check_eras_accessible(accessible_eras)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.collect(progresive_era_item)
							 | 
						||
| 
								 | 
							
								        accessible_eras += [EraType.ERA_INDUSTRIAL]
							 | 
						||
| 
								 | 
							
								        check_eras_accessible(accessible_eras)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.collect(progresive_era_item)
							 | 
						||
| 
								 | 
							
								        accessible_eras += [EraType.ERA_MODERN]
							 | 
						||
| 
								 | 
							
								        check_eras_accessible(accessible_eras)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.collect(progresive_era_item)
							 | 
						||
| 
								 | 
							
								        accessible_eras += [EraType.ERA_ATOMIC]
							 | 
						||
| 
								 | 
							
								        check_eras_accessible(accessible_eras)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # Since we collect 2 in the ancient era, information and future era have same logic requirement
							 | 
						||
| 
								 | 
							
								        self.collect(progresive_era_item)
							 | 
						||
| 
								 | 
							
								        accessible_eras += [EraType.ERA_INFORMATION]
							 | 
						||
| 
								 | 
							
								        accessible_eras += [EraType.ERA_FUTURE]
							 | 
						||
| 
								 | 
							
								        check_eras_accessible(accessible_eras)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestProgressiveEraRequirementsWithBoostsanity(CivVITestBase):
							 | 
						||
| 
								 | 
							
								    options = {
							 | 
						||
| 
								 | 
							
								        "progression_style": "eras_and_districts",
							 | 
						||
| 
								 | 
							
								        "boostsanity": "true",
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_eras_are_accessible_with_progressive_eras(self) -> None:
							 | 
						||
| 
								 | 
							
								        state = self.multiworld.state
							 | 
						||
| 
								 | 
							
								        self.collect_all_but(["Progressive Era"])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def check_eras_accessible(eras: List[EraType]):
							 | 
						||
| 
								 | 
							
								            for era in EraType:
							 | 
						||
| 
								 | 
							
								                if era in eras:
							 | 
						||
| 
								 | 
							
								                    self.assertTrue(
							 | 
						||
| 
								 | 
							
								                        state.can_reach(era.value, "Region", self.player),
							 | 
						||
| 
								 | 
							
								                        "Failed for era: " + era.value,
							 | 
						||
| 
								 | 
							
								                    )
							 | 
						||
| 
								 | 
							
								                else:
							 | 
						||
| 
								 | 
							
								                    self.assertFalse(
							 | 
						||
| 
								 | 
							
								                        state.can_reach(era.value, "Region", self.player),
							 | 
						||
| 
								 | 
							
								                        "Failed for era: " + era.value,
							 | 
						||
| 
								 | 
							
								                    )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        progresive_era_item = self.get_item_by_name("Progressive Era")
							 | 
						||
| 
								 | 
							
								        accessible_eras = [EraType.ERA_ANCIENT]
							 | 
						||
| 
								 | 
							
								        check_eras_accessible(accessible_eras)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.collect(progresive_era_item)
							 | 
						||
| 
								 | 
							
								        accessible_eras += [EraType.ERA_CLASSICAL]
							 | 
						||
| 
								 | 
							
								        check_eras_accessible(accessible_eras)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.collect(progresive_era_item)
							 | 
						||
| 
								 | 
							
								        accessible_eras += [EraType.ERA_MEDIEVAL]
							 | 
						||
| 
								 | 
							
								        check_eras_accessible(accessible_eras)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.collect(progresive_era_item)
							 | 
						||
| 
								 | 
							
								        accessible_eras += [EraType.ERA_RENAISSANCE]
							 | 
						||
| 
								 | 
							
								        check_eras_accessible(accessible_eras)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.collect(progresive_era_item)
							 | 
						||
| 
								 | 
							
								        accessible_eras += [EraType.ERA_INDUSTRIAL]
							 | 
						||
| 
								 | 
							
								        check_eras_accessible(accessible_eras)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.collect(progresive_era_item)
							 | 
						||
| 
								 | 
							
								        accessible_eras += [EraType.ERA_MODERN]
							 | 
						||
| 
								 | 
							
								        check_eras_accessible(accessible_eras)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.collect(progresive_era_item)
							 | 
						||
| 
								 | 
							
								        accessible_eras += [EraType.ERA_ATOMIC]
							 | 
						||
| 
								 | 
							
								        check_eras_accessible(accessible_eras)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # Since we collect 2 in the ancient era, information and future era have same logic requirement
							 | 
						||
| 
								 | 
							
								        self.collect(progresive_era_item)
							 | 
						||
| 
								 | 
							
								        accessible_eras += [EraType.ERA_INFORMATION]
							 | 
						||
| 
								 | 
							
								        accessible_eras += [EraType.ERA_FUTURE]
							 | 
						||
| 
								 | 
							
								        check_eras_accessible(accessible_eras)
							 |