【ウディタ講座】SRPGをつくろう! 武器アイテムの「装備」と「攻撃」の実処理

最低限のアイテム機能の実装編も今回で一区切りとなります。

SRPGでアイテムといえばなんと言っても武器であり、武器は装備して攻撃に使うものです。装備ウンヌンや攻撃時の武器選択の処理を作っていきましょう。

操作のフローにこだわりたいところですが、作るのが大変で悩ましくも楽しいパートです。

そのユニットはこの武器を装備できるのかの判定

使用可武器はクラス依存

ユニット番号とアイテムIDを送ったら、そのユニットがそのアイテム(武器)を装備できるのかどうか、可否を返すコモンを作ってみましょう。

 

FEライクでは武器種の装備可否はクラス依存です。剣士なら剣、魔法使いなら魔法、というわけですね。

1クラス1武器種なら簡単なのですが、上級職などは2つや3つの武器を使えることがよくあります。

文字列変数で対応する方がラクそうです。

以前に作ったアイテムの「子カテゴリ」では「-100剣、-101槍、-102斧……」となっていました。そのままでは扱いにくいので、+100からの×-1をかけて整形し「0剣、1槍、2斧……」として判別していきましょう(整形した方が覚えやすいかな、というだけです)。

0が剣を意味するわけですから、クラスUDBの指定に対応のナンバー0が入っていれば、そのクラスは剣を使えることになりますね。

MEMO

ビット積の考え方を使えば、数値の設定だけで近いことはできるかもしれません。筆者は文字列変数でなんでもかんでも押し進めてしまいますが……

MEMO

TOライクでは、本来剣しか使えないクラスでも「槍装備可」のようなアビリティをおぼえることで装備幅が広がります。

本記事での処理でも対応する場合は、コモン内で取得した「使用可能武器リスト」をアビリティにも設定し、クラス設定+アビリティ設定のリストを参照する形式がよいのかなと思います。

「主人公にしか使えない剣」といった設定をしたい場合は、アイテムの方に「対応キャラID」という項目を作って、チェックしているユニットのキャラIDとの一致を見ることになるでしょう。

最大射程の取得

過去の記事でこんな話をしていました。

「複数のアイテムを持ち歩いて、任意の武器を使える」とか「アビリティによって本来装備できない武器が装備できる」といったゲームシステムの場合、「そのユニットが今できる攻撃(使える武器)の最も射程が長いもの」の取得もそれなりの計算量に。

 

自軍リーダーが槍(射程1)と弓(射程2)と剣(射程1)を持っていて、使用可能な武器は剣と弓なので、そのうちの射程の長い方は弓……という言葉にするだけで長い判定をコモンイベントで毎回やっていたら大変ですよね。

 

しかし、アイテムの増減やクラスの変更でもない限り再計算の必要もありませんから、いちど計算したら、その値を「最大射程」に持ち続けておくと、いくらかゲーム全体の計算量がおさえられるのではないでしょうか。

危険範囲の表示にもかかわりますし、「最大射程=0なら今は使用可能な武器がない」(攻撃できない)とすぐに判断できます。

この最大射程の計算・登録処理を作ってみましょう。

所持品すべてに対して装備可否と射程の取得を行えばよいですね。事前にアイテムUDBに「射程」の項目を増やしておきましょう。射程は剣1、弓2がスタンダードですね。

これができたら、ユニットの登場時やアイテム・クラスの変更時に毎回呼び出して最大射程の再計算をするように。

装備可武器の自動換装(ソート)

武器アイテムの使用(装備)に関して、過去にこんなことを書きました

FEライクでの装備を、もっとも簡単に考えるなら「いま装備している武器」とは「アイテムスロットの先頭にある使用可能な武器」のことです。

道具コマンドで装備を実行したアイテムはスロット1に移動する、と考えることができますね。

言い換えると、「唯一の装備可能な武器がアイテムスロット3に入っている事態は異常(バグの元)」でもあります。

しかし、この手の状況は意図せず頻出しそうです(UDBの登録ミスや、使用回数が尽きた武器が消えた時など)。

 

「装備可能なアイテムが他にあるのに、スロット1が装備不可アイテムのときは、位置を交換する」コモンも念のため作っておきたいところです。

交換処理中は上詰めさえ働いていればよく、交換コモン終了時にだけ、このチェックを通すとよいかもしれません。

勝手にソートされて指定したのと違う場所にアイテムが表示されると、いかにもバグっぽく感じます。

MEMO

このあたりはかなり不真面目な装備状態のチェック方法です。各々アレンジしてくださるとよいかと……。

攻撃コマンドの実動作

ユニット操作時に「攻撃」コマンドを出すかどうか

最大射程が0なら「攻撃」コマンドは出ません。

なおかつ、その現在位置から「使えるすべての武器(射程)」で攻撃できる対象がどこにもいないなら、やはり「攻撃」コマンドは出ません。

なかなか大変に見えますが、だいたいは既存コモンの組み合わせで判別して行けそうです。

「┃┣★攻撃可否」コモン

(最後の文章コマンドはデバッグ用なので、確認したら消してください)

このコモンを「┃┣表示コマンドリスト取得」コモンで呼び出して(呼び出し後にパネルを消去)、返り値の文字列変数がカラでなければ攻撃することができる(攻撃コマンドを出す)、と考えてよいはずです。

次の「使用武器の選択」も見越して、”使える武器のリストを取得する”という書き方になっています。

「攻撃」コマンドの次は「使用武器&攻撃対象の選択」

攻撃コマンドを決定したら起こることは、使う武器とそれで攻撃する対象の決定ですね。

ここからのUIとフローは悩ましいものがあります。

  • 古いFEでは、「使用武器」を選んで、「その武器で攻撃する対象」を選ぶフローでした。作る上では素直な流れですが、プレイする上では若干のまだるっこしさを感じます。
  • 『覚醒』以降の3DSのFEだと、このあたりの武器選択と対象選択のUIは非常に洗練されていて直感的ですが、本記事のようなマウス操作では非常にマネしづらい構成です(必要ボタン数が多い)。

うまいことイイとこ取りをしたいものです。

 

  1. 攻撃対象(ユニット)選択をすぐに始められるフロー
  2. 使用可武器で攻撃可能な地点・ユニットのすべてのパネルを表示
  3. カーソルの合っている敵と戦闘予測(双方のHPや命中率などの表示)をする
  4. ある対象に対して使える武器が複数ある時(射程1武器が2つある等)、使用武器選択を追加

こういう感じでやってみたいと思います。

2番については、上記の「┃┣★攻撃可否」コモンを呼べばOKですね。から、その返り値を参照しながら働く3~4番の処理を新たに組み立てることになります。

そのパートについても、元からある対象選択待ちコモンへ追加の情報を送ることでなんとかなるかと思います。

こんな感じに。

主人公は剣(射程1)と弓(射程2)が使える設定です。

あとは、カーソルの合ったユニットに対して、戦闘予測(双方のHPや命中率など)の表示をかければよいですね。

攻撃コマンドの対象選択

戦闘予測表示の骨子

上で言う「3.カーソルの合っている敵と戦闘予測(双方のHPや命中率などの表示)をする」のパートです。

元からある「┃┗対象決定待ち」の文字列変数(cself5)を攻撃用とし、「┃┣★攻撃可否」の返り値の文字列変数を送りましょう。

また別の戦闘予測表示用のコモンに文字列変数(cself5)をそのまま渡します。攻撃でなければcself5はカラになるようにしておいて、戦闘予測表示用のコモンもカラの文字列変数が送られたらなにもせず終了するようにすればOK。

まだ戦闘時の計算式も出来てませんし、使用武器のチェックは次の項目で行います。

とりあえず下図のように仮画像を出すようにしてひと段落としましょう。

「★戦闘予測の表示」コモン骨子

 

表示情報が増えるといよいよ画面が狭く感じますね。

攻撃コマンド実行時に操作ユニット位置への画面フォーカスをかけたり、文字サイズの調整やスペースを取らないような表記法も行いましょう。

こんな感じにするといくらか省スペース化ができて、使用可能な武器が複数あるという表示と選択肢の準備になりそうです。

よく考えると予測ダメージ量が無かったり、武器じたいの威力(性能)はまた区別されているべきですね。見落としが多いですが、次の項目で直していきます。

使用可武器が複数あるときの表示

上で言う「4.ある対象に対して使える武器が複数ある時(射程1武器が2つある等)、使用武器選択を追加」のパートです。

FE系なら武器の残り使用回数の関係で「てつの剣を2本持っている」なんてことはザラにありますね。

先に取得した武器リストは「操作中ユニットがその位置から攻撃に使える武器のすべて」でした。戦闘予測では「さらにそのリストのなかから対象に選んだマス・ユニットに対して使える武器」をチェックしてリスト化する必要があります。

MEMO

