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 _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 can_not_impregnate(sim_info: SimInfo) -> bool:
        """can_not_impregnate(sim_info)

        Determine if a sim Can Not Impregnate.

        .. note:: Use :func:`~can_not_reproduce` for Pet Sims.
        .. note:: This will check for a sim to not also have the GENDER_OPTIONS_PREGNANCY_CAN_IMPREGNATE trait.

        :param sim_info: The Sim to check.
        :type sim_info: SimInfo
        :return: True, if the Sim can not impregnate other Sims. False, if the Sim can impregnate other Sims.
        :rtype: bool
        """
        return CommonTraitUtils.has_trait(sim_info, CommonTraitId.GENDER_OPTIONS_PREGNANCY_CAN_NOT_IMPREGNATE)\
               and not CommonTraitUtils.has_trait(sim_info, CommonTraitId.GENDER_OPTIONS_PREGNANCY_CAN_IMPREGNATE)
    def can_not_be_impregnated(sim_info: SimInfo) -> bool:
        """can_not_be_impregnated(sim_info)

        Determine if a sim Can Not Be Impregnated.

        .. note:: Use :func:`~can_not_reproduce` for Pet Sims.
        .. note:: Will return False if the sim has the GENDER_OPTIONS_PREGNANCY_CAN_BE_IMPREGNATED trait.

        :param sim_info: The Sim to check.
        :type sim_info: SimInfo
        :return: True, if the Sim can not be impregnated. False, if the Sim can be impregnated.
        :rtype: bool
        """
        return CommonTraitUtils.has_trait(sim_info, CommonTraitId.GENDER_OPTIONS_PREGNANCY_CAN_NOT_BE_IMPREGNATED)\
               and not CommonTraitUtils.has_trait(sim_info, CommonTraitId.GENDER_OPTIONS_PREGNANCY_CAN_BE_IMPREGNATED)
    def can_not_reproduce(sim_info: SimInfo) -> bool:
        """can_not_reproduce(sim_info)

        Determine if a pet sim can reproduce.

        ..note:: Use :func:`~can_not_impregnate` and :func:`~can_not_be_impregnated` for Human Sims.
        .. note:: Will return False if the pet sim has the PREGNANCY_OPTIONS_PET_CAN_REPRODUCE trait.

        :param sim_info: The Sim to check.
        :type sim_info: SimInfo
        :return: True, if the Sim can not reproduce. False, if the Sim can reproduce.
        :rtype: bool
        """
        return CommonTraitUtils.has_trait(sim_info, CommonTraitId.PREGNANCY_OPTIONS_PET_CAN_NOT_REPRODUCE)\
               and not CommonTraitUtils.has_trait(sim_info, CommonTraitId.PREGNANCY_OPTIONS_PET_CAN_REPRODUCE)
예제 #6
0
 def is_cat(sim_info: SimInfo) -> bool:
     """
         Determine if a sim is a Cat.
     """
     from sims4communitylib.utils.sims.common_trait_utils import CommonTraitUtils
     from sims4communitylib.enums.traits_enum import CommonTraitId
     return CommonSpeciesUtils.is_cat_species(
         CommonSpeciesUtils.get_species(sim_info)
     ) or CommonTraitUtils.has_trait(sim_info, CommonTraitId.SPECIES_CAT)
예제 #7
0
 def is_small_dog(sim_info: SimInfo) -> bool:
     """
         Determine if a sim is a Small Dog.
     """
     from sims4communitylib.utils.sims.common_trait_utils import CommonTraitUtils
     from sims4communitylib.enums.traits_enum import CommonTraitId
     return CommonSpeciesUtils.is_dog_species(
         CommonSpeciesUtils.get_species(
             sim_info)) and CommonTraitUtils.has_trait(
                 sim_info, CommonTraitId.SPECIES_EXTENDED_SMALL_DOGS)
예제 #8
0
    def is_plant_sim(sim_info: SimInfo) -> bool:
        """is_plant_sim(sim_info)

        Determine if a Sim is a Plant Sim.

        :param sim_info: An instance of a Sim.
        :type sim_info: SimInfo
        :return: True, if the Sim is a Plant Sim. False, if not.
        :rtype: bool
        """
        return CommonTraitUtils.has_trait(sim_info, CommonTraitId.PLANT_SIM)
