スクウェア・エニックス 開発部の紙山満氏(右)と,任天堂 業務技術部 技術渉外グループ・サブマネージャーの光吉勝氏(左)
スクウェア・エニックス 開発部の紙山満氏(右)と,任天堂 業務技術部 技術渉外グループ・サブマネージャーの光吉勝氏(左)
[画像のクリックで拡大表示]
グラフィックスはDSの4倍の解像度でレンダリング
グラフィックスはDSの4倍の解像度でレンダリング
[画像のクリックで拡大表示]
キーシェアリング方式の通信。個々のキーの操作に対応する処理を遅らせて実現している
キーシェアリング方式の通信。個々のキーの操作に対応する処理を遅らせて実現している
[画像のクリックで拡大表示]

 2009年1月にスクウェア・エニックスが発売したRPG「ファイナルファンタジー クリスタルクロニクル エコーズ・オブ・タイム(FFET)」は,任天堂のゲーム機「Wii」と「ニンテンドーDS(DS)」という二つのプラットフォームで動作し,しかも相互に通信できる点が売りだ。その開発に際して,DS向けにソフトを開発し,そのソース・コードを改変することなくWiiで動かせるようにするという方法だ。

 当初FFETはDS向けに開発が進められていた。開発から2カ月が経過して社内評価版が一度完成した後で,「据え置き機と携帯機という,コンセプトやプレイスタイルが異なる機種間で同じゲームを一緒に楽しめたら面白いのではないか」(開発部の紙山満氏)。そこで一種の仮想マシン的なレイヤーをWii上で作ることにした。「開発ツールがDSとWiiで共通する『Code Warrior』なので,まずはDS版のソース・コードをそのままWiiの開発キットでビルドした。当然エラーが山のように出てくる。これは,DS版のライブラリにあってWii版のライブラリに存在しない関数があるからだ。そこで対応する中身が空の関数をまず定義し,エラーをなくすまで繰り返した」(紙山氏)。

 次に,このエラーがなくなった時点で,関数の中身を定義すると同時に,Wii版ではリソース・データを読み込む際にデータを自動的に読み替える仕組みを盛り込んだという。搭載しているマイクロプロセサのアーキテクチャがDSでは「ARM」,Wiiでは「PowerPC」であるため,データのアドレスごとの並び順(エンディアン)が異なるためだ。さらにグラフィックスとサウンドを再生する仕組みを組み込むことで,一通りの機能を動かした。これで一見すると,動作しているように見えたという。

 だが細かいところで対応仕切れない部分があった。その一つが「キーシェアリング」方式による通信である。これは,ネットワーク接続している機器のキー操作情報を一度親機が収集し,それを各子機に配信することで機器間の整合性を保つ手法である。通信量が少ない利点があるが,少しでも機器間の状態に違いが発生してしまうと一貫性が失われ,収集がつかなくなる。このため例えば疑似乱数の初期値(シード)を同じ値にするなどの工夫が成されている。

 しかしDSの場合はハードウエア構成やソフトウエアの作りが共通なので問題ないが,Wiiは異なる。例えば平方根や除算を実行するのに,DSはハードウエアによる演算器が組み込まれているが,Wiiには存在しない。浮動小数点の演算なので,多少なりとも誤差が発生する可能性はあり得る。

 またC言語には実装依存の部分が少なくない。例えば実引数の評価順などは仕様上定められておらず,乱数を多用するゲーム・ソフトの場合評価順によっては異なる振る舞いとなることもあるという。

 こうした細かな違いを確認できるのは任天堂だけなので,「新しい取り組みなので任天堂も全面的に協力すると約束した。しかし,予想以上に細かい問い合わせが多かった」(任天堂 業務技術部 技術渉外グループ・サブマネージャーの光吉勝氏)。FFETに関連する問い合わせ件数は1082件に上った。通常は数十件程度という。