Ejemplo n.º 1
0
def _get_sex_handler_animation_duration(animation_instance, is_npc_only=False):
    if is_npc_only is True:
        animation_single_loop_duration = animation_instance.get_single_loop_duration(
        )
        progression_duration = get_sex_setting(
            SexSetting.NPC_SEX_DURATION_VALUE, variable_type=int) * 60 / 12
        if progression_duration >= int(animation_instance.get_duration()):
            animation_duration = int(
                animation_instance.get_duration_milliseconds()) - 4
        else:
            animation_duration = int(
                max(int(progression_duration / animation_single_loop_duration),
                    1) * animation_single_loop_duration * 1000) - 4
    elif get_sex_setting(
            SexSetting.SEX_ANIMATION_DURATION_OVERRIDE_TYPE,
            variable_type=int) == SexAnimationDurationOverrideType.OVERRIDE:
        animation_single_loop_duration = animation_instance.get_single_loop_duration(
        )
        animation_duration = int(
            max(
                1,
                int(
                    get_sex_setting(
                        SexSetting.SEX_ANIMATION_DURATION_OVERRIDE_VALUE,
                        variable_type=int) / animation_single_loop_duration)) *
            animation_single_loop_duration * 1000)
    else:
        animation_duration = int(
            animation_instance.get_duration_milliseconds())
    return animation_duration
Ejemplo n.º 2
0
 def get_gender_type(self, default_gender=False):
     if default_gender is True:
         return self.gender_type
     if get_sex_setting(
             SexSetting.SEX_GENDER_TYPE,
             variable_type=int) == SexGenderTypeSetting.ANY_BASED:
         if self.gender_type == SexGenderType.CMALE or self.gender_type == SexGenderType.CFEMALE or self.gender_type == SexGenderType.CBOTH:
             return SexGenderType.CBOTH
         return SexGenderType.BOTH
     if self.gender_type == SexGenderType.CFEMALE and get_sex_setting(
             SexSetting.GENDER_RECOGNITION_FEMALE_TO_BOTH_STATE,
             variable_type=bool):
         return SexGenderType.CBOTH
     if self.gender_type == SexGenderType.CMALE and get_sex_setting(
             SexSetting.GENDER_RECOGNITION_MALE_TO_BOTH_STATE,
             variable_type=bool):
         return SexGenderType.CBOTH
     if self.gender_type == SexGenderType.FEMALE and get_sex_setting(
             SexSetting.GENDER_RECOGNITION_FEMALE_TO_BOTH_STATE,
             variable_type=bool):
         return SexGenderType.BOTH
     if self.gender_type == SexGenderType.MALE and get_sex_setting(
             SexSetting.GENDER_RECOGNITION_MALE_TO_BOTH_STATE,
             variable_type=bool):
         return SexGenderType.BOTH
     return self.gender_type
def _is_sim_on_birth_control(sim_identifier):
    if get_sex_setting(SexSetting.BIRTH_CONTROL_MODE,
                       variable_type=int) == BirthControlModeSetting.PERFECT:
        if has_sim_trait(sim_identifier,
                         SimTrait.GENDEROPTIONS_PREGNANCY_CANIMPREGNATE
                         ) and sim_ev(sim_identifier).has_condom_on is True:
            return True
        if has_sim_trait(
                sim_identifier,
                SimTrait.GENDEROPTIONS_PREGNANCY_CANBEIMPREGNATED
        ) and sim_ev(
                sim_identifier
        ).day_used_birth_control_pills == TurboWorldUtil.Time.get_absolute_days(
        ):
            return True
        return False
    if get_sex_setting(SexSetting.BIRTH_CONTROL_MODE,
                       variable_type=int) == BirthControlModeSetting.REALISTIC:
        random_inst = random.Random(
            (TurboWorldUtil.Time.get_absolute_days() +
             TurboWorldUtil.Time.get_absolute_hours()) * 768)
        if has_sim_trait(sim_identifier,
                         SimTrait.GENDEROPTIONS_PREGNANCY_CANIMPREGNATE
                         ) and sim_ev(sim_identifier).has_condom_on is True:
            return random_inst.uniform(0, 1) < 0.95
        if has_sim_trait(
                sim_identifier,
                SimTrait.GENDEROPTIONS_PREGNANCY_CANBEIMPREGNATED
        ) and sim_ev(
                sim_identifier
        ).day_used_birth_control_pills == TurboWorldUtil.Time.get_absolute_days(
        ):
            return random_inst.uniform(0, 1) < 0.91
        return False
    return False
Ejemplo n.º 4
0
def _after_sex_cum(sex_handler, actor_id, sim_info):
    if sex_handler.get_animation_instance() is None or not get_sex_setting(
            SexSetting.CUM_VISIBILITY_STATE, variable_type=bool):
        return
    cum_layers = sex_handler.get_animation_instance(
    ).get_actor_received_cum_layers(actor_id)
    if not cum_layers:
        actions = sex_handler.get_animation_instance(
        ).get_actor_received_actions(actor_id)
        for (action_actor_id, action_type, is_cum_inside) in actions:
            if is_cum_inside is True:
                pass
            cum_layer_type = get_cum_layer_from_sex_category(action_type)
            while cum_layer_type is not CumLayerType.NONE:
                cum_layers.append((action_actor_id, (cum_layer_type, )))
    for (action_actor_id, cum_layer_types) in cum_layers:
        action_actor_sim_id = sex_handler.get_sim_id_by_actor_id(
            action_actor_id)
        if action_actor_sim_id is None:
            pass
        action_actor_sim_info = TurboManagerUtil.Sim.get_sim_info(
            action_actor_sim_id)
        if not has_sim_trait(action_actor_sim_info,
                             SimTrait.GENDEROPTIONS_TOILET_STANDING):
            pass
        if not get_sex_setting(
                SexSetting.CUM_VISIBILITY_WITH_CONDOM_STATE, variable_type=bool
        ) and sim_ev(action_actor_sim_info).has_condom_on is True:
            pass
        apply_sim_cum_layer(sim_info, cum_layer_types)
Ejemplo n.º 5
0
def try_progress_sex_interaction(sex_handler, is_manual=False):
    if sex_handler.is_npc_only():
        if sex_handler.get_animation_instance().get_sex_category(
        ) == SexCategoryType.CLIMAX:
            return
        animation_duration = _get_sex_handler_animation_duration(
            sex_handler.get_animation_instance(), is_npc_only=True)
    else:
        if get_sex_setting(
                SexSetting.SEX_PROGRESSION_TYPE, variable_type=int
        ) == SexProgressionLevelSetting.DISABLED and is_manual is False:
            return
        if sex_handler.get_animation_instance().get_sex_category(
        ) == SexCategoryType.CLIMAX and not get_sex_setting(
                SexSetting.CLIMAX_SEX_PROGRESSION_STATE, variable_type=bool):
            return
        animation_duration = _get_sex_handler_animation_duration(
            sex_handler.get_animation_instance())
    if is_manual is True or sex_handler.animation_counter >= animation_duration:
        sex_handler.animation_counter = 0
        if sex_handler.next_animation_instance is not None and sex_handler.next_animation_instance != sex_handler.get_animation_instance(
        ):
            if is_sim_allowed_for_animation(
                    sex_handler.get_actors_sim_info_gen(),
                    sex_handler.next_animation_instance.get_sex_category()):
                sex_handler.set_animation_instance(
                    sex_handler.next_animation_instance,
                    is_animation_change=True)
                sex_handler.next_animation_instance = None
                sex_handler.play(is_animation_change=True)
def get_chance_for_random_sex_autonomy(sims_list,
                                       skip_hypersexual_lot_check=False):
    if skip_hypersexual_lot_check and False and is_sims_list_at_hypersexual_lot(
            sims_list):
        return 1.0
    self_assured_multiplier = [
        has_sim_trait(sim_info, SimTrait.SELFASSURED) for sim_info in sims_list
    ].count(True)
    is_at_night = TurboWorldUtil.Time.get_hour_of_day(
    ) <= 5 or TurboWorldUtil.Time.get_hour_of_day() >= 23
    is_at_weekend = TurboWorldUtil.Time.get_day_of_week() >= 5
    if get_sex_setting(SexSetting.AUTONOMY_LEVEL,
                       variable_type=int) == SexAutonomyLevelSetting.HIGH:
        return SEX_AUTONOMY_HIGH_LEVEL_BASE_CHANCE + (
            0.017 if is_at_weekend else 0.0
        ) + (
            0.005 if is_at_night else 0.0
        ) + 0.003 * self_assured_multiplier + get_sex_autonomy_failure_chance(
        )
    if get_sex_setting(SexSetting.AUTONOMY_LEVEL,
                       variable_type=int) == SexAutonomyLevelSetting.NORMAL:
        return SEX_AUTONOMY_NORMAL_LEVEL_BASE_CHANCE + (
            0.015 if is_at_weekend else 0.0
        ) + (
            0.003 if is_at_night else 0.0
        ) + 0.002 * self_assured_multiplier + get_sex_autonomy_failure_chance(
        )
    return SEX_AUTONOMY_LOW_LEVEL_BASE_CHANCE + (
        0.015 if is_at_weekend else 0.0
    ) + (
        0.003 if is_at_night else 0.0
    ) + 0.002 * self_assured_multiplier + get_sex_autonomy_failure_chance()
Ejemplo n.º 7
0
def _has_outfit_parts_to_undress(interaction_sim, interaction_target,
                                 body_types):
    if interaction_target is None or not TurboTypesUtil.Sims.is_sim(
            interaction_target):
        return False
    if not get_sex_setting(SexSetting.INSTANT_UNDRESSING_STATE,
                           variable_type=bool):
        if not get_sex_setting(SexSetting.MANUAL_NPC_SEX_STATE,
                               variable_type=bool):
            if sim_ev(interaction_sim).active_sex_handler is None:
                return False
            if sim_ev(interaction_sim).active_sex_handler is not sim_ev(
                    interaction_target).active_sex_handler:
                return False
                if sim_ev(interaction_target).active_sex_handler is None:
                    return False
        elif sim_ev(interaction_target).active_sex_handler is None:
            return False
    for body_type in body_types:
        body_state = get_sim_actual_body_state(interaction_target, body_type)
        if body_state == BodyState.NUDE:
            pass
        part_id = get_sim_outfit_cas_part_from_bodytype(
            interaction_target, body_type)
        if part_id == -1:
            pass
    return False
Ejemplo n.º 8
0
def get_time_between_sex_autonomy_attempts():
    if get_sex_setting(SexSetting.AUTONOMY_LEVEL,
                       variable_type=int) == SexAutonomyLevelSetting.HIGH:
        return 360000
    if get_sex_setting(SexSetting.AUTONOMY_LEVEL,
                       variable_type=int) == SexAutonomyLevelSetting.NORMAL:
        return 720000
    if get_sex_setting(SexSetting.AUTONOMY_LEVEL,
                       variable_type=int) == SexAutonomyLevelSetting.LOW:
        return 1440000
    return 0
def try_sim_pregnancy_from_sex_handler(sex_handler, sims_list, actor_id,
                                       sim_info):
    if not can_sim_get_pregnant(sim_info):
        return False
    if TurboSimUtil.Pregnancy.is_pregnant(sim_info):
        return False
    sim_pregnancy_chance = get_sim_current_pregnancy_chance(sim_info)
    if get_sex_setting(
            SexSetting.PREGNANCY_MODE, variable_type=int
    ) == PregnancyModeSetting.SIMPLE and sim_pregnancy_chance <= 0.0:
        return False
    pregnancy_partners = _get_possible_partners(sex_handler, sims_list,
                                                actor_id, sim_info)
    absolute_days = TurboWorldUtil.Time.get_absolute_days()
    enable_pregnancy_discovery = False
    for (partner_sim_id, is_cum_inside) in pregnancy_partners:
        partner_sim_info = TurboManagerUtil.Sim.get_sim_info(partner_sim_id)
        if partner_sim_info is None:
            pass
        if has_relationship_bit_with_sim(
                sim_info, partner_sim_info,
                SimRelationshipBit.WW_POTENTIAL_PREGNANCY_PARENT):
            pass
        if get_sex_setting(
                SexSetting.BIRTH_CONTROL_MODE,
                variable_type=int) == BirthControlModeSetting.REALISTIC:
            enable_pregnancy_discovery = True
        if _is_sim_on_birth_control(partner_sim_info):
            pass
        enable_pregnancy_discovery = True
        partner_pregnancy_chance = get_sim_current_pregnancy_chance(
            partner_sim_info)
        if partner_pregnancy_chance <= 0.0:
            pass
        if is_cum_inside is False:
            if has_sim_trait(partner_sim_info, SimTrait.LAZY) or has_sim_trait(
                    partner_sim_info, SimTrait.CLUMSY):
                partner_pregnancy_chance /= 2.0
            else:
                partner_pregnancy_chance /= 4.0
        chance_value = random.Random(
            (absolute_days, TurboManagerUtil.Sim.get_sim_id(sim_info),
             partner_sim_id)).uniform(0, 1)
        while chance_value <= sim_pregnancy_chance and (
                sim_ev(sim_info).pregnancy_fertility_boost[0] > 0
                or chance_value <= partner_pregnancy_chance):
            sim_ev(sim_info).pregnancy_coming_flag = True
            add_relationsip_bit_with_sim(
                sim_info, partner_sim_info,
                SimRelationshipBit.WW_POTENTIAL_PREGNANCY_PARENT)
            enable_pregnancy_discovery = True
    if enable_pregnancy_discovery is True and sex_handler.has_displayed_pregnancy_notification is False:
        set_sim_pregnancy_discovery(sim_info, True)
        sex_handler.has_displayed_pregnancy_notification = True
Ejemplo n.º 10
0
 def on_interaction_test(cls, interaction_context, interaction_target):
     if not get_sex_setting(SexSetting.GENDER_RECOGNITION_SIM_SPECIFIC_STATE, variable_type=bool):
         return False
     if get_sex_setting(SexSetting.SEX_GENDER_TYPE, variable_type=int) == SexGenderTypeSetting.SEX_BASED:
         return False
     if interaction_target is None or not TurboTypesUtil.Sims.is_sim(interaction_target):
         return False
     if is_sim_in_sex(interaction_target) or is_sim_planning_for_sex(interaction_target):
         return False
     if sim_ev(interaction_target).gender_recognition == 0:
         return False
     return True
def _trigger_autonomy_join_sex_interaction(active_sex_handler, join_sim):
    object_identifier = active_sex_handler.get_object_identifier()
    genders = list()
    sims_list = list(active_sex_handler.get_actors_sim_info_gen())
    sims_list.append(join_sim)
    for sim in sims_list:
        genders.append(get_sim_sex_gender(sim))
    target_sex_category_type = active_sex_handler.get_animation_instance(
    ).get_sex_category()
    animation_instance = None
    for sex_category_type in (target_sex_category_type,
                              SexCategoryType.ORALJOB, SexCategoryType.VAGINAL,
                              SexCategoryType.ANAL, SexCategoryType.HANDJOB,
                              SexCategoryType.FOOTJOB,
                              SexCategoryType.TEASING):
        if not is_sim_allowed_for_animation(sims_list, sex_category_type):
            pass
        animation_instance = get_random_animation_of_type(
            sex_category_type,
            object_identifier,
            genders,
            ignore_animations=get_autonomy_disabled_sex_animations())
        while animation_instance is not None:
            break
    if animation_instance is None:
        return False
    pre_sex_handler = active_sex_handler.get_pre_sex_handler(is_joining=True)
    pre_sex_handler.set_animation_instance(animation_instance)
    for sim in sims_list:
        pre_sex_handler.add_sim(sim)
    creator_sim = TurboManagerUtil.Sim.get_sim_info(
        pre_sex_handler.get_creator_sim_id())
    ask_player_to_start = False
    if get_sex_setting(
            SexSetting.AUTONOMY_PLAYER_ASK_PLAYER_DIALOG_STATE,
            variable_type=bool) and TurboSimUtil.Sim.is_player(
                creator_sim) and TurboSimUtil.Sim.is_player(join_sim):
        ask_player_to_start = True
    elif get_sex_setting(
            SexSetting.AUTONOMY_NPC_ASK_PLAYER_DIALOG_STATE,
            variable_type=bool) and TurboSimUtil.Sim.is_player(
                creator_sim) and TurboSimUtil.Sim.is_npc(join_sim):
        ask_player_to_start = True
    elif get_sex_setting(
            SexSetting.AUTONOMY_PLAYER_ASK_NPC_DIALOG_STATE,
            variable_type=bool) and TurboSimUtil.Sim.is_npc(
                creator_sim) and TurboSimUtil.Sim.is_player(join_sim):
        ask_player_to_start = True
    join_sex_interaction_from_pre_sex_handler(
        pre_sex_handler, (join_sim, ),
        ask_player_to_join=ask_player_to_start,
        ignore_relationship_check=True)
    return True
def get_sim_current_pregnancy_chance(sim_identifier):
    if get_sex_setting(SexSetting.PREGNANCY_MODE, variable_type=int) == PregnancyModeSetting.DISABLED:
        return 0.0
    chance_modifier = 1.0
    chance_modifier -= sim_ev(sim_identifier).birth_control_pill_power
    if get_sex_setting(SexSetting.PREGNANCY_MODE, variable_type=int) == PregnancyModeSetting.SIMPLE:
        if has_sim_trait(sim_identifier, SimTrait.WW_INFERTILE):
            return 0.0
        if TurboSimUtil.Sim.is_npc(sim_identifier):
            return get_sex_setting(SexSetting.SIMPLE_NPC_PREGNANCY_CHANCE, variable_type=int)/100.0*chance_modifier
        return get_sex_setting(SexSetting.SIMPLE_PREGNANCY_CHANCE, variable_type=int)/100.0*chance_modifier
    elif get_sex_setting(SexSetting.PREGNANCY_MODE, variable_type=int) == PregnancyModeSetting.MENSTRUAL_CYCLE:
        return get_sim_current_menstrual_pregnancy_chance(sim_identifier)*chance_modifier
    return 0.0
Ejemplo n.º 13
0
def is_sim_allowed_for_free_birth_control(sim_identifier):
    random_inst = random.Random(
        TurboManagerUtil.Sim.get_sim_id(sim_identifier) /
        max(1, TurboWorldUtil.Time.get_absolute_days()))
    if get_sex_setting(SexSetting.NPC_BIRTH_CONTROL_MODE,
                       variable_type=int) == NPCBirthControlModeSetting.SAFE:
        if random_inst.uniform(0, 1) > 0.1:
            return True
    elif get_sex_setting(
            SexSetting.NPC_BIRTH_CONTROL_MODE, variable_type=int
    ) == NPCBirthControlModeSetting.MODERATE and random_inst.uniform(0,
                                                                     1) > 0.38:
        return True
    return False
Ejemplo n.º 14
0
def _get_menstrual_cycle_duration():
    if get_sex_setting(
            SexSetting.MENSTRUAL_CYCLE_DURATION,
            variable_type=int) == MenstrualCycleDurationSetting.AUTO:
        sims_age_speed = TurboSimUtil.Age.get_global_age_speed()
        if sims_age_speed == TurboSimUtil.Age.AgeSpeed.SLOW:
            return MenstrualCycleDurationSetting.LONG
        if sims_age_speed == TurboSimUtil.Age.AgeSpeed.NORMAL:
            return MenstrualCycleDurationSetting.NORMAL
        if sims_age_speed == TurboSimUtil.Age.AgeSpeed.FAST:
            return MenstrualCycleDurationSetting.SHORT
        return MenstrualCycleDurationSetting.NORMAL
    return get_sex_setting(SexSetting.MENSTRUAL_CYCLE_DURATION,
                           variable_type=int)
Ejemplo n.º 15
0
def update_stapon(sim_identifier,
                  actor_data=None,
                  is_npc_only=False,
                  force_remove=False):
    if not has_loaded_strapon():
        return False
    sim_info = TurboManagerUtil.Sim.get_sim_info(sim_identifier)
    if force_remove is True and is_strapon_on_sim(sim_info):
        _undress_bottom(sim_info)
        return False
    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 has_sim_trait(sim_info, SimTrait.GENDEROPTIONS_TOILET_STANDING):
        return False
    if sim_ev(sim_info).is_strapon_allowed is False:
        if get_sex_setting(SexSetting.STRAPON_AUTO_REMOVE_STATE,
                           variable_type=bool) and is_strapon_on_sim(sim_info):
            _undress_bottom(sim_info)
        return False
    allows_strapon = False
    if actor_data is not None and actor_data.is_allowing_strapon():
        allows_strapon = True
    elif actor_data is not None and (
            actor_data.get_final_gender_type() == SexGenderType.MALE
            or actor_data.get_final_gender_type() == SexGenderType.CMALE):
        allows_strapon = True
    if is_strapon_on_sim(sim_info):
        if allows_strapon is False and get_sex_setting(
                SexSetting.STRAPON_AUTO_REMOVE_STATE, variable_type=bool):
            _undress_bottom(sim_info)
            return False
        return True
    if allows_strapon is False:
        return False
    if undressing_type == SexUndressingLevelSetting.DISABLED and get_sim_actual_body_state(
            sim_info, TurboCASUtil.BodyType.LOWER_BODY) != BodyState.NUDE:
        return False
    _undress_bottom(sim_info)
    set_bodytype_caspart(sim_info, (TurboCASUtil.OutfitCategory.SPECIAL, 0),
                         TurboCASUtil.BodyType.LOWER_BODY,
                         get_sim_strapon_part_id(sim_info))
    try:
        TurboSimUtil.CAS.refresh_outfit(sim_info)
    except:
        pass
