Visual Studio 2019 Version 16.7以降でディレクトリ生成を伴うシェーダコンパイルに失敗する

8月頃にリリースされた16.7.1から、現在リリースされている16.7.5まで確認済み。
そう、二か月以上Visual Studio 2019でシェーダがコンパイルできない致命的な状態なのである。

再現手順はとても簡単で、DirectX-Graphics-SamplesのVS2019に対応した適当なリビジョン(タグ10.0.19041.0以降あたり)を取得してきて、VS2019でModelViewerをビルドするだけ。シェーダコンパイル時に大体次のような意味不明なエラーを吐く。プロファイルによってはfxcである場合もある。

dxc failed : error code 0x80070459.

詳細な条件は次の通り。

  • hlslファイルをソリューションエクスプローラーに設定して、本来なら正常にコンパイルできる設定にしてある
  • 「ヘッダー ファイル名」または 「オブジェクトファイル名」にディレクトリ生成を伴うパスを指定している
    • 例えば、CompiledShaders\%(Filename).h や $(OutDir)CompiledShaders\%(Filename).cso は該当する
    • 一方、 $(OutDir)%(Filename).cso  はディレクトリを生成しないので該当しない

この原因は以下に報告されている。

Typo in FXC Target in VS 16.7.1 (Developer Community)

要するに、「 FxcOutputs 」と記述されるべき設定が「 _FxcOutputs 」とタイポされているというあまりにもお粗末で下らないバグだ。

幸いにも、プログラムによるバグではなく、設定ファイルによるバグであるため、手元で修正することが出来る。
Visual Studio 2019のインストール場所を変更していない場合、次のファイルをテキストエディタ開く。Community以外の場合も適宜読み替えてほしい。

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\
Microsoft.CppBuild.targets

「 _FxcOutputs 」で検索すると一か所該当する箇所があるので、これを「 FxcOutputs 」に変更し保存する。ただし、管理者権限が必要である。

重複した別の報告(HLSL Shader Compiler fails to create output directory for header files)のリプライによると、Preview版では修正されたようだが、こんな致命的で馬鹿げたバグは即座にhotfixがリリースされるべきだろう。

The Witcher 3: Wild Hunt #2 With Mod

序盤で放ったらかしにしていたので、GOTY版で最初からやり直している。長時間のプレイ時間を要するゲームなので快適にプレイしたいのだが、当時はそうではなかったのだ。

発売してある程度時間が経った今となっては、主に2から引き続き採用された良くないデザインを、modで変更しながらプレイできるのでストレスは溜まりにくい。

  • 重量制限の事実上無制限化
    • 大量に素材をかき集めるゲームなのに重量制限なんているか?
  • ルート画面を出さない自動ルート
    • 大量に素材をかき集めるゲームなのにボタン連打数増やしてどうするんだ?
  • 落下ダメージ無し
    • お前超人だろ?
  • Gwent自動勝利
    • ミニゲーム興味ない人間にとっては苦痛でしかない。本筋に専念させてくれ。
  • 選択中以外のクエストマーカーも表示させる
    • これは多分、マーカーが増えすぎると邪魔に感じるからという判断だろうけれど、近くにあったマーカーを見落とすし、切り替えるのも手間になるだけ。
  • Durability無効化
    • 必要性が分からない。ただ手間を増やすだけのGold Sink。
      耐久度落ちてきたから修理しようというフレーバーは理解できるが、現地でさらに修理キットを持ち合わせていない場合、武器・防具を換えて進めることになる。一番強い武器・防具以外も売らずにとっておいて持ち歩かなくてはならず、何個も武器・防具を持ち歩いているのはLore Unfriendlyだ。重量制限も相まって訳が分からない。
  • トーチの点け消しをボタン長押しに
    • こんなバカげたデザインを2から引き継ぐなよ!
      近くのものをインタラクトしようとして点けたり消したりする間抜けな行動をおかしいと思ってくれ。このゲームにステルス要素は無いし、暗部はCat Eyeがあるんだから、本当に照明を点けたり消したりする必要性がある状況は極稀だろう。
  • ツールチップの即出現
    • デフォルトで表示待ち時間を調整できればいいのだが。

気になるがどうにかするのが難しい:

  • カメラがGeraltから遠すぎて没入感を削いでいる
    • modはあるが、古くて不具合が多い
  • 書物とかソートされずに無秩序に並んでいる項目がある
    • ソートさせるmodはあるが、日本語下だと文字コードの都合で役に立たないソート結果になる
  • 売り値でのBuybackが無い
    • modも無いかも。うっかり間違えて売ったら、高値で買い戻すかロードしなおすしかない。
  • 窃盗の無効化か明示化
    • このゲームは素材集めのために民家から盗みまくるのに、よく分からない基準で衛兵に怒られることもある。かと思えば近くに衛兵がいても怒られないこともあるのがよく分からないし、アイテムアイコンでそれが分かるわけでもなく、盗みになるぞという一文がワンテンポ遅れて表示される。ボタン連打してたら一文を見る前に盗むので役に立たない。
      窃盗という概念を無くすか、もっと分かりやすくしてほしい。

Frostpunk #1 A New Goal

初見プレイは途中で破綻という妥当なプレイ内容。
基本的なセオリーを知らないとまたこうなるだろうなということで、SteamのGuideを斜め読み。

最初にWorkshopを2個作るのと、十分資源が余裕になるまで住居を建てないというのを実践してみたところ、かなり順調に進んだ。
ジェネレータは最大範囲でもレベルの中ほどまでしか効果が無く、基本的には資源の温存のため必要最小限の効果で運用することになるので、重要施設をなるべく内部に詰め込んでいくことが重要だというのは分かった。なので、住居は後回しでよい。住居が無いと人は一番温かい中央でたむろするので、不満は溜まるが酷いことにはならない。資源に十分余裕ができてきたら不満解消のために徐々にジェネレータの範囲外に作っていくことになる。
しかし、住居を建てない、建てても寒い場所へというプレイングが最適ってのは世界観的にどうなんだ?Sim Cityの病院を潰すプレイングを彷彿とさせる。

そうやって進めていても、いまいちゴールが見えてこない。当初はスカウトによる探査を進めていって、新天地を見つけるといった打開策を見つけるのかと思ったが、そんなことも無く。結局、キャンペーン「A New Home」では、ひたすらwave的な寒さに耐えて、Progressionで発生していくイベントをこなしていくことになる。

そうこうして時間が経過すると、一定期間極寒に耐えろというゴールがある日突然要求される。これまでは資源消費量よりも供給量が若干上回っていれば大丈夫な状態なのに、いきなりその7倍以上の貯蓄を要求されて、そんなの無理だろという気分になる。
実際のところは食料なんかは要求量の1/4しか確保できていなかったが、餓死者を出しながら生存してクリアできたので、Objectiveを達成できていなくても必ずしもクリアできないというわけではないようだ。
ストーリー的には根本的な解決にはなっていないので、ほかのキャンペーンではどうなるのか知らないし、別のゴールが用意されているのかもしれない。

最終的には-150℃の世界になるんだけれど、ちょっと非現実的な数値すぎないかと思う。二酸化炭素はとっくに凝固しているし、そんなに下がったらいくら断熱しているとはいえ餓死以前に即座に凍死するんじゃないか?
Wikipediaの世界の最低気温記録によると-89.2℃が観測史上最低気温なので、太陽が消滅するような天変地異でもない限り地球環境的に-100℃よりも下がるとはちょっと考えにくい。

Salt and Sanctuary #1 Navigation Loss

BlasphemousをやっていてSalt and Sanctuaryを思い出したのでやり直してみる。

クソ遊びにくい。
起動してロゴが何回かでて、タイトル画面がでてから5秒くらい経つまでメニューが出てこないというテンポの悪さ。
で、初回プレイ以外でもnew gameにカーソルが合った状態なので、続きから始めるには下に入力がいる。new gameを選ぶ回数よりも続きから始める回数の方が圧倒的に多いだろ?
さらにロードは最後に遊んだスロットを記録していないので、左上の1キャラ目以外でなければ何回か入力してキャラクターを選択しないといけない。うっかり連打しようものなら大変余計な時間を要することになる。
ゲームを始める以前からモチベーションが下がる。

で、ゲーム止めるときは、即座にアプリケーションを終了できるわけではないので、一旦メニュー画面に戻る必要がある。そこで何故かメニュー画面じゃなくてタイトル画面まで戻されるので、まーた5秒くらい待たされることになる。
メニュー画面では一番上で上に入力しても一番下のゲーム終了までループしないので何回か下を押して終了を選ぶ必要がある。
ゲームを終了するか?というダイアログが出てくるのでさらにボタンを押す必要があるのだが、ゲーム本編からタイトル画面に戻るときにもゲーム終了するか?と聞いてきてるのに、さらにここでも聞いてくるため二度手間である。
ゲームを始めるのも終了するのも億劫になる。

