ページ 11

【解決済み】ショップの処理から購入して閉じたか購入せずに閉じたかの取得

Posted: 2025年1月31日(金) 00:21
by natsuki
スクリプトについて相談があります。

私はまったくと言っていいほどJavaScriptが分からないので、ChatGPTに、
ショップの処理から購入して閉じたか購入せずに閉じたかの取得 するスクリプトを書いてもらおうと思い
作っていたのですが、実際生成されたスクリプトを使用してイベントを作ってみたのですが、上手くいきません。
変数n番の値を購入し閉じた場合に変更し、条件分岐でn番が0の場合に購入させるためにラベルジャンプ、1の場合に購入後の処理を行おうと思っています。ですが試していると変数が変更されません。
制御文字で変数を確認していますが、初期値のままです。

もしどなたかお詳しい方がいらっしゃいましたらご指南願います。また如何に生成したスクリプトを貼って起きますので、参考にしてください。

(() => {
// 変数57の初期化(ショップ開始時)
const _Scene_Shop_create = Scene_Shop.prototype.create;
Scene_Shop.prototype.create = function() {
_Scene_Shop_create.call(this);
console.log("ショップ開始時の変数57:", $gameVariables.value(57)); // ショップ開始時の確認
};

// アイテム購入処理
const _Scene_Shop_doBuy = Scene_Shop.prototype.doBuy;
Scene_Shop.prototype.doBuy = function(number) {
// 元の購入処理を呼び出し
_Scene_Shop_doBuy.call(this, number);

// 購入後にフラグを設定
console.log("購入が完了:", number); // 購入したアイテムの番号を確認
$gameVariables.setValue(57, 1); // 変数57を1に設定(購入フラグ)
console.log("購入フラグ:", $gameVariables.value(57)); // 購入フラグの確認
};

// ショップを閉じる処理(フラグ確認)
const _Scene_Shop_popScene = Scene_Shop.prototype.popScene;
Scene_Shop.prototype.popScene = function() {
_Scene_Shop_popScene.call(this);
console.log("ショップ終了時の変数57:", $gameVariables.value(57)); // 終了時の変数57の確認
};

// ショップ終了時に変数57の値が0であれば、やめたフラグとして設定
const _Scene_Shop_onBuyCancel = Scene_Shop.prototype.onBuyCancel;
Scene_Shop.prototype.onBuyCancel = function() {
_Scene_Shop_onBuyCancel.call(this);
if ($gameVariables.value(57) === 0) {
console.log("購入せずにキャンセルされた場合");
}
};
})();

Re: ショップの処理から購入して閉じたか購入せずに閉じたかの取得

Posted: 2025年1月31日(金) 21:52
by 名無し蛙
まず生成されたコードの大部分が無駄ですね。
このコードを最適化するとこうなります。

コード: 全て選択

(() => {
    const _Scene_Shop_create = Scene_Shop.prototype.create;
    Scene_Shop.prototype.create = function() {
        _Scene_Shop_create.call(this);
        $gameVariables.setValue(57, 0);
    };

    const _Scene_Shop_doBuy = Scene_Shop.prototype.doBuy;
    Scene_Shop.prototype.doBuy = function(number) {
        _Scene_Shop_doBuy.call(this, number);
        $gameVariables.setValue(57, 1);
    };
})();
変数初期化処理もしていないのでついでに初期化しておきました。
で、一応これでも要件を満たしていると言えば満たしています。
ショップ処理で購入時、変数57番に1を代入する。(何も購入していない場合は0)
という処理ですがn番というのは57番で合っていますか?
ハードコードで指定しているので57番以外では適用されていませんが。

あと、もしも未購入の場合は購入するまで無限ループするという使い方なら
購入資金の枯渇に拠る無限ループには注意してください。

Re: ショップの処理から購入して閉じたか購入せずに閉じたかの取得

Posted: 2025年2月01日(土) 15:54
by natsuki
名無し鮭さん返信ありがとうございます。

