_ren.py ファイル - Ren'Py in Python link

より複雑なゲームでは、ほとんどが Python で構成され、Python のコードを Ren'Py に導入するために init python: のような僅かな Ren'Py のステートメントがあるのみのファイルを作成することがありえます。 Ren'Py には、このような Python を多用したファイルを書くための代替方法があります。ファイル名が _ren.py で終わるファイルは、Python の構文で書け、 Ren'Py スクリプトに変換されてから処理されます。

この利用には二つの利点があります。 :

  • _ren.py 構文を使用すると、Python の各行の前に配置する必要がある余分なインデント層が削除されます。

  • Pythonに特化したツールを使って _ren.py をエディターで開き、 Ren'Py 中の Python ではできないコード解析やリファクタリングがエディターでできるようになります。

Ren'Py in Python ファイルは、例えば actions_ren.py のように、名前が _ren.py で終わります。これらのファイルは .rpy ファイルと同じ unicode 順で処理されるので、 actions_ren.pyactions.rpy が処理されるのと同じ場所で処理されます。 _ren.py と a .rpy が同じディレクトリにあるとエラーになります。例えば、actions.rpyactions_ren.py は競合し、同じディレクトリに存在するとエラーになります。

構文と変換 link

Ren'Py in Python ファイルには3つのセクションがあります。

  • ファイル最初の無視されるセクション。これは Python のインポートやエディターやその他のツールで使用される他の物で、ゲームの一部ではなく、Ren'Pyでは実行されない部分

  • Ren'Py スクリプトを含める一つ以上の Ren'Py セクション。 Ren'Py スクリプトは一般的に Python セクションの導入に使用され、その Python のインデントも設定します。

    Ren'Py セクションはその行の """renpy で始まり """ で終わります。開始と終了は行の最初にある必要があり、その前にインデントがあってはいけません。どちらかでもインデントがあると、正常に処理されません。

  • 一つ以上の Python セクション。 Python セクションは Ren'Py セクション後にあり、最後の Ren'Py セクションの非空白、非コメント行のインデントレベルまでインデントされます。その行がコロン (:) で終わるとさらに 4 つのスペースで Python はインデントされます。

この変換によってメモリーに等しい .rpy ファイルを作成し、このファイルは通常の方法でコンパイルされます。注意点として、 Ren'Py in Python は (独立したモジュールではなく) Ren'Py store で実行され、その Python コードはロールバックとセーブロードを有効にするものに置換されます。 Python ステートメントロールバック を参照ください。

link

こちらは _ren.py ファイルの例です

# This is not included in the game. It's here so that an editor knows
# the type of strength.
strength = 100

"""renpy
init python:
"""

class BoostStrength(Action):
    """
    Boosts the strength of the player by 10.
    """

    def __call__(self):
        global strength
        strength += 10
        renpy.restart_interaction()

このファイルは (空行を除去して) 次のように変換されます

init python:

    class BoostStrength(Action):
        """
        Boosts the strength of the player by 10.
        """

        def __call__(self):
            global strength
            strength += 10
            renpy.restart_interaction()