I would like to add definitions/"glossary terms" to my dialogue with tooltips showing the definition text on a hover. Is this possible with Ren'Py?

Thank you!

Code: Select all
define e = Character("Eileen")
init python:
lexicon = {
('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.""",
('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")
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
# Hacky workaround as hyperlink_hovered does not seem to nicely hide this
# --- Fixed in Ren'Py 7.0 nightlies of May 23rd onwards apparently
timer 0.5 action Hide("lexicon_popup")
label start:
e "Start"
e "Oh look, this VN is made with Ren'Py"
e "Test phrases that should not make link... AVNX aRenpyx"
e "Test phrases that should not make link... miniVN{#no-lex} {#no-lex}Renpy-esque"
e "Mix and match VN with {a=call:label_2}call{/a} {a=jump:label_2}jump{/a} {a=https:www.renpy.org}browser{/a}"
e "End"
label label_2:
e "Hiding in different label"
returnCode: Select all
e "Test phrases that should not make link... miniVN{#no-lex} {#no-lex}Renpy-esque"Code: Select all
lexicon = {
('Schmutzschleuse'') : """
Als Schmutzschleuse bezeichnen wir in einem Gebäude den Übergang zwischen dem Innen- und dem Außenbereich, oder zwischen Bereichen, die unterschiedlichen Anforderungen in Bezug auf Staub und Schmutz, an Reinigung und Hygiene gerecht werden müssen."""
}
Code: Select all
lexicon = {
('Schmutzschleuse', 'Schmutzschleuse') : """
Als Schmutzschleuse bezeichnen wir in einem Gebäude den Übergang zwischen dem Innen- und dem Außenbereich, oder zwischen Bereichen, die unterschiedlichen Anforderungen in Bezug auf Staub und Schmutz, an Reinigung und Hygiene gerecht werden müssen."""
}
Code: Select all
def hyperlink_lexicon( str_to_test ):
for keys in lexicon:
# add this bit
if isinstance(keys, basestring):
keys = [keys]
for phrase in keys:Because we are using " style.default.hyperlink_functions = (...) " I *had* thought I could just define style.lexicon and tap the functions to that. After some failures I opted to just use default and extend the hyperlink_clicked function...b) It breaks the standard hyperlink functionality.
I get a styled hyperlink for a text with {a=call:monitoring} for example, but the link doesn't work - it's not reacting to hover, and not clickable.
same for a=http oder a=file
Do you have any suggestions how to use tooltips like this and retain hyperlink functionality? Thanks!
Code: Select all
# adapted from common/00defaults.rpy
if args[0].startswith("http:") or args[0].startswith("https:") or args[0].startswith("file:"):
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:])
Users browsing this forum: Google [Bot], Ocelot