def reset_mod_on_update(): if HAS_UPDATED_THE_MOD is False: return display_notification(text=4037785225, text_tokens=(get_mod_version_str(), ), title='WickedWhims', information_level=TurboUIUtil.Notification. UiDialogNotificationLevel.PLAYER, is_safe=True) reset_active_sex_handlers() from wickedwhims.sex.sex_operators.general_sex_handlers_operator import clear_sim_sex_extra_data for sim_info in TurboManagerUtil.Sim.get_all_sim_info_gen(humans=True, pets=False): pre_sex_handler = sim_ev(sim_info).active_pre_sex_handler active_sex_handler = sim_ev(sim_info).active_sex_handler clear_sim_sex_extra_data(sim_info) try: while active_sex_handler is not None: active_sex_handler.stop(hard_stop=True, is_end=True, stop_reason='On stop sex command.') except: pass while pre_sex_handler is not None or active_sex_handler is not None: if not TurboSimUtil.CAS.has_outfit( sim_info, (TurboCASUtil.OutfitCategory.EVERYDAY, 0)): TurboSimUtil.CAS.generate_outfit( sim_info, (TurboCASUtil.OutfitCategory.EVERYDAY, 0)) TurboSimUtil.CAS.set_current_outfit( sim_info, (TurboCASUtil.OutfitCategory.EVERYDAY, 0)) TurboSimUtil.CAS.update_previous_outfit(sim_info) TurboSimUtil.Sim.reset_sim(sim_info)
def join_sex_interaction_from_pre_sex_handler(pre_sex_handler, join_sims_list, ask_player_to_join=False, ignore_relationship_check=False, flip_relationship_check=False): creator_sim_info = TurboManagerUtil.Sim.get_sim_info( pre_sex_handler.get_creator_sim_id()) can_sims_join = True for join_sim in join_sims_list: is_sex_allowed = is_sim_allowed_for_animation( tuple(pre_sex_handler.get_actors_sim_info_gen()), pre_sex_handler.get_interaction_type(), is_joining=True) if not is_sex_allowed: display_not_allowed_message(is_sex_allowed) can_sims_join = False break while ignore_relationship_check is False: relationship_score = get_test_relationship_score( (creator_sim_info, join_sim)) if relationship_score < get_relationship_sex_acceptance_threshold( ): if flip_relationship_check is True: apply_asking_for_woohoo_relations(join_sim, creator_sim_info, False) else: apply_asking_for_woohoo_relations(creator_sim_info, join_sim, False) can_sims_join = False break if can_sims_join is False: for join_sim in join_sims_list: clear_sim_sex_extra_data(join_sim, only_pre_active_data=True) return if ask_player_to_join is True: def ask_for_sex_callback(dialog): if TurboUIUtil.DramaDialog.get_response_result(dialog): _join_sex_interaction_from_pre_handler(pre_sex_handler, join_sims_list) else: active_sex_handler = sim_ev( pre_sex_handler.get_creator_sim_id()).active_sex_handler for sim in join_sims_list: clear_sim_sex_extra_data(sim) sim_id = TurboManagerUtil.Sim.get_sim_id(sim) while sim_id not in active_sex_handler.ignore_autonomy_join_sims: active_sex_handler.ignore_autonomy_join_sims.append( sim_id) return True display_drama_dialog(creator_sim_info, join_sims_list[0], text=3899042444, text_tokens=(join_sims_list[0], creator_sim_info), ok_text=3398494028, cancel_text=3364226930, callback=ask_for_sex_callback) return _join_sex_interaction_from_pre_handler(pre_sex_handler, join_sims_list)
def on_interaction_cancel(cls, interaction_instance, interaction_finishing_type): if interaction_finishing_type == TurboInteractionUtil.FinishingType.USER_CANCEL or interaction_instance.has_attempted_asking_for_sex_autonomy is False: pre_sex_handler = sim_ev(cls.get_interaction_sim(interaction_instance)).active_pre_sex_handler if pre_sex_handler is not None: while True: for sim_info in pre_sex_handler.get_actors_sim_info_gen(): clear_sim_sex_extra_data(sim_info)
def on_interaction_start(cls, interaction_instance): sim = cls.get_interaction_sim(interaction_instance) target = cls.get_interaction_target(interaction_instance) pre_sex_handler = sim_ev(sim).active_pre_sex_handler if pre_sex_handler is None or target is None: clear_sim_sex_extra_data(sim) if target is not None: clear_sim_sex_extra_data(target) return False apply_asking_for_woohoo_relations(sim, target, True) for actor_sim in pre_sex_handler.get_actors_sim_instance_gen(): sim_ev(actor_sim).is_in_process_to_sex = True sim_ev(actor_sim).active_pre_sex_handler = pre_sex_handler prepare_npc_sim_to_sex(actor_sim) TurboSimUtil.Routing.refresh_portals(actor_sim) TurboSimUtil.Interaction.unlock_queue(actor_sim) result = TurboSimUtil.Interaction.push_affordance( actor_sim, SimInteraction.WW_ROUTE_TO_SEX_LOCATION, insert_strategy=TurboInteractionUtil.QueueInsertStrategy.FIRST, priority=TurboInteractionUtil.Priority.Critical, run_priority=TurboInteractionUtil.Priority.Critical) while result: sim_ev( actor_sim ).in_sex_process_interaction = TurboInteractionUtil.get_interaction_from_enqueue_result( result) return True
def on_interaction_start(cls, interaction_instance): sim = cls.get_interaction_sim(interaction_instance) pre_sex_handler = sim_ev(sim).active_pre_sex_handler sim_ev(sim).is_ready_to_sex = True if pre_sex_handler is None: clear_sim_sex_extra_data(sim, only_pre_active_data=True) unprepare_npc_sim_from_sex(sim) return False if not _attempt_sex_init(pre_sex_handler): result = TurboSimUtil.Interaction.push_affordance( sim, SimInteraction.WW_WAIT_FOR_SEX_PARTNER, insert_strategy=TurboInteractionUtil.QueueInsertStrategy.FIRST, run_priority=TurboInteractionUtil.Priority.Critical, priority=TurboInteractionUtil.Priority.Critical, skip_if_running=True) if result: sim_ev( sim ).in_sex_process_interaction = TurboInteractionUtil.get_interaction_from_enqueue_result( result) cls.cancel_interaction( interaction_instance, finishing_type=TurboInteractionUtil.FinishingType.NATURAL) else: interaction_instance.has_proceeded = True
def _start_solo_sex_interaction(pre_sex_handler): creator_sim = TurboManagerUtil.Sim.get_sim_instance( pre_sex_handler.get_creator_sim_id()) if creator_sim is None: clear_sim_sex_extra_data( TurboManagerUtil.Sim.get_sim_info( pre_sex_handler.get_creator_sim_id())) return False sim_ev(creator_sim).is_in_process_to_sex = True for interaction_id in TurboSimUtil.Interaction.get_queued_interactions_ids( creator_sim): TurboSimUtil.Interaction.cancel_queued_interaction( creator_sim, interaction_id) TurboSimUtil.Interaction.unlock_queue(creator_sim) TurboSimUtil.Routing.refresh_portals(creator_sim) result = TurboSimUtil.Interaction.push_affordance( creator_sim, SimInteraction.WW_ROUTE_TO_SEX_LOCATION, insert_strategy=TurboInteractionUtil.QueueInsertStrategy.FIRST, run_priority=TurboInteractionUtil.Priority.Critical, priority=TurboInteractionUtil.Priority.Critical) if result: sim_ev( creator_sim ).in_sex_process_interaction = TurboInteractionUtil.get_interaction_from_enqueue_result( result) return bool(result)
def ask_for_sex_callback(dialog): if TurboUIUtil.DramaDialog.get_response_result(dialog): _start_group_sex_interaction(pre_sex_handler, ask_player_to_start=False) else: for pre_sim_info in pre_sex_handler.get_actors_sim_info_gen(): clear_sim_sex_extra_data(pre_sim_info) return True
def on_interaction_start(cls, interaction_instance): sim = cls.get_interaction_sim(interaction_instance) target = cls.get_interaction_target(interaction_instance) clear_sim_sex_extra_data(sim) if target is not None: clear_sim_sex_extra_data(target) apply_asking_for_woohoo_relations(sim, target, False) return True
def stop(self, soft_stop=False, hard_stop=False, no_teleport=False, is_joining_stop=False, is_end=False, stop_reason=None): if self._is_restarting is True and hard_stop is False and is_end is False: return if stop_reason is not None and is_main_debug_flag_enabled(): display_notification(text=str(stop_reason), title='Sex Stop Reason') queue_unregister_active_sex_handler(self) sims_list = self.get_sims_list() active_angle = random.randint(0, 359) angle_section = 360 / max(1, self.get_actors_amount()) if is_joining_stop is False: apply_after_sex_functions(self, sims_list, is_ending=is_end) apply_after_sex_relationship(self, sims_list) for (_, sim_info) in sims_list: if sim_info is None: continue clear_sim_sex_extra_data(sim_info, only_active_data=is_joining_stop) unprepare_npc_sim_from_sex(sim_info) TurboSimUtil.Interaction.unlock_queue(sim_info) update_sim_body_flags(sim_info) update_sim_underwear_data(sim_info) if soft_stop is False and no_teleport is False and self.get_object_identifier( )[0] == 'FLOOR': active_angle = (active_angle + angle_section) % 360 new_location = TurboMathUtil.Location.apply_offset( self.get_location(), x_offset=cos(active_angle) * 0.4, z_offset=sin(active_angle) * 0.4, orientation_offset=random.randint(0, 360)) new_location = TurboWorldUtil.Zone.find_good_location( new_location) sim = TurboManagerUtil.Sim.get_sim_instance(sim_info) if sim is not None: TurboWorldUtil.Location.move_object_to(sim, new_location) TurboSimUtil.Sim.reset_sim(sim_info, hard_reset_on_exception=True) TurboSimUtil.Interaction.push_affordance( sim_info, SimInteraction.SIM_STAND, interaction_context=TurboInteractionUtil.InteractionContext. SOURCE_POSTURE_GRAPH, insert_strategy=TurboInteractionUtil.QueueInsertStrategy.FIRST, must_run_next=True, priority=TurboInteractionUtil.Priority.Critical, run_priority=TurboInteractionUtil.Priority.Critical, skip_if_running=True) location_game_object = TurboObjectUtil.GameObject.get_object_with_id( self.get_game_object_id()) if location_game_object is not None: TurboObjectUtil.GameObject.reset(location_game_object)
def _wickedwhims_neutralize_sims_active_sex_data_on_zone_move(): if not has_game_loaded(): return for sex_handler in ACTIVE_SEX_HANDLERS_LIST: for sim_info in sex_handler.get_actors_sim_info_gen(): if sim_info is None: pass clear_sim_sex_extra_data(sim_info) dress_up_outfit(sim_info) reset_active_sex_handlers()
def ask_for_sex_callback(dialog): if TurboUIUtil.DramaDialog.get_response_result(dialog): _join_sex_interaction_from_pre_handler(pre_sex_handler, join_sims_list) else: active_sex_handler = sim_ev( pre_sex_handler.get_creator_sim_id()).active_sex_handler for sim in join_sims_list: clear_sim_sex_extra_data(sim) sim_id = TurboManagerUtil.Sim.get_sim_id(sim) while sim_id not in active_sex_handler.ignore_autonomy_join_sims: active_sex_handler.ignore_autonomy_join_sims.append( sim_id) return True
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 start_sex_interaction(self): active_sex_handler = self._get_active_sex_handler() for sim_info in self.get_actors_sim_info_gen(): if active_sex_handler is None: clear_sim_sex_extra_data(sim_info) sim_ev( sim_info ).active_sex_handler_identifier = active_sex_handler.get_identifier( ) sim_ev(sim_info).active_sex_handler = active_sex_handler if self.is_autonomy_sex(): sim_ev( sim_info ).last_sex_autonomy = TurboWorldUtil.Time.get_absolute_ticks() clear_sim_sex_extra_data(sim_info, only_pre_active_data=True) TurboSimUtil.Sim.reset_sim(sim_info) sim_ev(sim_info).has_setup_sex = True active_sex_handler.play_if_everyone_ready()
def on_interaction_cancel(cls, interaction_instance, finishing_type): if interaction_instance.has_proceeded is True: return if finishing_type == TurboInteractionUtil.FinishingType.USER_CANCEL: sim = cls.get_interaction_sim(interaction_instance) pre_sex_handler = sim_ev(sim).active_pre_sex_handler clear_sim_sex_extra_data(sim, only_pre_active_data=True) unprepare_npc_sim_from_sex(sim) if pre_sex_handler is None: return for actor_sim_info in pre_sex_handler.get_actors_sim_info_gen(): if sim_ev( actor_sim_info).in_sex_process_interaction is not None: cls.kill_interaction( sim_ev(actor_sim_info).in_sex_process_interaction) clear_sim_sex_extra_data(actor_sim_info, only_pre_active_data=True) while sim_ev(actor_sim_info).active_sex_handler is None: unprepare_npc_sim_from_sex(actor_sim_info)
def _wickedwhims_command_stop_all_sex(output=None): for sim_info in TurboManagerUtil.Sim.get_all_sim_info_gen(humans=True, pets=False): pre_sex_handler = sim_ev(sim_info).active_pre_sex_handler active_sex_handler = sim_ev(sim_info).active_sex_handler clear_sim_sex_extra_data(sim_info) if pre_sex_handler is not None: for sim in pre_sex_handler.get_actors_sim_instance_gen(): if sim is None: pass TurboSimUtil.Interaction.unlock_queue(sim) TurboSimUtil.Sim.reset_sim(sim, hard_reset_on_exception=True) try: while active_sex_handler is not None: active_sex_handler.stop(hard_stop=True, is_end=True, stop_reason='On stop sex command.') except: pass output('Sex was stopped. Sad.')
def on_interaction_start(cls, interaction_instance): sim = cls.get_interaction_sim(interaction_instance) target = cls.get_interaction_target(interaction_instance) pre_sex_handler = sim_ev(sim).active_pre_sex_handler if pre_sex_handler is None or target is None: clear_sim_sex_extra_data(sim) if target is not None: clear_sim_sex_extra_data(target) return False def _ask_for_sex_callback(dialog): if not TurboUIUtil.DramaDialog.get_response_result(dialog): pre_sex_handler.set_as_failure() else: pre_sex_handler.set_as_success() TurboSimUtil.Interaction.push_affordance(sim, SimInteraction.WW_TRIGGER_SOCIAL_ASK_FOR_SEX_DEFAULT, target=target, skip_if_running=True) return True display_drama_dialog(target, sim, text=1638454846, text_tokens=(sim, target), ok_text=3398494028, cancel_text=3364226930, callback=_ask_for_sex_callback) return True
def _attempt_sex_init(pre_sex_handler): if pre_sex_handler.get_sims_amount() == 1: pre_sex_handler.start_sex_interaction() return True if pre_sex_handler.are_all_sims_ready(): if pre_sex_handler.is_joining_sex(): creator_sim = TurboManagerUtil.Sim.get_sim_info( pre_sex_handler.get_creator_sim_id()) active_sex_handler = sim_ev(creator_sim).active_sex_handler if active_sex_handler is not None: active_sex_handler.stop(hard_stop=True, no_teleport=True, is_joining_stop=True, stop_reason='Joining To Sex!') pre_sex_handler.start_sex_interaction() return True for sim_info in pre_sex_handler.get_actors_sim_info_gen(): clear_sim_sex_extra_data(sim_info, only_pre_active_data=True) while sim_ev(sim_info).is_playing_sex is True: unprepare_npc_sim_from_sex(sim_info) pre_sex_handler.start_sex_interaction() return True return False
def update_sim_to_route_for_sex(sim): if sim_ev(sim).is_in_process_to_sex is True: if sim_ev(sim).active_pre_sex_handler is not None: TurboSimUtil.Interaction.unlock_queue(sim) TurboSimUtil.Routing.refresh_portals(sim) result = TurboSimUtil.Interaction.push_affordance( sim, SimInteraction.WW_ROUTE_TO_SEX_LOCATION, insert_strategy=TurboInteractionUtil.QueueInsertStrategy.FIRST, priority=TurboInteractionUtil.Priority.Critical, run_priority=TurboInteractionUtil.Priority.Critical, skip_if_running=True) if result: sim_ev( sim ).in_sex_process_interaction = TurboInteractionUtil.get_interaction_from_enqueue_result( result) else: clear_sim_sex_extra_data(sim, only_pre_active_data=True) unprepare_npc_sim_from_sex(sim) else: clear_sim_sex_extra_data(sim, only_pre_active_data=True) unprepare_npc_sim_from_sex(sim)
def apply_active_sex_handler_to_sim(sim_identifier): sim_info = TurboManagerUtil.Sim.get_sim_info(sim_identifier) sex_handler_identifier = sim_ev(sim_info).active_sex_handler_identifier if not sex_handler_identifier or sex_handler_identifier == '-1': clear_sim_sex_extra_data(sim_info) return active_sex_handler = None for sex_handler in ACTIVE_SEX_HANDLERS_LIST: while sex_handler.get_identifier() == sex_handler_identifier: active_sex_handler = sex_handler break if active_sex_handler is None: clear_sim_sex_extra_data(sim_info) return if TurboWorldUtil.Lot.get_active_lot_id() != active_sex_handler.get_lot_id( ): clear_sim_sex_extra_data(sim_info) return sim_ev(sim_info).active_sex_handler = active_sex_handler