highlight

2020年12月31日木曜日

Castle Nathria - Lady Inerva Darkvein

Lady Inerva Darkvein

シングル phase の戦闘。Boss の ability は、Primal Anima Container が徐々に満たされる量に応じて強化されていく。 プレイヤは部屋の周囲にある Anima Container が吸い取った Anima を排出して、強化を除去する必要がある。

2020年12月30日水曜日

Castle Nathria - Hungering Destroyer

Hungering Destroyer

Hungering Destroyer は、シングル phase の "Patchwerk" のような戦闘で、ミニグループでの heal が肝となる。 Gluttonous Miasma は heal immune かつ dispell 不可で、その DoT ダメージを一人で受けきれるものではないので、何人かで split しなければならない。 tank の力量と raid の位置取りが戦闘の肝となる。

2020年12月29日火曜日

Castle Nathria - Huntsman Altimor

Dungeon Guide の翻訳が終わったら Raid Guide を訳そうと思ったけど、私の仕事が遅いもんで、もう LFR wing1 が open してしまった。 とりあえず Wing 1 から順番に訳す(意訳と独自解釈)。

私が所属しているギルドはもう自前レイドも開催してない様で、raid への参加は LFR 専門なので Normal 以上については翻訳が間違ってても多分気づかない。 Normal の 1st は Shriekwing だそうだが、LFR には登場してないので後回し。

Huntsman Altimor

Boss 本体とその pet との戦闘になる。 Boss の攻撃はずっと単調だが、呼び出す pet に応じて戦い方を変えていく事になる。

2020年12月27日日曜日

Spires of Ascension

World of Warcraft - Shadowlands 拡張のダンジョンガイド Spires of Ascension 編。

Covenant - Kyrian

Kyrial を選んだプレイヤは、ダンジョンの特定箇所で倒れている Kyrian が持っている槍を使える。使うと Spear of Destiny が発動する。

2020年12月10日木曜日

Hall of Atonement

World of Warcraft - Shadowlands 拡張のダンジョンガイド Hall of Atonement 編。Wowhead の翻訳ベースだけど、端折ったり改変したりしてる。

Covenant - Venthyr

ダンジョンの至るところに居る Loyal Stoneborn に、 Venthyr のプレイヤが近づくと、Loyal Stoneborn というアクションボタンが現れる。 これを押すと、Loyal Stoneborn は 30 秒間パーティと一緒に戦ってくれる。時間がすぎるとどこかに飛んでいく。 Venthyr だとこの mob と戦わずに済むばかりか、結構なダメージを叩き出す。また、プレイヤーが受けるダメージを 10% 減らす Stoneborn boon を掛けてくれる。

2020年11月15日日曜日

ElvUI で日本語チャット

World of Warcraft で日本語チャットを行う為に、これまでずっと Prat にフォントを追加して使っていたが Shadowlands(9.0.0) patch 以降、エラーが断続的に発生するようになった。 エラーダイアログが表示されて鬱陶しいので、どうしたものかと思っていたが、ElvUI を使い始めてから ElvUI にも日本語フォントを追加できたら Prat 要らなくね?とはずっと思っていたので、これを機に試してみた所、ElvUI のチャットウィンドウでも日本語表示が出来るようになったので、記事にしておこうと思う。

2020年8月6日木曜日

std::is_invocable でオーバーロード関数の呼び出し可否を判定

c++17 で追加された std::is_invocable について考えた。 1つ目のテンプレートパラメタが判定対象の型になっている。ある関数について、ある型の引数を渡したときの呼び出しの可否を調べたい場合、確かに関数(と渡す引数)の型さえ分かれば呼び出しの可否は判定できるので、この形には納得がいく。関数の型は decltype で取ればいい。

#include <iostream>
#include <type_traits>
#include <boost/type_index.hpp>

struct A {};

struct B {};

// no overload
int foo([[maybe_unused]] A const& a, [[maybe_unused]] B const& b) {
    return 42;
}

// overload
int ovlFoo(int, [[maybe_unused]] A const& a) {
    return 9;
}

float ovlFoo(int, [[maybe_unused]] B const& b) {
    return 2.7182;
}

template <class T>
auto ti() {
    return boost::typeindex::type_id_with_cvr<T>();
}

template <class T, class U>
void showTypes() {
    std::cout << "(" << ti<T>().pretty_name() << ", " << ti<U>().pretty_name() << ")" << std::endl;
}
template <class T, class U>
void test0() {
    if constexpr (std::is_invocable_v<decltype(foo), T, U>) {
        std::cout << "Can call foo: ";
    } else {
        std::cout << "Cannot call foo: ";
    }
    showTypes<T, U>();
}
と思いきや、オーバーロードされている関数について、任意の型で呼び出せるか判定したい場合に、はたと手が止まってしまった。

is_invocable の1つ目のパラメタに、decltype で型を取ろうとしても、オーバーロードされた関数の様な複数の型が返ってくるようなものに decltype を適用するのは不適格とされているので使えない。 私はこの時点で一旦 is_invocable の使用は諦めて SFINAE で判定すればいいやと思っていた。 しかしある時 c++20 で導入されたコンセプト std::invocable も同じ様なテンプレート引数を取るようだという事を知ってしまった。 このコンセプトを使う上で、使い方をキチンと分かっておく必要がある気がしたので、ここで漸く真面目に考えたところ、こういう時は関数オブジェクトクラスを使ってたのでは?という単純な事に気がついた。 ラムダが使えるようになってからは出番が激減していたので、その存在が記憶の隅っこに追いやられて居たのか、なかなかコレを思いつかなかった。 最終的に結局はジェネリックラムダを使う方法が良いのかな、という目下の結論に至ったのだが、その過程を記事にする。