Stardew Valley: Fix unresolved reference warning and unused imports (#4360)
* fix unresolved reference warning and unused imports * revert stuff * just a commit to rerun the tests cuz messenger fail
This commit is contained in:
		
							parent
							
								
									b7b78dead3
								
							
						
					
					
						commit
						051518e72a
					
				| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
from random import Random
 | 
					from random import Random
 | 
				
			||||||
from typing import Dict, Any, Iterable, Optional, List, TextIO
 | 
					from typing import Dict, Any, Iterable, Optional, List, TextIO, cast
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from BaseClasses import Region, Entrance, Location, Item, Tutorial, ItemClassification, MultiWorld, CollectionState
 | 
					from BaseClasses import Region, Entrance, Location, Item, Tutorial, ItemClassification, MultiWorld, CollectionState
 | 
				
			||||||
from Options import PerGameCommonOptions
 | 
					from Options import PerGameCommonOptions
 | 
				
			||||||
| 
						 | 
					@ -124,7 +124,7 @@ class StardewValleyWorld(World):
 | 
				
			||||||
                                                self.options)
 | 
					                                                self.options)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        def add_location(name: str, code: Optional[int], region: str):
 | 
					        def add_location(name: str, code: Optional[int], region: str):
 | 
				
			||||||
            region = world_regions[region]
 | 
					            region: Region = world_regions[region]
 | 
				
			||||||
            location = StardewLocation(self.player, name, code, region)
 | 
					            location = StardewLocation(self.player, name, code, region)
 | 
				
			||||||
            region.locations.append(location)
 | 
					            region.locations.append(location)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -314,9 +314,9 @@ class StardewValleyWorld(World):
 | 
				
			||||||
            include_traps = True
 | 
					            include_traps = True
 | 
				
			||||||
            exclude_island = False
 | 
					            exclude_island = False
 | 
				
			||||||
            for player in link_group["players"]:
 | 
					            for player in link_group["players"]:
 | 
				
			||||||
                player_options = self.multiworld.worlds[player].options
 | 
					 | 
				
			||||||
                if self.multiworld.game[player] != self.game:
 | 
					                if self.multiworld.game[player] != self.game:
 | 
				
			||||||
                    continue
 | 
					                    continue
 | 
				
			||||||
 | 
					                player_options = cast(StardewValleyOptions, self.multiworld.worlds[player].options)
 | 
				
			||||||
                if player_options.trap_items == TrapItems.option_no_traps:
 | 
					                if player_options.trap_items == TrapItems.option_no_traps:
 | 
				
			||||||
                    include_traps = False
 | 
					                    include_traps = False
 | 
				
			||||||
                if player_options.exclude_ginger_island == ExcludeGingerIsland.option_true:
 | 
					                if player_options.exclude_ginger_island == ExcludeGingerIsland.option_true:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@ from typing import List
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from .bundle import Bundle, BundleTemplate
 | 
					from .bundle import Bundle, BundleTemplate
 | 
				
			||||||
from ..content import StardewContent
 | 
					from ..content import StardewContent
 | 
				
			||||||
from ..options import BundlePrice, StardewValleyOptions
 | 
					from ..options import StardewValleyOptions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@dataclass
 | 
					@dataclass
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,15 +10,14 @@ from ...data.shop import ShopSource
 | 
				
			||||||
from ...mods.mod_data import ModNames
 | 
					from ...mods.mod_data import ModNames
 | 
				
			||||||
from ...strings.craftable_names import ModEdible
 | 
					from ...strings.craftable_names import ModEdible
 | 
				
			||||||
from ...strings.crop_names import Fruit, SVEVegetable, SVEFruit
 | 
					from ...strings.crop_names import Fruit, SVEVegetable, SVEFruit
 | 
				
			||||||
from ...strings.fish_names import WaterItem, SVEFish, SVEWaterItem
 | 
					from ...strings.fish_names import WaterItem, SVEWaterItem
 | 
				
			||||||
from ...strings.flower_names import Flower
 | 
					from ...strings.flower_names import Flower
 | 
				
			||||||
from ...strings.food_names import SVEMeal, SVEBeverage
 | 
					from ...strings.food_names import SVEMeal, SVEBeverage
 | 
				
			||||||
from ...strings.forageable_names import Mushroom, Forageable, SVEForage
 | 
					from ...strings.forageable_names import Mushroom, Forageable, SVEForage
 | 
				
			||||||
from ...strings.gift_names import SVEGift
 | 
					from ...strings.gift_names import SVEGift
 | 
				
			||||||
from ...strings.metal_names import Ore
 | 
					from ...strings.monster_drop_names import ModLoot
 | 
				
			||||||
from ...strings.monster_drop_names import ModLoot, Loot
 | 
					 | 
				
			||||||
from ...strings.performance_names import Performance
 | 
					from ...strings.performance_names import Performance
 | 
				
			||||||
from ...strings.region_names import Region, SVERegion, LogicRegion
 | 
					from ...strings.region_names import Region, SVERegion
 | 
				
			||||||
from ...strings.season_names import Season
 | 
					from ...strings.season_names import Season
 | 
				
			||||||
from ...strings.seed_names import SVESeed
 | 
					from ...strings.seed_names import SVESeed
 | 
				
			||||||
from ...strings.skill_names import Skill
 | 
					from ...strings.skill_names import Skill
 | 
				
			||||||
