Reduce chance that shop_slot_shuffle produces empty slots, at the cost of cpu time.
This commit is contained in:
parent
bbf56a5a69
commit
25f234dff0
19
Shops.py
19
Shops.py
|
@ -196,20 +196,21 @@ def ShopSlotFill(world):
|
|||
|
||||
del locations_per_sphere
|
||||
|
||||
total_spheres = len(candidates_per_sphere)
|
||||
|
||||
for i, current_shop_slots in enumerate(shops_per_sphere):
|
||||
if current_shop_slots:
|
||||
candidate_sphere_ids = list(range(i, total_spheres))
|
||||
# getting all candidates and shuffling them feels cpu expensive, there may be a better method
|
||||
candidates = [(location, i) for i, candidates in enumerate(candidates_per_sphere[i:], start=i)
|
||||
for location in candidates]
|
||||
world.random.shuffle(candidates)
|
||||
for location in current_shop_slots:
|
||||
shop: Shop = location.parent_region.shop
|
||||
swapping_sphere_id = world.random.choices(candidate_sphere_ids,
|
||||
cum_weights=cumu_weights[i:])[0]
|
||||
swapping_sphere: list = candidates_per_sphere[swapping_sphere_id]
|
||||
for c in swapping_sphere: # chosen item locations
|
||||
for index, (c, swapping_sphere_id) in enumerate(candidates): # chosen item locations
|
||||
if c.item_rule(location.item) and location.item_rule(c.item):
|
||||
swap_location_item(c, location, check_locked=False)
|
||||
logger.debug(f'Swapping {c} into {location}:: {location.item}')
|
||||
# remove candidate
|
||||
candidates_per_sphere[swapping_sphere_id].remove(c)
|
||||
candidates.pop(index)
|
||||
break
|
||||
|
||||
else:
|
||||
|
@ -218,10 +219,6 @@ def ShopSlotFill(world):
|
|||
location.shop_slot_disabled = True
|
||||
continue
|
||||
|
||||
# remove candidate
|
||||
swapping_sphere.remove(c)
|
||||
cumu_weights[swapping_sphere_id] -= 1
|
||||
|
||||
item_name = location.item.name
|
||||
if any(x in item_name for x in ['Compass', 'Map', 'Single Bomb', 'Single Arrow', 'Piece of Heart']):
|
||||
price = world.random.randrange(1, 7)
|
||||
|
|
Loading…
Reference in New Issue