なんと呼び分けていいものか迷いますが、「現在マスからの使用可武器リスト」から「対象マスへの有効武器リスト」へ、というイメージでしょうか。

そのユニットの現在位置と対象マスの距離が、使いたい武器の射程と一致していれば有効です(射程1の武器は現在位置から距離1のマスに届く)。

逆に、敵側の方は有効な武器がなければ反撃自体ができないため、武器の表示数ゼロということもあるでしょう。

表示情報の修正がてら、そのへんをやっていきます。

 

「★戦闘予測の表示」コモン改良版(抜粋)

開始時は、使用範囲のピクチャを毎回消去するように。

「現在マスからの使用可武器リスト」から「対象マスへの有効武器リスト」の処理部分

有効武器リストを画面に反映(操作中ユニットの情報表示)

対象ユニット(敵)の情報表示は武器数が0~1(反撃可能かの確認)

 

さて、マップ上のユニット情報を次のように設定し、動作確認してみましょう。

  • 主人公ユニット(101)は「てつの剣(射程1)、はがねの剣(射程1)、ぎんの弓(射程2)」が使用可
  • 敵軍(赤スライム)はいずれも「てつの剣(射程1)」のみ装備
  • 友軍(緑スライム)は装備なし

戦闘の計算式がまだなので、実際のダメージ量や命中率は取得されていません。複数武器があるときは、とりあえずいちばん上のスロットの武器に準拠して計算・表示すればよいでしょう。

 

使用可武器が複数あるときのフロー

「★戦闘予測の表示」コモンでは「対象マスへの有効武器リスト」が返り値として設定されていました。

ここから攻撃対象を決定し、攻撃をいよいよ行うぞという時に、有効武器リストが2行以上あったら使用武器選択のフローを追加すればよさそうですね。

「★戦闘予測の表示」コモンの呼び出し元である┃┗対象決定待ち」コモンで処理を足し、また別のコモンを呼ぶようにします。

また、このコモン自体の終了時に戦闘予測のピクチャが消えるように命令を足しておきましょう(「★戦闘予測の表示」コモンをcself5をカラで呼び出してもよいですね)。

MEMO

武器が1つだけ=選択肢が1つしかないときでも、このコモンを通してもよいでしょう。「本当に攻撃を実行していいですか?」という確認が丁寧な動作となりますね。

 

ちょっと話が飛びますが、「使用武器が決定した後」にどうするかは、考え方が複数ありそうです。

いちばん簡単そうなのは使用武器を決めたらそれをスロット1へ移動させてしまうことかと思います。

あとはそのまま戦闘の実行部へ進み、そこでは使用されるのは常にスロット1(装備可能なら)として進めて行けるからです。

本家のFEでも最後に使った武器が自動的にスロット1へ置き換えられて、COMターンではその武器で反撃していく仕様だったはず。

仮の攻撃動作コモンもそのように書き換えてみましょう(スロット1アイテム名を取得して表示)。

 

というわけで、使用武器選択コモン本体で行うことは次の3点です。

  • 有効武器リストの選択肢化(画像はすでに表示されているものを使用)
  • 選択中の武器に合わせて戦闘予測の数値を変更
  • 使用武器を決定したら、それをスロット1へ移動

 

やっていきましょう。

元から出ていた画像が急に選択肢になってもわかりにくいですから、今回は「画面上に求める操作の明示」をし、カーソルが合っていなくても最後に点灯したピクチャ(初期状態は選択肢1)は光り続けるタイプへマイナーチェンジしています。

コモンを細かく分けているため、さっきやったようなことを計算しなおしてしまっていますね。このあたりは改良の余地があるかもしれませんが、「動けばいい」の精神で。

できあがり

ゲームUIや操作フローの尽きない課題

筆者としては、自分好みの操作が作れたように思います。

しかし、ここでちょっと留意点が。

作者にとっては新しく使いやすいフローだとしても、よくあるスタンダードな形式を外れていればプレイヤーさんには覚えなおす手間が発生します。斬新なものが作れても受け入れられるとは限らないのですね。

このあたりを踏まえ、おもいおもいの動作フローを構築するとよいかと思います。

 

また、わかりやすさがどうのと言いつつ見栄えへの配慮がこれまでほとんどありませんでした。素材を入れ替えたり、各種自作システム画像の表示位置など、もっと調整すると様変わりしそうですね。

 

MEMO

攻撃のシステム面での課題としては「手槍」系の武器への対応があります。射程1-2というように、複数の射程を持つ武器の設定ですね。

【ウディタ講座】SRPGをつくろう! まとめ