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)
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)
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)
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)
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)
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)
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)
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
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)
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)
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)
def is_alien(sim_info: SimInfo) -> bool: """ Determine if a sim is an Alien. """ return CommonTraitUtils.has_trait(sim_info, CommonTraitId.OCCULT_ALIEN)
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)
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
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)