diff --git a/worlds/v6/Options.py b/worlds/v6/Options.py index fac891ba..7af89fd1 100644 --- a/worlds/v6/Options.py +++ b/worlds/v6/Options.py @@ -1,5 +1,5 @@ import typing -from Options import Option, DeathLink, Range +from Options import Option, DeathLink, Range, Toggle class DoorCost(Range): """Amount of Trinkets required to enter Areas. Set to 0 to disable artificial locks.""" @@ -13,7 +13,12 @@ class DeathLinkAmnesty(Range): range_end = 30 default = 15 +class AreaRandomizer(Toggle): + """Randomize Entrances to Areas""" + displayname = "Area Randomizer" + v6_options: typing.Dict[str,type(Option)] = { + "AreaRandomizer": AreaRandomizer, "DoorCost": DoorCost, "DeathLink": DeathLink, "DeathLinkAmnesty": DeathLinkAmnesty diff --git a/worlds/v6/Regions.py b/worlds/v6/Regions.py index e81814c1..aec1c81d 100644 --- a/worlds/v6/Regions.py +++ b/worlds/v6/Regions.py @@ -2,6 +2,8 @@ import typing from BaseClasses import MultiWorld, Region, Entrance, Location, RegionType from .Locations import V6Location, location_table +v6areas = ["Laboratory", "The Tower", "Space Station 2", "Warp Zone"] + def create_regions(world: MultiWorld, player: int): regOvr = Region("Menu", RegionType.Generic, "Dimension VVVVVV", player, world) locOvr_names = ["Overworld (Pipe-shaped Segment)", "Overworld (Left of Ship)", "Overworld (Square Room)", "Overworld (Sad Elephant)", diff --git a/worlds/v6/Rules.py b/worlds/v6/Rules.py index e25a6663..e4208d06 100644 --- a/worlds/v6/Rules.py +++ b/worlds/v6/Rules.py @@ -1,6 +1,8 @@ import typing from ..generic.Rules import add_rule -from .Regions import connect_regions +from .Regions import connect_regions, v6areas + +area_connections = {} def _has_trinket_range(state,player,start,end) -> bool: for i in range(start,end): @@ -8,11 +10,17 @@ def _has_trinket_range(state,player,start,end) -> bool: return False return True -def set_rules(world,player): - connect_regions(world, player, "Menu", "Laboratory", lambda state: _has_trinket_range(state,player,0,world.DoorCost[player].value)) - connect_regions(world, player, "Menu", "The Tower", lambda state: _has_trinket_range(state,player,world.DoorCost[player].value,world.DoorCost[player].value*2)) - connect_regions(world, player, "Menu", "Space Station 2", lambda state: _has_trinket_range(state,player,world.DoorCost[player].value*2,world.DoorCost[player].value*3)) - connect_regions(world, player, "Menu", "Warp Zone", lambda state: _has_trinket_range(state,player,world.DoorCost[player].value*3,world.DoorCost[player].value*4)) +def set_rules(world,player,area_connections): + areashuffle = list(range(len(v6areas))) + if (world.AreaRandomizer[player].value): + world.random.shuffle(areashuffle) + area_connections.update({(index+1): (value+1) for index, value in enumerate(areashuffle)}) + area_connections.update({0:0}) + + connect_regions(world, player, "Menu", v6areas[area_connections[1]-1], lambda state: _has_trinket_range(state,player,0,world.DoorCost[player].value)) + connect_regions(world, player, "Menu", v6areas[area_connections[2]-1], lambda state: _has_trinket_range(state,player,world.DoorCost[player].value,world.DoorCost[player].value*2)) + connect_regions(world, player, "Menu", v6areas[area_connections[3]-1], lambda state: _has_trinket_range(state,player,world.DoorCost[player].value*2,world.DoorCost[player].value*3)) + connect_regions(world, player, "Menu", v6areas[area_connections[4]-1], lambda state: _has_trinket_range(state,player,world.DoorCost[player].value*3,world.DoorCost[player].value*4)) #Special Rule for V add_rule(world.get_location("V",player), lambda state : state.can_reach("Laboratory",'Region',player) and @@ -24,9 +32,4 @@ def set_rules(world,player): add_rule(world.get_location("NPC Trinket",player), lambda state: state.can_reach("Laboratory",'Region',player) or state.can_reach("Space Station 2",'Region',player)) - connect_regions(world, player, "Laboratory", "Menu", lambda state: True) - connect_regions(world, player, "The Tower", "Menu", lambda state: True) - connect_regions(world, player, "Space Station 2", "Menu", lambda state: True) - connect_regions(world, player, "Warp Zone", "Menu", lambda state: True) - world.completion_condition[player] = lambda state: state.can_reach("V",'Location',player) diff --git a/worlds/v6/__init__.py b/worlds/v6/__init__.py index 1804d0cc..62ef4d8a 100644 --- a/worlds/v6/__init__.py +++ b/worlds/v6/__init__.py @@ -2,7 +2,7 @@ import string from .Items import item_table, V6Item from .Locations import location_table, V6Location from .Options import v6_options -from .Rules import set_rules +from .Rules import set_rules, area_connections from .Regions import create_regions from BaseClasses import Region, RegionType, Entrance, Item, MultiWorld from ..AutoWorld import World @@ -23,13 +23,16 @@ class V6World(World): data_version = 1 forced_auto_forfeit = False + area_connections = {} + options = v6_options def create_regions(self): create_regions(self.world,self.player) def set_rules(self): - set_rules(self.world,self.player) + self.area_connections = {} + set_rules(self.world,self.player,self.area_connections) def create_item(self, name: str) -> Item: return V6Item(name, True, item_table[name], self.player) @@ -39,6 +42,7 @@ class V6World(World): def fill_slot_data(self): return { + "AreaRando": self.area_connections, "DoorCost": self.world.DoorCost[self.player].value, "DeathLink": self.world.DeathLink[self.player].value, "DeathLink_Amnesty": self.world.DeathLinkAmnesty[self.player].value