見出し画像

バグに対処する

結構何度か書いている気がするが、私はゲームをあそんでいるときは、サブPCでtwitchをだらだら流している。いろいろなゲームの実況を流すが、私が好きなのはPoEとEverquestとあとはローグライト系のものだ。Everquestは、P99で遊んでいるすごいうまい人がいて、Plane of Hateや、Fear、PoM、VL、HSなどをソロで遊んでいる。基本的にクラスはENC、DRU、NECというチャームができるクラスでmobをチャームしてnamedを引っこ抜いて倒すというやりかただ。まあ、とにかくうまい。これでレアなアイテムを密猟して売っている。結構みていて飽きない。私も同じくらいのプレイができるといいのだが。

今日の話は私がマクロを作るにあたって遭遇したバグに関して話をしたい。すごく細かくて退屈なので読み飛ばしてもらってかまわない。Macroquest2は便利なソフトだが、結構いい感じでバグが入っている。これは最新のものでもかなり改善されたものの、まだ完全とは程遠い。

このサーバのレンジャー(RNG)は、すごくピーキーなクラスで、マナの供給が十分で、いくつかの一時的なバフを組み合わせると瞬間的な火力が他のクラスを圧倒し、ヘイトがすごいことになる。こうなるとどのタンク職もヘイトを維持できず、RNGがトップになり、そのまま殺されるか、RNGがタンクの役目を果たすことになる。最初はこれに対処するために、合間合間にヘイトを下げるjoltを撃つようにしていたが、焼け石に水(実はサーバの問題でヘイトが最近まで下がっていなかったらしい)で、次に、ヘイトがある量に達したら自分をCoHしてヘイトを消すマクロをつくったりしていた。どれも決め手に欠け、ちょっとしたボス戦で毎回RNGが死んでいた。そうこうしているうちに、なにかのパッチで、以下のアイテムが実装された。

アイテム
その効果

たぶんだが、ライヴの期間限定イベントでもらえるアイテムを改変したものだと思う。飲むと、Improve Death Peaceが発動しFDし、Feign Death in Afternoonという12秒くらい持続するバフがつく。このバフはなんの効果もないが、バフが消えるときに、ノラースのどこかの酒場にゲートする。酒場は大抵PoKだが、ひどいときだとRunnyeyeの酒場だったりする。このアイテムは生産でちょっと手間がかかるがほとんどお金がかからずに作ることができる。結構な人がこれを簡易的なゲートアイテムとして使うと思うが、酒場に飛ぶバフを消すことができれば、普通のFDアイテムとして使える。FDするので、ヘイトがすっかり消える。ヘイトが問題のRNGにとっては最高のアイテムだ。早速自動的に酒場へ飛ぶバフを消すマクロを組み込んで長いこと使っていた。ヘイトを気にせずDPSがだせるのは非常に大きい。
しかしあるときのサーバ側の修正で、バフをきちんと消さなくなり、気づいたら、重要な戦闘中に酒場にもどっていることがあった。

悲しい

最初はラグの問題かと思った。バフを消す処理をいれている場所が限定されているからだ。しょうがないので、頻度よく消す処理を入れたが、まったく改善しない。実際に問題が起きている様子をみると、きちんと消しているときと消せないときがあることがわかった。ということは、これは消すコマンドがきちんと機能していないのではないかと思った。

/removebuff "Feign Death in the Afternoon"

これがバフを消すコマンドだ。普段はきちんと消すが、戦闘中で忙しい状況になると、このコマンドを連打してもバフが消えない。しょうがないので、このコマンドを使わず、バフのウインドウを調べて、該当するバフが入っていた場合、そのバフを左クリックするというマクロに変更した。コードは以下のような感じ。

/varset buffpos ${Me.Song[Feign Death in the Afternoon].ID}
/nomodkey /notify BuffWindow BW_Buff${buffpos}_Button leftmouseup

一行目が、バフの位置を特定するものだ。IDと書いてあるが、これは実際のバフのIDではなく、バフのスロット番号だ。二行目が、UIのバフの入っている位置に左クリックのイベントを送るコマンドだ。これで直るだろう。完璧だ。

状況はかわらず

んん?どういうことだ。どうもこれでもバフをきちんと消してくれないようだ。これは八方塞がりか。もうこの技でヘイト消しはできないのだろうか。それは困る。ヘイトを調整しながら戦うとDPSが大幅に落ちるし、逆に無視した場合は即死する。これではRNGを使い続けるよりももっとヘイト下げ技が充実しているROGやMNKのほうが総DPSが高くなる。
とりあえず、実際にどうして消せないのかをもうちょっと詳しくみていくことにする。

古典的なprintfデバッグ

これは酒を飲んだときと、バフを消そうとしたときの状況でデバッグメッセージを追加したものだ。一行目は、酒をクリックし、成功したことを示している。二行目は、消そうとしているバフの位置と、そのバフの名前を表示している。本来ここには、「Feign Death in the Afternoon」が表示されるはずだが、なぜか関係ないField Armorerを消そうとしている。バフの位置は1だと言っている。3行目は、そのバフの位置1に「Feign Death in the Afternoon」があるかどうかを調べた結果を表示させている。どうもないらしい。4行目以降は、バフの一覧を表示させている。これをみるに、バフの位置5に問題のバフがあるものの、バフの位置を教えてくれるコマンドは1を報告している。
というわけでMacroquest2のバグだった。バフ位置を返す変数は時々嘘を言うというものだった。たぶんサーバ側のバフの扱いを変更したのとクライアントの作りがあわないのだろう。結局、バフの位置をもらったら、その位置にきちんと所望のバフがはいっているかどうか調べ、入っていないなら、バフ欄をなめて探すというやり方にした。今のところ、これで気づいたらPoKに戻っているという問題はなくなった。最終的なコードは以下のような感じ。

いままで一行で済んでいたバフを消す処理が、こんなに複雑になってしまった…
Macroquest2は、ライヴでの使用が禁止されている都合上、オープンソースであるにもかかわらず、扱いが全然オープンではなく、さらに使用が許されているエミュレーションサーバでのフィードバックをきちんと受けるパスがないようなのでコードの品質があまりよろしくない。まあこの辺は騙し騙しつかっていかなければならないと思う。



この記事が気に入ったらサポートをしてみませんか?