Ren'Py のかなりマニアックな小ネタ集 - proudust.github.io

Ren'Py のかなりマニアックな小ネタ集

なにか思いつく度に書き足していきます。 ※ Ren'Py v6.99.12 での情報になります。最新バージョンでは使えないネタが含まれている可能性があります。

台詞などを囲う記号

Ren'Py 上ではダブルクォート (") やシングルクォート (') 、バッククォート (`) で囲われた文字列はすべて文字列として認識されます。

label start:
    # すべて Hello Ren'Py! と表示される
    "Hello Ren'Py!"
    'Hello Ren\'Py!'
    `Hello Ren'Py!`

Python2 上でもダブルクォートやシングルクォートは好きな方を使用することができます。
一方で、バッククォートは Python 式として評価し、そのオブジェクトの __repr__ を呼んだ結果を返すという誰得機能が付いています。(Python3 では廃止済み)

define double = "Hello Ren'Py!"
define single = 'Hello Ren\'Py!'  # この2つは Hello Ren'Py! が代入される
# define back = `Hello Ren'Py!`   # コメントを外すとエラー
define back   = `double`          # double.__repr__() の実行結果である u"Hello Ren'Py!" が代入される

混乱しやすいのでバッククォートは使わず、ダブルクォートかシングルクォートで囲うようにしましょう。

label などに使える文字

label 名には日本語や絵文字も使用することができます。
より具体的には [a-zA-Z_\u00a0-\ufffd][0-9a-zA-Z_\u00a0-\ufffd]* という正規表現に一致すれば使用できるので、Unicode の属性なども無視されます。

label 日本語が使えます!!!!!:
    pass

label 絵文字も使えます🎉🎉🎉🎉🎉:
    pass

また、image 名に限り - も使用できます。

image ハイフン-使えます = "unknown.png"

なお、Python2 上ではアルファベットと数字、アンダースコア (_) のみが使用でき、数字から始まる変数名は NG です。
しかしなぜか define 文では日本語の変数名が定義できます。何故?

define Ok_ = "Ok"
define 日本語何故か使える🤔🤔🤔 = "🤔🤔🤔" # 何故か正常に定義される

※参照: renpy/renpy:renpy/parser.py@794232f#L552

define は書き換えられる

Python には基本的に定数が存在しないため、define で定義された値は書き換えることが可能です。
ただし、セーブデータには保存されないので注意しましょう。

define test = True
init python:
    test = False
    if test:
        raise Exception # 直前に False に再代入されるので絶対に到達しない

また同様に renpy の関数のいくつかも上書きが可能です。
但し不具合を作り込む原因になりやすいので、可能な限り標準の callback などを用いて実装するようにしましょう。

ドキュメントに載っていないコールバック

Ren'Py にはドキュメントに載っていない謎コールバックが眠っています。
私の知ってるものを挙げておきます。

特定の言語に切り替えた後に呼ばれるコールバック renpy.config.language_callbacks

dict 型で、引数なしで呼ばれます。
translate [言語名] python: ブロックと異なり、その言語から切り替える時にも発火します。
なお呼ばれた時点で renpy.game.preferences.language の値が変更後の言語に変更されており、translate [言語名] python: ブロックも実行されています。

def callback():
    pass
renpy.config.language_callbacks["Japanese"] = callback

言語を切り替えた後に呼ばれるコールバック renpy.config.change_language_callbacks

list 型で、引数なしで呼ばれます。
renpy.config.language_callbacks に比べれば使い道がありそうですが、何故か載っていません。

def callback():
    pass
renpy.config.change_language_callbacks.append(callback)

台詞とキャラクターを同時に取得する

renpy.config.say_menu_text_filter を使用することで台詞を取得できますが、キャラクターまでは取得できません。
以下のように ADVCharacter.do_add を上書きすることで、表示直前の台詞を取得できます。

# 予めキャラクターを作成しておく (DynamicCharacter でも可)
define s = Character('Sylvie')

init python:
    """
    表示直前の台詞を取得します。戻り値は無視されます。

    IN:
        self - 台詞に指定されている ADVCharacter オブジェクト
        who - 表示されるキャラクター名
        what - 表示される台詞
    """
    def do_add(self, who, what):
        # 任意のコード

    # メソッドの上書き
    ADVCharacter = type(s)
    ADVCharacter.do_add = do_add

Proudust

Proudust

Virtual cockadoodledoo