def _has_occult_traits(sim_info: SimInfo, trait_ids: Iterator[int]) -> bool: if sim_info is None: return False equipped_traits = CommonTraitUtils.get_equipped_traits(sim_info) for equipped_trait in equipped_traits: trait_id = CommonTraitUtils.get_trait_id(equipped_trait) if trait_id in trait_ids: return True return False
def on_started(self, interaction_sim: Sim, interaction_target: Sim) -> bool: target_sim_info = CommonSimUtils.get_sim_info(interaction_target) target_sim_name = CommonSimNameUtils.get_full_name(target_sim_info) trait_strings: List[str] = list() for trait in CommonTraitUtils.get_traits(target_sim_info): trait_name = CommonTraitUtils.get_trait_name(trait) trait_id = CommonTraitUtils.get_trait_id(trait) trait_strings.append('{} ({})'.format(trait_name, trait_id)) trait_strings = sorted(trait_strings, key=lambda x: x) sim_traits = ', '.join(trait_strings) text = '' text += 'Traits:\n{}\n\n'.format(sim_traits) CommonBasicNotification( CommonLocalizationUtils.create_localized_string('{} Traits ({})'.format(target_sim_name, CommonSimUtils.get_sim_id(target_sim_info))), CommonLocalizationUtils.create_localized_string(text) ).show( icon=IconInfoData(obj_instance=interaction_target) ) return True
def is_skeleton(sim_info: SimInfo) -> bool: """is_skeleton(sim_info) Determine if a Sim is a Skeleton. :param sim_info: An instance of a Sim. :type sim_info: SimInfo :return: True, if the Sim is the a Skeleton. False, if not. :rtype: bool """ equipped_sim_traits = CommonTraitUtils.get_equipped_traits(sim_info) skeleton_trait_ids = { CommonTraitId.HIDDEN_SKELETON, CommonTraitId.HIDDEN_SKELETON_SERVICE_SKELETON, CommonTraitId.HIDDEN_SKELETON_TEMPLE_SKELETON } for trait in equipped_sim_traits: trait_id = CommonTraitUtils.get_trait_id(trait) if trait_id in skeleton_trait_ids: return True return False
def run(self, sim_info: SimInfo, on_completed: Callable[[bool], None] = CommonFunctionUtils.noop, current_page: int = 1) -> bool: def _reopen() -> None: self.run(sim_info, on_completed=on_completed, current_page=option_dialog.current_page) def _on_close() -> None: on_completed(False) @CommonExceptionHandler.catch_exceptions(self.mod_identity, fallback_return=False) def _on_submit(chosen_traits: Tuple[Trait]): trait_tracker: TraitTracker = sim_info.trait_tracker for personality_trait in trait_tracker.personality_traits: CommonTraitUtils.remove_trait(sim_info, personality_trait) for chosen_trait in chosen_traits: CommonTraitUtils.add_trait(sim_info, chosen_trait) # noinspection PyUnresolvedReferences CommonBasicNotification( S4CMSimControlMenuStringId.SET_PERSONALITY_TRAITS_TITLE, S4CMSimControlMenuStringId.SET_PERSONALITY_TRAITS_DESCRIPTION, description_tokens=( CommonSimUtils.get_sim_instance(sim_info), )).show(icon=IconInfoData( obj_instance=CommonSimUtils.get_sim_instance(sim_info))) _reopen() option_dialog = CommonChooseObjectsOptionDialog( S4CMSimControlMenuStringId.SET_PERSONALITY_TRAITS_MAX, 0, title_tokens=(str(sim_info.trait_tracker.equip_slot_number), ), on_close=_on_close, mod_identity=self.mod_identity, per_page=20000) current_personality_trait_ids = [ CommonTraitUtils.get_trait_id(pers_trait) for pers_trait in sim_info.trait_tracker.personality_traits ] self.log.format_with_message( 'current_personality_traits', current_personality_trait_ids=current_personality_trait_ids) all_traits = [ personality_trait for (trait_type, personality_trait ) in CommonResourceUtils.load_all_instances(Types.TRAIT) if personality_trait.is_personality_trait and personality_trait.is_valid_trait(sim_info) ] for trait in sorted(all_traits, key=lambda _trait: CommonTraitUtils.get_trait_name( _trait).lower()): trait: Trait = trait trait_id = CommonTraitUtils.get_trait_id(trait) if trait_id is None: self.log.format_with_message('Missing trait id for Trait.', trait=trait) continue try: # noinspection PyUnresolvedReferences display_name = trait.display_name(sim_info) if display_name.hash == 0: trait_name = CommonTraitUtils.get_trait_name( trait) or 'Unknown Trait Name' trait_name = trait_name[0].upper() + trait_name[1:] # noinspection PyUnresolvedReferences display_name = CommonLocalizationUtils.create_localized_string( S4CMSimControlMenuStringId.STRING_SPACE_PAREN_STRING, tokens=(trait_name, trait.trait_type.name)) else: # noinspection PyUnresolvedReferences display_name = CommonLocalizationUtils.create_localized_string( S4CMSimControlMenuStringId.STRING_SPACE_PAREN_STRING, tokens=( CommonLocalizationUtils.create_localized_string( display_name, tokens=(sim_info, )), trait.trait_type.name)) display_name = CommonLocalizationUtils.colorize( display_name, CommonLocalizedStringColor.GREEN ) if CommonTraitUtils.has_trait(sim_info, trait_id) else display_name # noinspection PyUnresolvedReferences description = CommonLocalizationUtils.create_localized_string( trait.trait_description._string_id, tokens=(sim_info, )) # noinspection PyUnresolvedReferences icon = trait.icon or CommonIconUtils.load_question_mark_icon() # MISSING ICON Identifier _MISSING_IMAGE_ICON_ID = 3526464109639239417 if icon.instance == 0 or icon.instance == _MISSING_IMAGE_ICON_ID: icon = CommonIconUtils.load_question_mark_icon() option_dialog.add_option( CommonDialogSelectOption( trait_id, trait, CommonDialogOptionContext( display_name, description, icon=icon, is_selected=trait_id in current_personality_trait_ids))) except Exception as ex: self.log.format_error_with_message( 'Failed to display trait.', trait=trait, trait_name=CommonTraitUtils.get_trait_name(trait), trait_id=trait_id, exception=ex) if not option_dialog.has_options(): on_completed(False) return False option_dialog.show( sim_info=sim_info, page=current_page, min_selectable=0, max_selectable=sim_info.trait_tracker.equip_slot_number, on_submit=_on_submit, allow_no_selection=True) return True