オートセーブの動作を改善する(2)
v6.16 以前の話です。
前回でオートセーブを改造したわけですが、実際の所終了時のオートセーブはひとつあれば十分だと思います。
それより選択肢でオートセーブとか、章毎にオートセーブとかが欲しいです。
なので、オートセーブを置き換えちゃおうと思います。
まず定期的なオートセーブを無効化します。
config.autosave_frequency = 0
次に前回追加した以下のコードのrenpy.loadsave.force_autosaveをrenpy.save(“auto”)で置き換えます。
#右上の閉じるボタンを押した時の処理
label confirm_quit:
if layout.yesno_prompt(None, layout.QUIT):
python:
if not renpy.context()._main_menu:
renpy.save("auto")
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.save("auto")
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.save("auto")
renpy.full_restart()
MainMenu.__call__ = mainmenu2
さらに続きから始めるためのAction Continueを用意します。
以下のコードを適当な場所に記述してください。
init python:
class Continue(Action):
def __call__(self):
if not self.get_sensitive():
return
renpy.load("auto")
def get_sensitive(self):
return renpy.can_load("auto")
次にタイトル画面に続きから始めるを追加しましょう。
screens.rpyの200行目辺りを以下のように変更します。
# 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 Start()
textbutton _("Continue") action Continue("auto")
#追加部分↑
textbutton _("Load Game") action ShowMenu("load")
textbutton _("Preferences") action ShowMenu("preferences")
textbutton _("Help") action Help()
textbutton _("Quit") action Quit(confirm=False)
これでタイトル画面でContinueを選べば、前回の続きから、ゲームが開始します。
さて、これで本来のオートセーブは空いたので、選択肢で自動セーブするために使いたいと思います。
まずオートセーブするためのAction AutoSaveを用意します。
以下のコードを適当な場所に記述してください。
init python:
class AutoSave(Action):
def __call__(self):
# ロールバック中は動作しないようにする
if not renpy.exports.in_rollback():
renpy.loadsave.force_autosave()
そして毎度同じみscreens.rpyの70行目辺りを以下のように変更します
screen choice:
#追加部分↓
on "replace" action [AutoSave(), MouseMove(400, 300, 100)]
#追加部分↑
window:
nvlモードでもセーブ出来るようにしましょう。
# Display a menu, if given.
if items:
vbox:
#追加部分↓
on "replace" action AutoSave()
#追加部分↑
for caption, action, chosen in items:
if action:
button:
style "nvl_menu_choice_button"
これで選択肢でオートセーブされます。
章毎のセーブは、…手動でやるかもしくは config.label_callbackに関数を代入しておけばラベルに到達するごとに自動で呼ばれます。
第一引数がラベル名、第二引数がjump,call,あるいはよく分かりませんが新しいcontextでラベルに到達したなら真そうでないなら偽です。
ただし内部で呼び出されるラベルでも実行されてしまうので注意が必要です。