メモ欄からjsonデータの取得・表示について

ぼぶのすけ
記事: 17
登録日時: 2023年9月23日(土) 16:40

メモ欄からjsonデータの取得・表示について

投稿記事by ぼぶのすけ » 2023年10月20日(金) 22:23

お世話になっております。

現在くろうど様制作のKRD_StateGroupプラグインを使用してゲームを製作させていただいております。

このプラグインでは、メモ欄のデータを取得し、条件に合ったステートを戦闘時に発動させるといったものなのですが、その条件の達成具合を視認するためのウィンドウ制作に手こずっています。

やりたいこととしては、
・メニューに新しいコマンドである「スキルポイント(仮)」を追加
・追加したコマンドを選択するとアクター一覧が表示される
・アクター一覧には編成中のアクターが表示され、任意のアクターを選択するとスキルポイントウィンドウが表示される
・スキルポイントウィンドウに選択されたアクターが装備している防具のタググループと合計ポイント数を表示する。

といった動作を実装しようとしています。

この場合、
・アクターの着ている防具のメモ欄の取得
・取得したタググループの値を加算
・加算した値と対応するタググループの表示をする

といった工程が必要だと思うのですが、その方法をツクマテやその他ブログなどで調べてもなかなか解決しませんでした。

そこで、有識者の方々に直接教えていただけないかと思い、質問させていただきました。

文字のみでの説明ではわかりにくいと思いますので、実際にくろうど様にプラグインを製作していただいたときに提示させていただいた画像を張り付けておきます。
また、依頼時の会話内容もトピックのURLを張っておきますのでご参考までにご覧ください。

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

提示させていただいたスキルポイントウィンドウの完成イメージ↓
Desktop Screenshot 2023.10.03 - 23.00.14.38.png

上側のようなテキストでの表示が一番簡単なのかなと考えておりますが、
下側の表形式での表示のしかたもわかる方がいればご教授いただきたいです。

製作依頼時のくろうど様との会話内容↓
https://tm.lucky-duet.com/viewtopic.php?f=49&t=14274

くろうど様制作、KRD_StateGroup.jsのリンク↓
https://github.com/kuroudo119/RPGMV-Plugin/blob/master/KRD_StateGroup.js

ecf5DTTzl6h6lJj02
記事: 469
登録日時: 2018年12月23日(日) 13:55

Re: メモ欄からjsonデータの取得・表示について

投稿記事by ecf5DTTzl6h6lJj02 » 2023年10月21日(土) 08:47

こんにちは。
ぼぶのすけ さんが書きました:お世話になっております。

現在くろうど様制作のKRD_StateGroupプラグインを使用してゲームを製作させていただいております。

このプラグインでは、メモ欄のデータを取得し、条件に合ったステートを戦闘時に発動させるといったものなのですが、その条件の達成具合を視認するためのウィンドウ制作に手こずっています。

やりたいこととしては、
・メニューに新しいコマンドである「スキルポイント(仮)」を追加
・追加したコマンドを選択するとアクター一覧が表示される
・アクター一覧には編成中のアクターが表示され、任意のアクターを選択するとスキルポイントウィンドウが表示される
・スキルポイントウィンドウに選択されたアクターが装備している防具のタググループと合計ポイント数を表示する。

といった動作を実装しようとしています。

この場合、
・アクターの着ている防具のメモ欄の取得
・取得したタググループの値を加算
・加算した値と対応するタググループの表示をする

といった工程が必要だと思うのですが、その方法をツクマテやその他ブログなどで調べてもなかなか解決しませんでした。

そこで、有識者の方々に直接教えていただけないかと思い、質問させていただきました。

文字のみでの説明ではわかりにくいと思いますので、実際にくろうど様にプラグインを製作していただいたときに提示させていただいた画像を張り付けておきます。
また、依頼時の会話内容もトピックのURLを張っておきますのでご参考までにご覧ください。

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

提示させていただいたスキルポイントウィンドウの完成イメージ↓
Desktop Screenshot 2023.10.03 - 23.00.14.38.png
上側のようなテキストでの表示が一番簡単なのかなと考えておりますが、
下側の表形式での表示のしかたもわかる方がいればご教授いただきたいです。

製作依頼時のくろうど様との会話内容↓
https://tm.lucky-duet.com/viewtopic.php?f=49&t=14274

くろうど様制作、KRD_StateGroup.jsのリンク↓
https://github.com/kuroudo119/RPGMV-Plugin/blob/master/KRD_StateGroup.js

くろうど様のプラグインの内容を見る限り、
アクターが装備している各防具のメモに設定されているポイントの内容は、

コード: 全て選択

$gameActors.actor(アクターID).armorPointList()

もしくは、

コード: 全て選択

$gameParty.members()[隊列のインデックス].armorPointList()

タググループごとの合計値は、

コード: 全て選択

$gameActors.actor(アクターID).armorPoint()

もしくは、

コード: 全て選択

$gameParty.members()[隊列のインデックス].armorPoint()

で取得できるようになっているようです。
※隊列のインデックスは先頭が 0 なので注意

ただし、この関数は、防具のメモ欄しか見ていません。
表に、武器とありますが、武器にもポイントを設定するのであれば、
プラグインに以下の変更が必要になります。

プラグインを JavaScript を編集できるソフト(お勧めは VisualStudioCode)で開き、
Game_Actor.prototype.armorPointList という関数の内容を(おそらく102行目あたりにあります)

コード: 全て選択

Game_Actor.prototype.armorPointList = function(tag = TAG_POINT) {
   return this.equips().filter(equip => equip && equip.meta[tag]).map(equip => JSON.parse(equip.meta[tag]));
};

に置き換えてください。

とりあえず、これをすればアクターの武器を含む、各装備品のポイントと、
そのタググループごとの合計値は取得できるようになると思います。

以上、ご確認ください。
ぼぶのすけ
記事: 17
登録日時: 2023年9月23日(土) 16:40

Re: メモ欄からjsonデータの取得・表示について

投稿記事by ぼぶのすけ » 2023年10月21日(土) 13:03

こんにちは。

返信ありがとうございます。

いただいたコードを実装してみたのですが、エラーが発生してしまったので解決に関するアドバイスを頂けますと幸いです。

エラー内容↓
TypeError: Cannot read property 'reduce' of undefined
at Game_Actor.armorPoint (KRD_StateGroup.js:115)
at Scene_Menu.commandStateGroupInfo (KRD_StateGroup.js:171)
at Window_MenuCommand.Window_Selectable.callHandler (rpg_windows.js:902)
at Window_MenuCommand.Window_Command.callOkHandler (rpg_windows.js:1426)
at Window_MenuCommand.Window_Selectable.processOk (rpg_windows.js:1156)
at Window_MenuCommand.processOk (rpg_windows.js:1683)
at Window_MenuCommand.Window_Selectable.onTouch (rpg_windows.js:1086)
at Window_MenuCommand.Window_Selectable.processTouch (rpg_windows.js:1054)
at Window_MenuCommand.Window_Selectable.processTouch (SceneSoundTest.js:750)
at Window_MenuCommand.Window_Selectable.update (rpg_windows.js:986)

該当コード(KRD_StateGroup.js:115)↓

コード: 全て選択

Game_Actor.prototype.armorPoint = function(groupName, armorPointList) {
   return armorPointList.reduce((r, point) => r + (point[groupName] || 0), 0);
};


該当コード(KRD_StateGroup.js:171)↓

コード: 全て選択

console.log("Actor Name: " + actor.name() + "TagPoint: " + $gameActors.actor(1).armorPoint());


よろしくお願いいたします。
ecf5DTTzl6h6lJj02
記事: 469
登録日時: 2018年12月23日(日) 13:55

Re: メモ欄からjsonデータの取得・表示について

投稿記事by ecf5DTTzl6h6lJj02 » 2023年10月21日(土) 16:23

ぼぶのすけ さんが書きました:こんにちは。

返信ありがとうございます。

いただいたコードを実装してみたのですが、エラーが発生してしまったので解決に関するアドバイスを頂けますと幸いです。

エラー内容↓
TypeError: Cannot read property 'reduce' of undefined
at Game_Actor.armorPoint (KRD_StateGroup.js:115)
at Scene_Menu.commandStateGroupInfo (KRD_StateGroup.js:171)
at Window_MenuCommand.Window_Selectable.callHandler (rpg_windows.js:902)
at Window_MenuCommand.Window_Command.callOkHandler (rpg_windows.js:1426)
at Window_MenuCommand.Window_Selectable.processOk (rpg_windows.js:1156)
at Window_MenuCommand.processOk (rpg_windows.js:1683)
at Window_MenuCommand.Window_Selectable.onTouch (rpg_windows.js:1086)
at Window_MenuCommand.Window_Selectable.processTouch (rpg_windows.js:1054)
at Window_MenuCommand.Window_Selectable.processTouch (SceneSoundTest.js:750)
at Window_MenuCommand.Window_Selectable.update (rpg_windows.js:986)

該当コード(KRD_StateGroup.js:115)↓

コード: 全て選択

Game_Actor.prototype.armorPoint = function(groupName, armorPointList) {
   return armorPointList.reduce((r, point) => r + (point[groupName] || 0), 0);
};


該当コード(KRD_StateGroup.js:171)↓

コード: 全て選択

console.log("Actor Name: " + actor.name() + "TagPoint: " + $gameActors.actor(1).armorPoint());


armorPoint メソッドでそのまま、アクターの装備している装備品に設定されているポイントの合計を取得できるものと勘違いしておりました。失礼いたしました。

Game_Actor.prototype.armorPoint と いうメソッドの後ろあたりに、以下のメソッドを挿入してください。

コード: 全て選択

Game_Actor.prototype.getArmorPointSums = function() {
   const armorPointList = this.armorPointList();
   const armorStateList = Array.from(this.armorStateList(armorPointList));
   const pointSums = {};
   armorStateList.forEach(groupName => {
      pointSums[groupName] = this.armorPoint(groupName, armorPointList);
   });
   return pointSums;
};

ポイントの合計を取得するためのメソッドです。

コード: 全て選択

$gameActors.actor(アクターID).getArmorPointSums()

もしくは、

コード: 全て選択

$gameParty.members()[隊列のインデックス].getArmorPointSums()

で、取得できると思います。

ご確認ください。
ecf5DTTzl6h6lJj02
記事: 469
登録日時: 2018年12月23日(日) 13:55

Re: メモ欄からjsonデータの取得・表示について

投稿記事by ecf5DTTzl6h6lJj02 » 2023年10月21日(土) 20:51

こんばんは。

現状、防具ごとのスキルポイントの設定内容しか取得できませんが、
スキルグループに対しての各装備のスキルポイントを表にしたいわけですから、
そういう形式で、スキルポイントを取得できないとだめだと思いましたので、
プラグインにそういう内容を追加するようなコード、コード変更を追記します。

まず、前々回の返信で、変更してもらったコード

コード: 全て選択

Game_Actor.prototype.armorPointList = function(tag = TAG_POINT) {
   return this.equips().filter(equip => equip && equip.meta[tag]).map(equip => JSON.parse(equip.meta[tag]));
};

を、以下に変更してください。

コード: 全て選択

Game_Actor.prototype.armorPointList = function(tag = TAG_POINT) {
   return this.equips().map(equip => equip && equip.meta[tag] ? JSON.parse(equip.meta[tag]) : {});
};

次に、前回の返信で挿入してもらった、
Game_Actor.prototype.getArmorPointSums のメソッドの前か後ろに
以下のメソッドを挿入してください。

コード: 全て選択

Game_Actor.prototype.getArmorPointsSeparately = function() {
   const equipNames = this.equips().map(equip => equip ? equip.name : '装備なし');
   const armorPointList = this.armorPointList();
   const armorStateList = Array.from(this.armorStateList(armorPointList));
   const points = {}
   armorStateList.forEach(groupName => {
      points[groupName] = [];
      armorPointList.forEach((list) => {
         points[groupName].push(list[groupName] || 0)
      });
   });
   return points;
};

コード: 全て選択

$gameActors.actor(アクターID).getArmorPointsSeparately()

もしくは、

コード: 全て選択

$gameParty.members()[隊列のインデックス] .getArmorPointsSeparately()

などとして、メソッドを実行すると、

