永続データ link

Ren'Py は永続データをサポートしており、特定のゲームに依存しないデータをセーブ出来ます(*訳注 つまり特定のセーブデータではなく、エンディング達成リストのようなゲーム全体で共有するデータを扱います)。永続データは persistent オブジェクトのフィールドからアクセス出来、変数 persistent に代入されています。

persistent のフィールドからアクセス出来るすべてのデータは Ren'Py が終了するか、 renpy.save_persistent() が呼び出されたときに保存されます。永続データは Ren'py 起動時と永続データがディスク上で更新された時にロードされます。

persistent オブジェクトは特別で、未定義のフィールドにアクセスすると、例外を出力する代わりに None を返します。

永続データの使用例はアンロック可能なイメージギャラリーの作成です。これはギャラリーがアンロックされているかどうかのフラグを永続データに置くことで行われます。

label gallery:

    if not persistent.gallery_unlocked:
        show background
        centered "You haven't unlocked this gallery yet."
        $ renpy.full_restart()

    # Actually show the gallery here.

ユーザーがギャラリーをアンロックするエンディングに到達したらフラグを True に設定しなければなりません。

$ persistent.gallery_unlocked = True

永続データは init python ブロック実行前にロードされるので、永続データには Python か Ren'Py のネイティブな型のみが含まれます。あるいは pickle 可能で等号演算子が実装されているなら、 python early ブロックで定義されたクラスも使用出来ます。

永続データの統合 link

2つのソースから Ren'Py が永続データを統合する必要のある場合があります。例えば、 Ren'Py は USB ドライブにある persistent データとローカルマシンにある persistent データを統合する必要があるでしょう。

Ren'Py はこの統合をフィールドベースで行ない、最も新しいフィールドの値を採用します。いくつかのケースではこれは望ましい動作ではありません。その場合、 renpy.register_persistent() 関数が使用可能です。

例えば既読エンディングの set があるなら、データの統合時にその set を引数に取りたいです。

init python:
    if persistent.endings is None:
        persistent.endings = set()

    def merge_endings(old, new, current):
        current.update(old)
        current.update(new)
        return current

    renpy.register_persistent('endings', merge_endings)

Persistent 関数 link

renpy.register_persistent(field, func) link

ディスクからロードされた persistent のあるフィールドの値と、現在の persistent オブジェクトのフィールドの値を統合するために使用される関数を登録します。

field

persistent オブジェクトのフィールド名です。

function

3 つの引数 old, new, current で呼び出される関数です。 :

old

古いオブジェクトのフィールドの値です。

new

新しいオブジェクトのフィールドの値です。

current

現在の persistet オブジェクトのフィールドの値です。これはフィールドが参照しているオブジェクトの識別子を変更できない時のために用意されています。

関数は persistent オブジェクトの新しいフィールドの値を返すことが期待されます。

renpy.save_persistent() link

永続データをディスクに保存します。

ゲーム間永続データ link

ゲーム間永続的データは Ren'Py ゲーム間で情報を共有させる機能です。これはシリーズ物のゲームを計画していて、それらに情報を 共有させたい場合に有益です。

ゲーム間永続データを使用するためには、 MultiPersistent オブジェクトが init ブロック内で作成されなければなりません。 ユーザーはこのオブジェクトを更新でき、 save メソッドを呼び出せば、ディスクにセーブ出来ます。 未定義のフィールドはデフォルトで None です。オブジェクトがもう一度ロード可能だと保証するために、ユーザー定義型のインスタンスを 代入しないことを勧めます。

class MultiPersistent(key, save_on_quit=False) link

新しく MultiPersistent オブジェクトを作成します。これは init ブロックでのみ呼び出されるべきで、 指定した key に対応する新しい MultiPersistent オブジェクトを返します。

key

key はゲーム間永続データにアクセスするために使われるキーです。ゲームは同じキーを使用して同じゲーム間永続データにアクセスします。

save_on_quit

True ならこのオブジェクトは Ren'Py 終了時に自動保存されます。

save() link

MultiPersistent オブジェクトをディスクにセーブします。これはデータが変更されてから呼び出されるべきです。

例 複数パートのゲームその1

init python:
    mp = MultiPersistent("demo.renpy.org")

label start:

    # ...

    # Record the fact that the user beat part 1.

    $ mp.beat_part_1 = True
    $ mp.save()

    e "You beat part 1. See you in part 2!"

その2

init python:
    mp = MultiPersistent("demo.renpy.org")

label start:

    if mp.beat_part_1:
         e "I see you've beaten part 1, so welcome back!"
    else:
         e "Hmm, you haven't played part 1, why not try it first?"