예제 #9
0
    def is_alien(sim_info: SimInfo) -> bool:
        """is_alien(sim_info)

        Determine if a Sim is an Alien.

        :param sim_info: An instance of a Sim.
        :type sim_info: SimInfo
        :return: True, if the Sim is an Alien. False, if not.
        :rtype: bool
        """
        return CommonTraitUtils.has_trait(sim_info, CommonTraitId.OCCULT_ALIEN)
예제 #10
0
    def is_plant_sim(sim_info: SimInfo) -> bool:
        """is_plant_sim(sim_info)

        Determine if a sim is a Plant Sim.

        :param sim_info: The Sim to check.
        :type sim_info: SimInfo
        :return: True, if the Sim is the Occult. False, if not.
        :rtype: bool
        """
        return CommonTraitUtils.has_trait(sim_info, CommonTraitId.PLANT_SIM)
예제 #11
0
    def is_vampire(sim_info: SimInfo) -> bool:
        """is_vampire(sim_info)

        Determine if a sim is a Vampire.

        :param sim_info: The Sim to check.
        :type sim_info: SimInfo
        :return: True, if the Sim is the Occult. False, if not.
        :rtype: bool
        """
        return CommonTraitUtils.has_trait(sim_info, CommonTraitId.OCCULT_VAMPIRE)
예제 #12
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 has_breasts(sim_info: SimInfo) -> bool:
        """has_breasts(sim_info)

        Determine if a Sim has breasts.

        .. note:: This will True if breasts are being forced on the Sim.

        :param sim_info: An instance of a Sim.
        :type sim_info: SimInfo
        :return: True, if the Sim has breasts. False, if not.
        :rtype: bool
        """
        if CommonGenderUtils.is_female(
                sim_info) and not CommonTraitUtils.has_trait(
                    sim_info, CommonTraitId.BREASTS_FORCE_OFF):
            return True
        if CommonGenderUtils.is_male(sim_info) and CommonTraitUtils.has_trait(
                sim_info, CommonTraitId.BREASTS_FORCE_ON):
            return True
        return False
예제 #14
0
    def is_alien(sim_info: SimInfo) -> bool:
        """is_alien(sim_info)

        Determine if a sim is an Alien.

        :param sim_info: The Sim to check.
        :type sim_info: SimInfo
        :return: True, if the Sim is the Occult. False, if not.
        :rtype: bool
        """
        return CommonTraitUtils.has_trait(sim_info, CommonTraitId.OCCULT_ALIEN)
 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 prefers_womenswear(sim_info: SimInfo) -> bool:
        """prefers_womenswear(sim_info)

        Determine if a sim prefers Womens Clothing.

        :param sim_info: The Sim to check.
        :type sim_info: SimInfo
        :return: True, if the Sim does. False, if the Sim does not.
        :rtype: bool
        """
        return CommonTraitUtils.has_trait(
            sim_info, CommonTraitId.GENDER_OPTIONS_CLOTHING_WOMENS_WEAR)
    def has_feminine_frame(sim_info: SimInfo) -> bool:
        """has_feminine_frame(sim_info)

        Determine if a sim has a Feminine Body Frame.

        :param sim_info: The Sim to check.
        :type sim_info: SimInfo
        :return: True, if the Sim does. False, if the Sim does not.
        :rtype: bool
        """
        return CommonTraitUtils.has_trait(
            sim_info, CommonTraitId.GENDER_OPTIONS_FRAME_FEMININE)
    def uses_toilet_sitting(sim_info: SimInfo) -> bool:
        """uses_toilet_sitting(sim_info)

        Determine if a sim uses the toilet while sitting.

        :param sim_info: The Sim to check.
        :type sim_info: SimInfo
        :return: True, if the Sim uses toilets while sitting. False, if the Sim does not use toilets while sitting.
        :rtype: bool
        """
        return CommonTraitUtils.has_trait(
            sim_info, CommonTraitId.GENDER_OPTIONS_TOILET_SITTING)
예제 #19
0
    def is_vampire(sim_info: SimInfo) -> bool:
        """is_vampire(sim_info)

        Determine if a Sim is a Vampire.

        :param sim_info: An instance of a Sim.
        :type sim_info: SimInfo
        :return: True, if the Sim is a Vampire. False, if not.
        :rtype: bool
        """
        return CommonTraitUtils.has_trait(sim_info,
                                          CommonTraitId.OCCULT_VAMPIRE)
    def is_cat(sim_info: SimInfo) -> bool:
        """is_cat(sim_info)

        Determine if a sim is a Cat.

        :param sim_info: The Sim to check.
        :type sim_info: SimInfo
        :return: True, if the Sim is a Cat. False, if not.
        :rtype: bool
        """
        from sims4communitylib.utils.sims.common_trait_utils import CommonTraitUtils
        from sims4communitylib.enums.traits_enum import CommonTraitId
        return CommonSpeciesUtils.is_cat_species(
            CommonSpeciesUtils.get_species(sim_info)
        ) or CommonTraitUtils.has_trait(sim_info, CommonTraitId.SPECIES_CAT)
    def is_small_dog(sim_info: SimInfo) -> bool:
        """is_small_dog(sim_info)

        Determine if a sim is a Small Dog.

        :param sim_info: The Sim to check.
        :type sim_info: SimInfo
        :return: True, if the Sim is a Small Dog. False, if not.
        :rtype: bool
        """
        from sims4communitylib.utils.sims.common_trait_utils import CommonTraitUtils
        from sims4communitylib.enums.traits_enum import CommonTraitId
        return CommonSpeciesUtils.is_dog_species(
            CommonSpeciesUtils.get_species(
                sim_info)) and CommonTraitUtils.has_trait(
                    sim_info, CommonTraitId.SPECIES_EXTENDED_SMALL_DOGS)
예제 #22
0
    def is_service_sim(sim_info: SimInfo) -> bool:
        """Determine if a Sim is a Service Sim.

        .. note::

            Service Sims:

            - Butler
            - Chalet
            - City Repair
            - Forest Ranger
            - Gardener
            - Grim Reaper
            - Maid
            - Mailman
            - Massage Therapist
            - Master Fisherman
            - Master Gardener
            - Master Herbalist
            - Nanny
            - Pizza Delivery
            - Repairman
            - Restaurant Critic
            - Statue Busker

        :param sim_info: The Sim to check.
        :type sim_info: SimInfo
        :return: True, if the Sim is a Service Sim. False, if not.
        :rtype: bool
        """
        from sims4communitylib.enums.traits_enum import CommonTraitId
        from sims4communitylib.utils.sims.common_trait_utils import CommonTraitUtils
        trait_ids = (
            CommonTraitId.IS_BUTLER, CommonTraitId.IS_CHALET_GARDENS_GHOST,
            CommonTraitId.IS_CITY_REPAIR, CommonTraitId.IS_FOREST_RANGER,
            CommonTraitId.IS_GARDENER, CommonTraitId.IS_GARDENER_SERVICE,
            CommonTraitId.IS_GRIM_REAPER, CommonTraitId.IS_MAID,
            CommonTraitId.IS_MAILMAN, CommonTraitId.IS_MASSAGE_THERAPIST,
            CommonTraitId.IS_MASTER_FISHERMAN,
            CommonTraitId.IS_MASTER_GARDENER,
            CommonTraitId.IS_MASTER_HERBALIST, CommonTraitId.IS_NANNY,
            CommonTraitId.IS_PIZZA_DELIVERY, CommonTraitId.IS_REPAIR,
            CommonTraitId.IS_RESTAURANT_CRITIC, CommonTraitId.IS_STATUE_BUSKER)
        return CommonTraitUtils.has_trait(sim_info, *trait_ids)
예제 #23
0
 def is_alien(sim_info: SimInfo) -> bool:
     """
         Determine if a sim is an Alien.
     """
     return CommonTraitUtils.has_trait(sim_info, CommonTraitId.OCCULT_ALIEN)
예제 #24
0
 def is_plant_sim(sim_info: SimInfo) -> bool:
     """
         Determine if a sim is a Plant Sim.
     """
     return CommonTraitUtils.has_trait(sim_info, CommonTraitId.PLANT_SIM)
