Core: reduce memory use of "Entrance" class
SM64: reduce count of lambda creations (memory/cpu speedup)
This commit is contained in:
		
							parent
							
								
									ad75ee8c50
								
							
						
					
					
						commit
						170213e6d4
					
				|  | @ -903,18 +903,22 @@ class Region(object): | ||||||
|         return self.world.get_name_string_for_object(self) if self.world else f'{self.name} (Player {self.player})' |         return self.world.get_name_string_for_object(self) if self.world else f'{self.name} (Player {self.player})' | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class Entrance(object): | class Entrance: | ||||||
|     spot_type = 'Entrance' |     spot_type = 'Entrance' | ||||||
|  |     access_rule: Callable[[CollectionState], bool] = staticmethod(lambda state: True) | ||||||
|  |     hide_path: bool = False | ||||||
|  |     player: int | ||||||
|  |     name: str | ||||||
|  |     parent_region: Optional[Region] | ||||||
|  |     connected_region: Optional[Region] = None | ||||||
|  |     # LttP specific, TODO: should make a LttPEntrance | ||||||
|  |     addresses = None | ||||||
|  |     target = None | ||||||
| 
 | 
 | ||||||
|     def __init__(self, player: int, name: str = '', parent=None): |     def __init__(self, player: int, name: str = '', parent=None): | ||||||
|         self.name = name |         self.name = name | ||||||
|         self.parent_region = parent |         self.parent_region = parent | ||||||
|         self.connected_region = None |  | ||||||
|         self.target = None |  | ||||||
|         self.addresses = None |  | ||||||
|         self.access_rule = lambda state: True |  | ||||||
|         self.player = player |         self.player = player | ||||||
|         self.hide_path = False |  | ||||||
| 
 | 
 | ||||||
|     def can_reach(self, state: CollectionState) -> bool: |     def can_reach(self, state: CollectionState) -> bool: | ||||||
|         if self.parent_region.can_reach(state) and self.access_rule(state): |         if self.parent_region.can_reach(state) and self.access_rule(state): | ||||||
|  |  | ||||||
|  | @ -1,16 +1,18 @@ | ||||||
| import typing | import typing | ||||||
| from BaseClasses import MultiWorld, Region, Entrance, Location, RegionType | from BaseClasses import MultiWorld, Region, Entrance, Location, RegionType | ||||||
| from .Locations import SM64Location, location_table,locBoB_table,locWhomp_table,locJRB_table,locCCM_table,locBBH_table, \ | from .Locations import SM64Location, location_table, locBoB_table, locWhomp_table, locJRB_table, locCCM_table, \ | ||||||
|  |     locBBH_table, \ | ||||||
|     locHMC_table, locLLL_table, locSSL_table, locDDD_table, locSL_table, \ |     locHMC_table, locLLL_table, locSSL_table, locDDD_table, locSL_table, \ | ||||||
|     locWDW_table, locTTM_table, locTHI_table, locTTC_table, locRR_table, \ |     locWDW_table, locTTM_table, locTHI_table, locTTC_table, locRR_table, \ | ||||||
|     locBitDW_table, locBitFS_table, locSS_table, locCap_table |     locBitDW_table, locBitFS_table, locSS_table, locCap_table | ||||||
| 
 | 
 | ||||||
| sm64courses = ["Bob-omb Battlefield", "Whomp's Fortress", "Jolly Roger Bay", "Cool, Cool Mountain", "Big Boo's Haunt", | sm64courses = ["Bob-omb Battlefield", "Whomp's Fortress", "Jolly Roger Bay", "Cool, Cool Mountain", "Big Boo's Haunt", | ||||||
|                "Hazy Maze Cave", "Lethal Lava Land", "Shifting Sand Land", "Dire, Dire Docks", "Snowman's Land", "Wet-Dry World", |                "Hazy Maze Cave", "Lethal Lava Land", "Shifting Sand Land", "Dire, Dire Docks", "Snowman's Land", | ||||||
|  |                "Wet-Dry World", | ||||||
|                "Tall, Tall Mountain", "Tiny-Huge Island", "Tick Tock Clock", "Rainbow Ride"] |                "Tall, Tall Mountain", "Tiny-Huge Island", "Tick Tock Clock", "Rainbow Ride"] | ||||||
| 
 | 
 | ||||||
