論理と、幻想と。

ゲームやガジェットが好きなITスペシャリストが作ったものや考えたことについてダラダラ書きます

パーティメンバーごとのリキャスト表示パネルの作成

パーティメンバーごとに固有のリキャストを表示するパネルを作成しました。 ざっくりした動作イメージはこんな感じです。(召喚士のアドルが暗転してないのはちょっとした設定ミス)

f:id:hackermind:20191005190143j:plain

特にレイド攻略を効率的に進めることを意識して作りました。

できること

主要アビリティのリキャスト状況をパーティメンバーごとに視覚的に判断できるようになります。

以上です。

背景と考慮したこと

  • 共通
    • すぐに判断できなくても録画を見直したときに「あ、ここでこれ使えたね」という話がしやすくなる
  • タンク視点
    • 野良だとかぶりがちな相方タンクのリプライザルのリキャスト状況を知りたい
    • 相方タンクの挑発・シャークのリキャスト状況が気になったりしなくもない
      • スイッチミスの発生後のリカバリなんかで少し役に立つかもしれない
    • ベネディクションや転化などの強力な回復リソースがあるかどうかか知りたい
      • リビングデッドを使っても安心かどうか判断できるかもしれない
  • ヒーラー視点
    • 相方ヒーラーの迅速魔がリキャスト中なのかどうか確認したい
      • 今自分が迅速なしの蘇生を詠唱すべきかどうか判断できるかもしれない
    • 相方ヒーラーのリソースを見て自分が援護するかどうか判断できるかもしれない
      • ルーシッドドリーム使ったばっかりなのにMPがない、じゃあリカバリは自分がやるか、とか
    • タンクの単体軽減バフや無敵アビリティのリキャスト状況を把握したい
      • 「リキャスト戻ってるんだったらそれ使って!」と言えるかもしれない
      • 突然のボーライドに対する心構えができるかもしれない
    • DPSロールの回復をする際に内丹・ブラッドバスなどのリキャスト状態を把握したい
      • 「そこは内丹とブラバスで何とかしてくれ」とも言えるかもしれない
  • 赤魔道士・召喚士視点
    • ヒーラーのどちらも蘇生に十分なリソースがない場合、キャスターの自分が蘇生すべき、といった判断ができるかもしれない

実装したもの

パーティリストの左側に、右詰めで最大6つのリキャストアイコンを表示するようにしました。

しかし6つも横に並んだアイコンというのは多いです。正直言って邪魔です。なので一番左の2つは、自分がタンクの時だけ、相方タンクの挑発・シャークのリキャスト表示を追加するための領域にしました。基本的には4つまでに絞っています。

実装の詳細

正規表現による置換

スペスペの設定でパーティメンバーのプレースホルダーを有効にしてあることが前提です。これを有効にするとパーティメンバーの2番目なら <2>、3番目なら<3>、という置換が有効になります。

すごい雑なネーミングですが、Partymenber TwoさんがPTリストの2番目にいるとします。

トリガーのマッチング対象文字列に<2>と記述し、正規表現を有効にした場合、スペスペが設定を読み込んで実際にトリガーを動かすためにコネコネする過程で、ゲーム上のパーティリストと照会して、Partymenber Twoとマッチングするように置き換えられます。

クライアント側でチャットログをイニシャル表示にしている場合にはログに出力されるキャラクター名も変わります。そうした場合でもマッチングさせたいので、これらのパーティメンバのリスト上の位置については<2ex><3ex>と記述します。

<2ex><2>の拡張で、Partymember TwoであってもPartymember T.であってもP. TwoであってもP. T. であってもマッチングします。しかし姓も名も両方イニシャル表示にしてしまうと複数キャラでイニシャルが被ってしまうこともありそうで、そうなった場合の挙動は分からない。ので私は推奨しないです。

正規表現の条件式によるフィルタ

補助輪のv7.8.7で搭載された新しい機能を使っています。 トリガーに以下のような設定項目が増えました。というか私が欲しかったけれどすぐに作れなかったのでお願いして作ってもらいました

f:id:hackermind:20191005190150p:plain

このようにトリガー設定をすると、Targetで指定した <2> を展開した文字列の中に、Regexで指定した正規表現 <TANK> を展開した文字列が含まれる場合にのみアクティブになるトリガーができます。

仮にPartymember Twoさんがナイトだった場合、<PLD><TANK> というスペスペ独自の正規表現を紐解くと、ここにもPartymember Twoさんの名前が出てきます。よく分からなかったら、そういうもんだと思っておいてください。

  • Targetである <2> は、Partymember Two を含む。
  • Regexである <TANK> も、Partymember Two を含む。

これが一致した場合に、フィルタの条件式をクリアしたことになって、トリガーが有効になります。 ちなみに複数のフィルタ条件式を指定した場合にはこれはORとして解釈されます。いずれかがTrueである場合にトリガーが有効になります。

この機能によって、

  • PTリストn番目にいる人がTANKロールのいずれかであった場合
  • PTリストn番目にいる人が白魔道士であった場合

といった条件を持つトリガーが簡単に定義できるようになりました。

当然ながら、ここで定義したフィルタについてはv7.8.7以前のバージョンの補助輪で動かすと条件の判定ができず、そもそも無効なプロパティとしてフィルタ情報そのものが削除されるのでご注意を。

メンバー分のスペルパネルの作成

パーティメンバー1人ずつにスペルパネルを作成します。 以下で一枚のスペルパネルになっています。これを人数分並べて、冒頭で紹介したサンプルのような表示を実現しています。

f:id:hackermind:20191005191928j:plain

1つスペルパネルを作ったらxmlにエクスポートして、フィルタ条件式の <2ex> の部分を<3ex>~<8ex> まで書き換えたパネル定義を複数作ってインポートします。 あとは実際のパーティリストと高さが合うように良い感じにレイアウトをいじります。パーティリストの枠ひとつあたりの縦のサイズをオフセットとして覚えておいて、各パネルのY座標に加算していくと楽に綺麗なレイアウトができます。

パネル内レイアウトについて

PTリストに綺麗に隣接するよう右詰めにしたかったので、少しだけ回りくどい設定をしています。

普通に左詰めのリストを作るだけならスペルパネルのグリッドの左上を起点として、表示順を優先するようにすればOKです。が、右詰めにしたかったので 高度なレイアウトを使用する にチェックを入れてHorizonal AlignmentをRightに指定、それぞれのアイコンの描画開始位置(アイコンの左上になる場所)を相対座標で指定しています。

この配置は各スペルパネル内の各トリガーのプロパティとして保有しています。面倒だったので、トリガーのXML内に <Left>-39</Left> みたいな感じで直接定義しています。そのまんま「一番左側を起点とした座標」だったのでマイナス指定で思った通りのレイアウトにできました。

自分はアイコンサイズ33px がちょうどよかったので、少しマージンを開けて39pxごとのマイナス座標を定義して、右から順に各アイコンを配置します。 右から1番目に表示したいアイコンの描画開始位置のX座標は-39、2個目は-78です。こんな感じにレイアウトしてます。

f:id:hackermind:20191005193821j:plain

パーティリストのソートについて

前提に近い部分にまた戻ります。

クライアント側のパーティリストの並び替え設定と、スペスペの並び替え設定を合わせておかないと、期待したとおりのところに表示されません。スペスペ側をゲーム内の設定に合わせます。

補助輪のインストールディレクトリ内の resources/PCOrder.txt を編集します。なければ PCOrder.sample.txt をコピーして PCOrder.txt にリネームしてください。

で、このファイル内に記述された順序がゲーム内の表示順と同じになるようにします。編集して保存したらACTごと再起動すれば有効になります。以下は私の例です。

WAR 1
DRK 2
GNB 3
PLD 4
WHM 5
AST 6
SCH 7
MNK 8
DRG 9
NIN 10
SAM 11
MCH 12
BRD 13
DNC 14
BLM 15
SMN 16
RDM 17
BLU 18

