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 _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 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 _has_reaction_to_nudity(sim, target): if TurboSimUtil.Age.get_age(sim) == TurboSimUtil.Age.TEEN or TurboSimUtil.Age.get_age(sim) == TurboSimUtil.Age.CHILD: return True if is_sim_naturist(sim) and TurboSimUtil.Age.is_older_than(sim, TurboSimUtil.Age.ADULT, or_equal=True) and (TurboSimUtil.Age.get_age(target) == TurboSimUtil.Age.TEEN or TurboSimUtil.Age.get_age(target) == TurboSimUtil.Age.CHILD): return True if is_sim_exhibitionist(sim): return True return False
def _get_sim_value(sim, target): base_sim_value = 25 sim_value_modifier = 0 if has_relationship_bit_with_sim( sim, target, SimRelationshipBit. ROMANTIC_ENGAGED) or has_relationship_bit_with_sim( sim, target, SimRelationshipBit.ROMANTIC_MARRIED ) or has_relationship_bit_with_sim( sim, target, SimRelationshipBit.ROMANTIC_SIGNIFICANT_OTHER): return base_sim_value / 4 if has_relationship_bit_with_sim(sim, target, SimRelationshipBit.WW_JUST_HAD_SEX): return base_sim_value / 4 if has_relationship_bit_with_sim( sim, target, SimRelationshipBit.ROMANTIC_HAVEDONEWOOHOO_RECENTLY): return base_sim_value / 2 if has_relationship_bit_with_sim( sim, target, SimRelationshipBit.FRIENDSHIP_BFF ) or has_relationship_bit_with_sim( sim, target, SimRelationshipBit.FRIENDSHIP_BFF_EVIL ) or has_relationship_bit_with_sim( sim, target, SimRelationshipBit.FRIENDSHIP_BFF_BROMANTICPARTNER): return base_sim_value / 2 current_nudity_level = get_sim_nudity_skill_level(sim) if is_sim_naturist(sim) and TurboSimUtil.Relationship.is_family( sim, target): base_sim_value = 22.5 elif current_nudity_level == 2: sim_value_modifier = 69.1 if is_sim_exhibitionist(sim): sim_value_modifier += -5 current_friendship_score = int( get_relationship_with_sim(sim, target, RelationshipTrackType.FRIENDSHIP)) current_friendship_score *= 0.45 * current_nudity_level if current_friendship_score > 0 else 0.45 * ( 6 - current_nudity_level) current_romance_score = int( get_relationship_with_sim(sim, target, RelationshipTrackType.ROMANCE)) current_romance_score *= 0.8 * current_nudity_level if current_romance_score > 0 else 0.8 * ( 6 - current_nudity_level) current_relationship_amount = (current_friendship_score + current_romance_score) / 2 if current_relationship_amount > 0: return base_sim_value * ( 1 - current_relationship_amount / 100) + sim_value_modifier if current_relationship_amount < 0: return base_sim_value + base_sim_value * ( abs(current_relationship_amount) / 100) + sim_value_modifier return base_sim_value + sim_value_modifier
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
def on_interaction_start(cls, interaction_instance): target = cls.get_interaction_target(interaction_instance) result = TurboSimUtil.Interaction.push_affordance( target, SimInteraction.WW_EXHIBITIONISM_FORCE_DRESS_UP if is_sim_exhibitionist(target) else SimInteraction.WW_NATURISM_FORCE_DRESS_UP, 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) if result: sim_ev( target ).last_nudity_autonomy = TurboWorldUtil.Time.get_absolute_ticks( ) + 360000 return True
def on_interaction_test(cls, interaction_context, interaction_target): sim = cls.get_interaction_sim(interaction_context) if not is_sim_exhibitionist(sim): return False return super().on_interaction_test(interaction_context, interaction_target)
def on_interaction_start(cls, interaction_instance): sim = cls.get_interaction_target(interaction_instance) nudity_debug_info = '' nudity_debug_info += 'Body States:\n' nudity_debug_info += ' Top: ' + str(get_sim_body_state(sim, 6)) + '\n' nudity_debug_info += ' Bottom: ' + str(get_sim_body_state(sim, 7)) + '\n' nudity_debug_info += '\nBody Additional States:\n' nudity_debug_info += ' Top: ' + str( get_sim_additional_body_state(sim, 6, get_sim_body_state( sim, 6))) + '\n' nudity_debug_info += ' Bottom: ' + str( get_sim_additional_body_state(sim, 7, get_sim_body_state( sim, 7))) + '\n' nudity_debug_info += '\nBody Actual States:\n' nudity_debug_info += ' Top: ' + str(get_sim_actual_body_state( sim, 6)) + '\n' nudity_debug_info += ' Bottom: ' + str( get_sim_actual_body_state(sim, 7)) + '\n' nudity_debug_info += '\nOutfit Body Types:\n' nudity_debug_info += ' Has Top: ' + str( has_sim_outfit_top(sim)) + '\n' nudity_debug_info += ' Has Bottom: ' + str( has_sim_outfit_bottom(sim)) + '\n' nudity_debug_info += ' Has Full Body: ' + str( is_sim_outfit_fullbody(sim)) + '\n' nudity_debug_info += '\nNudity Outfit Parts:\n' nudity_debug_info += ' Top: ' + str( sim_ev(sim).nude_outfit_parts[6]) + '\n' nudity_debug_info += ' Bottom: ' + str( sim_ev(sim).nude_outfit_parts[7]) + '\n' nudity_debug_info += ' Feet: ' + str( sim_ev(sim).nude_outfit_parts[8]) + '\n' nudity_debug_info += ' Penis Texture: ' + str( sim_ev(sim).nude_outfit_parts[115]) + '\n' nudity_debug_info += '\nPenis Outfit Parts:\n' nudity_debug_info += ' Soft: ' + str( sim_ev(sim).penis_outfit_parts['soft']) + '\n' nudity_debug_info += ' Hard: ' + str( sim_ev(sim).penis_outfit_parts['hard']) + '\n' nudity_debug_info += '\nPenis Parts Authors:\n' nudity_debug_info += ' Soft: ' + str( sim_ev(sim).outfit_soft_penis_author) + '\n' nudity_debug_info += ' Hard: ' + str( sim_ev(sim).outfit_hard_penis_author) + '\n' nudity_debug_info += '\nPenis State:\n' nudity_debug_info += ' Is Hard: ' + str( sim_ev(sim).is_penis_hard) + '\n' nudity_debug_info += ' Penis Cooldown: ' + str( sim_ev(sim).penis_hard_cooldown) + '\n' nudity_debug_info += '\nOriginal Outfit Data:\n' nudity_debug_info += ' Has Modifications: ' + str( sim_ev(sim).has_original_outfit_modifications) + '\n' nudity_debug_info += ' Category: ' + str( sim_ev(sim).original_outfit_category) + '\n' nudity_debug_info += ' Index: ' + str( sim_ev(sim).original_outfit_index) + '\n' nudity_debug_info += ' Update Locked: ' + str( sim_ev(sim).is_outfit_update_locked) + '\n' nudity_debug_info += '\nNudity Skill:\n' nudity_debug_info += ' Is Naturist/Is Exhibitionist: ' + str( is_sim_naturist(sim)) + '/' + str(is_sim_exhibitionist(sim)) + '\n' nudity_debug_info += ' Level: ' + str( get_sim_nudity_skill_level(sim) + get_sim_nudity_skill_progress(sim)) + '\n' nudity_debug_info += ' Influence Score: ' + str( sim_ev(sim).nudity_skill_influence_score) + '\n' nudity_debug_info += ' Fatigue: ' + str( get_sim_statistic_value( sim, SimCommodity.WW_NUDITY_SKILL_FATIGUE)) + '\n' nudity_debug_info += '\nNudity Reaction:\n' nudity_debug_info += ' Full Reaction Cooldown: ' + str( sim_ev(sim).full_nudity_reaction_cooldown) + '\n' nudity_debug_info += ' Inner Reaction Cooldown: ' + str( sim_ev(sim).inner_nudity_reaction_cooldown) + '\n' nudity_debug_info += '\nSpecial:\n' nudity_debug_info += ' Is Flashing: ' + str( sim_ev(sim).is_flashing) + '\n' nudity_debug_info += ' Toilet Use Outfit State: ' + str( sim_ev(sim).on_toilet_outfit_state) + '\n' nudity_debug_info += ' Breast Feeding Outfit State: ' + str( sim_ev(sim).on_breast_feeding_outfit_state) + '\n' display_notification(text=nudity_debug_info, title=str(TurboSimUtil.Name.get_name(sim)[0]) + ' ' + str(TurboSimUtil.Name.get_name(sim)[1]) + ' Nudity Debug', secondary_icon=sim)
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