remove collections_extended dependency and replace with much faster stdlib Counter
This commit is contained in:
@@ -2,7 +2,7 @@ import copy
|
|||||||
from enum import Enum, unique, Flag
|
from enum import Enum, unique, Flag
|
||||||
import logging
|
import logging
|
||||||
import json
|
import json
|
||||||
from collections import OrderedDict, deque, defaultdict
|
from collections import OrderedDict, Counter, deque, defaultdict
|
||||||
|
|
||||||
from source.classes.BabelFish import BabelFish
|
from source.classes.BabelFish import BabelFish
|
||||||
from EntranceShuffle import door_addresses
|
from EntranceShuffle import door_addresses
|
||||||
@@ -235,41 +235,41 @@ class World(object):
|
|||||||
if ret.has('Golden Sword', item.player):
|
if ret.has('Golden Sword', item.player):
|
||||||
pass
|
pass
|
||||||
elif ret.has('Tempered Sword', item.player) and self.difficulty_requirements[item.player].progressive_sword_limit >= 4:
|
elif ret.has('Tempered Sword', item.player) and self.difficulty_requirements[item.player].progressive_sword_limit >= 4:
|
||||||
ret.prog_items.add(('Golden Sword', item.player))
|
ret.prog_items['Golden Sword', item.player] += 1
|
||||||
elif ret.has('Master Sword', item.player) and self.difficulty_requirements[item.player].progressive_sword_limit >= 3:
|
elif ret.has('Master Sword', item.player) and self.difficulty_requirements[item.player].progressive_sword_limit >= 3:
|
||||||
ret.prog_items.add(('Tempered Sword', item.player))
|
ret.prog_items['Tempered Sword', item.player] += 1
|
||||||
elif ret.has('Fighter Sword', item.player) and self.difficulty_requirements[item.player].progressive_sword_limit >= 2:
|
elif ret.has('Fighter Sword', item.player) and self.difficulty_requirements[item.player].progressive_sword_limit >= 2:
|
||||||
ret.prog_items.add(('Master Sword', item.player))
|
ret.prog_items['Master Sword', item.player] += 1
|
||||||
elif self.difficulty_requirements[item.player].progressive_sword_limit >= 1:
|
elif self.difficulty_requirements[item.player].progressive_sword_limit >= 1:
|
||||||
ret.prog_items.add(('Fighter Sword', item.player))
|
ret.prog_items['Fighter Sword', item.player] += 1
|
||||||
elif 'Glove' in item.name:
|
elif 'Glove' in item.name:
|
||||||
if ret.has('Titans Mitts', item.player):
|
if ret.has('Titans Mitts', item.player):
|
||||||
pass
|
pass
|
||||||
elif ret.has('Power Glove', item.player):
|
elif ret.has('Power Glove', item.player):
|
||||||
ret.prog_items.add(('Titans Mitts', item.player))
|
ret.prog_items['Titans Mitts', item.player] += 1
|
||||||
else:
|
else:
|
||||||
ret.prog_items.add(('Power Glove', item.player))
|
ret.prog_items['Power Glove', item.player] += 1
|
||||||
elif 'Shield' in item.name:
|
elif 'Shield' in item.name:
|
||||||
if ret.has('Mirror Shield', item.player):
|
if ret.has('Mirror Shield', item.player):
|
||||||
pass
|
pass
|
||||||
elif ret.has('Red Shield', item.player) and self.difficulty_requirements[item.player].progressive_shield_limit >= 3:
|
elif ret.has('Red Shield', item.player) and self.difficulty_requirements[item.player].progressive_shield_limit >= 3:
|
||||||
ret.prog_items.add(('Mirror Shield', item.player))
|
ret.prog_items['Mirror Shield', item.player] += 1
|
||||||
elif ret.has('Blue Shield', item.player) and self.difficulty_requirements[item.player].progressive_shield_limit >= 2:
|
elif ret.has('Blue Shield', item.player) and self.difficulty_requirements[item.player].progressive_shield_limit >= 2:
|
||||||
ret.prog_items.add(('Red Shield', item.player))
|
ret.prog_items['Red Shield', item.player] += 1
|
||||||
elif self.difficulty_requirements[item.player].progressive_shield_limit >= 1:
|
elif self.difficulty_requirements[item.player].progressive_shield_limit >= 1:
|
||||||
ret.prog_items.add(('Blue Shield', item.player))
|
ret.prog_items['Blue Shield', item.player] += 1
|
||||||
elif 'Bow' in item.name:
|
elif 'Bow' in item.name:
|
||||||
if ret.has('Silver Arrows', item.player):
|
if ret.has('Silver Arrows', item.player):
|
||||||
pass
|
pass
|
||||||
elif ret.has('Bow', item.player) and self.difficulty_requirements[item.player].progressive_bow_limit >= 2:
|
elif ret.has('Bow', item.player) and self.difficulty_requirements[item.player].progressive_bow_limit >= 2:
|
||||||
ret.prog_items.add(('Silver Arrows', item.player))
|
ret.prog_items['Silver Arrows', item.player] += 1
|
||||||
elif self.difficulty_requirements[item.player].progressive_bow_limit >= 1:
|
elif self.difficulty_requirements[item.player].progressive_bow_limit >= 1:
|
||||||
ret.prog_items.add(('Bow', item.player))
|
ret.prog_items['Bow', item.player] += 1
|
||||||
elif item.name.startswith('Bottle'):
|
elif item.name.startswith('Bottle'):
|
||||||
if ret.bottle_count(item.player) < self.difficulty_requirements[item.player].progressive_bottle_limit:
|
if ret.bottle_count(item.player) < self.difficulty_requirements[item.player].progressive_bottle_limit:
|
||||||
ret.prog_items.add((item.name, item.player))
|
ret.prog_items[item.name, item.player] += 1
|
||||||
elif item.advancement or item.smallkey or item.bigkey:
|
elif item.advancement or item.smallkey or item.bigkey:
|
||||||
ret.prog_items.add((item.name, item.player))
|
ret.prog_items[item.name, item.player] += 1
|
||||||
|
|
||||||
for item in self.itempool:
|
for item in self.itempool:
|
||||||
soft_collect(item)
|
soft_collect(item)
|
||||||
@@ -408,7 +408,7 @@ class World(object):
|
|||||||
class CollectionState(object):
|
class CollectionState(object):
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
self.prog_items = bag()
|
self.prog_items = Counter()
|
||||||
self.world = parent
|
self.world = parent
|
||||||
self.reachable_regions = {player: set() for player in range(1, parent.players + 1)}
|
self.reachable_regions = {player: set() for player in range(1, parent.players + 1)}
|
||||||
self.colored_regions = {player: {} for player in range(1, parent.players + 1)}
|
self.colored_regions = {player: {} for player in range(1, parent.players + 1)}
|
||||||
@@ -584,14 +584,14 @@ class CollectionState(object):
|
|||||||
def has(self, item, player, count=1):
|
def has(self, item, player, count=1):
|
||||||
if count == 1:
|
if count == 1:
|
||||||
return (item, player) in self.prog_items
|
return (item, player) in self.prog_items
|
||||||
return self.prog_items.count((item, player)) >= count
|
return self.prog_items[item, player] >= count
|
||||||
|
|
||||||
def has_key(self, item, player, count=1):
|
def has_key(self, item, player, count=1):
|
||||||
if self.world.retro[player]:
|
if self.world.retro[player]:
|
||||||
return self.can_buy_unlimited('Small Key (Universal)', player)
|
return self.can_buy_unlimited('Small Key (Universal)', player)
|
||||||
if count == 1:
|
if count == 1:
|
||||||
return (item, player) in self.prog_items
|
return (item, player) in self.prog_items
|
||||||
return self.prog_items.count((item, player)) >= count
|
return self.prog_items[item, player] >= count
|
||||||
|
|
||||||
def can_buy_unlimited(self, item, player):
|
def can_buy_unlimited(self, item, player):
|
||||||
for shop in self.world.shops:
|
for shop in self.world.shops:
|
||||||
@@ -600,7 +600,7 @@ class CollectionState(object):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def item_count(self, item, player):
|
def item_count(self, item, player):
|
||||||
return self.prog_items.count((item, player))
|
return self.prog_items[item, player]
|
||||||
|
|
||||||
def has_crystals(self, count, player):
|
def has_crystals(self, count, player):
|
||||||
crystals = ['Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7']
|
crystals = ['Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7']
|
||||||
@@ -734,46 +734,46 @@ class CollectionState(object):
|
|||||||
if self.has('Golden Sword', item.player):
|
if self.has('Golden Sword', item.player):
|
||||||
pass
|
pass
|
||||||
elif self.has('Tempered Sword', item.player) and self.world.difficulty_requirements[item.player].progressive_sword_limit >= 4:
|
elif self.has('Tempered Sword', item.player) and self.world.difficulty_requirements[item.player].progressive_sword_limit >= 4:
|
||||||
self.prog_items.add(('Golden Sword', item.player))
|
self.prog_items['Golden Sword', item.player] += 1
|
||||||
changed = True
|
changed = True
|
||||||
elif self.has('Master Sword', item.player) and self.world.difficulty_requirements[item.player].progressive_sword_limit >= 3:
|
elif self.has('Master Sword', item.player) and self.world.difficulty_requirements[item.player].progressive_sword_limit >= 3:
|
||||||
self.prog_items.add(('Tempered Sword', item.player))
|
self.prog_items['Tempered Sword', item.player] += 1
|
||||||
changed = True
|
changed = True
|
||||||
elif self.has('Fighter Sword', item.player) and self.world.difficulty_requirements[item.player].progressive_sword_limit >= 2:
|
elif self.has('Fighter Sword', item.player) and self.world.difficulty_requirements[item.player].progressive_sword_limit >= 2:
|
||||||
self.prog_items.add(('Master Sword', item.player))
|
self.prog_items['Master Sword', item.player] += 1
|
||||||
changed = True
|
changed = True
|
||||||
elif self.world.difficulty_requirements[item.player].progressive_sword_limit >= 1:
|
elif self.world.difficulty_requirements[item.player].progressive_sword_limit >= 1:
|
||||||
self.prog_items.add(('Fighter Sword', item.player))
|
self.prog_items['Fighter Sword', item.player] += 1
|
||||||
changed = True
|
changed = True
|
||||||
elif 'Glove' in item.name:
|
elif 'Glove' in item.name:
|
||||||
if self.has('Titans Mitts', item.player):
|
if self.has('Titans Mitts', item.player):
|
||||||
pass
|
pass
|
||||||
elif self.has('Power Glove', item.player):
|
elif self.has('Power Glove', item.player):
|
||||||
self.prog_items.add(('Titans Mitts', item.player))
|
self.prog_items['Titans Mitts', item.player] += 1
|
||||||
changed = True
|
changed = True
|
||||||
else:
|
else:
|
||||||
self.prog_items.add(('Power Glove', item.player))
|
self.prog_items['Power Glove', item.player] += 1
|
||||||
changed = True
|
changed = True
|
||||||
elif 'Shield' in item.name:
|
elif 'Shield' in item.name:
|
||||||
if self.has('Mirror Shield', item.player):
|
if self.has('Mirror Shield', item.player):
|
||||||
pass
|
pass
|
||||||
elif self.has('Red Shield', item.player) and self.world.difficulty_requirements[item.player].progressive_shield_limit >= 3:
|
elif self.has('Red Shield', item.player) and self.world.difficulty_requirements[item.player].progressive_shield_limit >= 3:
|
||||||
self.prog_items.add(('Mirror Shield', item.player))
|
self.prog_items['Mirror Shield', item.player] += 1
|
||||||
changed = True
|
changed = True
|
||||||
elif self.has('Blue Shield', item.player) and self.world.difficulty_requirements[item.player].progressive_shield_limit >= 2:
|
elif self.has('Blue Shield', item.player) and self.world.difficulty_requirements[item.player].progressive_shield_limit >= 2:
|
||||||
self.prog_items.add(('Red Shield', item.player))
|
self.prog_items['Red Shield', item.player] += 1
|
||||||
changed = True
|
changed = True
|
||||||
elif self.world.difficulty_requirements[item.player].progressive_shield_limit >= 1:
|
elif self.world.difficulty_requirements[item.player].progressive_shield_limit >= 1:
|
||||||
self.prog_items.add(('Blue Shield', item.player))
|
self.prog_items['Blue Shield', item.player] += 1
|
||||||
changed = True
|
changed = True
|
||||||
elif 'Bow' in item.name:
|
elif 'Bow' in item.name:
|
||||||
if self.has('Silver Arrows', item.player):
|
if self.has('Silver Arrows', item.player):
|
||||||
pass
|
pass
|
||||||
elif self.has('Bow', item.player):
|
elif self.has('Bow', item.player):
|
||||||
self.prog_items.add(('Silver Arrows', item.player))
|
self.prog_items['Silver Arrows', item.player] += 1
|
||||||
changed = True
|
changed = True
|
||||||
else:
|
else:
|
||||||
self.prog_items.add(('Bow', item.player))
|
self.prog_items['Bow', item.player] += 1
|
||||||
changed = True
|
changed = True
|
||||||
elif 'Armor' in item.name:
|
elif 'Armor' in item.name:
|
||||||
if self.has('Red Mail', item.player):
|
if self.has('Red Mail', item.player):
|
||||||
@@ -787,10 +787,10 @@ class CollectionState(object):
|
|||||||
|
|
||||||
elif item.name.startswith('Bottle'):
|
elif item.name.startswith('Bottle'):
|
||||||
if self.bottle_count(item.player) < self.world.difficulty_requirements[item.player].progressive_bottle_limit:
|
if self.bottle_count(item.player) < self.world.difficulty_requirements[item.player].progressive_bottle_limit:
|
||||||
self.prog_items.add((item.name, item.player))
|
self.prog_items[item.name, item.player] += 1
|
||||||
changed = True
|
changed = True
|
||||||
elif event or item.advancement:
|
elif event or item.advancement:
|
||||||
self.prog_items.add((item.name, item.player))
|
self.prog_items[item.name, item.player] += 1
|
||||||
changed = True
|
changed = True
|
||||||
|
|
||||||
self.stale[item.player] = True
|
self.stale[item.player] = True
|
||||||
@@ -839,11 +839,10 @@ class CollectionState(object):
|
|||||||
to_remove = None
|
to_remove = None
|
||||||
|
|
||||||
if to_remove is not None:
|
if to_remove is not None:
|
||||||
try:
|
|
||||||
self.prog_items.remove((to_remove, item.player))
|
|
||||||
except ValueError:
|
|
||||||
return
|
|
||||||
|
|
||||||
|
self.prog_items[to_remove, item.player] -= 1
|
||||||
|
if self.prog_items[to_remove, item.player] < 1:
|
||||||
|
del (self.prog_items[to_remove, item.player])
|
||||||
# invalidate caches, nothing can be trusted anymore now
|
# invalidate caches, nothing can be trusted anymore now
|
||||||
self.reachable_regions[item.player] = set()
|
self.reachable_regions[item.player] = set()
|
||||||
self.stale[item.player] = True
|
self.stale[item.player] = True
|
||||||
|
|||||||
Reference in New Issue
Block a user