Ren'Pyでゲームを制作している際、
「あれ、セーブデータを削除したのに勝手に復活している?!」
という事態に見舞われたことはないでしょうか。自分はあります。。
セーブファイルが保存される場所
Ren'Pyは
"(プロジェクトフォルダ)\game\saves"にセーブファイルを作ります。
ですがこれだけではなく、windowsの場合であれば
"C:\Users\[ユーザー名]\AppData\Roaming\RenPy\[作品別のフォルダ]"
にもセーブファイルを保存します。
MacやLinuxの場合の保存先や、その他の詳細はこちらにあります:
上記ディレクトリに保存しないようにするには
ランチャーから新規プロジェクトを作成した時点で、上記のディレクトリ内に
"define config.save_directory"で指定されている名前のフォルダが作られます。
"define config.save_directory"は、"option.rpy"の中に記載されています。
"define config.save_directory"をコメントアウトする
(又は"define config.save_directory = None"とする)と、
前述のディレクトリのセーブデータは更新されなくなり
"(プロジェクトフォルダ)\game\saves"へのみセーブデータが作成・更新されます。
但し。この設定を行うとウェブ版(ブラウザ版)でセーブデータが自動で保存されなくなるため
ウェブ版での公開を予定されている方は注意が必要です。
※ 上記は筆者の環境で確認したものです。環境によって挙動が異なる場合があります。
関連: Ren'Py Sync
デバイス間でのセーブデータの移動がしやすくなる機能がRen'Py 8.1から実装されています。
詳細はこちら:
Ren'Py 8.1以降?で新規プロジェクト作成すると、セーブ画面の下部に"同期のアップロード"というボタンが追加されます。ロード画面では"同期のダウンロード"ボタンになります。
このボタンを表示したくない場合は、下記のいずれかで対処できるかと思います。
option.rpyなどで「define config.has_sync = False」を追加する
screen.rpyで「if config.has_sync:」以下の数行をコメントアウトする
同期をアップロードすると、セーブデータがRen'Py Syncサーバーに一時的(*)に保存され同期IDが発行されます。この同期IDを入力して同期をダウンロードすると、前述の
"C:\Users\[ユーザー名]\AppData\Roaming\RenPy\[作品別のフォルダ]"(windowsの場合) 内にある "sync" というフォルダにセーブデータが入るようです。
(*Ren'Py Sync Webページによると、204-10-12現在、保管期限は1日のようです)
少々試した限りでは、セーブ箇所・テキストの既読情報・画像の閲覧情報辺りは引き継がれるようですが、永続データ(自分でpersistent.xxxxxxで定義したもの)の引き継ぎが単純には上手くいかないようでした。また、既にセーブデータがある状態で同期を行うと既存のセーブデータの影響を受ける部分もありそうです。
永続データの統合
Ren'Pyの永続データは、読み込んだ値と現在の値のうち最も新しいものを採用するようです。ゲーム初回起動時に永続データの初期値を与えていると、こちらが最新の値として採用され、読み込んだ値にならないことがあるようです。
Ren'Pyドキュメントに「永続データの統合」に関する説明があります。ですが、ドキュメント内の例はそのままコピー&ペーストでは適用できず、各自の変数の使い方によって変更する必要があります。
筆者は4つのエンディングのクリア情報をリストに入れていますが、下記のようにマージしています。
init python:
# 変数が定義されていなければ、定義し初期値を与える
if persistent.clear_checker is None:
persistent.clear_checker = [False, False, False, False]
# リストの0~3それぞれについて、新旧いずれかがTrueならTrueにする関数
def merge_clear_checker(old, new, current):
current = [False, False, False, False]
for i in range(0,len(current)):
if old[i] or new[i]:
current[i] = True
return current
# 上記の関数に基づき変数の値をマージ
renpy.register_persistent('clear_checker', merge_clear_checker)
ご参考まで、この機能を最近こちらのゲームに実装しました。
(マルチエンドのADVゲームです。内容は万人向けではないの無視してください。)