ページ 14

【解決済み】現在制作中の戦闘システムについて

Posted: 2024年12月20日(金) 21:24
by うさぎさん
たびたび失礼いたします。
制作中のゲームで、装備枠でセットしたスキルを通常攻撃後に繰り出すというシステムを作っています。
そこで、一応のところシステム自体は完成に近い形までもっていく事が出来たのですが、一つだけここをもうちょっとだけスマートに出来たらもっと楽なんだけどな~と思った箇所を改善できるかどうか質問したいです。

現在、防具をスキルと見立てて装備する装備タイプに、攻撃[1]~攻撃[5]という装備タイプを用いて制作しています。
なので見てくれは同じなのですが、データベース上では同じ名前の防具を5つ作る必要があります。

各武器ごとに3つの派生攻撃があり、それぞれに弱、中、強の3種類あります。
ようは攻撃[1]という武器タイプに攻撃A(弱) 3種類、攻撃B(中) 3種類、攻撃C(強)3種類と合計9個作る必要があり、それを各装備タイプごとに作るというちょっとした手間があります。
スクリーンショット 2024-12-20 202233.png

画像のようにレベル1と書かれているのが弱攻撃にあたり、レベル2が中攻撃、レベル3が強攻撃となっています。
剣[1]、剣[2]というのは装備タイプ別で分けているためです。

最初にも言いましたが、一応作業量に目を瞑ればシステムは完成しています。
ただ一応の理想的な形としては、

・弱、中、強攻撃にあたるスキルに見立てた防具を、装備タイプ毎に同じ名前の装備を作らなくて良い。
・装備をしている順番に攻撃を繰り出す

…というのが理想の形になっています。

私は装備をしている順番に攻撃を繰り出すという事がしたくて、装備タイプ別に防具を作り戦闘行動の強制で防具のIDを取得させ、アクターにそれぞれのスキルを繰り出させています。
スクリーンショット 2024-12-20 203846.png
画像の赤枠で囲んでいる部分のコモンイベントが
スクリーンショット 2024-12-20 204452.png
通常攻撃後に処理され、各攻撃処理を行っているコモンイベントで
行動回数を記憶している変数に1を加算していき、2になったら剣[2]へ3なら剣[3]へ移行し、
これで各装備タイプに装備している防具に見立てたスキルを、防具IDを取得させることで、なんとか装備した順番通りに攻撃を行わせる事が出来ています。


作り始めの頃は、New RPG Project様のこちらのプラグイン
https://newrpg.seesaa.net/article/489626316.html
を使い、拡張した装備スロットに装備したスキルで攻撃したかったのですが、これだと装備順番は関係なく、拡張した装備枠の一番上に装備した防具のIDを取得しその攻撃しかしてくませんでした。

長々と書いてしまいましたが、私が気になっているのは、
アクターが装備している防具を1番上に装備している防具だけ参照せずに、装備している枠全部の防具を参照し、アクターにその防具の順番通りに攻撃を行わせるためのデータを使えるかどうかという事です。

もしそれが出来たらNew RPG Project様の上記のプラグインが使えそうだなと感じました。

なにせこのようなコモンイベントを用いた戦闘システムを作るのは初めてなもので、知識も疎い部分があると思いますが、自分の意図が伝わってくれた方は回答してくれると助かります。

説明が下手なところもあると思いますが、よろしくお願いします。

Re: 現在制作中の戦闘システムについて

Posted: 2024年12月21日(土) 11:27
by WTR
何度か読んでみようとしてみたのですが
コモンイベントにプラグインにと登場人物が多くてなかなか難しいですね…
アクターが装備している防具を1番上に装備している防具だけ参照せずに、装備している枠全部の防具を参照し
装備している防具が全部わかればいいということでしょうか。
それだけなら大した話ではないんですが…

装備している防具を取得。複数あるので配列になります。

コード: 全て選択

$gameActors.actor(actorId).armors()
防具ID の配列にするなら

コード: 全て選択

$gameActors.actor(actorId).armors().map(armor => armor.id)
とかで助けになるでしょうか。

あとは本題じゃないですが

コード: 全て選択

if ($gameActors.actor($gameVariables.value(1)).hasArmor($dataArmors[2])) {
const battle = $gameActors.actor($gameVariables.value(1));
ここは先に battler を定義すれば

コード: 全て選択

const battle = $gameActors.actor($gameVariables.value(1));
if (battler.hasArmor($dataArmors[2])) {
と書けるのでシンプル。
もっと言えば、コピペで編集する部分は頭にまとめると見通しが少しよくなりそう。

コード: 全て選択

const skillId = 5;
const armor = $dataArmors[2];
const battler = $gameActors.actor($gameVariables.value(1));

if(battler.hasArmor(armor)) {
    battler.forceAction(skillId, -2);
    BattleManager.forceAction(battler);
    this.setWaitMode('action');
    this.operateVariable(20, 1, 1);
}

Re: 現在制作中の戦闘システムについて

Posted: 2024年12月21日(土) 15:04
by うさぎさん
返信ありがとうございます。
配列ですか。これって装備の特定の部分から取得させると事などは可能でしょうか?

デフォルトのツクールmzの装備の並びは

武器


身体
装備品

となっていますが、例えばこれを仮に装備品5まであるとして、装備品の部分から装備品5までの範囲の防具idを配列に入れるという具合なのですが。

今パッと思いついた案が、
その指定した範囲の配列に入っている防具のidを取得させます。

仮に4 4 6 6 12の値が入っているとして、
1番先頭の値を参照したら削除して 4 6 6 12の並びになれば
なんか上手くいきそうな雰囲気があるのですが、どうでしょう。

出先なのでふわっとした案しか出せないので不明な点があると思います…。

Re: 現在制作中の戦闘システムについて

Posted: 2024年12月21日(土) 16:33
by WTR
装備品→装飾品 かな?
装飾品だけ5スロットに拡張されてる、とそんな想像をしてみましたが違うでしょうか。
特定の装備タイプのみを抽出することも可能です。
デフォルトでは防具タイプ5が装飾品なのでそのままだとすると

コード: 全て選択

$gameActors.actor(1).armors()
.filter(armor => armor.etypeId === 5)
.map(accessory => accessory.id)
こんな感じで装飾品だけの配列を取得できます。

参照したら削除して… というのがいまいちわかりませんが
(できるんだけど、何がしたいのかをしっかり把握しないと…)

困ってることの本質が掴みきれてないです。
防具をたくさん作るのが面倒ということなのか
似たようなスクリプト群をなんとか一括処理できないかという方向なのか…

Re: 現在制作中の戦闘システムについて

Posted: 2024年12月21日(土) 17:38
by うさぎさん
そうですね、本来なら装飾品の枠を5つに拡張してそこにスキルに見立てた防具を装備していくといった感じです。

ただそれだと1番上の方に装備しているスキルしか使ってくれないので、無理やり装備タイプとして攻撃[1]〜[5]というカテゴリを作って装備したスキルを順番通りに発動するように制作していた感じです。

本質としては同じ防具を作るのがめんどくさいというのもありますね。

ただ今回配列というのを使えば、
拡張した装備スロットに装備している防具のidを5つ取得して、配列に格納された値を参照してからスキルを繰り出すと言った形に出来るのでしょうか?

Re: 現在制作中の戦闘システムについて

Posted: 2024年12月21日(土) 18:05
by WTR
1番上に装備しているスキルしか使ってくれないというのは
https://newrpg.seesaa.net/article/489626316.html
こちらのプラグインの機能を使った場合ということでしょうか。

これだと上手くいかなかったから今はうえのプラグインは使っていない?
そのへんの関係がいまちいでして…

装飾品と対応するスキルの関係が明確なら
装飾品を取得して対応するスキルを順番に使用するということは可能だと思います。
見える範囲だと防具ID + 3 のスキルIDを使うことになっていそうな気はしますが
融通が利かなそうなのでもう少し手堅い対応のさせかたをしたほうがいいかなーとは思います。

Re: 現在制作中の戦闘システムについて

Posted: 2024年12月21日(土) 19:36
by WTR
あまり勝手に話を進めてはいけないかとも思ったのですが

たとえば防具のメモ欄に <追加スキル: 100> のようなタグを追加して防具とスキルを紐づける。
タグ付き装備の分だけスキルを追加発動させる。
ということが↓のスクリプトで出来そうです。

コード: 全て選択

const battlerId = $gameTemp.lastActionData(2);
const battler = $gameActors.actor(battlerId);
const armors = battler.armors().filter(armor => armor.meta.hasOwnProperty("追加スキル"));
const skills = armors.map(armor => Number(armor.meta["追加スキル"]));

skills.forEach(skill => {
    const action = new Game_Action(battler, true);
    action.setSkill(skill);
    action.setTarget(battler._lastTargetIndex);
    battler._actions.push(action);
});
BattleManager.forceAction(battler);
this.setWaitMode("action");

Re: 現在制作中の戦闘システムについて

Posted: 2024年12月21日(土) 20:30
by うさぎさん
どんな感じのものか動画を撮ってみました。
上手く伝わると良いのですが……。

https://youtu.be/VY2xAnHDm6M?si=i2SpiuJzoM8BUbxv

装備品拡張プラグインを使って、スロットを5つに増やしたときは上手く処理できなかったので今は使っていないですね。理想としては使いたいですが。

動画の攻撃[1]とか[2]というのは装備タイプは別のものです。
理想としては、これを装備タイプで分けずに枠を拡張したスロットにスキルを装備した順番通りに攻撃をしてほしいという感じですね。

WTRさんが書いてくれたスクリプト、試してみます。

Re: 現在制作中の戦闘システムについて

Posted: 2024年12月21日(土) 21:14
by うさぎさん
WTR さんが書きました:あまり勝手に話を進めてはいけないかとも思ったのですが

たとえば防具のメモ欄に <追加スキル: 100> のようなタグを追加して防具とスキルを紐づける。
タグ付き装備の分だけスキルを追加発動させる。
ということが↓のスクリプトで出来そうです。

コード: 全て選択

const battlerId = $gameTemp.lastActionData(2);
const battler = $gameActors.actor(battlerId);
const armors = battler.armors().filter(armor => armor.meta.hasOwnProperty("追加スキル"));
const skills = armors.map(armor => Number(armor.meta["追加スキル"]));

skills.forEach(skill => {
    const action = new Game_Action(battler, true);
    action.setSkill(skill);
    action.setTarget(battler._lastTargetIndex);
    battler._actions.push(action);
});
BattleManager.forceAction(battler);
this.setWaitMode("action");


WTRさんが書いてくれたスクリプトを使用してみたらちゃんと装備した順番通りに動いてくれました。
ただ何個か気になった点があるので報告です。

・装飾品スロットに何も装備していないと、

TypeError
Cannot read property 'item' of undefined

と出てしまう。


・二回行動の特徴を持つアクターが攻撃した際、
攻撃→攻撃→派生攻撃→派生攻撃という挙動になる。

想定している動きは、
(1行動目)攻撃→派生攻撃
(2行動目)攻撃→派生攻撃 みたいな感じです。

あとは差し出がましいのですが、書いていただいたプラグインのほうに
注釈を書いていただけませんでしょうか?
今後の為のの勉強になると思うので、どんな処理を行っているかを書いてくれると助かります!

Re: 現在制作中の戦闘システムについて

Posted: 2024年12月21日(土) 21:24
by WTR
2回行動で派生スキルが3つあったら
1回目通常行動 -> 派生スキル1 -> 2回目通常行動 -> 派生スキル2 -> 派生スキル3

3回行動で派生スキルが3つだったら
1回目通常行動 -> 派生スキル1 -> 2回目通常行動 -> 派生スキル2 -> 3回目通常行動 -> 派生スキル3

3回行動で派生スキルが1つだったら
1回目通常行動 -> 派生スキル1 -> 2回目通常行動 -> 3回目通常行動

こんな感じでしょうか?