ガンビットプラグイン

フォーラムルール
素材の利用規約を決めたいけど、どんなことを書けばいいのか分からない場合は、
素材のテンプレートをご利用下さい。
maker-b
記事: 112
登録日時: 2016年3月27日(日) 22:03
連絡を取る:

ガンビットプラグイン

投稿記事by maker-b » 2020年10月19日(月) 00:16

人生初プラグインです。
本当に色々な方のお力をいただき、作っております。
この場を借りてご協力いただいているすべての方へ感謝申し上げます。

本プラグインは、MZのバトルにガンビット機能を追加します。
詳しくは本プラグインヘルプをご覧ください。

現在のバージョン
2021/06/07 11:26
0.24.47c

コード: 全て選択

 更新履歴
 * バージョンアップルール
 * 修正、バグ修正   + 0.0.1
 * 機能追加         + 0.1.0
 *
 * 2021/06/07   v0.24.47c   バグ修正    (オートガンビット機能がフリーズする問題)
 * 2021/06/01   v0.24.46c   機能追加    (オートガンビット機能 バトル開始と同時にガンビットを実行する機能)
 * 2021/04/20   v0.23.46c   修正      (ガンビットON/OFF時、アクションの効果が消えてしまう問題 フラグ消し漏れ)
 * 2021/04/20   v0.23.45c   修正      (ガンビットON/OFF時、アクションの効果が消えてしまう問題)
 * 2021/04/20   v0.23.44c   修正      (DTextPicture.jsプラグインが無いとテロップを出さない機能)
 * 2021/04/20   v0.22.44c   修正      (ガンビットログが出るタイミングを調整 アクション直前で出る仕様に変更)
 * 2021/04/20   v0.22.43c   修正      (ガンビットON/OFF時のテロップ+音を出す機能)
 * 2021/04/17   v0.21.43c   修正      (BattleManager初期化不足問題)
 * 2021/04/14   v0.21.42c   バグ修正  (アイテムリストにガンビットが表示されている問題)
 * 2020/12/24   v0.21.41c   バグ修正 (targetが定義されていない問題)
 * 2020/12/24   v0.21.40c   バグ修正  (IF文が機能しなかった問題)
 * 2020/12/08   v0.21.39c   バグ修正 (店で条件式が無制限に買える問題)
 * 2020/12/08   v0.21.38c   修正     (大幅仕様変更 IF項目を独立、使い方マニュアル大幅更新)
 * -----過去バージョンとの互換性がなくなりました-----------------------------------------
 * 2020/12/06   v0.20.38b   機能追加 (IF文 実装x2 IF アクターのターン数が?? IF 敵の数が??)
 * 2020/12/06   v0.18.38b   修正     (不等式、等式の説明文において ”=”の記載がなかったものを追加)
 * 2020/12/04   v0.18.37b   バグ修正 (ガンビット 戦闘不能バグ問題 再)
 * 2020/12/03   v0.18.36b   バグ修正 (ガンビット 戦闘不能バグ問題)
 * 2020/12/03   v0.18.35b   バグ修正 (ガンビット 使用不可判定バグ問題)
 * 2020/12/02   v0.18.34b   バグ修正 (ガンビット 使用不可判定バグ問題)
 * 2020/12/02   v0.18.33b   バグ修正 (ガンビット ステート判定、使用不可判定問題)
 * 2020/12/01   v0.18.32b   バグ修正 (ガンビット アクターの問題)
 * 2020/11/30   v0.18.31b   バグ修正 (下記機能のバグ)
 * 2020/11/28   v0.18.30b   バグ修正 (下記機能のバグ)
 *                          機能追加 (ガンビットセットリストを切り替えるアクションを実装)
 * 2020/11/27   v0.17.29b   修正     (ガンビットメニューにクラス表示追加)
 *                          バグ修正 (ガンビット スキル、アイテム使用可否の問題)
 * 2020/11/26   v0.17.27b   バグ修正 (ガンビット 味方の問題)
 *                          バグ修正  (ガンビット 属性の問題)
 *                          バグ修正 (ガンビット 比較式の問題)
 * 2020/11/21   v0.17.23b   バグ修正 (アクター追加時に_gambitLogWindowsの生成とUPDATEのよびだしズレ問題)
 *                          修正 ガンビット選択時、3列表示に修正
 *                          バグ修正 (戦闘不能の味方がエラーになる問題)
 *                          バグ修正 (ガンビットがブランクだった場合の問題)
 *                          バグ修正 (ガンビット OOを狙うOOで、OOが死んだ時の問題)
 * 2020/11/20   v0.17.18b   機能追加 ショップにてガンビットを販売した場合、一個しか買えない仕様
 *                          機能追加 ガンビット「TOGETHR」
 *                          修正 ガンビットメニュー修正(選択後、コマンドに戻る際、ハイライトが消えない問題)
 *                          バグ修正 (「TOGETHR」でevalのエラーになる問題)
 *                          機能追加 プラグインコマンド(addGambitSlotALL)全員のガンビットスロットを増やす機能
 *                          機能追加 プラグインコマンド(addGambitSlotFROMTOPACTOR)全員のガンビットスロットを最大値に合わせる
 *                          バグ修正 (「TOGETHR」でevalのエラーになる問題 再び)
 * 2020/11/12   v0.14.15b   機能追加 ガンビット「LEADER」
 *                          機能追加 ガンビットが無い場合の文字列をパラメータに設定
 *                          修正 ガンビットログの致命的なバグを修正
 * 2020/11/11   v0.12.14b   修正 ガンビットが無い場合の挙動を整形
 * 2020/11/10   v0.12.13b   バグ修正(バトル中にアクター増減した際、動作しない問題)
 * 2020/11/10   v0.12.12b   修正 アイテム画面からガンビット対象を非表示に
 * 2020/11/08   v0.12.11b   修正 装備画面、ステータス画面からガンビット対象スロットを非表示に
 * 2020/11/06   v0.12.10b   バグ修正(ガンビットスロット追加が動作しない問題)
 *                          バグ修正(プラグインコマンドが動作しない問題)
 * 2020/10/28   v0.12.8b    機能追加 ポーズを暫定実装(画面を暗くする、バトルを止める)
 * 2020/10/27   v0.11.8b    バグ修正
 * 2020/10/26   v0.11.7b    機能追加 ガンビットログを本実装(単体表示対応)
 * 2020/10/22   v0.10.7b    機能追加 ガンビットウィンドウのフレーム表示ONOFFパラメータ化
 *                          機能追加 ガンビットログのONOFFを追加
 *                          機能追加 ガンビットログの座標をパラメータ化
 * 2020/10/22   v0.7.7b     機能追加 ガンビットログを実装
 *                          バグ修正 セットリストに一切アイテムをセットしていないと起こるエラーを修正
 *                          バグ修正 逃げる時に起こるエラーを修正
 *                          機能追加 メインメニューの選択中ガンビットセットとバトル中セットを区別
 *                          バグ修正 (ガンビットの初期化において致命的な問題)
 *                          機能追加 バトル時のセットリストにFACEを表示
 *                          機能追加 アクター単位でガンビットクラウンを追加
 *                          機能追加 ガンビット「DISTANCE_X」「DISTANCE_Y」
 *                          バグ修正
 * 2020/10/21   v0.3.3b     機能追加 アクター単位でのガンビットオン、オフ切り替え実装
 * 2020/10/19   v0.2.3b     機能追加 ガンビット「MYSELF」
 *                          修正 過去コードの不要部分削除
 *                          修正 「バトル時のパーティコマンドへガンビットの追加」を削除
 *                          修正 meta仕切り# > :
 * 2020/10/19   v0.1.3b     仕様大幅変更
 * 2020/10/18   v0.1.0b     こっそり公開・・・
