訂製文本標籤 link

Ren’Py支持定義你自己的文本標籤(tag)。文本標籤系統可以操作文本和定義的標籤,包括添加和移除文本或其他文本標籤。

可以在下列字典中,聲明一個文本標籤函數的入口(entry),創建訂製文本標籤。

define config.custom_text_tags = { } link

將文本標籤名映射到文本標籤的函數。

define config.self_closing_custom_text_tags = { } link

將文本標籤名映射到自閉合文本標籤函數,而文本標籤內部不含有其他文本。

Warning

在預處理階段的任何時機都可能調用這些函數。因此,這些函數的行為不應該與遊戲狀態(全局變數等)耦合,也不應該有副作用。 (例如,調用 等效語句 或改變全局變數的值。)

一個文本標籤函數有3個入參:標籤(tag)自身,標籤使用的參數,以及一個內容元組的列表。例如:下面這段文本:

"{big=2}Hello, {b}World{/b}{/big}"

標籤(tag)是“big”,標籤使用的參數是字串“2”,內容元組的列表就會是:

[
    (renpy.TEXT_TEXT, "Hello, "),
    (renpy.TEXT_TAG, "b"),
    (renpy.TEXT_TEXT, "World"),
    (renpy.TEXT_TAG, "/b"),
]

文本標籤函數會替換內容中的文本標籤,並返回一個新的內容元組列表。

內容元組由兩部分組成。第一部分是下列面出的常量之一。第二部分根據第一部分的內容發生變化,下面會詳細說明。

renpy.TEXT_TEXT

第二部分是向用戶顯示的文本。

renpy.TEXT_TAG

第二部分是某個文本標籤的內容,不帶閉合花括號。

renpy.TEXT_DISPLAYABLE

第二部分是一個嵌入文本中的可視組件。

renpy.TEXT_PARAGRAPH

這表示兩段文本之間的斷行。第二部分未定義(但必須存在)。

自閉合文本標籤函數類似,差別在於沒有第三個入參。

當入參 tokenized 為True時,token列表可以傳給函數 Text()

Warning

對話中的文本標籤{p}、{w}、{nw}和{fast}處理時機遭遇自訂文本標籤,也不能包在自訂文本標籤中或穿透自訂文本標籤。

附加說明 link

對話文本標籤{p}、{w}、{nw}和{fast}在訂製文本標籤之前優先處理,所以不應該被包含在一個訂製文本標籤裡面,也不應該與訂製文本標籤互相穿透。

樣例 link

樣例中的 big 文本標籤使用效果類似於{size}文本標籤,不過會對入參使用相乘(multiply)。:

init python:

    def big_tag(tag, argument, contents):

        size = int(argument) * 20

        return [
                (renpy.TEXT_TAG, u"size={}".format(size)),
            ] + contents + [
                (renpy.TEXT_TAG, u"/size"),
            ]

    config.custom_text_tags["big"] = big_tag


"這個字就是 {big=3}大!{/big}"

樣例 rot13 文本標籤將rot13變換(transform)應用於文本。注意,rot26——應用兩次rot13——就是普通的文本。

init python:

    def rot13_transform(s):

        ROT13 = { }

        for i, j in zip("ABCDEFGHIJKLM", "NOPQRSTUVWXYZ"):
             ROT13[i] = j
             ROT13[j] = i

             i = i.lower()
             j = j.lower()

             ROT13[i] = j
             ROT13[j] = i

        return "".join(ROT13.get(i, i) for i in s)

    def rot13_tag(tag, argument, contents):
        rv = [ ]

        for kind, text in contents:

            if kind == renpy.TEXT_TEXT:
                text = text.encode("rot13")

            rv.append((kind, text))

        return rv

    config.custom_text_tags["rot13"] = rot13_tag

"Rot0. {rot13}Rot13. {rot13}Rot26. {/rot13}Rot13. {/rot13}Rot0."

文本標籤 bang 的功能是在文本中插入一個指定圖像,並且不需要對應的閉合標籤。

init python:
    def bang_tag(tag, argument):
        return [ ( renpy.TEXT_TAG, "size=40"), (renpy.TEXT_TEXT, "!"), (renpy.TEXT_TAG, "/size") ]

    config.self_closing_custom_text_tags["bang"] = bang_tag

"This is awesome{bang}"