ゲームはSoulsをやっていると分かるのかもしれないが、そうでない人にとっては大変説明不足。
キャラクター作成では色々バックグラウンドや持ち込むアイテムを選ぶことになるが、それぞれに説明が無いのでどんな影響があるのか意味不明。フレーバーで選ぶしかない。
開始して早々に選択することになる信仰は何の違いがあるのか全く分からない。信仰切り替え時に生じる事象も事前には意味不明である。
offeringなんて、ゲーム内の説明だけだと何が起こるのか予想がつかない。時間付きのバフみたいなものかと思っていたのだが、どうもそうではないらしい。offeringでNPCがそこに増えるというデザインは直感的ではない。
アイテムの効果も見た目に対して大抵直感的ではない。鍛冶屋での強化なんてなんで髪の毛がいるんだ?全く意味不明。
死んだら塩を全部持ってかれるのは徒労感が強くてリトライが億劫になるだけ。本家がそうだったからそうしたとしか思えない。

Blasphemous #4 The Stir of Dawn

本来8月上旬に来たDLCは、GOGでは9月になってやっときたという。
glitch/bugは大体直っていて、普通に遊んでいればそこまで致命的な状態にはならないと思う。一度だけボス戦で吹っ飛ばされた後に動けなくなったことがあるけれど。
DLC以外の部分でも全体的に綺麗になって、やりこんだ人がやり直すと微妙に挙動が違うところがあるなと感じられる。

追加されたNG+は、NG+といっても敵が硬いし強いし、ライフやFervourは初期から始まるし、さらにTrue Tormentという縛りモードみたいなゲーム性が変わるモードが3種類用意されているので大分難しい。この辺は公式が控えめなネタバレで書いてくれてるので、そこを見るのがいいのかな。

True Tormentは要約すると以下のような感じで、3つのモードのうちいずれかを選択する。

  • ライフがバーではなくてダメージ回数制になる。フラスコは一マスだけ回復して残りは時間回復になるが、その間にダメージを食らうと回復が止まる。敵が画面切り替えで復活する。
  • フラスコでライフの代わりにFervourが回復する。死ぬと全てのTearsを失い、Guiltが最大化する。
  • Meleeの攻撃力が半分になる。Fervourが時間で回復する。ダメージを食らうとFervourも減る。

とりあえず、ダメージ回数制になるモードで”ほぼ”100%クリアして、他のモードも試してみたけれど、ダメージ回数制が一番簡単なんじゃないかと思う。
要するに死ぬまでに食らうことのできるダメージ回数が激減するのだが、言い換えれば接触でも大ダメージでも1しか減らないので、難しくなっている部分もあれば簡単になっている部分もある。そこで、防御力を捨て去っても1しか減らないことを利用して、防御力を下げるアイテムを有効活用していつもと違った立ち回りが出来るのは面白い。
画面切り替えで敵が復活するのはNG+までやる人にとってはなんの足枷にもならないだろう。

ほかの、攻撃力が半分になるモードは、Fervourを消費するPrayerや血の攻撃の割合を増やして戦闘が長期化するので丁寧なプレイングをすればなんとかなりそうな印象なのだが、フラスコでFervour回復モードは、文字通りにフラスコでライフが回復しなくなるので、ボス戦がかなり難しくなるなという印象。実績に、全ボスをフラスコ無しで倒すというのがあるので、これを狙うついでに選択した方がいいだろう。

“ほぼ” 100%クリアと書いたのは、DLCを含めるとロードゲーム上の進行度は100%を超えるようになって上限が分からなくなるのと(恐らく125%だが、周回して縛りモードでクリアする必要がありそう)、マップ上の進行度が99%で止まってどこで残りを埋められるのか分からない状態になっているためである。DLCが来る前に100%を達成していて、そのときは実績の解除を目安にしていたが、それもできなくなってしまった。

DLCで追加されたボス5体は、割と似たような行動をするので、最初の一人さえ倒せればあとは簡単だった。面白味はあるが、攻撃するときに掛け声が入るのが、今まで全員戦闘中は無言のボスしかいなかっただけに違和感がある。
個人的に最強のボスはCrisanta of the Wrapped Agonyで、最強の雑魚はSoldier of the Anointed Legionだと思う。