ページ 11

【解決済】うなぎおおとろ様作、QuestSystem.jsのプラグインについて

Posted: 2024年9月09日(月) 17:26
by なべものさん
https://motomiyaraimu.com/tkool-quest-plugin/
↑こちらのサイトで紹介されている、うなぎおおとろ様作のQuestSystemについての質問になります。
 今発生しているのがバグなのか仕様なのか、私がどこで勘違いをしているのかもよく分からず…。
 少しでも何か分かる方いらっしゃいましたら教えて頂きたいです。
 以下手順を示していきますので、よろしくお願いいたします。

1.まずは適当なクエストを作成します。変数IDは2、タイトルは「姫を救うために薬を探せ!」とします。
11.jpg
2. クエストを発生させるためのNPCを作成します。 変数を2にすることで、クエスト進行中となります。
22.jpg
3. クエスト内容を追記するNPCを作成します。この人物に話しかけることで、クエストの説明文章が追加されます。またセルフスイッチで二回話しかけても追加されないようにします。(2ページ目では追加する処理は書いてないです)
33.jpg
 
↓一応スクリプトの原文も貼っておきます。
let detail = $dataQuests.find(data => data.variableId === 2).detail;
detail = detail.concat('\n\n薬草では病気は治らない、オトギリソウを探そう!');
QuestSystemAlias.QuestUtils.changeDetail(2,detail);

4. ここからはテストプレイになります。ゲームを起動して2の手順で作成した大臣に話しかけてクエストを受けます。実際の画面はこんな感じで、ちゃんとクエストを受けることが出来ています。
44.jpg
※画像がこれ以上添付できないので↓に続きます。

Re: うなぎおおとろ様作、QuestSystem.jsのプラグインについて

Posted: 2024年9月09日(月) 17:29
by なべものさん
↑の続きです

5. クエストを受けることが出来たので3の手順で作成したNPCに話しかけます。その後クエスト画面を開くと↓のように正しく文章が追加されました。
66.jpg
6.その後データをどこにでもいいのでセーブをします。セーブをしたら一度タイトルへ戻ります。
 そしたら"ニューゲーム"でゲームを開始します(ロードではなく、ニューゲームです)
 当然ながらニューゲームなので、現在クエストは受けていない状態となっています。
99.jpg
7.そして再度大臣からクエストを受け直します。すると新しくクエストを受けたはずなのに、
 なぜか既にNPCに話しかけた時に追加される情報が最初から書かれています。
110.jpg
8.この状況でNPCに話しかけてみると、当然まだこのデータでは話しかけていないため、更に同じ情報が追加されてしまいます。
111.jpg
私のイメージでは、ゲームを新しく始めたらクエスト内容も一新されていて追加した情報はなくなる…と思っていたのですが、どうしてこのような状態になってしまうのでしょうか?もしくは私が何か手順を間違えておりますでしょうか。結論としてやりたいことは、ニューゲームをした場合は追加された情報は表示されないようにしたいです。またクエストに追加情報(3の手順の男に話しかけた後)が追記された後でセーブをし、別のデータでロードしても似たような状況が発生してしまいます。原因が分かる方いらっしゃいましたらお願いします。

Re: うなぎおおとろ様作、QuestSystem.jsのプラグインについて

Posted: 2024年9月09日(月) 21:35
by くろうど
このプラグインのことは何も分かりませんが、原因はおそらく分かるので書いておきます。

原因は、手順3のスクリプトでデータを破壊しているためだと思われます。

$data系にはツクールのデータが入っており、全セーブデータで共通のデータとなります。
$dataQuestsはこのプラグイン独自の物と思われますが、同じ思想で作られていると思います。
そのため、変更した後でのニューゲームでも同じ値が使われます。
$data系の値はセーブデータには含まれないので、ゲームを終了すると(アプリの終了すると)元の値に戻ります。

また、その手順3のスクリプトについて補足すると、1行目で detail に入っているのは参照だと思われますので、2行目の detail = detail.concat の結果が入る場所が $dataQuests の中となり、データの破壊が行われます。

以上です。

Re: うなぎおおとろ様作、QuestSystem.jsのプラグインについて

Posted: 2024年9月09日(月) 22:26
by Plasma Dark
1行目で detail に入っているのは参照だと思われますので
正確でない表現のため、訂正させてください。
jsにおいて代入とは参照を作ることなので、detailに代入されたものが参照であるかどうかは重要ではありません。

