Steam版「DOOM + DOOM II」遂にSteam Deck公式対応となる

DOOMDOOM II及びそのアペンドエピソード群を一本化、更に新規エピソードの追加、クロスプラットフォームかつ16人までの対戦及び協力オンラインプレイに対応した「DOOM + DOOM II」

各現行プラットフォームでDOOMもしくはDOOM IIの所有者ならば無償でアップグレードされるという太っ腹対応。

プリンタ・カーナビ・FM TOWNS・デジカメまで、この世に存在するありとあらゆる機器に移植されてそうなDOOMではあるが、実はSteam版「DOOM + DOOM II」はアップデートから1か月近く経っていたのに携帯PCゲーム機「Steam Deck」上での動作は公式には非対応扱いとなっていた。

ゲームボーイアドバンスDOOM(公式発売)もあるのにエルデンリングも動くSteam Deckで動かないとはどういうことなんじゃい!と思われるかもしれないが、実際には動作確認されていなかっただけで特に支障もなく動く状態ではあった。

そんな世界中のDoomer達をヤキモキするような表記が続いていたが、今日になって公式での動作確認が取れたようで無事Steam Deck対応(完全対応の緑マーク)の表記に変更。

これで晴れて、いつでもどこでもDOOM Deck

もちろん、ゲーム自体にはこの対応宣言の際にアップデートが実施されたわけではない。もう一度言うけど、動作してたけど間違いなく動くということを確認されただけ。

映画「エイリアン」を題材にしたステルスサバイバルホラー「Alien: Isolation」Steam版が10年の時を経て突如おま国解除

映画「エイリアン」を題材にした主観視点によるステルスサバイバルホラーAlien: Isolation」が発売から10年を経て突如Steam版のおま国が解除された。価格は定価3980円。なお現時点で日本語非対応

 

物語は映画「エイリアン」と「エイリアン2」の間が舞台。宇宙船ノストロモ号が消息を絶ち、映画での主人公であるエレン・リプリーの娘アマンダ・リプリーは母の消息を追って宇宙船エンジニアとして生きていた。そんなある日、ノストロモ号のフライトレコーダーを回収したとの知らせを受け、フライトレコーダーのある宇宙船へと向かうがそこにはエイリアンが侵入していたという流れとなる。

 

PS4Xbox Oneでは公式に日本語版が発売されていたものの、PC版は長らくおま国となっていたため公式で日本語に対応しておらず、今回のおま国解除に関しても単に購入制限が解除されただけで言語追加などのゲーム本体へのアップデートはされていない模様。

日本語化Modも存在したものの一次配布は既に終了していて、第三者による再配布しかないので自己責任で。

ボダラン開発元CEO「5年後にはSteamは衰退している!」→5年後・・・

Borderlands 3をEpic Games ストア時限独占したり、過去何かとSteamに対して批判的だったGearbox Software(Borderlandsシリーズの開発元としても有名)の CEOランディ・ピッチフォードの2019年のツイート

実績から見ると、ValveよりもEpicの方が技術投資は大きくなると予測している。5年または10年後にSteamを見たら衰退していて、他のストアが主流になっているかもしれない。

 

そして5年後・・・

Steamの同時アクセス数は2019年は約1,700万人だったのに対し、今年夏には2倍以上の3,700万人を突破し、

ボダラン4もEGS時限独占せずSteamで発売されることが決定。

 

ま、まだ、10年後があるから・・・(擦れ声)

 

C++でパリティチェックを行う最速(と思う)の関数

C++のプログラムでパリティを計算する関数を高速化しようとして、for文でビット数数えるとかパリティビット生成回路がXORなのを元にシフトとXORで計算するとかいう方法が普通のようで、AIに「C++にてパリティチェックを行う最速の関数を教えてください」と聞いてもこのサイトを参考にするのか全く一緒の回答が返ってくるのだが、もうちょっとだけでも最適化できないものかと思って考えてみた。

単純に元の値を2進数にして立っているビット数の合計が奇数・偶数かでパリティが求められるなら、値のビット数を数える標準ライブラリがあればそれを使った方が最速(コンパイラが勝手に最適化してくれる)んじゃないのか、ってことで、該当のstd:bitset.count()を使った関数だとこうなるはず。

int parity(uint32_t val) {
    return std::bitset<32>(val).count() & 1;
}

上記サイトのXOR法だとシフト・XORがそれぞれ5回で合計10命令発生することになるが、このstd:bitset.count()を使うとx64 CPU環境でSSE4.2命令以降を有効にしてコンパイルするとpopcnt命令というレジスタ値のビット数を数える1命令のみ(と奇数・偶数を判定する1のand)だけに最適化がなされたり節約できたりする。

ってAIに「C++にてstd::bitsetを使ってパリティチェックを行う最速の関数を教えてください」とやり方指示したら今度はこれと同じような答えが返ってきた。最初から教えてくれよ。

プレステ版「DOOM」をPCで遊べるようにする「PsyDoom」

1993年に発売されたFPSの金字塔「DOOM」、その続編「DOOM II」と各種追加エピソードに加えNightdive Studios・MachineGames共同開発のエピソード「Legacy of Rust」収録、日本語字幕への対応、FM・MIDI音源のBGMだけでなくリミックス版追加、クロスプラットフォームによる対戦・協力マルチプレイ、Modブラウザなどの対応を施し8月9日に再リリースされた「DOOM + DOOM II」

オリジナルのDOS版もそのまま入っているのでWADファイルだけ抜き出して、各種ソースポートで遊ぶことも可能だが、今回はそれとは別にこの再リリース版に収録されていなかったり現行機種向けに発売されていないバージョンのDOOMの話をすることとする。

それが初代PlayStationDOOM及びFinal DOOMだ。

これはただの移植版では?と思う人もいるかもしれないが、このPS版(Final)DOOMは実はPC版と色々と差異があり、当時の普及機だったPSというプラットフォームでゲーム自体も流通数がそこそこあったためこれが初DOOMという人も多いはずで、そういう人がオリジナルにあたるDOOM + DOOM IIをプレイすると、あれ?DOOMってこんなんだっけ?と思うはず。

差異というのはPCとPSの(主にメモリ量の)スペック差により、マップの構造が簡略化、敵キャラクターのアーチバイルが削除、テクスチャの解像度を縮小及び種類の減少、解像度・フレームレートの低下、といった劣化部分はもちろんあるが、それらを補うようにPSのハードウェアスペックを活かしてマップのカラーライティング・窓や一部敵キャラに半透明表示・炎が揺らめくスカイエフェクト・サウンドのリバーブといった特殊効果を加えたり、音楽がヘビメタ調からホラー調に変更、効果音を一新、更にオリジナルマップの追加といった独自要素があり、オリジナルの雰囲気とは違うPS版ならではのテイストが加わったアレンジバージョンと言っていい仕上がりになっている。

確かにオリジナルのDOOMもいいんだけど、自分が最初に体験したDOOMをもう一度遊びたい、PS版は遊んだことがないけど普段とは違うDOOMを遊びたい、という人も少なからずいると思うが、そういう人でもPSソフトのプレイ環境が用意できない、256*224ドットという低解像度・不安定かつ上限30fpsで今更遊ぶのは苦痛というのが大多数だろう。

ということで今回はこのPS版「DOOM」を現在のPC上でPSエミュレータも使わずプレイする方法を紹介する。DOOM用ModでPS版を再現するTCも存在するが、今回はPS版をそのまま使って動かす「PsyDoom」というポート版を使う。

この「PsyDoom」の特徴としては目の前のPCでPS版が手軽に遊べるというだけでなく

  • 4Kや1440pにも対応した高解像度化(PS版は256*224)
  • アンチエイリアスの適用(MSAA 4x)
  • ワイドスクリーン
  • 60fps以上を超す高フレームレート化(PS版は上限30fpsかつ場所によっては20fpsまで低下)
  • 32bitカラーレンダリングによりマッハバンドのない綺麗なシェーディング表示
  • ロード時間の短縮
  • アナログスティックありのコントローラはもちろん、マウス&キーボード操作可能
  • その場セーブ&ロード可能、自動セーブあり、既存のパスワード方式もあり(PS版はパスワード制のみで入力しても入手したアイテムは全て消えての再開)
  • バグフィックス

等が行われプレイアビリティが相当に向上し、現在でも遊ぶことに耐えうる理想のPS版DOOM体験が得られる。

 

画質比較(上がオリジナル相当の画質設定、下が1080p・MSAA 4x・32bitカラー・ワイドスクリーン適用時)

 

なお、遊ぶためには実PlayStation版「DOOM」もしくは「Final DOOM」のCD(をイメージ化)が必要になってくるので注意。

 

まずは「PsyDoom」の実行ファイルをGithubのReleaseよりダウンロードしてくる。

この記事を書いている時点で最新バージョンは1.1.1となっており、Windows環境が大半だと思うのでPsyDoom_1.1.1_Windows_x86_64.zipをダウンロード。

適当なフォルダ(名前はもちろんPsyDoomがいいだろう)を作り、そこにダウンロードしてきた圧縮ファイル内のPsyDoom.exeを入れる。ついでに「Disk」というフォルダも作っておいてそこにゲームCDのイメージを入れておくと管理しやすい。

 

ImgBurnなどでPS版「DOOM」もしくは「Final DOOM」のディスクを読み込み、作成したimg/cueのイメージファイルを先ほどのDiskフォルダに入れておく。

 

ディスクイメージの準備が完了したらPsyDoom.exeを実行。

起動直後に開く「Launcher」タブにて「Game disc」の場所にある「Browse」ボタンを押して、先ほど作成したイメージファイルの拡張子cueの方を選択。

次は「Graphics」タブ。大体デフォルト設定のままでいいが、右側中央の「Use 32-bit shading」のチェックを入れる。これでマッハバンドが無くなり奥行き表現の陰影がなだらかな表示になる。ただし、やや全体的に明るい印象になる影響もあるので最終的にはお好みで。

 

最後に「Game」タブ。右側中央の「Skip intros」にチェック。これで起動時に毎回出るメーカーログムービーを飛ばす。上の「Use fast loading」にチェックを入れてもいいが、元からロードが高速になっているし、チェックを入れるとサウンドが鳴り終わらないまま画面切り替わりが発生するので変な印象も与えるのでチェックを外したままでいい。

 

全て終わったらまた「Launchar」タブに戻り、右下の「Launch PsyDoom!」ボタンを押してゲーム開始。

タイトルロゴでキーを押して、ゲームモード・エピソード・難易度・オプション選択画面に移行。オプションとゲーム終了の項目以外で左右キーを押せば項目を変更、何かしらキーを押せばゲームが開始される。

 

途中セーブ・ロードはESCキーかコントローラの該当ボタンを押して、OPTIONSを開いて「LOAD AND SAVE」を選ぶ。

ゲームを再起動させた場合も「OPTIONS」から「LOAD」を選べばセーブデータから再開可能。

スーパーファミコンのプレミアソフト「レンダリング・レンジャーR2」がSteamで発売予定

ドイツのRainbow Arts社が開発という俗にいう洋ゲーなものの、日本のみで発売かつ出荷本数1万本程度ということでプレミアがついているスーパーファミコン用横スクロールアクションゲーム「レンダリング・レンジャーR2」のSteamストアページが開設されている。

まだ明確な発売予定日は掲示されていないが、初報で2022年にPC/現行機種向けに再販されるとアナウンスされてから2年経過して遂に進捗があった形だ。

ストアページ説明文を読む限りでは公式の日本版(ゲーム内記述はすべて英語)の他に未発売となっていたPAL(フレームレートが50Hzのもの)版が収録されるのが特別な要素となっているだけで、他には特に追加要素はない模様。

綺麗なグラフィック、派手な演出とこの手のレアソフトにある技術力の高さといった見どころはあるものの、ゲーム自体は大味なバランスなようなのでオリジナルが高価で取引されているからといって過度の期待はしない方がいいかもしれない。あくまでも希少性の高さで価格が高いということを忘れずに。

 

なお、ヤフオクやメルカリで1万以下で売られている物は箱付きであっても全部模造品だ。

FM TOWNS用デモプログラム「PSX DOOM Fire Effect」と「Water Ripple」

富士通が1989年に発売したパソコン「FM TOWNS

