Add option to hard require plando item placement.
This commit is contained in:
		
							parent
							
								
									e03841794b
								
							
						
					
					
						commit
						a6d53aafb0
					
				| 
						 | 
				
			
			@ -1477,6 +1477,7 @@ class PlandoItem(NamedTuple):
 | 
			
		|||
    location: str
 | 
			
		||||
    world: Union[bool, str] = False  # False -> own world, True -> not own world
 | 
			
		||||
    from_pool: bool = True  # if item should be removed from item pool
 | 
			
		||||
    force: bool = False  # False -> warns if item not successfully placed. True -> errors out on failure to place item.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PlandoConnection(NamedTuple):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										42
									
								
								Fill.py
								
								
								
								
							
							
						
						
									
										42
									
								
								Fill.py
								
								
								
								
							| 
						 | 
				
			
			@ -359,7 +359,11 @@ def distribute_planned(world):
 | 
			
		|||
                    set(world.player_ids) - {player}) if location.item_rule(item)
 | 
			
		||||
                                )
 | 
			
		||||
                if not unfilled:
 | 
			
		||||
                    raise FillError(f"Could not find a world with an unfilled location {placement.location}")
 | 
			
		||||
                    if placement.force:
 | 
			
		||||
                        raise FillError(f"Could not find a world with an unfilled location {placement.location}")
 | 
			
		||||
                    else:
 | 
			
		||||
                        logging.warning(f"Could not find a world with an unfilled location {placement.location}, skipping.")
 | 
			
		||||
                        continue
 | 
			
		||||
 | 
			
		||||
                target_world = world.random.choice(unfilled).player
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -369,24 +373,32 @@ def distribute_planned(world):
 | 
			
		|||
                    set(world.player_ids)) if location.item_rule(item)
 | 
			
		||||
                                )
 | 
			
		||||
                if not unfilled:
 | 
			
		||||
                    raise FillError(f"Could not find a world with an unfilled location {placement.location}")
 | 
			
		||||
                    if placement.force:
 | 
			
		||||
                        raise FillError(f"Could not find a world with an unfilled location {placement.location}")
 | 
			
		||||
                    else:
 | 
			
		||||
                        logging.warning(f"Could not find a world with an unfilled location {placement.location}, skipping.")
 | 
			
		||||
                        continue
 | 
			
		||||
 | 
			
		||||
                target_world = world.random.choice(unfilled).player
 | 
			
		||||
 | 
			
		||||
            elif type(target_world) == int:  # target world by player id
 | 
			
		||||
                pass
 | 
			
		||||
            else:  # find world by name
 | 
			
		||||
                if target_world not in world_name_lookup:
 | 
			
		||||
                    if placement.force:
 | 
			
		||||
                        raise Exception(f"Cannot place item to {target_world}'s world as that world does not exist.")
 | 
			
		||||
                    else:
 | 
			
		||||
                        logging.warning(f"Cannot place item to {target_world}'s world as that world does not exist. Skipping.")
 | 
			
		||||
                        continue
 | 
			
		||||
                target_world = world_name_lookup[target_world]
 | 
			
		||||
 | 
			
		||||
            location = world.get_location(placement.location, target_world)
 | 
			
		||||
            if location.item:
 | 
			
		||||
                raise Exception(f"Cannot place item into already filled location {location}.")
 | 
			
		||||
 | 
			
		||||
            if placement.from_pool:
 | 
			
		||||
                try:
 | 
			
		||||
                    world.itempool.remove(item)
 | 
			
		||||
                except ValueError:
 | 
			
		||||
                    logging.warning(f"Could not remove {item} from pool as it's already missing from it.")
 | 
			
		||||
                if placement.force:
 | 
			
		||||
                    raise Exception(f"Cannot place item into already filled location {location}.")
 | 
			
		||||
                else:
 | 
			
		||||
                    logging.warning(f"Cannot place item into already filled location {location}. Skipping.")
 | 
			
		||||
                    continue
 | 
			
		||||
 | 
			
		||||
            if location.can_fill(world.state, item, False):
 | 
			
		||||
                world.push_item(location, item, collect=False)
 | 
			
		||||
| 
						 | 
				
			
			@ -394,4 +406,14 @@ def distribute_planned(world):
 | 
			
		|||
                location.locked = True
 | 
			
		||||
                logging.debug(f"Plando placed {item} at {location}")
 | 
			
		||||
            else:
 | 
			
		||||
                raise Exception(f"Can't place {item} at {location} due to fill condition not met.")
 | 
			
		||||
                if placement.force:
 | 
			
		||||
                    raise Exception(f"Can't place {item} at {location} due to fill condition not met.")
 | 
			
		||||
                else:
 | 
			
		||||
                    logging.warning(f"Can't place {item} at {location} due to fill condition not met. Skipping.")
 | 
			
		||||
                    continue
 | 
			
		||||
 | 
			
		||||
            if placement.from_pool:  # Should happen AFTER the item is placed, in case it was allowed to skip failed placement.
 | 
			
		||||
                try:
 | 
			
		||||
                    world.itempool.remove(item)
 | 
			
		||||
                except ValueError:
 | 
			
		||||
                    logging.warning(f"Could not remove {item} from pool as it's already missing from it.")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -568,7 +568,8 @@ def roll_settings(weights, plando_options: typing.Set[str] = frozenset(("bosses"
 | 
			
		|||
                    raise Exception(f"Could not plando item {item} at location {location} as the location was not recognized")
 | 
			
		||||
                from_pool = get_choice("from_pool", placement, True)
 | 
			
		||||
                location_world = get_choice("world", placement, False)
 | 
			
		||||
                ret.plando_items.append(PlandoItem(item, location, location_world, from_pool))
 | 
			
		||||
                force = get_choice("force", placement, False)
 | 
			
		||||
                ret.plando_items.append(PlandoItem(item, location, location_world, from_pool, force))
 | 
			
		||||
 | 
			
		||||
    ret.plando_texts = {}
 | 
			
		||||
    if "texts" in plando_options:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue