永続データ link
Ren'Py は永続データをサポートしており、特定のゲームに依存しないデータをセーブ出来ます(*訳注 つまり特定のセーブデータではなく、エンディング達成リストのようなゲーム全体で共有するデータを扱います)。永続データは persistent オブジェクトのフィールドからアクセス出来、変数 persistent
に代入されています。
persistent
のフィールドからアクセス出来るすべてのデータは Ren'Py が終了するか、 renpy.save_persistent()
が呼び出されたときに保存されます。永続データは Ren'Py 起動時と永続データがディスク上で更新された時にロードされます。
persistent オブジェクトは特別で、未定義のフィールドにアクセスすると、例外を出力する代わりに None を返します。 None 以外を persistent 値のデフォルトにするなら default ステートメントが使用出来ます。 :
default persistent.main_background = "princess_not_saved"
永続データの使用例はアンロック可能なイメージギャラリーの作成です。これはギャラリーがアンロックされているかどうかのフラグを永続データに置いて行われます。
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つのアンダースコア(__
)で始まるフィールドもサポートされていますが、 このセクション で説明されている名前のマングリング効果が適用され、定義されているファイルに固有となります。つまり、2つのリリースの間でファイル名が変更された場合、そのフィールドが以前のリリースで持っていた値へのアクセスができなくなります。
これに加えて、これらのフィールドは :meth:`persistent._clear`メソッドによる影響を受けません。
注意点は一つのアンダースコア _
で始まるフィールドは予約されており、使用されるべきではありません。
永続データの統合 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
- persistent._hasattr(field_name) link
field_name persistent フィールドが設定されているかどうか確認します。これによりそのフィールドが明示的に None に設定されたか設定されていないかを判別出来るようにします。
- persistent._clear(progress=False) link
永続データを
__
で始まるフィールドを除いてリセットします。- progress
True なら Ren'Py が保持している進行度のデータもリセットします。
これはすべての永続データを消去しますが Ren'Py の再起動までデフォルトは再適用されないので注意してください。
- 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 オブジェクトが初期化時に作成されなければなりません ( define
の使用が望ましいです ) 。 ユーザーはこのオブジェクトを更新でき、 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
define 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
define 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?"