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末」です。


*1:等幅フォントの場合

*2:とはいえ最初は本当に原因が分からず、一旦日本語化を諦めてしまったこともありました。対処法が分かってよかった。

私家版・DCSS日本語版翻訳のガイドライン

4月から公開したDCSS 0.16日本語版ですが、そこそこ遊ばれているようで嬉しい限りです。


さて、溜まり場DCSSスレでのitem description翻訳の流れで

304 名前:名@無@し[sage] 投稿日:2016/11/21(月) 02:32:08 id:Sec/uRig [3/3]
ところで肝心のD++氏が翻訳の何を求めてるか分からないと意味が無いけどそこは大丈夫?

という投稿があり、この際なのでDCSS日本語版の翻訳スタンスをまとめておきます。


以下は原則としての方針であり、例外もあるということにご注意ください。

  • 用語は無印DC準拠
    • これは間違いだろうというのは変えています。一例として「〜〜召」は「〜〜召」に変更しました。
  • 用語追加分は既存用語の雰囲気を踏襲
    • カタカナ語は控えめに(武器種など普通に使ってよい場合も)
  • 文章もDC無印と原文が同じなら不都合のない限りそれに合わせていく
  • 英文で同じ文・単語は同じ日本語文・単語に、違う文・単語は違う日本語文・単語にする
    • 要するに英文で区別可能なメッセージは日本語でも区別できるようにします。
    • 加速終了時、減速時は共に"You feel yourself slow down."ですが、これは例外として双方の日本語訳を別々にしています。(DC無印でもそうなっています)
    • プレイヤー称号とモンスター名で同一な英語文字列となる例が散見されますが、これについてはそれほど同一日本語に訳すのにこだわらない方向で行きます。
  • 語の重複はなるべく避ける
  • 二重否定はなるべく避ける
  • 全角英数字、全角記号(丸括弧等)は使わない。
  • 単一の疑問符、感嘆符は全角にする。連続する感嘆符(大ダメージ時など)は半角。
  • 疑問符・感嘆符の有無は文章の自然さを失わない範囲で原文を踏襲する。
  • 漢字は適切にひらがなに開く(徹底しなくてもよい)
  • コンソール版も一応サポートしていることもあり、折り返しの目安は半角80文字(大きな表示の崩れなどがなければ無視することも)


以下は翻訳作業に協力してみたいという人向けのガイドラインです。

  • 提出形式はあまりこだわりませんが下記の様式だとこちらが便利です
    • Github上でプルリクエストを投げる。パッチ用のブランチを切ってください。
    • メールもしくはアップローダ経由でパッチを投げる。匿名・連絡先不明だとコミットログに残せないため捨てハンドルネーム・捨てメールアドレスでもいいので付記してもらえると助かります。
    • 「ここがおかしい」などの単品指摘はDCSS日本語版 未訳メッセージ報告所がアカウントを作る手間もかからず便利でしょう。
  • (当日本語版においては)日本語訳は英語原文の直訳に近い訳にすることを旨とします。日本語でよっぽど不自然な文になる場合は一部ニュアンスを削ることはあります。逆に、原文にないニュアンスを日本語訳で付与することは推奨されません。
    • 言い回しを変えることはあっても、意味を変えることはダメです。
  • メッセージの文脈を確認すること
    • 文脈を把握していないとよくわからない文を生成してしまいがちです。Crawl wiki、wizard modeなどで実際の動きを知ることは翻訳の大きなヒントになります。
  • 文章全体の機械翻訳の直接利用は避ける
    • 最近Google翻訳などが賢くなってきたようですが、ダンジョンRPGというニッチなジャンルに適用するにはまだ荷が重いようです。あくまで参考程度に。
    • オンライン辞書の利用自体はどんどんするとよいと思います。私は主にWeblio英和辞典、まれにUrban dictionaryとかその辺を使っています。
  • 煽り厳禁。


さてそろそろDCSS 0.19-jaの作業にも取りかかって行こうと思います。これからも石鍋試験鯖、およびDCSS日本語版をよろしくお願いします。

DCSS 0.16日本語版αリリース

このたび、石鍋試験鯖ではShotaX氏らのDCSS 0.13日本語化の成果をもとに作成したDCSS 0.16日本語版をαリリースします。

訳は原則としてDungeon Crawl無印日本語版(xppm氏らによる)に準拠していますが、そうなっていない場合はご指摘いただけるとありがたいです。

想定問答集

■0.16ですか? 0.17やtrunkは?

日本語化の作業を始めたころに出ていた安定バージョンが0.16だったためそうなっています。
作業が一段落し次第0.17に取りかかりますが、まだしばらくかかりそうです。

trunkについては、開発チームの開発速度が活発なのもあり、0.17の日本語化が終わっても対応するかどうかは微妙です。


[追記]4/26に0.18ブランチが切られましたが、同じ理由でしばらく手を出せません。やるとしたら面倒が無いので0.17と同時進行すると思います。0.16jaをやってる間に0.19が出たので0.19jaのみの進行にします。さよならPakellas。

■どこで遊べますか?

石鍋試験鯖にアクセスすることで、ブラウザ上で遊べます。以下のリンクからどうぞ。
遊ぶにはユーザ登録(無料)が必要ですが、観戦するだけなら登録はいりません。

「Register」をクリックしてID/pass/メールアドレス(任意)を入力して登録したら、ログインして「DCSS 0.16-ja」をクリックしてスタートです。
DCSS自体初めて、という方は「Tutorial 0.16-ja」からやってみるのもよいでしょう。簡易版コマンド一覧は'?'キー二回押しで参照できます。

■サポート環境は?

Webtileおよびコンソール(Ubuntu Server)上で動作を確認しています。
タイル版、Android版は開発環境がないためサポートしていません。

Webtileは最近のブラウザならだいたい動くようですがFirefoxChromeあたりをおすすめします。

ソースコードはどこで手に入りますか?

githubで公開しています。

リリース後の細々とした修正はdevelopブランチの方に追記しているので最新版を取りたい人はそちらを見てください。

■英語部分が残っていますが、未完成なのですか?

はい。


現状、大抵の動作の和訳が終わっていますが、モンスターのセリフ、各種解説文、文学作品の引用等々ゲームに直接関係しないわりにやけに量が膨大なものについては後回しにしています。
また、細々とした未訳箇所でテストプレイが行き届いていないものも多数あります。
完全に終わってからとなるといつになるやら分からないため、4/1ネタとして一旦公開することにしました。

■今まで英語版をプレイしていましたが、モンスター名や魔法名が日本語になると対応がよく分かりません

アイテム、モンスター、魔法、地形などはコマンドで解説文を出すと左上に日本語表記、右上に原語表記が表示されるようになっています。

■既知のバグについて
  • Webtile版において、'i'コマンドでアイテム一覧を出し、アイテムを選択した後'i'を押すことによって銘を付けることができますが、日本語版だと入力のためキーを押した際の画面反映がおかしくなります。原因は今のところ不明です。
    • 対処法: '{'コマンドから銘を付けるようにしてください。

その他、直すのに手間取りそうなのはGithub Issueに載せています。

おわりに

それでは、どうぞゲームをお楽しみください。これをきっかけにDCSSを遊ぶ人が増えると幸いです。

NetHack 3.6.0 in NAO

この記事は Roguelike Advent Calendar 201520日目の記事です。

nethack.alt.orgで遊ぼう

今月12年ぶりの公式リリースが発表され、一部界隈が激震したNetHack 3.6.0ですが、NetHackオンラインプレイが可能なサイトnethack.alt.orgでもNetHack 3.6.0が盛況です。

適当なtelnetクライアントで接続し、ユーザ登録さえすればすぐにプレイが可能です!

プレイ雑感

とりあえず鉄板のHuman-Neutral-Valkyrieで軽く遊んでみました。
3.4.3の経験者ならプレイ自体に戸惑うことは少なそうかなといった印象。ただ、細かいところが便利になってはいます。

箱類の#loot

別のアイテムを中に入れることのできるアイテム(箱、袋、etc)に#lootコマンドを使ったときの選択肢が拡張されています。
まあ読んだとおり……とはいえ、"stash one item into the (container)"は指定した一種を入れるという"put something in"の劣化バージョンにしか見えないのでよく分かっていません。別の使い道があるのだろうか。

[C]all/#nameの統合

従来はモンスターに名付ける用の[C]allコマンドと、特定のアイテムやアイテム種別に名付ける#nameコマンドが別れていましたが、3.6.0では同じメニューが呼び出されるようになっています。
また、床に置いてあるアイテムにも名付けられるようになっています。これで蹴飛ばしても動かない「灰色の石」を見つけても安心?

Menucolorsパッチの取り込み

Menucolorsパッチが取り込まれ、設定ファイルに記述することで特定のアイテムに色を付けることができます。

画像では祝福された(blessed)アイテムを緑、呪われた(cursed)アイテムを赤にしています。

他にもたくさん

ぱっと見よく分からないような修正もdoc/fix36.0を読むと盛りだくさんのようです。まあ12年分だもんね、しかたないね。
めぼしい変更点については追って自サイトwikiの方でまとめようかなと思っています。墓掘ミラーの凍結は解かれるのかどうか。まあそこらへんは管理人氏の判断に任せます。

おわりに