{
グループ名 1: [装備スロット1のポイント, … 装備スロット nのポイント]

グループ名 n: [装備スロット1のポイント, … 装備スロット nのポイント]
}

という感じ、具体的に例を出すと、

{
スキルA: [10, 10, 10, 10, 0],
スキルB: [20, 20, 20, 20, 0],
スキルC: [30, 30, 30, 30, 0],
スキルD: [40, 40, 40, 40, 0]
}

という感じで、データが返ってきます。
※見やすいように改行しています。

このデータを利用すれば、表が作れるのではないかなと思います。

オブジェクトに関して知識があれば、返ってきたデータから必要な部分を抜き出す方法はわかると思いますが、
もし、どうするのかわからないという場合は、お聞きください。

以上、ご確認ください。
ぼぶのすけ
記事: 17
登録日時: 2023年9月23日(土) 16:40

Re: メモ欄からjsonデータの取得・表示について

投稿記事by ぼぶのすけ » 2023年10月21日(土) 23:07

こんばんは。

返信ありがとうございます。

必要な部分を抜き出す方法についてですが、素人なもので、何もわからない状態です...。
もしよければ、抜き出し方を教えていただけますでしょうか。

よろしくお願いいたします。
ecf5DTTzl6h6lJj02
記事: 469
登録日時: 2018年12月23日(日) 13:55

Re: メモ欄からjsonデータの取得・表示について

投稿記事by ecf5DTTzl6h6lJj02 » 2023年10月22日(日) 04:46

ぼぶのすけ さんが書きました:こんばんは。

返信ありがとうございます。

必要な部分を抜き出す方法についてですが、素人なもので、何もわからない状態です...。
もしよければ、抜き出し方を教えていただけますでしょうか。

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

前述の通り、
getArmorPointsSeparately メソッドで取得できるデータの中身は、
スキルグループ名 1: 各装備品のポイントの配列 1, … スキルグループ名 n: 各装備品のポイントの配列 n
という形になっています。
変数に取得した内容を格納した場合、
変数名['取得したいスキルグループ名'] もしくは 変数名.取得したいスキルグループ名 と記述すると、
指定したスキルグループ名に対応した配列が取得されます。

例えば、プラグイン上で、

コード: 全て選択

const armorPoints = $gameActors.actor(1).getArmorPointsSeparately();

と書いて、armorPoints という変数に、各スキルグループ、各装備の設定ポイントを格納した場合、

コード: 全て選択

armorPoints['取得したいスキルグループ名']

と書くと、装備品ごとの設定ポイントを格納した配列が返ってきます。
配列の中の値は、装備スロット順に並んでいるので、

コード: 全て選択

armorPoints['取得したいスキルグループ名'][取得したい装備スロットの番号]

もしくは、

コード: 全て選択

armorPoints.取得したいスキルグループ名[取得したい装備スロットの番号]

で、任意の装備スロットの装備に設定されているポイントを取得できます。
先頭のスロットが 0 番であることに注意してください。

しかしながら armorPoints のキーとして、どんなスキルグループ名があるのかは、
状況に応じて、違うので、どんなキーがあるのかを、取得する必要があります。
Object.keys((オブジェクト型の)変数名) と記述すると、設定されているキー名の配列が返ってくるので、

コード: 全て選択

const groupName= Object.keys(armorPoints)

などとして、キー名の配列を変数に格納しておき、

コード: 全て選択

armorPoints[groupName[任意のインデックス]][取得したい装備スロットの番号]

で、ポイント設定を取得してください。
この場合、 変数名.取得したいキー名 という形は使えないので注意してください。

以上となりますが、
分からない、うまくいかないという部分がありましたら、
ご質問ください。
ぼぶのすけ
記事: 17
登録日時: 2023年9月23日(土) 16:40

Re: メモ欄からjsonデータの取得・表示について

投稿記事by ぼぶのすけ » 2023年10月22日(日) 12:38

こんにちは。

ご返信ありがとうございます。

早速教えていただいた通りObject.keysのタイプでプラグインを書き、変数40番にarmorPointsを作成して実行してみたのですが、下記のようなエラーが出てしまいました。

