変愚蛮怒のソースで日本語化の苦労を感じる

僕は定期的にAngbandがやりたくなるという性格をしていて、またAngband熱が頭をもたげてきた。Angbandは、Rogueに端を発する由緒正しいRPGRogue-like)。Rogue-likeはかつてアスキーが発売していたPC-98向けのRogueを高校生くらいの時に渋谷の中古ソフト屋で買って以来のつきあいなのだが、最近はAngband系で変愚蛮怒を定期的にやる感じ。これは名前からも分かるように、Angbandのバリアントの一つで日本製。ちなみにAngband指輪物語が元ネタなので、モンスターなんかは、指輪物語に由来するものも多い。たとえば序盤にはマゴットさんが「くいつき」「きば」「おおかみ」をつれて登場する。
でも、変愚蛮怒は2004年以来アップデートがされていない(SourceForgeリポジトリを見ると、そちらは6ヶ月前などに修正がされていたので、止まっているわけではないかも)。変愚蛮怒は時事ネタ系のモンスターが出てくるので、どうしても古くなってしまう。たとえば「らいおんはーと(小泉元首相ですな)」とか。でも、ソースコードが公開されてるんだから、そんなの追加できるんじゃね、自分で、ということでソースを読むわけです。
そしたら、japanese.cというファイルがあって、それは日本語化のためのコードが書かれていたのだけれど、そこにはたとえば「殴る,蹴る」のような文字列を「殴って蹴る」のように語尾を書き換えるコードがずらりと書かれていた。

#define CMPTAIL(y) strncmp(&in[l-strlen(y)],y,strlen(y))

void jverb2( const char *in , char *out){
  int l=strlen(in);
  strcpy(out,in);

  if( CMPTAIL("する")==0) sprintf(&out[l-4],"して");else
  if( CMPTAIL("いる")==0) sprintf(&out[l-4],"いて");else

  if( CMPTAIL("える")==0) sprintf(&out[l-4],"えて");else
  if( CMPTAIL("ける")==0) sprintf(&out[l-4],"けて");else
  if( CMPTAIL("げる")==0) sprintf(&out[l-4],"げて");else
  if( CMPTAIL("せる")==0) sprintf(&out[l-4],"せて");else
  if( CMPTAIL("ぜる")==0) sprintf(&out[l-4],"ぜて");else
  if( CMPTAIL("てる")==0) sprintf(&out[l-4],"てって");else
    :
    :

わー大変そう。英語だとそのまま単語を並べればいいけれど、日本語の場合は語尾が変化した方が自然なわけですな。元々英語のメッセージを、自然な日本語にするのって、大変だよなー、と改めて思った。
あ、モンスターの情報は、ソースコードの中ではなく、テキストファイルに書かれていて、それを読み込むようになってました。