Example #1
0
def update_nude_body_data(sim_identifier, force_update=False):
    sim_info = TurboManagerUtil.Sim.get_sim_info(sim_identifier)
    if TurboSimUtil.Age.is_younger_than(sim_info, TurboSimUtil.Age.CHILD):
        return
    if has_sim_trait(sim_info, SimTrait.GENDEROPTIONS_TOILET_STANDING):
        from wickedwhims.sxex_bridge.penis import get_penis_soft_cas_id, get_penis_soft_texture_cas_id, get_penis_hard_cas_id, get_penis_hard_texture_cas_id
        sim_ev(sim_info).penis_outfit_parts['soft'] = get_penis_soft_cas_id(sim_info)
        sim_ev(sim_info).penis_outfit_parts['soft_texture'] = get_penis_soft_texture_cas_id(sim_info)
        sim_ev(sim_info).penis_outfit_parts['hard'] = get_penis_hard_cas_id(sim_info)
        sim_ev(sim_info).penis_outfit_parts['hard_texture'] = get_penis_hard_texture_cas_id(sim_info)
    from wickedwhims.nudity.nudity_settings import NuditySetting, get_nudity_setting
    if sim_ev(sim_info).nude_outfit_parts[TurboCASUtil.BodyType.UPPER_BODY] == -1 or force_update is True:
        if get_nudity_setting(NuditySetting.NUDITY_ASSURANCE_STATE, variable_type=bool):
            top_body_part_cas_id = get_default_nude_cas_part_id(sim_info, TurboCASUtil.BodyType.UPPER_BODY)
        else:
            top_body_part_cas_id = get_sim_outfit_cas_part_from_bodytype(sim_info, TurboCASUtil.BodyType.UPPER_BODY, outfit_category_and_index=(TurboCASUtil.OutfitCategory.BATHING, 0))
        sim_ev(sim_info).nude_outfit_parts[TurboCASUtil.BodyType.UPPER_BODY] = top_body_part_cas_id
    if sim_ev(sim_info).nude_outfit_parts[TurboCASUtil.BodyType.LOWER_BODY] == -1 or force_update is True:
        if has_sim_trait(sim_info, SimTrait.GENDEROPTIONS_TOILET_STANDING):
            sim_ev(sim_info).nude_outfit_parts[TurboCASUtil.BodyType.LOWER_BODY] = sim_ev(sim_info).penis_outfit_parts['hard'] if sim_ev(sim_info).is_penis_hard is True else sim_ev(sim_info).penis_outfit_parts['soft']
        else:
            if get_nudity_setting(NuditySetting.NUDITY_ASSURANCE_STATE, variable_type=bool):
                bottom_body_part_cas_id = get_default_nude_cas_part_id(sim_info, TurboCASUtil.BodyType.LOWER_BODY)
            else:
                bottom_body_part_cas_id = get_sim_outfit_cas_part_from_bodytype(sim_info, TurboCASUtil.BodyType.LOWER_BODY, outfit_category_and_index=(TurboCASUtil.OutfitCategory.BATHING, 0))
            sim_ev(sim_info).nude_outfit_parts[TurboCASUtil.BodyType.LOWER_BODY] = bottom_body_part_cas_id
    if sim_ev(sim_info).nude_outfit_parts[TurboCASUtil.BodyType.SHOES] == -1 or force_update is True:
        if get_nudity_setting(NuditySetting.NUDITY_ASSURANCE_STATE, variable_type=bool):
            feet_body_part_cas_id = get_default_nude_cas_part_id(sim_info, TurboCASUtil.BodyType.SHOES)
        else:
            feet_body_part_cas_id = get_sim_outfit_cas_part_from_bodytype(sim_info, TurboCASUtil.BodyType.SHOES, outfit_category_and_index=(TurboCASUtil.OutfitCategory.BATHING, 0))
        sim_ev(sim_info).nude_outfit_parts[TurboCASUtil.BodyType.SHOES] = feet_body_part_cas_id
    if (sim_ev(sim_info).nude_outfit_parts[115] == -1 or force_update is True) and has_sim_trait(sim_info, SimTrait.GENDEROPTIONS_TOILET_STANDING):
        sim_ev(sim_info).nude_outfit_parts[115] = sim_ev(sim_info).penis_outfit_parts['hard_texture'] if sim_ev(sim_info).is_penis_hard is True else sim_ev(sim_info).penis_outfit_parts['soft_texture']
def _wickedwhims_is_sim_allowed_for_nudity(privacy_instance, tested_sim):
    if get_nudity_setting(NuditySetting.NUDITY_PRIVACY, variable_type=bool) or TurboResourceUtil.Resource.get_guid64(TurboPrivacyUtil.get_privacy_interaction(privacy_instance)) in PRIVACY_NUDE_INTERACTIONS:
        return PrivacyResult.ALLOW
    if get_nudity_setting(NuditySetting.NUDITY_SWITCH_STATE, variable_type=bool):
        privacy_interaction = TurboPrivacyUtil.get_privacy_interaction(privacy_instance)
        if TurboResourceUtil.Resource.get_guid64(privacy_interaction) in PRIVACY_NUDE_INTERACTIONS:
            (sim_has_permission, _) = has_sim_permission_for_nudity(TurboInteractionUtil.get_interaction_sim(privacy_interaction), ignore_location_test=True, targets=(tested_sim,))
            if sim_has_permission is True:
                (target_has_permission, _) = has_sim_permission_for_nudity(tested_sim, ignore_location_test=True, targets=(TurboInteractionUtil.get_interaction_sim(privacy_interaction),))
                if target_has_permission is True:
                    return PrivacyResult.ALLOW
    return PrivacyResult.DEFAULT
Example #3
0
def _update_nudity_story_progression_on_game_update():
    global LAST_DAY_VALUE
    if not get_nudity_setting(NuditySetting.NUDITY_SWITCH_STATE,
                              variable_type=bool) or not get_nudity_setting(
                                  NuditySetting.STORY_PROGRESSION_STATE,
                                  variable_type=bool):
        return
    current_day = TurboWorldUtil.Time.get_day_of_week()
    if LAST_DAY_VALUE == -1:
        LAST_DAY_VALUE = current_day
        return
    if current_day <= LAST_DAY_VALUE:
        return
    LAST_DAY_VALUE = current_day
    trigger_story_progression()
Example #4
0
def reset_sim_bathing_outfits(sim_identifier, ignore_nudity_assurance_setting=False):
    from wickedwhims.nudity.nudity_settings import get_nudity_setting, NuditySetting
    if ignore_nudity_assurance_setting is False and not get_nudity_setting(NuditySetting.NUDITY_ASSURANCE_STATE, variable_type=bool):
        return
    sim_info = TurboManagerUtil.Sim.get_sim_info(sim_identifier, allow_base_wrapper=True)
    for occult_sim_info in TurboSimUtil.Occult.get_all_sim_info_occults(sim_info):
        _generate_sim_nude_outfit(occult_sim_info, sim_info)
Example #5
0
def _wickedwhims_increase_sim_nudity_skill_on_related_interactions(interaction_instance):
    if not get_nudity_setting(NuditySetting.NUDITY_SWITCH_STATE, variable_type=bool):
        return
    interaction_guid = TurboResourceUtil.Resource.get_guid64(interaction_instance)
    sim = TurboInteractionUtil.get_interaction_sim(interaction_instance)
    for (interaction_id, direct_target, skill_points) in NUDE_REWARD_INTERACTION_IDS:
        if interaction_id != interaction_guid:
            continue
        if direct_target is True:
            target_sim = TurboInteractionUtil.get_interaction_target(interaction_instance) or sim
            if target_sim is None:
                target_sim = sim
        else:
            target_sim = sim
        if target_sim is None:
            return
        sim_info = TurboManagerUtil.Sim.get_sim_info(target_sim)
        if sim_info is None:
            return
        target_outfit_level = get_sim_outfit_level(target_sim)
        target_nudity_skill_level = get_sim_nudity_skill_level(target_sim)
        if target_outfit_level == OutfitLevel.NUDE or target_outfit_level == OutfitLevel.BATHING:
            increase_sim_nudity_skill(target_sim, skill_points, extra_fatigue=2.0)
        else:
            if target_outfit_level == OutfitLevel.REVEALING or target_outfit_level == OutfitLevel.UNDERWEAR:
                increase_sim_nudity_skill(target_sim, skill_points/target_nudity_skill_level, extra_fatigue=2.0)
Example #6
0
def _wickedwhims_undress_bottom_on_toilet_use(interaction_instance):
    global HAS_SIMS_USING_TOILET
    if not get_nudity_setting(NuditySetting.TOILET_USE_UNDRESS_STATE, variable_type=bool):
        return
    interaction_guid = TurboResourceUtil.Resource.get_guid64(interaction_instance)
    if interaction_guid not in TOILET_USE_INTERACTIONS:
        return
    HAS_SIMS_USING_TOILET = True
    sim = TurboInteractionUtil.get_interaction_sim(interaction_instance)
    if sim_ev(sim).on_toilet_outfit_state != OutfitStateBeforeToiletUse.NONE:
        return
    if TurboSimUtil.Age.is_younger_than(sim, TurboSimUtil.Age.CHILD):
        return
    if has_sim_outfit_bottom(sim):
        bottom_body_state = get_sim_body_state(sim, 7)
        if bottom_body_state != BodyState.NUDE:
            strip_result = strip_outfit(sim, strip_type_bottom=StripType.NUDE, allow_stripping_feet=False)
            if strip_result is True:
                sim_ev(sim).on_toilet_outfit_state = int(OutfitStateBeforeToiletUse.UNDERWEAR if bottom_body_state == BodyState.UNDERWEAR else OutfitStateBeforeToiletUse.OUTFIT)
                set_sim_bottom_naked_state(sim, True)
                set_sim_bottom_underwear_state(sim, False)
            else:
                sim_ev(sim).on_toilet_outfit_state = int(OutfitStateBeforeToiletUse.NONE)
    else:
        top_state = StripType.NUDE if TurboSimUtil.Gender.is_male(sim) else StripType.UNDERWEAR if is_sim_top_underwear(sim) else StripType.NUDE
        strip_result = strip_outfit(sim, strip_type_top=top_state, strip_type_bottom=StripType.NUDE)
        if is_sim_outfit_fullbody(sim) and strip_result is True:
            sim_ev(sim).on_toilet_outfit_state = int(OutfitStateBeforeToiletUse.OUTFIT)
            set_sim_top_naked_state(sim, True)
            set_sim_bottom_naked_state(sim, True)
            set_sim_bottom_underwear_state(sim, False)
def update_sim_underwear_data(sim_identifier):
    sim_info = TurboManagerUtil.Sim.get_sim_info(sim_identifier)
    current_outfit_category = TurboSimUtil.CAS.get_current_outfit(sim_info)[0]
    if current_outfit_category == TurboCASUtil.OutfitCategory.SPECIAL:
        return
    from wickedwhims.nudity.nudity_settings import get_nudity_setting, NuditySetting
    if get_nudity_setting(
            NuditySetting.UNDERWEAR_SWITCH_STATE,
            variable_type=bool) and not has_sim_trait(
                sim_info, SimTrait.WW_NO_UNDERWEAR) and is_underwear_outfit(
                    current_outfit_category):
        set_sim_top_underwear_state(
            sim_info,
            True if TurboSimUtil.Gender.is_female(sim_info) else False)
        set_sim_bottom_underwear_state(sim_info, True)
        top_state = get_sim_body_state(sim_info, 6)
        bottom_state = get_sim_body_state(sim_info, 7)
        if top_state == BodyState.UNDERWEAR:
            set_sim_top_underwear_state(sim_info, True)
        elif top_state == BodyState.NUDE:
            set_sim_top_underwear_state(sim_info, False)
        if bottom_state == BodyState.UNDERWEAR:
            set_sim_bottom_underwear_state(sim_info, True)
        else:
            set_sim_bottom_underwear_state(sim_info, False)
    else:
        set_sim_top_underwear_state(sim_info, False)
        set_sim_bottom_underwear_state(sim_info, False)
Example #8
0
def has_sim_permission_for_nudity(sim_identifier,
                                  nudity_setting_test=False,
                                  extra_skill_level=0,
                                  **kwargs):
    sim = TurboManagerUtil.Sim.get_sim_instance(sim_identifier)
    if TurboSimUtil.Age.is_younger_than(sim, TurboSimUtil.Age.CHILD):
        return (False, (NudityPermissionDenied.IS_UNDERAGED, ))
    if CNSimUtils.can_have_sex(sim):
        return (False, (NudityPermissionDenied.IS_UNDERAGED, ))
    if nudity_setting_test is True and not get_nudity_setting(
            NuditySetting.NUDITY_SWITCH_STATE, variable_type=bool):
        return (True, tuple())
    if has_current_lot_trait(
            LotTrait.WW_LOTTRAIT_NUDIST
    ) and TurboWorldUtil.Lot.is_position_on_active_lot(
            TurboSimUtil.Location.get_position(sim)):
        return (True, tuple())
    if has_sim_buff(sim, SimBuff.WW_NUDITY_TEMPORARY_BRAVE):
        return (True, tuple())
    nudity_skill_level = min(
        5,
        get_sim_nudity_skill_level(sim) + extra_skill_level)
    if is_sim_exhibitionist(sim):
        score = nudity_skill_level * 120
    else:
        score = nudity_skill_level * 100
    denied_permissions = set()
    for permission_check in (_home_test, _outside_test, _sims_test):
        test_result = permission_check(sim, score, **kwargs)
        if test_result and test_result[0] != 0:
            score += test_result[0]
            denied_permissions.add(test_result[1])
            if score <= 0:
                return (False, denied_permissions)
    return (True, denied_permissions)
Example #9
0
 def on_interaction_start(cls, interaction_instance):
     target = cls.get_interaction_target(interaction_instance)
     if get_nudity_setting(
             NuditySetting.COMPLETE_UNDRESSING_TYPE,
             variable_type=int) == CompleteUndressingTypeSetting.DEFAULT:
         reset_sim_bathing_outfits(target)
         copy_outfit_to_special(
             target,
             set_special_outfit=True,
             outfit_category_and_index=(TurboCASUtil.OutfitCategory.BATHING,
                                        0),
             override_outfit_parts={
                 115: sim_ev(target).nude_outfit_parts[115]
             })
     else:
         copy_outfit_to_special(
             target,
             set_special_outfit=True,
             outfit_category_and_index=get_modified_outfit(target),
             override_outfit_parts={
                 TurboCASUtil.BodyType.UPPER_BODY:
                 sim_ev(target).nude_outfit_parts[
                     TurboCASUtil.BodyType.UPPER_BODY],
                 TurboCASUtil.BodyType.LOWER_BODY:
                 sim_ev(target).nude_outfit_parts[
                     TurboCASUtil.BodyType.LOWER_BODY],
                 TurboCASUtil.BodyType.SHOES:
                 sim_ev(target).nude_outfit_parts[
                     TurboCASUtil.BodyType.SHOES],
                 TurboCASUtil.BodyType.FULL_BODY:
                 0,
                 TurboCASUtil.BodyType.HAT:
                 0,
                 TurboCASUtil.BodyType.CUMMERBUND:
                 0,
                 TurboCASUtil.BodyType.EARRINGS:
                 0,
                 TurboCASUtil.BodyType.GLASSES:
                 0,
                 TurboCASUtil.BodyType.NECKLACE:
                 0,
                 TurboCASUtil.BodyType.GLOVES:
                 0,
                 TurboCASUtil.BodyType.WRIST_LEFT:
                 0,
                 TurboCASUtil.BodyType.WRIST_RIGHT:
                 0,
                 TurboCASUtil.BodyType.SOCKS:
                 0,
                 TurboCASUtil.BodyType.TIGHTS:
                 0,
                 115:
                 sim_ev(target).nude_outfit_parts[115]
             })
     set_sim_top_naked_state(target, True)
     set_sim_bottom_naked_state(target, True)
     set_sim_top_underwear_state(target, False)
     set_sim_bottom_underwear_state(target, False)
     return True
Example #10
0
def get_sim_underwear_data(sim_identifier, outfit_category_and_index):
    sim_info = TurboManagerUtil.Sim.get_sim_info(sim_identifier)
    sim_is_child = TurboSimUtil.Age.get_age(sim_info) is TurboSimUtil.Age.CHILD
    if not get_nudity_setting(NuditySetting.UNDERWEAR_SWITCH_STATE,
                              variable_type=bool) or has_sim_trait(
                                  sim_info, SimTrait.WW_NO_UNDERWEAR):
        return (-1, -1)
    outfit_category = outfit_category_and_index[0]
    outfit_index = outfit_category_and_index[1]
    if outfit_category == TurboCASUtil.OutfitCategory.CAREER or outfit_category == TurboCASUtil.OutfitCategory.SITUATION:
        outfit_category = TurboCASUtil.OutfitCategory.EVERYDAY
        outfit_index = 0
    if outfit_category == TurboCASUtil.OutfitCategory.SPECIAL and outfit_index == 0:
        modified_outfit = get_modified_outfit(sim_info)
        outfit_category = modified_outfit[0]
        outfit_index = modified_outfit[1]
    outfit_code = _get_outfit_category_and_index_code(
        (outfit_category, outfit_index))
    if outfit_code in sim_ev(sim_info).underwear_outfits_parts:
        underwear_data = sim_ev(sim_info).underwear_outfits_parts[outfit_code]
    elif TurboSimUtil.Sim.is_npc(sim_info):
        underwear_data = list(get_random_underwear_set(sim_info))
    else:
        underwear_data = [-1, -1]
    if sim_is_child:
        if TurboSimUtil.Gender.is_male(sim_info):
            if underwear_data[
                    1] == -1 or not TurboCASUtil.Outfit.is_cas_part_loaded(
                        underwear_data[1]):
                underwear_data[1] = DEFAULT_UNDERWEAR_BOTTOM_CHILD_MALE
        else:
            if underwear_data[
                    0] == -1 or not TurboCASUtil.Outfit.is_cas_part_loaded(
                        underwear_data[0]):
                underwear_data[0] = DEFAULT_UNDERWEAR_TOP_CHILD_FEMALE
            if underwear_data[
                    1] == -1 or not TurboCASUtil.Outfit.is_cas_part_loaded(
                        underwear_data[1]):
                underwear_data[1] = DEFAULT_UNDERWEAR_BOTTOM_CHILD_FEMALE
    else:
        if TurboSimUtil.Gender.is_male(sim_info):
            if underwear_data[
                    1] == -1 or not TurboCASUtil.Outfit.is_cas_part_loaded(
                        underwear_data[1]):
                underwear_data[1] = DEFAULT_UNDERWEAR_BOTTOM_MALE
        else:
            if underwear_data[
                    0] == -1 or not TurboCASUtil.Outfit.is_cas_part_loaded(
                        underwear_data[0]):
                underwear_data[0] = DEFAULT_UNDERWEAR_TOP_FEMALE
            if underwear_data[
                    1] == -1 or not TurboCASUtil.Outfit.is_cas_part_loaded(
                        underwear_data[1]):
                underwear_data[1] = DEFAULT_UNDERWEAR_BOTTOM_FEMALE
    set_sim_underwear_data(sim_info, underwear_data, outfit_category_and_index)
    return underwear_data
def _update_nudity_on_game_update():
    for sim in TurboManagerUtil.Sim.get_all_sim_instance_gen(humans=True,
                                                             pets=False):
        update_sim_penis_state(sim)
        increase_sim_nudity_time_statistic(sim)
        while get_nudity_setting(NuditySetting.NUDITY_SWITCH_STATE,
                                 variable_type=bool):
            test_sim_nudity_permission(sim)
            update_sim_nudity_skill_on_mirror_use(sim)
            update_sim_nudity_skill_on_active_nudity(sim)
            update_sim_nudity_skill_fatigue(sim)
Example #12
0
def _wickedwhims_on_get_outfit_for_clothing_change(original, self, *args,
                                                   **kwargs):
    try:
        if not get_nudity_setting(
                NuditySetting.NUDITY_SWITCH_STATE,
                variable_type=bool) or get_nudity_setting(
                    NuditySetting.INTERACTION_AUTONOMY_UNDRESSING_TYPE,
                    variable_type=int
                ) == NudityAutonomyUndressLevelSetting.DISABLED:
            return original(self, *args, **kwargs)
        sim_info = self.get_sim_info()
        reason = args[1]
        outfit_category_and_index = _on_outfit_change_from_interaction(
            sim_info, reason=reason)
        if outfit_category_and_index:
            return outfit_category_and_index
    except Exception as ex:
        log_custom_exception(
            "Failed to edit Sim outfit at 'OutfitTrackerMixin.get_outfit_for_clothing_change'.",
            ex)
    return original(self, *args, **kwargs)
Example #13
0
def _has_chance_for_random_undressing(sim_info):
    if not get_nudity_setting(NuditySetting.NUDITY_SWITCH_STATE,
                              variable_type=bool):
        return False
    if get_nudity_setting(
            NuditySetting.INTERACTION_AUTONOMY_UNDRESSING_TYPE,
            variable_type=int) == NudityAutonomyUndressLevelSetting.DISABLED:
        return False
    if get_nudity_setting(
            NuditySetting.AUTONOMY_TYPE, variable_type=int
    ) == NudityAutonomyTypeSetting.DISABLED or get_nudity_setting(
            NuditySetting.AUTONOMY_TYPE, variable_type=int
    ) == NudityAutonomyTypeSetting.NPC_ONLY and TurboSimUtil.Sim.is_player(
            sim_info):
        return False
    if not has_sim_permission_for_nudity(sim_info)[0]:
        return False
    if get_nudity_setting(
            NuditySetting.INTERACTION_AUTONOMY_UNDRESSING_TYPE,
            variable_type=int) == NudityAutonomyUndressLevelSetting.ALWAYS:
        return True
    if get_nudity_setting(
            NuditySetting.INTERACTION_AUTONOMY_UNDRESSING_TYPE,
            variable_type=int) == NudityAutonomyUndressLevelSetting.RANDOM:
        base_chance = 0.0
        base_chance += 0.08 * get_sim_nudity_skill_level(sim_info)
        if is_sim_exhibitionist(sim_info):
            base_chance += 0.1
        if random.uniform(0, 1) <= base_chance:
            return True
    return False
Example #14
0
def _wickedwhims_on_call_on_entry_change(original, self, *args, **kwargs):
    try:
        if not get_nudity_setting(
                NuditySetting.NUDITY_SWITCH_STATE,
                variable_type=bool) or get_nudity_setting(
                    NuditySetting.INTERACTION_AUTONOMY_UNDRESSING_TYPE,
                    variable_type=int
                ) == NudityAutonomyUndressLevelSetting.DISABLED:
            return original(self, *args, **kwargs)
        sim_info = args[0]
        outfit_generator = args[1]
        if not outfit_generator.tags:
            return original(self, *args, **kwargs)
        outfit_category_and_index = _on_outfit_change_from_interaction(
            sim_info, tags=list(outfit_generator.tags))
        if outfit_category_and_index:
            return outfit_category_and_index
    except Exception as ex:
        log_custom_exception(
            "Failed to edit Sim outfit at 'TunableOutfitChange._OutfitChangeForTags.OutfitTypeSpecial.__call__'.",
            ex)
    return original(self, *args, **kwargs)
def _update_dress_up_after_breast_feeding_on_game_update():
    if not get_nudity_setting(NuditySetting.BREAST_FEEDING_UNDRESS_STATE,
                              variable_type=bool):
        return
    for sim in TurboManagerUtil.Sim.get_all_sim_instance_gen(humans=True,
                                                             pets=False):
        if sim_ev(
                sim
        ).on_breast_feeding_outfit_state == OutfitStateBeforeBreastFeeding.NONE:
            continue
        if TurboSimUtil.Age.is_younger_than(sim, TurboSimUtil.Age.CHILD):
            continue
        if TurboSimUtil.Interaction.is_running_interaction(
                sim, BREAST_FEEDING_INTERACTIONS):
            return
        current_outfit = TurboSimUtil.CAS.get_current_outfit(sim)
        if not (current_outfit[0] == TurboCASUtil.OutfitCategory.SPECIAL
                and current_outfit[1] == 0):
            continue
        current_outfit = get_modified_outfit(sim)
        if sim_ev(
                sim
        ).on_breast_feeding_outfit_state == OutfitStateBeforeBreastFeeding.UNDERWEAR:
            set_bodytype_caspart(
                sim, (TurboCASUtil.OutfitCategory.SPECIAL, 0), 6,
                get_sim_underwear_data(sim, current_outfit)[0])
            set_sim_top_underwear_state(sim, True)
            try:
                TurboSimUtil.CAS.refresh_outfit(sim)
            except:
                continue
        elif sim_ev(
                sim
        ).on_breast_feeding_outfit_state == OutfitStateBeforeBreastFeeding.OUTFIT and has_sim_outfit_top(
                sim, outfit_category_and_index=current_outfit):
            part_id = get_sim_outfit_cas_part_from_bodytype(
                sim, 6, outfit_category_and_index=current_outfit)
            set_bodytype_caspart(sim, (TurboCASUtil.OutfitCategory.SPECIAL, 0),
                                 6, part_id)
            set_sim_top_underwear_state(sim, True)
            try:
                TurboSimUtil.CAS.refresh_outfit(sim)
            except:
                continue
        elif is_sim_outfit_fullbody(sim,
                                    outfit_category_and_index=current_outfit):
            dress_up_outfit(sim)
        else:
            dress_up_outfit(sim)
        sim_ev(sim).on_breast_feeding_outfit_state = int(
            OutfitStateBeforeBreastFeeding.NONE)
def nudity_notification(text=None,
                        text_tokens=(),
                        title=None,
                        title_tokens=(),
                        icon=None,
                        sims=(),
                        is_autonomy=False,
                        force_display=False,
                        **kwargs):
    if force_display is False:
        notifications_visibility_type = get_nudity_setting(
            NuditySetting.NOTIFICATIONS_VISBILITY_TYPE, variable_type=int)
        if notifications_visibility_type == NudityNotificationsTypeSetting.DISABLED:
            return
        if notifications_visibility_type == NudityNotificationsTypeSetting.AUTONOMY and is_autonomy is False:
            return
        if get_nudity_setting(
                NuditySetting.NOTIFICATIONS_HOUSEHOLD_LIMIT_STATE,
                variable_type=bool):
            while True:
                for included_sim_info in sims:
                    while TurboSimUtil.Sim.is_npc(included_sim_info):
                        return
    if title is None:
        if not sims:
            title = 3145721892
        elif has_sim_trait(sims[0], SimTrait.WW_EXHIBITIONIST):
            title = 4111426025
        else:
            title = 3476801842
    display_notification(text=text,
                         text_tokens=text_tokens,
                         title=title,
                         title_tokens=title_tokens,
                         secondary_icon=icon,
                         **kwargs)
 def on_interaction_test(cls, interaction_context, interaction_target):
     sim = cls.get_interaction_sim(interaction_context)
     if not get_nudity_setting(NuditySetting.UNDERWEAR_SWITCH_STATE,
                               variable_type=bool) or has_sim_trait(
                                   sim, SimTrait.WW_NO_UNDERWEAR):
         return False
     if CNSimUtils.can_have_sex(sim):
         return False
     if is_sim_in_sex(sim) or is_sim_going_to_sex(sim):
         return False
     if TurboSimUtil.Gender.is_male(sim):
         return False
     if get_sim_body_state(
             sim, TurboCASUtil.BodyType.UPPER_BODY) == BodyState.UNDERWEAR:
         return True
     return False
 def on_interaction_test(cls, interaction_context, interaction_target):
     sim = cls.get_interaction_sim(interaction_context)
     if not get_nudity_setting(NuditySetting.UNDERWEAR_SWITCH_STATE,
                               variable_type=bool) or has_sim_trait(
                                   sim, SimTrait.WW_NO_UNDERWEAR):
         return False
     if is_sim_in_sex(sim) or is_sim_going_to_sex(sim):
         return False
     if TurboSimUtil.Gender.is_male(sim):
         return False
     if is_underwear_outfit(get_modified_outfit(sim)[0]) and (
             not is_sim_bottom_underwear(sim)
             or TurboSimUtil.Gender.is_female(sim)
             and not is_sim_top_underwear(sim)):
         return True
     return False
 def on_interaction_test(cls, interaction_context, interaction_target):
     if not TurboTypesUtil.Sims.is_sim(interaction_target):
         return False
     if not get_nudity_setting(NuditySetting.UNDERWEAR_SWITCH_STATE,
                               variable_type=bool) or has_sim_trait(
                                   interaction_target,
                                   SimTrait.WW_NO_UNDERWEAR):
         return False
     sim = cls.get_interaction_sim(interaction_context)
     if is_sim_in_sex(sim) or (is_sim_going_to_sex(sim)
                               or is_sim_in_sex(interaction_target)
                               ) or is_sim_going_to_sex(interaction_target):
         return False
     if CNSimUtils.can_have_sex(interaction_target):
         return False
     return True
Example #20
0
def _update_dress_up_after_toilet_use_on_game_update():
    global HAS_SIMS_USING_TOILET
    if not get_nudity_setting(NuditySetting.TOILET_USE_UNDRESS_STATE, variable_type=bool):
        return
    if HAS_SIMS_USING_TOILET is False:
        return
    has_sims_peeing = False
    for sim in TurboManagerUtil.Sim.get_all_sim_instance_gen(humans=True, pets=False):
        if sim_ev(sim).on_toilet_outfit_state == OutfitStateBeforeToiletUse.NONE:
            continue
        has_sims_peeing = True
        if TurboSimUtil.Age.is_younger_than(sim, TurboSimUtil.Age.CHILD):
            continue
        is_using_toilet = False
        for affordance_id in TOILET_USE_INTERACTIONS:
            if TurboSimUtil.Interaction.is_running_interaction(sim, affordance_id):
                is_using_toilet = True
                break
        if is_using_toilet is True:
            has_sims_peeing = True
        current_outfit = TurboSimUtil.CAS.get_current_outfit(sim)
        if not (current_outfit[0] == TurboCASUtil.OutfitCategory.SPECIAL and current_outfit[1] == 0):
            continue
        current_outfit = get_modified_outfit(sim)
        if sim_ev(sim).on_toilet_outfit_state == OutfitStateBeforeToiletUse.UNDERWEAR:
            set_bodytype_caspart(sim, (TurboCASUtil.OutfitCategory.SPECIAL, 0), TurboCASUtil.BodyType.LOWER_BODY, get_sim_underwear_data(sim, current_outfit)[1])
            set_sim_bottom_underwear_state(sim, True)
            try:
                TurboSimUtil.CAS.refresh_outfit(sim)
            except:
                continue
        elif sim_ev(sim).on_toilet_outfit_state == OutfitStateBeforeToiletUse.OUTFIT and has_sim_outfit_bottom(sim, outfit_category_and_index=current_outfit):
            set_bodytype_caspart(sim, (TurboCASUtil.OutfitCategory.SPECIAL, 0), TurboCASUtil.BodyType.LOWER_BODY, get_sim_outfit_cas_part_from_bodytype(sim, TurboCASUtil.BodyType.LOWER_BODY, outfit_category_and_index=current_outfit))
            set_bodytype_caspart(sim, (TurboCASUtil.OutfitCategory.SPECIAL, 0), TurboCASUtil.BodyType.TIGHTS, get_sim_outfit_cas_part_from_bodytype(sim, TurboCASUtil.BodyType.TIGHTS, outfit_category_and_index=current_outfit))
            set_bodytype_caspart(sim, (TurboCASUtil.OutfitCategory.SPECIAL, 0), TurboCASUtil.BodyType.SOCKS, get_sim_outfit_cas_part_from_bodytype(sim, TurboCASUtil.BodyType.SOCKS, outfit_category_and_index=current_outfit))
            set_sim_bottom_underwear_state(sim, True)
            try:
                TurboSimUtil.CAS.refresh_outfit(sim)
            except:
                continue
        elif is_sim_outfit_fullbody(sim, outfit_category_and_index=current_outfit):
            dress_up_outfit(sim)
        else:
            dress_up_outfit(sim)
        sim_ev(sim).on_toilet_outfit_state = int(OutfitStateBeforeToiletUse.NONE)
    if has_sims_peeing is False:
        HAS_SIMS_USING_TOILET = False
def _wickedwhims_undress_top_on_breast_feeding(interaction_instance):
    if not get_nudity_setting(NuditySetting.BREAST_FEEDING_UNDRESS_STATE,
                              variable_type=bool):
        return
    interaction_guid = TurboResourceUtil.Resource.get_guid64(
        interaction_instance)
    if interaction_guid != BREAST_FEEDING_INTERACTIONS:
        return
    sim = TurboInteractionUtil.get_interaction_sim(interaction_instance)
    if sim_ev(
            sim
    ).on_breast_feeding_outfit_state != OutfitStateBeforeBreastFeeding.NONE:
        return
    if TurboSimUtil.Age.is_younger_than(sim, TurboSimUtil.Age.CHILD):
        return
    if has_sim_outfit_top(sim):
        top_body_state = get_sim_body_state(sim, 6)
        if top_body_state != BodyState.NUDE:
            strip_result = strip_outfit(sim,
                                        strip_type_top=StripType.NUDE,
                                        allow_stripping_gloves=False)
            if strip_result is True:
                sim_ev(sim).on_breast_feeding_outfit_state = int(
                    OutfitStateBeforeBreastFeeding.
                    UNDERWEAR if top_body_state == BodyState.
                    UNDERWEAR else OutfitStateBeforeBreastFeeding.OUTFIT)
                set_sim_top_naked_state(sim, True)
                set_sim_top_underwear_state(sim, False)
            else:
                sim_ev(sim).on_breast_feeding_outfit_state = int(
                    OutfitStateBeforeBreastFeeding.NONE)
    else:
        bottom_state = StripType.UNDERWEAR if is_sim_bottom_underwear(
            sim) else StripType.NUDE
        strip_result = strip_outfit(sim,
                                    strip_type_top=StripType.NUDE,
                                    strip_type_bottom=bottom_state)
        if is_sim_outfit_fullbody(sim) and strip_result is True:
            sim_ev(sim).on_breast_feeding_outfit_state = int(
                OutfitStateBeforeBreastFeeding.OUTFIT)
            set_sim_top_naked_state(sim, True)
            set_sim_top_underwear_state(sim, False)
            set_sim_bottom_naked_state(sim, True)
Example #22
0
def _wickedwhims_undress_swimwear_on_jumping_to_water(interaction_instance):
    if not get_nudity_setting(NuditySetting.NUDITY_SWITCH_STATE,
                              variable_type=bool):
        return
    interaction_guid = TurboResourceUtil.Resource.get_guid64(
        interaction_instance)
    if interaction_guid not in JUMPING_INTERACTIONS:
        return
    sim_info = TurboManagerUtil.Sim.get_sim_info(
        TurboInteractionUtil.get_interaction_sim(interaction_instance))
    if TurboSimUtil.Age.is_younger_than(sim_info, TurboSimUtil.Age.CHILD):
        return
    if get_modified_outfit(
            sim_info)[0] != TurboCASUtil.OutfitCategory.SWIMWEAR:
        return
    if is_sim_outfit_fullbody(sim_info):
        return
    if random.uniform(0, 1) > 0.1:
        return
    has_stripped = False
    if TurboSimUtil.Gender.is_male(sim_info):
        if get_sim_body_state(sim_info, 7) != BodyState.OUTFIT:
            return
        strip_result = strip_outfit(sim_info, strip_type_bottom=StripType.NUDE)
        if strip_result is True:
            set_sim_bottom_naked_state(sim_info, True)
            has_stripped = True
    else:
        can_undress_top = get_sim_body_state(sim_info, 6) == BodyState.OUTFIT
        can_undress_bottom = get_sim_body_state(sim_info,
                                                7) == BodyState.OUTFIT
        undress_top = False
        undress_bottom = False
        if can_undress_top is True and can_undress_bottom is True:
            if bool(random.getrandbits(1)):
                undress_top = True
            else:
                undress_bottom = True
        elif can_undress_top is True:
            undress_top = True
        elif can_undress_bottom is True:
            undress_bottom = True
        if undress_top is False and undress_bottom is False:
            return
        if undress_top is True:
            strip_result = strip_outfit(sim_info,
                                        strip_type_top=StripType.NUDE)
            if strip_result is True:
                set_sim_top_naked_state(sim_info, True)
                has_stripped = True
        elif undress_bottom is True:
            strip_result = strip_outfit(sim_info,
                                        strip_type_bottom=StripType.NUDE)
            if strip_result is True:
                set_sim_bottom_naked_state(sim_info, True)
                has_stripped = True
    if has_stripped is True:
        display_notification(text=267480274,
                             text_tokens=(sim_info, ),
                             secondary_icon=sim_info)
        if not has_sim_permission_for_nudity(sim_info)[0]:
            add_sim_buff(sim_info,
                         SimBuff.OBJECT_JUMPSTAND_SWIMSUITMALFUNCTION)
        if random.uniform(0, 1) <= 0.45:
            add_sim_buff(sim_info, SimBuff.WW_NUDITY_TEMPORARY_BRAVE)
Example #23
0
def _trigger_nudity_autonomy_on_game_update():
    if not get_nudity_setting(NuditySetting.NUDITY_SWITCH_STATE,
                              variable_type=bool):
        return
    if get_nudity_setting(
            NuditySetting.AUTONOMY_TYPE,
            variable_type=int) == NudityAutonomyTypeSetting.DISABLED:
        return
    is_special_lot = TurboWorldUtil.Venue.get_current_venue_type() in (
        VenueType.BAR, VenueType.LOUNGE, VenueType.CLUB)
    for sim in TurboManagerUtil.Sim.get_all_sim_instance_gen(humans=True,
                                                             pets=False):
        if TurboSimUtil.Age.is_younger_than(sim, TurboSimUtil.Age.CHILD):
            continue
        if CNSimUtils.can_have_sex(sim):
            continue
        if TurboWorldUtil.Time.get_absolute_ticks() <= sim_ev(
                sim).last_nudity_autonomy:
            continue
        if get_nudity_setting(
                NuditySetting.AUTONOMY_TYPE, variable_type=int
        ) == NudityAutonomyTypeSetting.NPC_ONLY and TurboSimUtil.Sim.is_player(
                sim):
            continue
        if not is_sim_allowed_for_autonomy(sim):
            continue
        if not _is_sim_ready_to_undress(sim):
            sim_ev(
                sim
            ).last_nudity_autonomy = TurboWorldUtil.Time.get_absolute_ticks(
            ) + 30000
        is_sim_on_lot = TurboWorldUtil.Lot.is_position_on_active_lot(
            TurboSimUtil.Location.get_position(sim))
        has_child_sims_on_lot = False
        for target in TurboManagerUtil.Sim.get_all_sim_instance_gen(
                humans=True, pets=False):
            if sim is target:
                continue
            if is_special_lot is False and TurboSimUtil.Age.is_younger_than(
                    target, TurboSimUtil.Age.CHILD):
                has_child_sims_on_lot = True
                break
            if get_sim_outfit_level(target) == OutfitLevel.NUDE:
                if is_sim_on_lot is True and TurboWorldUtil.Lot.is_position_on_active_lot(
                        TurboSimUtil.Location.get_position(target)
                ) or TurboMathUtil.Position.get_distance(
                        TurboSimUtil.Location.get_position(sim),
                        TurboSimUtil.Location.get_position(target)) <= 12:
                    continue
        if has_child_sims_on_lot is True:
            sim_ev(
                sim
            ).last_nudity_autonomy = TurboWorldUtil.Time.get_absolute_ticks(
            ) + 30000
        if is_sim_exhibitionist(sim):
            continue
        if random.uniform(0, 1) > sim_ev(sim).nudity_autonomy_chance:
            sim_ev(
                sim
            ).last_nudity_autonomy = TurboWorldUtil.Time.get_absolute_ticks(
            ) + 25000
        if trigger_nudity_autonomy(sim):
            sim_ev(
                sim
            ).last_nudity_autonomy = TurboWorldUtil.Time.get_absolute_ticks(
            ) + 55000
            sim_ev(sim).nudity_autonomy_chance = 0.05
            return
Example #24
0
 def on_building_basic_elements(cls, interaction_instance, sequence):
     sim = cls.get_interaction_sim(interaction_instance)
     if get_nudity_setting(
             NuditySetting.COMPLETE_UNDRESSING_TYPE,
             variable_type=int) == CompleteUndressingTypeSetting.DEFAULT:
         reset_sim_bathing_outfits(sim)
         strip_result = copy_outfit_to_special(
             sim,
             set_special_outfit=False,
             outfit_category_and_index=(TurboCASUtil.OutfitCategory.BATHING,
                                        0),
             override_outfit_parts={
                 115: sim_ev(sim).nude_outfit_parts[115]
             })
     else:
         strip_result = copy_outfit_to_special(
             sim,
             set_special_outfit=False,
             outfit_category_and_index=get_modified_outfit(sim),
             override_outfit_parts={
                 TurboCASUtil.BodyType.UPPER_BODY:
                 sim_ev(sim).nude_outfit_parts[
                     TurboCASUtil.BodyType.UPPER_BODY],
                 TurboCASUtil.BodyType.LOWER_BODY:
                 sim_ev(sim).nude_outfit_parts[
                     TurboCASUtil.BodyType.LOWER_BODY],
                 TurboCASUtil.BodyType.SHOES:
                 sim_ev(sim).nude_outfit_parts[TurboCASUtil.BodyType.SHOES],
                 TurboCASUtil.BodyType.FULL_BODY:
                 0,
                 TurboCASUtil.BodyType.HAT:
                 0,
                 TurboCASUtil.BodyType.CUMMERBUND:
                 0,
                 TurboCASUtil.BodyType.EARRINGS:
                 0,
                 TurboCASUtil.BodyType.GLASSES:
                 0,
                 TurboCASUtil.BodyType.NECKLACE:
                 0,
                 TurboCASUtil.BodyType.GLOVES:
                 0,
                 TurboCASUtil.BodyType.WRIST_LEFT:
                 0,
                 TurboCASUtil.BodyType.WRIST_RIGHT:
                 0,
                 TurboCASUtil.BodyType.SOCKS:
                 0,
                 TurboCASUtil.BodyType.TIGHTS:
                 0,
                 115:
                 sim_ev(sim).nude_outfit_parts[115]
             })
     if strip_result is True:
         set_sim_top_naked_state(sim, True)
         set_sim_bottom_naked_state(sim, True)
         set_sim_top_underwear_state(sim, False)
         set_sim_bottom_underwear_state(sim, False)
         nudity_notification(
             text=2191667249,
             text_tokens=(sim, ),
             icon=sim,
             sims=(sim, ),
             is_autonomy=cls.get_interaction_source(interaction_instance) ==
             TurboInteractionUtil.InteractionSource.AUTONOMY)
         return TurboSimUtil.CAS.get_change_outfit_element(
             sim, (TurboCASUtil.OutfitCategory.SPECIAL, 0),
             do_spin=True,
             interaction=interaction_instance,
             dirty_outfit=True)
Example #25
0
def undress_sim(sim_identifier, actor_data, is_npc_only=False):
    sim_info = TurboManagerUtil.Sim.get_sim_info(sim_identifier)
    if is_npc_only is False:
        undressing_type = get_sex_setting(SexSetting.SEX_UNDRESSING_TYPE,
                                          variable_type=int)
    else:
        undressing_type = get_sex_setting(SexSetting.NPC_SEX_UNDRESSING_TYPE,
                                          variable_type=int)
    if undressing_type == SexUndressingLevelSetting.DISABLED:
        return
    update_nude_body_data(sim_info)
    top_body_state = get_sim_actual_body_state(
        sim_info, TurboCASUtil.BodyType.UPPER_BODY)
    bottom_body_state = get_sim_actual_body_state(
        sim_info, TurboCASUtil.BodyType.LOWER_BODY)
    hands_body_state = get_sim_actual_body_state(sim_info,
                                                 TurboCASUtil.BodyType.GLOVES)
    feet_body_state = get_sim_actual_body_state(sim_info,
                                                TurboCASUtil.BodyType.SHOES)
    if undressing_type == SexUndressingLevelSetting.COMPLETE:
        if top_body_state == BodyState.NUDE and (
                bottom_body_state == BodyState.NUDE and hands_body_state
                == BodyState.NUDE) and feet_body_state == BodyState.NUDE:
            return
        if get_nudity_setting(
                NuditySetting.COMPLETE_UNDRESSING_TYPE,
                variable_type=int) == CompleteUndressingTypeSetting.DEFAULT:
            reset_sim_bathing_outfits(sim_info)
            copy_outfit_to_special(
                sim_info,
                set_special_outfit=True,
                outfit_category_and_index=(TurboCASUtil.OutfitCategory.BATHING,
                                           0),
                override_outfit_parts={
                    115: sim_ev(sim_info).nude_outfit_parts[115]
                })
        else:
            copy_outfit_to_special(
                sim_info,
                set_special_outfit=True,
                outfit_category_and_index=get_modified_outfit(sim_info),
                override_outfit_parts={
                    TurboCASUtil.BodyType.UPPER_BODY:
                    sim_ev(sim_info).nude_outfit_parts[
                        TurboCASUtil.BodyType.UPPER_BODY],
                    TurboCASUtil.BodyType.LOWER_BODY:
                    sim_ev(sim_info).nude_outfit_parts[
                        TurboCASUtil.BodyType.LOWER_BODY],
                    TurboCASUtil.BodyType.SHOES:
                    sim_ev(sim_info).nude_outfit_parts[
                        TurboCASUtil.BodyType.SHOES],
                    TurboCASUtil.BodyType.FULL_BODY:
                    0,
                    TurboCASUtil.BodyType.HAT:
                    0,
                    TurboCASUtil.BodyType.CUMMERBUND:
                    0,
                    TurboCASUtil.BodyType.EARRINGS:
                    0,
                    TurboCASUtil.BodyType.GLASSES:
                    0,
                    TurboCASUtil.BodyType.NECKLACE:
                    0,
                    TurboCASUtil.BodyType.GLOVES:
                    0,
                    TurboCASUtil.BodyType.WRIST_LEFT:
                    0,
                    TurboCASUtil.BodyType.WRIST_RIGHT:
                    0,
                    TurboCASUtil.BodyType.SOCKS:
                    0,
                    TurboCASUtil.BodyType.TIGHTS:
                    0,
                    115:
                    sim_ev(sim_info).nude_outfit_parts[115]
                })
        set_sim_top_naked_state(sim_info, True)
        set_sim_bottom_naked_state(sim_info, True)
        set_sim_top_underwear_state(sim_info, False)
        set_sim_bottom_underwear_state(sim_info, False)
        return
    if actor_data.is_forcing_nude_hands(
    ) and hands_body_state != BodyState.NUDE:
        strip_outfit(sim_info, strip_bodytype=TurboCASUtil.BodyType.GLOVES)
    if actor_data.is_forcing_nude_feet() and feet_body_state != BodyState.NUDE:
        strip_outfit(sim_info, strip_bodytype=TurboCASUtil.BodyType.SHOES)
    if actor_data.get_naked_type() == SexNakedType.ALL:
        if top_body_state == BodyState.NUDE and bottom_body_state == BodyState.NUDE:
            return
        if strip_outfit(sim_info,
                        strip_type_top=StripType.NUDE,
                        strip_type_bottom=StripType.NUDE):
            set_sim_top_naked_state(sim_info, True)
            set_sim_bottom_naked_state(sim_info, True)
            set_sim_top_underwear_state(sim_info, False)
            set_sim_bottom_underwear_state(sim_info, False)
    elif actor_data.get_naked_type() == SexNakedType.TOP:
        if top_body_state == BodyState.NUDE:
            return
        has_bottom_underwear_on = is_underwear_outfit(
            get_modified_outfit(sim_info)[0]) and is_sim_bottom_underwear(
                sim_info)
        strip_type_bottom = StripType.NONE if not is_sim_outfit_fullbody(
            sim_info
        ) else StripType.UNDERWEAR if has_bottom_underwear_on else StripType.NUDE
        if strip_outfit(sim_info,
                        strip_type_top=StripType.NUDE,
                        strip_type_bottom=strip_type_bottom):
            set_sim_top_naked_state(sim_info, True)
            set_sim_bottom_naked_state(sim_info,
                                       strip_type_bottom == StripType.NUDE)
            set_sim_top_underwear_state(sim_info, False)
            set_sim_bottom_underwear_state(
                sim_info, strip_type_bottom == StripType.UNDERWEAR)
    elif actor_data.get_naked_type() == SexNakedType.BOTTOM:
        if bottom_body_state == BodyState.NUDE:
            return
        has_top_underwear_on = TurboSimUtil.Gender.is_female(sim_info) and (
            is_underwear_outfit(get_modified_outfit(sim_info)[0])
            and is_sim_top_underwear(sim_info))
        strip_type_top = StripType.NONE if not is_sim_outfit_fullbody(
            sim_info
        ) else StripType.UNDERWEAR if has_top_underwear_on else StripType.NUDE
        if strip_outfit(sim_info,
                        strip_type_top=strip_type_top,
                        strip_type_bottom=StripType.NUDE):
            set_sim_top_naked_state(sim_info, strip_type_top == StripType.NUDE)
            set_sim_bottom_naked_state(sim_info, True)
            set_sim_top_underwear_state(sim_info,
                                        strip_type_top == StripType.UNDERWEAR)
            set_sim_bottom_underwear_state(sim_info, False)
def react_to_sims_nudity(sim):
    if not get_nudity_setting(NuditySetting.REACTION_TO_NUDITY_STATE,
                              variable_type=bool):
        return False
    if TurboSimUtil.Age.is_younger_than(sim,
                                        TurboSimUtil.Age.TODDLER,
                                        or_equal=True):
        return False
    full_reaction_cooldown = sim_ev(sim).full_nudity_reaction_cooldown
    inner_reaction_cooldown = sim_ev(sim).inner_nudity_reaction_cooldown
    if full_reaction_cooldown > 0:
        return False
    if inner_reaction_cooldown > 0:
        return False
    if full_reaction_cooldown > 0 and inner_reaction_cooldown > 0:
        return False
    if is_sim_in_sex(sim) or is_sim_going_to_sex(sim):
        return False
    if has_sim_situations(sim, (SimSituation.GRIMREAPER, SimSituation.FIRE,
                                SimSituation.BABYBIRTH_HOSPITAL)):
        return False
    sim_outfit_level = get_sim_outfit_level(sim)
    if sim_outfit_level == OutfitLevel.NUDE or sim_outfit_level == OutfitLevel.BATHING:
        return False
    if not is_sim_available(sim):
        return False
    has_permission_to_nudity = None
    line_of_sight = TurboMathUtil.LineOfSight.create(
        TurboSimUtil.Location.get_routing_surface(sim),
        TurboSimUtil.Location.get_position(sim), 8.0)
    targets = list()
    for target in TurboManagerUtil.Sim.get_all_sim_instance_gen(humans=True,
                                                                pets=False):
        if sim is target:
            continue
        if has_relationship_bit_with_sim(sim, target,
                                         SimRelationshipBit.WW_JUST_HAD_SEX):
            continue
        if TurboSimUtil.Age.is_younger_than(target, TurboSimUtil.Age.CHILD):
            continue
        if is_sim_in_sex(target):
            continue
        if not TurboSimUtil.Location.is_visible(target):
            continue
        if TurboSimUtil.Spawner.is_leaving(target):
            continue
        target_outfit_level = get_sim_outfit_level(target)
        if target_outfit_level != OutfitLevel.NUDE and target_outfit_level != OutfitLevel.BATHING:
            continue
        if not TurboMathUtil.LineOfSight.test(
                line_of_sight, TurboSimUtil.Location.get_position(target)):
            continue
        if target_outfit_level == OutfitLevel.BATHING:
            extra_skill_level = 1
        else:
            extra_skill_level = 0
        update_sim_nudity_skill_on_seeing_nudity(sim, target)
        if has_permission_to_nudity is None:
            has_permission_to_nudity = has_sim_permission_for_nudity(
                sim, extra_skill_level=extra_skill_level)[0]
        if has_permission_to_nudity is True:
            continue
        targets.append(target)
    if targets:
        is_mixer_only = _is_only_mixer_reaction(sim)
        target = random.choice(targets)
        if _nudity_reaction(sim, target, only_mixer=is_mixer_only):
            return True
    return False