半分以上諦めていた公式バージョンのアップデートをこの目で見れるとは感激です。何せ私は3.4.3リリース後から入ったものでアップデートするのを見たのは実質初めてです。
劇的な変化は望めないかもしれませんが、今後もNetHackを遊んだり、話題のタネにして楽しんでいきましょう。Happy NetHacking!

LLD(石鍋試験鯖)の内側

この記事は Roguelike Advent Calendar 2015 の9日目の記事です。

そもそも何それ?

石鍋試験鯖はDungeon Crawl Stone Soup(以下DCSS)というローグライクゲームをブラウザ上でオンラインプレイ、観戦、プレイ履歴管理などを行うために動いているサーバのうちの一つです。
DCSS公式オンラインサーバに参加しており、ここでの略称としてLLD(lazy-life.ddo.jp)と呼ばれています。

まずはアクセスしてみましょう。ユーザ登録をしなくても(誰かがプレイしていれば)観戦は可能です。*1

Games currently running欄のユーザ名をクリックすると観戦スタートです。ESCキーで抜けます。

*1:チャット機能はユーザ登録してログインしないと使えません

続きを読む

wikiにコメントスパムが来ていたので対策した

うちのサイトのwikiコメントスパムが来ていたのに気付いたので対策覚え書き。

デフォルトで入っているtrackerプラグインの雛形らしい。ここに#commentが入っていたのが標的にされたっぽい。

対策:

  • wikiディレクトリをSPAMの文字列で適当にgrep -rした。当環境ではwiki/3A636F6E6669672F706C7567696E2F747261636B65722F64656661756C742F70616765.txtに記録されていたが別環境ではどうか知らない。
  • ファイルを手編集してスパムコメントを削除した。あと#commentも削除した。

TIS-100でCPUの気持ちになるですよ

SpaceChemでおなじみ? のZachtronicsがこの度Steam早期アクセスにTIS-100というゲームを発表しました。

パズルゲーム? ……正直怪しいところです。パズル要素はたしかにあるものの、まるっきりプログラミングそのものです。まあジャンル分けの話題はそこそこにして、雑感を交えながら遊び方を説明していきます。

マニュアル

ゲーム中にESC→「VIEW THE TIS-100 MANUAL」でマニュアルが閲覧できます。
マニュアルは実際の古い端末の操作説明書を意識した作りになっており、プリントアウトしての利用が推奨されているようです。
当然全部英語ですが、有志による日本語訳がこちら→http://steamcommunity.com/sharedfiles/filedetails/?id=454245453&insideModal=1 で公開されています。

ゲーム中にF1キーで命令セットの一覧も出ます。

とりあえず遊んでみよう

最初は「SELF-TEST DIAGNOSTIC」だけが提示されています(クリアで問題が増えます)。クリックして問題を選択し、続けて左上の「CREATE NEW PROGRAM」を選択して入力画面に移ります。

……よく言えば硬派ですが悪く言うととっつきにくい画面です。とりあえずマニュアルを見ながら動作を確かめてみました。


左側にIN.Aと書かれている数字のリストがあります。これが画面中央上の「IN.A ↓」と呼ばれるポートから順に入力されます。


この問題は「IN.Aから読み込んだ値をOUT.Aに出力せよ」らしいです。
入力したデータをOUT.Aのポートに出力するよう各ノード(画面に12個ある四角の処理単位)の処理を書いてみましょう。
(ただし、この問題で赤くなっているノードは使えません。右上経由か左下経由で出力にデータを送ることになります。)


「上のポートから読み込み、右のポートに渡す」は「MOV UP, RIGHT」になります。この調子で各ノードに命令を書いてみましょう。

左下の「RUN」または「FAST」で計算処理が開始されます。お題を満たしたらクリア。
デバッグ用に「STEP」をぽちぽちクリックするのも効果的です。

クリアしたら、プレイヤーの回答の統計画面が表示されます。上から順に「計算に要したサイクル数」「計算に使用したノード数」「計算に使用した命令数」です。この問題は単純なので全くばらけていませんが、難しくなるにつれて自分の回答とランキングとの差違が際立ってきます。これどうやって実現したの? と首を捻るようなものも。

単なるクリアに満足せず、各性能を改善させるという遊び方もまた一つの楽しみです。

難しいですか?

わりと。


私は多少はプログラムの心得はあるもののアセンブリ言語の経験はなく、また、命令セットも貧弱なためちょっとした操作ではまったりすることが多数でした。
アセンブリ言語をバリバリ書ける方なら楽勝なのかもしれませんが……


現在7問目の「SEQUENCE COUNTER」までクリアしたもののこの時点でかなり一杯一杯になっています。どんどん難しくなるのでどうなることやら……
まあ、値段分は楽しめることでしょう。