| def create_regions(world: MultiWorld, player: int): |  | ||||||
| 
 | 
 | ||||||
|  | def create_regions(world: MultiWorld, player: int): | ||||||
|     regSS = Region("Menu", RegionType.Generic, "Castle Area", player, world) |     regSS = Region("Menu", RegionType.Generic, "Castle Area", player, world) | ||||||
|     locSS_names = [name for name, id in locSS_table.items()] |     locSS_names = [name for name, id in locSS_table.items()] | ||||||
|     locSS_names += [name for name, id in locCap_table.items()] |     locSS_names += [name for name, id in locCap_table.items()] | ||||||
|  | @ -26,7 +28,8 @@ def create_regions(world: MultiWorld, player: int): | ||||||
| 
 | 
 | ||||||
|     regWhomp = Region("Whomp's Fortress", RegionType.Generic, "Whomp's Fortress", player, world) |     regWhomp = Region("Whomp's Fortress", RegionType.Generic, "Whomp's Fortress", player, world) | ||||||
|     locWhomp_names = [name for name, id in locWhomp_table.items()] |     locWhomp_names = [name for name, id in locWhomp_table.items()] | ||||||
|     regWhomp.locations += [SM64Location(player, loc_name, location_table[loc_name], regWhomp) for loc_name in locWhomp_names] |     regWhomp.locations += [SM64Location(player, loc_name, location_table[loc_name], regWhomp) for loc_name in | ||||||
|  |                            locWhomp_names] | ||||||
|     if (world.EnableCoinStars[player].value): |     if (world.EnableCoinStars[player].value): | ||||||
|         regWhomp.locations.append(SM64Location(player, "WF: 100 Coins", location_table["WF: 100 Coins"], regWhomp)) |         regWhomp.locations.append(SM64Location(player, "WF: 100 Coins", location_table["WF: 100 Coins"], regWhomp)) | ||||||
|     world.regions.append(regWhomp) |     world.regions.append(regWhomp) | ||||||
|  | @ -54,7 +57,8 @@ def create_regions(world: MultiWorld, player: int): | ||||||
| 
 | 
 | ||||||
|     regBitDW = Region("Bowser in the Dark World", RegionType.Generic, "Bowser in the Dark World", player, world) |     regBitDW = Region("Bowser in the Dark World", RegionType.Generic, "Bowser in the Dark World", player, world) | ||||||
|     locBitDW_names = [name for name, id in locBitDW_table.items()] |     locBitDW_names = [name for name, id in locBitDW_table.items()] | ||||||
|     regBitDW.locations += [SM64Location(player, loc_name, location_table[loc_name], regBitDW) for loc_name in locBitDW_names] |     regBitDW.locations += [SM64Location(player, loc_name, location_table[loc_name], regBitDW) for loc_name in | ||||||
|  |                            locBitDW_names] | ||||||
|     world.regions.append(regBitDW) |     world.regions.append(regBitDW) | ||||||
| 
 | 
 | ||||||
|     regBasement = Region("Basement", RegionType.Generic, "Basement", player, world) |     regBasement = Region("Basement", RegionType.Generic, "Basement", player, world) | ||||||
|  | @ -90,7 +94,8 @@ def create_regions(world: MultiWorld, player: int): | ||||||
| 
 | 
 | ||||||
