def can_impregnate(sim_info: SimInfo) -> bool: """can_impregnate(sim_info) Determine if a Sim can impregnate other sims. :param sim_info: The Sim being checked. :type sim_info: SimInfo :return: True, if they can. False, if they cannot. :rtype: bool """ from sims4communitylib.utils.sims.common_trait_utils import CommonTraitUtils from sims4communitylib.enums.traits_enum import CommonTraitId if CommonSpeciesUtils.is_human(sim_info): if CommonTraitUtils.has_trait( sim_info, CommonTraitId.GENDER_OPTIONS_PREGNANCY_CAN_NOT_IMPREGNATE): return False return CommonTraitUtils.has_trait( sim_info, CommonTraitId.GENDER_OPTIONS_PREGNANCY_CAN_IMPREGNATE) elif CommonSpeciesUtils.is_pet(sim_info): if CommonTraitUtils.has_trait( sim_info, CommonTraitId.PREGNANCY_OPTIONS_PET_CAN_NOT_REPRODUCE): return False return CommonTraitUtils.has_trait( sim_info, CommonTraitId.PREGNANCY_OPTIONS_PET_CAN_REPRODUCE) return False
def can_create_pregnancy_together(sim_info_a: SimInfo, sim_info_b: SimInfo, ignore_gender_options=False) -> bool: """can_create_pregnancy_together(sim_info_a, sim_info_b, ignore_gender_options=False) Determine if two Sims can create a pregnancy together. :param sim_info_a: An instance of a Sim. :type sim_info_a: SimInfo :param sim_info_b: An instance of a Sim. :type sim_info_b: SimInfo :param ignore_gender_options: If set to True, pregnancy gender options will be ignored.\ If set to False, each Sim will be checked for having either Can Impregnate or Can Be Impregnated. Default is False. :type ignore_gender_options: bool, optional :return: True, if the Sim can produce a pregnancy. False, if not. :rtype: bool """ if not S4CMSimPregnancyUtils.can_create_pregnancy(sim_info_a, ignore_gender_options=ignore_gender_options)\ or not S4CMSimPregnancyUtils.can_create_pregnancy(sim_info_b, ignore_gender_options=ignore_gender_options): return False if not CommonSpeciesUtils.are_same_species(sim_info_a, sim_info_b): # If both Sims are dogs, that is an ok combination, even though their species do not match. if not CommonSpeciesUtils.is_dog( sim_info_a) or not CommonSpeciesUtils.is_dog(sim_info_b): return False if not S4CMSettingUtils.is_sim_allowed_to_perform_adult_sim_operations( sim_info_a ) or not S4CMSettingUtils.is_sim_allowed_to_perform_adult_sim_operations( sim_info_b): return False if not S4CMSettingUtils.are_allowed_romantic_relationship( sim_info_a, sim_info_b): return False return True
def _translate_motive(self, sim_info: SimInfo, motive_name: str) -> int: if motive_name == CMMotive.BOWEL: if CommonSpeciesUtils.is_dog(sim_info): return CommonMotiveId.PET_DOG_BOWEL elif CommonSpeciesUtils.is_cat(sim_info): return CommonMotiveId.PET_CAT_BOWEL return -1 else: return CMMotiveUtils._MOTIVE_MAPPINGS[motive_name]
def _try_apply_traits(self, sim_info: SimInfo): if CommonSpeciesUtils.is_human(sim_info): CommonTraitUtils.remove_trait( sim_info, S4CMTraitId.S4CM_CONTROLLABLE_LARGE_DOG_SIM, S4CMTraitId.S4CM_CONTROLLABLE_SMALL_DOG_SIM, S4CMTraitId.S4CM_CONTROLLABLE_CAT_SIM, S4CMTraitId.S4CM_CONTROLLABLE_FOX_SIM) if CommonTraitUtils.has_trait( sim_info, S4CMTraitId.S4CM_CONTROLLABLE_HUMAN_SIM): return CommonTraitUtils.add_trait(sim_info, S4CMTraitId.S4CM_CONTROLLABLE_HUMAN_SIM) elif CommonSpeciesUtils.is_large_dog(sim_info): CommonTraitUtils.remove_trait( sim_info, S4CMTraitId.S4CM_CONTROLLABLE_HUMAN_SIM, S4CMTraitId.S4CM_CONTROLLABLE_SMALL_DOG_SIM, S4CMTraitId.S4CM_CONTROLLABLE_CAT_SIM, S4CMTraitId.S4CM_CONTROLLABLE_FOX_SIM) if CommonTraitUtils.has_trait( sim_info, S4CMTraitId.S4CM_CONTROLLABLE_LARGE_DOG_SIM): return CommonTraitUtils.add_trait( sim_info, S4CMTraitId.S4CM_CONTROLLABLE_LARGE_DOG_SIM) elif CommonSpeciesUtils.is_small_dog(sim_info): CommonTraitUtils.remove_trait( sim_info, S4CMTraitId.S4CM_CONTROLLABLE_HUMAN_SIM, S4CMTraitId.S4CM_CONTROLLABLE_LARGE_DOG_SIM, S4CMTraitId.S4CM_CONTROLLABLE_CAT_SIM, S4CMTraitId.S4CM_CONTROLLABLE_FOX_SIM) if CommonTraitUtils.has_trait( sim_info, S4CMTraitId.S4CM_CONTROLLABLE_SMALL_DOG_SIM): return CommonTraitUtils.add_trait( sim_info, S4CMTraitId.S4CM_CONTROLLABLE_SMALL_DOG_SIM) elif CommonSpeciesUtils.is_cat(sim_info): CommonTraitUtils.remove_trait( sim_info, S4CMTraitId.S4CM_CONTROLLABLE_HUMAN_SIM, S4CMTraitId.S4CM_CONTROLLABLE_LARGE_DOG_SIM, S4CMTraitId.S4CM_CONTROLLABLE_SMALL_DOG_SIM, S4CMTraitId.S4CM_CONTROLLABLE_FOX_SIM) if CommonTraitUtils.has_trait( sim_info, S4CMTraitId.S4CM_CONTROLLABLE_CAT_SIM): return CommonTraitUtils.add_trait(sim_info, S4CMTraitId.S4CM_CONTROLLABLE_CAT_SIM) elif CommonSpeciesUtils.is_fox(sim_info): CommonTraitUtils.remove_trait( sim_info, S4CMTraitId.S4CM_CONTROLLABLE_HUMAN_SIM, S4CMTraitId.S4CM_CONTROLLABLE_LARGE_DOG_SIM, S4CMTraitId.S4CM_CONTROLLABLE_SMALL_DOG_SIM, S4CMTraitId.S4CM_CONTROLLABLE_CAT_SIM) if CommonTraitUtils.has_trait( sim_info, S4CMTraitId.S4CM_CONTROLLABLE_FOX_SIM): return CommonTraitUtils.add_trait(sim_info, S4CMTraitId.S4CM_CONTROLLABLE_FOX_SIM)
def get_bowels_level(sim_info: SimInfo) -> float: """ Retrieve the bowels level of a Sim. """ if CommonSpeciesUtils.is_human(sim_info): return -1.0 elif CommonSpeciesUtils.is_dog(sim_info): return CommonSimMotiveUtils._get_motive_level( sim_info, CommonMotiveId.PET_DOG_BOWEL) elif CommonSpeciesUtils.is_cat(sim_info): return CommonSimMotiveUtils._get_motive_level( sim_info, CommonMotiveId.PET_CAT_BOWEL) return -1.0
def get_species(sim_info: SimInfo) -> int: """ Retrieve the CommonSpecies of a sim. Use this instead of CommonSpeciesUtils.get_species to determine a more specific species. """ from sims4communitylib.utils.sims.common_species_utils import CommonSpeciesUtils if CommonSpeciesUtils.is_human(sim_info): return CommonSpecies.HUMAN elif CommonSpeciesUtils.is_small_dog(sim_info): return CommonSpecies.SMALL_DOG elif CommonSpeciesUtils.is_large_dog(sim_info): return CommonSpecies.LARGE_DOG elif CommonSpeciesUtils.is_cat(sim_info): return CommonSpecies.CAT return CommonSpecies.INVALID
def update_toilet_usage(sim_info: SimInfo, uses_toilet_standing: bool) -> bool: """update_toilet_usage(sim_info, uses_toilet_standing) Update how a Sim uses the toilet. i.e. Toilet Standing or Toilet Sitting. .. note:: Will only update Human Sims. :param sim_info: An instance of a Sim. :type sim_info: SimInfo :param uses_toilet_standing: If True, the Sim will use toilets while standing.\ If False, the Sim will use toilets while sitting. :type uses_toilet_standing: bool :return: True, if successful. False, if not. :rtype: bool """ if sim_info is None: return False if not CommonSpeciesUtils.is_human(sim_info): return False if uses_toilet_standing: CommonTraitUtils.remove_trait( sim_info, CommonTraitId.GENDER_OPTIONS_TOILET_SITTING) CommonTraitUtils.add_trait( sim_info, CommonTraitId.GENDER_OPTIONS_TOILET_STANDING) else: CommonTraitUtils.remove_trait( sim_info, CommonTraitId.GENDER_OPTIONS_TOILET_STANDING) CommonTraitUtils.add_trait( sim_info, CommonTraitId.GENDER_OPTIONS_TOILET_SITTING) from sims4communitylib.events.sim.common_sim_event_dispatcher import CommonSimEventDispatcherService CommonSimEventDispatcherService( )._on_sim_change_gender_options_toilet_usage(sim_info) return True
def get_valid_motives(self, sim_info: SimInfo) -> Tuple[str]: """ Retrieve a collection of all valid motives. """ motives: Tuple[str] = tuple() if CommonOccultUtils.is_vampire(sim_info): motives += (CMMotive.SOCIAL, CMMotive.FUN, CMMotive.HYGIENE, CMMotive.VAMPIRE_THIRST, CMMotive.VAMPIRE_POWER) elif CommonOccultUtils.is_robot(sim_info): motives += (CMMotive.SOCIAL, CMMotive.FUN, CMMotive.SERVO_DURABILITY, CMMotive.SERVO_CHARGE) elif CommonOccultUtils.is_plant_sim(sim_info): motives += ( CMMotive.SOCIAL, CMMotive.FUN, CMMotive.HYGIENE, CMMotive.HUNGER, CMMotive.ENERGY, CMMotive.PLANT_SIM_WATER, ) else: motives += (CMMotive.SOCIAL, CMMotive.FUN, CMMotive.HYGIENE, CMMotive.HUNGER, CMMotive.ENERGY, CMMotive.BLADDER) if CommonSpeciesUtils.is_pet(sim_info): motives += (CMMotive.BOWEL, ) trimmed_result: List[str] = list() for motive in motives: trimmed_result.append(motive.replace('CMMotive.', '').lower()) return tuple(trimmed_result)
def update_body_frame(sim_info: SimInfo, masculine: bool) -> bool: """update_body_frame(sim_info, masculine) Update the Body Frame of a Sim. .. note:: Will only update Human Sims. :param sim_info: An instance of a Sim. :type sim_info: SimInfo :param masculine: If True, the Sim will get a Masculine frame.\ If False, the Sim will get a Feminine frame. :type masculine: bool :return: True, if successful. False, if not. :rtype: bool """ if sim_info is None: return False if not CommonSpeciesUtils.is_human(sim_info): return False if masculine: CommonTraitUtils.remove_trait( sim_info, CommonTraitId.GENDER_OPTIONS_FRAME_FEMININE) CommonTraitUtils.add_trait( sim_info, CommonTraitId.GENDER_OPTIONS_FRAME_MASCULINE) else: CommonTraitUtils.remove_trait( sim_info, CommonTraitId.GENDER_OPTIONS_FRAME_MASCULINE) CommonTraitUtils.add_trait( sim_info, CommonTraitId.GENDER_OPTIONS_FRAME_FEMININE) from sims4communitylib.events.sim.common_sim_event_dispatcher import CommonSimEventDispatcherService CommonSimEventDispatcherService( )._on_sim_change_gender_options_body_frame(sim_info) return True
def update_clothing_preference(sim_info: SimInfo, prefer_menswear: bool) -> bool: """update_clothing_preference(sim_info, prefer_menswear) Update the Clothing Preference of a Sim. .. note:: Will only update Human Sims. :param sim_info: An instance of a Sim. :type sim_info: SimInfo :param prefer_menswear: If True, the Sim will prefer Menswear.\ If False, the Sim will prefer Womenswear. :type prefer_menswear: bool :return: True, if successful. False, if not. :rtype: bool """ if sim_info is None: return False if not CommonSpeciesUtils.is_human(sim_info): return False if prefer_menswear: CommonTraitUtils.remove_trait( sim_info, CommonTraitId.GENDER_OPTIONS_CLOTHING_WOMENS_WEAR) CommonTraitUtils.add_trait( sim_info, CommonTraitId.GENDER_OPTIONS_CLOTHING_MENS_WEAR) else: CommonTraitUtils.remove_trait( sim_info, CommonTraitId.GENDER_OPTIONS_CLOTHING_MENS_WEAR) CommonTraitUtils.add_trait( sim_info, CommonTraitId.GENDER_OPTIONS_CLOTHING_WOMENS_WEAR) from sims4communitylib.events.sim.common_sim_event_dispatcher import CommonSimEventDispatcherService CommonSimEventDispatcherService( )._on_sim_change_gender_options_clothing_preference(sim_info) return True
def update_can_reproduce(sim_info: SimInfo, can_reproduce: bool) -> bool: """update_can_reproduce(sim_info, can_reproduce) Update a Sims ability to reproduce. .. note:: Will only update Pet Sims. :param sim_info: An instance of a Sim. :type sim_info: SimInfo :param can_reproduce: If True, the Sim will have the ability to reproduce.\ If False, the Sim will not have the ability to reproduce. :type can_reproduce: bool :return: True, if successful. False, if not. :rtype: bool """ if sim_info is None: return False if not CommonSpeciesUtils.is_pet(sim_info): return False if can_reproduce: CommonTraitUtils.remove_trait( sim_info, CommonTraitId.PREGNANCY_OPTIONS_PET_CAN_NOT_REPRODUCE) CommonTraitUtils.add_trait( sim_info, CommonTraitId.PREGNANCY_OPTIONS_PET_CAN_REPRODUCE) else: CommonTraitUtils.remove_trait( sim_info, CommonTraitId.PREGNANCY_OPTIONS_PET_CAN_REPRODUCE) CommonTraitUtils.add_trait( sim_info, CommonTraitId.PREGNANCY_OPTIONS_PET_CAN_NOT_REPRODUCE) from sims4communitylib.events.sim.common_sim_event_dispatcher import CommonSimEventDispatcherService CommonSimEventDispatcherService( )._on_sim_change_gender_options_can_reproduce(sim_info) return True
def get_bowels_level(sim_info: SimInfo) -> float: """get_bowels_level(sim_info) Retrieve the bowels level of a Sim. :param sim_info: The Sim to get the level of. :type sim_info: SimInfo :return: The current level of the Motive of the Sim. :rtype: float """ if CommonSpeciesUtils.is_human(sim_info): return -1.0 elif CommonSpeciesUtils.is_dog(sim_info): return CommonSimMotiveUtils._get_motive_level(sim_info, CommonMotiveId.PET_DOG_BOWEL) elif CommonSpeciesUtils.is_cat(sim_info): return CommonSimMotiveUtils._get_motive_level(sim_info, CommonMotiveId.PET_CAT_BOWEL) return -1.0
def get_swim_interaction(sim_info: SimInfo) -> Union[int, None]: """get_swim_interaction(sim_info) Retrieve a Swim interaction appropriate for a Sim. .. note:: Cats do not have an appropriate Swim interaction. :param sim_info: An instance of a Sim. :type sim_info: SimInfo :return: The decimal identifier of an interaction appropriate for the Sim or None if no interaction was found to be appropriate. :rtype: Union[int, None] """ if CommonSpeciesUtils.is_human(sim_info): return CommonInteractionId.SIM_SWIM elif CommonSpeciesUtils.is_dog(sim_info): return CommonInteractionId.DOG_SWIM # Cats don't have a swim interaction. return None
def get_stand_interaction(sim_info: SimInfo) -> Union[int, None]: """get_stand_interaction(sim_info) Retrieve a Stand interaction appropriate for a Sim. :param sim_info: An instance of a Sim. :type sim_info: SimInfo :return: The decimal identifier of a Stand interaction appropriate for the Sim or None if no Stand interaction was found to be appropriate. :rtype: Union[int, None] """ from sims4communitylib.utils.sims.common_species_utils import CommonSpeciesUtils if CommonSpeciesUtils.is_human(sim_info): return CommonInteractionId.SIM_STAND elif CommonSpeciesUtils.is_dog(sim_info): return CommonInteractionId.DOG_STAND elif CommonSpeciesUtils.is_cat(sim_info): return CommonInteractionId.CAT_STAND return None
def _map_motive_id(sim_info: SimInfo, motive_id: int) -> int: motive_mappings = CommonSimMotiveUtils._get_motive_mappings() if motive_id not in motive_mappings: return motive_id motive_species_mapping: Dict[Species, CommonMotiveId] = motive_mappings[motive_id] species = CommonSpeciesUtils.get_species(sim_info) if species not in motive_species_mapping: return motive_id return motive_species_mapping[species]
def can_translate_motive(self, sim_info: SimInfo, motive_name: str) -> bool: """ Determine if a motive is valid. """ if motive_name is None: return False if motive_name == CMMotive.BOWEL: if not CommonSpeciesUtils.is_pet(sim_info): return False return True return motive_name in CMMotiveUtils._MOTIVE_MAPPINGS
def can_impregnate(sim_info: SimInfo) -> bool: """ Determine if a Sim can impregnate other sims. """ from sims4communitylib.utils.sims.common_trait_utils import CommonTraitUtils from sims4communitylib.enums.traits_enum import CommonTraitId if CommonSpeciesUtils.is_human(sim_info): if CommonTraitUtils.has_trait( sim_info, CommonTraitId.GENDER_OPTIONS_PREGNANCY_CAN_NOT_IMPREGNATE): return False return CommonTraitUtils.has_trait( sim_info, CommonTraitId.GENDER_OPTIONS_PREGNANCY_CAN_IMPREGNATE) elif CommonSpeciesUtils.is_pet(sim_info): if CommonTraitUtils.has_trait( sim_info, CommonTraitId.PREGNANCY_OPTIONS_PET_CAN_NOT_REPRODUCE): return False return CommonTraitUtils.has_trait( sim_info, CommonTraitId.PREGNANCY_OPTIONS_PET_CAN_REPRODUCE) return False
def get_species(sim_info: SimInfo) -> 'CommonSpecies': """get_species(sim_info) Retrieve the CommonSpecies of a sim. Use this instead of CommonSpeciesUtils.get_species to determine a more specific species. :param sim_info: An instance of a Sim. :type sim_info: SimInfo :return: A species matching the Sim or CommonSpecies.INVALID if no matching species is found. :rtype: CommonSpecies """ from sims4communitylib.utils.sims.common_species_utils import CommonSpeciesUtils if CommonSpeciesUtils.is_human(sim_info): return CommonSpecies.HUMAN elif CommonSpeciesUtils.is_small_dog(sim_info): return CommonSpecies.SMALL_DOG elif CommonSpeciesUtils.is_large_dog(sim_info): return CommonSpecies.LARGE_DOG elif CommonSpeciesUtils.is_cat(sim_info): return CommonSpecies.CAT return CommonSpecies.INVALID
def _try_apply_traits(self, sim_info: SimInfo): if CommonSpeciesUtils.is_human(sim_info): CommonTraitUtils.remove_trait( sim_info, CommonTraitId.S4CL_MAIN_TRAIT_LARGE_DOG, CommonTraitId.S4CL_MAIN_TRAIT_SMALL_DOG, CommonTraitId.S4CL_MAIN_TRAIT_CAT) if CommonTraitUtils.has_trait(sim_info, CommonTraitId.S4CL_MAIN_TRAIT_HUMAN): return CommonTraitUtils.add_trait(sim_info, CommonTraitId.S4CL_MAIN_TRAIT_HUMAN) elif CommonSpeciesUtils.is_large_dog(sim_info): CommonTraitUtils.remove_trait( sim_info, CommonTraitId.S4CL_MAIN_TRAIT_HUMAN, CommonTraitId.S4CL_MAIN_TRAIT_SMALL_DOG, CommonTraitId.S4CL_MAIN_TRAIT_CAT) if CommonTraitUtils.has_trait( sim_info, CommonTraitId.S4CL_MAIN_TRAIT_LARGE_DOG): return CommonTraitUtils.add_trait(sim_info, CommonTraitId.S4CL_MAIN_TRAIT_LARGE_DOG) elif CommonSpeciesUtils.is_small_dog(sim_info): CommonTraitUtils.remove_trait( sim_info, CommonTraitId.S4CL_MAIN_TRAIT_HUMAN, CommonTraitId.S4CL_MAIN_TRAIT_LARGE_DOG, CommonTraitId.S4CL_MAIN_TRAIT_CAT) if CommonTraitUtils.has_trait( sim_info, CommonTraitId.S4CL_MAIN_TRAIT_SMALL_DOG): return CommonTraitUtils.add_trait(sim_info, CommonTraitId.S4CL_MAIN_TRAIT_SMALL_DOG) elif CommonSpeciesUtils.is_cat(sim_info): CommonTraitUtils.remove_trait( sim_info, CommonTraitId.S4CL_MAIN_TRAIT_HUMAN, CommonTraitId.S4CL_MAIN_TRAIT_LARGE_DOG, CommonTraitId.S4CL_MAIN_TRAIT_SMALL_DOG) if CommonTraitUtils.has_trait(sim_info, CommonTraitId.S4CL_MAIN_TRAIT_CAT): return CommonTraitUtils.add_trait(sim_info, CommonTraitId.S4CL_MAIN_TRAIT_CAT)
def is_baby_toddler_or_child_human(sim_info: SimInfo) -> bool: """is_baby_toddler_or_child_human(sim_info) Determine if a sim is a Baby, Toddler, or Child Human. :param sim_info: The Sim to check. :type sim_info: SimInfo :return: True, if the Sim is a Baby, Toddler, or Child Human. False, if the Sim is not. :rtype: bool """ return CommonAgeUtils.is_baby_toddler_or_child( sim_info) and CommonSpeciesUtils.is_human(sim_info)
def is_old_pet(sim_info: SimInfo) -> bool: """is_old_pet(sim_info) Determine if a sim is an Adult or Elder Pet (Cat, Small Dog, Large Dog). :param sim_info: The Sim to check. :type sim_info: SimInfo :return: True, if the Sim is an Adult or Elder Pet (Cat, Small Dog, Large Dog). False, if the Sim is not. :rtype: bool """ return CommonAgeUtils.is_adult_or_elder( sim_info) and CommonSpeciesUtils.is_pet(sim_info)
def is_mature_adult_human(sim_info: SimInfo) -> bool: """is_mature_adult_human(sim_info) Determine if a sim is an Adult Human. :param sim_info: The Sim to check. :type sim_info: SimInfo :return: True, if the Sim is an Adult Human. False, if the Sim is not. :rtype: bool """ return CommonAgeUtils.is_mature_adult( sim_info) and CommonSpeciesUtils.is_human(sim_info)
def is_child_or_teen_human(sim_info: SimInfo) -> bool: """is_child_or_teen_human(sim_info) Determine if a sim is a Child or Teen Human. :param sim_info: The Sim to check. :type sim_info: SimInfo :return: True, if the Sim is a Child or Teen Human. False, if the Sim is not. :rtype: bool """ return CommonAgeUtils.is_child_or_teen( sim_info) and CommonSpeciesUtils.is_human(sim_info)
def is_teen_adult_or_elder_human(sim_info: SimInfo) -> bool: """is_teen_adult_or_elder_human(sim_info) Determine if a sim is a Teen, Young Adult, Adult, or Elder Human. :param sim_info: The Sim to check. :type sim_info: SimInfo :return: True, if the Sim is a Teen, Young Adult, Adult, or Elder Human. False, if the Sim is not. :rtype: bool """ return CommonAgeUtils.is_teen_adult_or_elder( sim_info) and CommonSpeciesUtils.is_human(sim_info)
def get_in_labor_buff(sim_info: SimInfo) -> Union[int, CommonBuffId]: """get_in_labor_buff(sim_info) Retrieve an In Labor buff appropriate for causing the Sim to go into labor (Give Birth). :param sim_info: An instance of a Sim. :type sim_info: SimInfo :return: The decimal identifier of a Buff that will cause the specified Sim to go into labor. If no appropriate Buff is found, -1 will be returned. :rtype: Union[int, CommonBuffId] """ from sims4communitylib.utils.sims.common_gender_utils import CommonGenderUtils sim_name = CommonSimNameUtils.get_full_name(sim_info) log.debug( 'Locating appropriate Buff for inducing labor in \'{}\'.'.format( sim_name)) is_female = CommonGenderUtils.is_female(sim_info) if CommonSpeciesUtils.is_human(sim_info): log.debug('\'{}\' is Human.'.format(sim_name)) if is_female: log.debug('\'{}\' is Female.'.format(sim_name)) return CommonBuffId.PREGNANCY_IN_LABOR else: log.debug('\'{}\' is Male.'.format(sim_name)) return CommonBuffId.PREGNANCY_IN_LABOR_MALE elif CommonSpeciesUtils.is_dog(sim_info): log.debug('\'{}\' is a Dog.'.format(sim_name)) if is_female: log.debug('\'{}\' is Female.'.format(sim_name)) return CommonBuffId.PREGNANCY_IN_LABOR_PET_DOG elif CommonSpeciesUtils.is_cat(sim_info): log.debug('\'{}\' is a Cat.'.format(sim_name)) if is_female: log.debug('\'{}\' is Female.'.format(sim_name)) return CommonBuffId.PREGNANCY_IN_LABOR_PET_CAT log.debug( 'No appropriate Buff located to induce labor in \'{}\'.'.format( sim_name)) return -1
def get_pregnancy_progress(sim_info: SimInfo) -> float: """ Retrieve the pregnancy progress of a Sim. """ pregnancy_tracker = CommonSimPregnancyUtils._get_pregnancy_tracker( sim_info) if pregnancy_tracker is None or not CommonSimPregnancyUtils.is_pregnant( sim_info): return 0.0 pregnancy_commodity_type = pregnancy_tracker.PREGNANCY_COMMODITY_MAP.get( CommonSpeciesUtils.get_species(sim_info)) statistic_tracker = sim_info.get_tracker(pregnancy_commodity_type) pregnancy_commodity = statistic_tracker.get_statistic( pregnancy_commodity_type, add=False) if not pregnancy_commodity: return 0.0 return pregnancy_commodity.get_value()
def are_same_age_and_species(sim_info: SimInfo, other_sim_info: SimInfo) -> bool: """are_same_age_and_species(sim_info, other_sim_info) Determine if two Sims are the same Age and the same Species. :param sim_info: The Sim to check. :type sim_info: SimInfo :param other_sim_info: The other Sim to compare to. :type other_sim_info: SimInfo :return: True, if both Sims are the same Age and Species. False, if they are not. :rtype: bool """ return CommonAgeUtils.are_same_age( sim_info, other_sim_info) and CommonSpeciesUtils.are_same_species( sim_info, other_sim_info)
def get_bowels_level(sim_info: SimInfo) -> float: """get_bowels_level(sim_info) Retrieve the bowel level of a Sim. .. note:: Human Sims do not have Bowels. (As hard as that is to believe) :param sim_info: The Sim to get the level of. :type sim_info: SimInfo :return: The current level of the Motive of the Sim. :rtype: float """ if CommonSpeciesUtils.is_human(sim_info): return -1.0 return CommonSimMotiveUtils._get_motive_level(sim_info, CommonMotiveId.BOWEL)
def open(self): """ Open the dialog. """ try: def _on_close() -> None: if self._on_close is not None: self._on_close() if CommonSpeciesUtils.is_pet(self._sim_info): self._settings_pet(on_close=_on_close) else: self._settings_human(on_close=_on_close) except Exception as ex: self.log.error( 'Error occurred while opening custom gender settings dialog.', exception=ex)
def are_allowed_romantic_relationship(sim_info_a: SimInfo, sim_info_b: SimInfo) -> bool: """Whether or not two Sims are allowed to have a Romantic relationship together.""" if not S4CMSettingUtils.is_allowed_romantic_relationship( sim_info_a ) or not S4CMSettingUtils.is_allowed_romantic_relationship(sim_info_b): return False if CommonRelationshipUtils.are_blood_relatives(sim_info_a, sim_info_b): return False if not CommonSpeciesUtils.are_same_species(sim_info_a, sim_info_b): return False if CommonAgeUtils.is_teen(sim_info_a) and CommonAgeUtils.is_teen( sim_info_b): return True # Teen to Teen is ok, this check prevents Teen to Adult/Elder/etc. like vanilla has it. if CommonAgeUtils.is_teen(sim_info_a) or CommonAgeUtils.is_teen( sim_info_b): return False # If the Sims are not Adults, they can be assumed to be either a Young Adult, Adult, or Elder return CommonAgeUtils.is_adult_or_elder(sim_info_a)\ and CommonAgeUtils.is_adult_or_elder(sim_info_b)