exception が面白過ぎる

id:i-saint さんの立方体シューティング(?) exception が実に楽しいです。何よりもまず無数にロックでき美麗な軌跡を描くレイ(ロックオンレーザー)がたまりません…ていうロックオン猿の発言は横に置いときます(笑)。
当初は操作になかなか慣れず、立方体の物量に押し負けることが多かったのですが、パッドのボタン割り当てを見直し、ゲージの溜め方を学習してカタパルトが思い通りに撃てるようになると、俄然面白くなってきました。1面後半の輸送艦?では慣れると簡単に連鎖できるのでドッカンドッカンと撃ち出して楽しんでいます。
画面に登場するオブジェクトはほぼ全てが互いに相互作用するため、特に 3 面では大型の敵が半ば自壊しながら地形のブロックを押し出していく様に激しく感動を覚えました。
また、各面のギミックもかなり趣向を凝らした構成になっており、先日ようやく到達した 4 面に出てくる、 NEOGEOVIEWPOINT みたいに羽根車に撃ち込んで回転させ、台車(またはエレベータ)を動かしていく様子は、まるで自分がハムスターになった気分です(笑)。
無機質で透明感のある曲も良いです。3 面ボス戦で一緒に落下しながら戦うシーンなどは特に、退廃的なイメージが実によくマッチしていると思いました。
今のところ light モードで 4 面ボスまで到達できましたが、5面はまだ見ていません。自分のシューティングの腕を考えると先は長そうなので(笑)、じっくりやり込んで行きたいと思います。

Radeon X1000 系で exception のエフェクトを有効にしてみた

うちのビデオカードRadeon X1600Pro なので、Config 画面で透過光やブラー・ブルームなどのエフェクトを有効にすることができません。*1
エフェクトなしでも綺麗な画面が出てますし、ゲーム性自体には全く影響がないので十分楽しんでいましたが、Youtube に上がっているムービーを見ているとやはり色々と違いが気になってしまい、一時は Radeon 生活から宗旨換え(笑)して GeForce8800GT あたりを物色しようかとも考えていました。
id:i-saint さんの日記(id:i-saint:20071115) によると、Radeon では non_power_of_two な(縦横サイズが 2 の累乗になってない)テクスチャに非対応という辺りが問題らしいです。
exception の製品版にはありがたいことにソースが付属していますので、もし問題がそこだけなら自力で対処できるかも…と思い、調べてみました。

最初に変更したのは以下の 2 箇所です。

  • non_power_of_two に非対応でもシェーダー・ブラー等が有効にできるようコンフィグ画面のロジックを改造
  • FrameBuffer クラスを、生成時に要求されたサイズを含む 2 の累乗サイズのテクスチャを取得するように変更
  • (あと、画面モードに 512x384 を勝手に追加しました。うちの X1600Pro では 1024x748 だとフレームスキップが頻発してましたので…)

ここまで改造した時点で、一応エフェクトは動きます。ただ、FrameBuffer のテクスチャサイズの違いによりエフェクトがずれる問題が起きてしまいます。(id:logion:20080219 の画像参照)

さらに調査して、以下の変更を行いました。

  • IFrameBuffer にテクスチャの縦横サイズ(2の累乗)・使用するフレームバッファの縦横サイズを取得するメソッドを追加
  • Bloom::draw(), ImpactBase::draw(), DirectionalImpact::draw() において、上のメソッドを使い描画座標やテクスチャの UV 座標を修正

ここまで改造した所で、エフェクトのずれはなくなったように見えます。もっとも、GeForce 6000 系以降のビデオカードが手元にないため、オリジナルのエフェクトはYoutube の映像を参考にしているだけです。細かな違いについては見落しがあるかも知れません。
スクリーンショットはこんな感じになりました。

…実はこんなにまぶしいゲームだったのか! (笑) と新鮮な驚きです。
とりあえず上記変更箇所のパッチ(Unified diff 形式)をこちらに置いておきます。

*1:公式 BBS によると Radeon HD2000 系以降なら動くそうです。

ビルド時に気付いた点

ビルドは VisualStudio2005 Standard Edition で行いましたが、Windows SDK 6.0 for Windows Vista と Boost.asio の最新版(0.3.9)を使ったため一部ソースの修正が必要でした。今後自力でビルドされる方々のためにもメモを残しておきます。

Windows SDK for Windows Vista でビルドするための変更点

Boost.asio には old_win_sdk_compat.hpp という古い Windows SDK と互換性を保つ仕組があります。Windows SDK 6.0 for Windows Vista でビルドすると、逆にここと競合が起きてしまいコンパイルが通りません。色々調べた挙句、interface.h の _WIN32_WINNT を 0x0501 (_WIN32_WINNT_WINXP) 以上にする必要がありました。*1

Boost.asio 0.3.9 でビルドするための変更点

0.3.8 以降(CVS 上では 2006/7/23 の Commit 時)、エラーの仕組が大幅に変わっているようです。ist/ist_net.h で使われている boost::asio::error という型や、boost::asio::assign_error() が消えているためコンパイルエラーが出ます。それぞれ boost::asio::netdb_errors, boost::asio::make_error_code() に書き換えました。

*1:互換対応自体を指すマクロは BOOST_ASIO_HAS_OLD_WIN_SDK ですが、IN6ADDR_ANY_INIT, NTDDI_VERSION, IPPROTO_IPV6 など複数のマクロ定義が関連しており、最終的に _WIN32_WINNT を変更するのが最も簡単と判断しました。