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 _has_permission_to_undress(interaction_sim, interaction_context):
    (has_permission, denied_permissions) = has_sim_permission_for_nudity(
        interaction_sim, nudity_setting_test=True)
    if has_permission is True:
        return True
    is_autonomy = interaction_context == TurboInteractionUtil.InteractionSource.AUTONOMY
    if is_autonomy is True:
        return False
    text_tokens = [interaction_sim]
    for denied_permission in denied_permissions:
        if denied_permission == NudityPermissionDenied.NOT_AT_HOME:
            text_tokens.append(2434379342)
        elif denied_permission == NudityPermissionDenied.OUTSIDE:
            text_tokens.append(14125364)
        else:
            if denied_permission == NudityPermissionDenied.TOO_MANY_SIMS_AROUND:
                text_tokens.append(902300171)
    for _ in range(11 - len(text_tokens)):
        text_tokens.append(0)
    nudity_notification(text=2447814946,
                        text_tokens=text_tokens,
                        icon=interaction_sim,
                        sims=(interaction_sim, ),
                        is_autonomy=is_autonomy)
    return False
示例#3
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
示例#4
0
def _is_sim_ready_to_undress(sim):
    if is_sim_in_sex(sim) or is_sim_going_to_sex(sim):
        return False
    if get_sim_actual_body_state(
            sim, 6) == BodyState.NUDE and get_sim_actual_body_state(
                sim, 7) == BodyState.NUDE:
        return False
    if has_sim_traits(sim, (SimTrait.HIDDEN_ISEVENTNPC_CHALLENGE, )):
        return False
    if has_sim_situations(
            sim,
        (SimSituation.BARISTA_VENUE, SimSituation.HIREDNPC_BARISTA,
         SimSituation.BARBARTENDER, SimSituation.BARTENDER_RESTAURANT,
         SimSituation.HIREDNPC_BARTENDER, SimSituation.HIREDNPC_CATERER,
         SimSituation.HIREDNPC_CATERER_VEGETARIAN, SimSituation.HIREDNPC_DJ,
         SimSituation.HIREDNPC_DJ_LEVEL10, SimSituation.SINGLEJOB_CLUB_DJ,
         SimSituation.SINGLEJOB_CLUB_DJ_LEVEL10,
         SimSituation.HIREDNPC_ENTERTAINER_GUITAR,
         SimSituation.HIREDNPC_ENTERTAINER_MICCOMEDY,
         SimSituation.HIREDNPC_ENTERTAINER_ORGAN,
         SimSituation.HIREDNPC_ENTERTAINER_PIANO,
         SimSituation.HIREDNPC_ENTERTAINER_VIOLIN,
         SimSituation.BUTLER_SITUATION,
         SimSituation.GARDENER_SERVICE_SITUATION, SimSituation.NANNY_SITUATION,
         SimSituation.GYMTRAINER_VENUE, SimSituation.LANDLORD,
         SimSituation.LIBRARYVENUE_LIBRARIAN, SimSituation.MAID_SITUATION,
         SimSituation.MAILMAN_SITUATION, SimSituation.PIZZADELIVERY_NEW,
         SimSituation.FORESTRANGER_VACATIONARRIVAL,
         SimSituation.REFLEXOLOGIST_VENUE, SimSituation.REPAIR_SITUATION,
         SimSituation.TRAGICCLOWN, SimSituation.YOGAINSTRUCTOR_VENUE,
         SimSituation.MASSAGETHERAPIST_VENUE,
         SimSituation.MASSAGETHERAPIST_SERVICECALL, SimSituation.CHEFSITUATION,
         SimSituation.HOST_1, SimSituation.RESTAURANT_WAITSTAFF,
         SimSituation.RESTAURANTDINER_SUB_NPC_CRITIC,
         SimSituation.RETAILEMPLOYEE_HARDWORKER,
         SimSituation.RETAILEMPLOYEE_NPCSTORE_HARDWORKER,
         SimSituation.SINGLEJOB_COWORKER_RETAILEMPLOYEE,
         SimSituation.HIREDNPC_STALLVENDOR, SimSituation.HIREDNPC_VENDORSTALL,
         SimSituation.OPENSTREETS_STALLVENDOR,
         SimSituation.CAREER_DOCTOR_NPC_DOCTOR,
         SimSituation.CAREER_DOCTOR_NPC_ASSISTANT,
         SimSituation.CAREER_DOCTOR_NPC_DOCTOR_DIAGNOSER,
         SimSituation.CAREER_DOCTOR_NPC_NURSE,
         SimSituation.CAREER_DOCTOR_NPC_PATIENT_ADMITTED,
         SimSituation.DETECTIVE_APB, SimSituation.DETECTIVE_APBNEUTRAL,
         SimSituation.CAREER_DETECTIVE_APBPLAYER,
         SimSituation.SINGLEJOB_COWORKER_SCIENTIST,
         SimSituation.SINGLEJOB_COWORKER_SCIENTIST_FRONTDESK,
         SimSituation.CAREEREVENTSITUATIONS_SCIENTISTCAREER_MAIN,
         SimSituation.GRIMREAPER, SimSituation.FIRE,
         SimSituation.BABYBIRTH_HOSPITAL, SimSituation.PARK_CHILDPLAYING,
         SimSituation.CAREGIVER_TODDLER, SimSituation.DATE,
         SimSituation.DATE_TEEN)):
        return False
    if not is_sim_available(sim):
        return False
    if not has_sim_permission_for_nudity(sim)[0]:
        return False
    return True