添付ファイル
MKB_Gambit_SystemMZ.zip
(24.9 KiB) ダウンロード数: 181 回
MKB_Gambit_SystemMZ_old.zip
(21.95 KiB) ダウンロード数: 43 回
最後に編集したユーザー maker-b on 2021年6月07日(月) 11:27 [ 編集 48 回目 ]

アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: ガンビットプラグイン

投稿記事by Plasma Dark » 2020年10月19日(月) 03:35

なんと、初プラグインでこの規模のものを動かすところまで書かれるとは、恐れ入りました。

メジャーバージョン0ということでまだまだ正式リリースではないのかもしれませんが、技術協力に名前を連ねさせていただいてしまっているので、優先的に対応したほうが良い内容について書かせてください。
(末尾にsがついているのでよく似た名前の別人かもしれませんが、多分typoですよね)

1. ホワイトスペース、インデントを統一する
タブ文字と半角スペースが混ざっていたり、インデントが崩れていたりします。
VSCodeをお使いのようですので、 Shift + Alt + F で整形してしまいましょう。

2. パーティコマンドの項目を固定しないようにする
戦闘中のパーティコマンドについて、戦う ガンビットチェンジ 逃げるの3項目に固定されてしまっています。
addCommandメソッドをそのまま使おうとすると、makeCommandListメソッドをフックする形では先頭か末尾にしかコマンド追加できないためだと思われますが、これだと他の項目を足すプラグインと競合します。
間に追加するメソッドを定義してそれを呼ぶようにしてしまうのが手軽です。

参考コード:
https://github.com/elleonard/DarkPlasma-MZ-Plugins/blob/release/DarkPlasma_FormationInBattle.js#L340

3. 戦闘シーンからガンビットシーンへの移行はしない
実は、戦闘シーンから別シーンへ移行して戻ってきた際には、戦闘開始時の処理が走ってしまいます。
フロントビューでは敵遭遇時のメッセージが表示されたりしますし、サイドビューでも戦闘回数が加算されたりします。
ガンビットシーンで使われるウィンドウクラスを使い回せるようにしておき、戦闘シーン側にも足してしまうと楽です。
2で参考コードとして挙げた戦闘中の隊列変更プラグインは、隊列変更シーンに移行せずにウィンドウだけを使いまわしているので、参考になるかと思います。

4. DataManager.extractMetadataの上書きをやめる
この呪文はかなり邪悪なので、可能な限り最優先で廃棄したほうが良いです。
この呪文のせいで、他のメタデータを用いるプラグインと容易に競合するようになっています。

メタデータをシャープ区切りで記述できるようにする、というのは独立した機能であって、この規模のプラグインに組み込まれているべきものではありません。
どうしてもシャープ区切りで書きたいのでなければ、デフォルトでサポートされているコロンを使いましょう。
コロン区切りで記述する場合、下記のようなコードで十分です。

コード: 全て選択

const _DataManager_extractMetadata = DataManager.extractMetadata;
DataManager.extractMetadata = function (data) {
  _DataManager_extractMetadata.call(this, data);
  if (data.meta.gambit) {
    data.meta.gambit = JSON.parse(data.meta.gambit);
  }
};


シャープ区切りで記述したい場合でも、それだけの機能を持ったプラグインを独立して定義して、@baseで指定するほうがまだ安全ですね。
そのプラグインだけ、プラグインリストの先頭に読み込んでしまえば競合の心配がぐっと減るので。
maker-b
記事: 112
登録日時: 2016年3月27日(日) 22:03
連絡を取る:

Re: ガンビットプラグイン

投稿記事by maker-b » 2020年10月19日(月) 11:06

Plasma Dark様

いつもお世話になっております。
下記、早速のアドバイスありがとうございました!
また、プラグイン内にお名前(Sつけて間違えちゃいました・・・)をお借りしていてすみません。
Plasma Dark様より、ここ数週間で、頂いたアドバイスで、本プラグインが劇的に進化しまして、
本当に感謝申し上げます。

私は、コードを書いた経験はほぼなくVBA(マクロレベル)ですが、作り始めると楽しくなってのめり込んでしまいました:)
本来、このプラグインは公開するつもりはなかったのですが、自身の勉強の為、外部に出せるレベルにしたいと思いカスタムしてます。

