スクリプトからクエストをStartさせるとフリーズ?

環境構築

最近、宿屋に入ったタイミングでフリーズするので調べていたところ、Wet and Cold SEのコメント欄に気になる情報がありました。

クエストをスクリプトから稼働させる方法

クエストを稼働させて何かする場合、シンプルな書き方だとこうなります。

Quest Property SampleQuest Auto

Event OnUpdate()
    SampleQuest.Stop()
    SampleQuest.Start()
EndEvent

このStartが負荷の原因となるらしく、Story Manager経由で稼働させると安定するとのこと。

Story Manager経由で稼働させる方法

スクリプトはStart関数のかわりにSendStoryEventAndWait関数を使うように書き換えます。

Quest Property SampleQuest Auto
Keyword Property SampleQuestSMEvent Auto

Event OnUpdate()
    SampleQuest.Stop()

    ; Start関数を使うのをやめる
    ;SampleQuest.Start()

    ; Story Managerにクエストを開始するよう伝える
    SampleQuestSMEvent.SendStoryEventAndWait()
    ; Start関数で初期化処理をしていたのなら、別途実行する必要がある
    if SampleQuest.IsRunning()
        SampleQuest.SomeInitializeFunction()
    endif
EndEvent

プラグインは以下の通りに変更します。

  • Keywordを新規作成する。
  • Story ManagerのScript Eventを開いて、Branch Nodeを新規作成する。
  • Branch NodeのConditionにGetEventDataを設定する。引数はさきほど作ったKeywordを指定する。
  • Branch NodeにQuest Nodeを新規作成する。
  • Quest NodeにAdd Questで稼働させたいQuestを足していく。
  • 当該QuestのEventにScript Eventを設定する。

注意事項

この変更を行ったクエストはStart関数で稼働できなくなります。

Start関数を実行しないため、クエストのスクリプトでStart関数を定義していても実行されないので、初期化処理などを記述している際は、別途実行する必要があります。

Modの対応状況について

Wet and Cold SEは過去にStartさせていてフリーズの原因となっていたらしく、現在のバージョンではこの修正が適用済みとのことです。

自作のModはスクリプトからStartさせていたのが結構あったので、片っ端から修正しました。

他にも公式サバイバルモードがStartさせているので、自分でパッチを作ってみました。

その後

宿屋でのフリーズはどうなったのかというと、改善しませんでした。上記の説明とは別の原因でフリーズしているようです。

そこで、宿屋に入った時にストーリーマネージャ経由で自動的に稼働する以下のクエストを稼働しないようにしてみたところ、フリーズがピタッとなくなりました。

  • 吟遊詩人のクエスト
  • 賞金首討伐のクエスト

吟遊詩人は元々鬱陶しいと感じていたので特に困りませんでした。賞金首は序盤のロールプレイにいいのでどうしたものかと思いましたが、Missivesで代用することにしました。

タイトルとURLをコピーしました