ページ 11

[解決済]敵のアイテムドロップ率について

Posted: 2018年10月05日(金) 15:24
by RefIzumi
お世話になっております。
今回はアイテムドロップ率について、調べ方をお伺いしたいと思います。
アイテムドロップ率、と言っても、データベースの敵キャラの設定で行うドロップ率ではなく、
ステートの特徴で「アイテム入手率2倍」というのがあると思うのですが、それが今何倍になっているか
を知る方法が知りたいと思っています。

というのも、アイテム入手率が2倍だけというのもつまらないな、と思い、下のような
アイテムドロップ率が倍々になってくようなプラグインを他のプラグイン様を見様見真似で作ってみたのです。
droprateFluctuation.js
(5.11 KiB) ダウンロード数: 5 回


ですが、いざ、テストと思ったときに、アイテムドロップ率を知る方法が分からず詰んでしまいました。
ドロップ率がrpg_object.jsのGame_Enemy.prototype.dropItemRateで作られているらしいことは
プラグインを作る際に分かってはいるのですが、これを参照する方法が分かりません。
敵キャラの情報として経験値などなら、$dataEnemies[1].expで取れると
調べられたので、同じように$dataEnemies[1].dropItemRateとしてテストしてみたのですが、
返ってくる値は0でした。上記のプラグイン外して試しても同じでした。
Game_Enemy.prototype.dropItemRateを見る限りreturn $gameParty.hasDropItemDouble() ? 2 : 1;とあるので
最低でも返ってくる値は1ではないかと思うので、上手くdropItemRateを参照できていないように思われます。

しょぼしょぼの初心者な質問で申し訳ないのですが、どなたか分かればお教えいただけないでしょうか。

Re: 敵のアイテムドロップ率について

Posted: 2018年10月05日(金) 17:03
by 剣崎 宗二
(多少ながらプログラムの心得があると仮定して解説させていただきます)

この状況に於いて$dataEnemies[1].dropItemRateが0を返す理由は以下の2つとなります。
1. $dataEnemies[1]はGame_EnemyタイプのObjectではない。よって$dataEnemies[1].dropItemRateはそもそも設定されておらず、空である。
2. .droprateと言う呼び出し方ではfunctionを実行しない。
たとえ空でなかったとして、

コード: 全て選択

function() {
    var parameters = ....

と言ったようなテキストが出力されるだけとなります。

ではどうすれば良いかと言うと、そちらのコードを観察する限り個別のenemyのデータは参照していないので…

コード: 全て選択

var dummy = new Game_Enemy(1, 0, 0);
var x = dummy.dropItemRate();  //←xがドロップ倍率となります

で出せるかと思います(出先の為実際にコードを走らせて居らず、推定である事をご了承ください)

また、この場合出てくるのはドロップ率の「倍率」であって、個別アイテムの実際のドロップ率ではない事にご留意ください。

Re: 敵のアイテムドロップ率について

Posted: 2018年10月05日(金) 20:41
by RefIzumi
素早い返信ありがとうございます!

剣崎 宗二 さんが書きました:1. $dataEnemies[1]はGame_EnemyタイプのObjectではない。

$dataEnemiesとGame_Enemyは無関係だったのですね。

剣崎 宗二 さんが書きました:2. .droprateと言う呼び出し方ではfunctionを実行しない。

$dataEnemies.dropItemRate()も試したらis not Functionエラーが返されて、$dataEnemies.dropItemRateだと0が返ってきたので()なしのほうが正しいのかと思ってしまいました。空の何かが返ってきていただけだったのですね・・。そうですよね、呼び出し方が間違ってますね。(プログラミングの基礎のきができてないですね・・)

ご提示頂いた

コード: 全て選択

var dummy = new Game_Enemy(1, 0, 0);
var x = dummy.dropItemRate();  //←xがドロップ倍率となります

のコードできちんとdropItemRateが倍々になっていることを確認できました!ありがとうございます。

剣崎 宗二 さんが書きました:また、この場合出てくるのはドロップ率の「倍率」であって、個別アイテムの実際のドロップ率ではない事にご留意ください。

はい、恐らく理解しております。
今回のドロップ率の倍率はあくまでドロップしやすくなる倍率・・のようなもので、実際には
Game_Enemy.prototype.makeDropItemsで
if (di.kind > 0 && Math.random() * di.denominator < this.dropItemRate()) {
と書かれているので、各敵の各ドロップアイテムのドロップ率にランダム数掛けた値が今回のドロップ率の「倍率」を下回ればドロップする、なのかなぁと浅い理解ですが・・。

ごちゃごちゃ書いてしまいましたが、当初の目的の自作プラグインのテストはおかげさまで上手くできました!
細かく解説頂きありがとうございました!

Re: [解決済]敵のアイテムドロップ率について

Posted: 2018年10月06日(土) 11:27
by 剣崎 宗二
解決したようで良かったです。
終わった後で追記して申し訳ないのですが、一点だけ後の人の為に注意を申しておきたい部分がありました。

RefIzumi さんが書きました:$dataEnemiesとGame_Enemyは無関係だったのですね。


こちらは正確には「同じ物ではないが、関係はある」となります。
Game_Enemy.prototype.enemyにより、$dataEnemiesを参照できます。
(なのでGame_Enemyが$dataEnemiesを内包しているという印象で私は居ますね)

$dataEnemiesは「エディタで設定された敵のデータ」になっております。
ですが、戦闘中に敵はHPやMPが減ったり、ステートやバフが掛かったり、(画面上で)場所が移動したりします。
また、同じ敵が2体出て来た場合、それらを区別する何かも必要となります。
これら「エディタ側で行わなかった設定や処理」を行っているのが、Game_Enemyです。
$dataEnemiesがテンプレートであり、Game_Enemyが実体…と言った認識ですね、私は。
($dataActorsとGame_Actorの関係性も同様)