以下アドバイス参考にいたしました!
1 早速整形しました。便利すぎる機能ですね!
2 はい、一旦パーティコマンドを削除しました!仮に再実装する場合、頂いたGITHUBを拝読して考えます!
  バトル中にガンビットの付け替えは出来ないほうが縛りがあって面白い、とポジティブに考えます:)
3 そうなんですよね、バトル中の画面遷移は実は課題だったんです。バトルが初期化される症状に悩んで
  いましたが、そういうことなんですね・・・
  結論、バトル中のメニュー表示は、シーンを変えず、ウィンドウだけ表示する、が正解っぽいですね!
4 はい、素晴らしいメソッドをいただけたので、すぐ廃止しました!
  jsonをパースする、的な用語に頭がついていっていないのが現状です・・・
  jsonは、ラベルと値が、1:1で存在して、それをパース(切り取る?)して値を取得する?的な
  理解をしてますが、もう少し勉強します。
  いづれにしても頂いたメソッドですんなり実現出来てしまったので、すぐ修正しました!

本当にありがとうございます!
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: ガンビットプラグイン

投稿記事by Plasma Dark » 2020年10月21日(水) 22:06

フォーマットがかかって劇的に見やすくなったと思います。
あとはコードを書いたり他の人のコードを読んだりしながら自分に合ったスタイルを探していってください。

気になるのは不要な変数やコメントがあちこちに残っていること、evalが多用されていることくらいですね。
どちらも今すぐにどうこうという話ではないので、コードを改善していく時に余裕があれば思い出して、少しずつ直していく程度で構いません。

なぜ不要なコードやevalが良くないのか、という話を簡単に説明します。

1. 不要な(未使用の)変数、コメントの弊害
処理の中で使わないのに定義したのを忘れたまま放置される変数や、不要になった処理をコメントアウトしてそのまま残していると、コードの保守性にじわじわとダメージを与えていきます。
忙しい時期でしばらくコードを触れなかったり、一旦完成としてしばらく経ってからバグ報告が来て対応しようとしたとき、それらが一体どんな経緯で書かれたものか、なぜコメントとして残してあるものかを思い出せるとは限りません。(人類であればたいていの場合、忘れます)
必要な処理と必要なコメントのみを残すようにすると、未来の自分が余計なノイズに惑わされずに済んだりします。

VSCodeはJavascriptのコードを見やすく色分けしてくれますが、未使用の変数や関数は他のものよりも薄暗く表示されます。
それらは基本的にコード中に残しておくべきでないものなので、気がついた時に消してしまうと良いと思います。

2. eval is evil
evalは邪悪、というやや強い言い方ですが、実際に広く知られており、また同意されている言葉でもあります。
JS処理系による実行の最適化が効かず、本来ならできるはずの高速化ができなかったり、また実行前のコード中では文字列であるせいで、VSCodeの色分けやコード補完等の支援がまともに受けられません。
(セキュリティ面での邪悪さもありますが、ツクールではほとんど気にしなくて良いので、気になるようならググってみてください)

適切な設計であればevalを使う必要はなく、ガンビットプラグインでもevalを避けた書き方は可能です。

実行速度以外の動作に直接影響する箇所ではなく、今ひとつ重要性が伝わりにくいかもしれません。
繰り返しになりますが、これらは今すぐに対応しなければならないもの、というわけではなく(全部対応するとかなりの作業量になるはずですし)、これからコードを改善していく中で少しずつ良くしていくべきものです。

ぜひ、余裕がある時に意識してみてください。
maker-b
記事: 112
登録日時: 2016年3月27日(日) 22:03
連絡を取る:

Re: ガンビットプラグイン

投稿記事by maker-b » 2020年10月22日(木) 09:46

Plasma Dark 様

ご連絡いただきありがとうございます。
不要なコードの件、ご指摘ありがとうございます!
おっしゃるとおりですね・・・・
私に至っては、コメントの入れ方に統一感が無いので、見にくいです。
少しづつ整理していきます!

