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
ブロックで定義されたクラスも使用出来ます。
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.
_clear
(progress=False) link永続データのリセット
True なら Ren'Py が保持している進行度のデータもリセットします。
これはすべての永続データを消去しますが Ren'Py が再起動するまでデフォルトは適用されないことに注意してください。
renpy.
register_persistent
(field, func) linkディスクからロードされた persistent のあるフィールドの値と、現在の persistent オブジェクトのフィールドの値を統合するために使用される関数を登録します。
persistent オブジェクトのフィールド名です。
3 つの引数 old, new, current で呼び出される関数です。 :
古いオブジェクトのフィールドの値です。
新しいオブジェクトのフィールドの値です。
現在の persistet オブジェクトのフィールドの値です。これはフィールドが参照しているオブジェクトの識別子を変更できない時のために用意されています。
関数は persistent オブジェクトの新しいフィールドの値を返すことが期待されます。
renpy.
save_persistent
() link永続データをディスクに保存します。
ゲーム間永続的データは Ren'Py ゲーム間で情報を共有させる機能です。これはシリーズ物のゲームを計画していて、それらに情報を 共有させたい場合に有益です。
ゲーム間永続データを使用するためには、 MultiPersistent オブジェクトが init
ブロック内で作成されなければなりません。 ユーザーはこのオブジェクトを更新でき、 save メソッドを呼び出せば、ディスクにセーブ出来ます。 未定義のフィールドはデフォルトで None です。オブジェクトがもう一度ロード可能だと保証するために、ユーザー定義型のインスタンスを 代入しないことを勧めます。
MultiPersistent
(key, save_on_quit=False) link新しく MultiPersistent
オブジェクトを作成します。これは init
ブロックでのみ呼び出されるべきで、 指定した key に対応する新しい MultiPersistent
オブジェクトを返します。
key はゲーム間永続データにアクセスするために使われるキーです。ゲームは同じキーを使用して同じゲーム間永続データにアクセスします。
True ならこのオブジェクトは Ren'Py 終了時に自動保存されます。
save
() linkMultiPersistent オブジェクトをディスクにセーブします。これはデータが変更されてから呼び出されるべきです。
例 複数パートのゲームその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?"