LNS110 セーブデータ圧縮

セーブデータを圧縮し、ファイルサイズを削減します。





基本情報

前提スクリプト

なし

拡張タイプ

★ 既成 (導入するだけでゲームの挙動が変化する)
◆ 要注意 (内部の挙動を変えるため競合の可能性あり)


説明

概要

 DataManager によるセーブファイルの読み書きメソッドを変更します。
  • 保存場所の変更
  • 圧縮/簡易暗号化
  • バックアップ

  • セーブ/ロード時にエラーが発生した場合、その内容をメッセージボックスに出力します。
    • [LNS001 クリップボード制御] が導入済みの場合は、バックトレースも含めてクリップボードにも書き込みます。
  • ファイルのロード時、マップ情報の更新を「ロード成功時」から「画面暗転後」に変更します。

  • DataManager のセーブ/ロードに関するメソッドを再定義しています。他のスクリプト素材とは競合する可能性があります。
  • alias によって機能を拡張するスクリプトはこれより後ろに入れてください。

◆ 保存場所の変更

 セーブファイルの保存先を Save_DirName で指定されたフォルダに変えます。
  • フォルダ名の末尾には必ず "/" を入れてください。
  • Save_DirName を空文字列にすると標準と同じくゲームフォルダ内に保存されます。
  • 日本語などマルチバイト文字を含めるとセーブファイルの存在判定がうまく働かない可能性があるので、なるべく避けてください。

◆ 圧縮/簡易暗号化

  • SaveFile_Zip が真の場合、セーブ時にファイル内容の圧縮が行われます。
  • データの圧縮には Zlib::Deflate.deflate が使われます。
    • ツクールのセーブデータにはマップの通行フラグ情報など繰り返される内容が多いため、圧縮率はそれなりに高くなります(1/5-1/10程度)。
  • セーブデータを圧縮する際に圧縮済みであるマークを付け、ロード時は圧縮済みマークがある場合のみ展開するため、標準の未圧縮データも読み込むことができます。
  • SaveFile_Seed に適当な値を設定しておくと、データの圧縮後にビットクラッシュを行います。外部ツールによるセーブデータの容易な改変を防ぐ簡易的な暗号化です。
    • セーブデータが膨大な場合、ある程度のタイムラグが発生するため、セーブデータの圧縮だけで十分な場合は nil のままにしておいてください。
    • SaveFile_Seed を変更した場合、変更前に保存されたデータは読み込めなくなるのでご注意ください。
  • なお、スクリプトを解析されると復号方法も分かるため、暗号化として見たときの安全性は RGSS3 の暗号化と同等となります。
    • 検索すると RGSS3 の decrypter が見つかるため、暗号化としての効果には期待しないほうがいいかもしれません。

◆ バックアップ

  • セーブデータを上書きするとき、既存のデータを一時的にバックアップします。
    • セーブが正常に終われば、バックアップは何にも使われずに即時削除されます。
    • セーブ中にエラーが起こった場合、ファイルを削除する代わりにこのバックアップを元のデータに適用することで、上書き前のセーブデータが復元されます。
  • セーブ中にメモリリークなどの致命的なエラーによりゲーム自体が強制終了した場合は、バックアップは削除されずに残ります。
    • この場合、バックアップファイルの名前をSave01.rvdata2 などの形式に変更すれば、データを復旧できます。


備考

再定義されるメソッド

DataManager.save_file_exists?
DataManager.make_filename
  • 保存場所の変更を適用できるように再定義します。

DataManager.save_game
DataManager.save_game_without_rescue
DataManager.load_game_without_rescue
  • 圧縮/展開の処理を追加します。


設定項目

Save_DirName <既定値 "Save/" >
セーブファイルの保存先。"" にするとデフォルトと同じ「ゲームフォルダ内」になる。
SaveFile_Zip <既定値 true >
セーブデータを圧縮する
SaveFile_Seed <既定値 nil >
セーブデータビットクラッシュの種。nil にするとビットクラッシュしない。
Save_Backup_Name <既定値 "SaveBackup.rvdata2">
セーブバックアップの名前


更新履歴

  • 2020/12/29 新版公開
  • 2019/10/18 セーブフォルダを変更できるように修正
  • 2018/04/17 暗号化処理の速度を改善

  • こんにちは。不具合を発見したのでご報告いたします。 LNS000 組み込み拡張 LNS010 Input拡張 LNS100 プリセット拡張 LNS102 マウス操作 LNS140 マップ/キャラ拡張 の5つを導入した状態で、マップ画面でマウスカーソルをゲームウインドウの外側で大きく動かすなどすると、「 スクリプト 'LNS 140 マップ/キャラ拡張' の 980 行目で IndexError が発生しました。 index -1 too small for array; minimum: 0 」というエラーメッセージが表示され、ゲームが終了してしまいます。 スクリプトは全て最新で、内容は改変していません。 -- 2022-07-26 01:29:40
  • 確認が遅れましたが、対応修正しました。正確には「既に対応済みであったがアップロードを忘れていた」という状態でした…… -- 2022-11-01 15:39:07
  • 対応ありがとうございます!しかし LNS000, 010, 100, 102, 140 の5つを入れた状態で起動直後に「スクリプト 'LNS140 マップ/キャラ拡張' の 1719 行目で NameError が発生しました。 undefined method 'lns102_dash?' for class 'Game_Player'」と表示され、終了します。 -- 2022-12-24 16:39:35
コメント:

すべてのコメントを見る
最終更新:2020年12月29日 09:56