| 
						 | 
					@ -81,7 +80,8 @@ register_mod_content_pack(SVEContentPack(
 | 
				
			||||||
        ModEdible.lightning_elixir: (ShopSource(money_price=12000, shop_region=SVERegion.galmoran_outpost),),
 | 
					        ModEdible.lightning_elixir: (ShopSource(money_price=12000, shop_region=SVERegion.galmoran_outpost),),
 | 
				
			||||||
        ModEdible.barbarian_elixir: (ShopSource(money_price=22000, shop_region=SVERegion.galmoran_outpost),),
 | 
					        ModEdible.barbarian_elixir: (ShopSource(money_price=22000, shop_region=SVERegion.galmoran_outpost),),
 | 
				
			||||||
        ModEdible.gravity_elixir: (ShopSource(money_price=4000, shop_region=SVERegion.galmoran_outpost),),
 | 
					        ModEdible.gravity_elixir: (ShopSource(money_price=4000, shop_region=SVERegion.galmoran_outpost),),
 | 
				
			||||||
        SVEMeal.grampleton_orange_chicken: (ShopSource(money_price=650, shop_region=Region.saloon, other_requirements=(RelationshipRequirement(ModNPC.sophia, 6),)),),
 | 
					        SVEMeal.grampleton_orange_chicken: (
 | 
				
			||||||
 | 
					        ShopSource(money_price=650, shop_region=Region.saloon, other_requirements=(RelationshipRequirement(ModNPC.sophia, 6),)),),
 | 
				
			||||||
        ModEdible.hero_elixir: (ShopSource(money_price=8000, shop_region=SVERegion.isaac_shop),),
 | 
					        ModEdible.hero_elixir: (ShopSource(money_price=8000, shop_region=SVERegion.isaac_shop),),
 | 
				
			||||||
        ModEdible.aegis_elixir: (ShopSource(money_price=28000, shop_region=SVERegion.galmoran_outpost),),
 | 
					        ModEdible.aegis_elixir: (ShopSource(money_price=28000, shop_region=SVERegion.galmoran_outpost),),
 | 
				
			||||||
        SVEBeverage.sports_drink: (ShopSource(money_price=750, shop_region=Region.hospital),),
 | 
					        SVEBeverage.sports_drink: (ShopSource(money_price=750, shop_region=Region.hospital),),
 | 
				
			||||||
| 
						 | 
					@ -92,7 +92,8 @@ register_mod_content_pack(SVEContentPack(
 | 
				
			||||||
            ForagingSource(regions=(SVERegion.forest_west,), seasons=(Season.summer, Season.fall)), ForagingSource(regions=(SVERegion.sprite_spring_cave,), )
 | 
					            ForagingSource(regions=(SVERegion.forest_west,), seasons=(Season.summer, Season.fall)), ForagingSource(regions=(SVERegion.sprite_spring_cave,), )
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
        Mushroom.purple: (
 | 
					        Mushroom.purple: (
 | 
				
			||||||
            ForagingSource(regions=(SVERegion.forest_west,), seasons=(Season.fall,)), ForagingSource(regions=(SVERegion.sprite_spring_cave, SVERegion.junimo_woods), )
 | 
					            ForagingSource(regions=(SVERegion.forest_west,), seasons=(Season.fall,)),
 | 
				
			||||||
 | 
					            ForagingSource(regions=(SVERegion.sprite_spring_cave, SVERegion.junimo_woods), )
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
        Mushroom.morel: (
 | 
					        Mushroom.morel: (
 | 
				
			||||||
            ForagingSource(regions=(SVERegion.forest_west,), seasons=(Season.fall,)), ForagingSource(regions=(SVERegion.sprite_spring_cave,), )
 | 
					            ForagingSource(regions=(SVERegion.forest_west,), seasons=(Season.fall,)), ForagingSource(regions=(SVERegion.sprite_spring_cave,), )
 | 
				
			||||||
| 
						 | 
					@ -117,7 +118,8 @@ register_mod_content_pack(SVEContentPack(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ModLoot.green_mushroom: (ForagingSource(regions=(SVERegion.highlands_pond,), seasons=Season.not_winter),),
 | 
					        ModLoot.green_mushroom: (ForagingSource(regions=(SVERegion.highlands_pond,), seasons=Season.not_winter),),
 | 
				
			||||||
        ModLoot.ornate_treasure_chest: (ForagingSource(regions=(SVERegion.highlands_outside,),
 | 
					        ModLoot.ornate_treasure_chest: (ForagingSource(regions=(SVERegion.highlands_outside,),
 | 
				
			||||||
                                                       other_requirements=(CombatRequirement(Performance.galaxy), ToolRequirement(Tool.axe, ToolMaterial.iron))),),
 | 
					                                                       other_requirements=(
 | 
				
			||||||
 | 
					                                                       CombatRequirement(Performance.galaxy), ToolRequirement(Tool.axe, ToolMaterial.iron))),),
 | 
				
			||||||
        ModLoot.swirl_stone: (ForagingSource(regions=(SVERegion.crimson_badlands,), other_requirements=(CombatRequirement(Performance.galaxy),)),),
 | 
					        ModLoot.swirl_stone: (ForagingSource(regions=(SVERegion.crimson_badlands,), other_requirements=(CombatRequirement(Performance.galaxy),)),),
 | 
				
			||||||
        ModLoot.void_soul: (ForagingSource(regions=(SVERegion.crimson_badlands,), other_requirements=(CombatRequirement(Performance.good),)),),
 | 
					        ModLoot.void_soul: (ForagingSource(regions=(SVERegion.crimson_badlands,), other_requirements=(CombatRequirement(Performance.good),)),),
 | 
				
			||||||
        SVEForage.winter_star_rose: (ForagingSource(regions=(SVERegion.summit,), seasons=(Season.winter,)),),
 | 
					        SVEForage.winter_star_rose: (ForagingSource(regions=(SVERegion.summit,), seasons=(Season.winter,)),),
 | 
				
			||||||
| 
						 | 
					@ -137,7 +139,8 @@ register_mod_content_pack(SVEContentPack(
 | 
				
			||||||
        SVEForage.thistle: (ForagingSource(regions=(SVERegion.summit,)),),
 | 
					        SVEForage.thistle: (ForagingSource(regions=(SVERegion.summit,)),),
 | 
				
			||||||
        ModLoot.void_pebble: (ForagingSource(regions=(SVERegion.crimson_badlands,), other_requirements=(CombatRequirement(Performance.great),)),),
 | 
					        ModLoot.void_pebble: (ForagingSource(regions=(SVERegion.crimson_badlands,), other_requirements=(CombatRequirement(Performance.great),)),),
 | 
				
			||||||
        ModLoot.void_shard: (ForagingSource(regions=(SVERegion.crimson_badlands,),
 | 
					        ModLoot.void_shard: (ForagingSource(regions=(SVERegion.crimson_badlands,),
 | 
				
			||||||
                                            other_requirements=(CombatRequirement(Performance.galaxy), SkillRequirement(Skill.combat, 10), YearRequirement(3),)),),
 | 
					                                            other_requirements=(
 | 
				
			||||||
 | 
					                                            CombatRequirement(Performance.galaxy), SkillRequirement(Skill.combat, 10), YearRequirement(3),)),),
 | 
				
			||||||
        SVEWaterItem.dulse_seaweed: (ForagingSource(regions=(Region.beach,), other_requirements=(FishingRequirement(Region.beach),)),),
 | 
					        SVEWaterItem.dulse_seaweed: (ForagingSource(regions=(Region.beach,), other_requirements=(FishingRequirement(Region.beach),)),),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Fable Reef
 | 
					        # Fable Reef
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,6 @@ from ...data.game_item import GenericSource, ItemTag
 | 
				
			||||||
from ...data.harvest import HarvestCropSource
 | 
					from ...data.harvest import HarvestCropSource
 | 
				
			||||||
from ...strings.crop_names import Fruit
 | 
					from ...strings.crop_names import Fruit
 | 
				
			||||||
from ...strings.region_names import Region
 | 
					from ...strings.region_names import Region
 | 
				
			||||||
from ...strings.season_names import Season
 | 
					 | 
				
			||||||
from ...strings.seed_names import Seed
 | 
					from ...strings.seed_names import Seed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,7 +10,7 @@ from ..strings.craftable_names import Fishing, Craftable, Bomb, Consumable, Ligh
 | 
				
			||||||
from ..strings.crop_names import Fruit, Vegetable
 | 
					from ..strings.crop_names import Fruit, Vegetable
 | 
				
			||||||
from ..strings.currency_names import Currency
 | 
					from ..strings.currency_names import Currency
 | 
				
			||||||
from ..strings.fertilizer_names import Fertilizer, RetainingSoil, SpeedGro
 | 
					from ..strings.fertilizer_names import Fertilizer, RetainingSoil, SpeedGro
 | 
				
			||||||
from ..strings.fish_names import Fish, WaterItem, Trash, all_fish
 | 
					from ..strings.fish_names import Fish, WaterItem, Trash
 | 
				
			||||||
from ..strings.flower_names import Flower
 | 
					from ..strings.flower_names import Flower
 | 
				
			||||||
from ..strings.food_names import Beverage, Meal
 | 
					from ..strings.food_names import Beverage, Meal
 | 
				
			||||||
from ..strings.forageable_names import Forageable, Mushroom
 | 
					from ..strings.forageable_names import Forageable, Mushroom
 | 
				
			||||||
| 
						 | 
					@ -832,7 +832,7 @@ calico_items = [calico_egg.as_amount(200), calico_egg.as_amount(200), calico_egg
 | 
				
			||||||
                magic_rock_candy, mega_bomb.as_amount(10), mystery_box.as_amount(10), mixed_seeds.as_amount(50),
 | 
					                magic_rock_candy, mega_bomb.as_amount(10), mystery_box.as_amount(10), mixed_seeds.as_amount(50),
 | 
				
			||||||
                strawberry_seeds.as_amount(20),
 | 
					                strawberry_seeds.as_amount(20),
 | 
				
			||||||
                spicy_eel.as_amount(5), crab_cakes.as_amount(5), eggplant_parmesan.as_amount(5),
 | 
					                spicy_eel.as_amount(5), crab_cakes.as_amount(5), eggplant_parmesan.as_amount(5),
 | 
				
			||||||
                pumpkin_soup.as_amount(5), lucky_lunch.as_amount(5),]
 | 
					                pumpkin_soup.as_amount(5), lucky_lunch.as_amount(5)]
 | 
				
			||||||
calico_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.calico, calico_items, 2, 2)
 | 
					calico_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.calico, calico_items, 2, 2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
raccoon_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.raccoon, raccoon_foraging_items, 4, 4)
 | 
					raccoon_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.raccoon, raccoon_foraging_items, 4, 4)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ from ..strings.fertilizer_names import Fertilizer, RetainingSoil, SpeedGro
 | 
				
			||||||
from ..strings.fish_names import Fish, WaterItem, ModTrash, Trash
 | 
					from ..strings.fish_names import Fish, WaterItem, ModTrash, Trash
 | 
				
			||||||
from ..strings.flower_names import Flower
 | 
					from ..strings.flower_names import Flower
 | 
				
			||||||
from ..strings.food_names import Meal
 | 
					from ..strings.food_names import Meal
 | 
				
			||||||
from ..strings.forageable_names import Forageable, SVEForage, DistantLandsForageable, Mushroom
 | 
					from ..strings.forageable_names import Forageable, DistantLandsForageable, Mushroom
 | 
				
			||||||
from ..strings.gift_names import Gift
 | 
					from ..strings.gift_names import Gift
 | 
				
			||||||
from ..strings.ingredient_names import Ingredient
 | 
					from ..strings.ingredient_names import Ingredient
 | 
				
			||||||
from ..strings.machine_names import Machine
 | 
					from ..strings.machine_names import Machine
 | 
				
			||||||
| 
						 | 
					@ -318,7 +318,8 @@ travel_charm = shop_recipe(ModCraftable.travel_core, Region.adventurer_guild, 25
 | 
				
			||||||
preservation_chamber = skill_recipe(ModMachine.preservation_chamber, ModSkill.archaeology, 1,
 | 
					preservation_chamber = skill_recipe(ModMachine.preservation_chamber, ModSkill.archaeology, 1,
 | 
				
			||||||
                                    {MetalBar.copper: 1, Material.wood: 15, ArtisanGood.oak_resin: 30},
 | 
					                                    {MetalBar.copper: 1, Material.wood: 15, ArtisanGood.oak_resin: 30},
 | 
				
			||||||
                                    ModNames.archaeology)
 | 
					                                    ModNames.archaeology)
 | 
				
			||||||
restoration_table = skill_recipe(ModMachine.restoration_table, ModSkill.archaeology, 1, {Material.wood: 15, MetalBar.copper: 1, MetalBar.iron: 1}, ModNames.archaeology)
 | 
					restoration_table = skill_recipe(ModMachine.restoration_table, ModSkill.archaeology, 1, {Material.wood: 15, MetalBar.copper: 1, MetalBar.iron: 1},
 | 
				
			||||||
 | 
					                                 ModNames.archaeology)
 | 
				
			||||||
preservation_chamber_h = skill_recipe(ModMachine.hardwood_preservation_chamber, ModSkill.archaeology, 6, {MetalBar.copper: 1, Material.hardwood: 15,
 | 
					preservation_chamber_h = skill_recipe(ModMachine.hardwood_preservation_chamber, ModSkill.archaeology, 6, {MetalBar.copper: 1, Material.hardwood: 15,
 | 
				
			||||||
                                                                                                          ArtisanGood.oak_resin: 30}, ModNames.archaeology)
 | 
					                                                                                                          ArtisanGood.oak_resin: 30}, ModNames.archaeology)
 | 
				
			||||||
grinder = skill_recipe(ModMachine.grinder, ModSkill.archaeology, 2, {Artifact.rusty_cog: 10, MetalBar.iron: 5, ArtisanGood.battery_pack: 1},
 | 
					grinder = skill_recipe(ModMachine.grinder, ModSkill.archaeology, 2, {Artifact.rusty_cog: 10, MetalBar.iron: 5, ArtisanGood.battery_pack: 1},
 | 
				
			||||||
| 
						 | 
					@ -330,12 +331,14 @@ glass_path = skill_recipe(ModFloor.glass_path, ModSkill.archaeology, 3, {Artifac
 | 
				
			||||||
glass_fence = skill_recipe(ModCraftable.glass_fence, ModSkill.archaeology, 7, {Artifact.glass_shards: 5}, ModNames.archaeology)
 | 
					glass_fence = skill_recipe(ModCraftable.glass_fence, ModSkill.archaeology, 7, {Artifact.glass_shards: 5}, ModNames.archaeology)
 | 
				
			||||||
bone_path = skill_recipe(ModFloor.bone_path, ModSkill.archaeology, 4, {Fossil.bone_fragment: 1}, ModNames.archaeology)
 | 
					bone_path = skill_recipe(ModFloor.bone_path, ModSkill.archaeology, 4, {Fossil.bone_fragment: 1}, ModNames.archaeology)
 | 
				
			||||||
rust_path = skill_recipe(ModFloor.rusty_path, ModSkill.archaeology, 2, {ModTrash.rusty_scrap: 2}, ModNames.archaeology)
 | 
					rust_path = skill_recipe(ModFloor.rusty_path, ModSkill.archaeology, 2, {ModTrash.rusty_scrap: 2}, ModNames.archaeology)
 | 
				
			||||||
rusty_brazier = skill_recipe(ModCraftable.rusty_brazier, ModSkill.archaeology, 3, {ModTrash.rusty_scrap: 10, Material.coal: 1, Material.fiber: 1}, ModNames.archaeology)
 | 
					rusty_brazier = skill_recipe(ModCraftable.rusty_brazier, ModSkill.archaeology, 3, {ModTrash.rusty_scrap: 10, Material.coal: 1, Material.fiber: 1},
 | 
				
			||||||
 | 
					                             ModNames.archaeology)
 | 
				
			||||||
bone_fence = skill_recipe(ModCraftable.bone_fence, ModSkill.archaeology, 8, {Fossil.bone_fragment: 2}, ModNames.archaeology)
 | 
					bone_fence = skill_recipe(ModCraftable.bone_fence, ModSkill.archaeology, 8, {Fossil.bone_fragment: 2}, ModNames.archaeology)
 | 
				
			||||||
water_shifter = skill_recipe(ModCraftable.water_shifter, ModSkill.archaeology, 4, {Material.wood: 40, MetalBar.copper: 4}, ModNames.archaeology)
 | 
					water_shifter = skill_recipe(ModCraftable.water_shifter, ModSkill.archaeology, 4, {Material.wood: 40, MetalBar.copper: 4}, ModNames.archaeology)
 | 
				
			||||||
wooden_display = skill_recipe(ModCraftable.wooden_display, ModSkill.archaeology, 1, {Material.wood: 25}, ModNames.archaeology)
 | 
					wooden_display = skill_recipe(ModCraftable.wooden_display, ModSkill.archaeology, 1, {Material.wood: 25}, ModNames.archaeology)
 | 
				
			||||||
hardwood_display = skill_recipe(ModCraftable.hardwood_display, ModSkill.archaeology, 7, {Material.hardwood: 10}, ModNames.archaeology)
 | 
					hardwood_display = skill_recipe(ModCraftable.hardwood_display, ModSkill.archaeology, 7, {Material.hardwood: 10}, ModNames.archaeology)
 | 
				
			||||||
lucky_ring = skill_recipe(Ring.lucky_ring, ModSkill.archaeology, 8, {Artifact.elvish_jewelry: 1, AnimalProduct.rabbit_foot: 5, Mineral.tigerseye: 1}, ModNames.archaeology)
 | 
					lucky_ring = skill_recipe(Ring.lucky_ring, ModSkill.archaeology, 8, {Artifact.elvish_jewelry: 1, AnimalProduct.rabbit_foot: 5, Mineral.tigerseye: 1},
 | 
				
			||||||
 | 
					                          ModNames.archaeology)
 | 
				
			||||||
volcano_totem = skill_recipe(ModConsumable.volcano_totem, ModSkill.archaeology, 9, {Material.cinder_shard: 5, Artifact.rare_disc: 1, Artifact.dwarf_gadget: 1},
 | 
					volcano_totem = skill_recipe(ModConsumable.volcano_totem, ModSkill.archaeology, 9, {Material.cinder_shard: 5, Artifact.rare_disc: 1, Artifact.dwarf_gadget: 1},
 | 
				
			||||||
                             ModNames.archaeology)
 | 
					                             ModNames.archaeology)
 | 
				
			||||||
haste_elixir = shop_recipe(ModEdible.haste_elixir, SVERegion.alesia_shop, 35000, {Loot.void_essence: 35, ModLoot.void_soul: 5, Ingredient.sugar: 1,
 | 
					haste_elixir = shop_recipe(ModEdible.haste_elixir, SVERegion.alesia_shop, 35000, {Loot.void_essence: 35, ModLoot.void_soul: 5, Ingredient.sugar: 1,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,15 +1,16 @@
 | 
				
			||||||
from typing import Dict, List, Optional
 | 
					from typing import Dict, List, Optional
 | 
				
			||||||
from ..mods.mod_data import ModNames
 | 
					
 | 
				
			||||||
from .recipe_source import RecipeSource, FriendshipSource, SkillSource, QueenOfSauceSource, ShopSource, StarterSource, ShopTradeSource, ShopFriendshipSource
 | 
					from .recipe_source import RecipeSource, FriendshipSource, SkillSource, QueenOfSauceSource, ShopSource, StarterSource, ShopTradeSource, ShopFriendshipSource
 | 
				
			||||||
 | 
					from ..mods.mod_data import ModNames
 | 
				
			||||||
from ..strings.animal_product_names import AnimalProduct
 | 
					from ..strings.animal_product_names import AnimalProduct
 | 
				
			||||||
from ..strings.artisan_good_names import ArtisanGood
 | 
					from ..strings.artisan_good_names import ArtisanGood
 | 
				
			||||||
from ..strings.craftable_names import ModEdible, Edible
 | 
					from ..strings.craftable_names import ModEdible, Edible
 | 
				
			||||||
from ..strings.crop_names import Fruit, Vegetable, SVEFruit, DistantLandsCrop
 | 
					from ..strings.crop_names import Fruit, Vegetable, SVEFruit, DistantLandsCrop
 | 
				
			||||||
from ..strings.fish_names import Fish, SVEFish, WaterItem, DistantLandsFish, SVEWaterItem
 | 
					from ..strings.fish_names import Fish, SVEFish, WaterItem, DistantLandsFish, SVEWaterItem
 | 
				
			||||||
from ..strings.flower_names import Flower
 | 
					from ..strings.flower_names import Flower
 | 
				
			||||||
from ..strings.forageable_names import Forageable, SVEForage, DistantLandsForageable, Mushroom
 | 
					 | 
				
			||||||
from ..strings.ingredient_names import Ingredient
 | 
					 | 
				
			||||||
from ..strings.food_names import Meal, SVEMeal, Beverage, DistantLandsMeal, BoardingHouseMeal, ArchaeologyMeal, TrashyMeal
 | 
					from ..strings.food_names import Meal, SVEMeal, Beverage, DistantLandsMeal, BoardingHouseMeal, ArchaeologyMeal, TrashyMeal
 | 
				
			||||||
 | 
					from ..strings.forageable_names import Forageable, SVEForage, Mushroom
 | 
				
			||||||
 | 
					from ..strings.ingredient_names import Ingredient
 | 
				
			||||||
from ..strings.material_names import Material
 | 
					from ..strings.material_names import Material
 | 
				
			||||||
from ..strings.metal_names import Fossil, Artifact
 | 
					from ..strings.metal_names import Fossil, Artifact
 | 
				
			||||||
from ..strings.monster_drop_names import Loot
 | 
					from ..strings.monster_drop_names import Loot
 | 
				
			||||||
| 
						 | 
					@ -45,7 +46,8 @@ def friendship_recipe(name: str, friend: str, hearts: int, ingredients: Dict[str
 | 
				
			||||||
    return create_recipe(name, ingredients, source, mod_name)
 | 
					    return create_recipe(name, ingredients, source, mod_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def friendship_and_shop_recipe(name: str, friend: str, hearts: int, region: str, price: int, ingredients: Dict[str, int], mod_name: Optional[str] = None) -> CookingRecipe:
 | 
					def friendship_and_shop_recipe(name: str, friend: str, hearts: int, region: str, price: int, ingredients: Dict[str, int],
 | 
				
			||||||
 | 
					                               mod_name: Optional[str] = None) -> CookingRecipe:
 | 
				
			||||||
    source = ShopFriendshipSource(friend, hearts, region, price)
 | 
					    source = ShopFriendshipSource(friend, hearts, region, price)
 | 
				
			||||||
    return create_recipe(name, ingredients, source, mod_name)
 | 
					    return create_recipe(name, ingredients, source, mod_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -85,7 +87,8 @@ algae_soup = friendship_recipe(Meal.algae_soup, NPC.clint, 3, {WaterItem.green_a
 | 
				
			||||||
artichoke_dip = queen_of_sauce_recipe(Meal.artichoke_dip, 1, Season.fall, 28, {Vegetable.artichoke: 1, AnimalProduct.cow_milk: 1})
 | 
					artichoke_dip = queen_of_sauce_recipe(Meal.artichoke_dip, 1, Season.fall, 28, {Vegetable.artichoke: 1, AnimalProduct.cow_milk: 1})
 | 
				
			||||||
autumn_bounty = friendship_recipe(Meal.autumn_bounty, NPC.demetrius, 7, {Vegetable.yam: 1, Vegetable.pumpkin: 1})
 | 
					autumn_bounty = friendship_recipe(Meal.autumn_bounty, NPC.demetrius, 7, {Vegetable.yam: 1, Vegetable.pumpkin: 1})
 | 
				
			||||||
baked_fish = queen_of_sauce_recipe(Meal.baked_fish, 1, Season.summer, 7, {Fish.sunfish: 1, Fish.bream: 1, Ingredient.wheat_flour: 1})
 | 
					baked_fish = queen_of_sauce_recipe(Meal.baked_fish, 1, Season.summer, 7, {Fish.sunfish: 1, Fish.bream: 1, Ingredient.wheat_flour: 1})
 | 
				
			||||||
banana_pudding = shop_trade_recipe(Meal.banana_pudding, Region.island_trader, Fossil.bone_fragment, 30, {Fruit.banana: 1, AnimalProduct.cow_milk: 1, Ingredient.sugar: 1})
 | 
					banana_pudding = shop_trade_recipe(Meal.banana_pudding, Region.island_trader, Fossil.bone_fragment, 30,
 | 
				
			||||||
 | 
					                                   {Fruit.banana: 1, AnimalProduct.cow_milk: 1, Ingredient.sugar: 1})
 | 
				
			||||||
bean_hotpot = friendship_recipe(Meal.bean_hotpot, NPC.clint, 7, {Vegetable.green_bean: 2})
 | 
					bean_hotpot = friendship_recipe(Meal.bean_hotpot, NPC.clint, 7, {Vegetable.green_bean: 2})
 | 
				
			||||||
blackberry_cobbler_ingredients = {Forageable.blackberry: 2, Ingredient.sugar: 1, Ingredient.wheat_flour: 1}
 | 
					blackberry_cobbler_ingredients = {Forageable.blackberry: 2, Ingredient.sugar: 1, Ingredient.wheat_flour: 1}
 | 
				
			||||||
blackberry_cobbler_qos = queen_of_sauce_recipe(Meal.blackberry_cobbler, 2, Season.fall, 14, blackberry_cobbler_ingredients)
 | 
					blackberry_cobbler_qos = queen_of_sauce_recipe(Meal.blackberry_cobbler, 2, Season.fall, 14, blackberry_cobbler_ingredients)
 | 
				
			||||||
| 
						 | 
					@ -181,21 +184,23 @@ vegetable_medley = friendship_recipe(Meal.vegetable_medley, NPC.caroline, 7, {Ve
 | 
				
			||||||
magic_elixir = shop_recipe(ModEdible.magic_elixir, Region.adventurer_guild, 3000, {Edible.life_elixir: 1, Mushroom.purple: 1}, ModNames.magic)
 | 
					magic_elixir = shop_recipe(ModEdible.magic_elixir, Region.adventurer_guild, 3000, {Edible.life_elixir: 1, Mushroom.purple: 1}, ModNames.magic)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
baked_berry_oatmeal = shop_recipe(SVEMeal.baked_berry_oatmeal, SVERegion.bear_shop, 0, {Forageable.salmonberry: 15, Forageable.blackberry: 15,
 | 
					baked_berry_oatmeal = shop_recipe(SVEMeal.baked_berry_oatmeal, SVERegion.bear_shop, 0, {Forageable.salmonberry: 15, Forageable.blackberry: 15,
 | 
				
			||||||
                                                                                            Ingredient.sugar: 1, Ingredient.wheat_flour: 2}, ModNames.sve)
 | 
					                                                                                        Ingredient.sugar: 1, Ingredient.wheat_flour: 2}, ModNames.sve)
 | 
				
			||||||
big_bark_burger = friendship_and_shop_recipe(SVEMeal.big_bark_burger, NPC.gus, 5, Region.saloon, 5500,
 | 
					big_bark_burger = friendship_and_shop_recipe(SVEMeal.big_bark_burger, NPC.gus, 5, Region.saloon, 5500,
 | 
				
			||||||
                                             {SVEFish.puppyfish: 1, Meal.bread: 1, Ingredient.oil: 1}, ModNames.sve)
 | 
					                                             {SVEFish.puppyfish: 1, Meal.bread: 1, Ingredient.oil: 1}, ModNames.sve)
 | 
				
			||||||
flower_cookie = shop_recipe(SVEMeal.flower_cookie, SVERegion.bear_shop, 0, {SVEForage.ferngill_primrose: 1, SVEForage.goldenrod: 1,
 | 
					flower_cookie = shop_recipe(SVEMeal.flower_cookie, SVERegion.bear_shop, 0, {SVEForage.ferngill_primrose: 1, SVEForage.goldenrod: 1,
 | 
				
			||||||
                                                                               SVEForage.winter_star_rose: 1, Ingredient.wheat_flour: 1, Ingredient.sugar: 1,
 | 
					                                                                            SVEForage.winter_star_rose: 1, Ingredient.wheat_flour: 1, Ingredient.sugar: 1,
 | 
				
			||||||
                                                                               AnimalProduct.large_egg: 1}, ModNames.sve)
 | 
					                                                                            AnimalProduct.large_egg: 1}, ModNames.sve)
 | 
				
			||||||
frog_legs = shop_recipe(SVEMeal.frog_legs, Region.adventurer_guild, 2000, {SVEFish.frog: 1, Ingredient.oil: 1, Ingredient.wheat_flour: 1}, ModNames.sve)
 | 
					frog_legs = shop_recipe(SVEMeal.frog_legs, Region.adventurer_guild, 2000, {SVEFish.frog: 1, Ingredient.oil: 1, Ingredient.wheat_flour: 1}, ModNames.sve)
 | 
				
			||||||
glazed_butterfish = friendship_and_shop_recipe(SVEMeal.glazed_butterfish, NPC.gus, 10, Region.saloon, 4000,
 | 
					glazed_butterfish = friendship_and_shop_recipe(SVEMeal.glazed_butterfish, NPC.gus, 10, Region.saloon, 4000,
 | 
				
			||||||
                                               {SVEFish.butterfish: 1, Ingredient.wheat_flour: 1, Ingredient.oil: 1}, ModNames.sve)
 | 
					                                               {SVEFish.butterfish: 1, Ingredient.wheat_flour: 1, Ingredient.oil: 1}, ModNames.sve)
 | 
				
			||||||
mixed_berry_pie = shop_recipe(SVEMeal.mixed_berry_pie, Region.saloon, 3500, {Fruit.strawberry: 6, SVEFruit.salal_berry: 6, Forageable.blackberry: 6,
 | 
					mixed_berry_pie = shop_recipe(SVEMeal.mixed_berry_pie, Region.saloon, 3500, {Fruit.strawberry: 6, SVEFruit.salal_berry: 6, Forageable.blackberry: 6,
 | 
				
			||||||
                                                                             SVEForage.bearberry: 6, Ingredient.sugar: 1, Ingredient.wheat_flour: 1},
 | 
					                                                                             SVEForage.bearberry: 6, Ingredient.sugar: 1, Ingredient.wheat_flour: 1},
 | 
				
			||||||
                              ModNames.sve)
 | 
					                              ModNames.sve)
 | 
				
			||||||
mushroom_berry_rice = friendship_and_shop_recipe(SVEMeal.mushroom_berry_rice, ModNPC.marlon, 6, Region.adventurer_guild, 1500, {SVEForage.poison_mushroom: 3, SVEForage.red_baneberry: 10,
 | 
					mushroom_berry_rice = friendship_and_shop_recipe(SVEMeal.mushroom_berry_rice, ModNPC.marlon, 6, Region.adventurer_guild, 1500,
 | 
				
			||||||
                                                                                               Ingredient.rice: 1, Ingredient.sugar: 2}, ModNames.sve)
 | 
					                                                 {SVEForage.poison_mushroom: 3, SVEForage.red_baneberry: 10, Ingredient.rice: 1, Ingredient.sugar: 2},
 | 
				
			||||||
seaweed_salad = shop_recipe(SVEMeal.seaweed_salad, Region.fish_shop, 1250, {SVEWaterItem.dulse_seaweed: 2, WaterItem.seaweed: 2, Ingredient.oil: 1}, ModNames.sve)
 | 
					                                                 ModNames.sve)
 | 
				
			||||||
 | 
					seaweed_salad = shop_recipe(SVEMeal.seaweed_salad, Region.fish_shop, 1250, {SVEWaterItem.dulse_seaweed: 2, WaterItem.seaweed: 2, Ingredient.oil: 1},
 | 
				
			||||||
 | 
					                            ModNames.sve)
 | 
				
			||||||
void_delight = friendship_and_shop_recipe(SVEMeal.void_delight, NPC.krobus, 10, Region.sewer, 5000,
 | 
					void_delight = friendship_and_shop_recipe(SVEMeal.void_delight, NPC.krobus, 10, Region.sewer, 5000,
 | 
				
			||||||
                                          {SVEFish.void_eel: 1, Loot.void_essence: 50, Loot.solar_essence: 20}, ModNames.sve)
 | 
					                                          {SVEFish.void_eel: 1, Loot.void_essence: 50, Loot.solar_essence: 20}, ModNames.sve)
 | 
				
			||||||
void_salmon_sushi = friendship_and_shop_recipe(SVEMeal.void_salmon_sushi, NPC.krobus, 10, Region.sewer, 5000,
 | 
					void_salmon_sushi = friendship_and_shop_recipe(SVEMeal.void_salmon_sushi, NPC.krobus, 10, Region.sewer, 5000,
 | 
				
			||||||
| 
						 | 
					@ -205,17 +210,22 @@ mushroom_kebab = friendship_recipe(DistantLandsMeal.mushroom_kebab, ModNPC.gobli
 | 
				
			||||||
                                                                                       Mushroom.red: 1, Material.wood: 1}, ModNames.distant_lands)
 | 
					                                                                                       Mushroom.red: 1, Material.wood: 1}, ModNames.distant_lands)
 | 
				
			||||||
void_mint_tea = friendship_recipe(DistantLandsMeal.void_mint_tea, ModNPC.goblin, 4, {DistantLandsCrop.void_mint: 1}, ModNames.distant_lands)
 | 
					void_mint_tea = friendship_recipe(DistantLandsMeal.void_mint_tea, ModNPC.goblin, 4, {DistantLandsCrop.void_mint: 1}, ModNames.distant_lands)
 | 
				
			||||||
crayfish_soup = friendship_recipe(DistantLandsMeal.crayfish_soup, ModNPC.goblin, 6, {Forageable.cave_carrot: 1, Fish.crayfish: 1,
 | 
					crayfish_soup = friendship_recipe(DistantLandsMeal.crayfish_soup, ModNPC.goblin, 6, {Forageable.cave_carrot: 1, Fish.crayfish: 1,
 | 
				
			||||||
                                                                                     DistantLandsFish.purple_algae: 1, WaterItem.white_algae: 1}, ModNames.distant_lands)
 | 
					                                                                                     DistantLandsFish.purple_algae: 1, WaterItem.white_algae: 1},
 | 
				
			||||||
 | 
					                                  ModNames.distant_lands)
 | 
				
			||||||
pemmican = friendship_recipe(DistantLandsMeal.pemmican, ModNPC.goblin, 8, {Loot.bug_meat: 1, Fish.any: 1, Forageable.salmonberry: 3,
 | 
					pemmican = friendship_recipe(DistantLandsMeal.pemmican, ModNPC.goblin, 8, {Loot.bug_meat: 1, Fish.any: 1, Forageable.salmonberry: 3,
 | 
				
			||||||
                                                                           Material.stone: 2}, ModNames.distant_lands)
 | 
					                                                                           Material.stone: 2}, ModNames.distant_lands)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
special_pumpkin_soup = friendship_recipe(BoardingHouseMeal.special_pumpkin_soup, ModNPC.joel, 6, {Vegetable.pumpkin: 2, AnimalProduct.large_goat_milk: 1,
 | 
					special_pumpkin_soup = friendship_recipe(BoardingHouseMeal.special_pumpkin_soup, ModNPC.joel, 6, {Vegetable.pumpkin: 2, AnimalProduct.large_goat_milk: 1,
 | 
				
			||||||
                                                                                                  Vegetable.garlic: 1}, ModNames.boarding_house)
 | 
					                                                                                                  Vegetable.garlic: 1}, ModNames.boarding_house)
 | 
				
			||||||
diggers_delight = skill_recipe(ArchaeologyMeal.diggers_delight, ModSkill.archaeology, 3, {Forageable.cave_carrot: 2, Ingredient.sugar: 1, AnimalProduct.milk: 1}, ModNames.archaeology)
 | 
					diggers_delight = skill_recipe(ArchaeologyMeal.diggers_delight, ModSkill.archaeology, 3,
 | 
				
			||||||
rocky_root = skill_recipe(ArchaeologyMeal.rocky_root, ModSkill.archaeology, 7, {Forageable.cave_carrot: 3, Seed.coffee: 1, Material.stone: 1}, ModNames.archaeology)
 | 
					                               {Forageable.cave_carrot: 2, Ingredient.sugar: 1, AnimalProduct.milk: 1}, ModNames.archaeology)
 | 
				
			||||||
ancient_jello = skill_recipe(ArchaeologyMeal.ancient_jello, ModSkill.archaeology, 9, {WaterItem.cave_jelly: 6, Ingredient.sugar: 5, AnimalProduct.egg: 1, AnimalProduct.milk: 1, Artifact.chipped_amphora: 1}, ModNames.archaeology)
 | 
					rocky_root = skill_recipe(ArchaeologyMeal.rocky_root, ModSkill.archaeology, 7, {Forageable.cave_carrot: 3, Seed.coffee: 1, Material.stone: 1},
 | 
				
			||||||
 | 
					                          ModNames.archaeology)
 | 
				
			||||||
 | 
					ancient_jello = skill_recipe(ArchaeologyMeal.ancient_jello, ModSkill.archaeology, 9,
 | 
				
			||||||
 | 
					                             {WaterItem.cave_jelly: 6, Ingredient.sugar: 5, AnimalProduct.egg: 1, AnimalProduct.milk: 1, Artifact.chipped_amphora: 1},
 | 
				
			||||||
 | 
					                             ModNames.archaeology)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
grilled_cheese = skill_recipe(TrashyMeal.grilled_cheese, ModSkill.binning, 1, {Meal.bread: 1, ArtisanGood.cheese: 1}, ModNames.binning_skill)
 | 
					grilled_cheese = skill_recipe(TrashyMeal.grilled_cheese, ModSkill.binning, 1, {Meal.bread: 1, ArtisanGood.cheese: 1}, ModNames.binning_skill)
 | 
				
			||||||
fish_casserole = skill_recipe(TrashyMeal.fish_casserole, ModSkill.binning, 8, {Fish.any: 1, AnimalProduct.milk: 1, Vegetable.carrot: 1}, ModNames.binning_skill)
 | 
					fish_casserole = skill_recipe(TrashyMeal.fish_casserole, ModSkill.binning, 8, {Fish.any: 1, AnimalProduct.milk: 1, Vegetable.carrot: 1}, ModNames.binning_skill)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
all_cooking_recipes_by_name = {recipe.meal: recipe for recipe in all_cooking_recipes}
 | 
					all_cooking_recipes_by_name = {recipe.meal: recipe for recipe in all_cooking_recipes}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -106,7 +106,7 @@ class MasterySource(RecipeSource):
 | 
				
			||||||
        self.skill = skill
 | 
					        self.skill = skill
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __repr__(self):
 | 
					    def __repr__(self):
 | 
				
			||||||
        return f"MasterySource at level {self.level} {self.skill}"
 | 
					        return f"MasterySource {self.skill}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ShopSource(RecipeSource):
 | 
					class ShopSource(RecipeSource):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
 | 
					import typing
 | 
				
			||||||
from typing import Union
 | 
					from typing import Union
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from .base_logic import BaseLogicMixin, BaseLogic
 | 
					from .base_logic import BaseLogicMixin, BaseLogic
 | 
				
			||||||
from .cooking_logic import CookingLogicMixin
 | 
					 | 
				
			||||||
from .mine_logic import MineLogicMixin
 | 
					from .mine_logic import MineLogicMixin
 | 
				
			||||||
from .received_logic import ReceivedLogicMixin
 | 
					from .received_logic import ReceivedLogicMixin
 | 
				
			||||||
from .region_logic import RegionLogicMixin
 | 
					from .region_logic import RegionLogicMixin
 | 
				
			||||||
| 
						 | 
					@ -13,6 +13,11 @@ from ..strings.region_names import Region
 | 
				
			||||||
from ..strings.skill_names import Skill, ModSkill
 | 
					from ..strings.skill_names import Skill, ModSkill
 | 
				
			||||||
from ..strings.tool_names import ToolMaterial, Tool
 | 
					from ..strings.tool_names import ToolMaterial, Tool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if typing.TYPE_CHECKING:
 | 
				
			||||||
 | 
					    from ..mods.logic.mod_logic import ModLogicMixin
 | 
				
			||||||
 | 
					else:
 | 
				
			||||||
 | 
					    ModLogicMixin = object
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class AbilityLogicMixin(BaseLogicMixin):
 | 
					class AbilityLogicMixin(BaseLogicMixin):
 | 
				
			||||||
    def __init__(self, *args, **kwargs):
 | 
					    def __init__(self, *args, **kwargs):
 | 
				
			||||||
| 
						 | 
					@ -20,7 +25,8 @@ class AbilityLogicMixin(BaseLogicMixin):
 | 
				
			||||||
        self.ability = AbilityLogic(*args, **kwargs)
 | 
					        self.ability = AbilityLogic(*args, **kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class AbilityLogic(BaseLogic[Union[AbilityLogicMixin, RegionLogicMixin, ReceivedLogicMixin, ToolLogicMixin, SkillLogicMixin, MineLogicMixin, MagicLogicMixin]]):
 | 
					class AbilityLogic(BaseLogic[Union[AbilityLogicMixin, RegionLogicMixin, ReceivedLogicMixin, ToolLogicMixin, SkillLogicMixin, MineLogicMixin, MagicLogicMixin,
 | 
				
			||||||
 | 
					ModLogicMixin]]):
 | 
				
			||||||
    def can_mine_perfectly(self) -> StardewRule:
 | 
					    def can_mine_perfectly(self) -> StardewRule:
 | 
				
			||||||
        return self.logic.mine.can_progress_in_the_mines_from_floor(160)
 | 
					        return self.logic.mine.can_progress_in_the_mines_from_floor(160)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,6 @@ from .has_logic import HasLogicMixin
 | 
				
			||||||
from .received_logic import ReceivedLogicMixin
 | 
					from .received_logic import ReceivedLogicMixin
 | 
				
			||||||
from .region_logic import RegionLogicMixin
 | 
					from .region_logic import RegionLogicMixin
 | 
				
			||||||
from .tool_logic import ToolLogicMixin
 | 
					from .tool_logic import ToolLogicMixin
 | 
				
			||||||
from ..options import ToolProgression
 | 
					 | 
				
			||||||
from ..stardew_rule import StardewRule, True_
 | 
					from ..stardew_rule import StardewRule, True_
 | 
				
			||||||
from ..strings.generic_names import Generic
 | 
					from ..strings.generic_names import Generic
 | 
				
			||||||
from ..strings.geode_names import Geode
 | 
					from ..strings.geode_names import Geode
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					import typing
 | 
				
			||||||
from functools import cached_property
 | 
					from functools import cached_property
 | 
				
			||||||
from typing import Union, Tuple
 | 
					from typing import Union, Tuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,6 +25,11 @@ from ..strings.skill_names import Skill, all_mod_skills, all_vanilla_skills
 | 
				
			||||||
from ..strings.tool_names import ToolMaterial, Tool
 | 
					from ..strings.tool_names import ToolMaterial, Tool
 | 
				
			||||||
from ..strings.wallet_item_names import Wallet
 | 
					from ..strings.wallet_item_names import Wallet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if typing.TYPE_CHECKING:
 | 
				
			||||||
 | 
					    from ..mods.logic.mod_logic import ModLogicMixin
 | 
				
			||||||
 | 
					else:
 | 
				
			||||||
 | 
					    ModLogicMixin = object
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fishing_regions = (Region.beach, Region.town, Region.forest, Region.mountain, Region.island_south, Region.island_west)
 | 
					fishing_regions = (Region.beach, Region.town, Region.forest, Region.mountain, Region.island_south, Region.island_west)
 | 
				
			||||||
vanilla_skill_items = ("Farming Level", "Mining Level", "Foraging Level", "Fishing Level", "Combat Level")
 | 
					vanilla_skill_items = ("Farming Level", "Mining Level", "Foraging Level", "Fishing Level", "Combat Level")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,7 +41,7 @@ class SkillLogicMixin(BaseLogicMixin):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class SkillLogic(BaseLogic[Union[HasLogicMixin, ReceivedLogicMixin, RegionLogicMixin, SeasonLogicMixin, TimeLogicMixin, ToolLogicMixin, SkillLogicMixin,
 | 
					class SkillLogic(BaseLogic[Union[HasLogicMixin, ReceivedLogicMixin, RegionLogicMixin, SeasonLogicMixin, TimeLogicMixin, ToolLogicMixin, SkillLogicMixin,
 | 
				
			||||||
CombatLogicMixin, MagicLogicMixin, HarvestingLogicMixin]]):
 | 
					CombatLogicMixin, MagicLogicMixin, HarvestingLogicMixin, ModLogicMixin]]):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Should be cached
 | 
					    # Should be cached
 | 
				
			||||||
    def can_earn_level(self, skill: str, level: int) -> StardewRule:
 | 
					    def can_earn_level(self, skill: str, level: int) -> StardewRule:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,6 @@ from typing import Dict, Union
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ..mod_data import ModNames
 | 
					from ..mod_data import ModNames
 | 
				
			||||||
from ... import options
 | 
					from ... import options
 | 
				
			||||||
from ...data.craftable_data import all_crafting_recipes_by_name
 | 
					 | 
				
			||||||
from ...logic.base_logic import BaseLogicMixin, BaseLogic
 | 
					from ...logic.base_logic import BaseLogicMixin, BaseLogic
 | 
				
			||||||
from ...logic.combat_logic import CombatLogicMixin
 | 
					from ...logic.combat_logic import CombatLogicMixin
 | 
				
			||||||
from ...logic.cooking_logic import CookingLogicMixin
 | 
					from ...logic.cooking_logic import CookingLogicMixin
 | 
				
			||||||
| 
						 | 
					@ -20,11 +19,9 @@ from ...logic.season_logic import SeasonLogicMixin
 | 
				
			||||||
from ...logic.skill_logic import SkillLogicMixin
 | 
					from ...logic.skill_logic import SkillLogicMixin
 | 
				
			||||||
from ...logic.time_logic import TimeLogicMixin
 | 
					from ...logic.time_logic import TimeLogicMixin
 | 
				
			||||||
from ...logic.tool_logic import ToolLogicMixin
 | 
					from ...logic.tool_logic import ToolLogicMixin
 | 
				
			||||||
from ...options import Cropsanity
 | 
					from ...stardew_rule import StardewRule
 | 
				
			||||||
from ...stardew_rule import StardewRule, True_
 | 
					 | 
				
			||||||
from ...strings.artisan_good_names import ModArtisanGood
 | 
					from ...strings.artisan_good_names import ModArtisanGood
 | 
				
			||||||
from ...strings.craftable_names import ModCraftable, ModMachine
 | 
					from ...strings.craftable_names import ModCraftable
 | 
				
			||||||
from ...strings.fish_names import ModTrash
 | 
					 | 
				
			||||||
from ...strings.ingredient_names import Ingredient
 | 
					from ...strings.ingredient_names import Ingredient
 | 
				
			||||||
from ...strings.material_names import Material
 | 
					from ...strings.material_names import Material
 | 
				
			||||||
from ...strings.metal_names import all_fossils, all_artifacts, Ore, ModFossil
 | 
					from ...strings.metal_names import all_fossils, all_artifacts, Ore, ModFossil
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,8 +3,8 @@ from typing import Dict, Union
 | 
				
			||||||
from ..mod_data import ModNames
 | 
					from ..mod_data import ModNames
 | 
				
			||||||
from ...logic.base_logic import BaseLogic, BaseLogicMixin
 | 
					from ...logic.base_logic import BaseLogic, BaseLogicMixin
 | 
				
			||||||
from ...logic.has_logic import HasLogicMixin
 | 
					from ...logic.has_logic import HasLogicMixin
 | 
				
			||||||
from ...logic.quest_logic import QuestLogicMixin
 | 
					 | 
				
			||||||
from ...logic.monster_logic import MonsterLogicMixin
 | 
					from ...logic.monster_logic import MonsterLogicMixin
 | 
				
			||||||
 | 
					from ...logic.quest_logic import QuestLogicMixin
 | 
				
			||||||
from ...logic.received_logic import ReceivedLogicMixin
 | 
					from ...logic.received_logic import ReceivedLogicMixin
 | 
				
			||||||
from ...logic.region_logic import RegionLogicMixin
 | 
					from ...logic.region_logic import RegionLogicMixin
 | 
				
			||||||
from ...logic.relationship_logic import RelationshipLogicMixin
 | 
					from ...logic.relationship_logic import RelationshipLogicMixin
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,6 @@ from ...strings.artisan_good_names import ArtisanGood
 | 
				
			||||||
from ...strings.crop_names import Fruit, SVEFruit, SVEVegetable, Vegetable
 | 
					from ...strings.crop_names import Fruit, SVEFruit, SVEVegetable, Vegetable
 | 
				
			||||||
from ...strings.fertilizer_names import Fertilizer
 | 
					from ...strings.fertilizer_names import Fertilizer
 | 
				
			||||||
from ...strings.food_names import Meal, Beverage
 | 
					from ...strings.food_names import Meal, Beverage
 | 
				
			||||||
from ...strings.forageable_names import SVEForage
 | 
					 | 
				
			||||||
from ...strings.material_names import Material
 | 
					from ...strings.material_names import Material
 | 
				
			||||||
from ...strings.metal_names import Ore, MetalBar
 | 
					from ...strings.metal_names import Ore, MetalBar
 | 
				
			||||||
from ...strings.monster_drop_names import Loot, ModLoot
 | 
					from ...strings.monster_drop_names import Loot, ModLoot
 | 
				
			||||||
| 
						 | 
					@ -35,7 +34,7 @@ class ModQuestLogicMixin(BaseLogicMixin):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ModQuestLogic(BaseLogic[Union[HasLogicMixin, QuestLogicMixin, ReceivedLogicMixin, RegionLogicMixin,
 | 
					class ModQuestLogic(BaseLogic[Union[HasLogicMixin, QuestLogicMixin, ReceivedLogicMixin, RegionLogicMixin,
 | 
				
			||||||
                                    TimeLogicMixin, SeasonLogicMixin, RelationshipLogicMixin, MonsterLogicMixin]]):
 | 
					TimeLogicMixin, SeasonLogicMixin, RelationshipLogicMixin, MonsterLogicMixin]]):
 | 
				
			||||||
    def get_modded_quest_rules(self) -> Dict[str, StardewRule]:
 | 
					    def get_modded_quest_rules(self) -> Dict[str, StardewRule]:
 | 
				
			||||||
        quests = dict()
 | 
					        quests = dict()
 | 
				
			||||||
        quests.update(self._get_juna_quest_rules())
 | 
					        quests.update(self._get_juna_quest_rules())
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,7 +7,7 @@ from .mods.mod_regions import ModDataList, vanilla_connections_to_remove_by_mod
 | 
				
			||||||
from .options import EntranceRandomization, ExcludeGingerIsland, StardewValleyOptions
 | 
					from .options import EntranceRandomization, ExcludeGingerIsland, StardewValleyOptions
 | 
				
			||||||
from .region_classes import RegionData, ConnectionData, RandomizationFlag, ModificationFlag
 | 
					from .region_classes import RegionData, ConnectionData, RandomizationFlag, ModificationFlag
 | 
				
			||||||
from .strings.entrance_names import Entrance, LogicEntrance
 | 
					from .strings.entrance_names import Entrance, LogicEntrance
 | 
				
			||||||
from .strings.region_names import Region, LogicRegion
 | 
					from .strings.region_names import Region as RegionName, LogicRegion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class RegionFactory(Protocol):
 | 
					class RegionFactory(Protocol):
 | 
				
			||||||
| 
						 | 
					@ -16,192 +16,192 @@ class RegionFactory(Protocol):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
vanilla_regions = [
 | 
					vanilla_regions = [
 | 
				
			||||||
    RegionData(Region.menu, [Entrance.to_stardew_valley]),
 | 
					    RegionData(RegionName.menu, [Entrance.to_stardew_valley]),
 | 
				
			||||||
    RegionData(Region.stardew_valley, [Entrance.to_farmhouse]),
 | 
					    RegionData(RegionName.stardew_valley, [Entrance.to_farmhouse]),
 | 
				
			||||||
    RegionData(Region.farm_house,
 | 
					    RegionData(RegionName.farm_house,
 | 
				
			||||||
               [Entrance.farmhouse_to_farm, Entrance.downstairs_to_cellar, LogicEntrance.farmhouse_cooking, LogicEntrance.watch_queen_of_sauce]),
 | 
					               [Entrance.farmhouse_to_farm, Entrance.downstairs_to_cellar, LogicEntrance.farmhouse_cooking, LogicEntrance.watch_queen_of_sauce]),
 | 
				
			||||||
    RegionData(Region.cellar),
 | 
					    RegionData(RegionName.cellar),
 | 
				
			||||||
    RegionData(Region.farm,
 | 
					    RegionData(RegionName.farm,
 | 
				
			||||||
               [Entrance.farm_to_backwoods, Entrance.farm_to_bus_stop, Entrance.farm_to_forest, Entrance.farm_to_farmcave, Entrance.enter_greenhouse,
 | 
					               [Entrance.farm_to_backwoods, Entrance.farm_to_bus_stop, Entrance.farm_to_forest, Entrance.farm_to_farmcave, Entrance.enter_greenhouse,
 | 
				
			||||||
                Entrance.enter_coop, Entrance.enter_barn, Entrance.enter_shed, Entrance.enter_slime_hutch, LogicEntrance.grow_spring_crops,
 | 
					                Entrance.enter_coop, Entrance.enter_barn, Entrance.enter_shed, Entrance.enter_slime_hutch, LogicEntrance.grow_spring_crops,
 | 
				
			||||||
                LogicEntrance.grow_summer_crops, LogicEntrance.grow_fall_crops, LogicEntrance.grow_winter_crops, LogicEntrance.shipping]),
 | 
					                LogicEntrance.grow_summer_crops, LogicEntrance.grow_fall_crops, LogicEntrance.grow_winter_crops, LogicEntrance.shipping]),
 | 
				
			||||||
    RegionData(Region.backwoods, [Entrance.backwoods_to_mountain]),
 | 
					    RegionData(RegionName.backwoods, [Entrance.backwoods_to_mountain]),
 | 
				
			||||||
    RegionData(Region.bus_stop,
 | 
					    RegionData(RegionName.bus_stop,
 | 
				
			||||||
               [Entrance.bus_stop_to_town, Entrance.take_bus_to_desert, Entrance.bus_stop_to_tunnel_entrance]),
 | 
					               [Entrance.bus_stop_to_town, Entrance.take_bus_to_desert, Entrance.bus_stop_to_tunnel_entrance]),
 | 
				
			||||||
    RegionData(Region.forest,
 | 
					    RegionData(RegionName.forest,
 | 
				
			||||||
               [Entrance.forest_to_town, Entrance.enter_secret_woods, Entrance.forest_to_wizard_tower, Entrance.forest_to_marnie_ranch,
 | 
					               [Entrance.forest_to_town, Entrance.enter_secret_woods, Entrance.forest_to_wizard_tower, Entrance.forest_to_marnie_ranch,
 | 
				
			||||||
                Entrance.forest_to_leah_cottage, Entrance.forest_to_sewer, Entrance.forest_to_mastery_cave, LogicEntrance.buy_from_traveling_merchant,
 | 
					                Entrance.forest_to_leah_cottage, Entrance.forest_to_sewer, Entrance.forest_to_mastery_cave, LogicEntrance.buy_from_traveling_merchant,
 | 
				
			||||||
                LogicEntrance.complete_raccoon_requests, LogicEntrance.fish_in_waterfall, LogicEntrance.attend_flower_dance, LogicEntrance.attend_trout_derby,
 | 
					                LogicEntrance.complete_raccoon_requests, LogicEntrance.fish_in_waterfall, LogicEntrance.attend_flower_dance, LogicEntrance.attend_trout_derby,
 | 
				
			||||||
                LogicEntrance.attend_festival_of_ice]),
 | 
					                LogicEntrance.attend_festival_of_ice]),
 | 
				
			||||||
    RegionData(LogicRegion.forest_waterfall),
 | 
					    RegionData(LogicRegion.forest_waterfall),
 | 
				
			||||||
    RegionData(Region.farm_cave),
 | 
					    RegionData(RegionName.farm_cave),
 | 
				
			||||||
    RegionData(Region.greenhouse,
 | 
					    RegionData(RegionName.greenhouse,
 | 
				
			||||||
               [LogicEntrance.grow_spring_crops_in_greenhouse, LogicEntrance.grow_summer_crops_in_greenhouse, LogicEntrance.grow_fall_crops_in_greenhouse,
 | 
					               [LogicEntrance.grow_spring_crops_in_greenhouse, LogicEntrance.grow_summer_crops_in_greenhouse, LogicEntrance.grow_fall_crops_in_greenhouse,
 | 
				
			||||||
                LogicEntrance.grow_winter_crops_in_greenhouse, LogicEntrance.grow_indoor_crops_in_greenhouse]),
 | 
					                LogicEntrance.grow_winter_crops_in_greenhouse, LogicEntrance.grow_indoor_crops_in_greenhouse]),
 | 
				
			||||||
    RegionData(Region.mountain,
 | 
					    RegionData(RegionName.mountain,
 | 
				
			||||||
               [Entrance.mountain_to_railroad, Entrance.mountain_to_tent, Entrance.mountain_to_carpenter_shop,
 | 
					               [Entrance.mountain_to_railroad, Entrance.mountain_to_tent, Entrance.mountain_to_carpenter_shop,
 | 
				
			||||||
                Entrance.mountain_to_the_mines, Entrance.enter_quarry, Entrance.mountain_to_adventurer_guild,
 | 
					                Entrance.mountain_to_the_mines, Entrance.enter_quarry, Entrance.mountain_to_adventurer_guild,
 | 
				
			||||||
                Entrance.mountain_to_town, Entrance.mountain_to_maru_room,
 | 
					                Entrance.mountain_to_town, Entrance.mountain_to_maru_room,
 | 
				
			||||||
                Entrance.mountain_to_leo_treehouse]),
 | 
					                Entrance.mountain_to_leo_treehouse]),
 | 
				
			||||||
    RegionData(Region.leo_treehouse, is_ginger_island=True),
 | 
					    RegionData(RegionName.leo_treehouse, is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.maru_room),
 | 
					    RegionData(RegionName.maru_room),
 | 
				
			||||||
    RegionData(Region.tunnel_entrance, [Entrance.tunnel_entrance_to_bus_tunnel]),
 | 
					    RegionData(RegionName.tunnel_entrance, [Entrance.tunnel_entrance_to_bus_tunnel]),
 | 
				
			||||||
    RegionData(Region.bus_tunnel),
 | 
					    RegionData(RegionName.bus_tunnel),
 | 
				
			||||||
    RegionData(Region.town,
 | 
					    RegionData(RegionName.town,
 | 
				
			||||||
               [Entrance.town_to_community_center, Entrance.town_to_beach, Entrance.town_to_hospital, Entrance.town_to_pierre_general_store,
 | 
					               [Entrance.town_to_community_center, Entrance.town_to_beach, Entrance.town_to_hospital, Entrance.town_to_pierre_general_store,
 | 
				
			||||||
                Entrance.town_to_saloon, Entrance.town_to_alex_house, Entrance.town_to_trailer, Entrance.town_to_mayor_manor, Entrance.town_to_sam_house,
 | 
					                Entrance.town_to_saloon, Entrance.town_to_alex_house, Entrance.town_to_trailer, Entrance.town_to_mayor_manor, Entrance.town_to_sam_house,
 | 
				
			||||||
                Entrance.town_to_haley_house, Entrance.town_to_sewer, Entrance.town_to_clint_blacksmith, Entrance.town_to_museum, Entrance.town_to_jojamart,
 | 
					                Entrance.town_to_haley_house, Entrance.town_to_sewer, Entrance.town_to_clint_blacksmith, Entrance.town_to_museum, Entrance.town_to_jojamart,
 | 
				
			||||||
                Entrance.purchase_movie_ticket, LogicEntrance.buy_experience_books, LogicEntrance.attend_egg_festival, LogicEntrance.attend_fair,
 | 
					                Entrance.purchase_movie_ticket, LogicEntrance.buy_experience_books, LogicEntrance.attend_egg_festival, LogicEntrance.attend_fair,
 | 
				
			||||||
                LogicEntrance.attend_spirit_eve, LogicEntrance.attend_winter_star]),
 | 
					                LogicEntrance.attend_spirit_eve, LogicEntrance.attend_winter_star]),
 | 
				
			||||||
    RegionData(Region.beach,
 | 
					    RegionData(RegionName.beach,
 | 
				
			||||||
               [Entrance.beach_to_willy_fish_shop, Entrance.enter_elliott_house, Entrance.enter_tide_pools, LogicEntrance.fishing, LogicEntrance.attend_luau,
 | 
					               [Entrance.beach_to_willy_fish_shop, Entrance.enter_elliott_house, Entrance.enter_tide_pools, LogicEntrance.fishing, LogicEntrance.attend_luau,
 | 
				
			||||||
                LogicEntrance.attend_moonlight_jellies, LogicEntrance.attend_night_market, LogicEntrance.attend_squidfest]),
 | 
					                LogicEntrance.attend_moonlight_jellies, LogicEntrance.attend_night_market, LogicEntrance.attend_squidfest]),
 | 
				
			||||||
    RegionData(Region.railroad, [Entrance.enter_bathhouse_entrance, Entrance.enter_witch_warp_cave]),
 | 
					    RegionData(RegionName.railroad, [Entrance.enter_bathhouse_entrance, Entrance.enter_witch_warp_cave]),
 | 
				
			||||||
    RegionData(Region.ranch),
 | 
					    RegionData(RegionName.ranch),
 | 
				
			||||||
    RegionData(Region.leah_house),
 | 
					    RegionData(RegionName.leah_house),
 | 
				
			||||||
    RegionData(Region.mastery_cave),
 | 
					    RegionData(RegionName.mastery_cave),
 | 
				
			||||||
    RegionData(Region.sewer, [Entrance.enter_mutant_bug_lair]),
 | 
					    RegionData(RegionName.sewer, [Entrance.enter_mutant_bug_lair]),
 | 
				
			||||||
    RegionData(Region.mutant_bug_lair),
 | 
					    RegionData(RegionName.mutant_bug_lair),
 | 
				
			||||||
    RegionData(Region.wizard_tower, [Entrance.enter_wizard_basement, Entrance.use_desert_obelisk, Entrance.use_island_obelisk]),
 | 
					    RegionData(RegionName.wizard_tower, [Entrance.enter_wizard_basement, Entrance.use_desert_obelisk, Entrance.use_island_obelisk]),
 | 
				
			||||||
    RegionData(Region.wizard_basement),
 | 
					    RegionData(RegionName.wizard_basement),
 | 
				
			||||||
    RegionData(Region.tent),
 | 
					    RegionData(RegionName.tent),
 | 
				
			||||||
    RegionData(Region.carpenter, [Entrance.enter_sebastian_room]),
 | 
					    RegionData(RegionName.carpenter, [Entrance.enter_sebastian_room]),
 | 
				
			||||||
    RegionData(Region.sebastian_room),
 | 
					    RegionData(RegionName.sebastian_room),
 | 
				
			||||||
    RegionData(Region.adventurer_guild, [Entrance.adventurer_guild_to_bedroom]),
 | 
					    RegionData(RegionName.adventurer_guild, [Entrance.adventurer_guild_to_bedroom]),
 | 
				
			||||||
    RegionData(Region.adventurer_guild_bedroom),
 | 
					    RegionData(RegionName.adventurer_guild_bedroom),
 | 
				
			||||||
    RegionData(Region.community_center,
 | 
					    RegionData(RegionName.community_center,
 | 
				
			||||||
               [Entrance.access_crafts_room, Entrance.access_pantry, Entrance.access_fish_tank,
 | 
					               [Entrance.access_crafts_room, Entrance.access_pantry, Entrance.access_fish_tank,
 | 
				
			||||||
                Entrance.access_boiler_room, Entrance.access_bulletin_board, Entrance.access_vault]),
 | 
					                Entrance.access_boiler_room, Entrance.access_bulletin_board, Entrance.access_vault]),
 | 
				
			||||||
    RegionData(Region.crafts_room),
 | 
					    RegionData(RegionName.crafts_room),
 | 
				
			||||||
    RegionData(Region.pantry),
 | 
					    RegionData(RegionName.pantry),
 | 
				
			||||||
    RegionData(Region.fish_tank),
 | 
					    RegionData(RegionName.fish_tank),
 | 
				
			||||||
    RegionData(Region.boiler_room),
 | 
					    RegionData(RegionName.boiler_room),
 | 
				
			||||||
    RegionData(Region.bulletin_board),
 | 
					    RegionData(RegionName.bulletin_board),
 | 
				
			||||||
    RegionData(Region.vault),
 | 
					    RegionData(RegionName.vault),
 | 
				
			||||||
    RegionData(Region.hospital, [Entrance.enter_harvey_room]),
 | 
					    RegionData(RegionName.hospital, [Entrance.enter_harvey_room]),
 | 
				
			||||||
    RegionData(Region.harvey_room),
 | 
					    RegionData(RegionName.harvey_room),
 | 
				
			||||||
    RegionData(Region.pierre_store, [Entrance.enter_sunroom]),
 | 
					    RegionData(RegionName.pierre_store, [Entrance.enter_sunroom]),
 | 
				
			||||||
    RegionData(Region.sunroom),
 | 
					    RegionData(RegionName.sunroom),
 | 
				
			||||||
    RegionData(Region.saloon, [Entrance.play_journey_of_the_prairie_king, Entrance.play_junimo_kart]),
 | 
					    RegionData(RegionName.saloon, [Entrance.play_journey_of_the_prairie_king, Entrance.play_junimo_kart]),
 | 
				
			||||||
    RegionData(Region.jotpk_world_1, [Entrance.reach_jotpk_world_2]),
 | 
					    RegionData(RegionName.jotpk_world_1, [Entrance.reach_jotpk_world_2]),
 | 
				
			||||||
    RegionData(Region.jotpk_world_2, [Entrance.reach_jotpk_world_3]),
 | 
					    RegionData(RegionName.jotpk_world_2, [Entrance.reach_jotpk_world_3]),
 | 
				
			||||||
    RegionData(Region.jotpk_world_3),
 | 
					    RegionData(RegionName.jotpk_world_3),
 | 
				
			||||||
    RegionData(Region.junimo_kart_1, [Entrance.reach_junimo_kart_2]),
 | 
					    RegionData(RegionName.junimo_kart_1, [Entrance.reach_junimo_kart_2]),
 | 
				
			||||||
    RegionData(Region.junimo_kart_2, [Entrance.reach_junimo_kart_3]),
 | 
					    RegionData(RegionName.junimo_kart_2, [Entrance.reach_junimo_kart_3]),
 | 
				
			||||||
    RegionData(Region.junimo_kart_3, [Entrance.reach_junimo_kart_4]),
 | 
					    RegionData(RegionName.junimo_kart_3, [Entrance.reach_junimo_kart_4]),
 | 
				
			||||||
    RegionData(Region.junimo_kart_4),
 | 
					    RegionData(RegionName.junimo_kart_4),
 | 
				
			||||||
    RegionData(Region.alex_house),
 | 
					    RegionData(RegionName.alex_house),
 | 
				
			||||||
    RegionData(Region.trailer),
 | 
					    RegionData(RegionName.trailer),
 | 
				
			||||||
    RegionData(Region.mayor_house),
 | 
					    RegionData(RegionName.mayor_house),
 | 
				
			||||||
    RegionData(Region.sam_house),
 | 
					    RegionData(RegionName.sam_house),
 | 
				
			||||||
    RegionData(Region.haley_house),
 | 
					    RegionData(RegionName.haley_house),
 | 
				
			||||||
    RegionData(Region.blacksmith, [LogicEntrance.blacksmith_copper]),
 | 
					    RegionData(RegionName.blacksmith, [LogicEntrance.blacksmith_copper]),
 | 
				
			||||||
    RegionData(Region.museum),
 | 
					    RegionData(RegionName.museum),
 | 
				
			||||||
    RegionData(Region.jojamart, [Entrance.enter_abandoned_jojamart]),
 | 
					    RegionData(RegionName.jojamart, [Entrance.enter_abandoned_jojamart]),
 | 
				
			||||||
    RegionData(Region.abandoned_jojamart, [Entrance.enter_movie_theater]),
 | 
					    RegionData(RegionName.abandoned_jojamart, [Entrance.enter_movie_theater]),
 | 
				
			||||||
    RegionData(Region.movie_ticket_stand),
 | 
					    RegionData(RegionName.movie_ticket_stand),
 | 
				
			||||||
    RegionData(Region.movie_theater),
 | 
					    RegionData(RegionName.movie_theater),
 | 
				
			||||||
    RegionData(Region.fish_shop, [Entrance.fish_shop_to_boat_tunnel]),
 | 
					    RegionData(RegionName.fish_shop, [Entrance.fish_shop_to_boat_tunnel]),
 | 
				
			||||||
    RegionData(Region.boat_tunnel, [Entrance.boat_to_ginger_island], is_ginger_island=True),
 | 
					    RegionData(RegionName.boat_tunnel, [Entrance.boat_to_ginger_island], is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.elliott_house),
 | 
					    RegionData(RegionName.elliott_house),
 | 
				
			||||||
    RegionData(Region.tide_pools),
 | 
					    RegionData(RegionName.tide_pools),
 | 
				
			||||||
    RegionData(Region.bathhouse_entrance, [Entrance.enter_locker_room]),
 | 
					    RegionData(RegionName.bathhouse_entrance, [Entrance.enter_locker_room]),
 | 
				
			||||||
    RegionData(Region.locker_room, [Entrance.enter_public_bath]),
 | 
					    RegionData(RegionName.locker_room, [Entrance.enter_public_bath]),
 | 
				
			||||||
    RegionData(Region.public_bath),
 | 
					    RegionData(RegionName.public_bath),
 | 
				
			||||||
    RegionData(Region.witch_warp_cave, [Entrance.enter_witch_swamp]),
 | 
					    RegionData(RegionName.witch_warp_cave, [Entrance.enter_witch_swamp]),
 | 
				
			||||||
    RegionData(Region.witch_swamp, [Entrance.enter_witch_hut]),
 | 
					    RegionData(RegionName.witch_swamp, [Entrance.enter_witch_hut]),
 | 
				
			||||||
    RegionData(Region.witch_hut, [Entrance.witch_warp_to_wizard_basement]),
 | 
					    RegionData(RegionName.witch_hut, [Entrance.witch_warp_to_wizard_basement]),
 | 
				
			||||||
    RegionData(Region.quarry, [Entrance.enter_quarry_mine_entrance]),
 | 
					    RegionData(RegionName.quarry, [Entrance.enter_quarry_mine_entrance]),
 | 
				
			||||||
    RegionData(Region.quarry_mine_entrance, [Entrance.enter_quarry_mine]),
 | 
					    RegionData(RegionName.quarry_mine_entrance, [Entrance.enter_quarry_mine]),
 | 
				
			||||||
    RegionData(Region.quarry_mine),
 | 
					    RegionData(RegionName.quarry_mine),
 | 
				
			||||||
    RegionData(Region.secret_woods),
 | 
					    RegionData(RegionName.secret_woods),
 | 
				
			||||||
    RegionData(Region.desert, [Entrance.enter_skull_cavern_entrance, Entrance.enter_oasis, LogicEntrance.attend_desert_festival]),
 | 
					    RegionData(RegionName.desert, [Entrance.enter_skull_cavern_entrance, Entrance.enter_oasis, LogicEntrance.attend_desert_festival]),
 | 
				
			||||||
    RegionData(Region.oasis, [Entrance.enter_casino]),
 | 
					    RegionData(RegionName.oasis, [Entrance.enter_casino]),
 | 
				
			||||||
    RegionData(Region.casino),
 | 
					    RegionData(RegionName.casino),
 | 
				
			||||||
    RegionData(Region.skull_cavern_entrance, [Entrance.enter_skull_cavern]),
 | 
					    RegionData(RegionName.skull_cavern_entrance, [Entrance.enter_skull_cavern]),
 | 
				
			||||||
    RegionData(Region.skull_cavern, [Entrance.mine_to_skull_cavern_floor_25]),
 | 
					    RegionData(RegionName.skull_cavern, [Entrance.mine_to_skull_cavern_floor_25]),
 | 
				
			||||||
    RegionData(Region.skull_cavern_25, [Entrance.mine_to_skull_cavern_floor_50]),
 | 
					    RegionData(RegionName.skull_cavern_25, [Entrance.mine_to_skull_cavern_floor_50]),
 | 
				
			||||||
    RegionData(Region.skull_cavern_50, [Entrance.mine_to_skull_cavern_floor_75]),
 | 
					    RegionData(RegionName.skull_cavern_50, [Entrance.mine_to_skull_cavern_floor_75]),
 | 
				
			||||||
    RegionData(Region.skull_cavern_75, [Entrance.mine_to_skull_cavern_floor_100]),
 | 
					    RegionData(RegionName.skull_cavern_75, [Entrance.mine_to_skull_cavern_floor_100]),
 | 
				
			||||||
    RegionData(Region.skull_cavern_100, [Entrance.mine_to_skull_cavern_floor_125]),
 | 
					    RegionData(RegionName.skull_cavern_100, [Entrance.mine_to_skull_cavern_floor_125]),
 | 
				
			||||||
    RegionData(Region.skull_cavern_125, [Entrance.mine_to_skull_cavern_floor_150]),
 | 
					    RegionData(RegionName.skull_cavern_125, [Entrance.mine_to_skull_cavern_floor_150]),
 | 
				
			||||||
    RegionData(Region.skull_cavern_150, [Entrance.mine_to_skull_cavern_floor_175]),
 | 
					    RegionData(RegionName.skull_cavern_150, [Entrance.mine_to_skull_cavern_floor_175]),
 | 
				
			||||||
    RegionData(Region.skull_cavern_175, [Entrance.mine_to_skull_cavern_floor_200]),
 | 
					    RegionData(RegionName.skull_cavern_175, [Entrance.mine_to_skull_cavern_floor_200]),
 | 
				
			||||||
    RegionData(Region.skull_cavern_200, [Entrance.enter_dangerous_skull_cavern]),
 | 
					    RegionData(RegionName.skull_cavern_200, [Entrance.enter_dangerous_skull_cavern]),
 | 
				
			||||||
    RegionData(Region.dangerous_skull_cavern, is_ginger_island=True),
 | 
					    RegionData(RegionName.dangerous_skull_cavern, is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.island_south,
 | 
					    RegionData(RegionName.island_south,
 | 
				
			||||||
               [Entrance.island_south_to_west, Entrance.island_south_to_north, Entrance.island_south_to_east, Entrance.island_south_to_southeast,
 | 
					               [Entrance.island_south_to_west, Entrance.island_south_to_north, Entrance.island_south_to_east, Entrance.island_south_to_southeast,
 | 
				
			||||||
                Entrance.use_island_resort, Entrance.parrot_express_docks_to_volcano, Entrance.parrot_express_docks_to_dig_site,
 | 
					                Entrance.use_island_resort, Entrance.parrot_express_docks_to_volcano, Entrance.parrot_express_docks_to_dig_site,
 | 
				
			||||||
                Entrance.parrot_express_docks_to_jungle],
 | 
					                Entrance.parrot_express_docks_to_jungle],
 | 
				
			||||||
               is_ginger_island=True),
 | 
					               is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.island_resort, is_ginger_island=True),
 | 
					    RegionData(RegionName.island_resort, is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.island_west,
 | 
					    RegionData(RegionName.island_west,
 | 
				
			||||||
               [Entrance.island_west_to_islandfarmhouse, Entrance.island_west_to_gourmand_cave, Entrance.island_west_to_crystals_cave,
 | 
					               [Entrance.island_west_to_islandfarmhouse, Entrance.island_west_to_gourmand_cave, Entrance.island_west_to_crystals_cave,
 | 
				
			||||||
                Entrance.island_west_to_shipwreck, Entrance.island_west_to_qi_walnut_room, Entrance.use_farm_obelisk, Entrance.parrot_express_jungle_to_docks,
 | 
					                Entrance.island_west_to_shipwreck, Entrance.island_west_to_qi_walnut_room, Entrance.use_farm_obelisk, Entrance.parrot_express_jungle_to_docks,
 | 
				
			||||||
                Entrance.parrot_express_jungle_to_dig_site, Entrance.parrot_express_jungle_to_volcano, LogicEntrance.grow_spring_crops_on_island,
 | 
					                Entrance.parrot_express_jungle_to_dig_site, Entrance.parrot_express_jungle_to_volcano, LogicEntrance.grow_spring_crops_on_island,
 | 
				
			||||||
                LogicEntrance.grow_summer_crops_on_island, LogicEntrance.grow_fall_crops_on_island, LogicEntrance.grow_winter_crops_on_island,
 | 
					                LogicEntrance.grow_summer_crops_on_island, LogicEntrance.grow_fall_crops_on_island, LogicEntrance.grow_winter_crops_on_island,
 | 
				
			||||||
                LogicEntrance.grow_indoor_crops_on_island],
 | 
					                LogicEntrance.grow_indoor_crops_on_island],
 | 
				
			||||||
               is_ginger_island=True),
 | 
					               is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.island_east, [Entrance.island_east_to_leo_hut, Entrance.island_east_to_island_shrine], is_ginger_island=True),
 | 
					    RegionData(RegionName.island_east, [Entrance.island_east_to_leo_hut, Entrance.island_east_to_island_shrine], is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.island_shrine, is_ginger_island=True),
 | 
					    RegionData(RegionName.island_shrine, is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.island_south_east, [Entrance.island_southeast_to_pirate_cove], is_ginger_island=True),
 | 
					    RegionData(RegionName.island_south_east, [Entrance.island_southeast_to_pirate_cove], is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.island_north,
 | 
					    RegionData(RegionName.island_north,
 | 
				
			||||||
               [Entrance.talk_to_island_trader, Entrance.island_north_to_field_office, Entrance.island_north_to_dig_site, Entrance.island_north_to_volcano,
 | 
					               [Entrance.talk_to_island_trader, Entrance.island_north_to_field_office, Entrance.island_north_to_dig_site, Entrance.island_north_to_volcano,
 | 
				
			||||||
                Entrance.parrot_express_volcano_to_dig_site, Entrance.parrot_express_volcano_to_jungle, Entrance.parrot_express_volcano_to_docks],
 | 
					                Entrance.parrot_express_volcano_to_dig_site, Entrance.parrot_express_volcano_to_jungle, Entrance.parrot_express_volcano_to_docks],
 | 
				
			||||||
               is_ginger_island=True),
 | 
					               is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.volcano, [Entrance.climb_to_volcano_5, Entrance.volcano_to_secret_beach], is_ginger_island=True),
 | 
					    RegionData(RegionName.volcano, [Entrance.climb_to_volcano_5, Entrance.volcano_to_secret_beach], is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.volcano_secret_beach, is_ginger_island=True),
 | 
					    RegionData(RegionName.volcano_secret_beach, is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.volcano_floor_5, [Entrance.talk_to_volcano_dwarf, Entrance.climb_to_volcano_10], is_ginger_island=True),
 | 
					    RegionData(RegionName.volcano_floor_5, [Entrance.talk_to_volcano_dwarf, Entrance.climb_to_volcano_10], is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.volcano_dwarf_shop, is_ginger_island=True),
 | 
					    RegionData(RegionName.volcano_dwarf_shop, is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.volcano_floor_10, is_ginger_island=True),
 | 
					    RegionData(RegionName.volcano_floor_10, is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.island_trader, is_ginger_island=True),
 | 
					    RegionData(RegionName.island_trader, is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.island_farmhouse, [LogicEntrance.island_cooking], is_ginger_island=True),
 | 
					    RegionData(RegionName.island_farmhouse, [LogicEntrance.island_cooking], is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.gourmand_frog_cave, is_ginger_island=True),
 | 
					    RegionData(RegionName.gourmand_frog_cave, is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.colored_crystals_cave, is_ginger_island=True),
 | 
					    RegionData(RegionName.colored_crystals_cave, is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.shipwreck, is_ginger_island=True),
 | 
					    RegionData(RegionName.shipwreck, is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.qi_walnut_room, is_ginger_island=True),
 | 
					    RegionData(RegionName.qi_walnut_room, is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.leo_hut, is_ginger_island=True),
 | 
					    RegionData(RegionName.leo_hut, is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.pirate_cove, is_ginger_island=True),
 | 
					    RegionData(RegionName.pirate_cove, is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.field_office, is_ginger_island=True),
 | 
					    RegionData(RegionName.field_office, is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.dig_site,
 | 
					    RegionData(RegionName.dig_site,
 | 
				
			||||||
               [Entrance.dig_site_to_professor_snail_cave, Entrance.parrot_express_dig_site_to_volcano,
 | 
					               [Entrance.dig_site_to_professor_snail_cave, Entrance.parrot_express_dig_site_to_volcano,
 | 
				
			||||||
                Entrance.parrot_express_dig_site_to_docks, Entrance.parrot_express_dig_site_to_jungle],
 | 
					                Entrance.parrot_express_dig_site_to_docks, Entrance.parrot_express_dig_site_to_jungle],
 | 
				
			||||||
               is_ginger_island=True),
 | 
					               is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.professor_snail_cave, is_ginger_island=True),
 | 
					    RegionData(RegionName.professor_snail_cave, is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.coop),
 | 
					    RegionData(RegionName.coop),
 | 
				
			||||||
    RegionData(Region.barn),
 | 
					    RegionData(RegionName.barn),
 | 
				
			||||||
    RegionData(Region.shed),
 | 
					    RegionData(RegionName.shed),
 | 
				
			||||||
    RegionData(Region.slime_hutch),
 | 
					    RegionData(RegionName.slime_hutch),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    RegionData(Region.mines, [LogicEntrance.talk_to_mines_dwarf,
 | 
					    RegionData(RegionName.mines, [LogicEntrance.talk_to_mines_dwarf,
 | 
				
			||||||
                              Entrance.dig_to_mines_floor_5]),
 | 
					                                  Entrance.dig_to_mines_floor_5]),
 | 
				
			||||||
    RegionData(Region.mines_floor_5, [Entrance.dig_to_mines_floor_10]),
 | 
					    RegionData(RegionName.mines_floor_5, [Entrance.dig_to_mines_floor_10]),
 | 
				
			||||||
    RegionData(Region.mines_floor_10, [Entrance.dig_to_mines_floor_15]),
 | 
					    RegionData(RegionName.mines_floor_10, [Entrance.dig_to_mines_floor_15]),
 | 
				
			||||||
    RegionData(Region.mines_floor_15, [Entrance.dig_to_mines_floor_20]),
 | 
					    RegionData(RegionName.mines_floor_15, [Entrance.dig_to_mines_floor_20]),
 | 
				
			||||||
    RegionData(Region.mines_floor_20, [Entrance.dig_to_mines_floor_25]),
 | 
					    RegionData(RegionName.mines_floor_20, [Entrance.dig_to_mines_floor_25]),
 | 
				
			||||||
    RegionData(Region.mines_floor_25, [Entrance.dig_to_mines_floor_30]),
 | 
					    RegionData(RegionName.mines_floor_25, [Entrance.dig_to_mines_floor_30]),
 | 
				
			||||||
    RegionData(Region.mines_floor_30, [Entrance.dig_to_mines_floor_35]),
 | 
					    RegionData(RegionName.mines_floor_30, [Entrance.dig_to_mines_floor_35]),
 | 
				
			||||||
    RegionData(Region.mines_floor_35, [Entrance.dig_to_mines_floor_40]),
 | 
					    RegionData(RegionName.mines_floor_35, [Entrance.dig_to_mines_floor_40]),
 | 
				
			||||||
    RegionData(Region.mines_floor_40, [Entrance.dig_to_mines_floor_45]),
 | 
					    RegionData(RegionName.mines_floor_40, [Entrance.dig_to_mines_floor_45]),
 | 
				
			||||||
    RegionData(Region.mines_floor_45, [Entrance.dig_to_mines_floor_50]),
 | 
					    RegionData(RegionName.mines_floor_45, [Entrance.dig_to_mines_floor_50]),
 | 
				
			||||||
    RegionData(Region.mines_floor_50, [Entrance.dig_to_mines_floor_55]),
 | 
					    RegionData(RegionName.mines_floor_50, [Entrance.dig_to_mines_floor_55]),
 | 
				
			||||||
    RegionData(Region.mines_floor_55, [Entrance.dig_to_mines_floor_60]),
 | 
					    RegionData(RegionName.mines_floor_55, [Entrance.dig_to_mines_floor_60]),
 | 
				
			||||||
    RegionData(Region.mines_floor_60, [Entrance.dig_to_mines_floor_65]),
 | 
					    RegionData(RegionName.mines_floor_60, [Entrance.dig_to_mines_floor_65]),
 | 
				
			||||||
    RegionData(Region.mines_floor_65, [Entrance.dig_to_mines_floor_70]),
 | 
					    RegionData(RegionName.mines_floor_65, [Entrance.dig_to_mines_floor_70]),
 | 
				
			||||||
    RegionData(Region.mines_floor_70, [Entrance.dig_to_mines_floor_75]),
 | 
					    RegionData(RegionName.mines_floor_70, [Entrance.dig_to_mines_floor_75]),
 | 
				
			||||||
    RegionData(Region.mines_floor_75, [Entrance.dig_to_mines_floor_80]),
 | 
					    RegionData(RegionName.mines_floor_75, [Entrance.dig_to_mines_floor_80]),
 | 
				
			||||||
    RegionData(Region.mines_floor_80, [Entrance.dig_to_mines_floor_85]),
 | 
					    RegionData(RegionName.mines_floor_80, [Entrance.dig_to_mines_floor_85]),
 | 
				
			||||||
    RegionData(Region.mines_floor_85, [Entrance.dig_to_mines_floor_90]),
 | 
					    RegionData(RegionName.mines_floor_85, [Entrance.dig_to_mines_floor_90]),
 | 
				
			||||||
    RegionData(Region.mines_floor_90, [Entrance.dig_to_mines_floor_95]),
 | 
					    RegionData(RegionName.mines_floor_90, [Entrance.dig_to_mines_floor_95]),
 | 
				
			||||||
    RegionData(Region.mines_floor_95, [Entrance.dig_to_mines_floor_100]),
 | 
					    RegionData(RegionName.mines_floor_95, [Entrance.dig_to_mines_floor_100]),
 | 
				
			||||||
    RegionData(Region.mines_floor_100, [Entrance.dig_to_mines_floor_105]),
 | 
					    RegionData(RegionName.mines_floor_100, [Entrance.dig_to_mines_floor_105]),
 | 
				
			||||||
    RegionData(Region.mines_floor_105, [Entrance.dig_to_mines_floor_110]),
 | 
					    RegionData(RegionName.mines_floor_105, [Entrance.dig_to_mines_floor_110]),
 | 
				
			||||||
    RegionData(Region.mines_floor_110, [Entrance.dig_to_mines_floor_115]),
 | 
					    RegionData(RegionName.mines_floor_110, [Entrance.dig_to_mines_floor_115]),
 | 
				
			||||||
    RegionData(Region.mines_floor_115, [Entrance.dig_to_mines_floor_120]),
 | 
					    RegionData(RegionName.mines_floor_115, [Entrance.dig_to_mines_floor_120]),
 | 
				
			||||||
    RegionData(Region.mines_floor_120, [Entrance.dig_to_dangerous_mines_20, Entrance.dig_to_dangerous_mines_60, Entrance.dig_to_dangerous_mines_100]),
 | 
					    RegionData(RegionName.mines_floor_120, [Entrance.dig_to_dangerous_mines_20, Entrance.dig_to_dangerous_mines_60, Entrance.dig_to_dangerous_mines_100]),
 | 
				
			||||||
    RegionData(Region.dangerous_mines_20, is_ginger_island=True),
 | 
					    RegionData(RegionName.dangerous_mines_20, is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.dangerous_mines_60, is_ginger_island=True),
 | 
					    RegionData(RegionName.dangerous_mines_60, is_ginger_island=True),
 | 
				
			||||||
    RegionData(Region.dangerous_mines_100, is_ginger_island=True),
 | 
					    RegionData(RegionName.dangerous_mines_100, is_ginger_island=True),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    RegionData(LogicRegion.mines_dwarf_shop),
 | 
					    RegionData(LogicRegion.mines_dwarf_shop),
 | 
				
			||||||
    RegionData(LogicRegion.blacksmith_copper, [LogicEntrance.blacksmith_iron]),
 | 
					    RegionData(LogicRegion.blacksmith_copper, [LogicEntrance.blacksmith_iron]),
 | 
				
			||||||
| 
						 | 
					@ -256,206 +256,207 @@ vanilla_regions = [
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Exists and where they lead
 | 
					# Exists and where they lead
 | 
				
			||||||
vanilla_connections = [
 | 
					vanilla_connections = [
 | 
				
			||||||
    ConnectionData(Entrance.to_stardew_valley, Region.stardew_valley),
 | 
					    ConnectionData(Entrance.to_stardew_valley, RegionName.stardew_valley),
 | 
				
			||||||
    ConnectionData(Entrance.to_farmhouse, Region.farm_house),
 | 
					    ConnectionData(Entrance.to_farmhouse, RegionName.farm_house),
 | 
				
			||||||
    ConnectionData(Entrance.farmhouse_to_farm, Region.farm),
 | 
					    ConnectionData(Entrance.farmhouse_to_farm, RegionName.farm),
 | 
				
			||||||
    ConnectionData(Entrance.downstairs_to_cellar, Region.cellar),
 | 
					    ConnectionData(Entrance.downstairs_to_cellar, RegionName.cellar),
 | 
				
			||||||
    ConnectionData(Entrance.farm_to_backwoods, Region.backwoods),
 | 
					    ConnectionData(Entrance.farm_to_backwoods, RegionName.backwoods),
 | 
				
			||||||
    ConnectionData(Entrance.farm_to_bus_stop, Region.bus_stop),
 | 
					    ConnectionData(Entrance.farm_to_bus_stop, RegionName.bus_stop),
 | 
				
			||||||
    ConnectionData(Entrance.farm_to_forest, Region.forest),
 | 
					    ConnectionData(Entrance.farm_to_forest, RegionName.forest),
 | 
				
			||||||
    ConnectionData(Entrance.farm_to_farmcave, Region.farm_cave, flag=RandomizationFlag.NON_PROGRESSION),
 | 
					    ConnectionData(Entrance.farm_to_farmcave, RegionName.farm_cave, flag=RandomizationFlag.NON_PROGRESSION),
 | 
				
			||||||
    ConnectionData(Entrance.enter_greenhouse, Region.greenhouse),
 | 
					    ConnectionData(Entrance.enter_greenhouse, RegionName.greenhouse),
 | 
				
			||||||
    ConnectionData(Entrance.enter_coop, Region.coop),
 | 
					    ConnectionData(Entrance.enter_coop, RegionName.coop),
 | 
				
			||||||
    ConnectionData(Entrance.enter_barn, Region.barn),
 | 
					    ConnectionData(Entrance.enter_barn, RegionName.barn),
 | 
				
			||||||
    ConnectionData(Entrance.enter_shed, Region.shed),
 | 
					    ConnectionData(Entrance.enter_shed, RegionName.shed),
 | 
				
			||||||
    ConnectionData(Entrance.enter_slime_hutch, Region.slime_hutch),
 | 
					    ConnectionData(Entrance.enter_slime_hutch, RegionName.slime_hutch),
 | 
				
			||||||
    ConnectionData(Entrance.use_desert_obelisk, Region.desert),
 | 
					    ConnectionData(Entrance.use_desert_obelisk, RegionName.desert),
 | 
				
			||||||
    ConnectionData(Entrance.use_island_obelisk, Region.island_south, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.use_island_obelisk, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.use_farm_obelisk, Region.farm),
 | 
					    ConnectionData(Entrance.use_farm_obelisk, RegionName.farm),
 | 
				
			||||||
    ConnectionData(Entrance.backwoods_to_mountain, Region.mountain),
 | 
					    ConnectionData(Entrance.backwoods_to_mountain, RegionName.mountain),
 | 
				
			||||||
    ConnectionData(Entrance.bus_stop_to_town, Region.town),
 | 
					    ConnectionData(Entrance.bus_stop_to_town, RegionName.town),
 | 
				
			||||||
    ConnectionData(Entrance.bus_stop_to_tunnel_entrance, Region.tunnel_entrance),
 | 
					    ConnectionData(Entrance.bus_stop_to_tunnel_entrance, RegionName.tunnel_entrance),
 | 
				
			||||||
    ConnectionData(Entrance.tunnel_entrance_to_bus_tunnel, Region.bus_tunnel, flag=RandomizationFlag.NON_PROGRESSION),
 | 
					    ConnectionData(Entrance.tunnel_entrance_to_bus_tunnel, RegionName.bus_tunnel, flag=RandomizationFlag.NON_PROGRESSION),
 | 
				
			||||||
    ConnectionData(Entrance.take_bus_to_desert, Region.desert),
 | 
					    ConnectionData(Entrance.take_bus_to_desert, RegionName.desert),
 | 
				
			||||||
    ConnectionData(Entrance.forest_to_town, Region.town),
 | 
					    ConnectionData(Entrance.forest_to_town, RegionName.town),
 | 
				
			||||||
    ConnectionData(Entrance.forest_to_wizard_tower, Region.wizard_tower,
 | 
					    ConnectionData(Entrance.forest_to_wizard_tower, RegionName.wizard_tower,
 | 
				
			||||||
                   flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.enter_wizard_basement, Region.wizard_basement, flag=RandomizationFlag.BUILDINGS),
 | 
					    ConnectionData(Entrance.enter_wizard_basement, RegionName.wizard_basement, flag=RandomizationFlag.BUILDINGS),
 | 
				
			||||||
    ConnectionData(Entrance.forest_to_marnie_ranch, Region.ranch,
 | 
					    ConnectionData(Entrance.forest_to_marnie_ranch, RegionName.ranch,
 | 
				
			||||||
                   flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.forest_to_leah_cottage, Region.leah_house,
 | 
					    ConnectionData(Entrance.forest_to_leah_cottage, RegionName.leah_house,
 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.enter_secret_woods, Region.secret_woods),
 | 
					    ConnectionData(Entrance.enter_secret_woods, RegionName.secret_woods),
 | 
				
			||||||
    ConnectionData(Entrance.forest_to_sewer, Region.sewer, flag=RandomizationFlag.BUILDINGS),
 | 
					    ConnectionData(Entrance.forest_to_sewer, RegionName.sewer, flag=RandomizationFlag.BUILDINGS),
 | 
				
			||||||
    ConnectionData(Entrance.forest_to_mastery_cave, Region.mastery_cave, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.MASTERIES),
 | 
					    ConnectionData(Entrance.forest_to_mastery_cave, RegionName.mastery_cave, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.MASTERIES),
 | 
				
			||||||
    ConnectionData(Entrance.town_to_sewer, Region.sewer, flag=RandomizationFlag.BUILDINGS),
 | 
					    ConnectionData(Entrance.town_to_sewer, RegionName.sewer, flag=RandomizationFlag.BUILDINGS),
 | 
				
			||||||
    ConnectionData(Entrance.enter_mutant_bug_lair, Region.mutant_bug_lair, flag=RandomizationFlag.BUILDINGS),
 | 
					    ConnectionData(Entrance.enter_mutant_bug_lair, RegionName.mutant_bug_lair, flag=RandomizationFlag.BUILDINGS),
 | 
				
			||||||
    ConnectionData(Entrance.mountain_to_railroad, Region.railroad),
 | 
					    ConnectionData(Entrance.mountain_to_railroad, RegionName.railroad),
 | 
				
			||||||
    ConnectionData(Entrance.mountain_to_tent, Region.tent,
 | 
					    ConnectionData(Entrance.mountain_to_tent, RegionName.tent,
 | 
				
			||||||
                   flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.mountain_to_leo_treehouse, Region.leo_treehouse,
 | 
					    ConnectionData(Entrance.mountain_to_leo_treehouse, RegionName.leo_treehouse,
 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA | RandomizationFlag.GINGER_ISLAND),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA | RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.mountain_to_carpenter_shop, Region.carpenter,
 | 
					    ConnectionData(Entrance.mountain_to_carpenter_shop, RegionName.carpenter,
 | 
				
			||||||
                   flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.mountain_to_maru_room, Region.maru_room,
 | 
					    ConnectionData(Entrance.mountain_to_maru_room, RegionName.maru_room,
 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.enter_sebastian_room, Region.sebastian_room, flag=RandomizationFlag.BUILDINGS),
 | 
					    ConnectionData(Entrance.enter_sebastian_room, RegionName.sebastian_room, flag=RandomizationFlag.BUILDINGS),
 | 
				
			||||||
    ConnectionData(Entrance.mountain_to_adventurer_guild, Region.adventurer_guild,
 | 
					    ConnectionData(Entrance.mountain_to_adventurer_guild, RegionName.adventurer_guild,
 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.adventurer_guild_to_bedroom, Region.adventurer_guild_bedroom),
 | 
					    ConnectionData(Entrance.adventurer_guild_to_bedroom, RegionName.adventurer_guild_bedroom),
 | 
				
			||||||
    ConnectionData(Entrance.enter_quarry, Region.quarry),
 | 
					    ConnectionData(Entrance.enter_quarry, RegionName.quarry),
 | 
				
			||||||
    ConnectionData(Entrance.enter_quarry_mine_entrance, Region.quarry_mine_entrance,
 | 
					    ConnectionData(Entrance.enter_quarry_mine_entrance, RegionName.quarry_mine_entrance,
 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS),
 | 
					                   flag=RandomizationFlag.BUILDINGS),
 | 
				
			||||||
    ConnectionData(Entrance.enter_quarry_mine, Region.quarry_mine),
 | 
					    ConnectionData(Entrance.enter_quarry_mine, RegionName.quarry_mine),
 | 
				
			||||||
    ConnectionData(Entrance.mountain_to_town, Region.town),
 | 
					    ConnectionData(Entrance.mountain_to_town, RegionName.town),
 | 
				
			||||||
    ConnectionData(Entrance.town_to_community_center, Region.community_center,
 | 
					    ConnectionData(Entrance.town_to_community_center, RegionName.community_center,
 | 
				
			||||||
                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.access_crafts_room, Region.crafts_room),
 | 
					    ConnectionData(Entrance.access_crafts_room, RegionName.crafts_room),
 | 
				
			||||||
    ConnectionData(Entrance.access_pantry, Region.pantry),
 | 
					    ConnectionData(Entrance.access_pantry, RegionName.pantry),
 | 
				
			||||||
    ConnectionData(Entrance.access_fish_tank, Region.fish_tank),
 | 
					    ConnectionData(Entrance.access_fish_tank, RegionName.fish_tank),
 | 
				
			||||||
    ConnectionData(Entrance.access_boiler_room, Region.boiler_room),
 | 
					    ConnectionData(Entrance.access_boiler_room, RegionName.boiler_room),
 | 
				
			||||||
    ConnectionData(Entrance.access_bulletin_board, Region.bulletin_board),
 | 
					    ConnectionData(Entrance.access_bulletin_board, RegionName.bulletin_board),
 | 
				
			||||||
    ConnectionData(Entrance.access_vault, Region.vault),
 | 
					    ConnectionData(Entrance.access_vault, RegionName.vault),
 | 
				
			||||||
    ConnectionData(Entrance.town_to_hospital, Region.hospital,
 | 
					    ConnectionData(Entrance.town_to_hospital, RegionName.hospital,
 | 
				
			||||||
                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.enter_harvey_room, Region.harvey_room, flag=RandomizationFlag.BUILDINGS),
 | 
					    ConnectionData(Entrance.enter_harvey_room, RegionName.harvey_room, flag=RandomizationFlag.BUILDINGS),
 | 
				
			||||||
    ConnectionData(Entrance.town_to_pierre_general_store, Region.pierre_store,
 | 
					    ConnectionData(Entrance.town_to_pierre_general_store, RegionName.pierre_store,
 | 
				
			||||||
                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.enter_sunroom, Region.sunroom, flag=RandomizationFlag.BUILDINGS),
 | 
					    ConnectionData(Entrance.enter_sunroom, RegionName.sunroom, flag=RandomizationFlag.BUILDINGS),
 | 
				
			||||||
    ConnectionData(Entrance.town_to_clint_blacksmith, Region.blacksmith,
 | 
					    ConnectionData(Entrance.town_to_clint_blacksmith, RegionName.blacksmith,
 | 
				
			||||||
                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.town_to_saloon, Region.saloon,
 | 
					    ConnectionData(Entrance.town_to_saloon, RegionName.saloon,
 | 
				
			||||||
                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.play_journey_of_the_prairie_king, Region.jotpk_world_1),
 | 
					    ConnectionData(Entrance.play_journey_of_the_prairie_king, RegionName.jotpk_world_1),
 | 
				
			||||||
    ConnectionData(Entrance.reach_jotpk_world_2, Region.jotpk_world_2),
 | 
					    ConnectionData(Entrance.reach_jotpk_world_2, RegionName.jotpk_world_2),
 | 
				
			||||||
    ConnectionData(Entrance.reach_jotpk_world_3, Region.jotpk_world_3),
 | 
					    ConnectionData(Entrance.reach_jotpk_world_3, RegionName.jotpk_world_3),
 | 
				
			||||||
    ConnectionData(Entrance.play_junimo_kart, Region.junimo_kart_1),
 | 
					    ConnectionData(Entrance.play_junimo_kart, RegionName.junimo_kart_1),
 | 
				
			||||||
    ConnectionData(Entrance.reach_junimo_kart_2, Region.junimo_kart_2),
 | 
					    ConnectionData(Entrance.reach_junimo_kart_2, RegionName.junimo_kart_2),
 | 
				
			||||||
    ConnectionData(Entrance.reach_junimo_kart_3, Region.junimo_kart_3),
 | 
					    ConnectionData(Entrance.reach_junimo_kart_3, RegionName.junimo_kart_3),
 | 
				
			||||||
    ConnectionData(Entrance.reach_junimo_kart_4, Region.junimo_kart_4),
 | 
					    ConnectionData(Entrance.reach_junimo_kart_4, RegionName.junimo_kart_4),
 | 
				
			||||||
    ConnectionData(Entrance.town_to_sam_house, Region.sam_house,
 | 
					    ConnectionData(Entrance.town_to_sam_house, RegionName.sam_house,
 | 
				
			||||||
                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.town_to_haley_house, Region.haley_house,
 | 
					    ConnectionData(Entrance.town_to_haley_house, RegionName.haley_house,
 | 
				
			||||||
                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.town_to_mayor_manor, Region.mayor_house,
 | 
					    ConnectionData(Entrance.town_to_mayor_manor, RegionName.mayor_house,
 | 
				
			||||||
                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.town_to_alex_house, Region.alex_house,
 | 
					    ConnectionData(Entrance.town_to_alex_house, RegionName.alex_house,
 | 
				
			||||||
                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.town_to_trailer, Region.trailer,
 | 
					    ConnectionData(Entrance.town_to_trailer, RegionName.trailer,
 | 
				
			||||||
                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.town_to_museum, Region.museum,
 | 
					    ConnectionData(Entrance.town_to_museum, RegionName.museum,
 | 
				
			||||||
                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.town_to_jojamart, Region.jojamart,
 | 
					    ConnectionData(Entrance.town_to_jojamart, RegionName.jojamart,
 | 
				
			||||||
                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.purchase_movie_ticket, Region.movie_ticket_stand),
 | 
					    ConnectionData(Entrance.purchase_movie_ticket, RegionName.movie_ticket_stand),
 | 
				
			||||||
    ConnectionData(Entrance.enter_abandoned_jojamart, Region.abandoned_jojamart),
 | 
					    ConnectionData(Entrance.enter_abandoned_jojamart, RegionName.abandoned_jojamart),
 | 
				
			||||||
    ConnectionData(Entrance.enter_movie_theater, Region.movie_theater),
 | 
					    ConnectionData(Entrance.enter_movie_theater, RegionName.movie_theater),
 | 
				
			||||||
    ConnectionData(Entrance.town_to_beach, Region.beach),
 | 
					    ConnectionData(Entrance.town_to_beach, RegionName.beach),
 | 
				
			||||||
    ConnectionData(Entrance.enter_elliott_house, Region.elliott_house,
 | 
					    ConnectionData(Entrance.enter_elliott_house, RegionName.elliott_house,
 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.beach_to_willy_fish_shop, Region.fish_shop,
 | 
					    ConnectionData(Entrance.beach_to_willy_fish_shop, RegionName.fish_shop,
 | 
				
			||||||
                   flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.fish_shop_to_boat_tunnel, Region.boat_tunnel,
 | 
					    ConnectionData(Entrance.fish_shop_to_boat_tunnel, RegionName.boat_tunnel,
 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.boat_to_ginger_island, Region.island_south, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.boat_to_ginger_island, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.enter_tide_pools, Region.tide_pools),
 | 
					    ConnectionData(Entrance.enter_tide_pools, RegionName.tide_pools),
 | 
				
			||||||
    ConnectionData(Entrance.mountain_to_the_mines, Region.mines,
 | 
					    ConnectionData(Entrance.mountain_to_the_mines, RegionName.mines,
 | 
				
			||||||
                   flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_5, Region.mines_floor_5),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_5, RegionName.mines_floor_5),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_10, Region.mines_floor_10),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_10, RegionName.mines_floor_10),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_15, Region.mines_floor_15),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_15, RegionName.mines_floor_15),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_20, Region.mines_floor_20),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_20, RegionName.mines_floor_20),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_25, Region.mines_floor_25),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_25, RegionName.mines_floor_25),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_30, Region.mines_floor_30),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_30, RegionName.mines_floor_30),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_35, Region.mines_floor_35),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_35, RegionName.mines_floor_35),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_40, Region.mines_floor_40),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_40, RegionName.mines_floor_40),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_45, Region.mines_floor_45),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_45, RegionName.mines_floor_45),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_50, Region.mines_floor_50),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_50, RegionName.mines_floor_50),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_55, Region.mines_floor_55),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_55, RegionName.mines_floor_55),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_60, Region.mines_floor_60),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_60, RegionName.mines_floor_60),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_65, Region.mines_floor_65),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_65, RegionName.mines_floor_65),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_70, Region.mines_floor_70),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_70, RegionName.mines_floor_70),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_75, Region.mines_floor_75),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_75, RegionName.mines_floor_75),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_80, Region.mines_floor_80),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_80, RegionName.mines_floor_80),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_85, Region.mines_floor_85),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_85, RegionName.mines_floor_85),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_90, Region.mines_floor_90),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_90, RegionName.mines_floor_90),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_95, Region.mines_floor_95),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_95, RegionName.mines_floor_95),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_100, Region.mines_floor_100),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_100, RegionName.mines_floor_100),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_105, Region.mines_floor_105),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_105, RegionName.mines_floor_105),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_110, Region.mines_floor_110),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_110, RegionName.mines_floor_110),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_115, Region.mines_floor_115),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_115, RegionName.mines_floor_115),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_mines_floor_120, Region.mines_floor_120),
 | 
					    ConnectionData(Entrance.dig_to_mines_floor_120, RegionName.mines_floor_120),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_dangerous_mines_20, Region.dangerous_mines_20, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.dig_to_dangerous_mines_20, RegionName.dangerous_mines_20, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_dangerous_mines_60, Region.dangerous_mines_60, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.dig_to_dangerous_mines_60, RegionName.dangerous_mines_60, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.dig_to_dangerous_mines_100, Region.dangerous_mines_100, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.dig_to_dangerous_mines_100, RegionName.dangerous_mines_100, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.enter_skull_cavern_entrance, Region.skull_cavern_entrance,
 | 
					    ConnectionData(Entrance.enter_skull_cavern_entrance, RegionName.skull_cavern_entrance,
 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.enter_oasis, Region.oasis,
 | 
					    ConnectionData(Entrance.enter_oasis, RegionName.oasis,
 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.enter_casino, Region.casino, flag=RandomizationFlag.BUILDINGS),
 | 
					    ConnectionData(Entrance.enter_casino, RegionName.casino, flag=RandomizationFlag.BUILDINGS),
 | 
				
			||||||
    ConnectionData(Entrance.enter_skull_cavern, Region.skull_cavern),
 | 
					    ConnectionData(Entrance.enter_skull_cavern, RegionName.skull_cavern),
 | 
				
			||||||
    ConnectionData(Entrance.mine_to_skull_cavern_floor_25, Region.skull_cavern_25),
 | 
					    ConnectionData(Entrance.mine_to_skull_cavern_floor_25, RegionName.skull_cavern_25),
 | 
				
			||||||
    ConnectionData(Entrance.mine_to_skull_cavern_floor_50, Region.skull_cavern_50),
 | 
					    ConnectionData(Entrance.mine_to_skull_cavern_floor_50, RegionName.skull_cavern_50),
 | 
				
			||||||
    ConnectionData(Entrance.mine_to_skull_cavern_floor_75, Region.skull_cavern_75),
 | 
					    ConnectionData(Entrance.mine_to_skull_cavern_floor_75, RegionName.skull_cavern_75),
 | 
				
			||||||
    ConnectionData(Entrance.mine_to_skull_cavern_floor_100, Region.skull_cavern_100),
 | 
					    ConnectionData(Entrance.mine_to_skull_cavern_floor_100, RegionName.skull_cavern_100),
 | 
				
			||||||
    ConnectionData(Entrance.mine_to_skull_cavern_floor_125, Region.skull_cavern_125),
 | 
					    ConnectionData(Entrance.mine_to_skull_cavern_floor_125, RegionName.skull_cavern_125),
 | 
				
			||||||
    ConnectionData(Entrance.mine_to_skull_cavern_floor_150, Region.skull_cavern_150),
 | 
					    ConnectionData(Entrance.mine_to_skull_cavern_floor_150, RegionName.skull_cavern_150),
 | 
				
			||||||
    ConnectionData(Entrance.mine_to_skull_cavern_floor_175, Region.skull_cavern_175),
 | 
					    ConnectionData(Entrance.mine_to_skull_cavern_floor_175, RegionName.skull_cavern_175),
 | 
				
			||||||
    ConnectionData(Entrance.mine_to_skull_cavern_floor_200, Region.skull_cavern_200),
 | 
					    ConnectionData(Entrance.mine_to_skull_cavern_floor_200, RegionName.skull_cavern_200),
 | 
				
			||||||
    ConnectionData(Entrance.enter_dangerous_skull_cavern, Region.dangerous_skull_cavern, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.enter_dangerous_skull_cavern, RegionName.dangerous_skull_cavern, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.enter_witch_warp_cave, Region.witch_warp_cave, flag=RandomizationFlag.BUILDINGS),
 | 
					    ConnectionData(Entrance.enter_witch_warp_cave, RegionName.witch_warp_cave, flag=RandomizationFlag.BUILDINGS),
 | 
				
			||||||
    ConnectionData(Entrance.enter_witch_swamp, Region.witch_swamp, flag=RandomizationFlag.BUILDINGS),
 | 
					    ConnectionData(Entrance.enter_witch_swamp, RegionName.witch_swamp, flag=RandomizationFlag.BUILDINGS),
 | 
				
			||||||
    ConnectionData(Entrance.enter_witch_hut, Region.witch_hut, flag=RandomizationFlag.BUILDINGS),
 | 
					    ConnectionData(Entrance.enter_witch_hut, RegionName.witch_hut, flag=RandomizationFlag.BUILDINGS),
 | 
				
			||||||
    ConnectionData(Entrance.witch_warp_to_wizard_basement, Region.wizard_basement, flag=RandomizationFlag.BUILDINGS),
 | 
					    ConnectionData(Entrance.witch_warp_to_wizard_basement, RegionName.wizard_basement, flag=RandomizationFlag.BUILDINGS),
 | 
				
			||||||
    ConnectionData(Entrance.enter_bathhouse_entrance, Region.bathhouse_entrance,
 | 
					    ConnectionData(Entrance.enter_bathhouse_entrance, RegionName.bathhouse_entrance,
 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA),
 | 
				
			||||||
    ConnectionData(Entrance.enter_locker_room, Region.locker_room, flag=RandomizationFlag.BUILDINGS),
 | 
					    ConnectionData(Entrance.enter_locker_room, RegionName.locker_room, flag=RandomizationFlag.BUILDINGS),
 | 
				
			||||||
    ConnectionData(Entrance.enter_public_bath, Region.public_bath, flag=RandomizationFlag.BUILDINGS),
 | 
					    ConnectionData(Entrance.enter_public_bath, RegionName.public_bath, flag=RandomizationFlag.BUILDINGS),
 | 
				
			||||||
    ConnectionData(Entrance.island_south_to_west, Region.island_west, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.island_south_to_west, RegionName.island_west, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.island_south_to_north, Region.island_north, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.island_south_to_north, RegionName.island_north, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.island_south_to_east, Region.island_east, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.island_south_to_east, RegionName.island_east, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.island_south_to_southeast, Region.island_south_east,
 | 
					    ConnectionData(Entrance.island_south_to_southeast, RegionName.island_south_east,
 | 
				
			||||||
                   flag=RandomizationFlag.GINGER_ISLAND),
 | 
					                   flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.use_island_resort, Region.island_resort, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.use_island_resort, RegionName.island_resort, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.island_west_to_islandfarmhouse, Region.island_farmhouse,
 | 
					    ConnectionData(Entrance.island_west_to_islandfarmhouse, RegionName.island_farmhouse,
 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.island_west_to_gourmand_cave, Region.gourmand_frog_cave,
 | 
					    ConnectionData(Entrance.island_west_to_gourmand_cave, RegionName.gourmand_frog_cave,
 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.island_west_to_crystals_cave, Region.colored_crystals_cave,
 | 
					    ConnectionData(Entrance.island_west_to_crystals_cave, RegionName.colored_crystals_cave,
 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.island_west_to_shipwreck, Region.shipwreck,
 | 
					    ConnectionData(Entrance.island_west_to_shipwreck, RegionName.shipwreck,
 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.island_west_to_qi_walnut_room, Region.qi_walnut_room, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.island_west_to_qi_walnut_room, RegionName.qi_walnut_room, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.island_east_to_leo_hut, Region.leo_hut,
 | 
					    ConnectionData(Entrance.island_east_to_leo_hut, RegionName.leo_hut,
 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.island_east_to_island_shrine, Region.island_shrine,
 | 
					    ConnectionData(Entrance.island_east_to_island_shrine, RegionName.island_shrine,
 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.island_southeast_to_pirate_cove, Region.pirate_cove,
 | 
					    ConnectionData(Entrance.island_southeast_to_pirate_cove, RegionName.pirate_cove,
 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.island_north_to_field_office, Region.field_office,
 | 
					    ConnectionData(Entrance.island_north_to_field_office, RegionName.field_office,
 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.island_north_to_dig_site, Region.dig_site, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.island_north_to_dig_site, RegionName.dig_site, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.dig_site_to_professor_snail_cave, Region.professor_snail_cave, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.dig_site_to_professor_snail_cave, RegionName.professor_snail_cave,
 | 
				
			||||||
    ConnectionData(Entrance.island_north_to_volcano, Region.volcano,
 | 
					 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.volcano_to_secret_beach, Region.volcano_secret_beach,
 | 
					    ConnectionData(Entrance.island_north_to_volcano, RegionName.volcano,
 | 
				
			||||||
                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.talk_to_island_trader, Region.island_trader, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.volcano_to_secret_beach, RegionName.volcano_secret_beach,
 | 
				
			||||||
    ConnectionData(Entrance.climb_to_volcano_5, Region.volcano_floor_5, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					                   flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.talk_to_volcano_dwarf, Region.volcano_dwarf_shop, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.talk_to_island_trader, RegionName.island_trader, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.climb_to_volcano_10, Region.volcano_floor_10, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.climb_to_volcano_5, RegionName.volcano_floor_5, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.parrot_express_jungle_to_docks, Region.island_south, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.talk_to_volcano_dwarf, RegionName.volcano_dwarf_shop, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.parrot_express_dig_site_to_docks, Region.island_south, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.climb_to_volcano_10, RegionName.volcano_floor_10, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.parrot_express_volcano_to_docks, Region.island_south, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.parrot_express_jungle_to_docks, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.parrot_express_volcano_to_jungle, Region.island_west, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.parrot_express_dig_site_to_docks, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.parrot_express_docks_to_jungle, Region.island_west, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.parrot_express_volcano_to_docks, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.parrot_express_dig_site_to_jungle, Region.island_west, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.parrot_express_volcano_to_jungle, RegionName.island_west, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.parrot_express_docks_to_dig_site, Region.dig_site, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.parrot_express_docks_to_jungle, RegionName.island_west, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.parrot_express_volcano_to_dig_site, Region.dig_site, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.parrot_express_dig_site_to_jungle, RegionName.island_west, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.parrot_express_jungle_to_dig_site, Region.dig_site, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.parrot_express_docks_to_dig_site, RegionName.dig_site, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.parrot_express_dig_site_to_volcano, Region.island_north, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.parrot_express_volcano_to_dig_site, RegionName.dig_site, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.parrot_express_docks_to_volcano, Region.island_north, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.parrot_express_jungle_to_dig_site, RegionName.dig_site, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
    ConnectionData(Entrance.parrot_express_jungle_to_volcano, Region.island_north, flag=RandomizationFlag.GINGER_ISLAND),
 | 
					    ConnectionData(Entrance.parrot_express_dig_site_to_volcano, RegionName.island_north, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
 | 
					    ConnectionData(Entrance.parrot_express_docks_to_volcano, RegionName.island_north, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
 | 
					    ConnectionData(Entrance.parrot_express_jungle_to_volcano, RegionName.island_north, flag=RandomizationFlag.GINGER_ISLAND),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ConnectionData(LogicEntrance.talk_to_mines_dwarf, LogicRegion.mines_dwarf_shop),
 | 
					    ConnectionData(LogicEntrance.talk_to_mines_dwarf, LogicRegion.mines_dwarf_shop),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -708,7 +709,7 @@ def swap_connections_until_valid(regions_by_name, connections_by_name: Dict[str,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def region_should_be_reachable(region_name: str, connections_in_slot: Iterable[ConnectionData]) -> bool:
 | 
					def region_should_be_reachable(region_name: str, connections_in_slot: Iterable[ConnectionData]) -> bool:
 | 
				
			||||||
    if region_name == Region.menu:
 | 
					    if region_name == RegionName.menu:
 | 
				
			||||||
        return True
 | 
					        return True
 | 
				
			||||||
    for connection in connections_in_slot:
 | 
					    for connection in connections_in_slot:
 | 
				
			||||||
        if region_name == connection.destination:
 | 
					        if region_name == connection.destination:
 | 
				
			||||||
| 
						 | 
					@ -718,11 +719,11 @@ def region_should_be_reachable(region_name: str, connections_in_slot: Iterable[C
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def find_reachable_regions(regions_by_name, connections_by_name,
 | 
					def find_reachable_regions(regions_by_name, connections_by_name,
 | 
				
			||||||
                           randomized_connections: Dict[ConnectionData, ConnectionData]):
 | 
					                           randomized_connections: Dict[ConnectionData, ConnectionData]):
 | 
				
			||||||
    reachable_regions = {Region.menu}
 | 
					    reachable_regions = {RegionName.menu}
 | 
				
			||||||
    unreachable_regions = {region for region in regions_by_name.keys()}
 | 
					    unreachable_regions = {region for region in regions_by_name.keys()}
 | 
				
			||||||
    # unreachable_regions = {region for region in regions_by_name.keys() if region_should_be_reachable(region, connections_by_name.values())}
 | 
					    # unreachable_regions = {region for region in regions_by_name.keys() if region_should_be_reachable(region, connections_by_name.values())}
 | 
				
			||||||
    unreachable_regions.remove(Region.menu)
 | 
					    unreachable_regions.remove(RegionName.menu)
 | 
				
			||||||
    exits_to_explore = list(regions_by_name[Region.menu].exits)
 | 
					    exits_to_explore = list(regions_by_name[RegionName.menu].exits)
 | 
				
			||||||
    while exits_to_explore:
 | 
					    while exits_to_explore:
 | 
				
			||||||
        exit_name = exits_to_explore.pop()
 | 
					        exit_name = exits_to_explore.pop()
 | 
				
			||||||
        # if exit_name not in connections_by_name:
 | 
					        # if exit_name not in connections_by_name:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,7 +12,7 @@ from typing import List
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from worlds.stardew_valley import LocationData
 | 
					from worlds.stardew_valley import LocationData
 | 
				
			||||||
from worlds.stardew_valley.items import load_item_csv, Group, ItemData
 | 
					from worlds.stardew_valley.items import load_item_csv, Group, ItemData
 | 
				
			||||||
from worlds.stardew_valley.locations import load_location_csv, LocationTags
 | 
					from worlds.stardew_valley.locations import load_location_csv
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RESOURCE_PACK_CODE_OFFSET = 5000
 | 
					RESOURCE_PACK_CODE_OFFSET = 5000
 | 
				
			||||||
script_folder = Path(__file__)
 | 
					script_folder = Path(__file__)
 | 
				
			||||||
| 
						 | 
					@ -56,9 +56,9 @@ if __name__ == "__main__":
 | 
				
			||||||
                                       and item.code_without_offset is not None) + 1)
 | 
					                                       and item.code_without_offset is not None) + 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    resource_pack_counter = itertools.count(max(item.code_without_offset
 | 
					    resource_pack_counter = itertools.count(max(item.code_without_offset
 | 
				
			||||||
                                       for item in loaded_items
 | 
					                                                for item in loaded_items
 | 
				
			||||||
                                       if Group.RESOURCE_PACK in item.groups
 | 
					                                                if Group.RESOURCE_PACK in item.groups
 | 
				
			||||||
                                       and item.code_without_offset is not None) + 1)
 | 
					                                                and item.code_without_offset is not None) + 1)
 | 
				
			||||||
    items_to_write = []
 | 
					    items_to_write = []
 | 
				
			||||||
    for item in loaded_items:
 | 
					    for item in loaded_items:
 | 
				
			||||||
        if item.code_without_offset is None:
 | 
					        if item.code_without_offset is None:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,7 @@ from dataclasses import dataclass, field
 | 
				
			||||||
from functools import cached_property
 | 
					from functools import cached_property
 | 
				
			||||||
from itertools import chain
 | 
					from itertools import chain
 | 
				
			||||||
from threading import Lock
 | 
					from threading import Lock
 | 
				
			||||||
from typing import Iterable, Dict, List, Union, Sized, Hashable, Callable, Tuple, Set, Optional
 | 
					from typing import Iterable, Dict, List, Union, Sized, Hashable, Callable, Tuple, Set, Optional, cast
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from BaseClasses import CollectionState
 | 
					from BaseClasses import CollectionState
 | 
				
			||||||
from .literal import true_, false_, LiteralStardewRule
 | 
					from .literal import true_, false_, LiteralStardewRule
 | 
				
			||||||
| 
						 | 
					@ -318,6 +318,7 @@ class Or(AggregatingStardewRule):
 | 
				
			||||||
            return Or(_combinable_rules=other.add_into(self.combinable_rules, self.combine), _simplification_state=self.simplification_state)
 | 
					            return Or(_combinable_rules=other.add_into(self.combinable_rules, self.combine), _simplification_state=self.simplification_state)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if type(other) is Or:
 | 
					        if type(other) is Or:
 | 
				
			||||||
 | 
					            other = cast(Or, other)
 | 
				
			||||||
            return Or(_combinable_rules=self.merge(self.combinable_rules, other.combinable_rules),
 | 
					            return Or(_combinable_rules=self.merge(self.combinable_rules, other.combinable_rules),
 | 
				
			||||||
                      _simplification_state=self.simplification_state.merge(other.simplification_state))
 | 
					                      _simplification_state=self.simplification_state.merge(other.simplification_state))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -344,6 +345,7 @@ class And(AggregatingStardewRule):
 | 
				
			||||||
            return And(_combinable_rules=other.add_into(self.combinable_rules, self.combine), _simplification_state=self.simplification_state)
 | 
					            return And(_combinable_rules=other.add_into(self.combinable_rules, self.combine), _simplification_state=self.simplification_state)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if type(other) is And:
 | 
					        if type(other) is And:
 | 
				
			||||||
 | 
					            other = cast(And, other)
 | 
				
			||||||
            return And(_combinable_rules=self.merge(self.combinable_rules, other.combinable_rules),
 | 
					            return And(_combinable_rules=self.merge(self.combinable_rules, other.combinable_rules),
 | 
				
			||||||
                       _simplification_state=self.simplification_state.merge(other.simplification_state))
 | 
					                       _simplification_state=self.simplification_state.merge(other.simplification_state))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,8 +53,6 @@ class TestDifferentSettings(SVTestCase):
 | 
				
			||||||
    def test_money_rule_caching(self):
 | 
					    def test_money_rule_caching(self):
 | 
				
			||||||
        options_festivals_limited_money = {FestivalLocations.internal_name: FestivalLocations.option_easy,
 | 
					        options_festivals_limited_money = {FestivalLocations.internal_name: FestivalLocations.option_easy,
 | 
				
			||||||
                                           StartingMoney.internal_name: 5000}
 | 
					                                           StartingMoney.internal_name: 5000}
 | 
				
			||||||
        options_festivals_limited_money = {FestivalLocations.internal_name: FestivalLocations.option_easy,
 | 
					 | 
				
			||||||
                                           StartingMoney.internal_name: 5000}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        multiplayer_options = [options_festivals_limited_money, options_festivals_limited_money]
 | 
					        multiplayer_options = [options_festivals_limited_money, options_festivals_limited_money]
 | 
				
			||||||
        multiworld = setup_multiworld(multiplayer_options)
 | 
					        multiworld = setup_multiworld(multiplayer_options)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,7 @@ class TestWalnutsanityNone(SVTestBase):
 | 
				
			||||||
        self.collect("Island Obelisk")
 | 
					        self.collect("Island Obelisk")
 | 
				
			||||||
        self.collect("Island West Turtle")
 | 
					        self.collect("Island West Turtle")
 | 
				
			||||||
        self.collect("Progressive House")
 | 
					        self.collect("Progressive House")
 | 
				
			||||||
        items = self.collect("5 Golden Walnuts", 10)
 | 
					        self.collect("5 Golden Walnuts", 10)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player))
 | 
					        self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player))
 | 
				
			||||||
        self.collect("Island North Turtle")
 | 
					        self.collect("Island North Turtle")
 | 
				
			||||||
| 
						 | 
					@ -126,10 +126,10 @@ class TestWalnutsanityPuzzlesAndBushes(SVTestBase):
 | 
				
			||||||
        # You need to receive 25, and collect 15
 | 
					        # You need to receive 25, and collect 15
 | 
				
			||||||
        self.collect("Island Obelisk")
 | 
					        self.collect("Island Obelisk")
 | 
				
			||||||
        self.collect("Island West Turtle")
 | 
					        self.collect("Island West Turtle")
 | 
				
			||||||
        items = self.collect("5 Golden Walnuts", 5)
 | 
					        self.collect("5 Golden Walnuts", 5)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player))
 | 
					        self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player))
 | 
				
			||||||
        items = self.collect("Island North Turtle")
 | 
					        self.collect("Island North Turtle")
 | 
				
			||||||
        self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player))
 | 
					        self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -203,7 +203,7 @@ class TestWalnutsanityAll(SVTestBase):
 | 
				
			||||||
        self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player))
 | 
					        self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player))
 | 
				
			||||||
        self.remove(items)
 | 
					        self.remove(items)
 | 
				
			||||||
        self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player))
 | 
					        self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player))
 | 
				
			||||||
        items = self.collect("5 Golden Walnuts", 4)
 | 
					        self.collect("5 Golden Walnuts", 4)
 | 
				
			||||||
        items = self.collect("3 Golden Walnuts", 6)
 | 
					        self.collect("3 Golden Walnuts", 6)
 | 
				
			||||||
        items = self.collect("Golden Walnut", 2)
 | 
					        self.collect("Golden Walnut", 2)
 | 
				
			||||||
        self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player))
 | 
					        self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,4 @@
 | 
				
			||||||
from ...options import SeasonRandomization, Friendsanity, FriendsanityHeartSize, Fishsanity, ExcludeGingerIsland, SkillProgression, ToolProgression, \
 | 
					from ...options import SeasonRandomization, Fishsanity, ExcludeGingerIsland, SkillProgression, ToolProgression, ElevatorProgression, SpecialOrderLocations
 | 
				
			||||||
    ElevatorProgression, SpecialOrderLocations
 | 
					 | 
				
			||||||
from ...strings.fish_names import Fish
 | 
					from ...strings.fish_names import Fish
 | 
				
			||||||
from ...test import SVTestBase
 | 
					from ...test import SVTestBase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue