def gather_breeding_data(props, loader: AssetLoader) -> Dict[str, Any]: data: Dict[str, Any] = dict(gestationTime=0, incubationTime=0) gestation_breeding = stat_value(props, 'bUseBabyGestation', 0, False) has_eggs = False if props['FertilizedEggItemsToSpawn'][0] and props[ 'FertilizedEggItemsToSpawn'][0][-1].values: # eggs = list(filter(lambda v: v and str(v) != 'None', props['FertilizedEggItemsToSpawn'][0][-1].values)) eggs = [ egg for egg in props['FertilizedEggItemsToSpawn'][0][-1].values if str(egg) != 'None' ] has_eggs = bool(eggs) if gestation_breeding: gestation_speed = stat_value(props, 'BabyGestationSpeed', 0, BABYGESTATIONSPEED_DEFAULT) extra_gestation_speed_m = stat_value( props, 'ExtraBabyGestationSpeedMultiplier', 0, 1.0) # TODO: Verify if these should really default to 1 - seems odd gestation_speed = gestation_speed or 1 extra_gestation_speed_m = extra_gestation_speed_m or 1 # 'gestationTime' = 1 / (Baby Gestation Speed × Extra Baby Gestation Speed Multiplier) data['gestationTime'] = ( 1 / gestation_speed / extra_gestation_speed_m ) if gestation_speed and extra_gestation_speed_m else None elif has_eggs: fert_egg_asset = loader.load_related(eggs[0]) fert_egg_props = ark.mod.gather_properties(fert_egg_asset) egg_decay = stat_value(fert_egg_props, 'EggLoseDurabilityPerSecond', 0, 1) extra_egg_decay_m = stat_value( fert_egg_props, 'ExtraEggLoseDurabilityPerSecondMultiplier', 0, 1) # 'incubationTime' = 100 / (Egg Lose Durability Per Second × Extra Egg Lose Durability Per Second Multiplier) data['incubationTime'] = ( 100 / egg_decay / extra_egg_decay_m) if egg_decay and extra_egg_decay_m else None data['eggTempMin'] = stat_value(fert_egg_props, 'EggMinTemperature', 0) data['eggTempMax'] = stat_value(fert_egg_props, 'EggMaxTemperature', 0) # 'maturationTime' = 1 / (Baby Age Speed × Extra Baby Age Speed Multiplier) baby_age_speed = stat_value(props, 'BabyAgeSpeed', 0, 1) extra_baby_age_speed_m = stat_value(props, 'ExtraBabyAgeSpeedMultiplier', 0, 1) data['maturationTime'] = ( 1 / baby_age_speed / extra_baby_age_speed_m ) if baby_age_speed and extra_baby_age_speed_m else None data['matingCooldownMin'] = stat_value( props, 'NewFemaleMinTimeBetweenMating', 0, FEMALE_MINTIMEBETWEENMATING_DEFAULT) data['matingCooldownMax'] = stat_value( props, 'NewFemaleMaxTimeBetweenMating', 0, FEMALE_MAXTIMEBETWEENMATING_DEFAULT) return data
def gather_pgd_colors(props: PriorityPropDict, loader: AssetLoader, require_override=True) -> Tuple[Optional[Sequence[ColorEntry]], Optional[Sequence[ColorEntry]]]: '''Gather color and dye definitions from a PrimalGameData asset.''' colors: Optional[List[ColorEntry]] = list() dyes: Optional[List[ColorEntry]] = list() # Collect the color definitions color_def_overrides = props['ColorDefinitions'][0] if require_override and len(color_def_overrides) == 1: colors = None else: color_defs = color_def_overrides[-1].values colors = list() for definition in ((entry.as_dict() for entry in color_defs)): name = definition.get('ColorName', None) or '~~unset~~' value = definition.get('ColorValue', None) color = value.values[0].as_tuple() if value else None colors.append((str(name), color)) # Collect the dye definitions dye_def_overrides = props['MasterDyeList'][0] if require_override and len(dye_def_overrides) == 1: dyes = None else: dye_defs = props['MasterDyeList'][0][-1].values dyes = list() for dye_asset in (loader.load_related(entry) for entry in dye_defs): dye_props = gather_properties(dye_asset) name = stat_value(dye_props, 'DescriptiveNameBase', 0, None) or '~~unset~~' value = dye_props['DyeColor'][0][-1] color = value.values[0].as_tuple() if value else None dyes.append((str(name), color)) return (colors, dyes)
def gather_pgd_colors( asset: UAsset, props: PrimalGameData, loader: AssetLoader, require_override=True ) -> Tuple[Optional[Sequence[ColorEntry]], Optional[Sequence[ColorEntry]]]: '''Gather color and dye definitions from a PrimalGameData asset.''' colors: Optional[List[ColorEntry]] = list() dyes: Optional[List[ColorEntry]] = list() # Collect the color definitions color_def_overrides = props.ColorDefinitions[0] if require_override and color_def_overrides.asset != asset: colors = None else: color_defs = color_def_overrides.values colors = list() for definition in ((entry.as_dict() for entry in color_defs)): name = definition.get('ColorName', None) or '~~unset~~' value = definition.get('ColorValue', None) color = value.values[0].as_tuple() if value else None colors.append((str(name), color)) # Collect the dye definitions dye_def_overrides = props.MasterDyeList[0] if require_override and dye_def_overrides.asset != asset: dyes = None else: dye_defs = dye_def_overrides.values dyes = list() for dye_asset in (loader.load_related(entry) for entry in dye_defs): assert dye_asset and dye_asset.default_export dye_props: PrimalItem_Dye = ue.gathering.gather_properties( dye_asset.default_export) name = dye_props.DescriptiveNameBase[0] or '~~unset~~' value = dye_props.DyeColor[0] color = value.values[0].as_tuple() if value else None dyes.append((str(name), color)) return (colors, dyes)
def gather_breeding_data(char_props: PrimalDinoCharacter, loader: AssetLoader) -> Dict[str, Any]: data: Dict[str, Any] = dict(gestationTime=0, incubationTime=0) gestation_breeding = char_props.bUseBabyGestation[0] fert_eggs = char_props.get('FertilizedEggItemsToSpawn', 0, None) fert_egg_weights = char_props.get('FertilizedEggWeightsToSpawn', 0, None) if gestation_breeding: gestation_speed = char_props.BabyGestationSpeed[0].rounded_value extra_gestation_speed_m = char_props.ExtraBabyGestationSpeedMultiplier[ 0].rounded_value try: data['gestationTime'] = cd(1 / gestation_speed / extra_gestation_speed_m) except ZeroDivisionError: logger.warning( f"Species {char_props.get_source().asset.assetname} tried dividing by zero for its gestationTime" ) elif fert_eggs and fert_eggs.values: eggs: List[Tuple[ObjectProperty, float]] = [] for index, egg in enumerate(fert_eggs.values): weight = fert_egg_weights.values[index] if fert_egg_weights else 1 # Verify the egg is a valid Object and that weight isn't 0 if str(egg) == 'None' or weight == 0: continue eggs.append((egg, weight)) # Sort eggs by highest weighting eggs.sort(reverse=True, key=itemgetter(1)) if eggs: # We only provide the highest possibility egg to ASB fert_egg_asset = loader.load_related(eggs[0][0]) assert fert_egg_asset.default_export egg_props: PrimalItem = ue.gathering.gather_properties( fert_egg_asset.default_export) egg_decay = egg_props.EggLoseDurabilityPerSecond[0].rounded_value extra_egg_decay_m = egg_props.ExtraEggLoseDurabilityPerSecondMultiplier[ 0].rounded_value # 'incubationTime' = 100 / (Egg Lose Durability Per Second × Extra Egg Lose Durability Per Second Multiplier) try: data['incubationTime'] = cd(100 / egg_decay / extra_egg_decay_m) except ZeroDivisionError: logger.warning( f"Species {char_props.get_source().asset.assetname} tried dividing by zero for its incubationTime" ) data['eggTempMin'] = egg_props.EggMinTemperature[0] data['eggTempMax'] = egg_props.EggMaxTemperature[0] # 'maturationTime' = 1 / (Baby Age Speed × Extra Baby Age Speed Multiplier) baby_age_speed = char_props.BabyAgeSpeed[0].rounded_value extra_baby_age_speed_m = char_props.ExtraBabyAgeSpeedMultiplier[ 0].rounded_value try: data['maturationTime'] = cd(1 / baby_age_speed / extra_baby_age_speed_m) except ZeroDivisionError: logger.warning( f"Species {char_props.get_source().asset.assetname} tried dividing by zero for its maturationTime" ) data['matingCooldownMin'] = char_props.NewFemaleMinTimeBetweenMating[0] data['matingCooldownMax'] = char_props.NewFemaleMaxTimeBetweenMating[0] return data