|     regBitFS = Region("Bowser in the Fire Sea", RegionType.Generic, "Bowser in the Fire Sea", player, world) |     regBitFS = Region("Bowser in the Fire Sea", RegionType.Generic, "Bowser in the Fire Sea", player, world) | ||||||
|     locBitFS_names = [name for name, id in locBitFS_table.items()] |     locBitFS_names = [name for name, id in locBitFS_table.items()] | ||||||
|     regBitFS.locations += [SM64Location(player, loc_name, location_table[loc_name], regBitFS) for loc_name in locBitFS_names] |     regBitFS.locations += [SM64Location(player, loc_name, location_table[loc_name], regBitFS) for loc_name in | ||||||
|  |                            locBitFS_names] | ||||||
|     world.regions.append(regBitFS) |     world.regions.append(regBitFS) | ||||||
| 
 | 
 | ||||||
|     regFloor2 = Region("Second Floor", RegionType.Generic, "Second Floor", player, world) |     regFloor2 = Region("Second Floor", RegionType.Generic, "Second Floor", player, world) | ||||||
|  | @ -142,11 +147,12 @@ def create_regions(world: MultiWorld, player: int): | ||||||
|     world.regions.append(regRR) |     world.regions.append(regRR) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def connect_regions(world: MultiWorld, player: int, source: str, target: str, rule): | def connect_regions(world: MultiWorld, player: int, source: str, target: str, rule=None): | ||||||
|     sourceRegion = world.get_region(source, player) |     sourceRegion = world.get_region(source, player) | ||||||
|     targetRegion = world.get_region(target, player) |     targetRegion = world.get_region(target, player) | ||||||
| 
 | 
 | ||||||
|     connection = Entrance(player, '', sourceRegion) |     connection = Entrance(player, '', sourceRegion) | ||||||
|  |     if rule: | ||||||
|         connection.access_rule = rule |         connection.access_rule = rule | ||||||
| 
 | 
 | ||||||
|     sourceRegion.exits.append(connection) |     sourceRegion.exits.append(connection) | ||||||
|  |  | ||||||
|  | @ -1,14 +1,14 @@ | ||||||
| import typing |  | ||||||
| from ..generic.Rules import add_rule | from ..generic.Rules import add_rule | ||||||
| from .Regions import connect_regions, sm64courses | from .Regions import connect_regions, sm64courses | ||||||
| 
 | 
 | ||||||
| def set_rules(world,player,area_connections): | 
 | ||||||
|  | def set_rules(world, player: int, area_connections): | ||||||
|     courseshuffle = list(range(len(sm64courses))) |     courseshuffle = list(range(len(sm64courses))) | ||||||
|     if (world.AreaRandomizer[player].value): |     if world.AreaRandomizer[player].value: | ||||||
|         world.random.shuffle(courseshuffle) |         world.random.shuffle(courseshuffle) | ||||||
|     area_connections.update({index: value for index, value in enumerate(courseshuffle)}) |     area_connections.update({index: value for index, value in enumerate(courseshuffle)}) | ||||||
| 
 | 
 | ||||||
|     connect_regions(world, player, "Menu", sm64courses[area_connections[0]], lambda state: True) |     connect_regions(world, player, "Menu", sm64courses[area_connections[0]]) | ||||||
|     connect_regions(world, player, "Menu", sm64courses[area_connections[1]], lambda state: state.has("Power Star", player, 1)) |     connect_regions(world, player, "Menu", sm64courses[area_connections[1]], lambda state: state.has("Power Star", player, 1)) | ||||||
|     connect_regions(world, player, "Menu", sm64courses[area_connections[2]], lambda state: state.has("Power Star", player, 3)) |     connect_regions(world, player, "Menu", sm64courses[area_connections[2]], lambda state: state.has("Power Star", player, 3)) | ||||||
|     connect_regions(world, player, "Menu", sm64courses[area_connections[3]], lambda state: state.has("Power Star", player, 3)) |     connect_regions(world, player, "Menu", sm64courses[area_connections[3]], lambda state: state.has("Power Star", player, 3)) | ||||||
|  | @ -17,24 +17,24 @@ def set_rules(world,player,area_connections): | ||||||
| 
 | 
 | ||||||
