ページ 11

ショップで購入時にアイテムごとに変数を変更したい

Posted: 2025年3月05日(水) 12:42
by Iron
ショップで購入時に任意の変数を変更するプラグインを作成したいです
例としてメモ欄に変数変更: 34, 5と書いた場合変数34番に5の値を代入することを想定しています
下はChatGPTで作成したものですが動作不全です
よろしくお願いいたします

コード: 全て選択

/*:
 * @target MZ
 * @plugindesc 購入時にアイテムのメモ欄に記載された変数を変更するプラグイン
 * @help
 * このプラグインは、アイテム購入時にそのアイテムのメモ欄を参照し、
 * メモ欄に「変数変更X,Y」と記載されていた場合、指定した変数番号Xに値Yを代入します。
 * 
 * 例: 武器Aのメモ欄:
 *   <変数変更1,10>  // 変数1に10を代入
 * 
 * @param VariableChangeText
 * @text 変数変更メッセージ
 * @desc メモ欄に「変数変更X,Y」と記載されている場合、指定された変数にYの値を代入します。
 * @default 変数変更
 */

(() => {
    const parameters = PluginManager.parameters('VariableChangeOnBuy');
    const variableChangeText = parameters['VariableChangeText'] || '変数変更';

    // アイテム購入時に変数を変更する処理
    const _Scene_Shop_onBuyItem = Scene_Shop.prototype.onBuyItem;
    Scene_Shop.prototype.onBuyItem = function() {
        // 購入するアイテム
        const item = this._buyWindow.item();

        // アイテムのメモ欄に「変数変更X,Y」が記載されているかを確認
        if (item && item.meta[variableChangeText]) {
            this.applyVariableChange(item);
        }

        // 通常の購入処理を実行
        _Scene_Shop_onBuyItem.call(this);
    };

    // メモ欄の「変数変更X,Y」を解析して変数に代入する処理
    Scene_Shop.prototype.applyVariableChange = function(item) {
        const changeData = item.meta[variableChangeText];
        
        // 「変数変更X,Y」の形式を正規表現で抽出
        const regex = /変数変更(\d+),(\d+)/;
        const match = changeData.match(regex);

        if (match) {
            const variableId = parseInt(match[1]);  // X: 変数番号
            const value = parseInt(match[2]);       // Y: 代入する値

            // 変数にYの値を代入
            $gameVariables.setValue(variableId, value);
        }
    };
})();

Re: ショップで購入時にアイテムごとに変数を変更したい

Posted: 2025年3月05日(水) 21:32
by くろうど
* @help
* このプラグインは、アイテム購入時にそのアイテムのメモ欄を参照し、
* メモ欄に「変数変更X,Y」と記載されていた場合、指定した変数番号Xに値Yを代入します。
日本語部分を読んだだけなので動作するかは分かりませんが、
上記のようにヘルプにあるので、
メモ欄に変数変更: 34, 5
ではなく、
メモ欄に「変数変更X,Y」
と書く(コロンが不要)のではないでしょうか?

Re: ショップで購入時にアイテムごとに変数を変更したい

Posted: 2025年3月06日(木) 00:56
by ecf5DTTzl6h6lJj02
こんにちは。
Iron さんが書きました:ショップで購入時に任意の変数を変更するプラグインを作成したいです
例としてメモ欄に変数変更: 34, 5と書いた場合変数34番に5の値を代入することを想定しています
下はChatGPTで作成したものですが動作不全です
よろしくお願いいたします

コード: 全て選択

/*:
 * @target MZ
 * @plugindesc 購入時にアイテムのメモ欄に記載された変数を変更するプラグイン
 * @help
 * このプラグインは、アイテム購入時にそのアイテムのメモ欄を参照し、
 * メモ欄に「変数変更X,Y」と記載されていた場合、指定した変数番号Xに値Yを代入します。
 * 
 * 例: 武器Aのメモ欄:
 *   <変数変更1,10>  // 変数1に10を代入
 * 
 * @param VariableChangeText
 * @text 変数変更メッセージ
 * @desc メモ欄に「変数変更X,Y」と記載されている場合、指定された変数にYの値を代入します。
 * @default 変数変更
 */

(() => {
    const parameters = PluginManager.parameters('VariableChangeOnBuy');
    const variableChangeText = parameters['VariableChangeText'] || '変数変更';

    // アイテム購入時に変数を変更する処理
    const _Scene_Shop_onBuyItem = Scene_Shop.prototype.onBuyItem;
    Scene_Shop.prototype.onBuyItem = function() {
        // 購入するアイテム
        const item = this._buyWindow.item();

        // アイテムのメモ欄に「変数変更X,Y」が記載されているかを確認
        if (item && item.meta[variableChangeText]) {
            this.applyVariableChange(item);
        }

        // 通常の購入処理を実行
        _Scene_Shop_onBuyItem.call(this);
    };

    // メモ欄の「変数変更X,Y」を解析して変数に代入する処理
    Scene_Shop.prototype.applyVariableChange = function(item) {
        const changeData = item.meta[variableChangeText];
        
        // 「変数変更X,Y」の形式を正規表現で抽出
        const regex = /変数変更(\d+),(\d+)/;
        const match = changeData.match(regex);

        if (match) {
            const variableId = parseInt(match[1]);  // X: 変数番号
            const value = parseInt(match[2]);       // Y: 代入する値

            // 変数にYの値を代入
            $gameVariables.setValue(variableId, value);
        }
    };
})();
コードを読んでみると、
メモ欄に書いたパラメータの抽出の仕方がおかしく、
メモ欄に
<変数変更:変数変更34,5>
のように、書いていないと機能しないようになってしまっています。
それ以前に、
Scene_Shop.prototype.onBuyItem
という存在しないはずのメソッドを再定義して、その中で、変数の変更をしようとしているので、
ショップの処理から呼び出されることなく、何もしないプラグインになっていると思います。

手直ししてみましたので、お試しください。
ChangeVariablesOnBuy.js
(2.09 KiB) ダウンロード数: 2 回
使用方法は、プラグインのヘルプを参照してください。

Re: ショップで購入時にアイテムごとに変数を変更したい

Posted: 2025年3月06日(木) 10:03
by Iron
ありがとうございます
無事想定していた挙動になりました
制作が止まっていたので本当に助かります