ページ 14

【完了】プラグインのレビュー依頼:敵グループのランダム化

Posted: 2020年3月28日(土) 19:14
by ムノクラ
色々な方にTwitterでアドバイスをいただきながら、作成しました。
主に別関数部分はとんび氏にアドバイスをいただき、MV専用の関数(JsonEx.parse)を使用しています。
※JsonEx.parseはどのバージョンから使用できるのかご存知の方は教えて下さい。

それ以外の箇所のレビューは受けていないのと、スイッチ的な処理があり書き換えの余地があるのは理解しています。
コアと重複部分があるのは認識していますが、どう順番を整理すれば上手く処理できるのかが解決できませんでした。

現時点でYEP Swap Enemies相当の機能はあると思います。
http://www.yanfly.moe/wiki/Swap_Enemies_(YEP)


▼余談
理想としては、下記の記事で紹介している「Random Enemies」プラグインを改善したものに仕上げたいです。
https://fungamemake.com/archives/57

https://forums.rpgmakerweb.com/index.php?threads/48224/

課題は出現させない手法が何もつかめていないことです。

--
余談の分はさておき、ご指導よろしくお願いいたします。

Re: プラグインのレビュー依頼:敵グループのランダム化

Posted: 2020年3月28日(土) 19:24
by Plasma Dark
目指している仕様は

敵遭遇ごとに、出現する敵キャラが、その敵キャラのメモ欄に記入したIDリストの中からランダムに選んだIDの敵キャラに化ける。
IDリストに0が混ざっていて、ランダムなID選択で0が選ばれた場合、その敵キャラは存在しないものとして戦闘する。
(ただし、戦闘開始時点で敵キャラが全く存在しない状況は作らない)

でしょうか。

Re: プラグインのレビュー依頼:敵グループのランダム化

Posted: 2020年3月28日(土) 19:26
by Plasma Dark
JsonEx.parseはどのバージョンから使用できるのか
サンシロさんのtweetによれば、1.5系ではすでに使えるようですね。
流石にそれ以前のバージョンまでサポートしてあげる意味は薄いと思います。
https://twitter.com/rev2nym/status/937560533405810688

Re: プラグインのレビュー依頼:敵グループのランダム化

Posted: 2020年3月28日(土) 19:28
by しぐれん
このあたりの細かい書き方は宗教戦争なので不毛ですが、個人的に気になった点のみを。

乱数を取る部分をMath.randomInt()にした方が良い。
ツクールMVの独自関数ですが、より明確。

reIdが数値と配列のどちらもあり得る状態になっており、型が固定されてない。
無効値を用意したいのであれば、nullやNaNを使うべきで空配列は不適切。

プラグイン内部にあるvarは再代入が無いので、いずれもconstに置き換えが可能。

以上です。
ロジック部分でも改善の余地はありますが、ひとまずはこのあたりで。

Re: プラグインのレビュー依頼:敵グループのランダム化

Posted: 2020年3月28日(土) 19:49
by Plasma Dark
変数及び関数の命名については検討したほうが良さそうです。

reId はおそらく random enemy Id のことだと思いますが、こういった略語は現在の自分以外に伝わらない可能性が大いにあります。
よっぽど一般的に(あるいはツクール一般に)通用するもの以外、略語は用いないほうが良いです。

noteTag という命名になっていますが、この関数の役割はメモ欄(noteTag)に書かれた敵ID一覧から一つ選択して返す、ですよね。
全く省略せずに書くならば selectRandomEnemyIdFromNoteTag でしょうか。
流石に長過ぎると思うなら、 selectEnemyId とかでも良いかもしれません。
関数の名前は、それが何をするためのものか名前から想像できるよう、動詞で始めるケースが多いです。

0のときに出現しないようにする仕組みは、コード中にもあるこれを利用するのが楽だと思います。

コード: 全て選択

if (member.hidden) {
  enemy.hide();
};
余り知られていないかもしれませんが、RPGツクールMVの戦闘には「途中から出現」なる仕組みがあります。
これはそのために用意されたコードで、戦闘開始時には途中から出現フラグ(hidden)が立っている敵をいないものとして扱います。
バトルイベントには「敵キャラの出現」コマンドがあり、それが実行されない限り、hiddenフラグが立った敵キャラの存在はゲーム中に現れません。

Re: プラグインのレビュー依頼:敵グループのランダム化

Posted: 2020年3月29日(日) 07:28
by ムノクラ
Plasma Dark さんが書きました:目指している仕様は

敵遭遇ごとに、出現する敵キャラが、その敵キャラのメモ欄に記入したIDリストの中からランダムに選んだIDの敵キャラに化ける。
IDリストに0が混ざっていて、ランダムなID選択で0が選ばれた場合、その敵キャラは存在しないものとして戦闘する。
(ただし、戦闘開始時点で敵キャラが全く存在しない状況は作らない)

でしょうか。
その通りです。

Re: プラグインのレビュー依頼:敵グループのランダム化

Posted: 2020年3月29日(日) 08:41
by ムノクラ
しぐれん さんが書きました:このあたりの細かい書き方は宗教戦争なので不毛ですが、個人的に気になった点のみを。

乱数を取る部分をMath.randomInt()にした方が良い。
ツクールMVの独自関数ですが、より明確。

reIdが数値と配列のどちらもあり得る状態になっており、型が固定されてない。
無効値を用意したいのであれば、nullやNaNを使うべきで空配列は不適切。

プラグイン内部にあるvarは再代入が無いので、いずれもconstに置き換えが可能。

以上です。
ロジック部分でも改善の余地はありますが、ひとまずはこのあたりで。
Math.randomInt()にできるか試みました。
結果が下記ですが、合っているでしょうか?(一応、動いているようです)

コード: 全て選択

        // var randomEnemyId = Number(pool[Math.floor(Math.random() * pool.length)]);
        var randomEnemyId = Number(pool[Math.randomInt(pool.length)]);
どういった点が明確になったのか自分には分かりません。
メリットを教えていただければ幸いです。

宗教戦争とおっしゃられたのは
1.RPGツクールMVなんだから、専用の関数を使うほうが分かりやすい
2.JavaScriptの機能を使うほうが、MVの事を知らない人でも読みやすい
という派閥に分かれるという意味と予想します。

型の固定の方法が分かりません。

ロジック部分は…冗長な箇所が既に予想できますが、まず動くようにしてから、改善する順に制作を進めたく思います。

Re: プラグインのレビュー依頼:敵グループのランダム化

Posted: 2020年3月29日(日) 08:47
by ムノクラ
Plasma Dark さんが書きました:変数及び関数の命名については検討したほうが良さそうです。

reId はおそらく random enemy Id のことだと思いますが、こういった略語は現在の自分以外に伝わらない可能性が大いにあります。
よっぽど一般的に(あるいはツクール一般に)通用するもの以外、略語は用いないほうが良いです。

noteTag という命名になっていますが、この関数の役割はメモ欄(noteTag)に書かれた敵ID一覧から一つ選択して返す、ですよね。
全く省略せずに書くならば selectRandomEnemyIdFromNoteTag でしょうか。
流石に長過ぎると思うなら、 selectEnemyId とかでも良いかもしれません。
関数の名前は、それが何をするためのものか名前から想像できるよう、動詞で始めるケースが多いです。

0のときに出現しないようにする仕組みは、コード中にもあるこれを利用するのが楽だと思います。

コード: 全て選択

if (member.hidden) {
  enemy.hide();
};
余り知られていないかもしれませんが、RPGツクールMVの戦闘には「途中から出現」なる仕組みがあります。
これはそのために用意されたコードで、戦闘開始時には途中から出現フラグ(hidden)が立っている敵をいないものとして扱います。
バトルイベントには「敵キャラの出現」コマンドがあり、それが実行されない限り、hiddenフラグが立った敵キャラの存在はゲーム中に現れません。
正直に告白しますと、まだ変数とクラスの違いさえ、読んでいてあやふやな感覚でいます。
.がついてるのがクラスだろう…くらいのレベルです。
this.の後に_が入るものと入らないものがあるものの差がまるで理解できていないレベルです。
本当に、コアと既成のプラグインを見ながら、似た処理だろうと思われるところをコピペして書き換えてここまで来ています。

例えば、今回関数で返す

コード: 全て選択

return randomEnemyId;
のrandomEnemyIdは代入先と同じ名前ですが、これも別にすべきなのでしょうか?

Re: プラグインのレビュー依頼:敵グループのランダム化

Posted: 2020年3月29日(日) 08:53
by ムノクラ
しぐれんさんには昼間のTwitterで、そして、今回Plasma Drakさんからも言われたとおり「0の時にenemy.hide();」を使う処理を入れました。
(コードが汚いのは、ちょっと置いておいて…)

結果、敵グループ内が全キャラがhideになると、自動的に勝利するという状況が生まれました。

解決方法のアイディアとして、hideではない敵キャラが配置された時に、內部変数に数値を入れ、その数値が0の場合は再度グループ生成をやりなおす…というのが浮かびましたが、妥当な方向でしょうか?

現時点でのコード(全キャラがhide未対策)をアップします。

追記
と思ったら、0か1なので、trueかfalseの方が良いですよね

Re: プラグインのレビュー依頼:敵グループのランダム化

Posted: 2020年3月29日(日) 10:04
by ムノクラ
ムノクラ さんが書きました:しぐれんさんには昼間のTwitterで、そして、今回Plasma Drakさんからも言われたとおり「0の時にenemy.hide();」を使う処理を入れました。
(コードが汚いのは、ちょっと置いておいて…)

結果、敵グループ内が全キャラがhideになると、自動的に勝利するという状況が生まれました。

解決方法のアイディアとして、hideではない敵キャラが配置された時に、內部変数に数値を入れ、その数値が0の場合は再度グループ生成をやりなおす…というのが浮かびましたが、妥当な方向でしょうか?

現時点でのコード(全キャラがhide未対策)をアップします。

追記
と思ったら、0か1なので、trueかfalseの方が良いですよね
対策しようとしたら無限ループになってしまうようです。
どこをどうすれば解決できるのか、何も浮かばないので…アップします。
(凄い初歩的なミスの予感)