|     connect_regions(world, player, "Menu", "Basement", lambda state: state.has("Basement Key", player) or state.has("Progressive Key", player, 1)) |     connect_regions(world, player, "Menu", "Basement", lambda state: state.has("Basement Key", player) or state.has("Progressive Key", player, 1)) | ||||||
| 
 | 
 | ||||||
|     connect_regions(world, player, "Basement", sm64courses[area_connections[5]], lambda state: True) |     connect_regions(world, player, "Basement", sm64courses[area_connections[5]]) | ||||||
|     connect_regions(world, player, "Basement", sm64courses[area_connections[6]], lambda state: True) |     connect_regions(world, player, "Basement", sm64courses[area_connections[6]]) | ||||||
|     connect_regions(world, player, "Basement", sm64courses[area_connections[7]], lambda state: True) |     connect_regions(world, player, "Basement", sm64courses[area_connections[7]]) | ||||||
|     connect_regions(world, player, "Basement", sm64courses[area_connections[8]], lambda state: state.has("Power Star", player, 30)) |     connect_regions(world, player, "Basement", sm64courses[area_connections[8]], lambda state: state.has("Power Star", player, 30)) | ||||||
|     connect_regions(world, player, "Basement", "Bowser in the Fire Sea", lambda state: state.has("Power Star", player, 30) and |     connect_regions(world, player, "Basement", "Bowser in the Fire Sea", lambda state: state.has("Power Star", player, 30) and | ||||||
|                                                                                        state.can_reach("Dire, Dire Docks", 'Region', player)) |                                                                                        state.can_reach("Dire, Dire Docks", 'Region', player)) | ||||||
| 
 | 
 | ||||||
|     connect_regions(world, player, "Menu", "Second Floor", lambda state: state.has("Second Floor Key", player) or state.has("Progressive Key", player, 2)) |     connect_regions(world, player, "Menu", "Second Floor", lambda state: state.has("Second Floor Key", player) or state.has("Progressive Key", player, 2)) | ||||||
| 
 | 
 | ||||||
|     connect_regions(world, player, "Second Floor", sm64courses[area_connections[9]], lambda state: True) |     connect_regions(world, player, "Second Floor", sm64courses[area_connections[9]]) | ||||||
|     connect_regions(world, player, "Second Floor", sm64courses[area_connections[10]], lambda state: True) |     connect_regions(world, player, "Second Floor", sm64courses[area_connections[10]]) | ||||||
|     connect_regions(world, player, "Second Floor", sm64courses[area_connections[11]], lambda state: True) |     connect_regions(world, player, "Second Floor", sm64courses[area_connections[11]]) | ||||||
|     connect_regions(world, player, "Second Floor", sm64courses[area_connections[12]], lambda state: True) |     connect_regions(world, player, "Second Floor", sm64courses[area_connections[12]]) | ||||||
| 
 | 
 | ||||||
|     connect_regions(world, player, "Second Floor", "Third Floor", lambda state: state.has("Power Star", player, 50)) |     connect_regions(world, player, "Second Floor", "Third Floor", lambda state: state.has("Power Star", player, 50)) | ||||||
| 
 | 
 | ||||||
|     connect_regions(world, player, "Third Floor", sm64courses[area_connections[13]], lambda state: True) |     connect_regions(world, player, "Third Floor", sm64courses[area_connections[13]]) | ||||||
|     connect_regions(world, player, "Third Floor", sm64courses[area_connections[14]], lambda state: True) |     connect_regions(world, player, "Third Floor", sm64courses[area_connections[14]]) | ||||||
| 
 | 
 | ||||||
|     #Special Rules for some Locations |     #Special Rules for some Locations | ||||||
|     add_rule(world.get_location("Tower of the Wing Cap Switch", player), lambda state: state.has("Power Star", player, 10)) |     add_rule(world.get_location("Tower of the Wing Cap Switch", player), lambda state: state.has("Power Star", player, 10)) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue