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
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()
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)
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)
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)
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)
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
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)
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)
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
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
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)
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)
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
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)
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