リキャスト管理対象アビリティについて

今回、リキャスト管理をするアビリティについては以下のように選定しました。

  • リプライザル、アドル、牽制などの敵単体への軽減デバフ
    • だってほら被ったら悲しいじゃん
  • トルバドゥール、タクティシャン、守りのサンバといった、遠隔物理DPSのPTメンバに対する防御バフ
    • レンジは複数PTに入ることが少なくない上、これらのスキルは効果が重複しない、だから被ったら悲しいじゃん
    • タンクの範囲防御バフについても表示したかったけど、そうするとタンクだけ表示項目が多すぎるので優先度を下げた
      • 「パーティ全体で戦略的に使いたいスキル」のリキャスト表示用のパネルを別に作って、そちらに入れることにした
  • タンクの単体防御バフ
    • ロールアクションのランパート
    • 他に各ジョブ固有の30%軽減アビリティ(センチネル、シャドウウォール、ヴェンジェンス、ネビュラ)
  • タンクの無敵バフ
    • インビンシブル、リビングデッド、ホルムギャング、ネビュラ
  • ヒーラーの迅速魔
  • ヒーラーと赤魔道士・召喚士のルーシッドドリーム
    • 黒魔道士は蘇生もなけりゃMPを考慮する必要もないため除外
  • ヒーラー各ジョブのリソース運用に強く影響を与えるスキル
    • 白魔道士のシンエアー
    • 学者のエーテルフロー
    • 占星術師のライトスピード
  • その他、ヒーラー各ジョブのヒールワークに大きな影響を与えるスキル
    • 白魔道士のベネディクション
      • 自分は入れてないけど気になる人はテトラグラマトンなんかは見てもいいかもしれない
    • 学者の転化
      • 展開戦術なんかも表示してもよかったけど、これは「パーティ全体で戦略的に使いたいスキル」のパネルへ
    • 占星術師のシナストリー
      • ニュートラルセクトなんかも表示してもよかったけど、これは「パーティ全体で戦略的に使いたいスキル」のパネルへ
  • 物理DPSの内丹
  • 近接物理DPSのブラッドバス
  • 吟遊詩人の地神のミンネ、踊り子のインプロビゼーション、モンクのマントラ
    • スペース空いてるから入れたけど、これは「パーティ全体で戦略的に使いたいスキル」のパネルが適切かもしれない、お好みで
  • 黒魔道士のマバリア
    • そういえば、XIVAPIから入手できるアイコンセットの中にマバリアのアイコンだけなかったので自分でゴニョゴニョしました。PvP用のマバリアはあるのでそっちで代用してね

入れるかどうか悩んだのは「天地人や黒魔紋のように、当該メンバの移動を強く制限するスキル」です。戦術(フォーメーション)を組み立てる段階ではそれなりに使いみちはありそうだけど、普段から使う分には重要度が低いと思って入れませんでした。必要だったら追加すればいいんじゃないでしょうか。

余談

当初はマッチング条件をACTプラグイン側の出力するログ(gains effect of xxx みたいなやつ)にしようかと思いましたが、例えば迅速魔を使ったのと同時に戦闘不能になった場合など、使ったはいいけど効果が発揮されていない=ログが出力されない場合、があったりでイケてなかったので、原則的にゲーム上で出力されるログのみを拾うようにしました。

正しく動かないかもしれないケース

  • パーティメンバーが違うエリアにいる場合
    • そいつがいないことになって順序が狂う
  • パーティメンバーの名前にハイフンが含まれている場合
    • 正規表現のフィルタが正しく動いていない可能性があることに気づきました、調査してみます
    • 2019.12.29 修正しました

サンプルのダウンロード

せっかくなんでエクスポートしたxml置いときます。「動かない」とか「これ追加してほしい」、とか個別に対応するのはしんどいので、自分で良い感じに弄って使ってもらえればと。