diff --git a/game/scripts/utility/text_tags.rpy b/game/scripts/utility/text_tags.rpy index d285cb3b..4326027d 100644 --- a/game/scripts/utility/text_tags.rpy +++ b/game/scripts/utility/text_tags.rpy @@ -2,6 +2,26 @@ # https://www.renpy.org/doc/html/custom_text_tags.html init python: + def convert_tags_to_kwargs(contents): + kwargs = {} + for kind, text in contents: + if kind == renpy.TEXT_TAG: + if text.startswith("color="): + kwargs["color"] = text.split("=")[1] + + if text.startswith("size="): + kwargs["size"] = int(text.split("=")[1]) + + if text.startswith("outlinecolor="): + kwargs["outlines"] = [(2, text.split("=")[1], 1, 1)] + + if text == "b": + kwargs["bold"] = True + + if text == "i": + kwargs["italics"] = True + return kwargs + @renpy.pure def text_tag_unicode(tag, argument, contents): """Render contents using a font that supports all/most Unicode characters. Usage {unicode}☺{/unicode}""" @@ -13,75 +33,116 @@ init python: """Insert a unicode heart symbol. Usage {heart}""" return [(renpy.TEXT_DISPLAYABLE, At(Text("{unicode}❤{/unicode}", style="what", xsize=24, ysize=24), heart_text))] + @renpy.pure + def text_tag_hearts(tag, argument): + """Insert multiple unicode heart symbols. Usage {hearts}""" + return [(renpy.TEXT_DISPLAYABLE, Fixed(love_heart((15, 0), 12, 0.1), love_heart((20, -10), 6, 0.5), love_heart((10, 10), 6, 1), fit_first=True, xsize=32))] + @renpy.pure def text_tag_number(tag, argument): """Convert a number to words if lower than 100 or a multiple of 100. Usage {number=expression}""" - num = int(renpy.store.eval(argument)) + num = int(renpy.store.eval(argument)) # Can be a function or an expression. words = num_to_word(num) if num < 100 or num % 100 == 0 else str(num) return [(renpy.TEXT_TEXT, words)] @renpy.pure def text_tag_wave(tag, argument, contents): - text = contents[0][1] - letters = [] - - for i, letter in enumerate(text): - start_pause = i/100.0 - end_pause = len(text)/100.0 - d = At(Text(letter, style="what", color=argument), wave_text(start_pause, end_pause)) - letters.append((renpy.TEXT_DISPLAYABLE, d)) - return letters + rv = [] + kwargs = convert_tags_to_kwargs(contents) + for kind, text in contents: + if kind == renpy.TEXT_TEXT: + end_pause = len(text)/100.0 + for i, letter in enumerate(text): + start_pause = i/100.0 + d = At(Text(letter, style="what", **kwargs), wave_text(start_pause, end_pause)) + rv.append((renpy.TEXT_DISPLAYABLE, d)) + else: + rv.append((kind, text)) + return rv @renpy.pure def text_tag_bounce(tag, argument, contents): - text = contents[0][1] - letters = [] - - for i, letter in enumerate(text): - start_pause = i/100.0 - end_pause = len(text)/100.0 - d = At(Text(letter, style="what", color=argument, xsize=32), bounce_text(start_pause, end_pause)) - letters.append((renpy.TEXT_DISPLAYABLE, d)) - return letters + rv = [] + kwargs = convert_tags_to_kwargs(contents) + for kind, text in contents: + if kind == renpy.TEXT_TEXT: + end_pause = len(text)/100.0 + for i, letter in enumerate(text): + start_pause = i/100.0 + d = At(Text(letter, style="what", **kwargs), bounce_text(start_pause, end_pause)) + rv.append((renpy.TEXT_DISPLAYABLE, d)) + else: + rv.append((kind, text)) + return rv @renpy.pure def text_tag_shake(tag, argument, contents): - text = contents[0][1] - letters = [] - - for i, letter in enumerate(text): - d = At(Text(letter, style="what", color=argument, xsize=32), shake_text) - letters.append((renpy.TEXT_DISPLAYABLE, d)) - return letters + rv = [] + kwargs = convert_tags_to_kwargs(contents) + for kind, text in contents: + if kind == renpy.TEXT_TEXT: + for i, letter in enumerate(text): + d = At(Text(letter, style="what", **kwargs), shake_text) + rv.append((renpy.TEXT_DISPLAYABLE, d)) + else: + rv.append((kind, text)) + return rv @renpy.pure def text_tag_pulse(tag, argument, contents): - text = contents[0][1] - d = At(Text(text, style="what", color=argument), pulse_text) - return [(renpy.TEXT_DISPLAYABLE, d)] - - @renpy.pure - def text_tag_love(tag, argument, contents): - text = contents[0][1] - d = Fixed(love_heart((15, 0), 12, 0.1), love_heart((20, -10), 6, 0.5), love_heart((10, 10), 6, 1), fit_first=True, ysize=24) - d2 = Transform(Fixed(love_heart((15, 0), 12, 1), love_heart((20, -10), 6, 0.1), love_heart((10, 10), 6, 0.5), fit_first=True), xzoom=-1, ysize=24) - return [(renpy.TEXT_DISPLAYABLE, d), (renpy.TEXT_TAG, "color=#ff69b4"), (renpy.TEXT_TEXT, text), (renpy.TEXT_TAG, "/color"), (renpy.TEXT_DISPLAYABLE, d2)] + rv = [] + kwargs = convert_tags_to_kwargs(contents) + for kind, text in contents: + if kind == renpy.TEXT_TEXT: + d = At(Text(text, style="what", **kwargs), pulse_text) + rv.append((renpy.TEXT_DISPLAYABLE, d)) + else: + rv.append((kind, text)) + return rv @renpy.pure def text_tag_shudder(tag, argument, contents): - text = contents[0][1] - d = At(Text(text, style="what", color=argument), shudder_text) - return [(renpy.TEXT_DISPLAYABLE, d)] - - def random_timer(t, pause, rotation): - return t(renpy.random.uniform(*pause), renpy.random.uniform(*rotation)) + rv = [] + kwargs = convert_tags_to_kwargs(contents) + for kind, text in contents: + if kind == renpy.TEXT_TEXT: + d = At(Text(text, style="what", **kwargs), shudder_text) + rv.append((renpy.TEXT_DISPLAYABLE, d)) + else: + rv.append((kind, text)) + return rv + + @renpy.pure + def text_tag_flip(tag, argument, contents): + rv = [] + kwargs = convert_tags_to_kwargs(contents) + for kind, text in contents: + if kind == renpy.TEXT_TEXT: + d = Transform(At(Text(text, style="what", **kwargs), flip_text), pos=(240, -2)) + rv.append((renpy.TEXT_DISPLAYABLE, d)) + else: + rv.append((kind, text)) + return rv + + @renpy.pure + def text_tag_rotate(tag, argument, contents): + rv = [] + kwargs = convert_tags_to_kwargs(contents) + for kind, text in contents: + if kind == renpy.TEXT_TEXT: + for i, letter in enumerate(text): + d = Transform(At(Text(letter, style="what", **kwargs), rotate_text), pos=(240, -2)) + rv.append((renpy.TEXT_DISPLAYABLE, d)) + else: + rv.append((kind, text)) + return rv def text_love_heart_func(pos, size, trans, st, at): warper_rotate = _warper.easein(st / 0.5) warper_alpha = _warper.easein(st / 1.0) warper_yoffset = _warper.easein(st / 1.0) warper_xoffset = _warper.easein(st / 0.2) - trans.child = Text("❤️", size=size) + trans.child = Text("{unicode}❤{/unicode}", style="what", size=size) trans.rotate = renpy.atl.interpolate(warper_rotate, -10, 10, renpy.atl.PROPERTIES["alpha"]) trans.yoffset = renpy.atl.interpolate(warper_yoffset, 6, -6, renpy.atl.PROPERTIES["yoffset"]) trans.xoffset = renpy.atl.interpolate(warper_xoffset, -1, 1, renpy.atl.PROPERTIES["xoffset"]) @@ -145,11 +206,32 @@ transform shudder_text: pause 0.5 repeat +transform flip_text: + animation + subpixel True + perspective True + matrixtransform RotateMatrix(0, 0, 0) + pos (0, 0) # Bugs out without explicit pos; We fix the offsets in a parent + easein 1 matrixtransform RotateMatrix(360.0, 0, 0) + pause 1.5 + repeat + +transform rotate_text: + animation + subpixel True + perspective True + matrixtransform RotateMatrix(0, 0, 0) + pos (0, 0) # Bugs out without explicit pos; We fix the offsets in a parent + easein 1 matrixtransform RotateMatrix(0, 0, 360.0) + pause 1.5 + repeat + transform love_heart(pos, size, pause): animation subpixel True anchor (0.5, 0.5) - pos (pos) + xpos 240+pos[0] # Workaround; Xpos seems to not account for text box offset and text outline? + ypos -2+pos[1] # Workaround; Xpos seems to not account for text box offset and text outline? pause pause function renpy.partial(text_love_heart_func, pos, size) repeat @@ -177,13 +259,15 @@ define config.custom_text_tags = { "unicode": text_tag_unicode, "wave": text_tag_wave, "bounce": text_tag_bounce, - "love": text_tag_love, "shake": text_tag_shake, "shudder": text_tag_shudder, "pulse": text_tag_pulse, + "flip": text_tag_flip, + "rotate": text_tag_rotate, } define config.self_closing_custom_text_tags = { "heart": text_tag_heart, + "hearts": text_tag_hearts, "number": text_tag_number, }