【事例】SkyrimMODの文字コードの話 – Oさんの体験談

バグ対策

ある日突然のバグ報告

SkyrimでMODを公開する際に避けて通れないアタマの痛い問題。それはユーザーさんからの不具合報告(バグ報告)です。今回は東京近郊在住のOさん(仮名・17歳)の事例と共にお送りします。MOD製作の初心者さん向けの記事というより、MODを製作して公開している方向けの内容です。

ほとんどのMOD製作者の方は、リリース前にいろいろなテストを重ねていると思います。でもそれはあくまでも自分の環境の中でです。万全を期そうとしているとは言え、どうしても限度があります。世界中のSkyrimプレイヤーの環境を再現するのは到底不可能です。

ある日、nexusmodsで公開しているOさんの作ったMODに不具合報告がありました。彼(彼女)が報告してくれたのはおおむね以下のような内容(意訳)です。ちなみにフランスの方でOSはフランス語のようです。

  1. あなたのMODを入れてニューゲームしたらCTDしたよ
  2. たぶんメッシュファイル(nif)か、レベルドリストの循環参照の問題じゃないかな
  3. いや、メッシュかbsaアーカイブの問題っぽいよ
  4. メッシュを最適化して、解凍したアーカイブを再度アーカイブ化したら問題なくなったよ
  5. bsaアーカイブを作る時になんかミスった可能性があるんじゃない?
  6. スクリプトやMCM、bsaアーカイブなんかの日本語のファイルを英語に変換した時に、何か日本語のフォントや記号が混じってない?

CTDとはご存知の方が多いと思いますが、Crash To Desktopの略でSkyrimがゲーム開始時またはゲーム中に落ちてしまうこと。原因はさまざまで、1つの問題だけが原因とも限らないので問題解決はとても大変です。

結論から言うと今回報告された不具合の原因は、日本語のespファイルを英語espに翻訳した際に文字コードを「UTF-8」にしていたことでした。文字コードとはコンピュータが文字情報(テキスト)を扱う際に各文字に割り当てた符号のことで、様々な種類があります。

xTranslator での文字コード設定

文字コードを「1252」で保存し直したespを試してもらったところ、問題は解決しました。以下、問題解決の経緯と何が問題だったのかを詳しく見て行きたいと思います。

問題の整理 ― 観察される事象と客観的事実

今回の不具合報告のように、自分ではない他者の見たできごとを正しく把握しようとする場合、気を付けなければならないのは、彼(彼女)が言っていること全てが正しいとは限らないということです。

前述のリストで見てみると「実際に起きたできごと(A)」と「彼(彼女)が考えていること(B)」、「それらが混ざったもの(C)」があることがわかると思います。

今回の場合、Aは1のみです。2、3、5、6はBですね。4は一見するとAに分類されそうなのですが、彼(彼女)の推察に基づいた対処とその結果起きた事実なので、Cに分類できます。Aの客観的な事実と認められるものは大事な前提条件です。Cは難しいところですが、この情報だけではあまり役に立たない感じですね。

で、こう書くと怒られるかも知れませんが、大抵の場合はBに分類されるものはあまりアテになりません。どうしても彼(彼女)のバイアス(認識のかたより)が掛かってしまいます。だからと言って完全に無視してしまって良いかと言うと、それでは問題解決への糸口もなくなってしまいます。

上の図のように、実際のできごとが「円柱」であったとしても、彼(彼女)の視点からは「立方体」として観察されることだってあるのです。彼(彼女)は別にウソを付いているワケではありませんよね。だからと言って全て信頼してしまうと、事実が何なのか分からなくなってしまいます。

大事なのはBに分類されるものは鵜呑みにせず、話半分ぐらいに聞いておくということです。今回は文字コードの問題でしたので、リストの一番最後の6は客観的事実ではありませんが、事実にかなり迫っていると言えます。Oさんは不具合報告を受けた際に6の情報を見て、怪しいのは文字コードかなと思い当たりました。

なぜ思い当たったのかと言うと、やはり製作者だからという部分は大きいです。報告に出ているメッシュ(nifファイル)については配布する前に最適化はしてありましたし、bsaアーカイブへの圧縮はCreationKit(CK)で行うものなので不具合の対象とは考えにくいと言うのもあります。

スクリプトやMCMは元から英語で書いていましたし、コンパイルをしたものを配布しているので、フォーマットに問題があるのであれば、コンパイルの際にエラーが出るはずです。消去法で行くとレベルドリストの問題が残りますが、今回の報告が出るまで不具合報告は出ていませんでしたので、こちらも可能性は低そう。

こうして残ったのはesp自体の問題。特に他の言語環境で不具合が出そうな文字コードじゃね?となったワケですね。Twitterで情報を求めたところ、英語の文字コードが「UTF-8」でも普通は問題はないが、一部の国で不具合が出るケースが過去にあったとのこと。結果はビンゴでした。

追加で出て来た情報 ― 先に言ってよ

そんなワケで、文字コード「1252」のespファイルを作って報告してくれた彼(彼女)に試してみてもらったところ、CTDは無くなった!ということでした。

この時も彼(彼女)はbsaアーカイブの圧縮時の問題である可能性を捨て切れない様子でしたが、修正後のespを試して理解してくれたようです。追加で出て来た情報は次のようなもの。

  1. 自分はフランス語OSで、Skyrimもフランス語でやってるよ(英語をフランス語に翻訳してる)
  2. 英語版のespを翻訳しないでWrye BashでBashed Patchを作ってやったらCTDしたよ
  3. フランス語に翻訳した後でBashed Patchを作ったら問題なく動いたよ
  4. bsaアーカイブを再アーカイブ化する前に、上の9の作業をしてたの書いてなかったよ
  5. 結果として「1252」に文字コードを修正したespで問題なく動いたよ、ありがとう!