参考: ECMAScript 2020: 6.2.4 The Reference Specification Type
the left-hand operand of an assignment is expected to produce a reference.
(2020年版ですが、代入についてはMVの当時も今も特に変わっていません)

また、ご提示頂いているスクリプト中のdetialは1行目においても文字列への参照であり、その後でdetailに別の何かを代入したからと言って、元の$dataQuestsが書き換わることはありません。
QuestUtils.changeDetailがデータを書き換えているため、冪等でないというだけの話です。

Re: うなぎおおとろ様作、QuestSystem.jsのプラグインについて

Posted: 2024年9月09日(月) 22:52
by ecf5DTTzl6h6lJj02
こんにちは。
viewtopic.php?f=23&t=14786&hilit=QuestSystem
で、上記の書き方を教えた者です。

プラグインの内容をざっと見ただけで、きちんと調査してないですが、

この現象の原因は、くろうど様と被りますが、
セーブデータをロードした時や、メニューから『タイトルへ戻る』を選択してタイトルに戻った時に、
変更した詳細の内容がリセットされないことによります。
ただ、プラグインの読み込み時に、クエストデータを作成するので、
F5 キーで再起動したときは、プラグインの再読み込みにより、
クエストデータがリセットされます。

上記トピックに返信したときには、プラグインの内容等をきちんと見ていなかったので、
この不具合には気づきませんでした。
申し訳ないです。

イベントで、

コード: 全て選択

let detail = $dataQuests.find(data => data.variableId === 2).detail;
detail = detail.concat('\n\n薬草では病気は治らない、オトギリソウを探そう!');
QuestSystemAlias.QuestUtils.changeDetail(2,detail);
という書き方で、詳細の内容を変更することについてですが、
最後の行の

コード: 全て選択

QuestSystemAlias.QuestUtils.changeDetail(2,detail);
は、MVではプラグインコマンドが動作しないので、
このスクリプトで行うようにプラグインで指定されてます。
この処理の内容を見ると、

コード: 全て選択

 
        static changeDetail(variableId, detail) {
            const questData = $dataQuests.find(data => data.variableId === variableId);
            if (!questData)
                return;
            questData.detail = detail;
        }
となっているので、
元々、このプラグラインの処理的にも、$dataQuest の内容を直接的に変更してしまっており、
提示した書き方が原因でおかしくなっているというわけではないと思います。

しかし、このプラグイン、
セーブデータに含めるためのデータを作成していて、
そのデータの中に、詳細の内容や、報酬の項目が設定されているので、
セーブ時に、この情報がきちんと書き込まれて、
ロード時にはきちんと設定し直されるはずなのですが、
詳細や、報酬の内容を変更していない場合、
データとして、 null が入ってしまっているので、
ロードしても、現在のクエストデータの内容になってしまうようです。

とりあえず、現状として、調査できているところまで、書き込ませていただきました。

きちんと、調査できていないので、間違っている部分等があるかもしれませんが、
ご容赦ください。

現象の解消法についても、もう少し時間をください。
恐らく、ニューゲーム時やロード時に、 $dataQuests の内容をいったん初期化するような処理を
することになると思いますが…。

Re: うなぎおおとろ様作、QuestSystem.jsのプラグインについて

Posted: 2024年9月09日(月) 23:39
by ecf5DTTzl6h6lJj02
とりあえずの対処として、
  • ニューゲーム時に、クエストデータを初期化する。
  • セーブデータのロード時に、
    一旦クエストデータを初期化してから、
    セーブデータに含まれている内容で上書きする
という挙動に変更してみました。
QuestSystem.js
(128.16 KiB) ダウンロード数: 17 回
本当に、とりあえずの対処で、
きちんと検証した内容ではないので、
別の不具合等が起こる可能性があります。
ご了承ください。

Re: うなぎおおとろ様作、QuestSystem.jsのプラグインについて

Posted: 2024年9月10日(火) 04:23
by なべものさん
くろうど様 Plasma Dark様
ご回答いただきありがとうございます!
こういった細かい仕様のことは全然知らなかったのでとても勉強になります!

ecf5DTTzl6h6lJj02様
毎度毎度助けて頂いて本当にありがとうございます!
早速ダウンロードして使ったところ、挙動が直りました!
一応こちらで色々動かしてみてバグが発生しないかは確認しようと思いますが、
ひとまず本当に助かりました!ecf5DTTzl6h6lJj02様に幸せが訪れますように。

本件解決したのでクローズとさせていただきます、皆様本当にありがとうございました!