新しいスキルを既存のスキルと入れ替えたい&発動するスキルを変数で選びたい

HaruAki
記事: 3
登録日時: 2024年5月22日(水) 04:51

新しいスキルを既存のスキルと入れ替えたい&発動するスキルを変数で選びたい

投稿記事by HaruAki » 2024年5月22日(水) 05:51

今サイコロで戦闘のコマンドを選ぶゲームを作成中です。
1~6にスキルを配置して出た目のスキルを発動するものです。

今探しているのは
『レベルが上がって新しいスキルを習得したら1~6にもともとあるスキルと新しく習得したスキルを選んで入れ替えることができる』

『戦闘時にサイコロで出た目によって覚えてる1~6のスキルを発動する』

の二つです。

よろしければお願いします

すおう
記事: 38
登録日時: 2024年5月17日(金) 08:30

Re: 新しいスキルを既存のスキルと入れ替えたい&発動するスキルを変数で選びたい

投稿記事by すおう » 2024年5月22日(水) 22:39

いろいろ考えてみましたが、前提条件が足りないかな、と感じました。

・スキルの習得について
スキルは通常ID順に並びます。普通にスキルを1つ消して1つ覚えると、
もと3番目にあったスキルが2番目にきたりします。これが問題ないなら、そこまで難しい話ではないかもしれません
順番を維持したいとなると専用プラグインを探すか、超めんどい力技を使うかの2択になりそうです

・スキル発動について
サイコロ自体は専用のスキルがあって、それを発動する形でしょうか。それでコモンイベント呼ぶ形でしょうか
また覚えたスキルはそのままだと普通に使えてしまいますが、どうやって使えなくさせますか
使用不可にすればいけるのかな? 戦闘詳しくないのでやったことがないです

・スキルの種類について
単体攻撃、全体攻撃、単体回復、全体回復、その他などまざっているのでしょうか
そうなると単体はどうやって相手先を指定しますか。スキルが決まった後に対象を選ぶのでしょうか
・・・もしそうならかなり難しいと思います
HaruAki
記事: 3
登録日時: 2024年5月22日(水) 04:51

Re: 新しいスキルを既存のスキルと入れ替えたい&発動するスキルを変数で選びたい

投稿記事by HaruAki » 2024年5月23日(木) 00:52

ご回答ありがとうございます。

・スキル習得について
既存のゲームで例えると『オレカバトル』というゲームのような習得方法を考えています。
レベルが1あがると覚えられるスキルの中からランダムで1つのスキルが抽選されて覚えるか覚えないかを選択できる感じです。
その場合消すよりかは維持してIDを変数から引っ張ってきて~、というのを考えていました。

・スキル発動について
攻撃コマンドを『攻撃、防御、スキル、アイテム』というのを『行動(サイコロを振る)、アイテム』だけにする感じです(そのようにできるプラグインを使用させてもらっています)。
『行動』を選択するとサイコロを振るコモンイベントが発動するようにもなっています(これもプラグインをお借りしたことにより成功しています)。

ただ問題はスキルを発動する方法です。今は、コマンドによりサイコロを振る、サイコロの出た目を変数に登録、登録された変数を条件分岐でスキルを選び発動する形になっています。
この場合条件分岐には戦闘行動の強制を配置しているのですが、この場合選べるスキルがIDを選択する形になってしまいます。それだと新しいスキルを覚えても使用するスキルを変更できなくて困っています。
その為現状『行動の強制で使うスキルは直接スキルを選択するのではなく変数でスキルのIDを選択する』のを考えています。
が、これを実現するプラグインや記事などを見つけられずにいます...

・スキルの種類について
攻撃単体スキルは狙いをランダムでいいかなと思っています。
回復単体スキルは悩んでいて、ランダムにするか自分自身にするか現時点で一番体力の少ない味方の誰かに自動でするか...という感じです
すおう
記事: 38
登録日時: 2024年5月17日(金) 08:30

Re: 新しいスキルを既存のスキルと入れ替えたい&発動するスキルを変数で選びたい

投稿記事by すおう » 2024年5月23日(木) 09:06

長くなりそうなのでいくつかスレッド分けると思います。
先に1つ紹介しますが、記事中ででてくるスクリプトは以下のサイトを大いに参考にしています
https://rpgmaker-script-wiki.xyz/mzscriptwiki.php
javascriptの知識がなくても『デフォルトのイベントだと直接指定しかできないものを変数指定にしたい』ときなどに大いに役立つので参考にしてください

まずは『レベルが上がって新しいスキルを習得したら1~6にもともとあるスキルと新しく習得したスキルを選んで入れ替えることができる』について
スキルの順番は問わないものとします。
『アイテム選択の処理』と同じようにスキルを選択できるプラグインを公開している方がいらっしゃいました
https://fungamemake.com/archives/15471
これを使いたいと思います。

レベルが上がってスキルを1つランダムで覚えます。このあとに上記のプラグインを実行してスキルを選択します。
選択肢はもともと覚えていた6つ+新しいもの1つの計7つで、忘れさせたいスキルを選択します。
スキルを選択すると変数にスキルIDが保存されますので、スクリプトを使ってそのスキルを忘れさせます。

コード: 全て選択

const n = $gameVariables.value(スキルIDが保存されている変数のID);
$gameActors.actor(アクターID).forgetSkill(n);


なおスキル選択はキャンセルできてしまうようなので、事前に格納変数に0を入れておいて
キャンセルされたときは再度選択し直すようにするとよいと思います
もしくは事前に格納変数に最新スキルのIDを入れておいて、キャンセルされたら最新スキルを消してしまうでもよいかも
すおう
記事: 38
登録日時: 2024年5月17日(金) 08:30

Re: 新しいスキルを既存のスキルと入れ替えたい&発動するスキルを変数で選びたい

投稿記事by すおう » 2024年5月23日(木) 09:38

次ですが、先にスキルの種類について
後で書きますが、行動指定もスクリプトにて指定します。このとき『行動の強制』ではスキルの種類関係なく
全体攻撃にしたり単体攻撃に変更できたりしてしまいますが、今回はスキルの設定どおりに動かしたいと思います

そこで、単体攻撃のスキルですが、範囲を『単体』ではなく『ランダム』の1回行動にしてしまいます
これで最初からランダムで敵1体を対象とする単体攻撃スキルになります

つぎに単体回復ですが、こちらは正直言って難しいです。
なぜかというと一言に『HPが少ない味方を優先する』といっても
・HPが少ないとは、数値としてなのか、割合としてなのか
・数値の場合、最大HPが大きく、HPが削れている味方よりも、最大HPが少なくほとんどHPが削れていない味方を優先してしまう可能性がある。なんならHPが満タンでもそちらを優先する可能性がある
・割合の場合はその逆でHPが削れていてもまだ耐えられる味方を優先し、紙耐久の瀕死の味方が回復されない恐れがある
・そもそもHPが0で回復できない味方を除外しないといけない

とまあ、これはまだほんの一部で言ってしまえばきちんと細かい条件を設定しないといけないわけです。
これをやりたいとなるとさすがに掲示板での助言レベルを超えて共同開発状態です
申し訳ないですが私からの提言ではこの部分を除外させてもらいます
すおう
記事: 38
登録日時: 2024年5月17日(金) 08:30

Re: 新しいスキルを既存のスキルと入れ替えたい&発動するスキルを変数で選びたい

投稿記事by すおう » 2024年5月23日(木) 10:50

『戦闘時にサイコロで出た目によって覚えてる1~6のスキルを発動する』について
少々お待ちください
想定していたやり方で検証したら躓いてしまいました。
出来ないことはないのですが、もしかするとプラグイン作らないとダメかも
すおう
記事: 38
登録日時: 2024年5月17日(金) 08:30

Re: 新しいスキルを既存のスキルと入れ替えたい&発動するスキルを変数で選びたい

投稿記事by すおう » 2024年5月23日(木) 12:42

どうにもスキルの使用効果からコモンイベントを実行すると
その時点で『このスキルは誰が使ったか』の情報がどこにも残っていないようです。
なのでサイコロ振りをスキルにして別のスキルを発動する形で検証していたのですが
サイコロ振った人が誰か分からない状態になってしまいました。

ということでHaruAkiさんに追加質問です。
いま実装していらっしゃる
『行動』を選択するとサイコロを振るコモンイベントが発動するプラグイン
というものがどういうものか見せていただけますか。

これの内容によって対応の仕方が変わってきます。
HaruAki
記事: 3
登録日時: 2024年5月22日(水) 04:51

Re: 新しいスキルを既存のスキルと入れ替えたい&発動するスキルを変数で選びたい

投稿記事by HaruAki » 2024年5月24日(金) 03:01

たびたびありがとうございます。

最後の質問についてです。

まず、キャラクターのコマンドを変更するプラグイン『可変アクターコマンド』(お借りした元:https://kekeelabo.com)を使用しています。
このプラグインをDBアクター『リード』に設定し、リードのコマンドを『行動、アイテム』のみにしています。
行動を選択した場合
DBスキルに設定してある『行動を選択した場合に発動するスキル(以降振るとする)』が発動するようにしています。この振るにはダメージや使用効果などを設定していません。
振るが発動すると、プラグイン『発動前コモン ver1.01』(お借りした元:https://raw.githubusercontent.com/munokura/Yana-MV-plugins/master/Battle/BeforeCommon.js)により、コモンイベントに登録してあるサイコロを振るイベントを発動するようにしています。
サイコロを振るイベントはプラグイン『KRD_MZ_Dice』(お借りした元:https://github.com/kuroudo119/RPGMZ-Plugin)を使用しています。コモンイベントの内容は添付ファイルの画像の通りです。
条件分岐のサイコロ結果2~6も1と同じようにスキルを設定しています。
添付ファイル
iimage.png
iimage.png (91.41 KiB) 閲覧数: 837 回
すおう
記事: 38
登録日時: 2024年5月17日(金) 08:30

Re: 新しいスキルを既存のスキルと入れ替えたい&発動するスキルを変数で選びたい

投稿記事by すおう » 2024年5月25日(土) 11:46

先にいくつか訂正
・スキル選択プラグイン
 キャンセルされると変数に-1が格納されるようです。なので-1のときにどう対処するか記述すればよいことになります
・行動の強制について
 単体攻撃を全体にしたり、その逆ができると書きましたが、勘違いでした
 また単体攻撃をランダム1回にしたほうがいいと書きましたが結果として不要になったので単体攻撃のままで問題ないです

本題
『発動前コモン 』はいいですね。戦闘系プラグインは全然知らないので参考になります。
発動者のインデックスも変数保存できるので今回やりたいことができそうです

説明しやすいように今回は以下のように変数を使うとします
・発動者インデックス変数ID:21(発動前コモンで設定)
・対象インデックス変数ID:22(発動前コモンで設定してもしなくてもいいです)
・サイコロの目:23(KRD_MZ_Diceの結果格納先)
・発動者のアクターID格納変数:24
・スキルID格納変数:25

①アクターIDとサイコロで選ばれたスキルIDの取得
『発動者インデックス変数ID』ですが、コモンを呼び出したのがパーティの何番目かを示す変数です。(リーダーが0番目)
この情報からどのアクターなのか特定します
const actor = $gameParty.battleMembers()[$gameVariables.value(21)];

アクターがわかったので、そのアクターのIDと所持スキル一覧を取得します
const actorId = actor.actorId();
const skillList = actor._skills;

所持スキル一覧のうちサイコロの出目の番号のスキルを取り出します。
なおリストは0番目から始まるのでサイコロの数値-1とします
const skillId = skillList[$gameVariables.value(23) - 1] || 0;

うしろについている『 || 0』ですが、指定の場所にスキルがなかったら0を代入する、という意味です
スキルが6個未満のとき用の対処です
最後にアクターIDとスキルIDを変数に格納します。
まとめると以下の通りです。

コード: 全て選択

const actor = $gameParty.battleMembers()[$gameVariables.value(21)];
const actorId = actor.actorId();
const skillList = actor._skills;
const skillId = skillList[$gameVariables.value(23) - 1] || 0;
$gameVariables.setValue(24, actorId);
$gameVariables.setValue(25, skillId);

なお『$gameVariables.value()』『$gameVariables.setValue()』の意味については
以前紹介したスクリプトサイトの『変数の操作』を読んでください

②発動対象者
つぎに対象者ですがひとまず攻撃も回復もランダム対象とします。後述の『行動の強制』でランダム対象の場合は変数を-1に指定するので、『対象インデックス変数ID』に-1を代入します。全体攻撃ではこの値を参照しません

③スキルIDが0のときどうするか
ここではスキルの代わりに通常攻撃をとることにします。通常攻撃はID:1なので
スキルIDが0のときスキルIDに1を代入します

④戦闘行動の強制
スクリプトサイトに『戦闘行動の強制』のスクリプト記述も載っていますのでそれを参考に
いままで求めた変数をいれていきます

コード: 全て選択

this.iterateBattler(1, $gameVariables.value(24), battler => {
  if (!battler.isDeathStateAffected()) {
    battler.forceAction($gameVariables.value(25), $gameVariables.value(22))
    BattleManager.forceAction(battler)
    this.setWaitMode('action')
  }
})

これで行けると思うのですが、いかがでしょうか
添付ファイル
test.png
すおう
記事: 38
登録日時: 2024年5月17日(金) 08:30

Re: 新しいスキルを既存のスキルと入れ替えたい&発動するスキルを変数で選びたい

投稿記事by すおう » 2024年5月25日(土) 11:55

もう1つ、提言から除外すると言いましたが単体回復など対象者を指定したいときについて簡単に話します
先ほど対象者をランダム固定の-1にしましたが、これをスキル別に条件分岐してしまえば対象者を指定できます

条件分岐:スキルID52(ヒールⅠ)のとき
・パーティで一番HPが低く、かつ1以上であるメンバーがパーティの何番目にいるかを調べる(なおリーダーが0番目)
・その番号を対象者変数に格納する

とすればヒールを指定のメンバーにかけることができるわけです

この『パーティで一番HPが低く、かつ1以上であるメンバー』の部分がスキルごとにバラバラでしょうし
実際にはもっと細かく条件を決めなければいけないのでそこはご自身で方法を調べるか別途質問を立てるなどしてください

“MZ:質問” へ戻る