Page 1 of 1

Lexicon Entries Overriding Each Other

Posted: Tue Nov 21, 2023 4:05 pm
by BeepBoop
Hi! I'm using the lexicon code from this thread: viewtopic.php?p=508523#p508523 and I'm having an issue regarding the names of lexicon terms.

Basically, I've made a couple of lexicon entries with similar names, but one is prioritized over the other.

Here is the (example) code:

Code: Select all

# Tooltip variables

init python:

    lexicon = { # _('primary phrase'), _('optional synonyms') : """ description """,
      ( _('Visual Novel'), _('VN') )  : _("""
            A visual novel (bijuaru noberu) is an interactive game genre, 
            which originated in Japan in the early 1990s, featuring mostly 
            static graphics, most often using anime-style art or occasionally 
            live-action stills.
            As the name might suggest, they resemble mixed-media novels."""),
        (_('Visual Novel Writer') ) : _("""
            Someone who writes visual novels."""),
        ( _('Ren\'Py'), _('Renpy') ) : _("""
            The Ren'Py Visual Novel Engine is a free software engine which 
            facilitates the creation of visual novels, a form of 
            computer-mediated storytelling. Ren'Py is a portmanteau of ren'ai, 
            the Japanese word for 'romantic love' and Python, 
            the programming language that Ren'Py runs on. """),
    }

    def hyperlink_lexicon( str_to_test ):

        for keys in lexicon:
        
            if isinstance(keys, basestring):
                keys = [keys]
        
            for phrase in keys:

                # preceded by a space
                str_to_test = str_to_test.replace(
                    " {0}".format(phrase),
                    " {{a=lexicon:{phrase}}}{phrase}{{/a}}".format(
                        phrase = phrase ) )
                
                # followed by a space
                str_to_test = str_to_test.replace(
                    "{0} ".format(phrase),
                    "{{a=lexicon:{phrase}}}{phrase}{{/a}} ".format(
                        phrase = phrase ) )
        
        return str_to_test

    config.say_menu_text_filter = hyperlink_lexicon


    def hyperlink_styler(*args):

        return style.hyperlink_text

    def hyperlink_hovered(*args):
        
        if not args[0]:
            # Ren'Py 7+ recent nightly only, see below
            renpy.hide_screen("lexicon_popup")
            renpy.restart_interaction()
        
        elif args[0][:8] == "lexicon:":

            renpy.show_screen( "lexicon_popup", 
                args[0][8:], 
                renpy.get_mouse_pos() )
            
            renpy.restart_interaction()
        
        return


    def hyperlink_clicked(*args):

        if args[0] and args[0][:8] != 'lexicon:':

            # adapted from common/00defaults.rpy
            if args[0].startswith("http:") or args[0].startswith("https:"):
                try:
                    import webbrowser
                    webbrowser.open(args[0])
                except:
                    renpy.notify("Failed to open browser")

            elif args[0].startswith("jump:"):
                renpy.jump( args[0][5:] )

            else:
                renpy.call_in_new_context(args[0][args[0].index(':')+1:])

    
    style.default.hyperlink_functions = ( hyperlink_styler, hyperlink_clicked, hyperlink_hovered )


screen lexicon_popup(phrase=None, pos=(100,100)):

    if phrase:

        python:
            # get description
            d = [ lexicon[k] for k in lexicon if phrase in k ]
            description = d[0] if len(d) else "No description found."
            description = " ".join( [ k for k in description.split()
                if k not in [" ", "\t"] ] )
            
            # move the ypos up by a bit
            pos = ( pos[0], pos[1] - 25 )

            # reformat phrase
            p = [ k for k in lexicon if phrase in k ]
            primary_phrase = p[0][0] if len(p) else phrase
            if primary_phrase != phrase:
                phrase = "{0} ({1})".format(phrase, primary_phrase)

        frame:
            anchor (0.5, 1.0)
            pos pos
            xsize 340
            background Solid("#A9B")
            vbox:
                text "[phrase]" size 18
                text "[description]" size 14

Here is the result of that code:

Image

Image


I've tried restructuring the lexicon and reformatting entries, but nothing has worked. Best case scenario, nothing happens, worst case, my game crashes.

Any ideas? Thanks in advanced.

Re: Lexicon Entries Overriding Each Other

Posted: Tue Nov 21, 2023 5:03 pm
by Ocelot
Well, it correctly highlights Visual Novel, which is in lexicon.
If you are using RenPy 8, then you can try to swap entries for Visual Novel and Visual Novel Writer. If you are using RenPy 7, you are out of luck here and will need to rewrite parts of code to usong a list or something else ordered.

Re: Lexicon Entries Overriding Each Other

Posted: Tue Nov 21, 2023 5:27 pm
by BeepBoop
I'm using Renpy 8.

But how do I get it to highlight both Visual Novel AND Visual Novel Writer?

Re: Lexicon Entries Overriding Each Other

Posted: Wed Nov 22, 2023 12:10 pm
by m_from_space
BeepBoop wrote: Tue Nov 21, 2023 5:27 pm I'm using Renpy 8.

But how do I get it to highlight both Visual Novel AND Visual Novel Writer?
No offense, but how low IQ do you imagine your players to be if they don't know what a writer is? :lol:

I don't think you have a problem here, just remove that entry. You could of course just explain what a "writer" is. I am still a bit laughing.

Re: Lexicon Entries Overriding Each Other

Posted: Sun Dec 03, 2023 10:56 pm
by BeepBoop
m_from_space wrote: Wed Nov 22, 2023 12:10 pm
No offense, but how low IQ do you imagine your players to be if they don't know what a writer is? :lol:

I don't think you have a problem here, just remove that entry. You could of course just explain what a "writer" is. I am still a bit laughing.
As mentioned in my post I was using them as examples. They're not going to actually be in there. :lol: