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
예제 #3
0
 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)
예제 #5
0
 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
예제 #6
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
예제 #8
0
 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]
예제 #16
0
 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
예제 #17
0
 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)
예제 #20
0
    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)
예제 #21
0
    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)
예제 #22
0
    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)
예제 #23
0
    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)
예제 #24
0
    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
예제 #26
0
 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()
예제 #27
0
    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)
예제 #29
0
    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)
예제 #30
0
 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)