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

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

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

投稿記事by ムノクラ » 2020年3月28日(土) 19:14

色々な方に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/

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

--
余談の分はさておき、ご指導よろしくお願いいたします。
添付ファイル
MNKR_RandomEnemies.js
(1.67 KiB) ダウンロード数: 5 回
最後に編集したユーザー ムノクラ on 2020年3月29日(日) 16:06 [ 編集 1 回目 ]

***
:!: 質問前に、過去ログを検索しましょう!
:?: プラグインのエラーが出たらトリアコンタンさんの記事を読もう!
https://qiita.com/triacontane/items/2e2 ... e9503a2c30
;) 質問が解決できたら、スレッドタイトルに【解決】を追加しましょう!
8-) 自己解決した方は、解決した方法を書きましょう!<後人の為です!

▼プラグイン投稿・検索
https://plugin.fungamemake.com

▼返信がもらいやすい質問の仕方
https://fungamemake.com/archives/8079
アバター
Plasma Dark
記事: 235
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

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

投稿記事by Plasma Dark » 2020年3月28日(土) 19:24

目指している仕様は

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

でしょうか。
アバター
Plasma Dark
記事: 235
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

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

投稿記事by Plasma Dark » 2020年3月28日(土) 19:26

JsonEx.parseはどのバージョンから使用できるのか


サンシロさんのtweetによれば、1.5系ではすでに使えるようですね。
流石にそれ以前のバージョンまでサポートしてあげる意味は薄いと思います。
https://twitter.com/rev2nym/status/937560533405810688
アバター
しぐれん
記事: 741
登録日時: 2017年3月28日(火) 22:22
連絡を取る:

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

投稿記事by しぐれん » 2020年3月28日(土) 19:28

このあたりの細かい書き方は宗教戦争なので不毛ですが、個人的に気になった点のみを。

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

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

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

以上です。
ロジック部分でも改善の余地はありますが、ひとまずはこのあたりで。
有償でプラグイン作成リクエストに対応します。
(4月28日から依頼受付再開しました)
アバター
Plasma Dark
記事: 235
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

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

投稿記事by Plasma Dark » 2020年3月28日(土) 19:49

変数及び関数の命名については検討したほうが良さそうです。

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

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

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

コード: 全て選択

if (member.hidden) {
  enemy.hide();
};


余り知られていないかもしれませんが、RPGツクールMVの戦闘には「途中から出現」なる仕組みがあります。
これはそのために用意されたコードで、戦闘開始時には途中から出現フラグ(hidden)が立っている敵をいないものとして扱います。
バトルイベントには「敵キャラの出現」コマンドがあり、それが実行されない限り、hiddenフラグが立った敵キャラの存在はゲーム中に現れません。
アバター
ムノクラ
記事: 1019
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

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

投稿記事by ムノクラ » 2020年3月29日(日) 07:28

Plasma Dark さんが書きました:目指している仕様は

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

でしょうか。


その通りです。
***
:!: 質問前に、過去ログを検索しましょう!
:?: プラグインのエラーが出たらトリアコンタンさんの記事を読もう!
https://qiita.com/triacontane/items/2e2 ... e9503a2c30
;) 質問が解決できたら、スレッドタイトルに【解決】を追加しましょう!
8-) 自己解決した方は、解決した方法を書きましょう!<後人の為です!

▼プラグイン投稿・検索
https://plugin.fungamemake.com

▼返信がもらいやすい質問の仕方
https://fungamemake.com/archives/8079
アバター
ムノクラ
記事: 1019
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

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

投稿記事by ムノクラ » 2020年3月29日(日) 08:41

しぐれん さんが書きました:このあたりの細かい書き方は宗教戦争なので不毛ですが、個人的に気になった点のみを。

乱数を取る部分を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の事を知らない人でも読みやすい
という派閥に分かれるという意味と予想します。

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

ロジック部分は…冗長な箇所が既に予想できますが、まず動くようにしてから、改善する順に制作を進めたく思います。
***
:!: 質問前に、過去ログを検索しましょう!
:?: プラグインのエラーが出たらトリアコンタンさんの記事を読もう!
https://qiita.com/triacontane/items/2e2 ... e9503a2c30
;) 質問が解決できたら、スレッドタイトルに【解決】を追加しましょう!
8-) 自己解決した方は、解決した方法を書きましょう!<後人の為です!

▼プラグイン投稿・検索
https://plugin.fungamemake.com

▼返信がもらいやすい質問の仕方
https://fungamemake.com/archives/8079
アバター
ムノクラ
記事: 1019
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

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

投稿記事by ムノクラ » 2020年3月29日(日) 08:47

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は代入先と同じ名前ですが、これも別にすべきなのでしょうか?
***
:!: 質問前に、過去ログを検索しましょう!
:?: プラグインのエラーが出たらトリアコンタンさんの記事を読もう!
https://qiita.com/triacontane/items/2e2 ... e9503a2c30
;) 質問が解決できたら、スレッドタイトルに【解決】を追加しましょう!
8-) 自己解決した方は、解決した方法を書きましょう!<後人の為です!

▼プラグイン投稿・検索
https://plugin.fungamemake.com

▼返信がもらいやすい質問の仕方
https://fungamemake.com/archives/8079
アバター
ムノクラ
記事: 1019
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

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

投稿記事by ムノクラ » 2020年3月29日(日) 08:53

しぐれんさんには昼間のTwitterで、そして、今回Plasma Drakさんからも言われたとおり「0の時にenemy.hide();」を使う処理を入れました。
(コードが汚いのは、ちょっと置いておいて…)

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

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

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

追記
と思ったら、0か1なので、trueかfalseの方が良いですよね
添付ファイル
MNKR_RandomEnemies.js
(1.94 KiB) ダウンロード数: 0 回
***
:!: 質問前に、過去ログを検索しましょう!
:?: プラグインのエラーが出たらトリアコンタンさんの記事を読もう!
https://qiita.com/triacontane/items/2e2 ... e9503a2c30
;) 質問が解決できたら、スレッドタイトルに【解決】を追加しましょう!
8-) 自己解決した方は、解決した方法を書きましょう!<後人の為です!

▼プラグイン投稿・検索
https://plugin.fungamemake.com

▼返信がもらいやすい質問の仕方
https://fungamemake.com/archives/8079
アバター
ムノクラ
記事: 1019
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

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

投稿記事by ムノクラ » 2020年3月29日(日) 10:04

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

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

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

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

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


対策しようとしたら無限ループになってしまうようです。
どこをどうすれば解決できるのか、何も浮かばないので…アップします。
(凄い初歩的なミスの予感)
添付ファイル
MNKR_RandomEnemies.js
(2.21 KiB) ダウンロード数: 8 回
***
:!: 質問前に、過去ログを検索しましょう!
:?: プラグインのエラーが出たらトリアコンタンさんの記事を読もう!
https://qiita.com/triacontane/items/2e2 ... e9503a2c30
;) 質問が解決できたら、スレッドタイトルに【解決】を追加しましょう!
8-) 自己解決した方は、解決した方法を書きましょう!<後人の為です!

▼プラグイン投稿・検索
https://plugin.fungamemake.com

▼返信がもらいやすい質問の仕方
https://fungamemake.com/archives/8079

“MV:質問” へ戻る