示例#5
0
 def get_score(cls, resolver):
     yield_to_irq()
     target = resolver.get_participant(
         ParticipantType.TargetSim) or resolver.get_participant(
             ParticipantType.Listeners)
     if has_sim_permission_for_nudity(target)[0]:
         return 100
     return 0
示例#6
0
 def on_interaction_start(cls, interaction_instance):
     target = cls.get_interaction_target(interaction_instance)
     (has_permission,
      _) = has_sim_permission_for_nudity(target, nudity_setting_test=True)
     if has_permission is False:
         return False
     if is_sim_outfit_fullbody(target):
         set_sim_top_underwear_state(target, False)
         set_sim_bottom_underwear_state(target, False)
         TurboSimUtil.Interaction.push_affordance(
             target,
             SimInteraction.WW_EXHIBITIONISM_UNDRESS_OUTFIT
             if is_sim_exhibitionist(target) else
             SimInteraction.WW_NATURISM_UNDRESS_OUTFIT,
             interaction_context=TurboInteractionUtil.InteractionContext.
             SOURCE_SCRIPT,
             insert_strategy=TurboInteractionUtil.QueueInsertStrategy.NEXT,
             must_run_next=True,
             priority=TurboInteractionUtil.Priority.High)
         return True
     if get_sim_body_state(target, 6) != BodyState.NUDE:
         set_sim_top_underwear_state(target, False)
         TurboSimUtil.Interaction.push_affordance(
             target,
             SimInteraction.WW_EXHIBITIONISM_UNDRESS_OUTFIT_TOP
             if is_sim_exhibitionist(target) else
             SimInteraction.WW_NATURISM_UNDRESS_OUTFIT_TOP,
             interaction_context=TurboInteractionUtil.InteractionContext.
             SOURCE_SCRIPT,
             insert_strategy=TurboInteractionUtil.QueueInsertStrategy.NEXT,
             must_run_next=True,
             priority=TurboInteractionUtil.Priority.High)
         return True
     if get_sim_body_state(target, 7) != BodyState.NUDE:
         set_sim_bottom_underwear_state(target, False)
         TurboSimUtil.Interaction.push_affordance(
             target,
             SimInteraction.WW_EXHIBITIONISM_UNDRESS_OUTFIT_BOTTOM
             if is_sim_exhibitionist(target) else
             SimInteraction.WW_NATURISM_UNDRESS_OUTFIT_BOTTOM,
             interaction_context=TurboInteractionUtil.InteractionContext.
             SOURCE_SCRIPT,
             insert_strategy=TurboInteractionUtil.QueueInsertStrategy.NEXT,
             must_run_next=True,
             priority=TurboInteractionUtil.Priority.High)
         return True
     return False
def test_sim_nudity_permission(sim):
    if CNSimUtils.is_toddler(sim):
        return False
    if CNSimUtils.can_have_sex(sim):
        return False
    if sim_ev(sim).is_flashing is True or sim_ev(
            sim).on_toilet_outfit_state != -1 or sim_ev(
                sim).on_breast_feeding_outfit_state != -1:
        return False
    if not is_sim_in_special_outfit(sim):
        return False
    sim_outfit_level = get_sim_outfit_level(sim)
    if sim_outfit_level != OutfitLevel.NUDE:
        return False
    if not is_sim_available(sim):
        return False
    for interaction_id in TurboSimUtil.Interaction.get_running_interactions_ids(
            sim):
        if interaction_id in NUDITY_EXCEPTION_INTERACTIONS:
            return
    for interaction_id in TurboSimUtil.Interaction.get_queued_interactions_ids(
            sim):
        if interaction_id in NUDITY_EXCEPTION_INTERACTIONS:
            return
    (has_permission, denied_permissions) = has_sim_permission_for_nudity(sim)
    if has_permission is True:
        return False
    sim_ev(sim).last_nudity_denied_permissions = denied_permissions
    if is_sim_exhibitionist(sim):
        dress_up_interaction = SimInteraction.WW_EXHIBITIONISM_FORCE_DRESS_UP
    else:
        dress_up_interaction = SimInteraction.WW_NATURISM_FORCE_DRESS_UP
    TurboSimUtil.Interaction.push_affordance(
        sim,
        dress_up_interaction,
        interaction_context=TurboInteractionUtil.InteractionContext.
        SOURCE_AUTONOMY,
        insert_strategy=TurboInteractionUtil.QueueInsertStrategy.NEXT,
        must_run_next=True,
        run_priority=TurboInteractionUtil.Priority.High,
        priority=TurboInteractionUtil.Priority.High,
        skip_if_running=True)
    return True
示例#8
0
 def on_interaction_test(cls, interaction_context, interaction_target):
     if not TurboTypesUtil.Sims.is_sim(interaction_target):
         return False
     sim = cls.get_interaction_sim(interaction_context)
     if not CNSimUtils.teen_sex_is_enabled() and (
             CNSimUtils.is_child_or_teen(sim)
             or CNSimUtils.is_child_or_teen(interaction_target)):
         return False
     skill_level = get_sim_nudity_skill_level(sim)
     if skill_level <= 1:
         return False
     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 not has_sim_permission_for_nudity(sim)[0]:
         return False
     if is_sim_outfit_fullbody(interaction_target):
         return True
     if get_sim_body_state(interaction_target, 6) == BodyState.OUTFIT:
         return True
     if get_sim_body_state(interaction_target, 7) == BodyState.OUTFIT:
         return True
     return False
示例#9
0
 def get_score(cls, resolver):
     yield_to_irq()
     sim = resolver.get_participant(ParticipantType.Actor)
     if has_sim_permission_for_nudity(sim)[0]:
         return 100
     return 0
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
示例#11
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)