【解決】アイテム 武器 防具の入手について

omimura
記事: 4
登録日時: 2020年8月24日(月) 02:44

【解決】アイテム 武器 防具の入手について

投稿記事by omimura » 2021年6月14日(月) 16:22

質問なのですが、アイテム 武器 防具 ランダム入手についてです

例えばですが、アイテム若しくは、武器若しくは、防具のID1~50だったり、ID10~25の中からランダムに入手できるといった感じに出来る方法を教えてください。
最後に編集したユーザー omimura on 2021年6月14日(月) 22:07 [ 編集 1 回目 ]

アバター
アーヴェル
記事: 48
登録日時: 2019年5月18日(土) 12:02

Re: アイテム 武器 防具の入手について

投稿記事by アーヴェル » 2021年6月14日(月) 20:28

$gameVariables.value(1) は ゲームとエディタで使用しているの変数1番のことです。
以下のスクリプトは変数1番に入っている数値と同じIDのアイテムや武具を入手しなさい。といった感じです。
なので、直前に変数の操作で乱数を作っておけばその範囲の中でランダムということになりますね。
後はスクリプトにコピペして頂ければ。乱数を参照する変数を変えたければ(1)の部分を(10)とかにすれば、
変数10番の値を参照することになります。

アイテム↓
Game_Interpreter.prototype.command126(params2 = [$gameVariables.value(1),0,0,1,false]);

武器↓
Game_Interpreter.prototype.command127(params2 = [$gameVariables.value(1),0,0,1,false]);

防具↓
Game_Interpreter.prototype.command128(params2 = [$gameVariables.value(1),0,0,1,false]);


スクリプトでの乱数生成がわかるならスクリプト内で

var x = Math.floor( Math.random() * 10)+1;
Game_Interpreter.prototype.command126(params2 = [x,0,0,1,false]);

こんな感じにすればゲーム内の変数も使わなくても出来ますねー。
omimura
記事: 4
登録日時: 2020年8月24日(月) 02:44

Re: アイテム 武器 防具の入手について

投稿記事by omimura » 2021年6月14日(月) 20:54

アーヴェル様丁寧な回答と説明ありがとうございます。
書かれている通りに乱数入力によって指定したIDのアイテムをランダムで入手出来ました。

あと1点よろしいでしょうか?
書き忘れてしまったのですが、この状態で入手したIDのアイテム名とアイテムのアイコンの表示は可能でしょうか?
アバター
アーヴェル
記事: 48
登録日時: 2019年5月18日(土) 12:02

Re: アイテム 武器 防具の入手について

投稿記事by アーヴェル » 2021年6月14日(月) 21:19

とりあえずランダムで中身が変わる宝箱を開けた後、文章の表示を行いたい。
という事だと仮定してお話します。

この場合なら先の例で入手に変数を用いて、
その変数をそのままアイコンの取得やアイテムの名称を取得するのに使うのが良いでしょうか。

変数の操作 スクリプト に以下のスクリプトをコピペすると、
例えばアイテムの名前であれば、アイテム名称が変数内に格納されます。
変数1にアイテムIDを入れている場合は、ひとまず別の変数に入れるほうが良いでしょうか。
変数2等に格納して、制御文字で呼び出します。

同様にアイコンの場合は、変数の操作、スクリプトに以下のスクリプトをコピペすると、
数値が格納されるので、\i[\v[3]] のような入れ子にした制御文字で呼び出せば良いのではないでしょうかー。

\i[\v[3]] \v[2] を入手した!

みたいな感じですかねえ。



アイテムの名前
$dataItems[$gameVariables.value(1)].name
アイテムのアイコンID
$dataItems[$gameVariables.value(1)].iconIndex

武器の名前
$dataWeapons[$gameVariables.value(1)].name
武器のアイコンID
$dataWeapons[$gameVariables.value(1)].iconIndex