DOOMWolfenstein 3DQuakeid SoftwareクラシックFPS3部作をTOWNSに移植してきて、次は公式で発売予定だったもののWindows 95の登場による市場の変化で発売中止となってしまっていた「System Shock」のソースコードも公開されているのでSDLポート版をベースにFM TOWNS版でも作ろうかと思ってたんだが、思いのほか大苦戦してしまい結局頓挫してしまっている。

Quakeの時もそうだが、完成できたとしても正直CPUパワーが足らな過ぎて快適とは言い難い移植になることがわかりきっていたのもモチベーションが上がりづらく作業が進まなかった理由ではあるんだけど。

 

代わりと言ってはなんだけど、とりあえず簡単なデモプログラムでも作ることとした。

どちらともアルゴリズムがネット上に載っているし、TOWNSならではの機能を使ったわけでもなくCPUパワーゴリ押しのデモではあるんだが、CPU 486DX2 66MHz相当でも少々荷が重かったんで地味ながら最適化を施して完成。

 

PSX DOOM Fire Effect」

実行ファイル & ソースコード ダウンロード先

Github - PSX DOOM Fire for FM TOWNS

PlayStation版「DOOM」のタイトル画面や一部ステージの背景で流れる炎エフェクトを再現するデモ。パッドのAボタンを押していく毎に火力が弱まり、Bボタンで再点火、RUNボタンで終了。

ちなみに、これが元ネタ

結構特徴的なエフェクトなんで印象に残るが、やっていることは単純で、

画面一番下ラインに明るい色を描いたら後は、

次フレームでその上ラインに下ラインの色をそのまま描くか色を暗くして描くか左右に散らして(風による揺らめきを表現)描くかを乱数で決める

ということを画面上部ラインまで延々と繰り返しているだけで表現できる。

が、この乱数っていうのが地味に重くてTOWNS標準のC言語コンパイラである「High C コンパイラ」に用意された乱数発生関数rand()を読み出して実装したところ動きがガクガクとなってしまった。

ということで自前で疑似乱数発生を作って(といってもUNIXのライブラリから借用)更にインライン化

static int rand_num = 1;

rand_num = rand_num * 1103515245 + 12345;
random = rand_num & 2147483647;

このデモだけでなく、乱数を使うTOWNS用ゲームやデモを作る時に有効なテクニックかもしれない。

 

 

「Water Ripple」

実行ファイル & ソースコード ダウンロード先

Github - Water Ripple on FM TOWNS

マウスを左クリックすると画像に波紋が広がって歪み、しばらく待っていればまた収まっていくデモ。マウスを動かせば波紋の作成位置が移動できる。右クリックで波紋全消去、左右クリック同時押しでプログラム終了。

元画像のテクスチャ(配列)と表示先のテクスチャ、更に波紋の強さを表すテクスチャを現在と前フレーム分で2枚用意して、波紋の広がりと減衰の計算、前フレームと波紋の強さに差異が出ているピクセルだったら波紋の強さから元画像のテクスチャの参照先を求めて表示先に書き込み、を繰り返す。

上記のPSX DOOM Fireよりも負荷のかかるデモで、表示先テクスチャに書き込む元画像テクスチャのアドレス計算が結構時間が食ってて、元ソースでは現在の座標から波紋の強さに応じて読み込み座標を計算するために486 CPUでは加減算よりも数十倍遅い乗除算を1回づつ使っている上に、読み込みアドレスがテクスチャ外にならないようにするために最大最小×X座標Y座標で合計4回のif文で範囲内かチェックを行っているが、TOWNS版デモでは

・「/ 1024」という除算は「>> 10」と10ビットシフトに置き換える(2乗定数の乗除算は1ビットシフト同一。High Cが出すOBJファイルを確認するとこの最適化が行われていなかったので手動シフト演算化)

・_max、_min関数というコンパイラ内部関数を使って最大最小値を求めて範囲内チェックを行う(if文によりもアセンブラレベルで比較命令が1命令節約できる)

・一時変数に入れたりせず配列の要素内でアドレス計算式を全部入れてしまう(High Cの最適化はあまり賢くないのか、無駄に変数の出し入れを行ってしまう)

といった具合に変更。

倍速とまではいかないまでもこれだけでも結構フレームレートに差が出た。

だが、まだ滑らかな速度ではなく波紋という感覚を得られるまでにはなっていない。