最初のリストの4、bsaファイルを再アーカイブ化したら問題なく動いたよ!と言うのは、事実とはちょっと違うことが分かりますね。実際は9で行ったフランス語への翻訳作業によって、espの文字コードが書き換わったことがCTD解消に繋がったワケです。

このことからも、「彼(彼女)が考えていること(B)」を鵜呑みにしてしまうと危険なのが分かります。この辺の情報を鵜呑みにしてしまっていたら迷宮入り事案だったかも知れません。ユーザー視点から見て大事なのは、自分は関係なさそうだと思ったことも細大もらさず報告することでしょうか。

何が問題だったのか(仮説)

今回の不具合は何が問題だったのでしょうか。通常は英語環境でSkyrimをプレイする場合にespファイルの文字コードが「UTF-8」であっても、問題が起こることは余りないそうです。実際に「UTF-8」で英語版を配布しているOさんのMODでも、これまで不具合が出たという報告はありませんでした。

フランス語OSでフランス語版のSkyrimであったことが問題であるかも知れないのですが、私は何となく次のような可能性を考えています。あくまでも仮説です。のちほど修正や加筆するかも知れません。

フランス語の文字コードについて詳しくは分かりませんが、報告をしてくれた彼(彼女)は「UTF-8」以外のフランス語の文字コードを使っていたのでは? ただ、espファイルの文字コードが「UTF-8」のものが1つや2つ混じっていたとしてもCTDしない可能性が大きいと思います。

問題なのは、文字コードの異なるespファイルをマージしてBashed Patchを作ったことで、結果として文字コード混在のespファイルが生成されてしまい、それをSkyrimが読み込む際にCTDを引き起こしたのではないか?というのが私の仮説です。

さすがに報告してくれた人に上述の仮説を検証する作業まではお願いできないので、確かめるすべは今のところありません。Bashed Patchでマージ元のファイルからデータを引っ張ってくる際に、装備品などの文字コードが含まれるレコードをマージしようとした可能性もありますね。

レベルドリストなどは、マスター指定しているレコードのFormIDを指定しているだけで、リスト内の装備品などの文字情報までは参照していないのではないかと思うのですが、どうなんでしょう。どちらにせよ今回の不具合にはBashed Patchが何か関係していると私は考えています。

追記: 問題の検証

その後、情報を集めて行く中で、フランス語のSkyrimで使われる文字コードが「1252」であることが分かりました。参考にさせていただいたのはThinkingSkeeverさんのブログ記事です。

こちらを見ると英語やフランス語、ドイツ語などは「1252」ですが、ロシア語は「1251」、チェコ語やハンガリー語、ポーランド語は「1250」だそうです。

ここで気になるのは、どうして文字コードがフランス語と同じ「1252」である英語版で、「UTF-8」のespファイルを使っていても問題が表面化しなかったのかです。実際、英語版を使っているドイツの方は「UTF-8」のespファイルを使用していても、ゲームが問題なくできていると報告しています。

ではなぜフランス語の環境では問題が出たのか? 次の図のように考えると説明が付きます。

実は「1252」も「UTF-8」も、内部で保持している英語のアルファベットなどのデータ(ASCII文字データ)は全く同じものなのだそうです。

このため、Bashed Patchなどで複数のespファイルをマージした際に英語だけのデータであれば問題は起こらないと考えられます。また「1252」で英語だけのデータであれば「UTF-8」で英語と日本語などの文字が入っていても衝突は起こらないようです。

しかし「1252」でもフランス語を含んだデータは、日本語などを含んだ「UTF-8」と一緒になった際、図のように衝突してしまうのではないでしょうか。その結果が今回問題となったCTDではないかと予想しています。

Twitter上で「文字コード指定に問題があるのであれば、文字化けするだけではないのか」と質問を受けました。確かに文字コードでよく問題になるのは文字化けですが、これはある意味で正常な処理のされ方だと私は思っています。

期待される文字コードの範囲内におさまっているので、コンピュータは正常に処理をして表示出来るけれど、人間がそれを読んだ際に意味不明になるのが「文字化け」です。これが処理できる範囲外のデータで、コンピュータが読んでも意味不明である場合に起きたのが、おそらく今回の問題ではないでしょうか。

この仮説を検証するため、文字コード「1252」でフランス語を含んだespファイルと、「UTF-8」で日本語を含んだespファイルを作り、Wrye BashでBashed Patchを作ってからゲームをしてみました。しかし、残念ながらCTDなどの問題は起きませんでした。

今回起きた問題をきちんと再現するには、フランス語のWindows環境や、フランス語版のSkyrimなどが必要だと思われます。CTDに至るには、上記の理由以外にも条件が必要なのかも知れません。検証は満足できるものではありませんでしたが、私の環境ではこの辺が限度のようです。


なお今回のケースに似ていると思われる問題は、以前にロシア語の環境でもあったそうですが、詳しい状況などは分かりません。あまり報告されることがないケースの問題とのことですので、今回長文ですが記事にまとめてみました。

今回の問題の解決や原因の究明に際しては、Twitter上でさまざまなご教示をいただきました。ご協力いただいたみなさまには謹んで御礼申し上げます。

タイトルとURLをコピーしました