防具の名前
$dataArmors[$gameVariables.value(1)].name
防具のアイコンID
$dataArmors[$gameVariables.value(1)].iconIndex
omimura
記事: 4
登録日時: 2020年8月24日(月) 02:44

Re: アイテム 武器 防具の入手について

投稿記事by omimura » 2021年6月14日(月) 22:07

早い対応ありがとうございます。
何分初心者なもので色々お手数をおかけしました。
解説してくださったものを参考に色々試してみようと思います。

この度は丁寧な対応とてもありがとうございました。
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 【解決】アイテム 武器 防具の入手について

投稿記事by Plasma Dark » 2021年6月15日(火) 12:55

解決済みのところ、失礼します。

Game_Interpreter.prototype.command126(params2 = [$gameVariables.value(1),0,0,1,false]);


流石にこのコードを初心者に書かせるのは見過ごせないので。

Game_Interpreterインスタンスの状態に依存しない処理を行うメソッドなので動くには動きますが、それであればわざわざGame_Interpreterのメソッドを使う意味がなさそうです。
もう少し読みやすくしてしまいましょう。

コード: 全て選択

// アイテムを入手する
const itemId = $gameVariables.value(1);
$gameParty.gainItem($dataItems[itemId], 1);

// 武器を入手する
const weaponId = $gameVariables.value(1);
$gameParty.gainItem($dataWeapons[weaponId], 1);

// 防具を入手する
const armorId = $gameVariables.value(1);
$gameParty.gainItem($dataArmors[armorId], 1);
アバター
アーヴェル
記事: 48
登録日時: 2019年5月18日(土) 12:02

Re: 【解決】アイテム 武器 防具の入手について

投稿記事by アーヴェル » 2021年6月15日(火) 17:34

Plasma Dark さん、どうもありがとうございます。



ランダム宝箱のようなものを作りたいという事は恐らくランダムダンジョン系で大量に設置する事も考えられる。
テンポアップの為に、アイテム入手に反応するポップアップ系のプラグインをいずれ借りるかも知れない。
自分の使っているポップアップ系プラグインは Game_Interpreter じゃないと反応しなかった。
もしかしたら同じものを借りる事があるかもしれない。

スクリプト アイテムの入手

と調べれば、ツクールMVスクリプトリファレンスwiki 様で
$gameParty.gainItem($dataItems[3], 12) というコードがすぐに見つけられるが、
自分のケースだと、それでは問題が解決せず、結果的に解決出来た方の
Game_Interpreter.prototype.command126 の方は見つけにくかった。
そして見つけられても凡例が無い為、見つけた後に結構悩んだ。
どちらのコードでもほぼコピペで使う分には難易度の差もほぼ無いだろう。
であれば見つけにくいこっちのコードとその書き方を示してあげる方が、
今後悩む時間が少なくて済むんじゃないかなぁ。

……という憶測混じりで私情を挟んだ理由だったので説明も省いてしまいましたが、
結果的には初心者さんに書かせるのは見過ごせないものだったようで。


適切でない解答、失礼致しました。


スクリプトに関してPlasma Darkさんの方がずっとお詳しいので、
自分ではなく Plasma Dark さん を参考になさってくださいー。
アバター
WTR
記事: 559
登録日時: 2015年12月22日(火) 19:14

Re: 【解決】アイテム 武器 防具の入手について

投稿記事by WTR » 2021年6月15日(火) 19:41

余談の余談みたいな話ですが…
command126 を直に呼びたい場合であっても
イベントコマンドのスクリプト欄に記述するのであれば

コード: 全て選択

this.command126([$gameVariables.value(1),0,0,1,false]);

でいいような気がします。
厳密には同じではないですが結果は変わらないと思います。
その違いについて私もちょっと前にPlasma Darkさんにご指摘頂くまで
考えたこともなかったような話なので偉そうに言うことでもないのですが…