예제 #25
0
 def is_vampire(sim_info: SimInfo) -> bool:
     """
         Determine if a sim is a Vampire.
     """
     return CommonTraitUtils.has_trait(sim_info,
                                       CommonTraitId.OCCULT_VAMPIRE)
    def run(self,
            sim_info: SimInfo,
            on_completed: Callable[[bool], None] = CommonFunctionUtils.noop,
            current_page: int = 1) -> bool:
        def _reopen() -> None:
            self.run(sim_info,
                     on_completed=on_completed,
                     current_page=option_dialog.current_page)

        def _on_close() -> None:
            on_completed(False)

        @CommonExceptionHandler.catch_exceptions(self.mod_identity,
                                                 fallback_return=False)
        def _on_submit(chosen_traits: Tuple[Trait]):
            trait_tracker: TraitTracker = sim_info.trait_tracker
            for personality_trait in trait_tracker.personality_traits:
                CommonTraitUtils.remove_trait(sim_info, personality_trait)

            for chosen_trait in chosen_traits:
                CommonTraitUtils.add_trait(sim_info, chosen_trait)

            # noinspection PyUnresolvedReferences
            CommonBasicNotification(
                S4CMSimControlMenuStringId.SET_PERSONALITY_TRAITS_TITLE,
                S4CMSimControlMenuStringId.SET_PERSONALITY_TRAITS_DESCRIPTION,
                description_tokens=(
                    CommonSimUtils.get_sim_instance(sim_info),
                )).show(icon=IconInfoData(
                    obj_instance=CommonSimUtils.get_sim_instance(sim_info)))
            _reopen()

        option_dialog = CommonChooseObjectsOptionDialog(
            S4CMSimControlMenuStringId.SET_PERSONALITY_TRAITS_MAX,
            0,
            title_tokens=(str(sim_info.trait_tracker.equip_slot_number), ),
            on_close=_on_close,
            mod_identity=self.mod_identity,
            per_page=20000)

        current_personality_trait_ids = [
            CommonTraitUtils.get_trait_id(pers_trait)
            for pers_trait in sim_info.trait_tracker.personality_traits
        ]
        self.log.format_with_message(
            'current_personality_traits',
            current_personality_trait_ids=current_personality_trait_ids)
        all_traits = [
            personality_trait
            for (trait_type, personality_trait
                 ) in CommonResourceUtils.load_all_instances(Types.TRAIT)
            if personality_trait.is_personality_trait
            and personality_trait.is_valid_trait(sim_info)
        ]
        for trait in sorted(all_traits,
                            key=lambda _trait: CommonTraitUtils.get_trait_name(
                                _trait).lower()):
            trait: Trait = trait
            trait_id = CommonTraitUtils.get_trait_id(trait)
            if trait_id is None:
                self.log.format_with_message('Missing trait id for Trait.',
                                             trait=trait)
                continue
            try:
                # noinspection PyUnresolvedReferences
                display_name = trait.display_name(sim_info)
                if display_name.hash == 0:
                    trait_name = CommonTraitUtils.get_trait_name(
                        trait) or 'Unknown Trait Name'
                    trait_name = trait_name[0].upper() + trait_name[1:]
                    # noinspection PyUnresolvedReferences
                    display_name = CommonLocalizationUtils.create_localized_string(
                        S4CMSimControlMenuStringId.STRING_SPACE_PAREN_STRING,
                        tokens=(trait_name, trait.trait_type.name))
                else:
                    # noinspection PyUnresolvedReferences
                    display_name = CommonLocalizationUtils.create_localized_string(
                        S4CMSimControlMenuStringId.STRING_SPACE_PAREN_STRING,
                        tokens=(
                            CommonLocalizationUtils.create_localized_string(
                                display_name,
                                tokens=(sim_info, )), trait.trait_type.name))
                display_name = CommonLocalizationUtils.colorize(
                    display_name, CommonLocalizedStringColor.GREEN
                ) if CommonTraitUtils.has_trait(sim_info,
                                                trait_id) else display_name
                # noinspection PyUnresolvedReferences
                description = CommonLocalizationUtils.create_localized_string(
                    trait.trait_description._string_id, tokens=(sim_info, ))
                # noinspection PyUnresolvedReferences
                icon = trait.icon or CommonIconUtils.load_question_mark_icon()
                # MISSING ICON Identifier
                _MISSING_IMAGE_ICON_ID = 3526464109639239417
                if icon.instance == 0 or icon.instance == _MISSING_IMAGE_ICON_ID:
                    icon = CommonIconUtils.load_question_mark_icon()
                option_dialog.add_option(
                    CommonDialogSelectOption(
                        trait_id, trait,
                        CommonDialogOptionContext(
                            display_name,
                            description,
                            icon=icon,
                            is_selected=trait_id
                            in current_personality_trait_ids)))
            except Exception as ex:
                self.log.format_error_with_message(
                    'Failed to display trait.',
                    trait=trait,
                    trait_name=CommonTraitUtils.get_trait_name(trait),
                    trait_id=trait_id,
                    exception=ex)

        if not option_dialog.has_options():
            on_completed(False)
            return False
        option_dialog.show(
            sim_info=sim_info,
            page=current_page,
            min_selectable=0,
            max_selectable=sim_info.trait_tracker.equip_slot_number,
            on_submit=_on_submit,
            allow_no_selection=True)
        return True
