Ren’Py改造メモ(3)

オートセーブの動作を改善する(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
 

セーブ時にも変項されてしまいますが、特に問題はないはずです。

これでゲーム終了時のオートセーブは(筆者にとって)理想的な動作になりました。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です