ちょっとだけ短くもできますよ、とだけ。
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
omimura
記事: 4
登録日時: 2020年8月24日(月) 02:44

Re: 【解決】アイテム 武器 防具の入手について

投稿記事by omimura » 2021年6月15日(火) 20:37

解決済みですがとりあえず…

Plasma Darkさん アーヴェルさん  WTRさん

色々方法があり、参考になりました。
最初にアーヴェルさんが書いていただいたのでも、自分が使う上で必要な条件は満たされてたのでとてもありがたかったです。
Plasma Darkさんも自分が初心者であることを気遣った上で使いやすさを考えてくださり、ありがとうございます。
WTRさんもやり方の一つを示してくださり、ありがとうございます。

今の自分では使いやすさ等も読み方もわからない段階ですが、自分の拙さに対して丁寧に答えていただいたおかげでこの度は本当に助かりました。
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 【解決】アイテム 武器 防具の入手について

投稿記事by Plasma Dark » 2021年6月15日(火) 22:37

ランダム宝箱のようなものを作りたいという事は恐らくランダムダンジョン系で大量に設置する事も考えられる。
テンポアップの為に、アイテム入手に反応するポップアップ系のプラグインをいずれ借りるかも知れない。
自分の使っているポップアップ系プラグインは Game_Interpreter じゃないと反応しなかった。
もしかしたら同じものを借りる事があるかもしれない。


確かに、 TinyGetInfoWndMZ.js 等のイベントコマンドによるアイテム入手をトリガーにした機能を使おうとすると、 Game_Interpreter のメソッドを呼ばざるを得ないですね。

見過ごせないと書いたのは、 comandXXX を呼び出すコードの読みにくさも一つの理由ではありますが、もうひとつ、 Game_Interpreter インスタンスの状態に依存する拡張を入れていた場合に不具合を起こすためです。
Game_Intepreter.prototype は、イベント実行に使われている Game_Interpreter インスタンスではありません。

マップ上のイベントであれば、 Game_Map インスタンスが持っているものかもしれませんし、あるいはイベントが持っているものかもしれません。
Game_Interpreter インスタンスはコード上の数カ所で作られ、それらはそれぞれ別の実体です。
(詳しくは rmmz_objects.js 内を new Game_Interpreter でテキスト検索してみてください)

イベントコマンドのスクリプトを実行しているのも Game_Interpreter インスタンスで、その中で同一インスタンスを参照するためには this を用いることができます。
つまり、変数1番の値をIDとして持つアイテムを、イベントコマンドで入手するのと同じことをするためには、スクリプトに下記のように書けます。

コード: 全て選択

this.command126([$gameVariables.value(1),0,0,1]);


アーヴェルさんの書き方では、例えばイベントが実行されているマップIDによって処理を変えるようなプラグインが入っていた場合に問題になります。
下記は、イベントが実行されたマップではイベントコマンドによるアイテムの入手数(と消費数)が2倍になるプラグインです。

コード: 全て選択

(() => {
  'use strict';
  const _Game_Interpreter_command126 = Game_Interpreter.prototype.command126;
  Game_Interpreter.prototype.command126 = function (params) {
    const value = this.operateValue(params[1], params[2], params[3]);
    const rate = this._mapId === 1 ? 2 : 1;
    const newParams = [
      params[0],  // itemId
      0,          // operation: 加算
      0,          // operandType: 定数
      value * rate  // 実際の入手数
    ];
    return _Game_Interpreter_command126.call(this, newParams);
  };
})();


Game_Interpreter.prototype を直接参照してしまうと、そのインスタンスの _mapId は設定されていないので、マップID1番にいたとしても入手数が増えません。

そして、アイテムランダム入手についてはすでにプラグインがあるようです。
https://github.com/nuun888/MZ/blob/mast ... omItems.js
こちらは Game_Interpreter インスタンスを新しく作っていますね。

“MZ:質問” へ戻る