スクリプトを使わせてもらいました。
しかし、テストプレイを行うと、ショップで購入しても変数が代入されません。
購入時に変数57に1を代入するスクリプトだと思いますが、テストプレイ一度目には正常な動作をし、
二度目では毎度代入されていないようです。

私は知識が浅いため、使い方を間違っている可能性もあるかもしれません。
また良ければ知識をお貸しいただきたいです。

ショップの処理→スクリプト→条件分岐で変数57番が0のとき→条件分岐で変数57番が1のとき
というイベントの組み方をしております。

よろしくお願いいたします。

Re: ショップの処理から購入して閉じたか購入せずに閉じたかの取得

Posted: 2025年2月01日(土) 17:15
by 名無し蛙
非常にシンプルな改造なので動作結果が不安定になる、というのも考えづらいですね。
①実行手順に重大な認識の齟齬がある
②他のプラグイン素材が影響を与えている
のどちらかだと思います

前者に関してはイベント側でどのような使い方をしているのか書き出してください
自分は「こんな使い方をしているのかな?」と考えています

コード: 全て選択

◆ラベル:商談開始
◆ショップの処理:ポーション
◆条件分岐:#0057 = 0
  ◆文章:なし, なし, ウィンドウ, 下
  :  :何か買ってください
  ◆ラベルジャンプ:商談開始
  ◆
:分岐終了
◆文章:なし, なし, ウィンドウ, 下
:  :ご利用ありがとうございました
後者に関しては試しにこのプラグイン以外の全ての素材をOFFにしてテストしてください

Re: ショップの処理から購入して閉じたか購入せずに閉じたかの取得

Posted: 2025年2月01日(土) 19:08
by natsuki
返信ありがとうございます。

概ねおっしゃられていた配置通りなのですが、スクリプトの位置をショップの処理の後にしておりました。
スクリプトの位置をショップの処理の前に移動させたら問題なく動くようになりました。

ご対応ありがとうございました。

Re: 【解決済み】ショップの処理から購入して閉じたか購入せずに閉じたかの取得

Posted: 2025年2月01日(土) 19:13
by chro
横からですが、そもそもこれはプラグイン化して、プラグインとして使用するものです。
スクリプトで使用するものではありません。

スクリプトでやってはいけません。

Re: 【解決済み】ショップの処理から購入して閉じたか購入せずに閉じたかの取得

Posted: 2025年2月02日(日) 13:34
by 名無し蛙
あーなるほど。
即時関数を使っているので当然プラグインの話をしていると思っていましたけど
一度もプラグインという単語は出て来てませんでしたね。
イベントコマンド>スクリプトでも動かない事はないですけど
呼び出す度にマトリョーシカのように関数呼び出しが深くなるのであまり良くはないです。
ゲーム再起動と共にリセットされるのでパフォーマンスに影響を与える程深刻になる事はないでしょうけど。

もしもプラグイン化する場合は、最低限最上部に@target MZを書いておかないと
警告メッセージが出る事だけ加えておきます。

コード: 全て選択

/*: @target MZ */

(() => {
    const _Scene_Shop_create = Scene_Shop.prototype.create;
    Scene_Shop.prototype.create = function() {
        _Scene_Shop_create.call(this);
        $gameVariables.setValue(57, 0);
    };

    const _Scene_Shop_doBuy = Scene_Shop.prototype.doBuy;
    Scene_Shop.prototype.doBuy = function(number) {
        _Scene_Shop_doBuy.call(this, number);
        $gameVariables.setValue(57, 1);
    };
})();

Re: 【解決済み】ショップの処理から購入して閉じたか購入せずに閉じたかの取得

Posted: 2025年2月02日(日) 14:35
by natsuki
おふたり共、返信ありがとうございます。
解決済みにするのは気が早かったです。

当方、全くと言っていいほど知識がなく、ChatGPTに、
こうこうこういうスクリプトを書いて。という事しか言っておりません。
ChatGPTは便利ですけど、多少知識が無いとやはり使うのは難しそうですね。

コードありがとうございます。プラグイン化して使用しました。問題なく動きました。
本当にありがとうございました!