evalは、ネットで調べると悪いことしか書いていないので、嫌な予感はしておりました・・・
ご指摘の通りだと思います。
evalを採用した理由は、いかに分岐を少なくしようか、と考えた結果でしたが、
今となっては、むっちゃ分岐しているので、いらないかもですね!

本来ゲームを作ることが目的なんですが、意外に最近はプラグインづくりが楽しかったりします:)
引き続きアドバイスいただけると大変うれしいです!

ちなみに、いま、一番頭を悩ませているのが、
バトル時に、ガンビットを決定した際、どうやってユーザーへ可視化しようかということです。
具体的には、
battlelogのような形で、複数行の履歴を画面に残しながら、最新のガンビットを表現したいと思っております。
一番参考になるのが、battlelogですが、結構コード深いですね・・・

もし、おすすめの表示方法とかありましたら、アドバイスいただけるとありがたいです。
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: ガンビットプラグイン

投稿記事by Plasma Dark » 2020年10月22日(木) 12:06

バトル時に、ガンビットを決定した際、どうやってユーザーへ可視化しようかということです。


onTouchCallAutoBattleGambitChangeでガンビットを切り替えたとき、どのアクターがガンビットをどう切り替えたかを可視化したい、ということですよね。

実装として一番手軽なのは、$gameMessage.add(切替時メッセージ)じゃないかと思います。
ただし、イベント形式のメッセージが表示されるので戦闘のテンポは悪くなります。

次に、仰る通りにWindow_BattleLogに書き出す方法があります。
Window_BattleLogはログテキスト表示以外にも戦闘の描画関係の処理を詰め込まれていて、ちょっとコードが追いにくいですよね。
基本的にBattleManager経由で操作しているので、それに合わせるように書くなら

コード: 全て選択

BattleManager.changeGambit = function (actor) {
  this._logWindow.displayChangeGambit(actor);
};

Window_BattleLog.prototype.displayChangeGambit = function (actor) {
  // 描画処理
};


こんな感じになるんじゃないでしょうか。
Scene_Battleのupdateが長大になっているので、ガンビット切り替え処理を一部切り出しても良いとは思います。

最後に、おそらく一番見栄えが良いが一番手間のかかるやり方として思いつくのは、ダメージポップアップのようにアクターに対してガンビットの切り替え先をポップアップ表示してあげる方法です。
popupDamage周りが参考にはなりますが、Game_BattlerやSprite_Battlerにも処理が散っていて非常に追いにくく、どう書くか悩ましいので、ある程度コードを整理されてから挑むほうが良いでしょう。
maker-b
記事: 112
登録日時: 2016年3月27日(日) 22:03
連絡を取る:

Re: ガンビットプラグイン

投稿記事by maker-b » 2020年10月22日(木) 18:35

Plasma Dark 様

いつもサポートいただきありがとうございます!
そうなんです!
ガンビットは自動でバトルが進むので、ユーザーの判断材料を画面に表示してあげないといけないと
思っています。

ご提案頂いた通り、BattleManagerベースで色々と制御しており、STRINGをどこで差し込むかはなんとなく理解
できるのですが、実装イメージがなかなかわきませんでした。

バトルログに実装する内容を少し検討してみます!
actorへ動的POPUPで表現するのは難易度高めっぽいので・・・
MEI@ゴロゴロし隊
記事: 1
登録日時: 2021年5月04日(火) 18:57

Re: ガンビットプラグイン

投稿記事by MEI@ゴロゴロし隊 » 2021年5月04日(火) 19:06

ダウンロードさせていただきました~♪

使うとラクラクに戦闘ができますね!

Xターンごととかの条件があると強化系も組み込めてなかなか戦術的になるかなぁと思ってみたり
リストの中身が8個とかあると、ルーチン考えるのも楽しめるかなぁと思います♪
maker-b
記事: 112
登録日時: 2016年3月27日(日) 22:03
連絡を取る:

Re: ガンビットプラグイン

投稿記事by maker-b » 2021年6月01日(火) 10:41

ご利用ありがとうございますー!!!

“MZ:プラグイン素材” へ戻る