def res_random_setup(res: Property): weight = '' results = [] chance = 100 seed = '' for prop in res: if prop.name == 'chance': # Allow ending with '%' sign chance = srctools.conv_int( prop.value.rstrip('%'), chance, ) elif prop.name == 'weights': weight = prop.value elif prop.name == 'seed': seed = prop.value else: results.append(prop) if not results: return None # Invalid! weight = conditions.weighted_random(len(results), weight) # We also need to execute result setups on all child properties! for prop in results[:]: if prop.name == 'group': for sub_prop in prop.value[:]: Condition.setup_result(prop.value, sub_prop) else: Condition.setup_result(results, prop) return seed, chance, weight, results
def res_random_setup(res): weight = '' results = [] chance = 100 seed = '' for prop in res: if prop.name == 'chance': # Allow ending with '%' sign chance = utils.conv_int( prop.value.rstrip('%'), chance, ) elif prop.name == 'weights': weight = prop.value elif prop.name == 'seed': seed = prop.value else: results.append(prop) if not results: return None # Invalid! weight = conditions.weighted_random(len(results), weight) # We also need to execute result setups on all child properties! for prop in results[:]: if prop.name == 'group': for sub_prop in prop.value[:]: Condition.setup_result(prop.value, sub_prop) else: Condition.setup_result(results, prop) return seed, chance, weight, results
def res_add_variant_setup(res): count = utils.conv_int(res['Number', ''], None) if count: return conditions.weighted_random( count, res['weights', ''], ) else: return None
def res_add_variant_setup(res: Property): if res.has_children(): count = srctools.conv_int(res['Number', ''], None) if count: return conditions.weighted_random( count, res['weights', ''], ) else: return None else: count = srctools.conv_int(res.value, None) if count: return list(range(count)) else: return None
def res_add_variant_setup(res: Property) -> object: if res.has_children(): count = srctools.conv_int(res['Number', ''], None) if count: return conditions.weighted_random( count, res['weights', ''], ) else: return None else: count = srctools.conv_int(res.value, None) if count: return list(range(count)) else: return None
def parse(cls, conf: Property): """Read in a fizzler from a config.""" fizz_id = conf['id'] item_ids = [prop.value.casefold() for prop in conf.find_all('item_id')] try: model_name_type = ModelName(conf['NameType', 'same'].casefold()) except ValueError: LOGGER.warning('Bad model name type: "{}"', conf['NameType']) model_name_type = ModelName.SAME model_local_name = conf['ModelName', ''] if not model_local_name: # We can't rename without a local name. model_name_type = ModelName.SAME inst = {} for inst_type, is_static in itertools.product(FizzInst, (False, True)): inst_type_name = inst_type.value + ('_static' if is_static else '') inst[inst_type, is_static] = instances = [ file for prop in conf.find_all(inst_type_name) for file in instanceLocs.resolve(prop.value) ] # Allow specifying weights to bias model locations weights = conf[inst_type_name + '_weight', ''] if weights: # Produce the weights, then process through the original # list to build a new one with repeated elements. inst[inst_type, is_static] = instances = [ instances[i] for i in conditions.weighted_random( len(instances), weights) ] # If static versions aren't given, reuse non-static ones. # We do False, True so it's already been calculated. if not instances and is_static: inst[inst_type, True] = inst[inst_type, False] if not inst[FizzInst.BASE, False]: LOGGER.warning('No base instance set! for "{}"!', fizz_id) voice_attrs = [] for prop in conf.find_all('Has'): if prop.has_children(): for child in prop: voice_attrs.append(child.name.casefold()) else: voice_attrs.append(prop.value.casefold()) pack_lists = {prop.value for prop in conf.find_all('Pack')} pack_lists_static = { prop.value for prop in conf.find_all('PackStatic') } brushes = [FizzlerBrush.parse(prop) for prop in conf.find_all('Brush')] beams = [] # type: List[FizzBeam] for beam_prop in conf.find_all('Beam'): offsets = [ Vec.from_str(off.value) for off in beam_prop.find_all('pos') ] keys = Property('', [ beam_prop.find_key('Keys', []), beam_prop.find_key('LocalKeys', []) ]) beams.append( FizzBeam( offsets, keys, beam_prop.int('RandSpeedMin', 0), beam_prop.int('RandSpeedMax', 0), )) try: temp_conf = conf.find_key('TemplateBrush') except NoKeyError: temp_brush_keys = temp_min = temp_max = temp_single = None else: temp_brush_keys = Property('--', [ temp_conf.find_key('Keys'), temp_conf.find_key('LocalKeys', []), ]) # Find and load the templates. temp_min = temp_conf['Left', None] temp_max = temp_conf['Right', None] temp_single = temp_conf['Single', None] return FizzlerType( fizz_id, item_ids, voice_attrs, pack_lists, pack_lists_static, model_local_name, model_name_type, brushes, beams, inst, temp_brush_keys, temp_min, temp_max, temp_single, )
def res_add_variant_setup(res): count = utils.conv_int(res["Number", ""], None) if count: return conditions.weighted_random(count, res["weights", ""]) else: return None
def parse(cls, conf: Property): """Read in a fizzler from a config.""" fizz_id = conf['id'] item_ids = [ prop.value.casefold() for prop in conf.find_all('item_id') ] try: model_name_type = ModelName(conf['NameType', 'same'].casefold()) except ValueError: LOGGER.warning('Bad model name type: "{}"', conf['NameType']) model_name_type = ModelName.SAME model_local_name = conf['ModelName', ''] if not model_local_name: # We can't rename without a local name. model_name_type = ModelName.SAME inst = {} for inst_type, is_static in itertools.product(FizzInst, (False, True)): inst_type_name = inst_type.value + ('_static' if is_static else '') inst[inst_type, is_static] = instances = [ file for prop in conf.find_all(inst_type_name) for file in instanceLocs.resolve(prop.value) ] # Allow specifying weights to bias model locations weights = conf[inst_type_name + '_weight', ''] if weights: # Produce the weights, then process through the original # list to build a new one with repeated elements. inst[inst_type, is_static] = instances = [ instances[i] for i in conditions.weighted_random(len(instances), weights) ] # If static versions aren't given, reuse non-static ones. # We do False, True so it's already been calculated. if not instances and is_static: inst[inst_type, True] = inst[inst_type, False] if not inst[FizzInst.BASE, False]: LOGGER.warning('No base instance set! for "{}"!', fizz_id) voice_attrs = [] for prop in conf.find_all('Has'): if prop.has_children(): for child in prop: voice_attrs.append(child.name.casefold()) else: voice_attrs.append(prop.value.casefold()) pack_lists = { prop.value for prop in conf.find_all('Pack') } pack_lists_static = { prop.value for prop in conf.find_all('PackStatic') } brushes = [ FizzlerBrush.parse(prop) for prop in conf.find_all('Brush') ] beams = [] # type: List[FizzBeam] for beam_prop in conf.find_all('Beam'): offsets = [ Vec.from_str(off.value) for off in beam_prop.find_all('pos') ] keys = Property('', [ beam_prop.find_key('Keys', []), beam_prop.find_key('LocalKeys', []) ]) beams.append(FizzBeam( offsets, keys, beam_prop.int('RandSpeedMin', 0), beam_prop.int('RandSpeedMax', 0), )) try: temp_conf = conf.find_key('TemplateBrush') except NoKeyError: temp_brush_keys = temp_min = temp_max = temp_single = None else: temp_brush_keys = Property('--', [ temp_conf.find_key('Keys'), temp_conf.find_key('LocalKeys', []), ]) # Find and load the templates. temp_min = temp_conf['Left', None] temp_max = temp_conf['Right', None] temp_single = temp_conf['Single', None] return FizzlerType( fizz_id, item_ids, voice_attrs, pack_lists, pack_lists_static, model_local_name, model_name_type, brushes, beams, inst, temp_brush_keys, temp_min, temp_max, temp_single, )