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
Esempio n. 3
0
    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