エラー内容↓
eferenceError: armorPoints is not defined
at Scene_Menu.commandStateGroupInfo (KRD_StateGroup.js:192)
at Window_MenuCommand.Window_Selectable.callHandler (rpg_windows.js:902)
at Window_MenuCommand.Window_Command.callOkHandler (rpg_windows.js:1426)
at Window_MenuCommand.Window_Selectable.processOk (rpg_windows.js:1156)
at Window_MenuCommand.processOk (rpg_windows.js:1683)
at Window_MenuCommand.Window_Selectable.onTouch (rpg_windows.js:1086)
at Window_MenuCommand.Window_Selectable.processTouch (rpg_windows.js:1054)
at Window_MenuCommand.Window_Selectable.processTouch (SceneSoundTest.js:750)
at Window_MenuCommand.Window_Selectable.update (rpg_windows.js:986)
at rpg_core.js:7035

現在わからないこととしましては、
・先ほど教えていただいた

コード: 全て選択

const groupName= Object.keys(armorPoints)

と、

コード: 全て選択

armorPoints[groupName[任意のインデックス]][取得したい装備スロットの番号]

以外にも何か記載する必要があるか。
・任意のインデックスというのは設定した変数の値のものなのか、そうでないのか。

の二つとなっております。

私が無知なもので、オブジェクト型の変数というものすらいまいちわかっておらず、このコードがどのような挙動なのかすら全く分からずといった状態となってしまっております。

お手数おかけしますが、またお時間あるときに教えていただければ幸いです。

参考になるかはわかりませんが、現状のコードを張り付けておきます。
挙動としては、メニューに追加されたTESTコマンドを選択するとコンソールにパーティーリーダーが持つarmorPointsの値が出力されるというものです。

素人が書いた読みにくいコードですが、これを見てどこを直せばいいか教えていただけると幸いです。

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

現状のコード↓
KRD_StateGroup.js
(6.45 KiB) ダウンロード数: 2 回
ecf5DTTzl6h6lJj02
記事: 469
登録日時: 2018年12月23日(日) 13:55

Re: メモ欄からjsonデータの取得・表示について

投稿記事by ecf5DTTzl6h6lJj02 » 2023年10月22日(日) 18:07

こんにちは。

前回、
任意の装備品に設定された、任意のスキルグループのポイントを取得する方法として解説しましたが、
正確には、スキルポイントを 行としてスキルグループ、列として各装備品のポイントをとった表(のようなもの)を
表示できるようにデータを取得するための手順です。

改めて、手順を解説します。

  1. 任意の変数に getArmorPointsSeparately メソッドの結果を格納する。
    前回の返信の

    コード: 全て選択

    const armorPoints = $gameActors.actor(1).getArmorPointsSeparately();

    がこの処理に相当します。
    上記コードの場合
    armorPoints という変数を作り、
    アクターID 1 のアクターの各装備品に設定されているポイントを取得して格納しています。
    ご提示いただいたプラグインの内容だと、最初に、リーダー(パーティの戦闘のアクター)を取得していますので、
    その後に、

    コード: 全て選択

    const armorPoints = actor.getArmorPointsSeparately();

    と記述していただくと、ポイントのデータを格納できるはずです。

  2. 存在するグループ名の配列を取得する。
    getArmorPointsSeparately メソッドから返ってくるデータは、
    グループ名: ポイントの配列 という形式で、記述されているとお伝えしました。
    ただ、アクターの装備品に設定されている、グループのものしか記述されないので、
    装備状況によって、どのグループ名が存在するのか分かりません。
    そのために、 ポイントのデータを格納した変数(オブジェクト)に対して、どのグループ名があるのか、取得してくる必要があります。
    前回の返信の

    コード: 全て選択

    const groupName = Object.keys(armorPoints)

    というのがその処理に相当します。
    上記では、groupName という変数をつくり、
    armorPoints に存在するグループ名の配列を格納しています。
    例えば、装備全体で、
    スキルA、スキルB、スキルC、スキルD と4つのスキルグループのポイントが設定されていた場合、
    groupName には ["スキルA", "スキルB", "スキルC", "スキルD"] という配列が格納されます。

    ご提示いただいたプラグインにはすでにこの処理があります。
    1. の処理がされていないために、エラーが起こっているので、
    1. の処理が正しく書かれていれば この処理はエラーを起こさず実行されます。

  3. 各グループ名の、各装備品の値を取得する。
    グループ名の配列の各要素を使用して、ポイントの配列を取得します。
    前回の返信で、
    ポイントのデータが入っている変数名['取得したいスキルグループ名'] でデータを取得できると書きました。
    (他の変数に入っている、スキルグループ名を 取得したいスキルグループ名 に使う場合はこの形で取得しないといけません)
    例えば、
    ポイントのデータが armorPoints という変数、
    グループ名の配列が groupName という変数に格納されているとして、

    コード: 全て選択

    armorPoints[groupName[0]]

    という記述をすると、
    groupName の先頭(プログラムの世界では、先頭が0)に入っているグループ名 のデータ(装備スロット毎のポイントの配列)を取得できます。
    groupName の添え字として、存在しないインデックス番号を指定すると undefined という値が返ってきてしまうので、注意しましょう。

    上記コードで取得できるのは装備スロット毎のポイントの配列なので、特定の装備スロットのポイントを取得する場合、どの装備スロットのデータを取得するのかを表す添え字が必要になります。
    例えば、上記のように、ポイントのデータや、グループ名の配列が変数に入っている場合、

    コード: 全て選択

    armorPoints[groupName[0]][0]

    と記述した場合、
    先頭の装備スロット(通常だと武器) の groupName の先頭に入っているグループ名のポイントが取得できます。
    前述の通り groupName の添え字として、存在しないインデックス番号を指定すると、
    armorPoints[groupName[インデックス]] の部分が undefined になって、エラーが発生するので注意してください。