예제 #27
0
    def _settings_human(self, on_close: Callable[[], Any] = None) -> None:
        def _on_close() -> None:
            if on_close is not None:
                on_close()

        def _reopen():
            self._settings_human(on_close=on_close)

        option_dialog = CommonChooseObjectOptionDialog(
            CommonStringId.CUSTOM_GENDER_SETTINGS,
            CGSStringId.CGS_CUSTOM_GENDER_SETTINGS_DESCRIPTION,
            mod_identity=self.mod_identity,
            on_close=_on_close)

        option_dialog.add_option(
            CommonDialogActionOption(
                CommonDialogOptionContext(
                    CGSStringId.GLOBAL_SETTINGS_NAME,
                    CGSStringId.GLOBAL_SETTINGS_DESCRIPTION),
                on_chosen=CGSGlobalSettingsDialog(self._sim_info,
                                                  on_close=_reopen).open))

        def _set_to_vanilla_gender_chosen():
            if CommonGenderUtils.is_male(self._sim_info):
                CommonSimGenderOptionUtils.update_gender_options_to_vanilla_male(
                    self._sim_info)
            else:
                CommonSimGenderOptionUtils.update_gender_options_to_vanilla_female(
                    self._sim_info)
            _reopen()

        option_dialog.add_option(
            CommonDialogActionOption(CommonDialogOptionContext(
                CGSStringId.CGS_SET_TO_VANILLA_GENDER_OPTIONS_NAME,
                CGSStringId.CGS_SET_TO_VANILLA_GENDER_OPTIONS_DESCRIPTION,
                icon=CommonIconUtils.load_arrow_right_icon()),
                                     on_chosen=_set_to_vanilla_gender_chosen))

        def _on_gender_chosen():
            CommonGenderUtils.swap_gender(self._sim_info,
                                          update_gender_options=False)
            _reopen()

        current_gender_string = CGSStringId.MALE
        if CommonGenderUtils.is_female(self._sim_info):
            current_gender_string = CGSStringId.FEMALE

        option_dialog.add_option(
            CommonDialogActionOption(CommonDialogOptionContext(
                CGSStringId.CGS_SWAP_GENDER_NAME,
                CGSStringId.CGS_SWAP_GENDER_DESCRIPTION,
                title_tokens=(current_gender_string, ),
                icon=CommonIconUtils.load_arrow_right_icon()),
                                     on_chosen=_on_gender_chosen))

        def _on_physical_frame_chosen():
            value = not CommonSimGenderOptionUtils.has_masculine_frame(
                self._sim_info)
            CommonSimGenderOptionUtils.update_body_frame(self._sim_info, value)
            _reopen()

        current_body_frame = CommonStringId.FEMININE
        if CommonSimGenderOptionUtils.has_masculine_frame(self._sim_info):
            current_body_frame = CommonStringId.MASCULINE

        option_dialog.add_option(
            CommonDialogActionOption(CommonDialogOptionContext(
                CommonStringId.PHYSICAL_FRAME,
                CGSStringId.CGS_CURRENT,
                description_tokens=(current_body_frame, ),
                icon=CommonIconUtils.load_arrow_right_icon()),
                                     on_chosen=_on_physical_frame_chosen))

        current_clothing = CommonStringId.FEMININE
        if CommonSimGenderOptionUtils.prefers_menswear(self._sim_info):
            current_clothing = CommonStringId.MASCULINE

        def _on_clothing_preference_chosen():
            value = not CommonSimGenderOptionUtils.prefers_menswear(
                self._sim_info)
            CommonSimGenderOptionUtils.update_clothing_preference(
                self._sim_info, value)
            _reopen()

        option_dialog.add_option(
            CommonDialogActionOption(CommonDialogOptionContext(
                CommonStringId.CLOTHING_PREFERENCE,
                CGSStringId.CGS_CURRENT,
                description_tokens=(current_clothing, ),
                icon=CommonIconUtils.load_arrow_right_icon()),
                                     on_chosen=_on_clothing_preference_chosen))

        def _on_toggle_breasts_chosen(option_identifier: str,
                                      has_breasts: bool):
            self.log.format(option_identifier=option_identifier,
                            has_breasts=has_breasts)

            def _on_acknowledged(_):
                _reopen()

            CommonSimGenderOptionUtils.update_has_breasts(
                self._sim_info, has_breasts)
            CommonOkDialog(
                CGSStringId.CGS_SETTING_SAVE_RELOAD_ALERT_NAME,
                CGSStringId.CGS_SETTING_SAVE_RELOAD_ALERT_DESCRIPTION).show(
                    on_acknowledged=_on_acknowledged)

        has_vanilla_breasts = False
        if CommonGenderUtils.is_female(self._sim_info):
            has_vanilla_breasts = not CommonTraitUtils.has_trait(
                self._sim_info, CommonTraitId.BREASTS_FORCE_OFF)

        option_dialog.add_option(
            CommonDialogToggleOption(
                'ToggleBreasts',
                CommonTraitUtils.has_trait(self._sim_info,
                                           CommonTraitId.BREASTS_FORCE_ON)
                or has_vanilla_breasts,
                CommonDialogOptionContext(
                    CGSStringId.CGS_TOGGLE_BREASTS_NAME,
                    CGSStringId.CGS_TOGGLE_BREASTS_DESCRIPTION),
                on_chosen=_on_toggle_breasts_chosen))

        option_dialog.add_option(
            CommonDialogActionOption(CommonDialogOptionContext(
                CGSStringId.CGS_PREGNANCY_OPTIONS_NAME,
                CGSStringId.CGS_PREGNANCY_OPTIONS_DESCRIPTION,
                icon=CommonIconUtils.load_arrow_navigate_into_icon()),
                                     on_chosen=lambda *_, **__: self.
                                     _pregnancy_options(on_close=_reopen)))

        title = CGSStringId.CGS_TOGGLE_CAN_USE_TOILET_STANDING_NAME
        if CommonSimGenderOptionUtils.uses_toilet_standing(self._sim_info):
            title = CommonLocalizationUtils.create_localized_string(
                title, text_color=CommonLocalizedStringColor.GREEN)
            icon = CommonIconUtils.load_checked_square_icon()
        else:
            icon = CommonIconUtils.load_unchecked_square_icon()
        text = CGSStringId.CGS_TOGGLE_CAN_USE_TOILET_STANDING_DESCRIPTION

        def _on_toilet_usage_chosen():
            value = not CommonSimGenderOptionUtils.uses_toilet_standing(
                self._sim_info)
            CommonSimGenderOptionUtils.update_toilet_usage(
                self._sim_info, value)
            _reopen()

        option_dialog.add_option(
            CommonDialogActionOption(CommonDialogOptionContext(title,
                                                               text,
                                                               icon=icon),
                                     on_chosen=_on_toilet_usage_chosen))

        option_dialog.show(sim_info=self._sim_info)