xxx.jsonのデータ書き換えをセーブデータに反映させる方法

しーばや
記事: 1
登録日時: 2021年2月12日(金) 23:48

xxx.jsonのデータ書き換えをセーブデータに反映させる方法

投稿記事by しーばや » 2021年2月13日(土) 01:02

初投稿です。
初歩的な質問で恐縮ですが、ご回答いただければ幸いです。

■質問内容
以下 「やりたいこと」を達成するにはどういった実装が必要でしょうか。

■やりたいこと
タイトル画面のみ、プラグインコマンド指定の"効果音"(システム1/効果音)に変更し、以降GUI設定の"効果音"にしたい。
または
タイトル画面のみ、GUI指定の"効果音"とし、以降プラグインコマンド指定の"効果音"に変更したい。

■問題
プラグインコマンドでsystem.jsonのデータをプラグインで直接書き換えるだけだと、以下問題が生じる。

・プラグインコマンドで効果音を変更すると、ウィンドウを閉じるまでずっと変更後の効果音が反映されてしまう。
・ウィンドウを閉じて再起動し、セーブデータをロードすると、初期値(GUI指定の値)に戻ってしまう。

■自作プラグインの一部

コード: 全て選択

 * @command set
 * @text 効果音の変更
 * @desc タイプ:変更したい効果音のタイプを選択してください。
 *       ファイル名:変更後の効果音のファイル名を設定します。
 *
 *
 * @arg setype
 * @type string
 * @text タイプ
 * @desc 変更したい効果音のタイプインデックスを入力してください。
 *
 * @arg sefilename
 * @type string
 * @text ファイル名
 * @desc 変更したい効果音のファイル名を入力してください。
 *       拡張子は省略してください。
 *
 * ◆タイプインデックス一覧
 *  0:カーソル
 *  1:決定
 *  2:キャンセル
 *  3:ブザー
 *  4:装備
 *  5:セーブ
 *  6:ロード
 *  7:戦闘開始
 *  8:逃走
 *  9:敵攻撃
 * 10:敵ダメージ
 * 11:敵消滅
 * 12:ボス消滅1
 * 13:ボス消滅2
 * 14:味方ダメージ
 * 15:味方戦闘不能
 * 16:回復
 * 17:ミス
 * 18:回避
 * 19:魔法回避
 * 20:魔法反射
 * 21:ショップ
 * 22:アイテム使用
 * 23:スキル使用
 *
 
(() => {
    PluginManager.registerCommand(pluginName, "set", args => {
        seType = String(args.setype);
        seFileName = String(args.sefilename);

        $dataSystem.sounds[seType].name=seFileName;       
    });

})();


■その他
プラグインコマンドにて 「オーディオ選択」のプルダウンを表示できたらもっと嬉しいです……。

アバター
ムノクラ
記事: 2011
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

Re: xxx.jsonのデータ書き換えをセーブデータに反映させる方法

投稿記事by ムノクラ » 2021年2月13日(土) 12:44

しーばや さんが書きました:初投稿です。
初歩的な質問で恐縮ですが、ご回答いただければ幸いです。

■質問内容
以下 「やりたいこと」を達成するにはどういった実装が必要でしょうか。

■やりたいこと
タイトル画面のみ、プラグインコマンド指定の"効果音"(システム1/効果音)に変更し、以降GUI設定の"効果音"にしたい。
または
タイトル画面のみ、GUI指定の"効果音"とし、以降プラグインコマンド指定の"効果音"に変更したい。

■問題
プラグインコマンドでsystem.jsonのデータをプラグインで直接書き換えるだけだと、以下問題が生じる。

・プラグインコマンドで効果音を変更すると、ウィンドウを閉じるまでずっと変更後の効果音が反映されてしまう。
・ウィンドウを閉じて再起動し、セーブデータをロードすると、初期値(GUI指定の値)に戻ってしまう。

■自作プラグインの一部

コード: 全て選択

 * @command set
 * @text 効果音の変更
 * @desc タイプ:変更したい効果音のタイプを選択してください。
 *       ファイル名:変更後の効果音のファイル名を設定します。
 *
 *
 * @arg setype
 * @type string
 * @text タイプ
 * @desc 変更したい効果音のタイプインデックスを入力してください。
 *
 * @arg sefilename
 * @type string
 * @text ファイル名
 * @desc 変更したい効果音のファイル名を入力してください。
 *       拡張子は省略してください。
 *
 * ◆タイプインデックス一覧
 *  0:カーソル
 *  1:決定
 *  2:キャンセル
 *  3:ブザー
 *  4:装備
 *  5:セーブ
 *  6:ロード
 *  7:戦闘開始
 *  8:逃走
 *  9:敵攻撃
 * 10:敵ダメージ
 * 11:敵消滅
 * 12:ボス消滅1
 * 13:ボス消滅2
 * 14:味方ダメージ
 * 15:味方戦闘不能
 * 16:回復
 * 17:ミス
 * 18:回避
 * 19:魔法回避
 * 20:魔法反射
 * 21:ショップ
 * 22:アイテム使用
 * 23:スキル使用
 *
 
(() => {
    PluginManager.registerCommand(pluginName, "set", args => {
        seType = String(args.setype);
        seFileName = String(args.sefilename);

        $dataSystem.sounds[seType].name=seFileName;       
    });

})();


■その他
プラグインコマンドにて 「オーディオ選択」のプルダウンを表示できたらもっと嬉しいです……。


もっと熟練者が、すぐに返信するかと思っていたのですが、意外とつかないので、JavaScriptなんちゃって入門者が分かる範囲で返信します。

まず、セーブできるデータについてですが、下記の記事が参考になると思います。

https://qiita.com/krmbn0576/items/7d13d2c2f63d7dcf9300
プラグインとセーブ
「プラグインで新たに定義したデータをセーブしたい!」という時は、
$gameで始まるグローバル変数に保存しないといけません。
(色んな方のプラグインを見てると、基本的に$gameSystemに保存するのがお作法のようです)
何故かと言うと、先程も一度触れたようにセーブデータに保存されるのは(Configなどを除いては)
rpg_objects.jsに定義されているいくつかのオブジェクトだけだからです。


自分が素人なりに考えるに、ツクールのデータベースで設定する項目は、基本的に保存できないと思います。
そのデータベースがゲーム中で変更することができてしまったら、ニューゲームでのゲームへも影響が出る可能性があるからです。
ですので、ゲーム内データのみがセーブできる作りになっていると予想しています。

で、データベースで1項目しか設定できない箇所をどうやって動作を変えるか?という手法については、その設定値を実行する箇所を変更(上書きする)プラグインを作成することになると思います。

つまり、今回の要望では、その効果音を再生する関数を探し、全てを上書きする必要があります。

例えば、敵の消滅のSEを変更するプラグインを自分は作りましたが、下記のように作りました。
https://fungamemake.com/archives/12396

プラグインコマンドで、変更するプラグインも作れると思います。
ただ、それはゲーム変数なり、プラグイン内の変数なりに保存する必要があるのだと思います。

また、自分はプラグイン内にセーブデータへの反映方法の理解が足りないので、ゲーム変数などにデータを入れることで対処しています。
(多分、相当レベルが低い手段…)
---
JavaScriptの基本を学習せずにツクールのプラグインやスクリプトを使って横着してゲームを作ろうとしている人間です。
そのような者なので、適当な投稿をするかも知れません。
他の方の投稿を信用してください。

“MZ:質問” へ戻る