オートセーブの動作を改善する(1)
v6.16 以前の話です。
Ren’Pyにはデフォルトでオートセーブが実装されていますが、タイトル画面でセーブされる等、動作がちょっと変です。
オートセーブのタイミングは、ゲームが開始されているかどうか関係なしに終了時のYes/Noダイアログが表示される時と、config.autosave_frequencyに指定された数の台詞が表示された時です。
また、ダイアログを表示させずに終了させるとセーブは行われません。
これはちょっと問題なので、改造することにします。
まず終了時の動作ですが、右上の閉じるボタンから終了する場合と、アクションQuitから終了する場合があります。
右上の閉じるボタンから終了した場合ラベルconfirm_quitが存在するならそこにジャンプし、また、Quitが実行された場合Quit.__call__が呼び出されるので、これらを置き換えます。
それとタイトルに戻るを使用した場合もセーブして欲しいので、MainMenu.__call__も置き換えます。
タイトル画面かどうかの目印には後述する変数in_titleを使用します。
どうやらゲームが開始されているかはrenpy.context()._main_menuの真偽値でわかるようです。
適当な場所に以下のコードを記述してください。
#右上の閉じるボタンを押した時の処理
label confirm_quit:
if layout.yesno_prompt(None, layout.QUIT):
python:
if not renpy.context()._main_menu:
renpy.loadsave.force_autosave()
jump _quit
else:
return
init python:
def quit2(self):
# 終了, Quit
if self.confirm:
layout.yesno_screen(layout.QUIT, Quit(False))
else:
if not renpy.context()._main_menu:
renpy.loadsave.force_autosave()
renpy.quit()
Quit.__call__ = quit2
# タイトルに戻る, MainMenu
def mainmenu2(self):
if not self.get_sensitive():
return
if self.confirm:
layout.yesno_screen(layout.MAIN_MENU, MainMenu(False))
else:
if not renpy.context()._main_menu:
renpy.loadsave.force_autosave()
renpy.full_restart()
MainMenu.__call__ = mainmenu2
つぎに、タイトル画面かどうかの目印に使う変数in_titleを用意します。
タイトル画面から本編に移動するときの通過点は、ロードとスタートです。
なのでこのときのActionでin_titleが真になるようにします。
また、タイトル画面が表示されたらin_titleが偽になるようにします。
renpy.context()._main_menuを利用するように変更するので以下の処理は必要ありません。
screens.rpyの174行目辺りのscreen main_menuを変更します。
##############################################################################
# Main Menu
#
# Screen that's used to display the main menu, when Ren'Py first starts
# http://www.renpy.org/doc/html/screen_special.html#main-menu
screen main_menu:
# This ensures that any other menu screen is replaced.
# 追加部分↓
on "show" action SetVariable("in_title", True)
# 追加部分↑
tag menu
# The background of the main menu.
window:
style "mm_root"
# The main menu buttons.
vbox:
style_group "mm"
xalign .5
yalign .9
# 追加部分↓
textbutton _("Start Game") action [SetVariable("in_title", False), Start()]
# 追加部分↑
次にscreens.rpyの299行目辺りのscreen screen file_pickerを変更します。
# Display a grid of file slots.
grid columns rows:
transpose True
xfill True
style_group "file_picker"
# Display ten file slots, numbered 1 - 10.
for i in range(1, columns * rows + 1):
# Each file slot is a button.
button:
# 追加部分↓
action [SetVariable("in_title", False), FileAction(i)]
# 追加部分↑
xfill True
has hbox
セーブ時にも変項されてしまいますが、特に問題はないはずです。
これでゲーム終了時のオートセーブは(筆者にとって)理想的な動作になりました。