def _trigger_desire_reaction_on_game_update(): 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 not CNSimUtils.can_have_sex(sim): continue if not is_sim_in_sex(sim): if is_sim_going_to_sex(sim): continue if has_sim_situations(sim, (SimSituation.GRIMREAPER, SimSituation.FIRE, SimSituation.BABYBIRTH_HOSPITAL)): continue if not is_sim_available(sim): continue line_of_sight = TurboMathUtil.LineOfSight.create(TurboSimUtil.Location.get_routing_surface(sim), TurboSimUtil.Location.get_position(sim), 8.0) for target in TurboManagerUtil.Sim.get_all_sim_instance_gen(humans=True, pets=False): if sim is target: continue if TurboSimUtil.Age.is_younger_than(target, TurboSimUtil.Age.CHILD): continue if not _has_reaction_to_nudity(sim, target): continue if TurboSimUtil.Gender.get_gender(target) not in get_sim_preferenced_genders(sim): continue if not TurboSimUtil.Location.is_visible(target): continue if TurboSimUtil.Spawner.is_leaving(target): continue (desire_limit, desire_increase) = _get_desire_nudity_value(target) if not desire_limit <= 0 and desire_increase > 0: if get_sim_desire_level(sim) > desire_limit: continue if not TurboMathUtil.LineOfSight.test(line_of_sight, TurboSimUtil.Location.get_position(target)): continue change_sim_desire_level(sim, desire_increase)
def _get_sims_around_value(sim_identifier, max_sims=6): sim = TurboManagerUtil.Sim.get_sim_instance(sim_identifier) max_sims = max_sims if max_sims % 2 == 0 else max_sims + 1 points_collection = list() line_of_sight = TurboMathUtil.LineOfSight.create( TurboSimUtil.Location.get_routing_surface(sim), TurboSimUtil.Location.get_position(sim), 8.0) for target in TurboManagerUtil.Sim.get_all_sim_instance_gen(humans=True, pets=False): if sim is target: continue if TurboSimUtil.Age.is_younger_than(target, TurboSimUtil.Age.BABY, or_equal=True): continue if not is_sim_available(target): continue if not TurboMathUtil.LineOfSight.test( line_of_sight, TurboSimUtil.Location.get_position(target)): continue points_collection.append(_get_sim_nudity_value(sim, target)) points_collection = sorted(points_collection, reverse=True) high_value = sum(points_collection[:int(max_sims / 2)]) low_value = sum(points_collection[int(-(max_sims / 2)):]) return max(0, (high_value + low_value) / 2)
def _sim_miscarriage_reaction(sim_identifier): line_of_sight = TurboMathUtil.LineOfSight.create( TurboSimUtil.Location.get_routing_surface(sim_identifier), TurboSimUtil.Location.get_position(sim_identifier), 8.0) for sim in TurboManagerUtil.Sim.get_all_sim_instance_gen(humans=True, pets=False): if sim is sim_identifier: pass if TurboSimUtil.Age.is_younger_than(sim, TurboSimUtil.Age.BABY, or_equal=True): pass while not is_sim_in_sex(sim): if is_sim_going_to_sex(sim): pass if has_sim_situations(sim, (SimSituation.GRIMREAPER, )): pass if not is_sim_available(sim): pass if not TurboMathUtil.LineOfSight.test( line_of_sight, TurboSimUtil.Location.get_position(sim)): pass TurboSimUtil.Interaction.push_affordance( sim, SimInteraction.WW_PREGNANCY_MISCARRIAGE_REACTION, target=sim_identifier, interaction_context=TurboInteractionUtil.InteractionContext. SOURCE_SCRIPT, insert_strategy=TurboInteractionUtil.QueueInsertStrategy.NEXT, must_run_next=True, priority=TurboInteractionUtil.Priority.Critical, run_priority=TurboInteractionUtil.Priority.Critical)
def get_sims_for_sex(skip_males=False, skip_females=False, skip_cmales=False, skip_cfemales=False, only_npc=False, relative_sims=(), min_sims_age=TurboSimUtil.Age.CHILD, max_sims_age=TurboSimUtil.Age.ELDER, skip_sims_ids=()): for sim in TurboManagerUtil.Sim.get_all_sim_instance_gen(humans=True, pets=False): if TurboManagerUtil.Sim.get_sim_id(sim) in skip_sims_ids: continue if only_npc is True and TurboSimUtil.Sim.is_player(sim): continue if skip_cmales is True and get_sim_sex_gender(sim, ignore_sim_specific_gender=True) == SexGenderType.CMALE: continue if skip_males is True and get_sim_sex_gender(sim, ignore_sim_specific_gender=True) == SexGenderType.MALE: continue if skip_cfemales is True and get_sim_sex_gender(sim, ignore_sim_specific_gender=True) == SexGenderType.CFEMALE: continue if skip_females is True and get_sim_sex_gender(sim, ignore_sim_specific_gender=True) == SexGenderType.FEMALE: continue if not TurboSimUtil.Age.is_younger_than(sim, min_sims_age): if TurboSimUtil.Age.is_older_than(sim, max_sims_age): continue if not (is_sim_in_sex(sim) or is_sim_going_to_sex(sim)): if sim_ev(sim).active_pre_sex_handler is not None: continue if has_sim_traits(sim, (SimTrait.HIDDEN_ISEVENTNPC_CHALLENGE, SimTrait.ISGRIMREAPER)): continue if not is_sim_available(sim): continue if relative_sims: is_incest = False for incest_test_sim in relative_sims: if is_true_family_relationship(sim, incest_test_sim): is_incest = True break if is_incest is True: continue yield TurboManagerUtil.Sim.get_sim_id(sim)
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
def is_sim_ready_for_sex(sim_identifier): sim = TurboManagerUtil.Sim.get_sim_instance(sim_identifier) if sim_ev(sim).active_sex_handler is not None: return False if sim_ev(sim).is_ready_to_sex is True: return False if TurboSimUtil.Age.is_younger_than(sim, TurboSimUtil.Age.CHILD): return False if not is_sim_available(sim): return False return True
def _react_to_sims_sex(sim): if not get_sex_setting(SexSetting.REACTION_TO_SEX_STATE, variable_type=bool): return False if TurboSimUtil.Age.is_younger_than(sim, TurboSimUtil.Age.BABY, or_equal=True): return False registered_sex_handlers = get_active_sex_handlers() if not registered_sex_handlers: return False try_to_react = True if sim_ev(sim).sex_reaction_attempt_cooldown > 0: try_to_react = False if sim_ev(sim).sex_reaction_cooldown > 0: try_to_react = False if try_to_react is False: 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 if not is_sim_available(sim): return False for interaction_id in TurboSimUtil.Interaction.get_running_interactions_ids( sim): if interaction_id == SimInteraction.WW_STOP_SEX: return True line_of_sight = TurboMathUtil.LineOfSight.create( TurboSimUtil.Location.get_routing_surface(sim), TurboSimUtil.Location.get_position(sim), 8.0) for sex_handler in registered_sex_handlers: if not sex_handler.is_playing is False: if sex_handler.is_ready_to_unregister is True: continue if sex_handler.get_identifier() in sim_ev( sim).sex_reaction_handlers_list: continue if sex_handler.get_creator_sim_id( ) == TurboManagerUtil.Sim.get_sim_id(sim): continue sex_interaction_los_position = sex_handler.get_los_position() if not TurboMathUtil.LineOfSight.test( line_of_sight, sex_interaction_los_position): continue sim_ev(sim).sex_reaction_attempt_cooldown = 2 if _jealousy_from_sex_reaction(sim, sex_handler): return True if _general_sex_reaction(sim, sex_handler): return True return False
def _reaction_to_sims_cum(sim): if not get_sex_setting(SexSetting.REACTION_TO_CUM_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_cum_reaction_cooldown inner_reaction_cooldown = sim_ev(sim).inner_cum_reaction_cooldown 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 not is_sim_available(sim): return False if has_sim_situations(sim, (SimSituation.GRIMREAPER, SimSituation.FIRE, SimSituation.BABYBIRTH_HOSPITAL)): return False if _has_sim_visible_cum(sim): return False line_of_sight = TurboMathUtil.LineOfSight.create( TurboSimUtil.Location.get_routing_surface(sim), TurboSimUtil.Location.get_position(sim), 2.5) targets = list() for target in TurboManagerUtil.Sim.get_all_sim_instance_gen(humans=True, pets=False): if sim is target: continue if TurboSimUtil.Age.is_younger_than(target, TurboSimUtil.Age.CHILD): continue if has_relationship_bit_with_sim(sim, target, SimRelationshipBit.WW_JUST_HAD_SEX): continue if not _has_sim_visible_cum(target): continue if not TurboSimUtil.Location.is_visible(target): continue if TurboSimUtil.Spawner.is_leaving(target): continue if not TurboMathUtil.LineOfSight.test( line_of_sight, TurboSimUtil.Location.get_position(target)): continue targets.append(target) if targets: is_mixer_only = _is_only_mixer_reaction(sim) target = random.choice(targets) if _cum_reaction(sim, target, only_mixer=is_mixer_only): return True return False
def get_available_for_sex_sims(only_on_hypersexual_lot=False, forbidden_traits=()): sims_list = set() 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 not CNSimUtils.teen_sex_is_enabled( ) and CNSimUtils.is_child_or_teen(sim): continue if not get_sex_setting( SexSetting.PLAYER_AUTONOMY_STATE, variable_type=bool) and TurboSimUtil.Sim.is_player(sim): continue object_id = TurboResourceUtil.Resource.get_id(sim) if is_autonomy_sex_locations_disabled(object_id): continue if TurboWorldUtil.Time.get_absolute_ticks() < sim_ev( sim ).last_sex_autonomy + get_time_between_sex_autonomy_attempts(): continue if not sim_ev(sim).active_sex_handler is not None: if sim_ev(sim).active_pre_sex_handler is not None: continue if not is_sim_allowed_for_autonomy(sim): continue if not _is_sim_needs_fine(sim): continue if _is_sim_fearing_possible_pregnancy(sim): continue if not is_sim_available(sim): continue if _has_sim_sex_forbidden_traits( sim, forbidden_traits=forbidden_traits): continue if _has_sim_sex_forbidden_buffs(sim): continue if _is_sim_in_sex_forbidden_situation(sim): continue if only_on_hypersexual_lot is True and not TurboWorldUtil.Lot.is_position_on_active_lot( TurboSimUtil.Location.get_position(sim)): continue sims_list.add(sim) return sims_list
def _reaction_to_teen_sims_pregnancy(sim): if not get_sex_setting(SexSetting.REACTION_TO_TEEN_PREGNANCY_STATE, variable_type=bool): return False if TurboSimUtil.Age.get_age(sim) != TurboSimUtil.Age.TEEN: return False if not TurboSimUtil.Pregnancy.is_pregnant(sim): return False if not has_sim_buffs(sim, TEEN_PREGNANCY_REACTION_BUFFS): return False if not TurboSimUtil.Location.is_visible(sim): return False if TurboSimUtil.Spawner.is_leaving(sim): return False sim_parents_ids = get_sim_ids_with_relationsip_bit(sim, SimRelationshipBit.FAMILY_PARENT) if not sim_parents_ids: return False sim_pregnancy_partner = TurboSimUtil.Pregnancy.get_partner(sim) parent_sims = list() for parent_sim_id in sim_parents_ids: parent_sim = TurboManagerUtil.Sim.get_sim_info(parent_sim_id) if parent_sim is None: pass if has_relationship_bit_with_sim(parent_sim, sim, SimRelationshipBit.WW_KNOWS_ABOUT_TEEN_PREGNANCY): pass if sim_pregnancy_partner is not None and TurboManagerUtil.Sim.get_sim_id(sim_pregnancy_partner) == parent_sim_id: pass parent_sims.append(parent_sim) if not parent_sims: return False line_of_sight = TurboMathUtil.LineOfSight.create(TurboSimUtil.Location.get_routing_surface(sim), TurboSimUtil.Location.get_position(sim), 8.0) for parent_sim_info in parent_sims: target = TurboManagerUtil.Sim.get_sim_instance(parent_sim_info) if target is None: pass if has_sim_situations(target, (SimSituation.GRIMREAPER, SimSituation.FIRE, SimSituation.BABYBIRTH_HOSPITAL)): pass if not is_sim_available(target): pass if not TurboMathUtil.LineOfSight.test(line_of_sight, TurboSimUtil.Location.get_position(target)): pass while _reaction_to_pregnancy(target, sim): 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
def update_sim_nudity_skill_on_active_nudity(sim_identifier): if TurboSimUtil.Age.is_younger_than(sim_identifier, TurboSimUtil.Age.CHILD): return if CNSimUtils.can_have_sex(sim_identifier): return if is_sim_in_sex(sim_identifier) or is_sim_going_to_sex(sim_identifier): return if not is_sim_available(sim_identifier): return sim_outfit_level = get_sim_outfit_level(sim_identifier) if sim_outfit_level == OutfitLevel.OUTFIT: return sims_around_value = _get_sims_around_value(sim_identifier, max_sims=6) if sim_outfit_level == OutfitLevel.NUDE: increase_sim_nudity_skill( sim_identifier, sims_around_value * get_nudity_skill_points_modifier( NuditySkillIncreaseReason.BEING_IN_NAKED_OUTFIT), extra_fatigue=0.05, reason=NuditySkillIncreaseReason.BEING_IN_NAKED_OUTFIT) elif sim_outfit_level == OutfitLevel.BATHING: sim_nudity_skill_level = get_sim_nudity_skill_level(sim_identifier) increase_sim_nudity_skill( sim_identifier, sims_around_value * (get_nudity_skill_points_modifier( NuditySkillIncreaseReason.BEING_IN_BATHING_OUTFIT) / sim_nudity_skill_level), extra_fatigue=0.15, reason=NuditySkillIncreaseReason.BEING_IN_BATHING_OUTFIT) elif sim_outfit_level == OutfitLevel.REVEALING or sim_outfit_level == OutfitLevel.UNDERWEAR: sim_nudity_skill_level = get_sim_nudity_skill_level(sim_identifier) increase_sim_nudity_skill( sim_identifier, sims_around_value * (get_nudity_skill_points_modifier( NuditySkillIncreaseReason.BEING_IN_REVEALING_OUTFIT) / (sim_nudity_skill_level * sim_nudity_skill_level)), extra_fatigue=0.15, reason=NuditySkillIncreaseReason.BEING_IN_REVEALING_OUTFIT)
def _sims_test(sim, current_score, targets=(), **__): penalty_score = 0 line_of_sight = TurboMathUtil.LineOfSight.create( TurboSimUtil.Location.get_routing_surface(sim), TurboSimUtil.Location.get_position(sim), 10.0) for target in targets or TurboManagerUtil.Sim.get_all_sim_instance_gen( humans=True, pets=False): if sim is target: continue if TurboSimUtil.Age.is_younger_than(target, TurboSimUtil.Age.TODDLER, or_equal=True): continue if not is_sim_available(target): continue if not TurboMathUtil.LineOfSight.test( line_of_sight, TurboSimUtil.Location.get_position(target)): continue penalty_score -= _get_sim_value( sim, target) * (6 - get_sim_nudity_skill_level(sim)) if current_score + penalty_score <= 0: break return (penalty_score, NudityPermissionDenied.TOO_MANY_SIMS_AROUND)
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