一旦ここまででにします。
まずは、この内容を理解できるようにしてください。
ここが分からない、これがしたいけどどうすればいいのか、ということは質問してください。

しかし、JavaScript の知識が全くない状態で、 ChatGPT に出力させたプログラムや、聞きかじりのコード
を使用して、プラグインを書くのは、かなり無謀です。
JavaScript の解説書なり、
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference
のチュートリアル 初級編などを読んで、
基本的な 変数の使い方だったり、オブジェクトって何? という理解をしておいたほうが良いと思います。
ぼぶのすけ
記事: 17
登録日時: 2023年9月23日(土) 16:40

Re: メモ欄からjsonデータの取得・表示について

投稿記事by ぼぶのすけ » 2023年10月23日(月) 00:20

こんばんは。

ご返信ありがとうございます。

今回の返信でいただいた情報により、

・装備全体が保有する値の表示 [groupName[?]]に格納された値を0,0,3,0,0,0 のような形式で出力
・任意装備が保有する値の表示 [groupName[?]][!]において、スロット番号!が持つ?の値を 3 のような形で出力
・先頭にグループ名を表示 グループ名: ○○ 値: 0,0,3,0,0,0のような形で出力

上記三つを実装することができました。ありがとうございます。

現状複数のグループがgroupNameに格納されている場合、

コード: 全て選択

console.log("グループ名: " + groupName[0] + " " + "値: " + armorPoints[groupName[0]]);
console.log("グループ名: " + groupName[1] + " " + "値: " + armorPoints[groupName[1]]);
console.log("グループ名: " + groupName[2] + " " + "値: " + armorPoints[groupName[2]]);

のような形で出力しているのですが、この場合groupName[1]までしか値が入っていない場合、groupName[2]以降には undefined となり見栄え(?)が少し悪かったり、groupName[6]まで値が入っていた場合にその値が見えないということが起こってしまいます。

理想としては、groupNameにいくつまで値が入っているかを確認し、入っている値だけ自動で文字列を出力されるという処理を作りたいと思っています。

例として、groupName[3]まで値が入っているとしたら、自動で

グループ名: A 値: ○,○,○,○,○,○
グループ名: B 値: ○,○,○,○,○,○
グループ名: C 値: ○,○,○,○,○,○
グループ名: D 値: ○,○,○,○,○,○

のような形で出力されるイメージです。

実際にこのような事は可能なのでしょうか??
お教え頂ければ幸いです。

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

“MV:質問” へ戻る