Ren'Py の実行中に rpa を削除する
実行中に rpa を削除するという暴挙をした時のメモ
結論
init python ブロックで削除する
この場合 rpa 内のスクリプトが読み込まれてしまっているので、再起動または終了する必要がある。
1. persistent に削除フラグを保存してスクリプトの再読み込み
persistent.uninstall = True
renpy.save_persistent()
renpy.utter_restart()2. init python ブロックで persistent の削除フラグが立っていたら、 rpa と persistent の削除フラグを削除
import os
try: os.unlink(config.basedir + "/game/*.rpa")
except: pass
persistent.uninstall = False
renpy.save_persistent()3. 終了・または再起動
終了の場合は renpy.quit() 、再起動ならタイトル表示後に renpy.utter_restart()
タイトル表示後で再起動処理を挟める場所が思いつかないので、終了してしまうのが一番早いと思う。
スクリプトの実行タイミング
起動時
python earlyブロック config は使えるinit * pythonブロック (* の数値が小さい順)translate * pythonブロック (* は現在の言語)- リソースがロードされ、以降リソース入り rpa はロックされて削除できない
タイトルへ戻った時
translate * pythonブロック (* は現在の言語)
renpy.change_language(*) 時
translate * pythonブロック (* は変更後の言語)
renpy.utter_restart() 時
起動時と同じ
※ renpy.utter_restart() はタイトル前に実行すると無言で落ちる
renpy.reload_script() 時
起動時と同じだが、translate * python ブロックがなぜか 3 回くらい呼ばれる
あと画面にリロード中であることがデカデカと表示される
※ renpy.reload_script() はタイトル前に実行すると無言で落ちる
renpy.full_restart() 時
タイトルへ戻った時と同じ
※ renpy.full_restart() は python early ブロック、init * python ブロックで実行すると落ちる。translate * python ブロックでは落ちない。
renpy.quit(relaunch=True)
そもそも再起動されない。ソースコードを読む限り、起動時と同じはず。