DCSS 0.16-ja 開発こぼれ話
この記事は Roguelike Advent Calendar 2016 の3日目の記事です。
昨年からちまちまと作っていたDCSS 0.16日本語版がだいたい形になってきたので、その開発の途中に起きた出来事などを話してみようと思います。
他のゲームの日本語化事情はよくわかりませんが、DCSSについてはメッセージがリソースファイルに分離されておりそれを差し替えれば万事OK……みたいな事はありません。
表示されるメッセージ文字列の多くが動的に組み立てられ、英語に特有の処理をされます。もちろん、日本語に配慮されるわけもなく、そこらへんは自分で追加する必要があります。
試行錯誤しながらなんとかやっていったわけなのですが、その途中でも珍妙な現象が起きたりしていました。以下ではそれらを紹介していきます。
■いきなり全角文字列の扱いにつまずく
日本語訳を始めるにあたって、
「とりあえず最初の画面を日本語化してみよう!」
選択メニューがガタガタに文字ズレしていますね。これで遊べないわけではないのですが、見た目としては散々です。一体どうしてこうなってしまうのか?
選択メニューの表示の一環として、ざっくり言うと「全部で○文字になるまで半角空白を詰める」という処理があります。「全部で○文字」というのが曲者です、言うまでもなく全角文字は半角文字の倍の文字幅*1だからです。
本家英語版はもちろん全角文字を考慮しなくてよかったのですが、日本語化するとなるとそうもいきません。
ということで、「文字幅が△になるまで半角空白を詰める」という処理に直すため「全角文字で余計に幅が増えた分だけその後に詰めるべき半角空白の数を減らす」という処理を追加することになります。
差分だけ見れば簡単な修正*2でしたね。めでたしめでたし。
■今度は半角空白の扱いにつまずく
めでたしめでたしと言いましたが、その処理を実装したことで別の画面で弊害が出てきました。
r - ★冷たき死のダガー(+9){freeze,rPoisrF-rC++MR+}
なんだかアーティファクトの銘が詰まって表示されていますね。想定された本来の表示はこれです。
r - ★冷たき死のダガー (+9) {freeze, rPois rF- rC++ MR+}
先程の処理―「全角文字の分だけその後の半角空白の数を減らす」―がこちらにも適用されてしまったせいで、全角文字の後の半角空白が消えてしまっていますね。
かといって、先程の処理をやめるわけにもいきません。そこで苦肉の策として、
「半角空白を、半角空白のように見えるけど半角空白じゃない文字に置換して表示」
という結果になりました。
U+00A0(No-break space)は見た目が半角空白と区別しにくいですが、別の文字です。詳しくは以下のページを参考に。
HTMLの心得がある人で、 という文字参照でスペースが入れられるということを知っている人も多いでしょうが、ここで使われるのが通常の半角空白ではなくNo-break spaceです。
今度こそ本当にめでたし。
■「記憶力を1消費して刺したの呪文を記憶しますか? (残り記憶力: 6)」
原文は"Memorise Sting, consuming 1 spell level and leaving 6?"です。"毒針/Sting"(の呪文)が通常攻撃の"刺した/sting"と重複していますね。
melee_attack.ccの"sting"の文字列を直接ソース上で書き換えるという手もあるのですが、とりあえず呪文の方は
%%%% [spell]Sting 毒針 %%%%
の様に、一律[spell]というprefixを付けて辞書ファイルに記述することになりました。
■「フライ級の発動」?
STR型ビルドでUnarmed Combatを最大まで上げると称号が"〜 the ○○weight Champion"となるため、辞書ファイルに以下のように記述していました。
%%%% Heavy ヘビー級 %%%% (中略) %%%% Fly フライ級 %%%%
ところで、天狗とかガーゴイルの種族で特定のレベルに達すると自分の翼で飛べるようになります。
はい、"Fly"がかぶってしまいましたね。飛行の指輪とかの方は"Evoke flight"なので油断しました。
これもまた[title]Flyとすることで回避しました。
■おわりに
2016年も12月に入り、DCSS 0.16-jaもソースをいじる部分はだいたい終わってきました。
来年はいよいよDCSS 0.19-jaに手を付けて英語版最新に少しでも追いつこうかと思います。まあ成果物を流用できるので来年中に出せるんじゃないかな……気長にご期待ください。
次は、deskullさんの「変愚蛮怒の今後のマイルストーン@2016末」です。