Ejemplo n.º 16
0
def _is_sim_fearing_possible_pregnancy(sim_identifier):
    if TurboSimUtil.Sim.is_player(sim_identifier):
        return False
    if not can_sim_get_pregnant(sim_identifier):
        return False
    if is_sim_birth_control_safe(sim_identifier, allow_potentially=True):
        return False
    if get_sex_setting(
            SexSetting.AUTONOMY_NPC_PREGNANCY_AWARENESS, variable_type=bool
    ) and get_sex_setting(
            SexSetting.PREGNANCY_MODE, variable_type=bool
    ) == PregnancyModeSetting.MENSTRUAL_CYCLE and get_sim_current_pregnancy_chance(
            sim_identifier) > 0:
        return True
    return False
Ejemplo n.º 17
0
def _trigger_random_sex_autonomy_on_game_update():
    global SEX_AUTONOMY_LAST_HOUR_UPDATE
    if get_sex_setting(SexSetting.AUTONOMY_LEVEL, variable_type=int) == SexAutonomyLevelSetting.DISABLED:
        return
    if not get_sex_setting(SexSetting.AUTONOMY_RANDOM_SEX_STATE, variable_type=bool):
        return
    if SEX_AUTONOMY_LAST_HOUR_UPDATE == -1:
        SEX_AUTONOMY_LAST_HOUR_UPDATE = TurboWorldUtil.Time.get_hour_of_day()
        return
    if SEX_AUTONOMY_LAST_HOUR_UPDATE == TurboWorldUtil.Time.get_hour_of_day():
        return
    SEX_AUTONOMY_LAST_HOUR_UPDATE = TurboWorldUtil.Time.get_hour_of_day()
    result = trigger_random_sex_autonomy()
    if not result:
        update_sex_autonomy_failure_chance(result)
Ejemplo n.º 18
0
def trigger_random_sex_autonomy(force=False):
    result = False
    is_hypersexual_lot = has_current_lot_trait(LotTrait.WW_LOTTRAIT_HYPERSEXUAL)
    if is_hypersexual_lot is True:
        if get_sex_setting(SexSetting.AUTONOMY_LEVEL, variable_type=int) == SexAutonomyLevelSetting.HIGH:
            triggers_amount = 4
        elif get_sex_setting(SexSetting.AUTONOMY_LEVEL, variable_type=int) == SexAutonomyLevelSetting.NORMAL:
            triggers_amount = 3
        else:
            triggers_amount = 2
        for _ in range(triggers_amount):
            while _trigger_random_sex_autonomy(force=False, only_hypersexual_lot_sims=True):
                result = True
    if _trigger_random_sex_autonomy(force=force):
        result = True
    return result
def get_sex_autonomy_location(sims_pair,
                              location_style=LocationStyleType.NONE,
                              sex_locations_override=None):
    if get_sex_setting(SexSetting.AUTONOMY_LEVEL,
                       variable_type=int) == SexAutonomyLevelSetting.HIGH:
        sex_locations_sample = 8
    elif get_sex_setting(SexSetting.AUTONOMY_LEVEL,
                         variable_type=int) == SexAutonomyLevelSetting.NORMAL:
        sex_locations_sample = 6
    else:
        sex_locations_sample = 3
    sex_locations = sex_locations_override or get_sex_locations(
        sims_pair, location_style=location_style)[:sex_locations_sample]
    if not sex_locations:
        return
    return random.choice(sex_locations)[1]
def update_sex_autonomy_failure_chance(result):
    if get_sex_setting(SexSetting.AUTONOMY_LEVEL,
                       variable_type=int) == SexAutonomyLevelSetting.HIGH:
        failure_chance_modifier = SEX_AUTONOMY_HIGH_LEVEL_BASE_CHANCE / 2
    elif get_sex_setting(SexSetting.AUTONOMY_LEVEL,
                         variable_type=int) == SexAutonomyLevelSetting.NORMAL:
        failure_chance_modifier = SEX_AUTONOMY_NORMAL_LEVEL_BASE_CHANCE / 2
    else:
        failure_chance_modifier = SEX_AUTONOMY_LOW_LEVEL_BASE_CHANCE / 2
    current_autonomy_failure_chance = get_sex_autonomy_failure_chance()
    if not result:
        set_sex_autonomy_failure_chance(
            min(current_autonomy_failure_chance + failure_chance_modifier, 1))
    else:
        set_sex_autonomy_failure_chance(
            max(0, current_autonomy_failure_chance - failure_chance_modifier))
Ejemplo n.º 21
0
def get_age_limits_for_sex(sims_list):
    youngest_sim_age = None
    oldest_sim_age = None
    for actor_sim_info in sims_list:
        if actor_sim_info is None:
            continue
        if youngest_sim_age is None or TurboSimUtil.Age.is_younger_than(actor_sim_info, youngest_sim_age):
            youngest_sim_age = TurboSimUtil.Age.get_age(actor_sim_info)
        if oldest_sim_age is None or TurboSimUtil.Age.is_older_than(actor_sim_info, oldest_sim_age):
            oldest_sim_age = TurboSimUtil.Age.get_age(actor_sim_info)
    is_allowing_teens = get_sex_setting(SexSetting.TEENS_SEX_STATE, variable_type=bool)
    is_child_only = youngest_sim_age == oldest_sim_age == TurboSimUtil.Age.CHILD
    is_teen_only = youngest_sim_age == oldest_sim_age == TurboSimUtil.Age.TEEN
    has_teen = youngest_sim_age == TurboSimUtil.Age.TEEN or oldest_sim_age == TurboSimUtil.Age.TEEN
    has_child = youngest_sim_age == TurboSimUtil.Age.CHILD or oldest_sim_age == TurboSimUtil.Age.CHILD
    if not get_relationship_setting(RelationshipSetting.ROMANCE_AGE_RESTRICTION_STATE, variable_type=bool):
        if is_child_only and is_allowing_teens:
            return (TurboSimUtil.Age.CHILD, TurboSimUtil.Age.CHILD)
        if is_teen_only and is_allowing_teens:
            return (TurboSimUtil.Age.TEEN, TurboSimUtil.Age.TEEN)
        if has_child and is_allowing_teens:
            return (TurboSimUtil.Age.CHILD, TurboSimUtil.Age.ELDER)
        if has_teen and is_allowing_teens:
            return (TurboSimUtil.Age.TEEN, TurboSimUtil.Age.ELDER)
        return (TurboSimUtil.Age.YOUNGADULT, TurboSimUtil.Age.ELDER)
    else:
        if not CNSimUtils.teen_sex_is_enabled():
            return (TurboSimUtil.Age.YOUNGADULT, TurboSimUtil.Age.ELDER)
        return (TurboSimUtil.Age.CHILD, TurboSimUtil.Age.ELDER)
Ejemplo n.º 22
0
def modify_sim_sex_snapshot_motive(sim_info,
                                   sim_motive,
                                   snapshot_state,
                                   modify_value,
                                   min_value=None,
                                   max_value=None):
    sim_state_snapshot = sim_ev(sim_info).sim_sex_state_snapshot
    if snapshot_state not in sim_state_snapshot:
        return
    if not get_sex_setting(SexSetting.NEEDS_DECAY_STATE, variable_type=bool):
        set_sim_motive_value(sim_info,
                             sim_motive,
                             sim_state_snapshot[snapshot_state],
                             skip_disabled=True)
    else:
        motive_value = get_sim_motive_value(sim_info,
                                            sim_motive) + modify_value
        if min_value is not None and motive_value < min_value:
            motive_value = min_value
        if max_value is not None and motive_value > max_value:
            motive_value = max_value
        set_sim_motive_value(sim_info,
                             sim_motive,
                             motive_value,
                             skip_disabled=True)
        sim_state_snapshot[snapshot_state] = motive_value
Ejemplo n.º 23
0
def get_animations_for_object(object_identifier,
                              genders,
                              excluded_sex_category_types=(),
                              ignore_animations_ids=(),
                              ignore_animations=()):
    collected_animations = list()
    for animation_instance in get_available_sex_animations():
        while not animation_instance.get_sex_category(
        ) == SexCategoryType.NONE:
            if animation_instance.get_sex_category(
            ) in excluded_sex_category_types:
                pass
            while not animation_instance.get_animation_id(
            ) in ignore_animations_ids:
                if animation_instance.get_identifier() in ignore_animations:
                    pass
                while len(animation_instance.get_actors()) == len(
                        genders
                ) and animation_instance.can_be_used_with_object(
                        object_identifier):
                    if get_sex_setting(SexSetting.SEX_GENDER_TYPE,
                                       variable_type=int
                                       ) == SexGenderTypeSetting.ANY_BASED:
                        collected_animations.append(animation_instance)
                    else:
                        actors_genders_list = list()
                        for actor_data in animation_instance.get_actors():
                            actors_genders_list.append(
                                actor_data.get_gender_type())
                        if compare_sim_genders_with_actor_genders_list(
                                genders, actors_genders_list):
                            collected_animations.append(animation_instance)
    return collected_animations
Ejemplo n.º 24
0
def _can_sim_receive_cum(interaction_sim, interaction_target, cum_type):
    if interaction_target is None or not TurboTypesUtil.Sims.is_sim(interaction_target):
        return False
    if not get_sex_setting(SexSetting.MANUAL_NPC_SEX_STATE, variable_type=bool):
        if sim_ev(interaction_sim).active_sex_handler is None:
            return False
        if sim_ev(interaction_sim).active_sex_handler is not sim_ev(interaction_target).active_sex_handler:
            return False
    elif sim_ev(interaction_target).active_sex_handler is None:
        return False
    active_sex_handler = sim_ev(interaction_target).active_sex_handler
    if active_sex_handler.is_at_climax is False:
        return False
    if cum_type == CumLayerType.V****A and has_sim_trait(interaction_target, SimTrait.GENDEROPTIONS_TOILET_STANDING):
        return False
    has_sim_that_can_cum = False
    for actor_sim_info in active_sex_handler.get_actors_sim_info_gen():
        if TurboManagerUtil.Sim.get_sim_id(actor_sim_info) == TurboManagerUtil.Sim.get_sim_id(interaction_target):
            pass
        if not has_sim_trait(actor_sim_info, SimTrait.GENDEROPTIONS_TOILET_STANDING):
            pass
        has_sim_that_can_cum = True
        break
    if has_sim_that_can_cum is False:
        return False
    if has_sim_cas_part_id(interaction_target, get_cum_layer_cas_id(cum_type)):
        return False
    return True
Ejemplo n.º 25
0
 def on_interaction_test(cls, interaction_context, interaction_target):
     if interaction_target is None or not TurboTypesUtil.Sims.is_sim(
             interaction_target):
         return False
     if not get_sex_setting(SexSetting.MANUAL_NPC_SEX_STATE,
                            variable_type=bool):
         if sim_ev(cls.get_interaction_sim(
                 interaction_context)).active_sex_handler is None:
             return False
         if sim_ev(cls.get_interaction_sim(
                 interaction_context)).active_sex_handler is not sim_ev(
                     interaction_target).active_sex_handler:
             return False
     elif sim_ev(interaction_target).active_sex_handler is None:
         return False
     active_sex_handler = sim_ev(interaction_target).active_sex_handler
     target_actor_id = active_sex_handler.get_actor_id_by_sim_id(
         TurboManagerUtil.Sim.get_sim_id(interaction_target))
     target_actor_data = active_sex_handler.get_animation_instance(
     ).get_actor(target_actor_id)
     if target_actor_data is None:
         return False
     for (actor_id, actor_sim) in active_sex_handler.get_sims_list():
         if actor_id == target_actor_id:
             pass
         actor_data = active_sex_handler.get_animation_instance().get_actor(
             actor_id)
         if actor_data is None:
             return False
         while is_compatible_actor(actor_sim, actor_data,
                                   interaction_target, target_actor_data):
             return True
     return False
Ejemplo n.º 26
0
def _after_sex_dress_up(sim_info):
    if get_sex_setting(SexSetting.OUTFIT_AUTO_DRESS_UP_AFTER_SEX_STATE,
                       variable_type=bool):
        dress_up_outfit(sim_info)
    elif TurboSimUtil.Sim.is_npc(sim_info) and has_sim_situations(
            sim_info, (SimSituation.LEAVE, SimSituation.LEAVE_NOW_MUST_RUN,
                       SimSituation.SINGLESIMLEAVE)):
        dress_up_outfit(sim_info)
def start_sex_interaction_from_pre_sex_handler(pre_sex_handler):
    is_instant = get_sex_setting(
        SexSetting.ALWAYS_ACCEPT_STATE,
        variable_type=bool) and get_sex_setting(
            SexSetting.SEX_INITIATION_TYPE,
            variable_type=int) == SexInitiationTypeSetting.INSTANT_TELEPORT
    if pre_sex_handler.get_sims_amount() == 1:
        if is_instant is True:
            return _start_instant_solo_sex_interaction(pre_sex_handler)
        return _start_solo_sex_interaction(pre_sex_handler)
    else:
        creator_sim = TurboManagerUtil.Sim.get_sim_instance(
            pre_sex_handler.get_creator_sim_id())
        target_sim = TurboManagerUtil.Sim.get_sim_instance(
            pre_sex_handler.get_second_sim_id())
        if creator_sim is None or target_sim is None:
            clear_sim_sex_extra_data(
                TurboManagerUtil.Sim.get_sim_info(
                    pre_sex_handler.get_creator_sim_id()))
            clear_sim_sex_extra_data(
                TurboManagerUtil.Sim.get_sim_info(
                    pre_sex_handler.get_second_sim_id()))
            return False
        ask_player_to_start = False
        if get_sex_setting(SexSetting.AUTONOMY_PLAYER_ASK_PLAYER_DIALOG_STATE,
                           variable_type=bool) and (
                               pre_sex_handler.is_autonomy_sex()
                               and TurboSimUtil.Sim.is_player(creator_sim)
                           ) and TurboSimUtil.Sim.is_player(target_sim):
            ask_player_to_start = True
        elif get_sex_setting(
                SexSetting.AUTONOMY_NPC_ASK_PLAYER_DIALOG_STATE,
                variable_type=bool) and TurboSimUtil.Sim.is_npc(
                    creator_sim) and TurboSimUtil.Sim.is_player(target_sim):
            ask_player_to_start = True
        elif get_sex_setting(SexSetting.AUTONOMY_PLAYER_ASK_NPC_DIALOG_STATE,
                             variable_type=bool) and (
                                 pre_sex_handler.is_autonomy_sex()
                                 and TurboSimUtil.Sim.is_player(creator_sim)
                             ) and TurboSimUtil.Sim.is_npc(target_sim):
            ask_player_to_start = True
        if is_instant is True:
            return _start_instant_group_sex_interaction(
                pre_sex_handler, ask_player_to_start=ask_player_to_start)
        return _start_group_sex_interaction(
            pre_sex_handler, ask_player_to_start=ask_player_to_start)
def _try_trigger_sim_miscarriage(sim_identifier):
    if not get_sex_setting(SexSetting.MISCARRIAGE_SWITCH, variable_type=bool):
        return False
    if not TurboSimUtil.Pregnancy.is_pregnant(sim_identifier):
        return False
    if has_sim_buffs(sim_identifier, MISCARRIAGE_DISALLOWED_PREGNANCY_BUFFS):
        return False
    if not has_sim_buffs(sim_identifier, MISCARRIAGE_ALLOWED_PREGNANCY_BUFFS):
        return False
    pregnancy_days = get_sex_setting(SexSetting.PREGNANCY_DURATION,
                                     variable_type=int)
    miscarriage_potential_pregnancy_hours = 0.72 * pregnancy_days * 24
    miscarriage_chance = sim_ev(
        sim_identifier
    ).miscarriage_potential / 3.8 / miscarriage_potential_pregnancy_hours
    if random.uniform(0, 1) >= miscarriage_chance:
        return False
    if remove_sim_pregnancy(sim_identifier):
        add_sim_buff(sim_identifier,
                     SimBuff.WW_PREGNANCY_MISCARRIAGE,
                     reason=3245985980)
        TurboSimUtil.Interaction.push_affordance(
            sim_identifier,
            SimInteraction.WW_PREGNANCY_MISCARRIAGE,
            interaction_context=TurboInteractionUtil.InteractionContext.
            SOURCE_SCRIPT,
            insert_strategy=TurboInteractionUtil.QueueInsertStrategy.NEXT,
            must_run_next=True,
            priority=TurboInteractionUtil.Priority.Critical,
            run_priority=TurboInteractionUtil.Priority.Critical)
        miscarriage_puddle_object = TurboObjectUtil.GameObject.create_object(
            12327982570318338407)
        if miscarriage_puddle_object:
            TurboObjectUtil.Puddle.place_puddle(miscarriage_puddle_object,
                                                sim_identifier)
        TurboWorldUtil.Time.set_current_time_speed(
            TurboWorldUtil.Time.ClockSpeedMode.NORMAL)
        display_notification(text=1234477375,
                             text_tokens=(sim_identifier, ),
                             title=971885236,
                             visual_type=TurboUIUtil.Notification.
                             UiDialogNotificationVisualType.SPECIAL_MOMENT,
                             secondary_icon=sim_identifier)
        TurboUIUtil.Camera.move_to_sim(sim_identifier)
        _sim_miscarriage_reaction(sim_identifier)
Ejemplo n.º 29
0
 def on_interaction_test(cls, interaction_context, interaction_target):
     if interaction_target is None or not TurboTypesUtil.Sims.is_sim(
             interaction_target):
         return False
     if get_sex_setting(SexSetting.INSTANT_UNDRESSING_STATE,
                        variable_type=bool):
         return True
     interaction_sim = cls.get_interaction_sim(interaction_context)
     if not get_sex_setting(SexSetting.MANUAL_NPC_SEX_STATE,
                            variable_type=bool):
         if sim_ev(interaction_sim).active_sex_handler is None:
             return False
         if sim_ev(interaction_sim).active_sex_handler is not sim_ev(
                 interaction_target).active_sex_handler:
             return False
     elif sim_ev(interaction_target).active_sex_handler is None:
         return False
     return True
def _trigger_autonomy_joining_to_sex_on_game_update():
    if get_sex_setting(SexSetting.AUTONOMY_LEVEL,
                       variable_type=int) == SexAutonomyLevelSetting.DISABLED:
        return
    if not get_sex_setting(SexSetting.JOIN_SEX_AUTONOMY_STATE,
                           variable_type=bool):
        return
    registered_sex_handlers = get_active_sex_handlers()
    if not registered_sex_handlers:
        return
    for sim in get_available_for_sex_sims(
            forbidden_traits=(SimTrait.WW_CUCKOLD, )):
        for sex_handler in registered_sex_handlers:
            while not (sex_handler.is_playing is False
                       or sex_handler.is_ready_to_unregister is True):
                if sex_handler.has_joining_sims is True:
                    pass
                if sex_handler.has_reached_autonomy_actors_limit():
                    pass
                if TurboManagerUtil.Sim.get_sim_id(
                        sim) in sex_handler.ignore_autonomy_join_sims:
                    pass
                creator_sim = TurboManagerUtil.Sim.get_sim_info(
                    sex_handler.get_creator_sim_id())
                if not get_sex_setting(
                        SexSetting.PLAYER_JOIN_SEX_AUTONOMY_STATE,
                        variable_type=bool) and TurboSimUtil.Sim.is_player(
                            creator_sim):
                    pass
                if TurboMathUtil.Position.get_distance(
                        TurboSimUtil.Location.get_position(sim),
                        sex_handler.get_route_position()) > 6.0:
                    pass
                has_passed_relationship_tests = True
                for target in sex_handler.get_actors_sim_info_gen():
                    while get_sex_pair_score(
                            target,
                            sim) < get_relationship_sex_acceptance_threshold():
                        has_passed_relationship_tests = False
                        break
                if has_passed_relationship_tests is False:
                    pass
                while _trigger_autonomy_join_sex_interaction(sex_handler, sim):
                    return