diff -aurbN -xCVS -xXTAGS nethack/ jnethack/ diff -aurbN -xCVS -xXTAGS nethack/ChangeLog.j jnethack/ChangeLog.j --- nethack/ChangeLog.j 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/ChangeLog.j 2005-07-31 02:56:10.000000000 +0900 @@ -0,0 +1,683 @@ +Sun Jul 31 2005 Kentaro Shirakata + + * JNetHack-3.4.3-0.7リリース + * DOS版でスコア表示が文字化けしていた問題を修正 + * アエスキュラピスの杖が願えない問題を修正 + * 翻訳追加修正 + +Mon Apr 28 2005 Kentaro Shirakata + + * JNetHack-3.4.3-0.6リリース + * アイテムや地形の詳細表示がされない問題を修正 + * クエストに関する表示が一部乱れる問題を修正 + * 翻訳追加修正 + +Mon Jan 9 2005 Kentaro Shirakata + + * JNetHack-3.4.3-0.5リリース + * 存在しないオプションをdefault.nhに設定したときにクラッシュする + 問題を修正 + * 日本語でデータベースが呼び出せない場合がある問題を修正 + * 翻訳追加修正 + +Mon Aug 2 2004 Kentaro Shirakata + + * JNetHack-3.4.3-0.4リリース + * 複数形で願った時の処理を#ifdefで分離 + * 変身と名前返答の時に日本語が使えなかった問題を修正 + * 翻訳追加修正 + +Thu Apr 29 2004 Kentaro Shirakata + + * JNetHack-3.4.3-0.3リリース + * 虐殺で日本語が使えなかった問題を修正 + * 乗馬用アイテムの効果が効いていなかった問題を修正 + * 翻訳追加修正 + +Thu Feb 19 2004 Kentaro Shirakata + + * JNetHack-3.4.3-0.2リリース + * win/ttyがBCCでコンパイルできなくなっていた問題を修正 + * 翻訳追加修正 + +Wed Dec 31 2003 Kentaro Shirakata + + * JNetHack-3.4.3-0.1リリース + * NetHack-3.4.3ベースに対応 + +Thu Dec 5 2003 Kentaro Shirakata + + * JNetHack-3.4.2-0.2リリース + * win/ttyでスコア一覧表示が乱れる問題を修正 + * 素手で酸のブロッブを殴るとまれにクラッシュする問題を修正 + * 翻訳追加修正 + +Thu Nov 11 2003 Kentaro Shirakata + + * JNetHack-3.4.2-0.1リリース + * NetHack-3.4.2ベースに対応 + +Wed Sep 3 2003 Kentaro Shirakata + + * JNetHack-3.4.1-0.4リリース + * 翻訳追加修正 + +Sat Aug 9 2003 Kentaro Shirakata + + * JNetHack-3.4.1-0.3リリース + * Reportパッチを分離 + * コマンドラインで指定した名前の漢字コードが変換されない問題を修正 + * 翻訳追加修正 + +Thu Jun 9 2003 Kentaro Shirakata + + * JNetHack-3.4.1-0.2リリース + * winnt/ttyで日本語入力が出来ない問題を修正 + * 翻訳追加修正 + +Thu Apr 10 2003 Kentaro Shirakata + + * JNetHack-3.4.1-0.1リリース + * NetHack-3.4.1ベースに対応 + +Sat Feb 14 2003 Kentaro Shirakata + + * JNetHack-3.4.0-0.10リリース + * unix/X11対応開始 + * Radarパッチを分離 + * Newbieパッチを分離 + * CenterPopupsパッチを分離 + * MinGWでのコンパイルに対応 + * jjjを廃止 + * 公式セキュリティパッチ(C340-137)を適用 + * winnt/win32で多くのウィンドウを表示すると落ちる問題(W340-14)を修正 + * 翻訳追加修正 + +Fri Dec 20 2002 Kentaro Shirakata + + * JNetHack-3.4.0-0.9リリース + * 死の谷で上り階段が生成されないことがある問題(C340-27)を修正 + * 武闘家でレベル13の時冷気耐性がつかない問題を修正 + * Windows/GUI版がWin95系で文字化けする問題を修正 + * Boland C++でのコンパイルに対応 + * Fighterパッチを分離 + * 本家でGnome対応されているので旧GTK_GRAPHICS関係を削除 + * 翻訳追加修正 + +Sat Sep 16 2002 Kentaro Shirakata + + * JNetHack-3.4.0-0.8リリース + * ボーパルブレードで幽霊を切ると落ちる問題を修正 + * 怪物が人間に変身したときに職業表示が文字化けする問題を修正 + * 翻訳追加修正 + +Mon Aug 5 2002 Kentaro Shirakata + * dos(djgpp)対応開始 + +Sat Aug 3 2002 Kentaro Shirakata + + * JNetHack-3.4.0-0.7リリース + * jGuidebookを追加 + * data.base,quest.datをそれぞれjdata.base,jquest.datに変更 + * rogueレベルで'@'が文字化けする問題を修正 + * 地雷でその上にある巨石/像が壊れると落ちる問題(C340-2)を修正 + * 翻訳追加修正 + +Sun Jul 7 2002 Kentaro Shirakata + * JNetHack-3.4.0-0.6リリース + * フロストブランドの攻撃が命中すると落ちる問題を修正 + * 数字を"/"コマンドで調べると落ちる問題を修正 + * 音に関するメッセージが全く表示されていなかった問題を修正 + * 翻訳追加修正 + +Fri Jun 14 2002 Kentaro Shirakata + * JnetHack-3.4.0-0.5リリース + * winnt/ttyで表示が乱れる問題を仮修正 + * アイテム命名が反映されないことがある問題を修正 + * 翻訳追加修正 + +Fri May 24 2002 Kentaro Shirakata + * JNetHack-3.4.0-0.4リリース + * トリックの鞄を#lootしたときのダメージがおかしいバグを修正 + * "."で休憩できないバグを修正 + * プレイヤーがモンスターを飲み込むと無条件で石化するのを修正 + * 翻訳追加修正 + +Thu May 16 2002 Kentaro Shirakata + * JNetHack-3.4.0-0.3リリース + * winnt/tty対応開始 + * data.baseを処理 + * 翻訳追加修正 + +Sun May 12 2002 Kentaro Shirakata + * JNetHack-3.4.0-0.2リリース + * winnt/win32対応開始 + * default.nhを読もうとするとエラーになるのを修正 + * 翻訳追加修正 + +Thu May 9 2002 Kentaro Shirakata + * NetHack-3.4.0ベース JNetHackテストリリース(3.4.0-0.1) + +Sun Apr 2 2000 Issei Numata + * JNetHack-1.2.0βバージョンリリース + +Tue Mar 14 2000 Hideaki YOSHIFUJI (吉藤英明) + * IPV6に対応 + +Fri Mar 10 2000 Issei Numata + * JNetHack-1.2.0αバージョンリリース + +Wed Mar 1 2000 Issei Numata + * オープニングメッセージを変更 + * NetHack-3.3.0ベース JNetHack開発開始 + +Sat Feb 12 2000 Issei Numata + * JNetHack-1.1.5 リリース + +Mon Feb 7 2000 Issei Numata + * JNetHack-1.1.4 リリース + +Mon Feb 7 2000 Issei Numata + * NetHack-3.2.3に対応 + +Wed Dec 1 1999 Issei Numata + * JNetHack-1.1.3 リリース + +Sun Nov 21 1999 Issei Numata + * プロキシをオプションで指定できるよう変更 + +Thu Nov 19 1999 Issei Numata + * 3Dマップ対応 + +Wed Nov 17 1999 Issei Numata + * bonesシステム導入 + +Tue Nov 9 1999 Issei Numata + * JNetHack-1.1.2 リリース + +Tue Nov 9 1999 Issei Numata + * proxyを使えるように変更 + * 細かいバグ修正 + +Mon Nov 8 1999 Issei Numata + * httpでスコアを転送できるように変更 + +Tue Nov 2 1999 Issei Numata + * JNetHack-1.1.1 リリース + +Mon Nov 1 1999 Issei Numata + * 西暦2000年問題に対処 + * menuに HP/MP barを追加 + * 細かいバグ修正 + +Thu Oct 28 1999 Issei Numata + * monster detectionなどで画面が止まらない問題を修正 + * 伝統的文字モードを選択可能に + +Mon Oct 24 1999 Issei Numata + * JNetHack-1.1.0 リリース + * 細かいバグ修正 + +Sat Oct 23 1999 Issei Numata + * credit画像追加 + +Thu Oct 21 1999 Issei Numata + * JNetHack-1.0.7.19991021リリース + +Tue Oct 19 1999 Issei Numata + * JNetHack-1.0.7.19991019リリース + +Sat Oct 16 1999 Issei Numata + * warningを減らす + * 細かいバグ修正 + +Sat Oct 9 1999 Issei Numata + * newbieモード追加 + +Sat Oct 9 1999 Issei Numata + * jnethack-1.0.6.3公開 + +Fri Oct 8 1999 Issei Numata + * タイルを使用しないときはradarを非表示にするように修正 + * radarの上で ESCを押したら非表示に修正 + * optionに radarの on/offの切替を追加 + * スコアサーバに接続するとき20秒でタイムアウトするよう変更 + * その他細いバグを修正 + +Fri Oct 8 1999 Kazuhiro Fujieda + * スコア表示のバグを修正 + +Tue Oct 7 1999 ITAKURA Mitsuhiro + * 透明ピックスマップの高速化 + +Tue Oct 7 1999 Issei Numata + * optionに homeurlを追加 + * デフォルトのオプション変更 + perm_invent -> off + TEXT_COLORをデフォルトで #define + +Tue Oct 7 1999 Issei Numata + * 透明ピックスマップに対応 + * JNetHack.ad を HACKDIRに置けるように変更 + +Tue Oct 6 1999 Issei Numata + * jnethack-1.0.6.1公開 + +Tue Oct 6 1999 Issei Numata + * Linuxでも簡単にコンパイルできるよう修正 + * ripのcolormapが正しく設定されない問題を修正 + * レーダーの上でもキーを受けつけるよう修正 + * X版はオプションの有無にかかわらず、number padを移動に + 使えるように修正 + +Tue Oct 5 1999 Issei Numata + * jnethack-1.0.6公開 + +Mon Oct 4 1999 Issei Numata + * デフォルトのオプション値変更 + autopickup -> off + perm_invent -> on + mail -> off + windowtype 'tty' -> 'x11' + +Sun Oct 3 1999 Issei Numata + * レーダー表示追加 + * 色数が少ないモニタでも動作するよう変更 + +Thu Oct 1 1999 Issei Numata + * 標準タイルを32x32のものに変更 + * スコア表示を変更 + +Wed Sep 30 1999 Issei Numata + * スコアをホストに転送するシステム作成 + +Wed Sep 24 1997 Issei Numata + * class名を NetHackから JNetHackへ変更 + +Mon Sep 8 1997 uchidak@creo.co.jp +Mon Aug 25 1997 + * メッセージの修正 + +Tue Jul 22 1997 KIHARA Hideto + * メッセージの修正 + +Thu Jul 3 1997 Kentaro Shirakata + * nethack-3.2.2ベースのjnethackの開発に着手 + * quest.txtの訳語修正. + +Tue Dec 24 1996 Issei Numata + * jnethack-1.0.5.4.1 release + * 性別女でKを選ぶとPになってしまうバグを本当に修正. + +Sat Nov 23 1996 Issei Numata + * jnethack-1.0.5.4 release + * ドキュメントの修正(とてもここに名前は書き切れません) + * メッセージの修正(とてもここに名前は書き切れません) + +Fri Sep 6 1996 Issei Numata + * jnethack-1.0.5.2 release + +Fri Aug 23 1996 Issei Numata + * Fの死体や幽霊が例の場所に現われない問題の修正. + +Thu Aug 22 1996 Issei Numata + * X11で perminventをオプションで指定するとアイテムを拾ったときに + 落ちる問題の修正 + * ユーティリティrecoverで回復できない問題の修正. (NetHackのバグ) + * Class Genocideしたときのメッセージが英語の修正. + * 聖器(アーティファクト)を願って失敗したときのメッセージが英語. + +Wed Aug 21 1996 Issei Numata + * japanese/jlib.c の is_kanji1の修正 + * 職業 Fの Questでの Guardのメッセージが変 + * 職業 Fで Neutralの神が英語 + * 薬がジュースや水になるときのメッセージ. + * 毒の攻撃を食って死ぬと怪物の名前. + * たまにマップの文字が化ける(とくに jisで遊んでいる時)問題. + * 聖器(アーティファクト)に触れて死んだときの死因が英語 + * 落書の文字が化ける + +Mon Aug 19 1996 Issei Numata + * jnethack-1.0.5.1 release + +Mon Aug 19 1996 Issei Numata + * いくつかの日本語関係の表示のバグを解決 + +Fri Aug 16 1996 Issei Numata + * jnethack-1.0.5 release + +Thu Aug 15 1996 Issei Numata + * 短いファイルネームのシステムに対応できるよう,jtrns_*.cを改名 + +Wed Aug 14 1996 Issei Numata + * DOS/Vで tile表示を可能に. + +Thu Aug 8 1996 Issei Numata + * Jだけのオリジナル職業(F)を追加 + +Fri Aug 2 1996 juan@super.win.or.jp (Kenji Gotoh) + * sjisで wishingするとき旨くいかないことがある問題を修正 + +Wed Jul 31 1996 Satoh Yoshiyuki + * いくつかのメッセージの間違いを修正 + +Tue Jul 30 1996 Hiramoto Kouji (平本光二 ) + * PCでスタート時に英語のメッセージが出る問題の修正 + +Mon Jul 29 1996 Hideto KIHARA + * いくつかのメッセージの間違いを修正 + +Thu Jul 25 1996 fukui@nm.nmcc.co.jp (Terushige Fukui) + * 存在しないものを wishしたときに落ちる問題を修正 + +Thu Jul 25 1996 Issei Numata + * 日本語による wishingを一部可能に + +Wed Jul 24 1996 Hideto KIHARA + * jtrns_monの副作用の問題を修正 + +Tue Jul 23 1996 juan@super.win.or.jp (Kenji Gotoh) + * ステータス欄を全て書き換えてしまう問題を修正 + +Mon Jul 22 1996 Naoki Hamada + * DEC graphics で漢字が化ける問題を修正 + +Mon Jul 22 1996 Hideto KIHARA + * メッセージのまちがいを修正 + * jconjのバグの修正 + * 「ら」抜き言葉の修正 + +Sat Jul 20 1996 shira@kdel.info.eng.osaka-cu.ac.jp (Kentaro Shirakata) + * PCでコンパイルエラーが出るのを修正 + +Fri Jul 19 1996 Issei Numata + * いくつかの Warningを削除 + * formatの間違いを修整 + +Thu Jul 18 1996 Issei Numata + * 言語モードの切替がうまくいかないのを修整 + +Thu Jul 18 1996 Issei Numata + * jnethack-1.0.4-alpha release + +Fry Jun 21 1996 Issei Numata + * nethack-3.2.1ベースのjnethackの開発に着手 + +Thu May 2 1996 Issei Numata + * nethack-3.2.0ベースのjnethackの開発に着手 + +Sun Jun 4 1995 Issei Numata + * jnethack-1.0.3 release + +Sun Jun 4 1995 nishi@bsd1.kb.nec.co.jp + * nh14.bdfをパッケージに追加 + +Fri Jun 2 1995 Issei Numata + * スコアリストのメッセージのバグを修整. + * ドキュメントの間違いを修整. + +Thu Feb 23 1995 Hiramoto Kouji (平本光二 ) + * resotre.c メッセージを修整. + +Thu Feb 21 1995 Hiramoto Kouji (平本光二 ) + * cmd.c 「あなたは」が重複するのを修整. + +Thu Jan 5 1995 asami@cs.berkeley.edu + * 全般的にメッセージの誤訳を修整. + +Tue Dec 27 1994 藤枝 和宏 (FUJIEDA Kazuhiro) + * fountain.c 流し台の水を飲んで薬が出てきたときのメッセージを修整 + +Tue Dec 20 1994 Issei Numata + * jnethack-1.0.2 release + +Thu Oct 27 1994 narusawa@nsis.cl.nec.co.jp (Masaru Narusawa) + * NEWOS用のパッチ追加. + +Fri Oct 14 1994 Issei Numata + * X11版で長いメッセージが出たときにpanicになる問題を修正. + * 自分自身をgenocideしたときのメッセージを修正. + +Mon Sep 19 1994 Kentaro Shirakata + * mhitm.c ニンフが他のモンスターを攻撃したときにcodeを吐く問題を + 修正. + +Mon Sep 12 1994 Issei Numata + * オリジナルモードで死んだときスコアファイルが英名になるのを修正. + * 怪物の攻撃で病気になったときのメッセージを修正. + * helpに英名-和名の変換テーブル追加. + +Thu Sep 8 1994 Issei Numata + * コカトリスの死体で死んだときのメッセージを修正. + * メデューサで石化したときのメッセージを修正. + * 迷宮から脱出したときのメッセージを修正. + * たくさんの誤訳,誤字を修正. + * quest.txtを整形. + * jisモードのとき \033$@, \033$Jも有効になるように修正. + +Mon Aug 29 1994 Issei Numata + * 環境変数と設定ファイル両方を設定した場合のエラーを修正. + +Mon Aug 29 1994 Issei Numata + * jnethack-1.0.1 release + +Tue Aug 23 1994 Issei Numata + * vorpale bladeが首を切り落したときのメッセージを正しく表示する + よう修正. + +Sat Aug 20 1994 Issei Numata + * 細いメッセージの修正. + +Fri Aug 19 1994 Kentaro Shirakata + * data.base改訂. + +Wed Aug 17 1994 Masayuki Koba + * NetHack.ad 16ドットフォントをデフォルトで使うよう修正. + +Sat Aug 13 1994 Yasuhito Futatsuki + * 迷宮から抜けたときのメッセージの不具合を修正. + +Sun Aug 7 1994 Kentaro Shirakata + * DJGPP版パッケージ追加. + +Sun Aug 7 1994 高田 幸治 + * MSC版パッケージ追加. + +Thu Aug 4 1994 Yoshiki Ogino + * questpgr.c アライメント表示のバグを修正. + +Thu Aug 4 1994 Kazuhiro Fujieda + * mk_artifact以外で,artifactを得たとき正しく作成されないのを修正. + * class genocideで殺すことができなかったモンスターの名前を正しく + 表示できるよう修正. + +Mon Aug 1 1994 Issei Numata + * jnethack-1.0.0 release + +Mon Aug 1 1994 Issei Numata + * 細かいメッセージの修正. + +Sun Jul 31 1994 Kentaro Shirakata + * 刃のない武器で攻撃されたときのメッセージを修正. + +Mon Jul 25 1994 Kazuhiro Fujieda + * magicbane関係のメッセージを修正. + +Mon Jul 25 1994 Issei Numata + * jnethack-0.3.1 beta test starts + +Sut Jul 23 1994 Kazuhiro Fujieda + * artifact.c magicbaneの訳を修正. + +Mon Jul 25 1994 Issei Numata + * topl.c 長い文字列のフォールディングを修正. + * 長い名前をつけた際に文字化けするのを修正. + +Sut Jul 23 1994 Kazuhiro Fujieda + * jtrns_{obj,mon}.dat 細い訳語の間違いを修正. + +Sut Jul 23 1994 Issei Numata + * jGuideBook.txtを JNetHackにあわせ修正. + +Fri Jul 22 1994 shira@kdel.info.osaka-cu.ac.jp (Kentaro Shirakata) + * jGuideBook.txtをパッケージに追加. + +Thu Jul 21 1994 Issei Numata + * jtrns_obj.dat 武器を強くする巻物->武器に魔法をかける巻物へ変更. + * getline.c kinput2から漢字を入力できるように変更. + +Thu Jul 21 1994 Yoshiaki KASAHARA + * 麻痺->眩暈に変更. + +Thu Jul 21 1994 Issei Numata + * objnam.c nemesisの死体名が正しく表示されるよう修正. + +Thu Jul 21 1994 Issei Numata + * jnethack-0.3.0 beta test starts + +Tue Jul 19 1994 s92458km@sfc.keio.ac.jp (the kunedog) + * quest.txt Turist の翻訳追加 + +Fri Jul 15 1994 Issei Numata + * priest.c 天使の名前が正しく表示されるよう修正. + * end.c topten.c 死んだときのメッセージの不具合を修正. + * objnam.c 長い名前の文字でcoreを吐く問題を修正. + +Thu Jul 14 1994 Issei Numata + * jconj.c jtrns_obj.dat 聖器の名前が正しく表示されないのを修正. + +Thu Jul 14 1994 Issei Numata + * jnethack-0.2.4 beta test starts + +Thu Jul 14 1994 Issei Numata + * termcap.c -decで文字が化けるのを修正. + * 聖器に全部和名を与えた. + +Wed Jul 13 1994 Issei Numata + * jtrns_{obj,dat}をソースに埋めこみ,makedefsで対応するよう修正. + * warningを減らした. + +Tue Jul 12 1994 Hideharu Miyazaki + * printf系の引数の間違いを修正 + * extern.h locomotion2のプロトタイプを追加 + * コメントアウトのミスを修正 + +Sun Jul 10 1994 Issei Numata + * eat.c コカトリスで石化したときのメッセージの不具合を修正. + +Thu Jul 7 1994 + * options.c mallocが0クリアしない問題を修正 + +Wed Jul 6 1994 Yoshiaki KASAHARA + * config.h の不具合を修正 + +Tue Jul 5 1994 Issei Numata + * invent.c 発見済み宝石が正しく表示されるように修正 + * objnam.c 名づけられたアイテムが日本語らしくなるよう修正 + * end.c ペットに殺されたときの墓石のメッセージを修正 + * wintty.c -decでダンジョンがたまに文字化けするのを修正 + * メッセージやアイテムの細い修正 + +Sun Jul 2 1994 Issei Numata + * jnethack-0.2.3 beta test starts + +Sun Jul 2 1994 Issei Numata + * メッセージやアイテムの細い修正 + +Tue Jun 28 1994 Kazuhiro Fujieda + * quest.txt Elfの翻訳追加 + +Mon Jun 27 1994 Issei Numata + * quest.txt Rogueの翻訳追加 + +Sun Jun 26 1994 Issei Numata + * デフォルトのプログラム名を nethack -> jnethackへ変更 + +Sun Jun 26 1994 HAMADA Naoki + * dialog.c Ctrl-m アクションを追加 + +Thu Jun 23 1994 Issei Numata + * jnethack-0.2.2 beta test starts + +Thu Jun 23 1994 + * win/X11/winmesg.c X11R6でコアを吐く問題を修正. + +Thu Jun 23 1994 Issei Numata + * win/X11/*.c リソースに書かなくても国際化に対応するよう修正. + +Wed Jun 22 1994 Kazuhiro Fujieda + * files.c .jnethackrcを先に見るようにした. + * pager.c 罠の名前が正しく出るように変更. + * jtrns_obj.dat 訂正 + * pray.c 「献上する」を正しく表示されるよう変更. + +Tue Jun 21 1994 Yasuhito Futatsuki + * shk.c 店のなかでものを壊したときにcoreを吐くのを修正 + +Mon Jun 16 1994 Issei Numata + * data.baseの翻訳着手 + +Mon Jun 16 1994 Issei Numata + * do_name.c hallucination時のbogus monsterを正しく表示するよう修正 + * sys/unixmain.c -sオプション時に文字化けするのを回避 + +Mon Jun 15 1994 Issei Numata + * jconj.c 終止形からも活用できるようにjconj_adj 修正 + +Mon Jun 14 1994 Issei Numata + * jconj.c isspace_8 修正 + +Mon Jun 14 1994 Koji Kishi + * engrave.c jconj.c sony newsでiskanji2がかちあう問題を回避 + +Mon Jun 14 1994 Issei Numata + * jnethack-0.2.1 beta test starts + +Tue Jun 14 1994 Issei Numata + * end.c 終了時にcoreを吐くのを修正 + +Tue Jun 14 1994 HAMADA Naoki + * shk.c shopkeeperのセリフ修正 + +Mon Jun 14 1994 Yasuhito Futatsuki + * dokick.c 物を蹴って死んだときのメッセージ訂正 + +Mon Jun 13 1994 Issei Numata + * -sオプションで漢字コードを正しく認識するように改良 + * 終了時に画面が乱れるのを修正 + +Mon Jun 13 1994 Issei Numata + * jnethack-0.2.0 beta test starts + +Mon Jun 13 1994 Yasuhito Futatsuki + * dotogglelangの戻り値を 0に設定 + +Mon Jun 13 1994 Issei Numata + * JIS/SJIS端末で表示ができるように改良 + * .nethackrcで漢字コードを選択できるように改良 + +Sun Jun 12 1994 Issei Numata + * quest.txt に Cavemanの翻訳追加 + +Sat Jun 11 1994 Issei Numata + * JNetHack-0.1.9 test starts. + +Sat Jun 11 1994 Issei Numata + * quest.txt に Barbarianの翻訳追加 + * アイテム名,怪物名 オジナル<->日本語の切り替えサポート + * jtrns_obj.dat改訂 + +Fri Jun 10 1994 Issei Numata + * 発見済みアイテムの英名/和名併記 + * 「水の薬」->「水」,「フルーツジュースの薬」->「フルーツジュース」 + * rumor.fal改訂 + +Thu Jun 9 1994 Tomoyuki Shiraishi + * quest.txt に Healerの翻訳追加 + +Tue Jun 7 1994 Issei Numata + * JNetHack-0.1.8 test starts. + diff -aurbN -xCVS -xXTAGS nethack/INSTALL.j jnethack/INSTALL.j --- nethack/INSTALL.j 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/INSTALL.j 2003-12-10 00:54:07.000000000 +0900 @@ -0,0 +1,74 @@ + + JNetHack + + Copyright 1993-1997 I.Numata, S.Miyashita, N.Hamada + 2002-2003 K.Shirakata + + + INSTALL NOTE + + まず,ドキュメントに目を通せ.全てはそれからだ. + -- K.E. Aganimot, Science & Technology より + + 必要な情報がすべてドキュメントに書いてあるとはかぎらない. + -- N.N. Adamah, the Tao of NetHack より + +0) + +JNetHackは,NetHackに対するソースパッチと,各機種用のバイナリの二種類 +の形態で配布されています.ソースからコンパイルするのは少々面倒ですの +で,特に理由がなければバイナリを利用することをお勧めします. + +JNetHackをコンパイルする場合は,まずオリジナルの英語版を一度コンパイ +ルしてみることを強くお勧めします.その方が間違いや問題の発見がしやす +くなるでしょう.NetHackのコンパイルは決して単純ではありません,注意深 +く一歩一歩,問題を解決して行くのが大切です. + +次のファイルにはいかにして Nethack を構築するかが書かれています. + + sys/msdos/Install.dos (MS-DOS) + sys/unix/Install.unx (UNIX) + sys/winnt/Install.nt (MS Windows) + +より正確にコンパイルするため熟読することをお勧めします.また次のファ +イルには JNetHackのコンパイル方法が書かれています.詳しくはそちらの +ファイルを参考にしてください. + + japanese/Install.dos + japanese/Install.lnx + japanese/Install.nt + japanese/Install.unx + + NOTICE + + 注意書きには時として有益な情報もあるが + その殆どが無益なくだらない情報だ. + -- I. Atamun, タバーンな人生より + +1)環境設定について + +UNIXでの環境設定ファイルは .nethackrcより先に .jnethackrcを見に行きま +す.このため英語版のと共存が可能です.また新たに追加された環境変数と +して,`kcode'があります.値は jis,sjis,eucを取ります. + +OPTIONS=kcode:jis + +のようにして,環境設定ファイルの一番最初に設定してください.以後の環境 +の漢字コードは設定した値になります. + +2) +JNetHackで追加されたコマンドとして,「`」があります.キーを押す毎に +オリジナルモードと日本語モードが切りかわります.オリジナルモードでは, +'i','I',';','/'で表示される物体名や怪物名が英語になります.またアイテ +ムは識別しないとオリジナルの名前になりません. + + + ABOUT BUG REPORT + + 特定できるバグは,たいしたバグではない.何がバグかわからないの + が問題なのだ. + -- Otihorih, Creatures in Palace より + + +3.4 対応は http://jnethack.sourceforge.jp/ で行っています. +コメント等はこちらに頂けるとありがたいです. diff -aurbN -xCVS -xXTAGS nethack/README.j jnethack/README.j --- nethack/README.j 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/README.j 2003-12-31 21:22:34.000000000 +0900 @@ -0,0 +1,57 @@ + + JNetHack + + Copyright 1993-2000 I.Numata, S.Miyashita, N.Hamada + 2002-2003 K.Shirakata + + COPYRIGHT NOTICE + +JNetHack is Japanization of Nethack-3.4.3. You must read +original license (dat/license) and obey it to redistribute and modify +this program. Japanization part of JNetHack obey original license +completely. Japanization part copyright belong to the authors(see +below). + +JNetHackは NetHack-3.4.3に日本語化を施したものです.JNetHackを再配布する +際はオリジナルのNetHack-3.4.3のライセンス (dat/license)をよく読んでくだ +さい.日本語化された NetHackは,オリジナルの配布規定に完全に従っています. +日本語化された部分の Copyrightは作者らにあります(下記参考).また,オリジ +ナルのライセンスで言うところの NetHackとは JNetHack をも含むとします. + + + 著作権者一覧 + +Issei Numata HAMADA Naoki Shigehiro Miyashita +Tomoyuki Shiraishi Kazuhiro FUjieda Kunedog +Shinkou Awatsu Takeshi Nishimura 高田幸治 +Kentaro Shirakata 板倉充洋 樋口雄一 +Haruko Numata + + 謝辞 + +以下に,たわいもないことから厳しいことまで,貴重な人生の一部分をくだら +ないことに没頭した人間の名を示す. + +aBE TOru HAMADA Naoki Shigehiro Miyashita +Shinkou Awatsu Tomoyuki Shiraishi Masayuki Koba +Kunedog Kazuki Jo Kaoru Maeda +Toshinori Nagaoka Takashi Murase SAKAMOTO Kei +Hanataka Shinya Toshiyuki Maeshima Shigenori Imanaka +Tetsuya Fujii Atsushi Nishitani Tohru Ishii +Kenji Tonami Yoshiaki KASAHARA Kazuhiro Fujieda +Yasuhito FUTATSUKI Kunihito Yamamori Ryouko Hayashi +Akashi Fujiwara Takeshi Nishimura Hideharu Miyazaki +Kentaro Shirakata NAKANISHI Yoshiaki Kouji Takada +MAKOTO Matsushita Sayu IIDA Yosiaki +Satoshi Asami OZAWA Sakuro FUCHIGAMI Masachika +KIHARA Hideto UCHIDA Toshiaki Satoh Yoshiyuki +Terishige Fukui Yamamoto Hirotaka Hiramoto Kouji +MORIMOTO Kenji 内田 和洋 Noritaka Ishizumi +Yosuke Mitsumath Kenji Gotoh Terushige Fukui +うえだ さとし 清水頭 Hirata Makoto +FUmiki Niioka Akira Tsuneduka Tsubai Masanari +Shinmyoh Koji Yukihiko Aoki Hideaki YOSHIFUJI +久留賢治 Niizato Manabu 箱山 洋 +G-HAL + +および,dq-mlのメンバー diff -aurbN -xCVS -xXTAGS nethack/dat/Arch.des jnethack/dat/Arch.des --- nethack/dat/Arch.des 2003-12-08 08:39:12.000000000 +0900 +++ jnethack/dat/Arch.des 2004-07-09 03:26:38.000000000 +0900 @@ -200,10 +200,14 @@ OBJECT:random,random,random OBJECT:random,random,random # Treasure? -ENGRAVING:random,engrave,"X marks the spot." -ENGRAVING:random,engrave,"X marks the spot." -ENGRAVING:random,engrave,"X marks the spot." -ENGRAVING:random,engrave,"X marks the spot." +#ENGRAVING:random,engrave,"X marks the spot." +#ENGRAVING:random,engrave,"X marks the spot." +#ENGRAVING:random,engrave,"X marks the spot." +#ENGRAVING:random,engrave,"X marks the spot." +ENGRAVING:random,engrave,"×印地点" +ENGRAVING:random,engrave,"×印地点" +ENGRAVING:random,engrave,"×印地点" +ENGRAVING:random,engrave,"×印地点" # Random traps TRAP:"spiked pit",(24,02) TRAP:"spiked pit",(37,00) diff -aurbN -xCVS -xXTAGS nethack/dat/endgame.des jnethack/dat/endgame.des --- nethack/dat/endgame.des 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/dat/endgame.des 2003-12-10 00:54:07.000000000 +0900 @@ -9,11 +9,21 @@ # Players are supposed to sacrifice the Amulet of Yendor on the appropriate # shrine. +# +# Japanese version Copyright (c) Issei Numata 2000 +# changing point is marked `JP' (94/1/6) +# JNetHack may be freely redistributed. See license for details. +# + MAZE:"earth",' ' FLAGS: noteleport,hardfloor,shortsighted -MESSAGE: "Well done, mortal!" -MESSAGE: "But now thou must face the final Test..." -MESSAGE: "Prove thyself worthy or perish!" +#JP +#MESSAGE: "Well done, mortal!" +#MESSAGE: "But now thou must face the final Test..." +#MESSAGE: "Prove thyself worthy or perish!" +MESSAGE: "よくやった,人間よ!" +MESSAGE: "しかし,汝は最後の試練に直面している..." +MESSAGE: "汝自身価値あるものか否かを示せ!" GEOMETRY:center,center # The player lands, upon arrival, in the @@ -128,8 +138,11 @@ FLAGS: noteleport,hardfloor,shortsighted # The following messages are somewhat obtuse, to make then # equally meaningful if the player can see or not. -MESSAGE: "What a strange feeling!" -MESSAGE: "You notice that there is no gravity here." +#JP +#MESSAGE: "What a strange feeling!" +#MESSAGE: "You notice that there is no gravity here." +MESSAGE: "なんと奇妙な気持だ!" +MESSAGE: "あなたはここには重力がないことに気がついた." GEOMETRY:center,center # The player lands, upon arrival, in the # lower-left area. The location of the @@ -378,7 +391,8 @@ MAZE:"water",' ' FLAGS: noteleport,hardfloor,shortsighted -MESSAGE: "You find yourself suspended in an air bubble surrounded by water." +#MESSAGE: "You find yourself suspended in an air bubble surrounded by water." +MESSAGE: "あなたは水中の空気の泡のなかに浮遊している." GEOMETRY:center,center # The player lands upon arrival to an air bubble # within the leftmost third of the level. The @@ -475,9 +489,12 @@ MAZE:"astral",' ' FLAGS: noteleport,hardfloor,nommap,shortsighted -MESSAGE: "You arrive on the Astral Plane!" -MESSAGE: "Here the High Temples of the aligned gods are located." -MESSAGE: "You sense alarm, hostility, and excitement in the air!" +#MESSAGE: "You arrive on the Astral Plane!" +#MESSAGE: "Here the High Temples of the aligned gods are located." +#MESSAGE: "You sense alarm, hostility, and excitement in the air!" +MESSAGE: "あなたは精霊界に到着した!" +MESSAGE: "ここにはあなたの神の大神殿がある." +MESSAGE: "あなたは危険を感じ,興奮した." GEOMETRY:center,center MAP --------------- diff -aurbN -xCVS -xXTAGS nethack/dat/jcmdhelp jnethack/dat/jcmdhelp --- nethack/dat/jcmdhelp 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/dat/jcmdhelp 2003-12-10 00:54:07.000000000 +0900 @@ -0,0 +1,122 @@ +^ 罠の種類を調べる +^[ コマンドをキャンセルする +^A 前のコマンドを繰り返す +^C ゲームをやめる +^D 何かを蹴る (普通は扉) +^E 部屋を探す (デバッグモードのみ) +^F その階の地図を画く (デバッグモードのみ) +^G 怪物をつくる (デバッグモードのみ) +^I 道具を識別する (デバッグモードのみ) +^O 特殊な階の場所を知る (デバッグモードのみ) +^P 前のメッセージを見る +^R 画面を書きなおす +^T その階で瞬間移動する +^V 違う階へ瞬間移動する (デバッグモードのみ) +^W 望みをかなえる (デバッグモードのみ) +^X あなたの属性を見る (細かい情報は発見・デバッグモードのみ) +^Z ゲームを中断する (定義しているなら) +a 道具を使用する +A 鎧を全て脱ぐ +b 南西に歩く +B 何かにぶつかるまで南西に歩く +^B 何かが見えるまで南西に歩く +c 扉を閉める +C 怪物に名前をつける +d 物を置く +D 種類を選んで物を置く +e 何か食べる +E 床のほこりに文字を書く +g 次に方向を指定すると何かにぶつかるまで歩く +G 次に方向を指定すると何かが見えるまで歩く +h 西に歩く (number_padが設定されているときは,ヘルプ) +H 何かにぶつかるまで西に歩く +^H 何かが見えるまで西に歩く +i あなたの持ち物一覧を見る +I 種類を選択して持ち物一覧を見る +j 南に歩く (number_padが設定されているときは,他の場所に飛ぶ) +J 何かにぶつかるまで南に歩く +^J 何かが見えるまで南に歩く +k 北に歩く (number_padが設定されているときは,何かを蹴る) +K 何かにぶつかるまで北に歩く +^K 何かが見えるまで北に歩く +l 東に歩く (number_padが設定されているときは,箱の中身を略奪する) +L 何かにぶつかるまで東に歩く +^L 何かが見えるまで東に歩く +m 次に方向を指定すると,ものを拾わずに移動する +M 次に方向を指定すると,ものを拾わずに遠くに移動する +n 南東に歩く +N 何かにぶつかるまで南東に歩く(number_padが設定されているときは,物に名前をつける) +^N 何かが見えるまで南東に歩く +o 扉を開ける +O オプションをセットする (O?はオプションを説明する) +p 店の勘定を払う +P アクセアリを身につける(指輪,魔除け,など) +q 何かを飲む(水薬, 水, など) +Q ゲームをやめる +r 巻物(または,定義しているなら魔法の本)を読む +R アクセサリをはずす(指輪,魔除け,など) +s 罠や秘密の扉を探す +S ゲームを保存する +t 何かを投げる +T 鎧を脱ぐ +u 北東に歩く (number_padが設定されているときは,罠をはずす) +U 何かにぶつかるまで北東に歩く +^U 何かが見えるまで北東に歩く +v バージョンを見る +V バージョンおよび歴史を見る (長文) +w 武器を装備する +W 鎧を着る +x 知っている魔法の一覧 (定義されているなら) +X 探検モードに入る (定義されているなら) +y 北西に歩く +Y 何かにぶつかるまで北西に歩く +^Y 何かが見えるまで北西に歩く +z 杖をふる +Z 魔法を唱える (定義されているなら) +< 階段を昇る +> 階段を降りる +/ 記号が何に対応しているか調べる +? ヘルプ +& このコマンドが何か調べる +! シェルに抜ける (定義されているなら) +\ 今までに発見された物の一覧 +_ マップで示された点に最小経路アルゴリズムで移動する +. その場で休む + 何もしないでその場で休む (rest_on_spaceが定義されているなら) +: そこに何があるか見る +; 画面上の記号が何であるかを調べる +, 足元の物を拾う +@ pickupオプションを切り替える +) 装備している武器を見る +[ 装備している鎧を見る += 身につけている指輪を見る +" 身につけている魔除けを見る +( 使っている道具を見る +$ お金を数える ++ 知っている魔法の一覧 (定義されているなら) +` オリジナルモードと日本語モードの切り替え +# 拡張コマンド +M-? 拡張コマンドのヘルプ (対応しているプラットフォームなら) +M-2 二刀流戦闘の切り替え (number_padが設定されていないなら) +M-a 持ち物一覧の調整 (fixinvオプションが必要) +M-c 誰かに話しかける +M-d 物を何かに浸す +M-e 武器の技量を高めるまたは見る +M-f 鍵をこじあける +M-i 物の特別な力を使う +M-j 他の位置の飛びうつる +M-l 床の上の箱の中身を略奪する +M-m 怪物の特別能力を使う (定義されているなら) +M-n アイテムや物に名前をつける +M-o 神に供物を捧げる +M-p 神に祈る +M-r ランプをこする +M-s 座る +M-t アンデットを土にかえす +M-u 罠をはずす (通常はしかけられた物) +M-v コンパイル時のオプションを表示する +M-w 顔を拭う + + + + diff -aurbN -xCVS -xXTAGS nethack/dat/jdata.base jnethack/dat/jdata.base --- nethack/dat/jdata.base 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/dat/jdata.base 2005-06-05 17:39:54.000000000 +0900 @@ -0,0 +1,4900 @@ +# SCCS Id: @(#)data.base 3.4 2002/12/28 +# Copyright (c) 1994, 1995, 1996 by the NetHack Development Team +# Copyright (c) 1994 by Boudewijn Wayers +# NetHack may be freely redistributed. See license for details. +# +# This is the source file for the "data" file generated by `makedefs -d'. +# A line starting with a # is a comment and is ignored by makedefs. +# Any other line not starting with whitespace is a creature or an item. +# +# Each entry should be comprised of: +# the thing/person being described on a line by itself, in lowercase; +# on each succeeding line a description. +# +# If the first character of a key field is "~", then anything which matches +# the rest of that key will be treated as if it did not match any of the +# following keys for that entry. For instance, `~orc ??m*' preceding `orc*' +# prevents "orc mummy" and "orc zombie" from matching. +# +師範 +abbot + というのも,長い間ランドルフ伯には,彼の7番目の息子トマス + は,大修道院長かその類のものにするより他に,どうしようもな + いということが,はっきりしていたのである.1226年に生まれた + 彼は子供のころから,補食性の鷲になること,あるいは鷹狩りや + 馬上試合,その他の紳士的娯楽にふつうの興味をしめすことにさ + え,不可解な反感をもっていた.彼は大きく,重く,静かな少年 + で,驚くほどに寡黙であった.彼はたまに衝撃的な仕方で「神と + はなにか」と教師にとつぜん質問する以外には,めったに口をひ + らかなかった.答は記録されていないが,質問した彼自身が答を + 見つけだすにまで至ったということは,ありうる話である. + [ The Runaway Abbot, by G. K. Chesterton ] +aclys +aklys +アキリス + 鋲またはトゲがある短い棍棒で投げたあと装備できるよう紐が取り + つけられている. + 槍を遠くへ投げるのに使う器具であるアトゥルアトゥルと混同しては + ならない. +aleax +アレアックス + 属性に反する行為に対し神の罰を与えるため使わされる精霊と言わ + れている. +*祭壇 +*altar + 次の3種類がある. + 1. 神殿にあるもの.生贄用[...].石の上面には血を受けるた + めの溝があり,前の生贄が流した_苦しみの果てに流された血の, + 渇いた茶色の染み_が祭壇の全体を覆っている. + [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] + [ ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, + 原島文世・岸野あき恵訳, 東洋書林 ] +# ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, +# ダイアナ・ウィン・ジョーンズ, 原島文世・岸野あき恵訳, 東洋書林, 2004, +# pp.101-102, 祭壇 + + この世の誰にでも + 死は遅かれ早かれおとずれる + 父祖たちの灰と + 神の寺院への + 怖ろしい可能性に直面するより + よりよく死ぬことなどできようか? + [ Lays of Ancient Rome, by Thomas B. Macaulay ] +天照大神 +amaterasu omikami + 神道の太陽の女神,天照大神は神道および代々の皇室の神性の + 中心的象徴である.最初の神,伊邪那岐命の娘の一人で,左の + 目から生まれ,伊邪那岐命が特に寵愛したと言われている. + [ Encyclopedia of Gods, by Michael Jordan ] +琥珀* +amber* + 「樹脂というやつは」ウーが説明をつづけた.「しばしば昆虫をから + めとり,閉じこめてしまうことがあります.すると昆虫は,化石化し + た琥珀のなかに完璧な状態で保存される.琥珀のなかからはじつにさ + まざまな種類の昆虫が見つかっているんですよ.そしてそのなかには, + 大型動物の血液を吸っていた昆虫もふくまれます」 + [ Jurassic Park, by Michael Crichton ] + [ 酒井昭伸訳,早川書房 ] +*amnesia +maud +記憶喪失* + ここより立ち去り,来るなかれ + 偽りだらけの,思い出は失く + 月日は流れ,苦痛が訪ずれ, + 月日は転々と流れる. + 記憶を稲妻が走り + 記憶がふと蘇える + ... + おおMaud,愛しい真実の愛よ, + 私が生きているかぎり, + あなたにはいつまでも + 返して欲しくない借りだらけ. + もしあなたが私を忘れるなら + お願いだから + 私に借りを作っておくれ + そのとき私は何を言えばいいのだろう? + そして,もし忘れられるなら, + 神よ私を恥知らずとののしり, + この世から私を消しさるがよい. + [ Maud, And Other Poems by Alfred, Lord Tennyson ] +~イェンダーの魔除け +*魔除け +~amulet of yendor +*amulet +amulet of * + 「完全な魔よけは,人々を不幸にするあらゆることがらから,われ + われを遠ざけることができる――やきもち,不きげん,思いあがり, + 気むずかしさ,どんよく,自分勝手,怠惰.魔よけが作られた時分, + 人々はこうしたものを,邪悪な心とよんでいた.完全な魔よけを手 + に入れたらすばらしいと思わんか?」 + 「とても.」 + 子どもたちは,まったく熱のない調子で,いいました. + 「そして,それは,あんたたちに力と勇気をあたえることができる.」 + 「そのほうがいいですね.」 + と,シリル. + 「そして,徳を.」 + 「それが手に入ったらすてきだと思うけど.」 + と,ジェインはいいましたが,たいして興味はもっていないようすでした. + 「そして,あんたたちの心からののぞみをかなえることができる.」 + 「今しゃべってるのは,あなたですよね.」 + と,ロバートがいいました. + [ The Story of the Amulet, by Edith Nesbit ] + [ 魔よけ物語, 八木田宜子訳, 講談社青い鳥文庫 ] +# 魔よけ物語(上), 講談社 青い鳥文庫, イーディス=ネズビット, 八木田宜子訳, +# 1995, pp.55-56 +イェンダーの魔除け +amulet of yendor + この神秘的な魔除けこそがあなたの探索の目的である.この魔除 + けは定命の者にはおよそ使うことはもちろん,理解することさえ + できない力を持っていると言われている.モーロックの聖域の深 + みからこれを持ってきて天上界の適切な中央祭壇に捧げた冒険者 + は,神々より不死の生命を賜わるであろう. +angel* +天使 +御使い + イエスは答えて言われた,「良い種をまく者は人の子である.畑は世 + 界である.良い種と言うのは御国の子たちで,毒麦は悪い者の子たち + である.それをまいた敵は悪魔である.収穫とは世の終りのことで, + 刈る者は御使いたちである.だから,毒麦が集められて火で焼かれる + ように,世の終りにもそのとおりになるであろう.人の子はその使た + ちをつかわし,つまずきとなるものと不法を行う者とを,ことごとく + 御国からとり集めて,炉の火に投げ入れさせるであろう.そこでは泣 + き叫んだり,歯がみをしたりするであろう. + ... + 世の終りにも,そのとおりになるであろう.すなわち,御使いたちが + きて,義人のうちから悪人をえり分け,そして炉の火に投げこむであ + ろう.そこでは泣き叫んだり,歯がみをしたりするであろう. + [マタイによる福音書,13:37-42, 49-50,口語訳聖書,日本聖書協会] +anhur +アンフル + 戦いと狩猟のエジプトの神,彼の猛威について行ける神はほとん + どいなかった.他の多くの戦いの神とは違って,彼は善の力を持つ. + アンフルの怒りは徐々に高まるが,一度そうなると回避することは + 不可能である.アンフルは4つの腕を持つ力強い風体である.彼は + しばしば巨大な槍を持って現われる.槍を持つには,2つの右手が + 必要で,先端には太陽の破片から作られた矢じりがつけられていた. + 彼はライオンの頭を持つ女神メハトと結婚している. +アンク*モルポーク +ankh-morpork + 双子都市アンク=モルポークは,円形海岸の都市の中で最も主要な + ものであり,当然,数多くのギャング,盗賊ギルド,シンジーケ + ート他似たような組織の根城となっていた.そのおかげでこの都市 + は裕福だったとも言える.アンク川の逆回転側,迷路のようなモル + ポークの小路に住む多くの貧しい人々は,張り合うギャングたち + のためにちょっとした仕事をしては,乏しい収入を補っていたから + だ. + [ ディスクワールド騒動記,安田均訳,角川文庫 ] +anshar +アンシャル + バビロニアアッカド王朝の祖先.アンシャルはバビロニアの創世記 + 「エヌマエリシュ」ではラームとラハムの双子(他方はカイシャル) + の一人とされている.アンシャルは天と同一視されており,カイシャ + ルは地に同一視されている. + [ Encyclopedia of Gods, by Michael Jordan ] +ant +* ant +*蟻 + 普通の蟻を巨大にしたこの種は,小さい種がそうであるように + 凶暴である.様々な種が存在し,儀牲者への情け容赦ない攻撃 + で恐れられている. +anu +アヌ + アヌはバビロニアの天の神であり,北極星の支配者である.彼は + バビロニアの神々の中で一番歳をとっており,全ての神の父と + されている天と運命の統治者である.アヌはウルクや他の町の + バビロニアの「アチク祭」にて力強く演じられている. +類人猿 +人食い猿 +ape +* ape + 解剖学的特徴により示されるところや脳の発達により全ての霊長 + 類でもっとも進化した動物.樹上,地表をとわず,類人猿は後足 + よりはるかに発達した前足を持つ.尻尾は完全になくなっている. + 成長は遅く,かなり歳を取ると生殖能力を持つようになる. + [ A Field Guide to the Larger Mammals of Africa by Dorst ] + + ゴリラのアルドには計画があった.それは素晴らしい計画だった. + それは正しかった.彼は知っていた.彼はそれを考え,楽しみにし + 舌つづみを打った.そう,猿は強くなくてはいけない.猿は支配者 + でなければならない.猿は誇りを持たなくてはいけない.猿は地上 + を歩くときに大地を揺がさなくてはいけない.猿は地上の「ルール」 + でなければならない. + [ Battle for the Planet of the Apes, + by David Gerrold ] +りんご +apple + NEWTONIAN(形容詞)【ニュートン学説の】その理由は言えなかった + のだが,林檎が地面に落ちるのを発見したニュートン創案になる + 宇宙理論に関係のある.彼の後継者ならびに弟子たちが,林檎が + 落ちる時期を言えるまでその理論を押し進めてきている. + [悪魔の辞典,A.ビアス,奥田俊介,倉本護,猪狩博訳,角川文庫] + [ The Devil's Dictionary, by Ambrose Bierce ] +*考古学者 +archeologist +* archeologist + 考古学は真理ではなく事実を探究するものである.…だから,失 + なわれた都市や,エキゾチックな旅行や,世界をひとつ掘り出す + などという考えは忘れることだ.我々は地図上に埋蔵された財宝 + を求めるわけではないし,「あそこに宝物がある」などというこ + とは一度もなかったし,これからもありえない. + [ Indiana Jones and the Last Crusade ] +archon +アルコン + アルコンは天上に住む上位種である.それらは, その異常な見掛けとは + 違って,いちがいに悪とはいえない.アルコンは自身やまわりのものに + 対して平和的な種である. +アリオッチ +arioch + アリオッチ.それはエルリックの祖先たちの守護魔神である. + <地獄の大公> の中でも最強の一人であり,<剣の騎士>,<七つの + 暗黒界 の王>,<上層地獄の王>など,さまざまな異名を持つ存在. + [ Elric of Melnibone, by Michael Moorcock ] + [ メルニボネの皇子,マイクル・ムアコック,安田均訳,ハヤカワ文庫 ] +*arrow +~竹矢 +*矢 + 私は空へ向かって矢を放った, + 矢は大地へ落ちたが,場所は分らなかった. + 矢は,あまり速く飛んだので,私には + 行方を追うことなどできなかったのだ. + + 私は空へ向かって歌を歌った, + 歌は大地へ落ちたが,場所は分らなかった. + そんな鋭い視力を誰が持っていよう, + 歌の行方を追いかけられるような? + + ずっと,ずっとたってから,柏の木に + 私は矢を見つけた.矢は折れていなかった. + そしてあの歌もまた,初めから終りまで, + ある友達の心に生きていたのだ. + [ The Arrow and the Song, + by Henry Wadsworth Longfellow ] + [ 矢と歌,H.W.ロングフェロー ] + [ 楽しい英詩集,杉本誠訳編,オセアニア出版 ] +足利尊氏 +ashikaga takauji + 足利尊氏は源一族の大名で,北条軍を打ち破るため後醍醐天皇 + に協力した.のち後醍醐天皇が武士の力を抑えようとしたとき, + 彼は天皇に対し反逆した.彼は後醍醐天皇を打ち負かし,光明 + 天皇を立てた.後醍醐天皇はかろうじて逃げ延び,吉野の里に + 別の政府を立てた.この2つの王朝のある時代は南北朝として + 知られている. + [ Samurai - The Story of a Warrior Tradition, by Cook ] +asmodeus +アスモデウス + アスモデウスは,地獄全体の総支配者であると言われている.その + 外見は,他の悪魔と違い,角と尻尾以外は人間と同じである.触ら + れると,肉体は凍りついてしまう. +アサメ +athame + 魔術崇拝のイニシエーションのために聖別された儀礼用ナイフ(4つ + の基本道具の1つで,杖,聖杯,五芒星と一緒に使う).伝統的に + アサメは両刃,黒い握り,交差した柄をもつ6インチから8インチの + 長さの短剣である. +アテナ +athen* + パラス・アテナ(ミネルウァ)は,知恵の女神で,ゼウスのむすめです + が,母親はありません.ゼウスの頭から生まれたのです.その愛鳥はフ + クロウで,ささげられた植物はオリーブです. + [ Bulfinch's Mythology by Thomas Bulfinch ] + [ ギリシア・ローマ神話, 野上弥生子訳, 岩波少年文庫 ] +axolotl + よくいるサラマンダー.無害. +~防水袋 +*鞄 +*袋 +bag +bag of * +sack + 「さて,この三枚目のハンカチにも」ミステルが続けている.「縁が四 + つあります.縁がつながっておるのがご覧になれますな.この四つの縁 + を,財布の縁にしなければならん.それで完成です.外側は――」 + 「わかった!」ミュリエル嬢がやる気満々でさえぎった.「外側は内側 + とつながってるんでしょう! だけど時間がかかりそう.縫うのはお茶 + のあとにしません?」バッグを脇に置くと,ふたたびティーカップを手 + にした.「だけどなんで幸運の財布って名前なんです?」 + 老人は今まで以上に教授っぽく,にっこりと微笑みかけた.「わかりま + せんかな――言ってよろしいか? 内側も外側も財布,外側も内側も財 + 布.ということは世界中の富がこの小ッコヒ財布の中に入るのですぞ!」 + [ Sylvie and Bruno Concluded, by Lewis Carroll ] + [ シルヴィーとブルーノ完結編, wilder訳, プロジェクト杉田玄白 ] +b*lzebub +ベルゼブブ + 「蝿の王」はヘブライ語のBa'alzevuv(ギリシャ語ではBeelzebub)が変 + 化したものである.もともとこの名前は,辛辣で悪魔の名前であると + 思わせるような単語の綴を間違えたものを誤訳したものだと思われる + (悪魔には腐敗,破壊,堕落,ヒステリー,混乱を連想させるような名 + 前がつけられている). + [ Notes on _Lord of the Flies_, by E. L. Epstein ] +balrog +バルログ + そのものは火のきわまでやって来ました.火はまるで雲がかぶさ + ってきたかのように,光がうすれました.ついでその物は一跳び + で割れめを越えました.焔は迎えるようにごうごうと燃えたけり, + それにからみつきました.黒い煙が渦を巻いて立ち上りました. + たなびくたてがみに火がついて,その者の背後に赤々と燃え上が + りました.その者の右手には切っ先鋭い火の舌のような刃が握ら + れ,左手にはたくさんの皮紐のついた鞭が握られていました. + 「ああ!ああ!」レゴラスが声をふりしぼりました.「バルログ + だ!バルログが来た!」 + [ The Fellowship of the Ring, by J.R.R. Tolkien ] + [ 評論社, 瀬田貞二訳 ] +バルキテリウム +チタノゼア +baluchitherium +titanothere + 絶滅したサイには様々な形態が含まれる.漸新世の時代にアジアにい + たもっとも壮観な生き物であるバルキテリウムは知られているかぎり + 地上最大の哺乳類である.その体は肩まで18フィートの高さで,どっし + りとした四肢にささえられており,4フィートの長さの頭は木の高い枝 + の葉を食べることができた.第3期の始めのチタノゼアまた巨大な奇蹄 + 類であり,漸新世のブロントテリウムも肩まで8フィートあった. + [ Prehistoric Animals, by Barry Cox ] +バナナ +banana + また一歩,彼が進みでたところを見すまして,彼女は強く右の手首をひ + ねった.ばねがかちりと鳴るのが聞こえた.重みが手のなかにすべりお + りてきた. + 「これでも食らえ!」悲鳴のような声で叫ぶなり,デイナは右腕を斜め + 上に強くふりあげた.相手の下腹を切り裂いてやるつもりだった.腹を + 切り裂いて,相手が湯気の立つロープさながらに内臓をばらまきながら, + もつれる脚でそこらをよろめきあるくさまを見物してやりたかった.と + ころがそのかわりに,彼は両手を腰にあてると,胸を張ってからからと + 笑いだした.熱気を放つ顔を大きくのけぞらせ,いかにも上機嫌に,表 + 情をくしゃくしゃにゆがめて哄笑しつづけた. + 「おやおや,たいへんだ!」そう叫んで,そこでまたひとしきり,げら + げらと笑った. + デイナは呆然とわが手を見おろした.その手が握っているのは,かたく + 黄色いバナナだった.チキータ・バナナの青と白のステッカーまで貼っ + てある.おぞましさに,デイナはあわててそれを投げだした.カーペッ + トの上に横たわったそれは,フラッグ自身の笑みをそっくり模倣して, + 忌まわしい黄色のにたにた笑いとなった. + 「さあ,言うんだ.」彼がささやきかえてきた.「どうせいずれは答え + ることになるんだから」 + そしてデイナも,それがそのとおりであるのをさとった. + [ The Stand, by Stephen King ] + [ ザ・スタンド, 深町眞理子訳, 文藝春秋 ] +*野蛮人 +蛮族 +barbarian +* barbarian + まず,身装りが似ていた----鹿皮の深靴,革の短袴に鹿皮の短衣,広 + 幅の腰帯に斧と短剣を差し,だれもが痩せぎすで,顔に創痕があり, + 目が鋭く,筋肉質の躰,そしてそろって寡黙だった. + 彼らはいうなれば野性の男だが,しかし,キンメリア人とのあいだに + は,天地ほどの懸隔があった.彼らはもともと文明の子であるが,生 + きてゆく必要から,半ば蛮族の状態に復帰していたのだが,コナンは + それに反して,数千年のあいだ,野性の血を変えることなく伝えてき + た蛮族中の蛮族だった.アキロニアの山男たちは,鍛練によって忍び + の術を習得したのだが,コナンはそれを身に付けて生まれてきて,動 + きに無駄がないだけでも,彼らをはるかに遼駕していた.彼らが狼で + あるとすれば,コナンは猛虎であった. + [ Conan - The Warrior, by Robert E. Howard ] + [ コナンと古代王国の秘宝, 宇野利泰訳, 創元推理文庫 ] +髭のある悪魔 +barbed devil + 髭のある悪魔には特殊能力が全くない.しかし倒すのは非常に困難 + である. +*こうもり +*bat + 一匹のコウモリが,外の暗闇の中を飛び回っていたが,夜毎の巡 + 回をするとき道を間違え,健康のために開けたままにしてあった + 窓から中に入ってきた.そしてコウモリは部屋の中を,無目的に + 馬鹿のように輪を描いて飛びはじめた.それは,神が創造された + うち,より低い知性しか与えられなかったものどもの中でも悪名 + 高い,コウモリに生来のものである.昔の箴言は言ったものだ. + 「私にコウモリを見せよ.そうすればある種の住みかにあるべき + 何かを見せよう」 + [ A Pelican at Blandings, by P. G. Wodehouse ] +*蜂 +*bee + 有益な通常の蜂の近縁にあたるこの巨大な様々な蜂は通常小さな集団 + を形成して現われ,それらの女王蜂のためにかかせないロイヤルゼリー + を作るために生きた食材を探している.極稀に女王蜂に餌が与えら + れている蜂の巣に誰かが誤って入ると,侵入者に対して女王蜂の身を + 守る. +*カブト虫 +*beetle + (創造神は)甲虫を過度に溺愛している. + [ 生物学者J.B.Sホールデンによる ] + + 甲のような形をした羽をもつ昆虫に共通の名前(学名: Coleoptera). + 昆虫の10の亜綱の1つ.それらは折りたまれた後羽を覆う甲(二枚の + 前羽)が特徴である. + [ Van Dale's Groot Woordenboek der Nederlandse Taal ] +開放のベル +bell of opening + 「ベルと,本と,ロウソクによる作業だ」 + 会計がためいきをついた.「我々はそれを試しましたよ,総長」 + 総長は総長のほうに身をのりだした. + 「なに?」と総長は言った. + 「我々はそれを試しましたと,こう申したのです,総長」会計が, + 老人の耳にむかってどなった.「夕食後,おぼえておいででしょ + う? 我々はHumptemperの『蟻どもの名前』を使い,Old Tomをな + らしたのです」 + 「そうだった,たしかに.で,うまくいったのだろう」 + 「とんでもない,総長」 + + (Old Tomは大学の鐘楼にある,ひとつのひびわれた青銅のベル) + [ Eric, by Terry Pratchett ] +目隠し +blindfold +  この眼かくしといふのは,アマハッガー人が着物をこしらへる + 黄色い麻布の切れっぱしで,眼のまはりをしつかりとくゝつて, + うしろでかたく結ぶことであつた.この麻布は,その後私の發見 + したところによると墓場から掘り出したもので,私の想像したや + うに土民のこしらへたものではなかつた. +  序(ついで)に言つておくが,アステーンも眼かくしをされた. + これは,彼女が吾々に秘密を聞かすかもしれんといふ用意のため + だつたのであらう. + [ She, by H. Rider Haggard ] + [ 『洞窟の女王』平林初之輔訳,改造社 ] +ブラインド*イオ +盲目のイオ +blind io + この日,たゆみない覚醒のおかげで神々の長となった“盲目のイオ” + は,手に顎を乗せて座り,目の前の赤大理石のテーブルに載ったゲー + ム盤を眺めていた.「盲目のイオの名前は,眼窩のあるべきところに, + のっぺらぼうの皮膚しかないところに由来する.イオの目は,感動す + るほど数が多いのだが,目たちはそれ自身で半ば独立した生活を送っ + ていた.そのうちのいくつかが,現在,テーブルの上を浮遊している. + [ The Colour of Magic, by Terry Pratchett ] + [ ディスクワールド騒動記,安田均訳,角川文庫 ] +*ブロッブ +ゼラチンキューブ +*ウーズ +*プリン +* blob +gelatinous cube +ooze +* ooze +*pudding + この巨大なアメーバのような生き物は,粘液の水たまりにしか見え + ないが,金属や木,加えて即席の洞窟探検者などを食べて生きてい + る. + +  しかしわたしたちは地下鉄のプラットホームにいたのではなかった. + 悪臭放つ虹色に輝く悪夢じみた可塑性のある柱が,十五本の足の月空で + 床に密着して進み,いやましに不快にも速度を早め,深淵の青白い蒸気 + がふたたび濃密になった渦巻く霧を押しやっている,その前方にわたし + たちはいたのだ.どんな地下鉄の列車よりもはるかに巨大で恐ろしい, + 筆舌につくしがたいものだった―原形質の泡の無定形の塊が,自らかす + かに輝き,わたちたちに向かいあう,トンネルを満たす前部のいたると + ころに,緑がかった光を放つ疣のような何万もの一時的な目を形成した + り消したりしながら,あわてふためくペンギンたちを押しつぶし,同類 + とともに邪悪にもすべてをとりさったなめらかな床をずるずるすべって + きたのだった. + [ At the Mountains of Madness, by H.P. Lovecraft ] + [ 狂気の山脈にて, ラヴクラフト全集4, 大瀧啓裕訳, 創元推理文庫 ] +骨の悪魔 +bone devil + 骨の悪魔は武器と,大きな鈎のついた尾で攻撃してくる.この鈎が + 刺さると,強さが吸い取られてしまう. +死者の書 +*燭台 +*ろうそく +book of the dead +candelabrum* +*candle +# data.baseで引用されている本とは異なる本を訳したものなのか, +# 内容が少し異なるようです. + メフィストフィリス さてと,フォースタス,今度はどうしたい? 言っ + とくが,おまえは鐘と聖書と蝋燭による破門の儀式で呪われる + だろうぜ. + フォースタス 鐘と聖書と蝋燭か,蝋燭と聖書と鐘か, + 順序はどうでもどうせフォースタスは地獄堕ちか! + 修道士たち,鎮魂歌を唱えるべく鐘と聖書と蝋燭をもって登場. + [ Doctor Faustus and Other Plays, by Christopher Marlowe ] +# フォースタス博士 第九場, クリストファー・マーロウ, 小田島雄志訳, +# エリザベス朝演劇集I マルタ島のユダヤ人 フォースタス博士, +# 白水社, 1995, p205 +*靴 +*boot* + ファンタジーランドの長靴は異常とも思えるほど,ほとんど,あ + るいは決して擦り減ることがなく,靴下を履かなくとも乗馬や歩 + 行にまったく支障がない.きつかったり,靴擦れしたり,石ころ + が入ることはなく,くぎが靴底を突き破って足に刺さることもな + い.長靴の長さはふくらはぎの中頃か膝丈までが慣例となってお + り,着脱簡単で足の臭いがすることもない.残念ながら,このす + ばらしい履物の作り方は門外不出であるが,おそらく人間でない + 種族の製法によるのだろう(ドワーフ,エルフ,ノームを見よ). + [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] + [ ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, + 原島文世・岸野あき恵訳, 東洋書林 ] +# ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, +# ダイアナ・ウィン・ジョーンズ, 原島文世・岸野あき恵訳, 東洋書林, 2004, +# p.171, 長靴 +岩 +boulder + 私はてこをよく下へ動かし,背中をのばした.岩のはしが持ちあ + がった.私はてこの支点をけとばした.そこで押し下げようとし + たとき,私は下からなにかとりだすべきものがあることを思いだ + した.私がてこをはずせば,岩はまた落ちてしまうだろう.私は + カシの木の根に座って,考えた.木が大地に立っているのを見な + がら,自分のやり方を調べた.私がより長いてこをもってきてい + たのは幸運だった.てこは,カシの根におしこむのにちょうど届 + くだろう長さがあった. + てこをそこまで押し下げるのは目方のある人間には楽な仕事だろ + うが,私にとっては困難な戦いだった.だが,今回は私はたとえ + 死のうともそうするつもりだった.なぜなら,私はそれができる + と知っていたからだ.二度私は近くまでいったが,二度とも重し + はふたたびそれを押し上げた.しかし三度目に自分自身を投げだ + したとき,私の耳にポセイドンの海の音が聞こえた.そこで,今 + 度はできるとわかった.そして,私はやった. + [ The King Must Die, by Mary Renault ] +~和弓 +~ダイアナの長弓 +*弓 +~*longbow of diana +bow +* bow + 「黄金の勇士ども,部署について待機するんだ.剣の柄に誓って言う + が,この旅はついてるぞ.白衣隊の古い言い伝えを忘れるな」エイル + ワードはグループからグループへと伝えて回った. + 「エイルワード,何だそりゃ?」何人かが大声で訊いた.弓にもたれ, + エイルワードを笑っている. + 「弓作りの名人の忠告だ.『弓はよく曲げよ.矢はよく放て.矢はよ + く弓につがえよ.弦はよく張れ』.これを頭ん中でくり返し,左手に + は腕甲,右手には射撃用の手袋,ベルトには一ファージング価のワッ + クス.射手にこれ以上何が要るというんだ?」 + 「ベルトの下に四ファージング価のワインがあれば,もっといいだろ + うな」ジョンが言った. + [ The White Company, by Sir Arthur Conan Doyle ] + [ 白衣の騎士団,笹野史隆訳,原書房 ] +ブリジット +brigit + ブリジット(ブリジッド,ブライド,バンファイル)は「高貴な人」を + 意味するケルト族(大陸のヨーロッパ人やアイルランド人)の肥沃の女 + 神である.彼女は本来2月1日のインボルク祭で祝福される.祭は + 雌羊の授乳のはじまりとされており,スコットランドでは,陰鬱な冬 + の魔女を退ける日ともされている.キリスト教の暦も同じ日を聖ブリ + ジットの祝日としている.アイルランドにキリスト教の聖徒が本当に + いたと言う記録はないが,アイルランドの神話では彼女は聖母マリア + の助産婦となっている. + [ Encyclopedia of Gods, by Michael Jordan ] +~ストームブリンガー +*幅広の剣 +~stormbringer +*broadsword + おれのだんびらをもってこい + そしておれの理解をはっきりさせてくれ + おれの黄金の十字をもってこい + 魔除けとするために + [ "Broadsword" (refrain) by Ian Anderson ] +バグベア +bugbear + バグベアはゴブリンの血縁だといわれているが,大概のものはより大 + きく毛深い.攻撃的な肉食動物で,時には財宝を狙って襲いかかって + くる. +ラッパ +bugle + 「私はあなたを知る + その角らっぱとすぐれた乗馬で + 私はあなたを知る + 王の緑の森を守ると誓った森林監視員だと + 「森林監視員は,貴夫人よ,角らっぱを吹く + それは夜明けのこと + 彼のひと吹きは楽しい夜明けに聞かれる + 私のは夜のしじまに聞かれる + [ Brignall Banks, by Sir Walter Scott ] +カマキシトリ +*camaxtli + 古代中米のアステカ人の戦いの神.ミクスコルカマキシトリ(雲蛇) + としてもまた知られている.彼はまた囚われた捕虜を生贄として受けと + る狩と火の象徴である.伝説によれば,太陽の神テスカリトポカがミク + スコルカマキシトリに変身し聖なる火の杖を振りまわし火を作ったとさ + れている. + [ Encyclopedia of Gods, by Michael Jordan ] +キャンディ +candy bar +  一年にたった一日だけの誕生日に,チャーリーはチョコレートのかけ + らにありつけました.家じゅうの人たちが,この特別の日のために,お + 金をためておくのです.この記念すべき日がくると,チャーリーは小さ + な板チョコをプレゼントされて,自分だけでぜんぶ食べることになって + いました.このすばらしい誕生日の朝がくるたびに,かれはプレゼント + をもらうと愛用の小さな木の箱に,その板チョコをまるで金ののべ棒か + 何かみたいに,たいせつにしまうのでした.そのあと二,三日は少年は + ただ眺めているだけで,指一本ふれようとはしませんでした.でも,と + うとう我慢できなくなると,少年は包み紙のすみっこをほんのちょっぴ + り破って,チョコレートをむき出すと,さも惜しそうにちょびっとかむ + のです--あのとろけるような味が,舌のうえに,ほのかにゆっくりとひ + ろがるくらいまで.そのつぎの日,少年はまたちょっぴりかじりました. + そしてつぎの日もちょっぴり,そしてつぎの日も.こんなふうにして, + チャーリーは誕生日にもらった六ペンスの板チョコを,一ヶ月以上もも + たせるのです. + [ Charlie and the Chocolate Factory, by Roald Dahl ] + [チョコレート工場の秘密 田村隆一訳 評論社] +シュレディンガー* +s*d*g*r* cat + 完全に作られていかなる影響もその壁を越えて出入りできない,密閉さ + れた容器を想像しよう.容器の中には猫が閉じ込められており,また何ら + かの量子事象に触発されて起動する装置も収められている.その事象が起 + きると,装置が働いて青酸を入れた小瓶が割れて猫は死ぬ.もし,事象が + 起こらなければ,猫は生き続ける.シュレーディンガーの最初の案では, + 量子的事象は放射性原子の崩解であった. + .... + 外部の観測者には,猫は確かに,生と死の線型結合であり,最後に容器が + 開かれたときにはじめて,猫の状態のベクトルは崩解してどちらか一方の + 状態になる.これに対して,容器内部の(適当な防御を施した)観測者に + とって見れば,猫の状態ベクトルはもっと早く崩解してしまい,外部の + 観測者との線型結合は意味がなくなる. + [ The Emperor's New Mind, by Roger Penrose ] + [ 皇帝の新しい心,林 一訳,みすず書房 ] +*猫 +*cat +kitten + よく知られた肉食のネコ科の四足動物(学名: Felis ochreata + domestica),厚く柔らかい毛皮を持ち,よくペットとして飼われる. + 多くの伝承が魔法や古代エジプトの神に関連づけてネコをとりあげて + いる. + +  かくしてウルタールはやりきれない怒りのうちに眠りにつき,住民が + 夜明けに目を覚ますや,何ということか,すべての猫が馴染の炉辺にも + どっていたのである.大きいのも小さいのも,黒いのも,灰色のも,縞 + のはいったのも,黄色のも,白いのも,猫はすべてもどってきた.あま + つさえ,いつにもまして毛並もつややか,腹をふくらませ,満足げに, + 喉を鳴らしていた. + [ The Cats of Ulthar, by H.P. Lovecraft ] + [ ウルタールの猫, ラヴクラフト全集6, 大瀧啓裕訳, 創元推理文庫 ] +# this one doesn't work very well for dwarven and gnomish cavemen +洞窟人 +cave*man +human cave*man + 今や,去るのに充分な明るさだった.ムーンウォッチャーはしぼんだ死 + 体を拾い上げ,洞穴の低い張り出しの下で背をかがめながら,それを自 + 分の後ろに引きずった.一度外に出て,彼は身体を肩の上から投げ出し, + そしてまっすぐに立った――この世界においてそれ(直立)が出来る唯 + 一の動物として. + 彼の種族において,ムーンウォッチャーはほとんど巨人だった.彼の背 + 丈は約5フィートあり,そしてひどく栄養不良とはいえ体重は100ポ + ンド以上あった.彼の毛深い筋肉の体は猿と人間の中間であったが,彼 + の頭部は既に猿より人間にずっと近いものであった.額は低く,眼窩の + 上にうねがあり,紛れも無く彼の遺伝子には人間の兆候がみられた. + [ 2001: A Space Odyssey, by Arthur C. Clarke ] +*ケンタウロス +*centaur + ギリシャ人の想像したケンタウロスはそれ自身1つのクラスを構成す + る.かなりの好色気質にもかかわらず,普段のふるまいは道徳的で, + 人間には親切である. + ネッソスのダイアネイラへの非道な未遂行為,ラピタイの花嫁での全 + てのケンタウロス族の非道行為は,フォロスの待遇や,ケイロンの智 + 恵,医師,予言者,叙情詩人,アキリスの指導者で埋め合せてあまる + くらいである.さらに,馬の体に人間の胴体と頭からなるケンタウロ + スは独特の想像もできない二重の生命器官ときわめて重要な男根を必 + 要とする特有の生活をしている.そのグロテスクな交合はギリシアっ + ぽくない.この奇妙な生き物は洞窟や山地の断崖に澄んでいると言わ + れ,神話は特にテサリーの丘やエリマンソス山脈などに結びつけてい + る. + [ Mythology of all races, Vol. 1, pp. 270-271 ] +ムカデ +centipede + 私はここ,ムカデがたくさんいる地域で,以前にしばしば見たも + のを観察した.この地域のムカデは,明るい赤みがかった身体に + 青い足をもっている.大きなヤスデがそこらじゅうをはいまわっ + ているのが見られる.これらはなんの害もないにもかかわらず, + 人間に嫌悪感をかきたてる.おそらく人間の姿は,象やその他巨 + 大な動物にとっては同じような嫌悪感をもよおすものだろう.ム + カデどもは大いに邪魔されたので,人間を,自分たちの平穏をめ + ちゃめちゃにするいまわしい二足動物として,まったく信頼でき + ないものと考えるであろう. + [ Travels and Researches in South Africa, + by Dr. David Livingstone ] +ケルベロス +cerberus +kerberos + ケルベロスは3つの頭を持つ地獄の門の番犬だ.死者を通すが二度と + 戻らせることはない.しかしたったの2度だけ彼は騙されたことがあ + る: 一度はオルフェウスがその竪琴で奏でる美しい音楽で眠らせて, + また一度はヘラクレスが彼の12番めの(そして最後の)試練として + 生者の世界に連れ出した時である. +カメレオン +chameleon + カメレオン科,カメレオン類のうろこをもつトカゲに似る生物. + とくに学名Chameleo Vulgarisをさす.短い首と爪,ものをつか + むことのできる尾をもち,舌は長く延ばすことができ,また眼球 + は左右独立して動く.カメレオンが怯えるか怒るかすると,身を + ふくらませ,透明な皮膚が血液を見せる.皮膚は最初は緑がかっ + た色だが,次第に斑点のある赤色にまで変わっていく.最終的な + 色は背景色に依存する.これゆえ,カメレオンは不信感をほのめ + かす比喩表現である.大文字の場合,南半球の星座(カメレオン + 座)である. + [ Van Dale's Groot Woordenboek der Nederlandse Taal ] +カロン +charo*n + 古代ギリシャ人が死ぬと,その魂は地下の世界すなわち冥界へ行った. + 魂が冥界へとたどり着くには,生者と死者とを分かつステュクス川を + 渡らねばならなかった.ステュクス川は渡し船で渡ることができ,船 + の年老いたみすぼらしい渡し守はカロンと呼ばれた.人が死ぬとその + 家族は,渡し守に渡し賃を払えるようにと,死者の舌の下に硬貨を入 + れた. +*箱 +chest +large box +  箱の周囲の土は,たちまちにして掻きのけられた.そしてダンテスは, + 順々に,二つの錠前に挟まれた真中の鍵や,側面についたにぎりのあら + われるのを見た.そのすべてには,当時の風習にしたがって彫刻が施さ + れていた.当時にあっては,細工さえ施してあったら,どんなつまらな + い金属でも,すべて貴いものとされていたのだった. +  ダンテスは箱のとってを取って,持ち上げてみようとした.だが,そ + れは不可能だった.明けてみようとしたが,鍵や錠前がかかっていた. + これら忠実な番人どもは,さも中の宝を引き渡したくないとでもいうよ + うだった. +  ダンテスは,鶴はしの鋭い端を箱の身と蓋との間に差しこみ,鶴はし + の柄に力をこめた.すると蓋はしばらくきしんでいた後ではじけ飛んだ. + 板に大きな割れ目ができると,もはや金物などはなんの役にもたたなかっ + た.そして,その執拗な爪で,板をしっかり捉まえていたが,遂には板 + に傷をつけながらはずれ落ちた.箱はあいた. +  狂おしい昂奮がダンテスを捉えた.彼は銃をとり,それに弾丸ごめし + て自分のそばに置いた.まず彼は,輝く空におけるよりももっとたくさ + んな星を想像の夜のうちに見つけようとする子供のように,その両眼を + 閉じてみた.そして,ふたたびそれを開いたとき,彼は茫然として目が + くらんだ. +  箱は三つに仕切られていた.第一の仕切りには,鹿の子色の反射をみ + せて真紅な金貨が輝いていた.第二の仕切りには,磨きのかからない地 + 金が整然と並んでいた.だが,それは,とても重く,すばらしい価値が + あるということ以外,金のようには見えなかった.さて第三の仕切りに + は,その半ばを埋めつくして,手に溢れるほどのダイヤモンド,真珠, + 紅玉があった.それは輝きわたる滝をなしてざらざらこぼれ落ちながら, + まるでガラス窓にあたる霰のような音をたてた. + [ The Count of Monte Cristo, by Alexandre Dumas ] + [ モンテ・クリスト伯, 山内義雄訳, 岩波文庫 ] +赤松子 +chih*sung*tzu + 中国の雨の神. +クロマティック*ドラゴン +ティアマット +chromatic dragon +tiamat + ティアマットは邪悪なドラゴンの母といわれている.彼女はとても + 虚栄心が強い. +~エルフのクローク +~防水クローク +*クローク +~elven cloak +~oilskin cloak +*cloak* + すべての者(野蛮人を除く)にとっての一般的な,外にまとう服. + その理由ははかりがたい.マントは前が開いているので,ほとん + どの間,片手で開かないように押さえていなければならない.馬 + 上ではシャツしか着ていない腕と,胴の大部分を,風雨にさらす + ことになる.マントの公認表現は,その不便さをよく伝えている. + マントはしょっちゅう_はためき,露をしたたらせ_,雨の日には + _濡れて重くなり_,_木や剣にからまり_,_震えながら体に巻きつ + け_なければならない.これは困難なツアーをする者にとってはち + っとも実際的ではないように思える. + [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] + [ ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, + 原島文世・岸野あき恵訳, 東洋書林 ] +# ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, +# ダイアナ・ウィン・ジョーンズ, 原島文世・岸野あき恵訳, 東洋書林, 2004, +# pp.238-239, マント +雲 +cloud* + 谷また丘のうえ高く漂う雲のごと, + われひとりさ迷い行けば, + 折しも見出でたる一群の, + 黄金色に輝く水仙の花, + 湖のほとり,木立の下に, + 微風に翻りつつ,はた,踊りつつ. + [ I Wandered Lonely as a Cloud, by William Wordsworth ] + [ 水仙,ワーズワース詩集,田部重治選訳,岩波文庫 ] +コブラ +cobra + ダージーとおくさんは,こたえもしないで,巣のなかでちじこまるばか + りだった.木立ちの下の厚くしげった草やぶから,ひくくシューという + 音がしたからだ.この,ぞっとするような冷酷な音を聞くと,リッキは, + ゆうに六十センチとびすさった.見ると,草の上に一センチずつヘビの + 頭がせりあがってきた. + かさのように首根っこをふくらませた大きなクロコブラ,ナッグの頭だ. + 身長は,舌のさきからしっぽまで,一・五メートルもある.からだを三 + 分の一,地面からもちあげると,そのまま宙にうかせてゆすっている. + ちょうど,タンポポの花が風にゆれているようだ.ナッグはリッキをじっ + と見た.すこしも表情をかえない,じつにいやなヘビの目だ.なにを考 + えていようと,けっしてそとにださない,あの目だ. + 「ナッグってだれだ,だと?」 + コブラはいった. + 「ナッグとはな,このおれさまじゃよ.偉大なブラフマーの神が,おれ + たちなかまにつけてくださったご紋だ,よっくおがめ!ブラフマーさま + がお昼寝のとき,ご先祖がこのかさをひろげて,かげをつくってさしあ + げたのよ.ほれ,こわかろうが.」 + [ Rikki-tikki-tavi, by Rudyard Kipling ] + [ リッキ・ティッキ・タービ ] + [ ジャングル・ブック, 西村孝次訳, 学習研究社 ] +チカトリス +コカトリス +c*ckatrice + 何百年に一度,星々の位置が正しい位置にあるとき,7歳の雄鳥が卵 + を産む.そして,蛇がやってきて卵に巻きついたり,ヒキガエルが + 卵の上に乗ったりして温め,孵化するのを手伝う.それが孵化した + とき,出てきた生き物をバジリスクとかコカトリスとか呼ぶ.最も + 危険な生き物である.その黄色い凍てつくようなヒキガエルの目を + ちらりと見ることは,人間と獣の両方に死をもたらす.その破壊の + 力は,強力すぎるので,時々そのシーッと言う声を聞くだけで死ぬ + ことがあると言う.その息は猛毒で,全ての植物を枯らす. + + しかしながら,バジリスクの死の眈みに耐えることができるある種 + の生き物がいる.これはイタチである.誰も何故そういうことなの + か知らないが,兇暴なイタチはバジリスクを殺すことができる.バ + ジリスクはもがきながら死んでいく.このようにイタチはバジリス + クを瀕死にするものとして知られている.もしそれが見ているなら, + 鏡でその姿を反射させることにより直ちに死をもたらすことだろう. + しかし死んだバジリスクもまた危険である.その生命のない体にさ + わることは,たまに人間に病気や死をもたらすと言われている. + [ 神話の生物, Deirede Headon(レプレコーン図書) ] +とんがり帽子 +cornuthaum + 男の人は,毛皮の肩衣のついた流れるような長いガウンを着ていた. + ガウンには一面に,十二宮星座のサインが刺繍してある.そのほかに, + 三角で囲んだ目玉やら,妙ちくりんな十字架やら,木の葉や,鳥やけ + ものの骨,太陽をうけた鏡の破片さながらにきらきら光る星座図など + の,さまざまな秘教的な図柄もあった.頭には,学校でだめな生徒が + かぶらされるのにそっくりな,とんがり帽子をかぶっている.そのこ + ろの貴婦人のかぶりもののようでもあるが,貴婦人なら,てっぺんか + らヴェールをなびかせているところ. + [ The Once and Future King, by T.H. White ] + [ 永遠の王, 森下弓子訳, 創元推理文庫] + + 「魔法使いだ!」ドゥーリーが驚きにうたれて叫んだ.「おおせ + のままに,皆様がた」と魔法使いが言った.「気づかれるとは, + なんたる洞察力よ.どうやら帽子のせいで露見したようですな. + 一種の目印です,疑いなく」彼の帽子はほとんどそのとおりだっ + た,高く,円錐形で,一面に星と三日月の模様があった.概して, + これ以上ないというくらい魔法使いらしかった. + [ The Elfin Ship, James P. Blaylock ] +コウアトル +couatl + 神話で羽のある大蛇.コウアトルはとても珍しい. +コヨーテ +coyote + この肉食獣は,そのさかんな食欲と,自分の知性に対する慢心し + た考え方で有名である. +クラム +たらふく +cram* + たらふくがどんなものかといっても,わたしには作り方がわかりませ + ん.ただ,ビスケットのようなもので,「もち」がたいへんよいとこ + ろから,非常食料とされるくらいで,くちゃくちゃのものをかむ練習 + のために使うのでなければ,とびついてほしがるようなものではあり + ません.長い旅をする場合,湖の人たちが作る食べ物です. + [ The Hobbit, by J.R.R. Tolkien ] + [ ホビットの冒険,岩波少年文庫,瀬田貞二訳 ] +ワニ* +*crocodile + トカゲに似た大きな動物,爬虫類(学名: Loricata もしく Crocodylia) + ワニは大きく,危険な熱帯や亜熱帯に住む肉食動物である.主に水 + のなかで生活する. +クロイソス +croesus +kroisos +creosote + クロイソス,リディアの最後の金持ちの王.デルファイのオラクル(参 + 照せよ)が「もしそなたがペルシャを攻撃するならば,強力な帝国を滅 + ぼすであろう」と述べたあと549年にキュロスを攻撃した時、彼の帝国 + は滅んだ.ヘロドトスはアテネのソロンとの伝説的な対話について述 + べている.そこでソロンは富が幸せを導くわけではないことと,死ぬ + まではその人が幸運であったと考えることは出来ないと述べてクロイ + ソスに印象付けた. +クロム +crom + 用心してコナンは,辺りを見回した.彼の全ての感覚は危険を + 感じとっていた.彼はすこし離れた場所で,懐かしいデュアリ族の + 集落を見つけた.突然,彼は首の毛を逆立たせた.邪悪な魔法のオ + ーラを感じとったのだ.その瞬間,彼は武器を構えつぶやいた. + 「クロムよ,彼の者の血を捧げよう」 + [ Conan the Avenger by Robert E. Howard, Bjorn Nyberg, and + L. Sprague de Camp ] +*クロスボゥ* +crossbow* + 「老水夫よ,君をそんなに苦しめる + 悪霊を神が追い払いますよう−− + その顔つきはどうしたのだ」−−石弓で + わしはその鳥を撃ち落としたのじゃ. + [ The Rime of the Ancient Mariner, by Samuel Taylor + Coleridge ] + [ 老水夫の歌,S.T.コールリッジ ] + [ 叙情歌謡集,ワーズワス,コールリッジ + 宮下忠二訳,大修舘書店 ] +水晶玉 +crystal ball + これを覗きこむと_かすみが雲のように渦を巻く_のが見える.こ + のかすみはすぐに引き,無音のビデオのような映像が,これから + すぐにあなたに降りかかる事を教える.それが良い知らせである + ことはめったにない. + [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] + [ ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, + 原島文世・岸野あき恵訳, 東洋書林 ] +# ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, +# ダイアナ・ウィン・ジョーンズ, 原島文世・岸野あき恵訳, 東洋書林, 2004, +# p.134, 水晶玉 +呪い* +呪われた* +curse* + 非常に長くつづく邪悪な願いで,ファンタジーランドではしばし + ば感覚的なものである.呪いは破壊するか解かなければならない. + その方法は呪いの種類や起源によって変わる. + [...] + 4. 指輪や剣にかけられた呪い.これは困りものである.指輪は + 造られた場所に戻さねばならず,できれば摂氏1000度の熱で滅ぼ + さねばならないが,呪いはあなたがそれを行いたくない気持ちに + 仕向ける.剣の場合,たいていは呪いを解くすべての試みを跳ね + 返す.最良の方法は剣をどこかに隠してしまうか,嫌いな人にあ + げてしまうことだ. + [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] + [ ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, + 原島文世・岸野あき恵訳, 東洋書林 ] +# ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, +# ダイアナ・ウィン・ジョーンズ, 原島文世・岸野あき恵訳, 東洋書林, 2004, +# pp.200-201, 呪い +## a thousand degrees Fahrenheitの訳が摂氏1000度になっているが, +## 華氏1000度の誤訳? (華氏1000度≒摂氏538度) +クーン・アンヌーン +cwn*n + 雪のように白く,赤い耳をもった幽霊のような犬の群.時として + 子さらいに加わる.また現世に時おり姿をあらわすあの世の住人 + を襲う(「幽霊の狩猟」).ウェールズでは,この動物は渡りの雁 + の声に関係づけられており,また呪われた者の魂を地獄へと導く + といわれている.たいていは真冬に,この幽霊がうなりをあげる + 風を随伴してついてくるのが見聞きされる. + [ Encyclopedia Mythica, ed. M.F. Lindemans ] +サイクロプス +cyclops + それがすむとめいめいの母羊に + 嬰子の羊を宛てがってやり,こう大急ぎで仕事をせっせとやり終ると, + 何ということ,またもや二人をとっ掴まえ,夕食の仕度に宛てたのでした. + そのおりを待ち,私はキュクロープスの間近に立ち寄り,話しかけたので, + 蔦の木の椀を手に持ち,黒々としたぶどう酒をそれに満たして. + 「キュクロープスさん,さあお酒を飲みなさい,人間の肉をあがったならば, + これこの通りの,何という甘い飲料を,私の船が蔵してきたか, + 悟って下さるようにも.またお供えのお神酒まで持って来ました,もしや私を + 不憫に思い,故国へ送ってくださるまいかと.でもその狂気の沙汰は + とうてい辛抱できません.非道い方です,どうして今後他人が訪ねて + まいりましょう,そんなに多数人がいても,こう道に外れなさりかたでは.」 + こう言いますと,巨人は受けとり飲み干しましたが,飲んだお酒の + 甘さがとても気に入ったので,もう一杯重ねてくれと請求しました. + 「もっとくれよ,気前よくな.それからわしにお前の名前を教えろ, + ..... + こうして三度も酌んで渡すと,三度も愚かな無分別から飲み乾しました. + ところですっかりキュクロープスの体じゅう,脳まで酒が廻ったおき, + そのときついに私は,彼に対って猫撫で声で,大声でこう言いました, + 「キュクロープスさん,私の世間に知られた名前をお訊きで.そんなら私も + 申しあげましょうから,あなたの方でも約束どおり土産をください. + 駄礼毛志内と私はいうので,駄礼毛志内と母親も父親にしても, + そのほかの仲間の人たち皆が,私のことを呼んでおります.」 + こう言うと,大男は早速にも,情容赦もない心で,私に返答するよう, + 「駄礼毛志内をわしは最後に喰ってやろうよ,仲間たちのうちでもな, + ほかの奴らを先にしてやる,これがお前にやる土産だぞ.」 + こう言うと,そのままあお向けに引っくり返って倒れまして,それから + がっしりとした猪頚を斜めに曲げて横になり,あらゆるものを + 屈服させる睡眠の虜になって,咽喉もとから,ぶどう酒やら + 人間の肉の切れ片やらが噴き出て来たのは,深酒のため吐いたのでした. + [ The Odyssey, (chapter Epsilon), by Homer ] + [ 岩波文庫,呉茂一訳 ] +~スティング +*短剣 +~sting +*dagger + 短剣ではないか,そこに見えるのは, + 手にとれと言わんばかりに?よし,掴んでやる, + 掴めない,目には見えるのだが. + 忌まわしい幻め, + 見えても,手には触れぬのか? + 熱に犯された頭が造り上げた幻覚にすぎぬというのか? + いや,まだ見える,それ,抜くぞ, + 同じではないか,まざまざと,手にとるように. + [ Macbeth, by William Shakespeare ] + [ マクベス,福田恆存訳,新潮文庫] +暗き者 +dark one + しかしかれは使えるところでは,むしろ暴力と恐怖によって統治した. + かれの影が世界中に広がってゆくのを認めた者は,かれを冥王と呼び, + 大敵と名づけた.そしてかれは地上に或いは地下に残っているモルゴス + 時代の邪悪な者たちをすべて傘下に集め,オーク共はかれの指図に従い, + その数は蝿の如く殖えた.かくて黒の時代は始まった. + [ The Silmarillion, by J.R.R. Tolkien ] + [ シルマリルの物語,評論社,瀬田貞二訳 ] +デモゴルゴン +demogorgon + デモゴルゴンは悪魔の皇子で,汚物にまみれ,犠牲者を速やかに死 + に至らせる毒を撒き散らす.強力な魔術師でもあり,人間の生命を, + 尻尾で触れることにより吸いとることができる. +悪魔 +demon + 妖魔がどんな姿をしているかということを知ることは難しく,大 + きくて,大きな牙とにらみつけるような目,たくさんの手足と奇 + 妙な色をしているというだいたいの印象しかわかっていない.し + かし共通する見解では,妖魔はすさまじい力を持ち,強力な魔法 + を使い(人間にはできないやり方で),鍵穴を通り抜け,剣で切ら + れることもない物質でできている.そのため妖魔はとても扱いづ + らい.もしそれがめったにない友好的な妖魔であったとしても. + [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] + [ ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, + 原島文世・岸野あき恵訳, 東洋書林 ] +# ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, +# ダイアナ・ウィン・ジョーンズ, 原島文世・岸野あき恵訳, 東洋書林, 2004, +# pp.266-267, 妖魔 +野犬 +dingo + 狼に似た野犬.Canis dingo.オーストラリアに住む.赤あるい + は黄色がかった色の毛皮をもち,アボリジニたちによってもたら + されたと信じられている. + [Webster's Encyclopedic Unabridged Dictionary of the English Language] +吸魔の怪物 +disenchanter + あなたの魔法がそれに何を出来るかを尋ねてはならない. + それがあなたの魔法に何が出来るかを尋ねなさい. +ディスペータ +dispater + デスペーターは冥府を統べる大悪魔で,強力な魔術師である. +*ジン +djinn* + ジンは風の精霊界から来る精霊である.彼らは精霊界において独自の + 社会を形成している.地上界で彼らと偶然出会うこともあるし,強力 + な魔法使いが使役するために彼らを召喚することさえある.こうした + 魔法使いたちはよく,後ほど奉仕させるために彼らを瓶やランプに押 + し込めておく.時として好運な冒険者がこうした道具を見つけること + があり,解放されたジンの中には,感謝のしるしに冒険者の願いを一 + つかなえてくれる者もいることが知られている. +~ハチ公 +~スラッシャー +~シリウス +*犬 +~hachi +~idefix +~slasher +~sirius +*dog +pup* + ペット,飼い犬(学名: Canis familiaris),多数の種が存在.オスは + dogと呼ばれメスは bitchと呼ばれる.人間への忠誠や子供への優し + さが知られており,世界で最もポピュラーなペットである.いろいろ + な技を簡単に教えることもできる. +~落し扉 +*扉 +~trap*door +*door +doorway + 憂いの国に生かんとするものはわれを潜れ. + 永劫の苛責に遭わんとするものはわれをくぐれ. + 破滅の人に伍せんとするものはわれをくぐれ. + 正義は高き主を動かし, + 神威は,最上智は, + 原初(はじめ)の愛は,われを作る. + わが前に創られし物なし, + ただ無窮あり,われは無窮に続くものなり, + われを過ぎんとするものは一切の望を捨てよ + [ The Inferno, from The Divine Comedy of Dante + Alighieri, translated by H.F. Cary ] + [ 神曲: 地獄篇,河出世界文学全集,平川祐弘訳 ] +ドッペルゲンガー +doppelganger + 「それなら,ここが南極であることに感謝するしかないな.基地にいる +  動物をのぞけば,模倣する生きものが,ただの一匹もいないことに」 + 「われわれがいる」ブレアーが含み笑いをもらした. + 「われわれを模倣できる.犬じゃ海まで四百マイルも歩けない.食料が +  ないからな.この季節には,模倣するべき盗賊カモメもいない.これ +  ほど内陸じゃ,ペンギンもいない.この地点から海へたどり着けるも +  のはいない――われわれを別にすればだ.われわれには知恵がある. +  たどり着けるんだ.わかるだろう――そいつは,われわれを模倣する +  しかない――われわれのひとりになりすますしかない――飛行機を飛 +  ばす方法は,それしかないんだ――飛行機を二時間飛ばせばーー地球 +  の住民をことごとく支配――いや――なり変わることができるんだ. +  世界を乗っ取れるんだ――われわれになりすましさえすれば!」 + [ Who Goes There?, by John W. Campbell ] + [ 影が行く, 中村融訳 ] +# ホラーSF傑作選 影が行く, P.K.ディック, D.R.クーンツ他, 中村融編訳, p.179 + + ザンダー: 行かせてくれ! あの悪魔の蝿野郎を殺してやる! + ザンダーその2 (銃をつかみながら): アンヤ,どいてくれ. + バフィー: ザンダー! + ザンダーその2: そのとおり,バフィ.俺が,彼をつくった. + ザンダー: ちがうぞ,バフィ.俺が本物だ.助けてくれ! + アンヤ: 私の銃を,彼は私の銃を持っている. + ライリー: あんたが銃をもってるのか? + バフィ: ザンダー,銃をもってるザンダー,それをちょうだい. + アンヤ: バフィ,どちらが本物? + ザンダー:俺だ. + ザンダーその2: ちがう,俺だ. + [ Buffy the Vampire Slayer, Episode 5.03, "The Replacement" ] +~クロマティック* +イクソス +*ドラゴン +*dragon +*xoth + 西洋では,ドラゴンは人間の敵である.荒れた寂しい場所に住むこ + とを好むのだが,人間に見られると必ず,破壊や病気の後を遺して + いく.この獣を殺そうと言うありとあらゆる挑戦は危険な仕事であ + る.ドラゴンを攻撃するものには,硫黄の臭気のガスだけでなく, + 最も危険な蛇のように激しく動く尻尾とも格闘せねばならない. + [ Mythical Beasts by Deirdre Headon (The Leprechaun Library) ] + + 「竜と話し合いができる人間,それが竜王さ.」男は言った.「いや, + それが第一条件かな.竜を制するのは,みんなの考えるようなトリック + でもなんでもないんだ.竜はおよそ主人というものを持たない動物なの + でね.竜を相手にしたら,問うべきことはいつも同じ,交渉ができるか, + それとも食べられるか,だ.もしも,交渉ができる,食べられることは + ない,という確信がもてるようになれば,それでもう立派な竜王さ.」 + [ The Tombs of Atuan, by Ursula K. Le Guin ] + [ こわれた腕輪, 清水真砂子訳, 岩波書店 ] +*太鼓 +*drum* + 多くの探検家や旅行者が類人猿の太鼓を発見しているし,そのふしぎ + な太鼓をたたく音や,ジャングルの支配者たちの奇怪なお祭り騒ぎの + 音も聞いてもいるが,実際にその狂気の祭りに加わったことのある人 + 間は,グレイストーク=ターザンだけであったにちがいない. + [ Tarzan of the Apes, by Edgar Rice Burroughs ] + [ 類猿人ターザン, 高橋豊訳, ハヤカワ文庫SF ] +~*ゾンビ +~*ミイラ +ドワーフ* +~dwarf ??m* +dwarf* +dwar* cave*man + ドワーフは人間と同じような顔(しわがあり,がさがさした皮膚 + で,醜い)をしているが,一般的には偏平足か,後指が前向きか, + あるいは足が後ろ向きかのどれかである.彼らは大地に由来し, + たくましく,洞窟の最奥に住んでおり,クロークだけを着てさら + に奥を目指している.そのクロークのおかげで,彼らは姿を見え + なくすることができ,また他のものには蛙のように見せかけるの + である.鉱山人夫はしばしばドワーフたちに遭遇し,時としてそ + れなりに親密な関係を築く.…コーンウォールの鉱山人夫たちは, + ブッカがいそがしく採掘していく音を聞くといつも喜ぶ.という + のも,ドワーフたちはみな貴重な金属に対し信頼できる鼻をもっ + ているからである. + + その他に,ドワーフは鍛冶屋や宝石細工人としての技術を正当に + も評価されている.ドワーフたちはオーディンに有名な槍「グン + グニール」を作ってやったし,トールにはハンマーを作ってやっ + た.さらにフレイヤのために素晴しいネックレスをデザインし, + フレイのために金毛の猪を与えたのである.暇なときには,ドワー + フたちは優れたパン職人ともなる.皮肉なことに,ドワーフたち + は奇妙な足をもっているにもかかわらず,ダンスをとくに好む. + ドワーフは未来をみることもでき,それゆえ優れた気象学者でも + ある.ドワーフたちは自分の好きな人たちへの贈り物を惜しまな + いが,ドワーフの贈り物というのは手元の金に変わってしまいが + ちである.しかし,結局のところ,ドワーフというのはぶっきら + ぼうな連中である. + [ The Immortals, by Derek and Julia Parker ] +エアレンディル +エルウィング +earendil +elwing + 後世,モルゴスが勝利を占め,エルフと人間が,かれの願望通り,離聞 + されるに至った時,中つ国になおも住み続けるエルフ族は,次第に衰え, + 力を失い,人間が陽光を恣に亨受した.やがてクウェンディは,広大な + 国々,島々の人気ない場所をさまよい,月光と星明かりに,そして森と + 洞窟に親しみ,記憶の中に存在する影の如きものになり果てた.ただ, + 時折,西方に船出して中つ国から姿を消す者がいた.しかし,黎明期に + あっては,エルフと人間は盟友であり,互いに同類と見なしていた.そ + して人間の中にはエルダアルの智恵を学び,ノルドオルの大将たちに立 + ちまじる,勇猛にしてすぐれた者もいた.エルフの栄光と美しさ,かれ + らの宿命を完全に共有したのは,エルフと人間の血を亨けたエアレンデ + ィルであり,エルウィングであり,かれらの子供であるエルロンドであ + る. + [ The Silmarillion, by J.R.R. Tolkien ] + [ シルマリルの物語,評論社,瀬田貞二訳 ] +ウナギ +巨大ウナギ +eel +giant eel + きれいな水に住むウナギの振舞いはその周辺の神秘性を増す.それら + は自由に濁った泥々の湖底を移動し,夏の日中は埋まって生活する. + .... + ウナギは大食漢の食肉動物で,主に夜に補食し,多くの種類の魚や + 無脊椎動物をたいらげる.初期の考えとは反対に,ウナギは死んだ生 + 物よりむしろ生きたものを探しており,腐肉の常食者ではない. + [ Freshwater Fishes of Canada, by Scott and Crossman ] +*卵 +egg + しかし私は,どうしてそれをそのままにして,雛が孵るまで雌鳥 + にあたためさせないのか,そうすれば中から何が出てくるかわか + るのに,とたずねた.「いいものなんかありっこないよ」とお母 + さんが言った.「なにかおっかないものかもしれない.でも覚え + ておきなさい,そいつがワニかドラゴンみたいなものだったら, + 一分たりとも家のなかにおいときはしないから」 + [ The Enormous Egg, by Oliver Butterworth ] +elbereth + 敷居をまたぐ時にも,澄んだ歌声が一つ高らかに聞こえてきました. + + アー エルベレス ギルソニエル, + シリブレン ペンナ ミリエル + オー メネル アグラール エレナス! + ナ=カエレド パラン=ディリエル + オー ガラズレミン エノラス, + ファヌイロス,レ リナソン + ネフ アイアー,シー ネフ アイアロン! + + フロドは一瞬立ち止まって,振り向きました.エルロンドは椅子に腰 + を下していて,その顔にはまるで夏の光が樹々を照らすように,暖炉 + の火が照り映えていました.彼のそばにはアルウェン姫がすわってい + ました. + ..... + かれはなおも魅せられたように立っていました.その間,エルフの歌 + の美しい音節の一つ一つが,言葉と旋律のまざった透明な宝玉のよう + に,耳に聞こえてきました.「エルベレスに捧げる歌だよ.」とビル + ボがいいました.「今夜はみんな,あの歌や,ほかにも浄福の国の讃 + 歌を何度も何度も歌うことだろう.さぁ,行こう!」 + [ The Fellowship of the Ring, by J.R.R. Tolkien ] + [ 評論社, 瀬田貞二訳 ] +電気ウナギ +electric eel + 南アメリカの淡水魚(学名 Gymnotus electricus).蛇のような形を + しており,2メートルにも成長する.このウナギは馬くらいのサイズ + の生き物をも痺れさせる電気体として知られている. + [ Van Dale's Groot Woordenboek der Nederlandse Taal ] +*の精 +*elemental + エレメンタルとは全宇宙の基本現象の現れである.風,火,水,地 + の4つのエレメンタルが知られている.何人かの神秘主義者は5番目 + のタイプ,すなわち霊であるが,の必要性を主張しているが,少な + くとも存在するこの地では誰も遭遇したことがない. +~*ゾンビ +~*ミイラ +エルフ* +~elf ??m* +*elf* +elvenking + エルフたちは焚火をかこんで,草の上や,丸太の切株を腰掛にして, + すわっていました.杯を運ぶ者あり,飲みものをそそいで回る者が + ありました.また山のように積み上げた皿小鉢の上に食べ物をのせ + てくる者もいました. + 「御馳走はありませんよ.」と,かれらはホビットたちにいいまし + た.「ここはわたしたちの館を遠く離れた緑の森の宿りだから.わ + が館にお招きしたら,もっとましなおもてなしをするけれど.」 + 「わたしには,りっぱな誕生日のご馳走ほどに思えますよ.」とフ + ロドがいいました. + ピピンはあとになってこの時のことを思い出そうとしても,食べも + ののことも飲みもののこともほとんど思い浮かびませんでした.か + れは,エルフたちの顔に映える光と,うつつの夢とまごうほど,変 + 化に富む美しい声の響きに,すっかり心を奪われてしまったせいで + した. + ..... + サムはその夜感じたこと,思ったことを言葉に写すことも,心には + っきり思い描くこともついにできませんでした.しかしその夜のこ + とは,かれの生涯を通じてのおもなでき事の一つとして,いつまで + もかれの記憶にとどめられました.辛うじてかれにいえたのは,次 + のような言葉でした.「ほんとに,旦那,おらにこんなりんごが育 + てられたら,おらも自分を庭師と呼びますだ.だけど,おらの心に + 響いたのはあの歌声ですた,ほんとのこと」 + [ The Fellowship of the Ring, by J.R.R. Tolkien ] + [ 評論社, 瀬田貞二訳 ] +エルフのクローク +elven cloak + エルフたちは次に,持ってきた衣類を広げ,一行の一人一人にわたしま + した.かれらがめいめいに準備してくれたものは,それぞれの背丈に合 + わせて作ったマントと頭巾でした.そしてこれはみんなガラズリムたち + が織った軽くて暖かい絹のような布でできていました.色はちょっと何 + 色ともいえません.木の下では黄昏の色を帯びた灰色のように見えます. + しかし,それを着て動いたり,あるいは別の光にあてて見ると,翳を帯 + びた葉っぱのような緑色に見えたり,夜の故畑のような褐色に見えたり, + 星明りの下の水のような暗い銀色に見えたりします. + [ 評論社, 瀬田貞二訳 ] + [ The Fellowship of the Ring, by J.R.R. Tolkien ] +エメラルド +emerald + 「その燦爛たる黄金の仮面, + エメラルドの眼の仮面をおはずし.」 + 「ごめんです,貴方は,心が,激しくて, + 賢こくって,しかも冷めたくは無いってことが, + あるかどうか,あつかましくも露(あば)こうとなさる」 + + 「恋か欺瞞か,何がひそんでいるか, + この目で見たがっているだけのこと」 + 「貴方のお意(こころ)をつかみ,つづいて, + 貴方の心臓を鳴らせたのは, + 仮面ですよ,仮面の後にあるものじゃない.」 + + 「だが,貴女が私の敵であっては困るんで, + せんぎ立てをせねばならない.」 + 「いや,あなた,それなりでよいのです, + あなたにも私にも情熱がもえていさえすれば, + いいじゃありませんか.」 + [ The Mask, by W.B. Yeats ] + [ 仮面,W.B.イェイツ ] + [ イェイツ−−人と作品 屋島庄太郎著,研究社 ] +イリニス +erinys +erinyes + ギリシャ神話のフュリズにちなんで命名された女性の姿をしたこの悪魔は + 不注意な犠牲者につかみかかったり,毒をくらわす. +エティン +ettin + 双頭の巨人.エティンは危険でなにをしでかすかわからないハンター + である.エティンは夜中大またで歩き,掴めるものなら何でも食う. +エクスカリバー +excalibur + 最初は,その先端しか見えなかったが,次第にそれはまっすぐ, + ほこりだかくそびえ立った.それは高潔で偉大ですばらしいもの + すべてだった.剣の先端は,月を,まるでまっぷたつに切り裂こ + うかというように差し示していた.剣そのものが,闇夜のかがり + 火のようにきらめいていた.剣が光を反射できるような光源はな + かった.というのも月はおそれて雲のうしろに逃げこんだからだ. + 剣はそれ自身の強さと力と知識の激しさから輝いていた.その激 + しさは正義が具現化したものであり,数えきれない年月のまどろ + みののち,その時がふたたびきたのである.剣が表面をやぶった + のち,つかが見えた.そして剣をつかんだのは,ひとつの力強い, + しかし女の手であり,その指には海の青緑色に輝くはだかの宝石 + をもつ指輪がいくつかはめられていた. + [ Knight Life, by Peter David ] +高価なカメラ +expensive camera + リンスウィンドがアイコノスコープをたいへん好んだ時があった. + 彼はあらゆる経験に反し,世界は基本的に理解できるものであり, + もし正しく精神の道具箱を身につければ,彼は背景をとりさるこ + とができ,それがどのように作用するかをみることができる,と + 信じていた.もちろん,彼は決定的に間違っていた.アイコノス + コープは,(彼が推量したように)光を特別な処理をされた紙の上 + に当てることで撮影するのではなく,優れた色彩の識別力と,絵 + ブラシをもった素早い手をもつ小さな悪魔をとじこめるという, + はるかに単純な手段によっているのだった.そのことを発見して, + 彼はたいへん狼狽した. + [ The Light Fantastic, by Terry Pratchett ] +エチオピアの目 +eye of the aethiopica + 強力な遠視の魔除け.その通常の力の他に,それを持っているものなら + 誰でも魔法をより頻繁に唱えれるようエネルギーが回復する.また,そ + れを持つものの魔法のダメージを半分に減らし,魔法の矢から守る力が + ある.その力を使うと迷宮の他のエリアへの魔法の入口を開き,力を使 + うものはエリア間を高速に移動することができる. +超世界の目 +eyes of the overworld + ...そして「超世界の目」である.このよくわからない聖器は, + 装着した者の視覚を「超世界」(天上界の別名)のものへと高める. + ふつう,そこには見るべきものはない.しかしながら,「目」の + 装着者は,自分自身の周囲を,あたかも地図で見るかのように見 + ることができるようにもなるのである.なぜ誰もがそうしたがる + かというに... +*人形 +figurine* + スペインを追われたカルロス主義者たちがあふれていたパリに,鳥 + はやがて姿を見せました.その連中の一人が,何物とはわかりませ + んが,鳥を持ちだしたのでしょう.しかしその人物は,鳥の真価を + 露ほども知らなかったのだと思います.スペインの王位継承をめぐ + る内戦中,この鳥はちょっと珍しい彫像程度にしか見えないように, + 明らかに奪われぬ用心のためペンキかエナメルを塗られていたので + す.そして偽装のまま,見せかけの姿に隠された真価に気づくよす + がもない愚かな所有者や古物商の手から手に,七十年余にわたって + パリ近辺を転々としたわけです. + [ マルタの鷹,小鷹信光訳,ハヤカワ文庫 ] + [ The Maltese Falcon, by Dashiell Hammett ] +さまよう目 +floating eye + さまよう目は,驚くべきことでもないが,巨大で宙に浮いた眼球で, + ダンジョンの中をあちこちさまよっている.それ自体が単独で危険と + いうわけではないものの,闘いの最中にその巨大な目を見つめた者を + 麻痺させるという能力は大いに恐れられている.さまよう目に対して + 殴りかかり,その魔力によって麻痺し,辺りをうろついていた他の生 + 物によって体力を削られて死に至った者達の話はよく聞かれる. +肉のゴーレム +flesh golem + 苦しいほどの熱意に駆られ,わたしは足もとに横たわる命のない物体 + に生命の火花を吹きこむべく,生命の器械をまわりに集めました.す + でに午前一時.雨がぱらぱらと陰気に窓を打ち,蝋燭は今にも燃えつ + きようとする,そのとき,なかば消えかけた微かな光に,わたしは生 + き物のどんより黄色い目がひらくのを見たのです.それは重く息をつ + き,痙攣が手足を走りました. + + この大詰めのわたしの感情を語ることなどできるでしょうか.どう描 + いたらいいのでしょう,計り知れる苦心と用心をかさねて創りだそう + としてきた,このあさましい生き物を?四肢は均整がとれ,容貌も美 + しく選んであった.美しく!--これが美しいと!黄色い皮膚は下の筋 + 肉や動脈の作用をほとんど隠さず,髪は黒くつややかにすらりと伸び, + 歯の白さは真珠のよう.だがそんな贅沢は,いっそうおぞましくきわ + だたせるばかりでした.はめこまれた薄茶の眼窩とほとんど同じ色に + 見えるうるんだ目,やつれたような顔の色,一文字の黒い唇を. + [ Frankenstein, by Mary Wollstonecraft Shelley ] + [ フランケンシュタイン,創元推理文庫,森下弓子訳 ] +*フルート +*flute + さあこれであなたは何でもできます. + 人の心も変えられます. + 悲しむ人にも笑顔がもどり, + 女ぎらいも恋に心を開きます. + [ The Magic Flute, by Wolfgang Amadeus Mozart ] + [ 魔笛, 荒井秀直訳, 音楽之友社 ] +霧の雲 +fog cloud + 霧がくる + 小さな猫の足つきで + + 静かに腰をおろして + 港と街を + 眺めわたしている + それから動いていく. + [ Fog, by Carl Sandburg ] + [ 霧, 安藤一郎・新倉俊一訳 ] +泉 +fountain + 憩え! この小さな泉は流れる + かく永遠に--決してとどまらない + 夏の太陽の照りにも + 冬の日の寒さにも + 近くをさすらう誰でも + シリアの熱がもっともひどいときは + 彼をこちらへ来させよ, + 喉のかつえが満たされないといけないから + 彼は気づくだろう,この小川が + 静かにいつも明るく流れていると + 彼に飲ませよ,そして道を先へと急がしめよ + 心のなかでのみ考えながら + 私Erotasは命じる + 水の精ナイアスが落ちることを + そして偉大な牧神パンに感謝を! + [ For a Fountain, by Bryan Waller Procter ] +狐 +きつね +fox + ある暑い夏の日,一匹の狐が果樹園を散歩しており,やがて高い + 枝の上に剪定されたつるに実った葡萄の房を見つけた.「喉のか + わきをいやすのにぴったりだ」と狐は言った.狐は2,3歩下がり, + 枝に飛びつこうとしたが,失敗した.同じようにもう一度,二度, + 三度,狐は飛びあがったが,さしてうまくいかなかった.魅力的 + な一口に誘われて何度も挑戦したが,ついにはあきらめねばなら + なかった.狐はいばりくさって歩き去りながら言った.「あれは + 酸っぱいにちがいない」 + [ イソップの寓話 ] +*キノコ +キノコ +菌類 +*fung* + 菌類.クロロフィル,真茎,根,葉の欠けた単純植物に属する.藻類 + と違って菌類は光合成ができず,植物や動物死骸に寄生して生きている. + 真菌類は変形菌と真菌からなる.真菌は多細胞(イースト菌を除く)生物 + で,ほとんどの真菌類の体は細い綿のような単繊維や菌糸からなる.全 + ての菌類は細胞分裂,発芽,分裂,胞子による無性生殖が可能である. + 有性生殖をする物は有性世代(配偶体)と胞子体世代が交互にある.真菌 + 類の4つの綱は鞭毛菌類(例えば黒パンカビや,べと病菌),子嚢菌類(例えば, + イースト菌,白カビ,トリュフ,ペニシリンのような青緑カビ),担子菌 + 類(例えば,マッシュルーム,ホコリタケ),不完全菌類(例えば,みずむ + しの原因となる種や白癬菌)である.菌類は有機体を分解する手助けをし + (土壌の再生に重要),抗生物質,ビタミン,様々な化学薬品の原料として + あるいはその発酵作用(例えば,パンやアルコール飲料生成)に重要なもの + である. + [ The Concise Columbia Encyclopedia ] +*ガーゴイル +*gargoyle + かくして人類が地上を支配するようになり,ガーゴイルどもは光 + から逃れ,潜伏して待っていた.人間の時間にして600年ごとに + 生まれかわり,ガーゴイルどもは地上の支配権を得るために人類 + との戦いに加わった. + + 戦いのたびにガーゴイルどもは,ますます増えて繁栄していく人 + 類によって,ほぼ全滅させられてきた.今や,古いガーゴイルの + 像や絵画が単なる人間の想像の産物だと思われるようになって, + 何百年もがすぎた.この年月,人類の考えは自分たちがまわりに + もたらした多くの邪悪なものに向かっていたので,人類はその最 + も古い敵対者であるガーゴイルどもを忘れてしまった. + [ Excerpt from the opening narration to the movie + _Gargoyles_, written by Stephen and Elinor Karpf ] +大蒜 +にんにく +*garlic + 11月1日――終日,快速力で旅を続けている.馬も親切に扱われて + るのを知ってか,喜んで精いっぱいの速力で走っている.馬の取り換 + えは,今までに何度かしたが,まだ同じことがつづきそうだ.早くそ + んなわずらわしさのない,気楽な旅になりたいと思う心しきりなり. + 教授はあいかわらずテキパキしている.百姓たちには,ビストリッツ + へ急ぐ者だといって,お金をたんまり払って馬を換えさせる.私たち + は熱いスープ,コーヒー,お茶などをふるまってもらい,それからま + た出発する.風光の美しい地方で,住民はりりしく,強壮で,しかも + 正直で,性質がいい.彼らは非常に迷信深い.私たちが馬車をとめた + 最初の家では,とりなしに出てきた女の人が,私の額の痣を見ると, + いきなり十字を切って,魔除けの二本指をつき出した.きっと私たち + に御馳走してくれた料理の中には,ニンニクをわざわざよけいに入れ + たにちがいない.私はまた,ニンニクはとても我慢がならないときて + いる.このことがあってから,なるべく注意して,私は帽子やヴェー + ルをとらないことにした.そうしていれば,土地の人の迷信からはの + がれられていた. + [ Dracula, by Bram Stoker ] + [ 吸血鬼ドラキュラ, 平井呈一訳, 創元推理文庫 ] +ゲーリュオーン +geryon + ゲーリュオーンはときに野獣と呼ばれる大悪魔であり,爪と毒針で + 攻撃してくる.地獄での階級は極めて低いと云われている. +幽霊 +*ghost + 去った亡者の白霊たちが,幽冥界から浮かび上がって群がり寄るのは, + 若い少女やまだ独身の青年たち,またずいぶん苦労した(らしい)老人など, + あるはまたやさしい乙女の,生々しい痛みを胸に抱くものなど, + また大勢は,青銅をはめた槍をもて突き殺されて亡ったもの, + あるは戦さに命を落とし,なお血まみれな武具を着けた武士など, + おびただしく穴のまわりへ,四方八方からてんでんに群らがり寄って, + おっそろしい叫喚のこえをあげるのに,色蒼ざめる恐怖が私を捉えました. + [ The Odyssey, (chapter Lambda), by Homer ] + [ 岩波文庫,呉茂一訳 ] +グール +ghoul + 諸々のやみの力は互いに知り合い,互いに不思議な均衡を保っている. + 牙も爪も,つかみ得べからざるものを恐れる.血をすする獣性,餌物を + さがす飢えたる貪欲,爪と顎とをそなえ腹のみがその源であり目的であ + る本能,それらのものは,平然たる幻の姿をおずおずとながめまたかぎ + まわす.その姿は経帷子に包まれて彷徨し,おぼろなるうち震う上衣に + くるまって直立し,死の世界の恐ろしい生命に生きてるがようである. + ただ物質にすぎない獰猛性などは,凝って一つの不可解なる者となって + 広大なる暗黒を相手にするのを,漠然と恐れている.道をふさぐ黒い形 + は,一挙に野獣の歩みをさえぎり止める.墳墓から出でたる者が,洞窟 + から出でたる者を脅かし狼狽させる.獰猛なるものは凄惨なるものを恐 + れる.狼は幽鬼に出会ってあとに退く. + [ Les Miserables, by Victor Hugo ] + [ レ・ミゼラブル, 豊島与志雄訳, 岩波文庫 ] +*巨人 +*giant +giant humanoid + 巨人はいつも大地を歩いていたが,最近では彼らは非常に希な存在 + となっている.彼らのサイズと言ったら,9フィートたらずのから + 空にもそびえる20フィート以上のものまでいる.大きなものは巨大 + な岩を武器として使い,遠くからでもそれを投げつける.全ての種 + 類の巨人は人間(焼いたり,煮たり,揚げたりしたもの)が大好き + という点で共通している.彼らのテーブルマナーは伝説的だ. +# note: "gnomish wizard" is a monster; cave*man entry doesn't fit nonhumans +~*ゾンビ +~*ミイラ +ノーム* +~gnome ??m* +gnome* +gnomish wizard +gnom* cave*man + ... そのあとから,小鬼(インプ)の三倍もほどもある土鬼(ノーム) + が,荷物をかついで駆けてきた.独特の服,それにとりわけ独特の + 帽子をかぶったやつだ.この土鬼は小鬼ほど足が早くないが,怯え + ていることに変りはなかった.こうした魔法の民をおびやかすよう + な一大事が,森のなかでもちあがったのだ.ラモン・アランソは, + 土鬼が人間の言葉をしゃべる上に,人間に声をかけられればかなら + ず答える習性をもっていたことを思いだし,帽子をふり上げて土鬼 + の名前を尋ねた.土鬼はあわただしい駆けっこを一瞬もやめないで, + 自分の名を「アラバマ」と教えてくれた.帽子のふちにも手をやっ + たけれど,脱ぐのは忘れた. + 「何が起きたんだ,アラバマ」とラモン・アランソが訊いた. + 「白い魔法だよ!逃げろ!」土鬼はそういって必死に走りつづけた. + [ The Charwoman's Shadow, by Lord Dunsany. ] + [ハヤカワ文庫 荒俣宏訳] + + 「マグルの庭にも飾り用の小人が置いてあるの,知ってるだろ」 +  ハリーは芝生を横切りながらロンに言った. + 「あぁ,マグルが庭小人だと思っているやつは見たことがある」 + ロンは腰を曲げて芍薬の茂みに首を突っ込みながら応えた.「太っ + たサンタクロースの小さいのが釣り竿を持っているような感じだっ + たな」 +  突然ドタバタと荒っぽい音がして,芍薬の茂みが震え,中から + ロンが立ち上がった.「これぞ」ロンが重々しく言った.「ほん + との庭小人なのだ」 + 「放せ! 放しやがれ!」小人はキーキー喚いた. +  なるほど,サンタクロースとは似ても似つかない.小さく,ゴ + ワゴワした感じで,ジャガイモそっくりの凸凹した大きな禿頭だ. + 堅い小さな足でロンを蹴飛ばそうと暴れるので,ロンは腕を伸ば + して小人をつかんでいた.それから足首をつかんで小人を逆さま + にぶら下げた. + [ Harry Potter and the Chamber of Secrets, by J. K. Rowling ] + [ ハリー・ポッターと秘密の部屋, 松岡佑子訳, 静山社 ] +ゴブリン +goblin + もともとゴブリンは,ざんこくで,腹黒くて,しんから悪いやつ + です.美しいものを作りだせないくせに,手さきはかなりきよう + です.いちばんじょうずなドワーフにはかないませんが,とにか + くドワーフなみにトンネルを掘り,鉱山を掘ります.もっとも, + ふだんはそんなに働かないで,だらしがなくて,よごれほうだい + です.つちに斧,剣に短刀,つるはしにやっとこ,そのほかの + 武器や,ひとをいためる道具などをゴブリンたちはけっこうじょう + ずに作りますし,ほかの者を使って思いどおりに作らせることも + あります.ほかの者というのはつかまえた者や奴隷たちで,空気 + と光がたりないで死んでしまうまで,働かされるのがきまりです. + [ The Hobbit, by J.R.R. Tolkien ] + [ホビットの冒険,岩波少年文庫,瀬田貞二訳] +神 +女神 +god +goddess + ひとりで仕事をすることもあれば,3人組,または9人やそれ以上 + の集団で仕事をすることもある(宗教を見よ).どの神々も,自分 + が世界を創造したと主張するが,実際,3人組か集団の神々がそう + 主張するのはもっともである.ファンタジーランドには複数の者 + によって造られた雰囲気があるからだ.けれども,彼らが世界を + 造ったと主張しているかどうかは別にして,すべての神々は,詳 + 細な短期計画を練っていて,それを実現しようと堅く心に決めて + いる.その結果,彼らは偶然や予言によって,または単に,選択 + の余地をなくすことで,人間に自分たちに必要な行動をとらせる. + もしある神がそうしようと決めたなら,あなたの人生はどんどん + 惨めになっていって,最後にはひとつしか選択の余地が残されて + いないことだろう. + [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] + [ ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, + 原島文世・岸野あき恵訳, 東洋書林 ] +# ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, +# ダイアナ・ウィン・ジョーンズ, 原島文世・岸野あき恵訳, 東洋書林, 2004, +# pp.51-52, 神々 +ゴールド +金 +金貨 +金塊 +gold +gold piece +zorkmid + 独特の黄色をした金属で,最も希少な金属,商業において共通の兌 + 換価値として用いられた.元素記号Au,元素番号79,原子量197.2. + あらゆる金属の中で,もっとも展性と延性に富み,また,かなり重 + い(比重19.3).熱,湿気,腐食に非常に強く,そのため貨弊や宝石 + 装飾に適する. + [ ウェブスター英語辞典2版 ] +金のゴーレム +gold golem + 鞴は火から離して置き,これまで使っていた道具はすべて集めて銀の櫃 + に納める.海綿で顔や手,逞しいくびと頸と毛むくじゃらの胸の汚れを + 拭き取ってから肌着をつけ,太い杖をとって足を引き摺りながら仕事場 + を出ると,生きた娘さながらに造られた黄金製の侍女たちが,主の身を + 支えながら足早に歩んでくる.侍女たちの胸中には心が宿り,言葉も話 + しまた力もあり,神々から教えられてさまざまな手業の心得もある. + [ The Iliad, by Homer ] + [ イリアス, 松平千秋訳, 岩波文庫 ] +~金のゴーレム +~肉のゴーレム +*ゴーレム +~gold golem +~flesh golem +*golem + 「ことの起こりは十七世紀にさかのぼると言われてる.カバラのいま + では散逸してしもうた規定書に従って,ある牧師が,下男にして教会 + 堂の鐘をつかせたり,いろんな雑用をさせるつもりで人造人間を---- + つまりゴーレムをだな----こしらえたと言うんだ. + + ところがまともな人間ができずに,そいつには鈍重な,半分痴呆の, + 植物みたいな生命しか宿らんかったんだな.しかもその生命も昼間だ + けのもんで,そいつの歯のうしろに貼った護符の力で宇宙の星の,あ + いてるエネルギーを借りてたんだそうだ. + + ある晩のこと,その牧師が夜の祈りのまえにゴーレムの口から護符を + はずすのを忘れたら,ゴーレムのやつ急に狂暴になって,裏町の暗闇 + を狂いまわり,出くわすものを片っぱしから叩きつぶした. + + しまいに牧師が体当りをして,やっと護符をはがしたんだそうだ. + + そしたらそいつはいのちをなくしてぶっ倒れてしまい,あとに残った + のは小人のかたちをした土くれだけだったそうだ.いまでもその土く + れはアルトノイ教会堂に展示されてるけど」 ... + [ The Golem, by Gustav Meyrink ] + [ ゴーレム, 今村孝訳, 河出書房新社 ] +墓 +grave + 「だれが掘りたいもんか」と老いさらばえた男 + 「チョークで印した六尺の穴なんぞ + 口は達者 足はなお達者なこのわしが + 埋葬される時期とな」と老いさらばえた男 + [ Three Songs to the Same Tune, by W.B. Yeats ] + [ イェイツ全詩集,鈴木弘訳,北星堂 ] +グレイスワンダー +grayswandir + なぜ私はグレイスワンダーを持っているのだろうか.他の武器な + ら,こうも強くLogrusの「影」に影響を与えただろうか.ならば, + 私をここへつれてきたのは本当に私の父だったのか.そして,父 + は,父の武器が供給できる特別な鋭さを私が必要とするだろうと + 感じたのか.私はそう考えたかった.彼が単なる「模様」の「影」 + 以上のものだと信じるために. + [ Knight of Shadows, by Roger Zelazny ] +脂* +*grease + ANOINT(動詞)【聖別する(聖式で頭に油をそそいで)】 + もうすっかりつるつるに[ずるく]なっている王や他の高官 + どもの頭を塗りたくる. + [ The Devil's Dictionary, by Ambrose Bierce ] + [悪魔の辞典,A.ビアス,奥田俊介,倉本護,猪狩博訳,角川文庫] +グレムリン +gremlin + グレムリンは高い知能をもつ,ひどく邪悪な生き物である.他の生 + き物を困らせるために生きていて,苦痛や,障害を与えようとする. + +  ふいに,戦争中の新聞記事を思い出した.連合軍のパイロットたちが + 出撃中に,空に棲むと思われている生き物に悩まされた,という話が載っ + ていたのだ.その生きものは,たしかグレムリンと呼ばれていたはず. + 実際に,そんな生きものがいるのだろうか.こんな高い上空で,ちゃん + と体積も体重もあるらしいのに重力の影響を受けず,ふわふわ風に乗っ + て飛んでいるなんて,考えられるか?そんなことを考えていると,あい + つがまた姿をあらわした. + [ Nightmare at 20,000 Feet, by Richard Matheson ] + [ 二万フィートの悪夢, ミステリーゾーン 4, 矢野浩三郎訳, + 文春文庫 ] +グリッドバグ +grid bug + これらの電気にもとづく生物は,我々の宇宙に自然にあるもので + はない.このものどもは,我々の世界とはまったく異なる運動の + 法則をもつ世界からあらわれた. + + トロンは,友人とヨーリのほうを向いて, + 「船首のビーム連結の具合を見てくる. + ヨーリ,フリンと二人で,ビームのネットワークに欠陥がないか, + 見はっていてくれ.」 + フリンは,ビーム連結が完全であることをいのった. + 太陽帆船がレールから飛びだすなどという悲劇にあいたくなかった. + [ Tron, novel by Brian Daley, story by Steven Lisberger ] +# トロン, ブリアン・デイリー, 久米穣 訳編, 講談社, 昭和57, p.163 +丸薬 +gunyoki + 侍が戦いの前に食べる究極の食事.普通,勝ち栗,コンブ,酒から + なる. +ハチ公 +hachi + ハチ公は教授である主人に仕え毎朝渋谷駅まで通っていた犬である. + 午後彼の主人が仕事から戻ってくるときには,ハチはいつも駅で + 待っていた.ある日彼の主人が仕事場で死にもう二度と戻ってこな + くなった.しかし10年もの毎日,ハチは午後になると駅へやって来て + 彼の主人の帰りを待っていた.ハチが死んだとき,彼を讃え,駅の + プラットホームに像が立てられた.今でも像に触ると幸せになれる + と言われている. +*ハープ +*harp + 弦を張った三角形の楽器で,魔法の道具であることが多い.魔法 + のものでなくても,おどろくほど携帯可能で壊れにくく,どんな + 悪天候下であろうと,吟遊詩人や竪琴弾きがどこへでも背負って + いくことが可能である.竪琴はめったに音が外れることがなく, + 反り返ることは決してない.弦はごくたまに切れるだけで,それ + はたいていは竪琴弾きが不機嫌なときか,失恋したときである. + だから,誰も予備の弦を作ったり買ったりしていないのだろう. + [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] + [ ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, + 原島文世・岸野あき恵訳, 東洋書林 ] +# ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, +# ダイアナ・ウィン・ジョーンズ, 原島文世・岸野あき恵訳, 東洋書林, 2004, +# p.161, 竪琴 + +  朝飯が終わると,人食い鬼はこうどなった.「かみさん,かみさん, + 黄金のハープを持ってきてくれ」そこで奥さんがもってきてテーブルの + 上にすえた.そこで人食い鬼が「うたえ」というと,黄金のハープは, + じつに美しい音でうたった.そして人食い鬼が眠ってしまって,雷のよ + うないびきをかきはじめるまでうたっておった. +  そこでジャックは大鍋のふたをそおっともちあげて,ねずみのように + 床へおりて,よつんばいでテーブルのところまで行くと,はい登るよう + にしてハープをつかみ,それをもってドアのほうへつっ走った.ところ + がハープは大きな音で「だんな!だんな!」とうたいだしたので人食い + 鬼が目をさますと,ちょうどジャックがハープをひっかかえて逃げて行 + くところが見えた. +  [ジャックと豆のつる 木下順二訳 岩波書店] + [ Jack and the Beanstalk, from English Fairy Tales, + by Joseph Jacobs ] +薬師 +healer +* healer +attendant +doctor +physician + 医神アポロン,アスクレピオス,ヒギエイア,バナケイア及び全ての男 + 神と女神に誓う,私の能力と判断に従ってこの誓いと約束を守ることを. + この術を私に教えた人を我が親の如く敬い,我が財を分かって,その必 + 要あるとき助ける.その子孫を私自身の兄弟の如くみて,彼らが学ぶこ + とを欲すれば報酬なしにこの術を教える.そして書き物や講義その他あ + らゆる方法で,私のもつ医術の知識を我が息子,我が師の息子,また医 + の規則に基づき約束と誓いで結ばれている弟子どもに分かち与え,それ + 以外の誰にも与えない.私は能力と判断の限り患者に利益すると思う養 + 生法をとり,悪くて有害と知る方法を決してとらない. + [ Hippocrates' Oath, translated by Francis Adams ] + [ ヒポクラテスの誓い, 新簡明公衆衛生第2版, + 稲葉裕, 野崎貞彦編, 南山堂 ] +# 稲葉裕, 野崎貞彦編, 新簡明公衆衛生第2版, 南山堂, 1996, p.299 + + 医者〔名〕われわれが病気のときには望みをあっけ,健康なときには + 犬をけしかけたくなる奴. + [ The Devil's Dictionary, by Ambrose Bierce ] + [ 悪魔の辞典, 郡司利男訳, こびあん書房 ] +# アンブローズ・ビアス, 郡司利男訳, 正・続全訳悪魔の辞典, こびあん書房, 1982, p.305 +アーリマンの心臓 +heart of ahriman + 三人の仲間たちは思わず息を飲んだ.柩の前に立った黒い巨人が, + ささやき声をあげた.「アーリマンの心臓よ!」男は片方の手で, + 仲間たちのざわめきを制した.どこからか,無気味な野犬の遠吠 + えがひびきあがり,かんぬきをうちおろした扉の外で,重々しい + 足音が聞こえた.だが,男たちの視線は木乃伊(ミイラ)の柩から + 動かなかった.テンの毛皮で縁取りされた法衣に身をつつんだ男 + は,燃えるような宝球を動かしながら,あのアトランチスよりも + 古い呪文をあいかわらず唱えつづけていた.宝石の輝きが男たち + の瞳を眩惑させるためか,かれらは今目の当たりにしているもの + の正体を確認することができなかった.だが次の瞬間,三人の前 + に置かれた緑色の柩が轟音とともに破られた.ちょうど,抵抗を + 許さぬほど強大な圧力が柩のなかで膨張し,彫刻をほどこした柩 + の蓋を打ち砕いたようだった.四人の男たちはいっせいに身をか + がめて,中にはいっているものを見つめた--腐敗し,糜爛し,萎 + 縮した人体が,そこに横たわっていた.朽ち果てた包帯から,埋 + れ木のようにどす黒い四肢の骨がかいまみえた. + 「生き返ったのか?」右端にたたずんでいた色の黒い小男が,毒 + を含んだ笑みを浮かべながらささやいた.「指を触れただけでも + こなごなに崩れそうではないか.わしたちはひょっとすると,馬 + 鹿を見たのかもしれんぞ--」 + [ Conan The Conqueror, by Robert E. Howard ] + [ 征服王コナン,団征二訳,ハヤカワ文庫 ] +ヘルハウンド* +hell hound* + ヘルハウンドは炎の息を吐く犬で,悪魔に仕えさせるためにこの地と + は別の実在界から持ち込まれた.ヘルハウンドは,毛が赤錆色か赤茶 + 色で,赤く燃えるような目をした大型の猟犬に似ている.体の模様も + 歯も舌もすす黒い.肩までの高さは2フィートから3フィートで,独特 + の煙と硫黄との臭気を漂わせている.その吠え声は不気味なこもった + 音で,これを聞いた者に身震いを起こさせる. +ヘルメス +hermes + オリンポスの使者および伝令官.多くの旅行と演説を公に行うこと + が要求されたので,彼は雄弁,旅行者,商業,盗賊の神になった.彼 + は策略だらけのマキャベリ主義の性格や性的欲情からギリシアの神々 + のなかでももっともエネルギッシュな一人である.他のギリシアの神 + 々のように,彼には地方のニンフ達に向けられた数多くの性的な武勇 + がある.彼は境界の神であり,墓の番人であり,羊飼いの保護者の象 + 徴である.彼は通常羽のついた金の履物を履き,ヘビがからみついた + 魔法の使者の杖を持ったりりしい若者として描かれる.彼はウワサで + はカロンの下界への船から戻る道を見つけられる唯一の者である.彼 + は他にもリラ(古代ギリシアの竪琴)やパンのパイプ,数字,アルファ + ベット,度量衡,いけにえの行為を発明したと言われる. +ヘズロウ +hezrou + ヘズロウは第II種の魔神の総称である.悪魔の中では比較的弱いほ + うであるが,それでも,十分に手ごわい. +ヒポクラテス +hippocrates + ギリシャの医師.「医学の父」として知られる.信じられるとこ + ろによると,彼はコス島に産まれ,医師である父に学び,おそら + くアテナで学ぶためにしばしば旅行し,コス島に戻ってきてから + 開業し,教育や著述を行った.彼の周囲に形成されたヒポクラテ + ス派あるいはコス派は,医学を,迷信と哲学的思弁とからきりは + なし,客観的観察と批判的演繹法に基づく厳密に科学的な段階に + 位置づけたという点できわめて重要である. + [ The Columbia Encyclopedia, Sixth Edition ] +ホビット +hobbit + ホビット族は,きわめて表に出たがらない,さりながらはなはだ + 古い種族で,以前は人数も今日とはくらべものにならないくらい, + 実に多かった.というのも,平和と静けさとよく耕された大地を + 愛する種族だからである.整地よく,耕作よき田園こそ,かれら + の好む棲処だった.かれらは道具の扱いがうまいくせに,今も昔 + も,炉とふいご,水車,または手織ばたの類より複雑な機械はわ + からず,あるいは好まなかった.古代にあってすら,ホビット族 + は一般に,かれらがいうわれわれ人間族の通称「大きい人たち」 + をうとんじていたのだが,今日ではわれわれの姿を見ると怖れあ + わてて避けるので,かれらを発見することはむずかしくなってき + ている. + [ The Fellowship of the Ring, by J.R.R. Tolkien ] + [ 評論社, 瀬田貞二訳 ] +ホブゴブリン +hobgoblin + ホブゴブリンは,清教徒たちによって,また時代が下ってからは,例 + えばジョン・バニヤンの「ホブゴブリンにも悪魔にもわたしの心はひ + るまない」という表現が示すように,邪悪なゴブリン族の妖精を指す + のに用いられたが,ブラウニー型の親しみやすい妖精を指すのに用い + るのが正しい.『夏の夜の夢』では,シェイクスピアのパックに向かっ + て妖精がこう言っている. + 「ホブゴブリン様とか,わたしのパックとか + 呼んでくれる人たちのためには, + 仕事をしてやり,幸運を授ける, + そのパックなんでしょう,あなたは?」 + もしもホブゴブリンというのが悪い響きのある言葉ならば,パックは + もちろんそう呼ばれるのを好むはずがない. + + 概してホブゴブリンは気だてがよく,喜んで手助けをし,悪ふざけを + するのが好きで,かつまたほとんどの妖精と同じように,機嫌を損ね + ると危険な連中である.ボガートはホブゴブリンに属するか属さない + かの境目にいる.ボーグルはわずかに外れる. + + ヘンダーソンによって記述されたもので,より邪悪なホブに〈首なし + ホブ〉がいる.これはハーワースとニーサムの間の道路に出没したが, + ティーズ川に流れこむ小さなケント川を渡ることができなかった.こ + のホブは,魔除けの力によって道端の大きな石の下に,満99年のあい + だ閉じこめられた.もし不注意にその石に腰を下ろした人は,永久に + そこから離れられなくなる.その99年の期限がそろそろ明けようとし + ているので,ハーワースとニーサム間の道路で,何か事件がもちあが + るかもしれない. + [ A Dictionary of Fairies, by Katharine Briggs ] + [ 妖精事典, 平野敬一 他訳, 冨山房 ] +聖水 +holy water + 「我々はお前に合う単語を欲する」と(その「単語」が「恐ろしく痛い + 永遠」と同意語であることを暗示するかのように意図された声の調子で) + リグルは言い,そしてずんぐりした悪魔はオフィスドアを押し開いた. + バケツがぐらつき,リグルの頭めがけて落ちた. + 水の中にナトリウム塊を落としてみよう.それが燃え上がって焼けて狂っ + たように回転し,めらめら燃えてパチパチ音をたてるのを観察しよう. + これはちょうどそんな不快な感じに似ている. + 悪魔は皮がむけ,そしてめらめら燃えて,ゆらめいた.油っこい茶色の煙 + を噴き出し,叫びをあげ金切り声をあげ悲鳴をあげた.そしてそれは崩れ + 落ち,それ自身に包み込まれ,そしてまるでつぶれたナメクジのようなも + のが1つかみ,カーペットの焼けて黒焦げた円の上にきらきら輝いて残っ + た. + 「やあ」リグルの後ろを歩いていて,あいにくそれほどしぶきを浴びなかっ + たハスターに,クロウリーは声をかけた. + 想像もできない事もある.悪魔でさえ他の悪魔がそこまで成り下がるとは + 信じられないであろう深みがある. + 「…聖水か,クズ野郎」とハスターがつぶやいた.「お前は本当にクズ野 + 郎だ.奴がお前に対して何かした訳でもないだろう」 + 「今の所は,ね」クロウリーは訂正した. + [ Good Omens, by Neil Gaiman and Terry Pratchett ] +ホムンクルス +hom*nculus + ホムンクルスとは,なにか特定の任務をなすために魔術師によっ + て召喚された生き物である.ホムンクルスたちはとくに隠密行動 + に長けている.小さい生き物だが,きわめて敏捷である.ホムン + クルスたちはその有毒なかみつきで犠牲者を眠りにおとしいれる + ことができる.しかしながら,その身体の小ささのために,人間 + に対しては効果は長続きしない. + + 「Tothapisは彼をさえぎった.『黙れ,謹聴せよ.汝は聖なる + wingboatに乗って旅ゆくであろう.wingboatについては噂も知る + まい.しかしそのものは汝をかの地へ一昼夜のうちに連れてゆく + であろう.ホムンクルスが汝と共にゆくであろう.そのものが思 + 考と同じ速さで何リーグもの距離を超えて,汝の言葉を私に伝え, + 私の言葉を汝に伝えるのだ』」 + [ Conan the Rebel, by Poul Anderson ] +刈り込みがま +鈎付の長斧 +ひっかけ棒 +鉄のフック +*hook + だがクィークェグはどうか.―そのときは食卓の上手に坐りこんでいた + のだが,まるで氷柱のように冷静だったのだ.その行儀作法については + あまりほめるわけにはゆかない.熱烈な崇拝者にしても,銛を朝食の卓 + に持ちこんできてやたらに振りまわし,みなの頭部をひやひやさせなが + らそれを食卓の上に差しのべて,ビフテキを引き寄せるありさまを,心 + から正しいと思うことはできなかったであろう. + [ Moby Dick, by Herman Melville ] + [ 白鯨, 阿部知二訳, 岩波文庫 ] +*ホルン +ホルン +~unicorn horn +*horn + ロラン,象牙の角笛を口に当てたり. + 強く押し当て,力をこめてそれを吹く. + 山は高く,響きはいと長し. + 三十里の遠くより,こだま返すを彼等聞く. + シャルルはそれを聞けり.またその軍勢すべても. + 王はいう,「われらの味方,戦を交ゆ!」 + これに向いて,ガヌロン答えたり, + 「それを別人の言いしならば,真赤な嘘とし思われん!」 + [ The Song of Roland ] + [ 有永弘人訳,岩波文庫 ] +角のある悪魔 +horned devil + 角のある悪魔には特殊な能力が全くない.しかし倒すのは非常に困 + 難である. +~仔馬 +*馬 +~horsem* +*horse + リチャード王:馬をくれ!馬を!代りにこの国をやるぞ,馬をくれ! + ケイツビー:ひとまず御退きを.御乗馬は,私が求めます. + リチャード王:下郎,この骰子の一目に命を賭けた俺だ,目が出るま + では退かぬ.リッチモンドの奴,六人もいるらしいぞ, + もう五人殺した,みんな影武者だ.馬をくれ!馬を! + 代りにこの国をやるぞ,馬をくれ! + [ King Richard III, by William Shakespeare ] + [ リチャード三世,福田恆存訳,新潮文庫] +デス +ペスティレンス +フェミン +戦争 +飢餓 +*horsem* +rider* +death +famine +pestilence +war +hunger + 子羊がその七つの封印の一つを解いた時,わたしが見ていると,四つの + 生き物の一つが,雷のような声で「きたれ」と呼ぶのを聞いた.そして + 見ていると,見よ,白い馬が出てきた.そして,それに乗っている者は, + 弓を手に持っており,また冠を与えられて,勝利の上にもなお勝利を得 + ようとして出かけた. + [War] + 子羊が第二の封印を解いた時,第二の生き物が「きたれ」と言うのを私 + は聞いた.すると今度は赤い馬が出てきた.そして,それに乗っている + 者は,人々が互いに殺し合うようになるために,地上から平和を奪い取 + ることが許され,また,大きなつるぎを与えられた. + [Famine] + また第三の封印を解いた時,第三の生き物が「きたれ」と言うのを私は + 聞いた.そこで見ていると,見よ,黒い馬が出てきた.そして,それに + 乗っている者は,はかりを手に持っていた.すると,わたしは四つの生 + き物の間から出て来ると思われる声が,こう言うのを聞いた,「小麦一 + ますは一デナリ.大麦三ますも一デナリ.オリブ油とぶとう酒とを,そ + こなうな」. + [Death] + 子羊が第四の封印を解いた時,第四の生き物が「きたれ」と言う声をわ + たしは聞いた.そこで見ていると,見よ,青白い馬が出てきた.そして, + それに乗っている者の名は「死」と言い,それに黄泉が従っていた.彼 + らには,地の四分の一を支配する権威,および,つるぎと,ききんと, + 死と,地の獣らとによって人を殺す権威とが,与えられた. + [ ヨハネの黙示録,6:1-8,口語訳聖書,日本聖書協会 ] +黄帝 +huan*ti + 中国の伝説の五帝の一.彼は暗黒の天に対して天の動きを定めた. + 彼は発明家であり,他の者どもの中から人間に車輪と鎧と羅針盤を + 与えたと言われている.彼は占いと戦いの神でもある. +フヘトトル* +hu*h*eto*l +minion of huhetotl + フェフェトトルまたはフヘトトルは「古い神」を意味しアステカ人 + (古代中米)の火の神である.彼は一般に父性に関連付けられ,シウ + テクトリ属に分類されるグループの一人である.彼は通常の人間に + 大混乱を引き起こすために使い魔を送ると言うことでも知られてい + る. + [ after the Encyclopedia of Gods, by Michael Jordan ] +ヒューマノイド +humanoid + ヒューマノイドの大きさは人間とほとんど変らない.遠くにいると + 見間違うほどだ.彼等は自然では普通部族にわかれており,住みか + を強烈に守ろうとする.好ましくないものには彼らは団結し襲撃し, + 人間の集落から略奪を行なう. +人間 +戦士 +首領 +番兵 +忍者 +看護婦 +小姓 +浪人 +店主 +実習生 +ちんぴら +魔法使い +見張り* +プレイヤー +human +chieftain +guard +ninja +nurse +page +ronin +shopkeeper +student +thug +warrior +*watch* +player + この変った生き物たちはたいていは地表に住んでおり,様々な形態 + の社会で共同生活を営んでいる.しかし,たまに,さまよい歩く者 + が地下に潜りこんでは,当然ながらこの乱入に怒っている洞窟に住 + みついた者たちに傷害罪を犯している.こいつらは武器や魔法を扱 + える.イェンダーの魔法使いもこれらの仲間である,との噂である. +ハンター +hunter + 狩りの首尾はどうだった? だいたんな狩人よ. +  きょうだい,見はりはながく,寒かった. + + ねらってでかけたえものはどうした? +  きょうだい,やつはまだ森で生きている. + + いつもじまんの力はどうした? +  きょうだい,見るまに身からひいていく. + + いさんででかけた,意気はどうした? +  きょうだい,おれはねぐらに死ににいく. + [ The Jungle Book, by Rudyard Kipling ] + [ ジャングル・ブック, 西村孝次訳, 学習研究社 ] +氷の悪魔 +ice devil + 氷の悪魔は,大きな昆虫に似た生物で,地獄の業火にも煉獄の極冷 + にも平気である.彼らの尾に触れるだけで旅行者は煉獄の極冷を味 + わうことになる. +インプ +imp + 小鬼(インプ)と言うのは二フィート足らずの小さな生きもので,飛 + んだり跳ねたりすることに秀でている. + [ The Charwoman's Shadow, by Lord Dunsany ] + [ハヤカワ文庫 荒俣宏訳] + + インプとは本来,横枝とか,挿し木用に切り取った枝のことであり, + インプ・ツリー(ymp tree)とは,接ぎ木した木,あるいは実生ではな + く挿し木から育った木を意味していた.インプは,正しくはサタンか + ら枝分かれした小悪魔を意味するが,ゴブリンやボーグルと,地獄か + ら来たインプとの区別はつけがたい.ケルト圏では,多くの人がイン + グランドの清教徒同様,妖精をすべて悪魔と考えている. + 伝承世界の妖精たちは幽霊と悪魔の身分の間を,どちらともつかずさ + まよっていることが多い. + [ A Dictionary of Fairies, by Katharine Briggs ] + [ 妖精事典, 平野敬一 他訳, 冨山房 ] +インキュバス +サキュバス +incubus +succubus + インキュバスとサキュバスは同じ種類の魔神で,それぞれ男性と女 + 性である.それらと関係を持つ愚かな人間は大抵手痛い目に合う. +*鉄球 +鉄の鎖 +*iron ball +*iron chain + 「おまえさんは,足かせをかけられているんだね?」スクルージは震 + えながらいった.「どうしてなのか,教えてくれないか?」 + 「生きているあいだにこしらえた鎖をつけてるのさ」幽霊は答えた. + 「こいつを作るには,輪をひとつひとつ,一ヤードまた一ヤードとこ + しらえたのだ.おれは自分の自由意志で,それをしばりつけ,自分の + 自由意志でからだにつけた.こんな型は,あんたにははじめてかね?」 + スクルージはますますひどく身を震わせた. + 「それとも知りたいかね?」亡霊は言葉をつづけた.「あんたがから + だに巻きつけているがんじょうな鎖が,どのくらい重く,どのくらい + 長いかを?七年前のクリスマスの前夜には,こいつとちょうど同じく + らい重く,長かった.それからずっと,あんたはせっせとそれを作っ + てきた.いまでは,ずっしりと重い鎖になっている!」 + [ A Christmas Carol, by Charles Dickens ] + [ クリスマス・キャロル,皆河宗一訳,河出世界文学全集 ] +イシュタル +ishtar + イシュタル(天上の星)はメソポタミアの肥沃と戦いの女神である. + 彼女は普通羽を持ち,武器入れを肩にかけ,ライオンの頭の装飾 + のある儀式用の双頭の三日月刀を持っている姿と描写されている. + 彼女はまた八芒星の象徴でもある. + [ Encyclopedia of Gods, by Michael Jordan ] +イセック +issek + さて,ファファードが奉仕することを選んだ〈瓶のイセク〉は + ランクマーに集う神々,いや,神々の卵の中でも,最も卑しく, + 芽の出ない部類に属していた.もうこの都にきて十三年になるが, + 〈神々の大路〉をわずか二丁旅しただけ,いまはふたたび後退して, + まもなく忘れ去られようとしていた.このイセクを,〈腕のない + イセク〉や〈焼けた足のイセク〉や〈皮を剥がれたイセク〉など, + おなじ名を持つ,華麗な迫害を受けた数多くの神々と混同しては + ならない.いや,事実,彼の不人気の一因は,その死にざま + ----拷問台での死----が,今一つの迫力に欠けるところに + あったのかもしれない. ... しかしながら,ファファードが + 彼の見習僧になってからは,多少事情が変わってきた. + [ Swords In The Mist, by Fritz Leiber ] + [ 霧の中の二剣士, 大谷圭二訳, 創元推理文庫 ] +izchak + ノームの炭坑の町の照明具店の店主は,NetHack開発チーム創設時からの + メンバーで我々全ての親友である Izchak Millerに贈るものである. + Izchakのゲームへの貢献は絶大なものであった.彼は属性システム,祈 + りのコード,3.1のリリースにあたり「地獄」の書き変えなどで貢献した + のはもちろん,彼は大量の店のロジックをコーディングした(それ故に献 + 辞が自然である).Izchakは哲学の教授であり,多くの素晴しい大学(MIT + やスタンフォード)で教鞭をとり,一時は Xerox PARCで働いていた. + Izchakは NetHackプロジェクトの最初の「司書」であり,創設時からの + メンバーであり,1986年に彼がペンシルバニア大学(それゆえ我々の以前 + のメイリングリストのアドレスがあった)で働いているときに加わった. + 3.1.3のリリースまで,Izchak は全てのコードが同じになるよう管理し, + 開発チームのメンバー間の論争の仲裁をした.が,Izchak Millerは1994年 + 4月1日早朝,癌の合併症のため 58歳でこの世を去った.我々は + NetHack3.2を彼へ捧げる. + [ Mike Stephenson, for the NetHack DevTeam ] +ジャバウォック +ボーパルブレード +jabberwock +vorpal* + 「わが子よ,ジャバーウォックに油断するなかれ! + 食らいつくその顎,かきむしるその爪! + ジャブジャブ鳥にも心許すな, + おどろしきバンダースナッチにはゆめ近寄るべからず!」 + + けしにぐの剣,手に取りて, + かれ,ひとごろしき敵をば求め歩くこと久しかりしが-- + タムタムの樹のかたえにて一息つき, + しばし立ちつくして思いに沈みぬ. + + られられしき思いその胸に駆けめぐるときもとき, + 見よ,らんらんたる眼燃やしたるジャバーウォック, + おぐらてしき森の奥より,飄飄と風切り飛びきたり, + ぶーぶくぶくとうなやきけり. + + いち,に!いち,に!ぐっさりぐさり + 目にも止まらぬけしにぐの剣,手錬の早業! + 横たわりたる死体より刎ねたる首をば小脇にかかえ, + たからからからと帰り来たりぬ. + [ Jabberwocky, by Lewis Carroll ] + [ 高橋康也・沢崎純之介訳 ] +ジャッカル +jackal + アジアの民話では,ジャッカルはライオンの世話をします.ジャッカ + ルはライオンが殺して食べている獲物をかきあつめ,残したものを褒 + 美として受けとるのです.北インドの話では,ジャッカルはときどき + 「王(すなわちライオン)の使い」と呼ばれています.伝説によると, + ジャッカルは決して自分で獲物を殺しません.これは彼の卑怯な伝説 + から来ています.ジャッカルの心臓は,たとえばジャッカルが沢山い + るところの土着の人々の信仰では絶対喰われることはありません. + ... + ハウサ・ネグロの民話ではジャッカルは利口な判事の役を演じ,「森の + 博学者」などと呼ばれます.ブッシュマンはジャッカルは「ジャッカル + であるがゆえ」のようなふるまいのようなやりかたでふらふらしている + と言います. + [ Funk & Wagnalls Standard Dictionary of Folklore ] +ひすい* +翡翠* +jade* + 廃虚の中には何も生えていない.街路は壊れ,家々の壁は崩れていた + が,割れ目に生える雑草もなく,あたかもこの都がごく最近に地震で + 壊滅したかのようだった.たったひとつ無傷で廃虚の上にそびえたつ + ものがあった.それは巨大な,白,灰色,緑の翡翠の像−−若い男の + 裸像で,その顔はほとんど女性的なまでの美しさを持ち,見えぬ目を + 北方に向けていた. + 「あの眼!」アヴァン・アストラン公爵が言った.「眼がなくなって + いる!」 + [ The Jade Man's Eyes, by Michael Moorcock ] + [ この世の彼方の海,井辻朱美訳,早川書房 ] +ジャガー +jaguar + 大型の猫の仲間の肉食動物.中央および南アフリカに住む.この猫科の + 食肉動物(学名:Pantehra onca)はときどき間違ってヒョウと呼ばれる. + [ Van Dale's Groot Woordenboek der Nederlandse Taal ] +クラゲ +jellyfish +#[訳注 Portuguese Man-o'-warはカツオノエボシのこと] + 私は海を分かちあうことを好まない + このようなくらげどもがいては + ことにポルトガルのものならば + [ Lines on Meeting a Portuguese Man-o'-war while + Bathing, by Michael Flanders ] +ジョウビレックス +juiblex +jubilex + 無貌の王については,その名前の正確な綴りすらほとんど分かって + いない.知られているように,物理的な形態がなく,そのあたりを + じっと観察したものの報告によると,スライム様の生物である.他 + の生物を生きたまま飲み込み,腐食性の分泌液を放出する.これを + 浴びた犠牲者は病気になり,即死してしまうこともある. +兜 +kabuto + 兜はサムライが身に付けるヘルメットであり,装着者の顔面を保護す + るため,顔を覆うように突き出た前端部に特徴があり,これから近代 + 日本では「衝角(鍬形)付き兜」と呼ばれている.兜を構成する主な + 部品は,長円形の鉄板,衝角棒,頭部に合わせた半球形の鉢である. + この鉢には,声を前面に集中させる機能を持つよう,下前方に曲げら + れた延長部(鉢付)が取り付けられている.頭部を囲むように作られ + た2つの板が,この鉢付に鋲で止められている.下方は「腰巻」と呼 + ばれ鉢の下方の縁を構成し,もう一方は「胴巻」と呼ばれてこめかみ + 辺りに置かれる.これらの板と衝角棒の間の隙間には,時には三角形 + であるが普通は四角形の小さな板が詰められている.頭部から前方に + 突き出てた形状のため,三角形のギャップは「衝角底板」と呼ばれる + 小さな板で埋められている.「衝角底板」の後縁は前頭部に載せられ + た縁に向かい下向きに曲げられている. + [ Arms & Armour of the Samurai, by Bottomley & Hopson ] +刀 +katana + 刀は,長くて片刃の刀身が軽くそりかえった侍の剣である.その長 + い柄は,片手でも両手でも刀を振り回せるようにできている. +麒麟 +ki-rin + 麒麟は奇妙な空飛ぶ動物である.鱗,ライオンのようなたてがみ, + 尻尾,ひずめ,つのをもつ.明い色をしており,しばしば報いるた + めの良い行いを探し空を飛んでいるのを目撃される. +アーサー王 +king arthur +*arthur + エクターはふたりの息子を教会に据えられた鉄床の前へつれてき + た.そこで,鉄床の前にたって,彼はケイに命じた.「もし玉座 + が本当におまえのものだと思うのなら,剣を鉄に突き通してみる + がいい!」しかし剣は鉄をかすっただけだった.「次はおまえの + 番だ」エクターはアーサーにむかって言った. + 若者は両手で剣をもちあげ,突きさした.刃は閃きとともに風を + 切って,鋼鉄にまるでバターのようにたやすく穴をあけた.エク + ターとケイはアーサーの前に膝をついた. + 「父さんに兄さん,どうして僕におじぎするの?」アーサーは疑 + 問を声にたたえてたずねた. + 「あなたが王であると,生まれだけではなく法によっても今や確 + かにわかったからです」とエクターが言った.「あなたは私の息 + 子ではなく,ケイの弟でもない.あなたが生まれてすぐに賢者マー + リンが,安全に育つようにと私の元へつれてきた.あな + たが洗礼をうけたときアーサーと名づけたのはたしかに私ではあ + るが,本当はあなたは,勇ましい王ウーゼル・ペンドラゴンと女 + 王イグレーヌの息子なのだ」… + + そしてその言葉の後,王はたちあがり,なにがおきたかを知らせ + るため,大司教に会いにいった. + [ Van Gouden Tijden Zingen de Harpen, by Vladimir Hulpach, + Emanuel Frynta, and Vackav Cibula ] +ナイフ +スティレット +knife +stiletto + ひょっとすると人々の顔に半信半疑の表情を見てとったのだろうか, + 世界の放浪者はなおも執拗に自分の冒険談をつづけたのである. + + ――それからトリエステでは一人の男がイタリア人に殺されるのを + 見たぜ.背中をナイフで突き刺されてね.こんなナイフだった. + + 話しながら彼は自分の性格にふさわしい物騒な折畳みナイフを取り + 出して,突き刺すようにそれを構えて見せた. + + ――そこは淫売宿で,密輸入業者二人がお互いにいかさまを働いた + からなんだ.奴はドアのかげに隠れてて,背後からその男を襲った. + こんなふうに.《汝の神に会う準備(そなえ)をせよ》と奴が言う. + ぶすっ! 柄のところまで背中に突き刺さったな. + [ Ulysses, by James Joyce ] + [ ユリシーズ, 丸谷才一・永川玲二・高松雄一訳, 集英社 ] +# ユリシーズ III, ジェイムズ・ジョイス, 丸谷才一・永川玲二・高松雄一訳, +# 集英社, 1997, p.230 +*騎士 +knight +* knight + 勇ましの郷士ここにぞ眠る, + きわまれるそれが勇気は + 死の神も君が生命を + 死をもってかち得ざりしと, + 世の人は語り伝えぬ. + ありし日は世界を蔑(なみ)し, + 世をあげて君をおそれて + ひたぶるに怖気(おぞけ)ふるいぬ. + かくしては幸(さち)を得たりき. + 狂人とし世を送りしが + 正気に復してみまかれり. + [ Don Quixote of La Mancha by Miquel de + Cervantes Saavedra ] + [ ドン・キホーテ, 会田由訳, 晶文社 ] +~*ゾンビ +~*ミイラ +*コボルド* +~kobold ??m* +*kobold* + コボルド一族は(半ば神と化した?)偉大な魔法使いによる人工生命 + 体であると云われている.コボルドの身長は3フィート程で,感情のはっ + きりしない犬のような顔をしている.エルフを非常に嫌っており, + どんなときでもエルフに騒動を起こすためには我を忘れる. +警備員 +巡査 +巡査部長 +警部補 +*kop* + Kopは素晴らしい概念だ.適性がないKopの一団を率い,一連の騒々しく + 面白い身体罰で繰り返し彼らを画面に出すのは,天井桟敷でも高価な + ボックスシートでも変わりはない.人々はKopを嫌う.一度も警官と関係 + をもった事がない人々さえ彼らを嫌う.もちろん,我々は彼らが秩序を + 守り,我々が保護を必要とする時に保護してくれる事をあてにしている + し,テレビにおいて豪胆さと美しい心を持つ彼らを愛したりもするが, + それでも抽象的に,国家と同様に,ひとまとめに我々は彼らを嫌う.彼 + らはあまりに学園の校長に似ている.我々は彼らのズボンが落ちるのを + 見るのが楽しいし,我々には彼らの顔にはパイがお似合いに見える. + Keystone Kopは登場し――そしてお互いに衝突したり落っこちたりして + 罰せられ,侮辱に継ぐ侮辱を経験する.ここに純粋な映画満足がある. + + Kopは非常に巧みに演出される.彼らの追跡シーンの1つでのこっけい + な独創性とタイミングは,思いつくべき想像力,実行する才能,メディ + アの理解,そして当然ながら,能力を発揮するありのままの勇気を必要 + とする.Kopは不適格者として提示される狂人であり,そして彼らは近 + 代的な乗り物で性急に行動する狂人である.その上,彼らが日常茶飯事 + に操作していた乗り物は新発明品であり,一般の映画ファンにとっては + 未体験の代物であった.(自動車の黎明期には,カンザスシティーで登 + 録されていた自動車はたった2台であり,それらが互いに出くわしたと + 報告されている.この事実には詩歌と哲学が共に含まれているが,しか + しすべての中で最も,ユーモアがある.Sennettはユーモアを得た.) + [ Silent Stars, by Jeanine Basinger ] +コス +kos + 「おれは腰抜けではない! 〈盗賊の館〉に堂々と乗りこんで, + クローヴァスの首級をあげ,血のぽたぽた垂れるやつを + ヴラナの足もとへほうり出してみせる! 運命の神コスも照覧あれ, + わが父ナルグロンの茶色の骨と,この腰に帯びた父の剣 + 〈灰色杖〉にかけて,それを誓う!」 + [ Swords and Deviltry, by Fritz Leiber ] + [ 魔の都の二剣士, 大谷圭二訳, 創元推理文庫 ] +琴 +koto + 日本のハープ. +クラーケン +kraken + 水の中から一本のくねくねした長い触手がはい出ていました.そ + れはうすい緑色の発光体で,濡れていました.その指のついた先 + 端がフロドの足をつかんで,水の中に引き入れようとしていたの + です.サムは両膝をつき,短剣でその手に切りつけました. + 腕はフロドを放しました.サムは助けを呼びながら,フロドを引 + っ張ってそこを離れました.別に二十本ばかりの腕が小波をたて + て現われました.暗い水面が騒ぎ,恐しい悪臭がしました. + [ The Fellowship of the Ring, by J.R.R. Tolkien ] + [ 評論社, 瀬田貞二訳 ] +レディ +オフラー +女神 +*lady +offler + イオはさいころ箱を取り上げた.それは頭蓋骨でできており,あちこ + ちの穴がルビーでふさいである.イオはいくつかの目玉を<女神>に + 向けて,五を三つ振り出した.<女神>は微笑んだ.<女神>の目は + こんなふうだ−−色は明るい緑,瞳孔はなく,内側から輝いている. + + 部屋中が静まり返る中,彼女は駒を入れた箱を探り,その底から二つ + の駒を取り出すと,決然とした表情で,かちっかちっと音をさせて盤 + の上に置いた..他のプレーヤーは,一斉に首を伸ばしてのぞき込ん + だ. + + 「うらりり者のまひゅつ師に,何かの事務員らな」<鰐の神>オフラー + の言葉は,例によって牙のせいで聞き取りにくい.「おらまあ」かれ + はかぎ爪のついた足で,象牙色のチップを一山,テーブルの + まん中に押しやった. + + <女神>は,かすかにうなずいた.彼女はさいころ箱を取り上げると, + 岩でも持つかのようにしっかともった.にもかかわらず,どの神々に + も,三つのさいころが箱の中で,からからと転がる音が聞こえた.そ + して彼女はさいころをテーブルの上に転がした. + + 六,三,五. + + だが,何かが五の目に起こりつつあった.何十億という分子の偶然の + 衝突にさらされて,さいころはくいっと角で立ち上がり,おもむろに + 回転すると七の目を見せた.“盲目のイオ”はさいころを手にとって, + 面の数を数えた.「頼むよ」かれはうんざりしたような声を出した. + 「フェア・プレイで行こう」 + + [ The Colour of Magic, by Terry Pratchett ] + [ ディスクワールド騒動記,安田均訳,角川文庫 ] +*ランプ +*lamp + 気がついたとき,彼は母親に何がおこったかを語って聞かせ,ラ + ンプと庭で集めてきた果物を見せた.それは実は貴重な宝石なの + だった.それから彼は食べる物が欲しいと言った. + + 「困ったね,息子や!」母親は言った.「家にはもうなにもない + んだよ.でも,つむいだ木綿が少しあるから,それを売ってきま + しょう」 + + アラジンは母親に木綿をとっておくように言った.というのも, + 代わりにランプを売るつもりだったからだ.ランプはひどく汚れ + ていたので,母親はそれをこすりだした.そうすればもっと高く + 売れるかもしれないので.たちまち見るも恐しい魔神があらわれ, + 彼女に何が欲しいかをたずねた.母親は気を失なってしまったが, + アラジンはすぐさまランプをつかみ,大胆にも言った. + 「なにか食べるものを取ってこい!」 + [ Aladdin, from The Arabian Nights, by Andrew Lang ] +ランス +lance + 折しも一陣の風が吹いてきて,大きな風車の翼がいっせいに動き出 + した.それを見ると,ドン・キホーテはこう叫んだ――「たとえお + ぬしらが,かの巨人ブリアレーオより多くの腕を動かしたところで, + 拙者が目にもの見せずにおくものか.今に思い知るぞ.」 + + こう口走った彼は,かくも大きな危機を迎えたわが身を救いたまえ + と,思い姫ドゥルシネーアに心をこめて祈念しながら,盾をしっか + りと構え,槍を小脇にかいこんで,ロシナンテを全速力で駆けさせ, + いちばん手前にあった風車に突撃した.ところが,彼が思いきり槍 + を突き立てたその瞬間,風が激しい勢いで翼を回転させたものだか + ら,その槍がへし折られただけでなく,馬とその乗り手もそっくり + 翼にさらわれて,反対側に放り出され,むざんにも,野原をころが + っていく始末だった. + [ Don Quixote of La Mancha by Miquel de + Cervantes Saavedra ] + [ 新訳 ドン・キホーテ(前篇), 牛島信明訳, 岩波書店 ] +# 新訳 ドン・キホーテ(前篇), セルバンテス作, 牛島信明訳, 岩波書店, +# 1999, pp.69-70 +紐 +leash +  ポンゴもミセスもすばらしい顔と肩,それに強い足とまっすぐ + な尾を持っています.体の水玉もようはまっ黒で,ほとんどが二 + シリング硬貨ほどの大きさです.顔と足と尾の水玉もようはいく + ぶん小さく,鼻と目のふちが黒色です. +  ミセスはたいへん愛くるしい表情をしています.ポンゴは生ま + れついてのリーダーですが,目にいたずらっぽい輝きがあります. +  ポンゴとミセスはとても気品のあるようすで,ならんで歩いて + います. +  ただ,十字路にきたとき,デアリーさんたちを安全にわたらせ + るように,ひもをくっつけています. + [ The Hundred and One Dalmatians, by Dodie Smith ] + [ ダルメシアン: 100と1ぴきの犬の物語,ドディー・スミス,熊谷鉱司訳,文渓堂 ] +レンバス +lembas* + 朝になって,一同がささやかな荷物の荷ごしらえを始めていますと,か + れらの言葉を話すことのできるエルフたちがやって来て,旅に必要な食 + べものや衣類などのたくさんの贈り物を持ってきました.食べものは大 + 部分が非常に薄い焼き菓子の形をしていて,それは外側がうすいとび色 + に焼け,中がクリーム色をしており,あら碾きの粉でできていました. + ギムリはその一つを取りあげると,うさんくさそうな目でじっと見まし + た. + + 「クラムだ.」かれは小声でそういうと,端っこをボキッと折り取って + 噛んでみました.その表情はたちまち変わりました.そして残りをいか + にもおいしそうに全部食べてしまいました. + + 「もうだめ,もうだめ」エルフたちは笑いながら叫びました.「あなた + は一日たっぷり歩けるくらいの分をもう食べてしまったんですよ.」 + + 「わたしはまたこれはただのクラムのようなもんだと思ったんです.谷 + 間の国の人間たちが荒野を旅する時に持って行くようなやつですよ.」 + + 「そうですよ」と,かれは答えました.「だけど,わたしたちはこれを + レンバス,つまり行糧(こうりょう)と呼んでいるのです.そして,これ + は人間の作ったどんな食べものよりも力がつくし,それに何といったっ + て,クラムなんかよりうまいですよ. + [ The Fellowship of the Ring, by J.R.R. Tolkien ] + [ 評論社, 瀬田貞二訳 ] +レムレース +lemure + 地獄の最下級の住人. +レオクロッタ +leocrotta +leu*otta + レオクロッタ,とてつもなく素早い野性の獣,野性のロバくらいの + 大きさ,雄鹿の足,首,尻尾,ライオンの胸,穴熊の頭,2つに割れ + た蹄,耳のように切りさかれてる口,歯の変りに一枚の骨.この動 + 物は人間の声をまねるとも言われている. + [ Curious Creatures in Zoology, by John Ashton ] +レプレコーン +leprechaun + アイルランドのレプレコーンは妖精の靴の仕立屋であり,アイルラン + ドの色々な場所によって色々な名前で知られている.コーク地方では + クルリカーン,ケリー地方ではルリカン,キルダーではルリキーン, + ティパラリーではリガダーンである.彼らは妖精のために仕事をす + るが,レプレコーンは同じ種族のものではない.それは小さく,黒 + い皮膚を持ち,奇妙な服を着ていてる.レプレコーンは次のように + 躁鬱的である.最初にとても幸せになり,片方の靴底を釘付けする + かのように陽気に口笛を吹く.数分後,陰鬱かつ不機嫌になり,自 + 家製のヒースのエールで酔いつぶれる.レプレコーンは二つのもの + を愛する.煙草とウィスキーだ.そしてレプレコーンはすばらしい + 信用のあるやつで,相手を裏切ることのないやつだ.どうでもいい + ことだが,どんなに利口なやつでも隠された金や魔法シリングのつ + まったポットを騙しとったのはいない.最後には,彼を掴まえるも + のの注意をそらす方法について考え,目もまばたかせ消えるのであ + る. + [ A Field Guide to the Little People + by Nancy Arrowsmith & George Moorse ] +*リッチ +*lich + 何百年かに一度,邪悪な魔法を極めたものや僧侶が,その人生を普 + 通の人間の一生をはるかに越えるようにしようと偉大な魔法の使用 + を使用することがある.この魔法の普通の効果は時間をかけ,人間 + を偉大な魔法のパワーをもつアンデッドに変化させる.リッチはあ + らゆる形での生命を忌み嫌う.これらの生き物に触られたりするだ + けで,犠牲者は冷たくなり痺れてしまう.彼らはまた魔法をも使う + ことができる. +苔の怪物 +lichen + その室は粗雑な岩でできており,丸く,さしわたし18か20フィー + トほどの広さで,多くの種類のシダやコケや地衣類でいろどられ + ていた.シダは冬らしく動かず,あるいは大潮にそなえて渦巻き + 状になっていた.しかしコケは生命にみちあふれており,羽毛を + 生じているものや,ゴブレットのようになっているものや,赤い + ふちどりのあるものもあった. + [ Lorna Doone, by R.D. Blackmore ] +黄色い光 +黒い光 +~* of light +* light + 物体というよりはエネルギーからなる奇妙な生物で,敵に対しては + 自虐的な爆発を与える. +ヤモリ +イグアナ +トカゲ +gecko +iguana +lizard + トカゲ,蛇,穴みみずトカゲは「鱗のある」を意味する鱗目を形成 + する.トカゲのすらっとした,スリムな,長い尻尾の体は広範囲の + 生息地での生活を可能とするように変化してきた.トカゲは穴掘り, + ランニング,水泳,壁上りの名人で,あるものは肋骨にくっつ + いた粗末な短距離滑空用の「羽」をうまく使うことができる.たい + ていは肉食で,無脊椎動物や小さな脊椎動物をえさとして食べる. + しかし,植物を食べるものもいる. + [ Macmillan Illustrated Animal Encyclopedia ] +ロキ +loki + ロキまたはロプトはスノリのエッダでは次のように記述されている. + 「見た感じは人に好かれ,りりしいが,性格は悪で,ふるまいは + 気まぐれである」.彼は巨人ファルバウティとラウフェイの息子で + ある. + ロキは北欧の悪知恵,悪,盗賊および火の神である.彼は他の神々 + を憎み,彼らの破滅と世界の転覆を望んでいる.彼は多く殺人を犯 + した.盗賊として,彼はフレイのネックレスを,トールのベルトと + 力の小手を,若さの林檎を盗んだ.うまく変化をできるので,彼は + 雌馬,ノミ,蝿,ハヤブサ,アザラシ,しわくちゃ婆など色々なも + のになりすましたと言われている.雌馬になったとき彼はオーディ + ンの馬スレイプニルを産んだ.彼は伝えられるところでは,ヘビの + ミドガルド,冥界の女王,ヘル,ラグナロクに太陽をむさぼり食う + フェンリル狼を生ませた. +ダイアナの長弓 +*longbow of diana + この伝説の弓は,持っているだけでESPが与えられ,装備すれば + 魔法による攻撃を反射することができるし,使用すれば矢を得る + ことができる. +ガラス +鏡 +looking glass +mirror + ところで雪白姫のほうはずんずんおおきくなりましたが,それにつれて + だんだん美しくなるばかりで,七歳のときには,まるで,晴れわたった + 日のようにうつくしく,さすがのおきさきよりも美しくありました.あ + るとき,おきさきが,お気にいりの鏡に, + + 「かがみや,かべのすがたみや, + お国じゅうで,いちばんきりょうのいい女は,だあれ?」 + + とたずねると,鏡は, + + 「おきさきさま,ここでは,おきさきさまがいちばんごきりょうよし, + けれども,ゆきじろひめは,おきさきさまより千ぞう倍もうつくしい」 + + と,へんじをしました. + [ 完訳,グリム童話集2,岩波文庫,金田鬼一訳 ] + [ Snow White, by Jakob and Wilhelm Grimm ] +ケナーヴェン卿 +lord carnarvon + ケナーヴェン卿はイングランド以外のどこにも生まれえなかった + だろう人物である.スポーツマンと収集家,紳士と世界旅行者の + 混ぜ合わせであり,その行動は現実主義的であり,感情面ではロ + マンチストであった.…1903年,彼ははじめて,おだやかな気候 + の調査のためエジプトにおもむき,そこでいくつかの考古学的調 + 査の発掘現場をおとずれた. + …1906年,彼は自身の発掘作業をはじめた. + [ Gods, Graves, and Scholars, by C. W. Ceram ] +大名佐藤 +lord sato + 大名佐藤は太郎一族の当主で強力な大名である.彼は皇帝の忠臣で + あり帝国のためにその力を全て発揮している. +スルト* +サーター* +lord surt* + だが,いちばん初めには,南の方に,ムスペルという世界があったの + だ.それは明るく,熱く,その辺りは焔をあげて燃え上り,異国の者 + で,そこに生れたのでない者は,近づけなかった.そこの国境警備の + 任についている者はスルトと呼ばれている.彼は手に燃えさかる剣を + もち,世界の終りにやってきて,荒しまわり,神々を一人残らず討ち + 平らげ,全世界を火で焼きつくすだろう. + [ The Prose Edda, by Snorri Sturluson ] + [ エッダ,谷口幸男訳,新潮社] +ルーフ +lug* + ルーフまたはルーグはアイルランドのケルト人の太陽の神であった. + 彼の武器の1つにロッドスリングがあり,礼拝者がときどき虹として + 空に見た.種族の神として,彼は実際,彼の重厚な無敵のひとりでに + 戦う槍の扱いにたけていた.彼の名の1つに「(長武器の)ラムフハダ」 + と言うのがある.彼は若く,明らかに神々の父ダグダよりも魅力的で + あった.姿形を変えることができ,彼の名前はオオヤマネコに変換 + されている. +ラーカー +lurker* + この洞窟の掃除屋は周囲の洞窟内の壁や天井に溶け込むのを極めて得 + 意としている.それは彼らが岩に似た色の皮膚を有しているからであ + る. +ライカンスロープ +ジャッカル人間 +狼人間 +ねずみ人間 +ジャッカル男 +狼男 +ねずみ男 +ジャッカル女 +狼女 +ねずみ女 +lycanthrope +were* +human were* +*were + 1573年,ドールの議会は法令を公布し,フランシュ・コンテの住人が, + その地域を荒らしていた狼人間を狩りたてて殺すことを許可した.人 + 々は「いわゆる狼人間を,いかなる罰金やその他の罰則を負うことな + く,発見しうるいかなる場所においても,ジャヴェリン,ハルバード, + 槍,火縄銃,棍棒などで武装し,狩りたてて追いかけ,あるいは捕え, + 焼き,殺す権限を与え」られた.この狩りは以下の事実から判断する + に,成功したように思われる.すなわち,翌年,同議会がジャイルズ・ + ガルニエという男を火刑に処す判決を下したことである.ジャイルズ + は,よつんばいになって森や野原をかけまわり,「金曜日にさえ」子 + 供をむさぼり食ったのである.そのあわれな獣人は,教会の祭日に対 + し,フランスの豚と同じくらいわずかにしか尊敬の念をもっていなかっ + たようだった.フランスの豚は,断食日に子供を喰らうことを信心を + 理由に我慢したりはしない. + [ The History of Vampires, by Dudley Wright ] +山猫 +lynx + 夢で山猫を見るのは,敵があなたの仕事を揺るがしたり家庭の事を混乱 + させているということです.女性なら,この夢はあなたの恋人の愛情が + あなたに匹敵する用心深い女性がいることを示します.もしあなたが + 山猫を殺したのなら,あなたはライバルに勝つでしょう. + [ 10,000 Dreams Interpreted, by Gustavus Hindman Miller ] +魔法のマーカ* +magic marker + ペンは剣より強し. + [ Richelieu, by Edward Bulwer-Lytton ] +マーリンの魔法の鏡 +magic mirror of merlin + この強大な鏡は,木々が歌い岩が踊っていた時代にドルイド僧,マー + リンによって作られたものである.それはその所有者全てをマジック + ミサイルから護り,遠視能力を与える. +メ*ルデーモン +mail d*emon + この奇妙な生物は飼い犬によってのみ傷つけることができると噂さ + れている. +マナンナン*マクリール +ma*annan* + 通常はマナナンと呼ばれる.ラーの息子で商業と水兵の神.マナ + ナンは決っして殺害に失敗しない剣,その持ち主が望むところに + 推進する船,風より疾い馬,どんな剣でも貫通できない魔法の鎧 + を持っている.彼はのちに彼が住んでいたティル・ナ・ノークの + 下方にある海の神および地下の神となった. +亡霊 +manes + 迷宮のブヨ.この群らがる怪物は単独で現われるのは稀である. +マードク +marduk + まず至上の指導者としての承認を知らしめるため,マルドゥクは + ドラゴンをうちたおし,その身体をふたつに切ってそれらから天 + と地をつくり,人間たちを世界に住まわせた.人間たちは,不自 + 然なことではないが,自分たちの生におおいに感謝をあらわした. + 神々もまた相応に感謝しており,マルドゥクに多くの称号を授け, + 次第に自分たちをマルドゥクにとりこんでもらうことを許されて + いった.そういうわけでマルドゥクは最高神となり,星々の通り + 道から人間どもが生活する日々の出来事まで,あらゆる既知の生 + 命のなりゆきを企図するようになった. + [ The Immortals, by Derek and Julia Parker ] +マリリス +marilith + マリリスの上半身は人間の女性で,下半身はと大蛇である.複数の + 腕を自由にあやつり攻撃をしかけてくる.武器を扱えるだけの知能 + もあるので,マリリスは非常に危険な存在である. +マルス +mars + 戦争の神であり,もっとも有名で崇拝される神のひとりである. + 初期ローマでは,彼は春,自然の生長,肥沃の神であり,子牛の + 守護者であった.マルスはまた,地の神としても言及されるが, + このことから,なぜ彼が死と,ついには戦争の神になったのかが + わかるかもしれない.彼はジュピターとジュノーの息子である. + [ Encyclopedia Mythica, ed. M.F. Lindemans ] +暗殺者の頭領 +master assassin + ツローフは何人かの暗殺者を引き連れて,階段を降りてきた.イモー + の真ん前に来ると口を開く.「旅行者を頂きに来た」 + ..... + 「一歩でも動けば,入ってきたときより目玉を減らして帰ることにな + るぞ」盗賊の頭は言った.「だから,座っていっぱいやりな,ツロー + フ,それからゆっくり話し合おうじゃないか.確かお互いに協定を結 + んだと思っていたんだがな−−おまえたちは盗まない,俺たちは殺さ + ない」そして間を置いて付け加えた,「報酬のためにはな」 + + ツローフは差し出されたビールを飲んだ. + + 「それで?」と暗殺者.「俺が殺す,それからあんたが盗めばいい. + あそこの妙な格好をした奴がそうか?」 + + 「そうだ」 + + ツローフはツーフラワーを見すえた.ツーフラワーはにやっと笑いか + えした.ツローフは肩をすくめた.かれはなぜ,人々が他人にしんで + もらいたがるのか,わざわざ考えて時間を無駄にすることは滅多にな + かった.生計の糧というのに過ぎない.「依頼人は誰か,教えてくれ + ないか?」とイモー. + + ツローフは片手を上げた.「おいおい!」と抗議する.「職務上のエ + チケットだぞ」 + + [ The Colour of Magic, by Terry Pratchett ] + [ ディスクワールド騒動記,安田均訳,角川文庫 ] +盗賊のマスターキー +master key of thievery + この万能鍵は大昔に作られ,どんな鍵でも開けてしまう強力な魔力が + 吹き込まれている.持っているだけで,持ち主に警告を与え,瞬間 + 移動を制御し,物理ダメージを半減させる.その力を使うとどんな + 罠でも解除する能力が得られる. +盗賊の頭領 +master of thieves + 窓の外で羽ばたきが聞こえた.イモーは椅子から巨体を起こすと部屋 + を横切り,一羽の大烏を連れて戻ってきた.脚の通信間をはずしても + らうと,そいつは飛び上がって,垂木のすき間にひそむ同類たちの仲 + 間入りをした.ワイゼルは憎しみのこもった目でそいつを眺めた.イ + モーの大烏は,主人への忠誠に関しては悪名が高い.イモーの右腕た + るワイゼルが一度,アンク=モルポークで一番手の盗賊になろうと試 + みたときには,左目を失うはめになったほどだ.だが,命まで取られ + たわけじゃない.イモーは男が大志を持ったからといって,決して妬 + んだりはしないのだ. + + [ The Colour of Magic, by Terry Pratchett ] + [ ディスクワールド騒動記,安田均訳,角川文庫 ] +マストドン +mastodon + マンモス属の,巨大なゾウに似た哺乳動物.マストドンなど.漸 + 新世から更新世にかけて生息.円錐状に突出した臼歯を持つ. + [ Webster's Encyclopedic Unabridged Dictionary + of the English Language ] +ミート* +大きな肉のかたまり +meat* +huge chunk of meat + 肉があっても食べられない者がいる + 求めるものを食べる者もいる + しかし私たちには肉があり,食べることができる + だから神に感謝しよう + [ Grace Before Meat, by Robert Burns ] +メデューサ +medusa + ゴルゴンの三姉妹のうち,メデューサのみが人間の姿を装いダンジョ + ンの世界に住んでいる + + ペルセウスがいっぱし成人いたしますと,ポリュデクテスは,メド + ゥサといってその国を荒らしていた恐しい怪物退治に彼をやりまし + た.メドゥサはもとは美しい乙女でありました.ことに髪の毛を何 + よりの誇りにして,アテナとその美しさを争うようなことをしたた + めに女神からすべての美を奪われて,美しい巻毛はことごとくひし + めく蛇と変えられたのでありました.彼女はとうとう残酷な怪物と + なってしまいました.そうしてその顔つきがあまり恐しいものです + から,誰でも一目見たものはみんな石になりました.メドゥサの住 + んでいる洞窟の周囲には,人間や動物の形をした石がたくさんあり + ますが,これはどうかした機会に彼女を一目見て,見るとともに石 + 化してしまったのであります.さてペルセウスはアテナとヘルメス + に可愛いがられていたので,アテナは彼女の盾を貸してくれるし, + ヘルメスはまた翼のついた靴を貸してくれました.それ故ペルセウ + スはメドゥサが眠っているあいだに,その姿をまともに見ないよう + に気をつけながら手に持った盾の中に映っているアテナの像に守護 + せられて,メドゥサに近よりました.そうして首を切り落してそれ + をアテナにあたえますと,アテナは自分の盾のまん中にメドゥサの + 首をつけました. + [ Bulfinch's Mythology, by Thomas Bulfinch ] + [ ギリシア・ローマ神話, 野上弥生子訳,岩波文庫 ] +メロン +melon + 「どうしたんだ,ウンボパ? この馬鹿者」私はズル語で叫んだ. + 「食べものと水だよ,マクマザーン」と言って彼は,ふたたびその緑 + 色のものを振ってみせた. + やっと彼が手にもっているものがわかった.メロンだった.私たちは + 野生のメロン畑の上にきていたのだ.熟しきって何千となくころがっ + ていた.「メロンだ!」と私は隣りにいるグッドに叫んだ.つぎの + 瞬間,グッドは義歯でメロンにかぶりついていた. + 食べてしまってから気がつくと,私たちはそれぞれ六個は食べていた. + 貧弱な果物だったが,私は,これほどおいしいものは食べたことがな + いような気がした. + [ King Solomon's Mines, by H. Rider Haggard ] + [ ソロモン王の洞窟, 大久保康雄訳, 創元推理文庫 ] +マーキュリー +mercury + ローマ神話で商業,交易,旅行者をつかさどる.彼は一般に,使 + 者の杖(二匹の蛇がからみついた杖)と財布を持った姿で描かれて + いる. +*ミミック +*mimic + 現代のカメレオンの祖先であり,この生き物はその周囲にあるものの + 何にでも化ける事ができる.それは物体や洞窟の要素にも化ける事が + できる.しかしながらカメレオンが他の生き物に化けて,狩りに出る + のに対し,ミミックはそれを求めて食料がやって来るのを忍耐強く待っ + ている. +*マインドフレア +*mind flayer + この生き物は人間の体を持つが,口は触手に覆われ,両手には三本の + 指を持つ.マインドフレアはテレパシーをもっており,知恵のある生 + き物,とりわけ人間を溺愛している.触手で攻撃されようものなら, + マインドフレアはゆっくりと全ての知恵を吸いとり,やがて犠牲者は + 死んでしまうだろう. +*鉱山 +mine* + ドワーフによって作られたもの.この場合の〈規定〉によれば, + この鉱山は,長年打ち棄てられているか,せいぜいわずかな生き + 残りが住んでいるだけ,という状態にあり,彼らは人間/他部族の + ドワーフ/闇の王の手先に,追い立てられた/仲間の多くを殺され + た,というような内容をごちゃごちゃと主張してくる.住人が残 + っていようといまいと,優美に掘りぬいた何層もの回廊のため, + 鉱山の内部はきわめて複雑である.ここで採掘されていたものに + ついては,必ずしもはっきりしていないことが多いが,少なくと + もある時には宝石であったと思われる.というのも,たいていの + 場合,壁面の岩に,不要なエメラルドなどが埋まっているのを見 + つけることになっているからである.金属も存在しているものの, + 鎧や武器(_目をみはるような_)の形になっている場合にかぎられ + る. + [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] + [ ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, + 原島文世・岸野あき恵訳, 東洋書林 ] +# ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, +# ダイアナ・ウィン・ジョーンズ, 原島文世・岸野あき恵訳, 東洋書林, 2004, +# pp.87-88, 鉱山 +ミノタウロス +minotaur + ミノタウロスは半牛半人の怪物である,ミノスの妻パシパエとすば + らしく美しい牡牛の間の子である. + ... + ミノタウロスが産まれたときミノスはミノタウロスを殺さなかった. + 偉大な建築家で発明家であるダイダロスが逃がれることが不可能で + ある監禁場所を彼のために作った.ダイダロスはかの有名な迷宮を + つくった.一度入るとよじれた道の出口を見つけることはできず, + 永遠に歩きつづけなければらなかった. + [ Mythology, by Edith Hamilton ] +ミトラ +mit*ra* + インドに由来する.ミトラは光の神であり,ペルシャの光の信仰であ + るアフラマズダ神の付き人に翻訳された.このことからローマの神ミ + トラスとして取り入れられている.彼は一般に空の神だけでなく,温 + 暖な気候やそよ風の力で田畑を肥やの力化身ともみなされる.「アヴ + ェスタ」によると彼は10000の目と耳をもち,白馬に引かれる馬車に + 乗っている.ミトラはゾロアスタ教によると,光と闇に力の終りなき + 戦いに関係がある.宣誓と誓約を保存する責任者であり,彼は植物や + 動物の創造者である.彼に敵対するものの長は暗黒の力であるアーリ + マンである. + [ The Encyclopaedia of Myths and Legends of All + Nations, by Herbert Spencer Robinson and + Knox Wilson ] +*ミスリル* +*mithril* + ミスリル!すべての民がこれを欲しがった.これは銅のように打ち + 延ばすことができた.またガラスのように磨くことができた.ドワ + ーフたちはこれを軽くしてしかも鍛えた鋼よりも堅い金属に作り上 + げることができた.その美しさはふつうの銀のそれに似ておるが, + ミスリルの方はくろずむこともなく,曇ることもなかった. + [ The Fellowship of the Ring, by J.R.R. Tolkien ] + [ 評論社, 瀬田貞二訳 ] +聖なる冠 +*mitre of holiness + この知性の兜は,通常の知性の兜のすべての効果を発揮し,なおかつ + 炎によるすべての攻撃から身を守る能力を有する.特別な力を使えば, + 使用者の魔力を増幅し,より多くの呪文を唱えることができるように + なる. +ミュルニール +mjollnir + ロキの挑戦に対するためドワーフのエイトリとブロックに鍛えられた + ミュルニールは不滅のウォーハンマーである.ミュルニールは2つの + 魔力をもつ.それを投げると常にトールの手に戻ってくること,そし + てトールのシャツの中におさまるまで小さくなることができることで + ある.他の神々はミュルニールこそ闘争の勝者であると判決を下した. + なぜなら,作られた全ての宝物のなかで,それだけが巨人達から神々 + を守る力も持っていたからである.伝説によれば,ミュルニールの + 成長に囲まれて,神格化の質を帯びはじめるとされる.トールは誕生, + 結婚,死から彼のヤギが復活するときにさえ浄めるためにミュルニー + ルを使用した.北欧神話では,ミュルニールはトールの人生のサイク + ルすなわち,受精,誕生,破滅,復活の統治力として表わされている. +*モールド +カビ +~slime mold +*mold + モールド,カビ,糸状菌.菌類に属する多細胞有機体,綿のような単 + 繊維組織網で構成された植物の体の典型.モールドの特色は単繊維で + の胞子の発芽に帰する.ほとんどのモールドは死体寄生である.ある + 特定の種は(例えばペニシリン,青カビ)はチーズや抗生物質を作るの + に使われる. + [ The Concise Columbia Encyclopedia ] +モーロック +モレク +mol?ch + 主はまたモーセに言われた.「イスラエルの人々に言いなさい,『イ + スラエルの人々のうち,またイスラエルのうちに寄留する他国人のう + ち,だれでもその子供をモレクにささげる者は,必ず殺されなければ + ならない.わたしは顔をその人に向け,彼を民のうちから断つであろ + う.彼がその子供をモレクにささげてわたしの聖所を汚し,またわた + しの聖なる名を汚したからである.その人が子供をモレクにささげる + とき,国の民がもしことさらに,この事に目をおおい,これを殺さな + いならば,わたし自身,顔をその人とその家族とに向け,彼および彼 + に見ならってモレクを慕い,これと姦淫する者を,すべて民のうちか + 断つであろう. + [ レビ記 20:1-5,口語訳聖書,日本聖書協会 ] +monk +* monk +grand master +master kaen +武闘家 +総師範 +カエン + ある日,将軍が仏教徒の修道士 一休(直訳すると「1・休み」)を + 彼の城での夕食に招待した.一休は豪華な袈裟は着慣れていないの + で,城に行く時も丁度良い古袈裟を着ていった.彼には「見かけは + 関係無い」. + + 彼が城につくと,2人の門番が彼の前に立ちはだかり,大声で言った. + 「このこじきめ,どこから来た! 名を名乗れ! お前にこの辺りを + うろついて良いとは言って無いぞ!」 + + 「私の名は一休僧上です.将軍の夕食に招待されたのですが.」 + + 2人の門番は注意深く修道士を調べて,そして言った. + 「嘘つきめ. 将軍様がどうしてこのようなみすぼらしい身なりの + 修道士を夕食に招くか? 彼はお前ではなく,今日の大きい式典の + 為に非常に厳粛で尊い一休を城に招いているのだ.とっとと立ち去れ!」 + + 一休は門番に彼が本当に招待された客人である事を納得させる事が出来 + なかった.なので彼は寺に戻り,夕食のために非常にきちんとした厳粛 + な豪華な袈裟に着替えた.そして彼が再び城に行くと,門番は彼が素晴 + らしい仏教徒の修道士である事を認め,礼をもって彼を迎え入れた. + + 夕食の席で,一休は料理満載な食膳の前についた.しかし,彼は料理を + 口にせず,箸でつまんでは袖に入れた.将軍は不思議に思って尋ねた. + 「これは呆れた.あなたは料理の幾つかを寺に持ち返りたいのか? + 料理人に命じて何か持ち返り用の料理を作らせるが.」「いいえ」と + 彼は答えた.「私がここを訪れました時に,この豪華な袈裟を着るまで, + 城に入るのを門番に止められましたので.貴方がお招きしたのは私では + なくこの袈裟でしょう.ですから袈裟に料理を食べさせているのです.」 + [ Dining with a General - a Zen Buddhism Koan ] + [将軍との食事 − 禅宗の公案] +猿 +monkey + 「いいか.」 + クマの声は,むし暑い夜にひびくかみなりのように,とどろいた. + 「わしはな,おまえに,ジャングルのおきてをぜんぶおしえてきた.ジャ + ングルにすむ動物すべてにあてはまるおきてを,な.だが,木の上でく + らすサルだけは,あれはべつものだ.あいつらにおきてはないんだ.ジャ + ングルの,のけものだよ.じぶんらのことばもなくて,いろんな動物の + ことばをぬすんでつかうのさ.高い木の上で待ちぶせして,のぞき見し + ながら,ぬすみ聞きするんだ.あいつらのくらしかたは,もとからわし + らとはちがうんだよ.かしらをもたないところ,なんでもすぐにわすれ + るところ,みんながちがってるんだ.そのくせ,じまんするのが大すき + で,おしゃべりときてる.おまけに,うぬぼれも強くて,じぶんたちは + ジャングルで大きな仕事ができるえらい種族だと思いこんでやがる.と + ころがだ,木の実がひとつおちたといっちゃ,ゲラゲラわらい,あとは + すっかりわすれちまうんだ.わしら,ジャングルのものは,サルどもと + はけっしてつきあわんのだぞ.やつらが口をつけたところじゃ,わしら + はぜったい水をのまん.やつらがいく場所には近づかん.やつらとは, + くいものをとるところもべつ,死に場所もべつなんだ...」 + [ The Jungle Book, by Rudyard Kipling ] + [ ジャングル・ブック, 西村孝次訳, 学習研究社 ] +ムーマク +mumak* + ハラドのムーマクは事実途方もなく大きな図体をした獣でした.か + れと同じものは今ではもう中つ国を歩いてはいません.この末の世 + にまだ生きているその同類の中に,わずかながらありし昔のかれの + 胴まわりと堂々たる姿の記憶が留められているに過ぎません.かれ + はやって来ました...その足ときたら大木のよう,とてつもなく + 大きな耳は帆のように広がり,長い鼻は今にも打ってかかろうとす + る大蛇のように持ち上がっていました.小さな赤い目は怒り狂って + います.角のような形は...ぽとぽと血を滴らせていました. + [ The Two Towers, by J.R.R. Tolkien ] + [ 評論社, 瀬田貞二訳 ] +*ミイラ +*mummy + しかし,身体に包帯をまく仕方と,軟膏および作業の途中で用い + られる他の物質のリストと,おのおのの包帯がしかるべき位置に + まかれるごとに話される力の言葉のために,我々は,M.マスペロ + によって『防腐保存の儀式』というタイトルで編集され翻訳され + た,たいへん興味深いパピルスに頼らねばならなかった.… + + 今や身体を保存するためのあらゆることがなされ,身体のすべて + の器官は,腐敗する物質を腐敗しなく変える力の言葉によって, + 未来永劫に保護されたのである.最後に身体を紫か白のリネンで + 覆えば,死者の身体はいつでも埋葬できる状態となる. + [ Egyptian Magic, by E.A. Wallis Budge ] +ミイラの包帯 +mummy wrapping + 彼は白い布---これは自分で持ってきたナプキンだった---で顔の下半 + 分を隠しており,口と顎がすっかり覆われているのだから声がくぐも + るのも当然だった.しかしホール夫人をびっくりさせたのはこんなこ + とではなかった.彼の青い色眼鏡の上の額は包帯で巻かれ,耳まで別 + の包帯で覆われているので,顔の中で出ているところといえばピンク + 色のとがった鼻だけだった.それはやや光沢のあるピンク色だった. + 着ているのは茶褐色のビロードのジャケットで,高い黒い色のリンネ + ルで縁どりした襟を立て,首を隠していた.そして十文字にかけた包 + 帯の下や隙間からふさふさした黒髪が奇妙な尾か角のようにとびだし + ていて,何とも奇怪な姿であった. + [ The Invisible Man, by H.G. Wells ] + [ 透明人間,岩波文庫,橋本槇矩 ] +*ナーガ +*ナーガの雛 +*naga* +*naja* + ナーガは蛇の体に男や女の顔を持つ神秘的な生き物である.彼らは + 自分のテリトリーと考えるところを死守する.ある種のナーガは偉 + 大な力の魔法使いによって無理矢理番兵のように仕えさせることが + できる. +なぎなた +薙刀 +naginata + 反りかえった単刃のとりつけられた日本の長刀.刃の長さは2フィート + から4フィートで,4フィートから5フィートの長さの柄につけられて + いる.なぎなたはなかご(刀身の柄に入った部分)のそばの樋の部分で + みねの部分が薄くなっているところの上部で切る.しかしそこは鋭利 + ではない.この刀の全体の断面は上部を平にした菱形になっている. + 隣隔が見えるよう,反りは柄の近くでは少ししかないかもしくは全く + なく,先端がよりはっきりするようになっている. + + 長刀にて,向ふ敵五人薙ぎふせ,六人に當る敵に逢うて,長刀中より + うち折つて捨ててげり.その後太刀を拔いて戰うに,敵は多勢なり, + 蜘蛛手・かく繩・十文字・蜻蛉返り・水車,八方すかさず切つたり + けり.向ふ敵八人切りふせ,九人に當る敵が甲の鉢に,餘りに強う + 打ち當てて,目貫の元よりちやうと折れ,くつと拔けて,河へざつ + ぶとぞ入りにける. + [ Story of Tsutsui no Jomio Meishu from Tales of Heike ] + [ 筒井浄妙明秀,平家物語 ] +ナルフェシニ +nalfeshnee + この魔神たちには爪や牙による物理的な攻撃だけでなく,魔法による + 攻撃の能力もある. +ナルゾク +nalzok + ナルゾクは,モーロック自身が戦闘に加わりたくない時に戦闘の指揮 + を任せるほどの,狡猾で信頼のおけるモーロックの忠実な戦闘副官で + ある.ナルゾクは上位の悪魔であり,アンデッドを指揮することで知 + られている.彼は権力に飢えており,密かにモーロックの地位を欲し + ている.モーロックは彼を信用していないが,自分自身の能力には自 + 信があるので,彼が有用であるが故にナルゾクに現在の地位を許すこ + とにしている. +ネアンデルタール* +neanderthal* + 1.有史以前の現代人の先祖である太古の頭蓋骨が発見された,ドイツ + のデュエッセルドルフとエルバフェルドに狭まれた谷.2. 上記に関連 + する人種. +*ネフェレト +neferet +neferet the green + 「緑のネフェレト」は隠された塔に居をかまえている.その塔に + は魔法によってしか到達できない.そこで彼女はオカルティズム + の不思議な技術を徒弟たちに教えている.長い年月にもかかわら + ず,彼女は新たな呪文,とくに空間移動を含むものを研究しつづ + けている.噂でしかないが,彼女自身がまだ徒弟だったとき,彼 + 女は偶然皮膚を緑色にかえてしまい,それ以来ずっとそのままに + しているということである. +イモリ +newt + トカゲに似た小さい動物(の種).水中で大部分を過す. + [ Oxford's Student's Dictionary of Current English ] + + 田沼の蛇のヒレ肉も, + 煮えたり,焼けたり,釜の中. + 蛙の指に,蠑〓(虫へんに原)(いもり)の目, + 蝙蝠の毛に犬の舌, + 蝮蛇(まむし)の叉舌,盲蛇(むし)の針, + 蜥蜴(とかげ)の足に,角鴟(ずく)の羽, + ひどい難儀のまじないに, + 地獄の吸物みたいに煮えろ. + 骨折苦労を倍にして, + 釜も沸き立て,火も燃えろ. + [ Macbeth, by William Shakespeare ] + [ マクベス,野上豊一郎訳,岩波文庫 ] +忍者刀 +ninja-to + 日本の幅広の剣. +ノルン +*norn + ノルンは北欧の三人の運命の女神である.女性の巨人で彼女らは素晴 + しい黄金時代を終末へと導く.彼女らは全て生まれた子供のゆりかご + に糸を垂らし贈り物を置く.彼女らの名前はウルダ,ヴェルダンディ, + スクルドであり,過去,現在,未来を現わす.ウルダとヴェルダンデ + ィは温厚だが,スクルドは冷酷で残忍である.彼女らの仕事は運命の + 糸をつむぎ,聖なるトネリコの木ユグドラシルに水をやり,常にその + まわりの大地を浄めておくことである.スクルドが激怒すると,彼女 + はしばしば緩徐の姉達のつぐんだ糸をずたずたにし仕事を大なしにす + る. + [ The Encyclopedia of Myths and Legends of All + Nations by Herbert Spencer Robinson and Knox + Wilson ] +ヌンチャク +nunchaku + 日本のフレイル. +*ニンフ +*nymph + ローマ神話やギリシャ神話に登場する女性型の生き物であるニンフは, + 川や森や池などに住んでいました.ニンフの美しさは言葉にできない + くらいです: 永遠の若さを保つこの乙女は,スマートな容姿と長くて + たっぷりとした髪,まばゆいほどの肌と完壁な歯,あざやかな唇と優 + しい目をしています.ニンフはとてもよい香りがし,彼女の長いロー + ブは,金糸のふちどりとこの世のものとは思われない壮麗な虹色の刺 + 繍によって輝いています.ニンフの振舞いは優雅で魅力的であり,そ + の頭脳は鋭く機知に富んでいます. + + 「テセウスは,彼女の声が自分を眠りの深みにひきこんでいくよ + うに感じた,歌は彼の夢の骨組みであり,その夢は恐怖にみちて + いた.悪魔の少女が彼をおいかけ,牛男が彼をつきさそうとして + いた.いたるところに血が,苦痛が,恐怖があった.しかし彼の + 頭はニンフの膝のもとにあり,ニンフの麝香は彼のそばにあり, + 彼女の声は夢をつむいでいた.そのとき彼は,彼女が,彼にやが + ておとずれるであろうおそろしいなにかを伝えるためにつかわさ + れたのだと知った.彼女の歌は警告であった.しかし彼女は彼に + 新しい種類の喜びをもたらし,そのひとつは彼のものの見方を変 + えた.そのとき,やがて英雄となるであろう少年は,とつぜんに + して,大部分の英雄が後に(なかには遅すぎるものもあるが)知る + こと,すなわち,喜びは苦痛を汚すこと,ニンフへの道は怪物に + よってふさがれるということを,知ったのである.」 + [ The Minotaur by Bernard Evslin ] +オーディン +odin + シグチュール(勝利の神),ワルファザー(スレインの父),片目, + ハンガ神(首切りの神),ファルマ神(積荷の神),ハプタ神(囚人の神) + オージンとも呼ばれる.彼は北欧の最高神で,戦い,勝利,智恵, + 予言,詩,死,空気,風,歓迎,魔法の神である. + 戦いと勝利の神として,オーディンは彼が手中にした戦士した英雄達 + の宮殿であるアースガルドのヴァルハラ宮殿に住む女性の戦士ワルキ + ューレを指揮する. + 彼女らは神の領域を最後の審判日ラグナロクにおいて氷の巨人から守 + 備する者を選ぶ. + 風の神として,オーディンは8本足の馬,スレイプニルに乗り,彼の槍 + であるグングニルを装備し天空を駆ける.通常はヒュギンとムニンと + 言うワタリガラスも同行し,彼はそれらを偵察にも用いる. + 歓迎の神として,人々のふるまいがどうであるか,あるいはオーディン + をどのように扱っているかなど彼が知りえないことを見るために,変装 + して,地上を訪ずれるのを楽しむ. + オーディンは通常片目の長い白髭と大きなつばのある帽子の歳老いた賢 + 者として描かれる(彼が片方の目をヘルの智恵の泉の番人であるミミル + に泉の一飲みとの交換のため与えたからである) +オーガ* +ogre* + この喰い意地の張った,裸の,怒っているオーガに会ったものはそ + れを簡単に忘れること--生き延びていればだが--ができません.雌 + 雄問わずオーガは3mくらいまで軽く成長します.体格や顔の表情 + はネアンデルタール人を思い浮べさせられます.その小さな点のよ + うな鋭い歯で噛みつくのです.オーガは太陽の光を直接浴びること + を嫌うので,そいつらのぼろぼろのぶかっこうな皮膚はシャツのよ + うに白いのです.そいつらは体にラードを塗ったくるのが大好きで, + たいていは腰巻き以外のものは身につけません.エルフはそのバタ + ーが腐ったような悪臭を10m先からかぎわけます. + オーガは孤独を好む生物です.ごくまれに二三人の若者をつれてい + る雌に会うことがあります.彼らはヒューマノイドの中で唯一肉食 + です.そして好みの食事は--そんなに驚くことではないが--人間の + 肉です.よい肉が得られそうだと予想されるときのみですが,彼ら + はときどきオークやゴブリンとつるみます. + [ het Boek van de Regels; Het Oog des Meesters ] +防水クローク +oilskin cloak + 当直の間,我々は衣服を点検し,悪天候に備えてあらゆるものを + こしらえ,また修繕した.我々ひとりひとりが油かタール塗りの + 防水布の服を作っていたが,それをとりだしてきて油およびター + ルのコーティングをほどこし,ステーの上につるしてかわかした. + 我々の頑丈な靴もまた,溶かしたグリスとタールを混ぜあわせた + もので厚く覆った.このようにして,我々は太平洋の暖かい太陽 + と好天を利用して,その反対の天候に備えたのである. + [ Two Years Before the Mast, by Richard Henry Dana ] +防水袋 +oilskin sack + 夏はあっというまに過ぎました.キャンプがしまる日,ブリックル先生 + はリーダーたちを集めて給料をはらいました.ルイも百ドルもらいまし + た.生まれてはじめて,じぶんでかせいだお金でした.ルイにはさいふ + もポケットもないので,ブリックル先生がひものついた防水の袋にお金 + を入れてくれました.先生はそのお金の袋を,トランペットや黒板やチョー + クや人命救助メダルといっしょに,ルイの首にかけました. + [ The Trumpet of the Swan, by E.B. White ] + [ 白鳥のトランペット, 松永ふみ子訳, 福音館書店 ] +オログ*ハイ +olog-hai + しかし,第3期の終わり頃には,今まで知られていなかったトロル族が + 南MirkWoodとモルドールの境界になる山々に現れました. + 彼らは暗黒の言葉でオログ-ハイと呼ばれました. + サウロンは彼等がどこからきたのか知らないまま,彼等を忠実な下僕に + 育てました. 彼等はトロルではなく,大きなオークだと考える者もい + ました.しかし,体も力も強い最も大きなオークと比べても,オログ- + ハイは体も心も全くといっていいほど似ていませんでした.トロル族 + は彼らの主人の邪悪な意思でいっぱいでした.堕ちた種族で,強大です + ばしこく,凶暴でずるく,石より固いのでした.古い黄昏の種族と異 + なり,彼等は太陽の光を耐えることができました. + 彼等はほとんど言葉を話しませんが,知っている言葉はバラド-デュア + の暗黒の言葉だけでした. + [ The Return of the King, by J.R.R. Tolkien ] + [ 評論社, 瀬田貞二訳 ] +賢者 +オラクル +デルファイ +oracle +delphi +p*thia + アポロンの神託所のあるパルナッソスの高くそびえる山の斜面にある + デルファイは神話で重要な部分を演じています.カスタリアはその聖 + なる泉で,セフィサスはその川です.それは世界の中心にささえられ + ており,沢山の巡礼者がギリシアはもちろん外国からもそこにやって + 来ました.他の聖堂とはくらべものになりません.真実を切望する探 + 究者により質問された疑問に対する答えはトランス状態にある尼僧の + 言葉により伝わります. + [ Mythology, by Edith Hamilton ] +オレンジ +洋ナシ +orange +pear + いったいどんな味の木の実か,とおっしゃるんですか? 残念なこと + に,味のことはうまくいいあらわせないものです.せいぜい,ほかの + くだものとくらべていうくらいですが,とれたてのグレープフルーツ + でも,これにくらべれば味がなく,いちばん汁気のあるオレンジもか + すかす.舌の上でとろける洋ナシもまだかたくて,すじっぽいともい + えるし,どれほどあまい野イチゴにせよ,これにくらべたらすっぱい + と思われました.そのうえ,たねもなく,しんもなく,虫もついてま + せん.この木の実を一度食べたあとでは,どんなおいしいものだって, + 薬みたいな味に思われるでしょう.といっても,わたしにはとてもの + べられません.みなさんがじぶんでその国にいって,じぶんで味をみ + るのでなければ,わかりませんね. + [ The Last Battle, by C.S. Lewis ] + [ さいごの戦い, 瀬田貞二訳, 岩波少年文庫 ] +ピロリスク +pyrolisk + 最初に角の向こうをちらっと見たとき,私はまたコカトリスがいるのだ + と思いました.この嫌らしい生物には迷宮に入ってから二,三回出会っ + ていました.私は頭を引っ込めると次にどうするかを考えました.どき + どきしながら,サックを叩いて確かにトカゲの死体がすぐ手の届くとこ + ろにあるのを確認しました.装備に穴や傷がないことも確かめました. + 先に行かなければならないのです.一つ深呼吸をして,数え始めました. + 三,二,一.そして角の向こうに飛び出しました.しかしそこにいたの + はコカトリスではなかったのです!突然顔の周りの皮膚が激しく焦げた + のを感じ,サックから炎が立ち昇りました.私をサックを地面に投げ捨 + て,とにかくそいつの視界から逃れるためにすばやく角の向こうに引っ + 込みました. +探索のオーブ +*orb of detection + このオーブは並はずれた力をもつ水晶玉である.持つだけで,遠視 + 能力が得られ,魔法のダメージを制限し,持つ主を魔法の矢から守る. + 能力を使うと持ち主を透明にすることができる. +運命のオーブ +orb of fate + あるものはオーディン自身がこの古代の水晶玉を作ったと言うし,他 + の者はロキが作り,オーディンのサインを真似,底に記したのだとも + 言われている.どちらにしろ,これは強力な聖器である.持つだけで + 警告の力を得,物理および魔法のダメージをオーブ自身が部分的に吸 + いとってくれる.能力を使うと,使った者を他の階へ瞬間移動させる + 力を持つ. +ゴブリンの王 +かみつき丸 +オークリスト +goblin king +orcrist + 大ゴブリンは,これを見ると,しんからおそれにうたれた,いかり + のうめき声をあげ,いならぶ兵士たちもみな,歯をくいしばり,た + てをうち,足をふみならしました.ゴブリンたちは,すぐさまその + 剣を見わけたのです.それは,ゴンドリンのよいエルフたちが山の + なかでゴブリンたちを追ったり,その町のかこみの前で戦いをした + むかし,何百何千のたくさんのゴブリンを殺した名剣です.エルフ + たちは,剣をオルクリスト,つまりゴブリン退治とよんでいました + が,ゴブリンたちはこれをただ「かみつき丸」とよびました.そし + てこの剣をにくみ,この剣を持った者をにくみました. + [ The Hobbit, by J.R.R. Tolkien ] + [ホビットの冒険,岩波少年文庫,瀬田貞二訳] +オーケス +orcus + 死霊の皇子であるオーケスには羊の頭と毒針がある.しかしながら, + 恐ろしいのは何よりその強力な魔力である.その杖は狙いをはずさ + ず,死をもたらす. +~*ゾンビ +~*ミイラ +~オークの* +オーク* +*オーク +ウルク*ハイ +~orc ??m* +~orcish barbarian +~orcish ranger +~orcish rogue +~orcish wizard +orc* +* orc +uruk*hai + オークは見たところ二足動物でゴブリンの親戚です.しかし,ゴブリ + ンよりももっと大きくもっと危険です.平均的なオークは並の知力で, + 広く筋肉質な肩,首,でっぱった額を持ち,厚く黒い毛が生えていま + す.そのしかめっつらの糸切り歯はまるでイノシシのように前を向い + ています.服には無頓着なので,そいつらは雑色の服を着るのを好み + ます.本来疑い深い性格で,オークは種族や群で生活しています.そ + いつらは地下に住みたがる傾向がありますが,もちろん地表にも住み + たがります(しかし太陽光線を好みません).オークは全ての武器,道 + 具,鎧を人間が使うように使うことができます.彼らにはものを自分 + たちでこしらえる能力なんてないので,彼らはしょっちゅうそれらを + 得るために狩りをします.ものを使えないオークの群と言うのはあり + えません. + [ het Boek van de Regels; Het Oog des Meesters ] +orion +sirius +オリオン +シリウス + オリオンはポセイドンの息子でありました.彼は美しい巨人でも + あれば,また力の強い猟人でもありました.父は,彼に海の底を + わたり歩く力をあたえました.一説には海上を渡る力だともいわ + れています. + + 彼はその後猟人となって,自分を寵愛してくれるアルテミスといっ + しょに住んでいますと,二人は結婚するのだという評判がたちま + した.女神の兄(アポロン)はたいそうそれを非難して,そんなこ + とをしてはいけないとしばしば彼女を叱りました.ある日,用心 + 深いオリオンが,水の上に頭だけを浮かべて海にもぐっています + と,アポロンは妹にそれを指し示して,お前にはとてもあの海の + 上の黒い物には射当てられまい,といいました.射手なる女神は + 運命の的を目がけて一矢を放ちました.すると,波がオリオンの + 死骸を陸に打ち寄せて来たので,アルテミスは自分の失策を泣き + 悲しみ,彼を星の中に置きました.彼はそこに巨人の星として, + 腰帯と,劒と,獅子の毛皮と棍棒を持って現われます.セイリオ + ス(狼星)という彼の犬がその後に従って,前にはプレイアス(昴 + 星)が飛んでいます. + [ Bulfinch's Mythology, by Thomas Bulfinch ] + [ ギリシア・ローマ神話, 野上弥生子訳,岩波文庫 ] +おさく +osaku + おさくは開錠のための小さな道具である. +アウル*ベア +owlbear + アウルベアはおそらく狂った魔法使いの異種交配によって作られた + 生物であり,この製造過程で致命的な本性を与えられ,アウルベ + アを作った魔法使いはもう生きていないというのはありそうなこ + とである.名前に見ればわかると思うが,アウルべアは巨大なアウル + (ふくろう)とベア(熊)を交配させたものである.毛皮と羽に覆われ + ている. +パンサー +panther + すると,山の斜面にさしかかるやいなや,そこに + 軽快で敏捷な豹が一頭あらわれた, + 皮に斑目(まだらめ)がある豹だった. + + 面と向かいあったが立ち去りもせず, + 逆に行手をさえぎろうとするから, + 引き返そうかと私は幾度も後ろを振り返った. + [ Dante's Inferno, as translated + by Henry Wadsworth Longfellow ] + [ 神曲・地獄篇,ダンテ ] + [ 平川〓(示に右)洋訳,河出世界文学全集 ] +ペリアス +pelias + コナンはするどく叫んであとずさり,仲間を押し戻した.彼らの前に + は,不滅の憎しみをその目にたたえたSathaの巨大な輝く白い姿があら + われた.コナンは狂戦士の猛攻撃にそなえて身を緊張させた.輝くファ + ゴットをあの邪悪な表情へおしこみ,その生命に切り裂く剣の一撃を + 加えようとした.しかし蛇はコナンを見ていなかった.蛇はコナンの + 肩のむこうの,ペリアスとよばれる男をにらみつけていた.ペリアス + は腕をくんで立ち,ほほえんでいた.そして,巨大な冷たい黄色い目 + から,純粋な恐怖の輝きにゆっくりと憎しみが消えていった.コナン + がそのような感情を爬虫類の目にみたことはかつて一度もなかった. + + 強風が吹きはらうような渦をまいて,大蛇は消えさった.「いったい + やつは何に怯えたんだ?」コナンが仲間を不安そうに見ながら言った. + 「うろこあるものどもは,死すべき者の目が避けるようなものを見る + のです」ペリアスが皮肉に言った.「あなたに見えるのは私の生身の + 見かけですが,やつはむきだしの魂を見たのです」 + [ Conan the Usurper, by Robert E. Howard and L. Sprague de Camp ] +つるはし +pick*ax* + 鉱山はつるはしの傷跡と + 穴でいっぱい + だが,金細工師の店をごらん + そこには,いたるところに金がある + [ Divan-i Kebir Meter 2, by Mevlana Celaleddin Rumi ] +*喰い +*piercer + 穴喰いは鍾乳石のような外観を持ち,洞窟やほら穴の天井にぶら下 + がる.体長は人間の背丈ほどに,太さは人間の太ももよりも太くな + るまでに成長し,群れをなしてぶら下がる.彼らの下を通りかかる + 生き物あらば,彼らはその存在を体熱と音で感知し,それを殺して + 喰らおうと落下してくる.しかし落下する時以外は動きは遅い. + [ the Bestiary of Xygag ] +ピラニア +piranha + これらは「群れ」をなして住んでいる.しばしば,この魚どもは川の + 浅瀬に獲物がやってくるのを待っている.そこでピラニアの大集団が + 攻撃するのである.ピラニアの大集団は大きな動物でも殺すことがで + きる….ピラニアの下の歯は上の歯のすきまにぴったりと合い,万力 + のようなものすごい噛みつきを可能にしている...ピラニアは水中 + で暴れているいかなるものにでも興味を示す. + [ http://www.animalsoftherainforest.com ] +*落し穴 +pit +spiked pit + さし迫った火刑を思うと,井戸の冷たさという考えが鎮静香油のよ + うに心に思い浮んできた.おれはその恐ろしい縁に駆けよった.目 + を見はって下を見た.赤熱した屋根の反射が遙か底から輝いていた. + だが,物狂おしくなっているときゆえ,一瞬は,おれの心も眼に見 + たものの意味を悟り得なかった.だが遂にはそれはむりやり――お + れの魂のなかに押し入ってきた――戦(おのの)く理性に焼きついた. + ああ,ものを言う声が出たらいいのだが!――ああ,恐ろしい!―― + ああ,これ以外の恐ろしさなら何でもよい! + [ The Pit and the Pendulum, by Edgar Allan Poe ] + [ 陥穽と振子, 小川和夫訳, 筑摩世界文學大系 37 ] +# 陥穽と振子, 小川和夫訳, 筑摩世界文學大系 37 ポオ ボオドレール, 筑摩書房, +# 昭和48, p.12 +穴の悪霊 +pit fiend + 穴の悪霊は,悪魔の中でも強力で,武器で2度攻撃でき,なわばり + に入り込む不注意な者の命をつかみだし,握りつぶしてしまう. +プラチナイェンダー印エクスプレスカード +platinum yendorian express card + 謎の物質で作られた古代の聖器.長方形の形状を持ち,とても薄く, + 古代ルーン文字で解読不能な文字が刻まれている.持ち歩くものに + ESPの能力を与え,全ての魔法ダメージを半分にしてくれる.また, + 魔法の矢の攻撃からも身を守ってくれる.その魔力を使うと,他の + 物体を充填することができる. +仔馬 +pony + おーい,おい!さあ,おいで!どこに行った? + 上か下か,近くか遠くか,ここかあそこか, + それとも向こうまで,さ迷い出たか? + 早耳,鼻利き,尻尾ふり, + 田吾作,ちびの白靴下, + でぶのとしより,ずんぐりや! + + [...] + + トムは小馬たちの名前を順々に呼びました.かれらは急な山ぎわを乗り + 越えてくると一列に並びました.それからトムはホビットたちにお辞儀 + をしました. + 「さあ,みな様方の小馬です!」と,かれはいいました.「こいつらは + (ある意味じゃ)お前さん方迷えるホビットよりも分別があるようだね + ―鼻が,ずっと確かだよ.こいつらはお前さん方がまともにつっこんで + 行く危険を鼻で嗅ぎ取っているし,逃げるにしても,方向を誤らずに逃 + げていく.」 + [ The Fellowship of the Ring, by J.R.R. Tolkien ] + [ 旅の仲間, 評論社, 瀬田貞二訳 ] +魔法の入口 +*portal + 鏡,絵画,立石,ストーンサークル,窓,この目的のために造られた + 特別な門など.異界への扉を通じて,大陸の遠く離れた場所への移動 + や,我々の世界との往来が可能になる.異界への扉の正確な仕組みに + 関しては,ファンタジーランド旅行公社の企業秘密となっている. + [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] + [ ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, + 原島文世・岸野あき恵訳, 東洋書林 ] +# ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, +# ダイアナ・ウィン・ジョーンズ, 原島文世・岸野あき恵訳, 東洋書林, 2004, +# p.18, 異界への扉 +ポセイドン +poseido*n + ポセイドン,海の王にして,川や泉の父,クロノスとレイアの息子 + で,ゼウス,ハデス,ヘラ,ヘスティア,デメテルの弟.ゼウスが彼 + 自身で天上の世界を受けとりハデスに地下の支配権を与えた神々の協 + 議会のくじで波の支配の階級を受けとった. + ポセイドンはいろいろなところで馬に関連づけられており,それゆえ + 馬達の神である.彼は人間に馬の乗り方や彼が創作した動物の御しか + たを教えた.彼は創始者として見られており,馬の種の守護神である. + 彼の象徴は岩をも割り,嵐を引き起したり沈めたり,地面を揺らすこ + とが可能な三又の鉾または槍である.その力ゆえ彼はまた地震の神と + もされている.肉体的にも彼は王として強靭で強力な支配者である. + [ The Encyclopedia of Myths and Legends of All + Nations, by Herbert Robinson and Knox Wilson ] +*薬* +*potion* + PORTABLE,形容詞【引用の】飲むのに適した.水は飲用に適している + と言われる.実際,水こそわれわれ人間の天然の飲料だと宣言する者 + もいる.もっとも喉の渇きという事実で周知の周期的な病気に苦しむ + 時のみ,それが美味であるのに気がつくのだが.まことにその時の水 + は妙薬である.もっとも未開の人間を除いて,水の代用品の発明くら + い,全時代を通じ,全世界の国々で,人間が莫大かつ熱心な工夫をこ + らしたものは,何ひとつとして見当たらない.水という液体に対する + 一部の人々が抱くこの嫌悪感が,人類の保存本能に基盤を置いていな + いとすれば,それは当然のことだが,非科学的である.−−つまり, + 科学がなければ,われわれ人間は,蛇とかヒキ蛙と同じになってしま + うのだ. + [ The Devil's Dictionary, by Ambrose Bierce ] + [悪魔の辞典,A.ビアス,奥田俊介,倉本護,猪狩博訳,角川文庫] +僧侶 +法王 +高僧 +尼僧 +侍者 +priest* +* priest* +acolyte + [...]というのは,二人の神父は,いかにも神父らしく信心深そうに, + 学識も豊かにのんびりと,もっとも現実離れのした神学の謎について話 + をしていたからである.エセックスのちび神父は,その丸顔をしだいに + 光を強める星に向けて,きわめて素朴にしゃべっていたが,相棒は,自 + 分には星を見上げる値打ちさえないのだといわんばかりに,うつ向いて + 話をしている.だが,これほど純粋に聖職者らしい会話は,たとえイタ + リアの白い修道院やスペインの黒い大伽藍でも耳にすることはあるまい. +  最初彼の耳に入ったのは,ブラウン神父が言いかけていた文章の末尾 + だったが,それは――「……中世の人が天は不滅なりと云ったのは,こ + ういう意味だった」と結ばれていた. +  のっぽの神父うなだれたままうなずいてからしゃべりだした――「そ + うですな,たしかに現代の不信心な連中は自分の理性に訴えましょう―― + だが,誰だってこの無限の宇宙をながめれば,われわれの頭上のどこか + に,理性がまったく不合理である宇宙がなきにしもあらずと感じるでしょ + うが」 + [ The Innocence of Father Brown, by G.K. Chesterton ] + [ ブラウン神父の童心, 第1話 青い十字架, 中村保男訳, 創元推理文庫 ] +#創元推理文庫 p32-33 +囚人 +prisoner + 俺はどこにいる? +  『村』に. + おまえはなにが欲しい? +  情報を. + おまえはどっちの味方だ? +  いずれわかる.我々は情報が欲しい…情報が… + 手に入りはしないさ. +  なんとしても手にいれてやる. + おまえは誰だ? +  新しい2番だ. + 誰が1番だ? +  おまえは6番だ. + 俺を番号で呼ぶな! 俺は自由人だ! + [ The Prisoner, by Patrick McGoohan ] +プタハ +ptah + ヌー,ネフ,ケヌビス,アメン・ネフ,ヘリー・バケフなど様々 + な名前で知られるプタハは,創造神であり職人の神である.彼は + 通常手だけが自由なぴっちりと体に合うローブを着ている姿とし + て描かれる.彼の容貌の最も特徴的なことは,顔と耳以外を覆う + 不変のスカルキャップ(小さな縁なし帽)と,生命のアンク十字架 + が上に乗っている杖である統治の杖である.彼は他にも神聖な動 + 物である雄牛の象徴でもある. +紫ワーム* +*purple worm + 無害なみみずのガルガンチュア(巨大な巨人)版.紫ワームは通常の + 冒険者をおどすポーズをとる.全てを飲みこみ,数分で儀牲者を消 + 化することが知られている.これらワームはいつも身構えており, + 地面のちょっとの振動に敏感であるが,大抵は鋭い音で目が覚める. +四足動物 +quadruped + 森をはじめいろんな場所は,単純には分類できないような沢山の四 + 本足の生き物に適している.それらは炎のブレスや死の針を持って + いないが,冒険者はそれにもかかわらず,そのような動物の爪や蹄 + や噛みつきによって何度も終焉を迎えている. +量子物理学者 +quantum mechanic + この生き物はこの世界のものではない.どこからか不思議な力が湧 + いて出るようである.動力も不明. +クアシト +quasit + クアシトは小さな邪悪な生物であり,インプに似ている.攻撃の時に + 使用する彼等の鈎爪は非常に強い毒を分泌する. +quest + 多くの(おそらくほとんどの)ツアーが,探索の旅として企画され + ている.これは大規模な宝探しのようなもので,いくつかのにせ + ものをまじえた手がかりが大陸中に散らばっており,大賢人がこ + のゲームの説明役をつとめ,探索をより楽しめるように,闇の王 + と地形が難易度を上げている. [...] + 探索が終了したのちも顧客を確保しておくため,公社はさらなる + 〈規定〉を設けている.ツーリストは探し求めるものを見出した + ことで報いられるどころか,その先なお,闇の王を打ち破るか, + 世界を救うことに着手するか,さもなければその両方を達成すべ + く励まなければならない.とはいえ,それで不都合はないのだ. + その時になれば,あなたもこの手のことがらに熟達しているだろ + うし,そもそも,探し求めるものとは,そうした目的を果たすの + に役立つよう考案されているのだから. + [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] + [ ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, + 原島文世・岸野あき恵訳, 東洋書林 ] +# ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, +# ダイアナ・ウィン・ジョーンズ, 原島文世・岸野あき恵訳, 東洋書林, 2004, +# pp.163-164, 探索 +ケツアルカトル +quetzalcoatl + アステカ・トルテカの主要な神のひとりは,偉大で賢明なケツア + ルカトルである(グアテマラではククマツ,ユカタンではククル + カンと呼ばれる).彼の姿は,羽根のはえた蛇であるが,インディ + オ建築においては最古のものと最新のものと,いずれにも見うけ + られる.…インディオの神ケツアルカトルがどのようにして「太 + 陽の昇る国」からやってきたかを語る伝説がある.彼は長く白い + ローブをまとい,ほおひげをはやしていた.彼は人々に手工業と + 慣習を教え,優れた法を制定した.彼は帝国をつくり,そこでは + トウモロコシの穂が人間と同じ高さにまで成長した.そして彼は + 色のついた綿の莢が綿の木に実るようにした.しかし何らかの理 + 由で,彼は帝国を去らねばならなかった.…だが,ケツアルカト + ルにまつわるすべての伝説は,彼がふたたび帰ってくることを約 + 束したという点は共通している. + [ Gods, Graves, and Scholars, by C. W. Ceram ] +quit* + Maltar: (…) アカデミーにきて最初の日にならった諺を思いだしたよ. + Natalie: ええ,知ってる.「勝者は決して中断しないし,中断した者 + が勝利することはありえない」ね. + Malter: なんだって? 違うよ! 「勝者は決して中断しないし,中断した + 者は地獄の炎にぶちこまれるべきだ」ってのさ. + [ Snow Day, directed by Chris Koch, + written by Will McRobb and Chris Viscardi ] +雷神 +雷田 +raijin +raiden + 雷の神のこと. +*レンジャー +ranger +* ranger + 「われら荒野の野伏たちは,孤独な人間だ.われらは野伏であり,狩猟 +  者である―といっても,常にわれらの敵の召使どもを追い求める狩猟 +  者なのです.と申すのはかれら召使どもはモルドールのみならず,こ +  こかしこに見いだされるからです. + 「ボロミアよ,ゴンドールが堅固な塔であったと申されるなら,われら +  はわれらでまた別の役割を果たしてまいった.あなた方の強固な城壁 +  や輝く剣をもってしても防ぎきれない悪しきものたちがたくさんいる +  のです.あなた方はご自分の国境の外の国々のことはほとんどご存知 +  ない.平和と自由,とあなたはいわれるか?もしわれらの存在がなけ +  れば,北の国々もこの二つのものをほとんど知ることがなかったであ +  りましょう.恐怖がかれらを滅ぼしたでありましょう.しかし,家な +  き無人の山々から,昼なお暗き森林から,暗いものたちがひそかに忍 +  び出てきても,かれらはわれらを見てたちまち逃げ失せます.もしわ +  れらドゥネダインが惰眠をむさぼっていたとしたら,あるいは一人残 +  らず死に絶えてしまってたとしたら,人はどの道を安心して通ったら +  いいのだろうか?平和な国々や,素朴な人々の家々に,夜分どのよう +  な安全が保障されているというのだろうか?」 + [ The Fellowship of the Ring, by J.R.R. Tolkien ] + [ 旅の仲間, 評論社, 瀬田貞二訳 ] +*ネズミ +rat +* rat + ねずみは尻尾の長い齧歯類である.彼等は攻撃的で雑食で順応性があ + り,しばしば病気を運ぶ. + + 「あのネズミどもは」とオブライエンは姿の見えない聴衆に向かい, + まだ演説しているように続けた.「齧歯動物に属するが肉食である. + 君も知っての通りだ.この街の貧民街で起こっている事態は君も聞い + ていることであろう.或る通りなど,母親は五分間でも,赤ん坊を一 + 人だけ家の中に放って置くことは出来ない.ネズミどもが間違いなく + 襲うからだ.奴らはあっという間に赤ん坊を骨だけにしてしまう.病 + 人や死にかけている者まで襲うのだ.奴らは人間がいつ無力になるの + か,ちゃんと見抜ける程の凄い能力を持っている」 + [ 1984, by George Orwell ] + [ 1984年,新庄哲夫訳,ハヤカワ書房 ] +オオガラス +raven + ただしこの大鴉,見事な胸像の上にひっそり据わって, + 一言を発したのみなのだ + まるでその一語に自分の魂をこめたかのようで + それ以上はまったく叫ばず,−−身じろぎもしない−− + で,しまいに私の方が呟く.”ほかの鴉たちだって来ては飛び去って + いったのだ, + 明日はこの鴉も飛び去るだろう−− + ちょうどわが希望の数々が飛び去ったように” + すると大鴉は言った,”もう二度と” + [ The Raven - Edgar Allan Poe ] + [ 対訳 ポー詩集,加島祥造編,岩波文庫 ] +*指輪 +*ring +ring of * + 三つの指輪は,空の下なるエルフの王に, + 七つの指輪は,岩の館のドワーフの君に, + 九つは,死すべき運命の人の子に, + 一つは暗き御座の冥王のために, + 影横たわるモルドールの国に. + 一つの指輪は,すべてを統べ + 一つの指輪は,すべてを見つけ, + 一つの指輪は,すべてを捕えて, + くらやみのなかにつなぎとめる. + 影横たわるモルドールの国に + [ The Fellowship of the Ring, by J.R.R. Tolkien ] + [ 評論社, 瀬田貞二訳 ] +ローブ +robe + シャツをのぞけば,袖のある唯一の衣類.3つの用途がある. + 1. 神官,巫女,僧,尼僧(尼僧院を見よ),魔法使いの公式な装 + 束として.公認表現では,神官と尼僧の長衣は_簡素であり_,巫 + 女の場合には_なびき_,魔法使いであれば_ひるがえる_.かくて, + 自分がどの相手と対峙しているのか,あなたにはわかるのである. + 2. 王が着用する.公認表現は,_ずっしりとしたひだが垂れてい + る_. + 3. 砂漠の遊牧民の装いとして. [...] + [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] + [ ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, + 原島文世・岸野あき恵訳, 東洋書林 ] +# ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, +# ダイアナ・ウィン・ジョーンズ, 原島文世・岸野あき恵訳, 東洋書林, 2004, +# p.170, 長衣 +石 +rock + ビルボは,すぐ何かやらなければならない時がきたのを,知りました. + あのちくしょうどものところへ,のぼっていくことができませんし,こ + ちらから射かける道具もありません.けれどもあたりを見まわしますと, + 昔の川ぞこだったとみえる,いまはかわいたみぞのなかに,たくさんの + 石がころがっているのを見つけました.ビルボは,石なげにかけてはた + いした名人でした.にぎりやすい,すべらかな卵がたの手ごろな石を見 + つけるのに,てまはとりませんでした.子どものころ,ビルボは,まと + に石をうちあてるれんしゅうをしたものでした.そして,ウサギやリス + や,とぶ鳥でさえも,ビルボが石を投げる見たしゅんかんに,はや電光 + のように逃げていくくらいの腕前になっていました.おとなになってか + らでさえ,たっぷり時間をかけて,輪なげや投げ矢や棒なげ,かわらけ + 投げやボーリングまで,いつもやっていましたし,もっと静かな遊びに + も,ねらって投げつけるようなことを,たくさん楽しんだものです.た + ばこの煙りの輪をあげること,なぞかけ遊び,それにこれまでお話しす + るひまがなった料理などのようなビルボの楽しみに,ものを投げること + もはいっていたのです.さて今は,ためらう時ではありません.ビルボ + が石をひろっているあいだに,クモはボンブールのところにたどりつき + ました.もうすぐ,ボンブールは殺されるでしょう.この時,ビルボは, + 投げました.石は,クモの頭をうちくだきました.クモはたちまちがく + りとして,木から落ち,地にどさとたおれて,ぜんぶの足をちぢめまし + た. + [ The Hobbit, by J.R.R. Tolkien ] + [ホビットの冒険,岩波少年文庫,瀬田貞二訳] +岩もぐら +rock mole + 岩もぐらは齧歯類の一員である.もぐらが地面に穴を掘るように岩に + 穴を掘る能力から,その名前が付けられた.彼等は,彼等が掘り進ん + だ所にあるものすべてを食べてしまうが,どのようにしてそれらを栄 + 養価に変換するのかについては未だ不明である. +盗賊 +rogue +* rogue + なにやらかすつもりかわかったぜ,ちゃあんと聞いたからな.敏活な + 耳,機敏な目,敏捷な手,っていうのは巾着切りには必要条件だ.鋭 + 敏な鼻ってやつも前提条件だ,耳や目や手のために仕事を嗅ぎ出さな + くちゃならねえからな.今年はどうやら不正直者の当たり年らしいや. + .... + だいたい王子様とあろうおかたが不正を働こうってんだろう,かわいい + お荷物をかかえておやじさんの目をかすめて逃げ出そうってんだから. + こいつを王様へご注進におよぶのが正直者のやりかただろうが,おれ + はそうはしねぇ,かくしとくのが悪党にふさわしいとなりゃぁ,そう + するほうがおれの職業に忠実ってわけだから. + [ Autolycus the Rogue, from The Winter's Tale by + William Shakespeare ] + [ 「冬物語」よりごろつきのオートリカス, + 白水ブックス,小田島尾訳 ] +ロゼ +rothe + ロゼは,光を嫌うジャコウウシに似た生物である.地衣類や苔の生え + ている地下で生活する方を好む. +ロイヤルゼリー +*royal jelly + 「『ロイヤルゼリーは…』」彼は声に出して読んだ.「『おそろしく + 滋養強壮に富む物質で,これだけを日常に摂取するだけで,ミツバチの + 幼虫は5日間で体重が1500倍にも増えます!』」 + + 「何倍ですって?」 + + 「1500倍だよ,Mabel.これを人間に当てはめたらどうなるか分かる + かい?つまり…」彼は声を落とし,身を乗り出して,小さな青白い目で + 彼女を見据え,「つまり,5日間で7ポンド半の赤ん坊が5トンになるって + ことだよ!」 + [ Royal Jelly, by Roald Dahl ] +錆の怪物 +rust monster + この奇妙な生き物は金属を食べる.こいつらは鎧を瞬く間に錆だら + けの鉄クズにしてしまう. +*サーベル +*saber +*sabre + 抜けバ玉ちるやいバをバ 皆もろ共に振あげて + きら/\/\と輝けり 敵陣近く乗り掛けて + 大砲方をなで切りす 最と目冷しき働きぞ + 煙の中に飛込みて 烈しく陣を破るなり + 太刀の早業見ごとなり 敵の軍勢たぢ/\と + 遂にさゝふる事ならず むら/\ばつとむらくづれ + 馬の頭ぞ立直す 以前に進みし六百騎 + 残るハいとゞわづかなり + [ The Charge of the Light Brigade, + by Alfred, Lord Tennyson ] + [ テニソン氏軽騎隊進撃ノ詩 ] + [ 新体詩抄, 特選名著復刻全集, 近代文学館 ] +鞍 +saddle + 騎手は馬に仕え + 牛飼いは牛に仕え + 商人は財布に仕え + 食事者は自分の食事に仕える + それが動産の時代 + おりなすべき織物,刈りとるべき穀物, + 万事は鞍の上にあり + 人はそれに乗る + [ Ode, by Ralph Waldo Emerson ] +酒 +sake + 日本の醸造酒. +サラマンダー +salamander + 何百年も昔,サラマンダーは魔法であると多くの人々は信じていた. + 中世のイギリスでは,炎はサラマンダーによって起こされると考えら + れた.彼等が湿った丸太に火をつけると,何十ものほっそりした生物 + がちょこちょこ出てきた.サラマンダーという単語は実際「炎の動物」 + という意味のギリシャ語の単語からきている. + [ Salamanders, by Cherie Winner ] +samurai +* samurai +侍 + そのときには奈良原が大剣をひねりあげて地を蹴り,駆けながら肩衣を + はねあげていた. + 奈良原が,二尺五寸藤原忠広をもって馬上の異人の左胴から腹にかけ + て斬りさげていたのは,それから一分もたたぬのちである.この男はは + み出てくる腸をおさえながら逃げ,十丁ほどむこうの松の根方にころげ + 落ち,海江田武次にトドメをさされた.他の二人もそれぞれ一刀を浴び + て遁走し,女ひとりだけはたすかった. + [ The Fox-horse, from Drunk as a Lord, by Ryotaro Shiba ] + [ きつね馬, 酔って候, 司馬遼太郎, 文芸春秋 ] +# 酔って候, 司馬遼太郎, 文芸春秋, 1965, p.186-187 +サンデスティン +sandestin + Ildefonseはテラスをはなれた.ほぼ同時に口論する声が仕事場 + のほうから聞こえた.Ildefonseはほどなくにテラスにもどった. + Osherlと2匹目のサンデスティンがついていった.それはやせ衰 + えた青い鳥に似た生物の外見を用い,6フィートほどの高さがあっ + た.Ildefonseは厳しい調子で言った.「あのふたつの生き物を + 見よ! やつらは,私やおまえがテーブルのまわりを歩くのと同 + じくらい簡単にクロノプレックスをうろつくことができる.それ + だけでなく,到着したときにそれを知らせるウィットさえもって + いる.私は閃電岩の中で眠っていたOsherlと,たるきに止まって + いたSarsemを見つけたのだ」 + … + 「問題ない」Rhialtoがいった.「彼はSarsemをもたらした.そ + してこれが彼の要求だ.概しては,Osharl,おまえはよくやった!」 + + 「では私の契約点は?」 + + 「Sarsemの証言におおいに依存するな.Sarsem,座るかね?」 + + 「この姿では,立っているほうが便利だと思います」 + + 「では,人間の姿に変化し,我々とともにテーブルでくつろがな + いかね?」 + + 「いいですね」 Sarsemは,ラベンダー色のうろこと,背中に伸 + びたポンポンのような紫の髪のふくらみをもつ,裸の若い両性具 + 有者になった.彼はテーブルの前に座ったが,飲み物は断わった. + 「この人間の姿は,典型的ではありますが,結局のところ,みせ + かけにすぎません.もしこのようなものを私の内部にとりこむよ + うなことになれば,さぞ不安になることでしょう」 + [ Rhialto the Marvellous, by Jack Vance ] +サスカッチ +sasquatch + サスカッチという名は,カナダでは1930年代までたいして有名で + はなかった.そのときブリティッシュコロンビア人の作家J.W.バー + ンズの作品にあらわれたのである.彼は自分の物語にインディア + ンの伝承をたくさん用いた.バーンズのサスカッチは,荒野に住 + む巨大なインディアンであった.彼は毛深いがそれは頭髪が長い + というだけであったし,このサスカッチは野生的で原始的な生活 + を送っていたとはいえ,完全な人間であった.バーンズのサスカッ + チはきわめて普及しているとわかった.ハリソンの町の近くには + 「サスカッチ宿」があった.ブリティッシュコロンビア州とハリ + ソンには,「サスカッチの日」という地方の祝典さえあった.長 + 年のあいだ休止されていたこの祝典は,ブリティッシュコロンビ + ア州の百年祭の一部として復活し,イベントのひとつは「サスカッ + チ狩り」となる予定であった.その狩りはいちども行なわれなかっ + た.おそらく想像だにされなかったことであろうが,それに関す + る公表は,サスカッチに出会ったと主張する人々を大勢もたらし + た.バーンズの巨大なインディアンではなく,我々がみな知るこ + とになった毛深い猿に似た生物である. + [ The Encyclopedia of Monsters, by Daniel Cohen ] +権力の笏 +*sceptre of might + この棍棒は大昔に名もない洞窟で作られ,洞窟の住人により何代もの + 間受けつがれてきたものである.これは実に強力な棍棒である.さら + に言えば,それを持つものは誰でも魔法の矢の攻撃から守られる. + 能力を使うと,回りを煽動することができる. +シミター +scimitar +  おお!そのときの父の姿,雨と降る弾丸のなかに,半月刀をかざし, + 焔硝に黒くなった顔をして立っていたアリ・テブランの姿,それは,な + んとりっぱに,なんと大きく見えたことでございましょう!敵は,先を + あらそって逃げ出したことでした! + [ The Count of Monte Cristo, by Alexandre Dumas ] + [ モンテ・クリスト伯, 山内義雄訳, 岩波文庫 ] + +# p279 岩波文庫 ,アレクサンドル・デュマ, 山内義雄訳 +サソリ +scorpio* + 蜘蛛の亜種(学名: Scorpionidae),サソリは低く長い体,先細い毒の + あるトゲのついた尻尾を持つことで見わけることができる.サソリ + は合計8本の足とはさみを持つ. + [ Van Dale's Groot Woordenboek der Nederlandse Taal ] +大蠍 +scorpius + 古くより蠍座は死,暗闇,邪悪を象徴してきた.蠍座は狩人オリオン + の殺害者だといわれている.…神々は蠍と狩人をともに星座にしたが, + たがいに二度と争わないように,天球の反対側に置いたのである.蠍 + 座が東の空に昇ると,オリオン座は西へと沈むのだ. + [ 365 Starry Nights, by Chet Raymo ] +*巻物 +*scroll +scroll * + そこでわたしは 限りない熱涙と 限りない呻吟とで, + 大波をうつむきになって見ていると, + 足もとに ひとりの老人の手が現われて, + この巻物と またこの同じ細い杖とを 握りしめていた. + わたしは苦痛の中にひざまずき――手をのばし――この宝物を + つかみ――こぶしに触れ――また離れ―― + 指をとらえた.だが さがる重みに + 圧倒され――沈んで行った.それから 嵐は衰えはじめ, + 冷たい瘧(おこり)のような暗がりを通して + 心地よい太陽が射し込んできた.わたしは懸命になって + その書物を求め,温かい大気のなかで + 念入りに その濡れた紙をはがした. + それには不思議なことが書かれていて,わたしの心を + 頁から頁へ惹きつけ,やがて ほとんど + 没我の境にはまり込んだ.そのとき 茫然として, + わたしはこれらの言葉を読み,読み返し, + さらに天空にまなこを上げ,再び読み返した. + [ Endymion, by John Keats ] + [ エンディミオン 物語詩, 出口保天訳, キーツ全詩集, 白凰社 ] +# キーツ全詩集 第一巻, 出口保天訳, エンディミオン 物語詩 巻三, 白凰社, +# 1974, p.326 +影 +shad* + 影は不死の生物である.ゾンビが不死の動く死体であるのに対し + 影は黒魔法により作られた魔法的に不死の生き物であると言う違い + がある. +呪術師カルノフ +shaman karnov + 彼の住みかである太古の洞窟を作った呪術師カルノフは絶え間なく + ティアマットの使いの攻撃からネアンデルタール人を守ろうとして + いる. +山雷精 +shan*lai*ching + 中国の山と海の神,また古い書の名前(山海経とも).怪物クンクンを + 使わし4代皇帝,尭から力を奪取しようとした. + [ Spectrum Atlas van de Mythologie ] +サメ +shark + 鮫が動くとき,暗い上部は事実上,光をまったく反射しなかった. + 肌の歯状突起は,鮫が大きな尾を鎌のように左右にないでうみだ + す力によって上昇するとき,その動きで生ずるシューッという音 + を消した.魚は水面へむかって急上昇した. + Charles Bruderは海の動きにわずかに吸いこむような引きを感じ + たが,それはとおりすぎる水流,または波の引っぱり,引き波が + 彼をくすぐっているのだと思った.彼は,それほど深くもない下 + 方の,かすかな吸いこまれる水流の音を聞くことができなかった. + 彼は,深淵から驚くべきスピードで突進してきているものを,強 + 力な初撃のために,大きく,広く,開かれた鮫のあごを,見るこ + とも聞くこともできなかった.それは他のどんな生物もなしえな + い伝統的な攻撃,深みからの爆弾であった. + [ Close to Shore, by Michael Capuzzo ] +刺刀 +shito + 日本の,刺すためのナイフ. +シュリーカー +shrieker + 猛烈な槍の一撃で,女戦士はきのこを突き刺し,沈黙させた.し + かし,もはや遅かった.警報はすでに出されていた.… + 突然彼らの前に巨大な暗い物体が奥底からそびえたち,悪臭をは + なつ巨体をあらわした.その怪物は巨大な黒いワームの一種であっ + たが,彼らが確実にわかったのはそれがほぼすべてだった. + [ The Adventurers, Epic IV, by Thomas A. Miller ] +骸骨 +skeleton + 骸骨は魔法で動く不死の生物である.影とは違い単なる人間型の骨格 + から作られた生き物である.誰もこれがなぜ真実なのかは知らないが + 暗黒技術の医師達間で受けいれられた事実になっている. +スラッシャー +傷だらけ +slasher + 「この犬の飼主は開拓者の一人で,砦から数マイル南の河岸に小屋を + 造ろうとしていた男だ」コナンが暗い顔つきで説明した. ... + 「砦へ連れもどって,傷の手当をしてやったが,元気をとりもどすと, + 森へはいって,野犬になってしまった----おお,どうした,傷だらけ! + いまでもおまえ,主人を殺したやつらを狙っているのか?」 ... + 「いっしょに連れていこう」コナンは低い声でいった.「蛮人どもが + ひそんでいたら,こいつが先に嗅ぎつけてくれるはずだ」 + ... + 犬は,丸太の山を躍り越え,茂みのなかへ跳びこんでいった.そして + そのあたりを激しくざわめかしたあと,犬は口から血をしたたらせて, + バルトゥスのかたわらへもどってきた. + ... + 「あの若者はりっぱな男だった」コナンがいった.「おれはこの酒を + あの若者の霊に捧げる.そして,怖れを知らぬ勇敢な犬のためにも!」 + といいながら,酒杯の半ばを一気に飲み,残りを床にぶちまけ,その + あと酒杯を叩き割った.異教のならわしにもとづく奇妙な哀悼の表現 + だった.「彼のために,ピクトのやつらの首を十個斬りとってやる. + 犬のためにも七つは斬ってやろう.畜生ではあるが,どんな人間より + もりっぱな戦士だった」 + [ Conan The Warrior, by Robert E Howard ] + [ コナンと古代王国の秘宝, 宇野利泰訳, 創元推理文庫 ] +変形菌 +ねばねばカビ +slime mold + 変形菌,変形カビ(ゲームではねばねばカビ).通常は菌類に分類され + る有機体だが,原生動物との類似点もある.ねばねばカビは動物のよ + うに食物を摂取し成長しながら自律運動をもつ時期と,植物のように + 不動で生殖する時期の複雑なライフサイクルを持つ.自律運動の時期 + には一般に腐った丸太の下や湿めった葉の下で見つけることができる. + それは,普通,単一のアメーバのような細胞であったり,アメーバの + ようにはびこり運動する明るく色どられた変形体と呼ばれる原形質の + 多核集団である. + [ The Concise Columbia Encyclopedia ] +スリング +sling + そのペリシテびとが立ちあがり,近づいてきてダビデに立ち向か + ったので,ダビデは急ぎ戦線に走り出て,ペリシテびとに立ち向か + った.ダビデは手を袋に入れて,その中から一つの石を取り,石投げ + で投げて,ペリシテびとの額を撃ったので,石はその額に突き入り, + うつむきに地に倒れた. + こうしてダビデは石投げと石をもってペリシテびとに勝ち,ペリシ + テびとを撃って,これを殺した.ダビデの手につるぎがなかったので, + [ サムエル記上,17:48-50,口語訳聖書,日本聖書協会 ] +*蛇 +*ヘビ +*snake +serpent +water moccasin +python +pit viper + さて,主なる神が造られた野の生き物のうちで,へびが最も狡猾であ + った.へびは女に言った,「園のうちにあるどの木からも取って食べ + るなと,ほんとうに神が言われたのですか」.女はへびに言った.「 + わたしたちは園の木の実を食べることは許されていますが,ただ園の + 中央にある木の実については,これを取って食べるな,これに触れる + な,死んではいけないからと,神は言われました」.へびは女に言っ + た.「あなたがたは決して死ぬことはないでしょう.それを食べると, + あなたがたの目が開け,神のように善悪を知る者となることを,神は + 知っておられるのです」.女がその木を見ると,それは食べるに良く, + 目には美しく,賢くなるには好ましいと思われたから,その実を取っ + て食べ,また共にいた夫にも与えたので,彼も食べた. + .... + そこで主なる神は女に言われた.「あなたは.なんということをした + のです」.女は答えた,「へびがわたしをだましたのです.それでわ + たしは食べました」.主なる神はへびに言われた. + 「おまえは,この事を,したので, + すべての家畜,野のすべての獣のうち, + 最ものろわれる. + おまえは腹で,這いあるき, + 一生,ちりを食べるであろう. + わたしは恨みをおく, + おまえと女のあいだに, + おまえのすえと女のすえとの間に. + 彼はおまえのかしらを砕き, + おまえは彼のかかとを砕くであろう」. + [ 創世記 3:1-6,13-15, 口語訳聖書,日本聖書協会 ] +スニッカーズニー +snickersnee + ああ,忘れまいぞ, + そが叫びし叫びを, + 我は歯をきしらせるや, + すらりと抜けり,わが太刀を! + -- 秩父の守,狐々 + [ ミカド, Sir W.S. Gilbert ] +倉庫番 +sokoban + 倉庫番はプレイヤーが荷物をゴールエリアに押して運ぶゲームである. + 1982年にシンキングラビット社から第一作が発売され,以来,多くのプ + ラットフォームに移植されている. + [ Xsokoban web site ] +兵士 +下士官 +副官 +指揮官 +*soldier +sergeant +lieutenant +captain + イェンダーの兵士達は戦いの技についてよく訓練されており,そのう + ちの多くは魔法使い直々に訓練されている.ある者が言うには,兵士 + は不幸にして捕らえられ,魔法使いの呪文により配下におかれている + 冒険者であるそうだ.兵士らに会って生き延びたものが言うには,彼 + らは小隊毎に行動する気性の荒い戦士である.しかしながら,彼らの + 戦闘用の装具の重さのため,普通は彼らから逃げ切ることができ,そ + うすることは賢いことだと考えられている. +*槍 +ジャベリン +*spear +javelin + −−で,えらく遮二無二ぶつかり合う.そうして,槍がパッと折れた + かと思うと,一方は楯を割り,他方は馬もろとも崩れ落ち,馬の尻尾 + からふっ飛んで首をへし折る,てなことになる.つづいてお次の志願 + 者が遮二無二に登場,ご自分の槍を折り,相手方が楯を割ってくださ + るので,こっちは馬もろとも崩れ落ちて馬の尻尾からふっ飛び,ごて + いねいに首までへし折る.するとこんどはまたべつのが選ばれ,また + もう一人,またもう一人,さらにまたもう一人というぐあいに続き, + とうとう手持ちの駒はすっかり使い果たしてしまい,さあ,いよいよ + 成績を算出するという段になると,どれが誰やらさっぱり区別がつか + ず,誰が勝ちなのかもわからない始末だ.かといって,血湧き肉躍る + 疾風怒涛のことき戦闘の図として描こうにも,フン!バカバカしい. + そんなの,色は希薄で音も立たずだ−−霧ん中で掴み合いをしてる幽 + 霊でしかねえや,ヤレヤレ,こんな貧弱な言葉数でもって,この上な + く強烈な光景でも扱ったりしたら,どういうことになるのかね?−− + たとえばのはなし,ネロ時代のローマ炎上なんてのは?いやはや,ま + ずこんなふうに言うだけだろうよ−『町は焼け落ちたり,保険金ゼロ, + 男の子が窓を突き破り,消防士は首を折れり』とね.ああ,そんなの + では恥ずかしくって絵にもならんじゃないかな! + [ A Connecticut Yankee in King Arthur's Court, by Mark + Twain ] + [ 龍口直太郎訳,創元推理文庫 ] +魔法書 +*spellbook* + ふと,テーブルに目をやると,すぐそばに<時の書>があった.タラン + は今まで,自分でその本を読んだことがなかった.タランはダルベン + が一部分しか話してくれなかったことが,この本の中にはもっと書い + てあるにちがいないと思った.ダルベンは,ずっともの思いをつづけ + ていて,頭をあげる様子はなかった.タランは立ち上がると,明るい + 日光がいっぱいのへやの中を,テーブルに近づいた.一ぴきのカブト + ムシがたてる,キチキチというものうい音が,森から聞こえてきた. + タランは,両手を本の上にのせた.しかし,すぐに,いたみを感じて, + あっ,といいながら急いで手をひいた.両手とも,クマンバチにささ + れたように,指がぴりぴりいたかった.タランは,ひょいととんで後 + ろにさがったが,そのとたん,長いすにぶつかって床にたおれた.そ + して,しょげかえって,指を口に入れた. + ダルベンがまばたきした.タランをうかがって,のんびりあくびをし + てから,いった.「コルのところへ行って,ぬり薬をもらうがよい. + そうせぬと,おそらく火ぶくれになる.」 + [ The Book of Three, by Lloyd Alexander ] + [ タランと角の王, 神宮輝夫訳, 評論社 ] +*蜘蛛 +*spider + 獲物を捕えるための網を張ることができる8本足の生物. + + 「君,ハエ食べるの?」と,ウィルバーがたまげていいました. + 「もちろんよ,ハエでも,子虫でも,バッタでも,上等なカブト虫でも, + ガでも,チョウチョウでも,味のいいアブラ虫でも,ブヨでも,小さい + カでも,大きいカでも,カトンボでも,ムカデでも,コオロギでも,お + よそ,わたしのあみにひっかかるようなだらしのないものは,何でも, + 食べるのよ,わたしだって,生きていかなければなりませんものね,そ + うでしょう?」 + 「そりゃ,そうですとも」ウィルバーはそういって,また,つづけてき + きました. + [ Charlotte's Web, by E.B. White ] + [ シャーロットのおくりもの, 鈴木哲子訳, 法政大学出版局 ] +*胞子 +*spore +*sphere + 死にたがっている者の攻撃,それは完全な防御で備えることので + きない攻撃だ. + -人間のアフォリズム + [ The Dosadi Experiment, by Frank Herbert ] +~*こん棒 +~ひっかけ棒 +*棒 +~*aesculapius +*staff +  かくてふたりは,指のはばほどもあとへひくことなく,一時間あまり + も,打ったり打たれたりのすさまじい戦いをつづけた.ふたりのからだ + は,どこもかしこも,きずだらけこぶだらけになった.それでもどっち + も「参った!」と叫ぶようすがなかった.ときどきふたりは,打つのを + やめて休んだ.そして,おたがいに腹のなかで,「おれは,こんなに強 + い六尺棒の使い手にぶつかったのは,生まれてはじめてだぞ.」と舌を + まいておどろいた. +  ついにロビンは,男のあばら骨をしたたかなぐりつけた.男の上着か + ら,ちょうどお日様にてらされた雨あがりの藁屋根のように,水煙がた + ちのぼったほどだった.このために,男はもう,あと,髪の毛一本のち + がいで,川の中へ落ちこむところだった.けれども男はすばやく立ちな + おると,目にもとまらぬ一打ちを,ロビンの頭にくらわせたので,ロビ + ンの頭からは,血がふき出した. +  ロビンは気もくるわんばかりに怒り,死にものぐるいで,相手に打ち + かかっていった.だがその男は,よくこれをふせいで,もう一つロビン + にしたたかくらわしたので,さすがのロビンも,ついに水の中へまっさ + かさまに落ちて行った. +  [ロビンフッドの愉快な冒険 村山知義・村山亜土訳 岩波書店] + [ The Merry Adventures of Robin Hood, by Howard Pyle ] +アエスキュラピスの杖 +*staff of aesculapius + この杖は全ての薬師に神聖なものと考えられている.なぜなら,生と + 死をつかさどる力を持っているからである.手にすると,それはエナ + ジードレインから持ち主を守り,さらに持ち主に回復力を与える.能力 + を使うと魔力が回復する. +*階段 +stair* + マイロは階段をのぼっていきました.最初は,すごく速く―それから, + ちょっとゆっくりと―それからもう少しすぎると,もっとゆっくりと― + そして,そのおわりのない階段を何分ものぼったころには,とうとう, + 足がほとんどあがらなくなってしまいました.マイロはふと気がつきま + した.こんなにいっしょうけんめいのぼってるのに,なかなか着かない + なあ.それに,階段の下がまだあんな近くだよ.それでも,もうしばら + くがんばってのぼりつづけました.でも,とうとう最後にはへとへとに + なって,階段のとちゅうでたおれこんでしまいました. + 「くるんじゃなかった」 + マイロはぶつぶついいました.そして,棒のようになってしまった両足 + をなげだして,はあはああらい息をつきました. + 「これ,どこまでもつづいているんだもの.これじゃ,無限の国になん + かつけっこないよ」 + 「どっちみち,いいところじゃないよ」 + だれかが,やさしい声でいいました. + 「無限の国って,すごくつかれるところだよ.おわりがないからね」 + [ The Phantom Tollbooth, by Norton Juster ] + [ マイロのふしぎな冒険, 斉藤健一訳, PHP創作シリーズ ] + +*像 +~statue trap +statue* + そのうちにとうとう,そのライオンがじっと動かないのを,ふしぎに + 思いはじめました.ライオンははじめに見かけてから1ミリも動かな + いのです.エドマンドはできるだけ片陰から出ないようにしながら, + 思い切ってすこし近よってみました.そして,ライオンの立っている + 向きからいって,かれのほうはぜんぜん見えないことがわかりました. + (「でも,もし首をこっちへむけたら,どうしよう?」と,エドマンド + は考えました.) ライオンは,何かをじっとねらってました.そして + そこに,1メートルくらいはなれたところに,背中をむけた小さい小 + 人がひとり立っていました.「やあ! では,あの小人にとびかかる + とたんに,にげだせるぞ.」とエドマンドは思いました.けれども, + やっぱりライオンは動きませんし,小人も動きません.そのうちに, + とうとうエドマンドは,白い魔女がひとびとを石にする話をきいたの + を思い出しました.きっとこれは,石のライオンなんだ――そう思っ + たひょうしに,エドマンドはライオンの背中にも頭の上にも雪がつも + っていることに気がつきました.ではもちろん,ただの立像にちがい + ない! + [ The Lion, the Witch and the Wardrobe by C.S. Lewis ] + [ ライオンと魔女, 瀬田貞二訳, 岩波少年文庫 ] +スティング +つらぬき丸 +sting + いつものように,森の一日のうす暗いあけ方の光があたりをぼおっ + とそめるころ,ビルボはようやく正気づきました.クモは,ビルボ + のすぐそばにたおれて死んでいて,剣のぬきみ真っ黒な血がこびり + ついていました.ともかく,とほうもない大グモを殺したのです! + それもやみのなかで,たったひとりで,です!魔法使いの力をかり + たのでもなければ,ドワーフたちのかせいでもありません.これが, + わがバギンズ君をたらりと変えるみなもとになりました.ビルボは + いま,ちがったひとになりかわった気がしました.胃ぶくろだけは + からっぽですのに,勇気りんりん,みなぎる熱気を感じながら,剣 + を草葉でぬぐって,さやにおさめました. + 「おまえに名まえをつけてやろう!よし,つらぬき丸とよぼう」 + とビルボは剣にいいました. + [ The Hobbit, by J.R.R. Tolkien ] + [ホビットの冒険,岩波少年文庫,瀬田貞二訳] +ストームブリンガー +stormbringer + 彼方にざわめきがきこえる.この名もなく,時もない海のたてる音に + そぐわぬ響きだった.遙か彼方ではあったが,苦悩に満ち,世にもお + そろしい細い音だった−−だが船はあたかもひきよせられるように, + その音を追っていた.音はしだいに高まる−−苦痛と絶望と,そして + 何にも増して恐怖に彩られた音は. + 古きメルニボネ帝国の名残りの全統治権をすてて逃げ出す前,エルリッ + クは,従弟イイルクーンが皮肉にも″快楽の部屋″と名づけた場所か + ら,このような響きがきこえてきたことを思った.それは魂そのもの + が逃げ場を失った者たちの声,その者には死が単なる消滅ではなく, + 永遠に,ある残忍なこの世のものならぬ主人の軛のもとにおかれ続け + ることであるような,そんな者たちの声だった.エルリックは,かれ + の救済であり,宿命でもある黒い大剣ストームブリンガーが,ひとの + 魂をのみほすとき,犠牲者らが同じ声で叫ぶのをきいたことがあった. + [ The Lands Beyond the World, by Michael Moorcock ] + [ この世の彼方の海,井辻朱美訳,早川書房 ] +須佐之男 +susano*o + 神道の混沌と天気の神,太陽神天照大神の弟,最初の神,伊邪那岐命 + の,鼻から生まれ,物理的,物質的な世界の象徴.天から追放され, + 地上に居を構える. + [ Encyclopedia of Gods, by Michael Jordan ] +短甲 +tanko + 大和時代(西暦300年から710年)の侍の鋼鉄の鎧. +天狗 +tengu + 天狗は日本の神話で最もやっかいな生き物である.半鳥半人,紅い + 尖った鼻とらんらんと光る目を持つ.天狗は家同士の不和を煽りた + て,長びかせることで悪名高かった.実は,好戦的な天狗が人間に + 初めて武器の使い方を教えたとも云われる. + [ Mythical Beasts, by Deirdre Headon (The Leprechaun Library) ] +トート +thoth + エジプトの月と智恵の神.トートは法律および科学,医学,幾何学を + 含む知識の象徴であり,象形文字の書き方を人間に教えたと言われて + いる.彼は神々の調停者や相談役として重要であり,ヘリオポリス + エネード(太陽都市エネード?)神殿の書記である.神話によれば,彼 + はセト神の頭から生まれた.彼はトキの頭を持った人間として描かれ + たり,完全なトキとして描かれたり,ときには胴に羽を覆った座った + ヒヒとして描かれている.彼は月の円板の上に載った三日月からなる + 王冠を持っている. + トートは一般に温和の象徴とされておいる.彼はまた実直に公平な + 来世へ向かう魂の記録を記載する責任者であるだけでなく2つの真理 + の館(?)の審判でもある.ピラミッドの文書はトートに反対する者の + 首を切り,心臓をもぎとると言う彼の野蛮な側面を暴露している. + [ Encyclopedia of Gods, by Michael Jordan ] +トート*アモン +thoth*amon + また人の噂によりますと,ルクサナに住まいいたすトート・アモン + というセトの大司教に反抗したツトートメスが,その大司教を転覆 + させるためとて禁断の魔力を求めにまいったよしでございますが, + .... + [ Conan the Conqueror, by Robert E. Howard ] + [ 征服王コナン,団征二訳,ハヤカワ文庫 ] +*玉座 +*throne + 思うに私は玉座の階段を見た + 霧と蒸気が私の目からそれを隠していた― + そこに座ることを許された誰かの姿もまた. + しかしすべての段と地面に散りばめられていた + かつて生者と死者が知るうちに + もっとも悲しい光景が.あわれな群集, + 病人,健康な者,老人,若者,あのかげりの前で泣き叫ぶ者ども. + 「汝は吾らが王なり, + ああ,死よ! 汝にこそ我らは嘆く」 + これらの段を私は登った.私の前の霧が + なめらかな道を示した.そして私は見つめた + 苔むした洞にひとり眠る者のかんばせを. + 天をふりあおぎ,過ぎさりし思い出を + 心楽しく思いおこしているような. + 夏の墓の,愛しい麗人! + [ Sonnet, by William Wordsworth ] +虎 +tiger + 1. よく知られた熱帯のネコ科の肉食動物(学名: Felis tigris ). + 黒い反転や縞のある黄色がかった皮を持つ.2.比喩用法: 紙に + 書いた虎,恐怖を意味する何かのようで,実際には何の効果もない. + (1946年の毛沢東の声明による) + [ Van Dale's Groot Woordenboek der Nederlandse Taal ] + + 虎よ!夜の森かげで + 赫々(あかあか)と燃えている虎よ! + 死を知らざる者のいかなる手が,眼が, + お前の畏るべき均整を造りえたのであるか? + [ The Tyger, by William Blake ] + [ イギリス名詩選,平井正穂編,岩波文庫 ] +~缶切り +~脂の缶 +*缶* +tin +tin of * +tinning kit + 「鮭ってご存知ですよね,軍曹」とNobbyが言った. + 「私が知るところでは魚だな」 + 「それが缶詰入りのスライスで売られてることも…」 + 「そう,分かるとも」 + 「ところで…全ての缶詰が同じ大きさなのはどういうわけでしょう? + 鮭って両端は細くなってますよね.」 + 「興味深い話だ,Nobby.私が思うに…」 + [ Soul Music, by Terry Pratchett ] +缶切り +tin opener + 今や生きのびた猫族は30以下であり,食糧を必死で探しながらカー + ゴデッキを後足で立ってうろついていた. + しかし食糧はなくなった. + 供給は断たれた. + 衰弱し,病を患い,猫どもは貨物室の銀の山に祈った.ミュータ + ント猫どもが異教徒なりのやりかたで信仰している,巨大にそび + えたつ大量の金属の岩が,猫どもを見わたしていた. + 泣き叫ぶ声と金切り声のただなかに,いっぴきの猫がたちあがり, + 聖なるイコンを高くかかげた.イコンは神聖なるものとして賜下 + されたものであり,いつの日かその用途が知らされるであろうも + のだった. + それはV字型の金属片で,頂部には回転ハンドルがあった. + その猫は銀の山から銀の岩をとった.他の猫どもはすくみあがり, + 冒涜に叫びをあげた. + 猫はイコンを岩の縁におき,ハンドルをまわした. + ハンドルはまわった. + 岩が開いた. + 岩の中にはトマトソースのアルファベット型スパゲティがあった. + [ Red Dwarf, by Rob Grant and Doug Naylor ] +タイタン +titan + 母なる大地ガイアはカオスから発生し,天である配偶者のウラヌス + を産んだ.ウラヌスは彼らの全ての子供を憎んだ.なぜなら彼らが + 彼自身の権威の脅威になることを恐れたからである.これらの子供, + タイタン,ギガンテス,サイクロプスは冥界に追放された.彼らの + 立腹した母親はやがてはもっとも若いタイタン,クロノス(タイム) + をはなち,父親を去勢しその地を支配するよう彼をしむけた.後に, + 彼はその息子のゼウスの挑戦を受け,彼および彼の仲間のタイタン + はオリンポスの山々から追放された. + [ Greek Mythology, by Richard Patrick ] +試金石 +touch*stone + 「金は試金石で試され,人間は金で試される.」 + [ Chilon (c. 560 BC) ] +旅行者 +*観光客 +tourist +* tourist + アンク=モルポークからチルムへ至る道は,高山をうねうねと白く抜 + ける百五十キロ近い山道だった.山を縫うように深い谷や半ば埋もれ + た岩を伝い,柑橘類が茂る涼しい緑の谷を抜け,蔓植物が蜘蛛の巣の + ようにはびこる小峡谷を,吊り橋で渡っていく.それは多くの場合, + いつにもまして,絵のように美しかった. + + “絵の様に美しい”.この表現は,魔術師リンスウィンド(<見えざ + る大学>魔法学士,《除籍》)には耳新しいものだった.黒焦げの廃 + 虚と化したアンク=モルポークを出てから覚えた言葉の一つだ. + 他に,“趣のある”というのも覚えた.“絵の様に美しい”と言うの + は−−リンスウィンドは,ツーフラワーが感激してこの表現を使った + 景色を,注意深く観察してこう定義した−−景観が恐ろしいほどに切 + り立っているということだ.“趣ある”と言うのは,時おり通り過ぎ + た村について言われた場合には,熱病に襲われ,すっかり荒れ果てた + という意味だ. + + ツーフラワーはディスクワールドはじまって以来の旅行者である. + “旅行者”というのはリンスウィンドの定義では“馬鹿”のことだ. + + [ The Colour of Magic, by Terry Pratchett ] + [ ディスクワールド騒動記,安田均訳,角川文庫 ] +タオル +towel + 『銀河ヒッチハイク・ガイド』はタオルについても語っています. + 恒星間を旅するヒッチハイカーの持ち物のなかでも,タオルはとりわ + け役に立つ品物です.まず,実用的な価値---ジャグラン・ベータ星の + 冷たい月に照らされて旅をするときは,タオルにくるまって暖をとる + ことができます.サントラギヌス第五惑星のきらきら輝く大理石の砂 + 浜では,タオルの上に寝そべって,人を酔わせる潮風を心ゆくまで吸 + い込みましょう.砂漠惑星カクラフーンの赤く輝く星々のもとでは, + タオルをかけて眠ります.かの有名な大河,モス河くだりでは,タオ + ルを筏の帆にすることもできます.トラアルには虫のような鳴き声の + 貪欲な獣が生息していますが,その眼を避けたり(というのは,こい + つはいやになるほどマヌケな獣で,あなたがこいつを見ることができ + なければ,こいつもあなたを見ることができないことになっているの + です---とまあ,きわめつけのバカなのですが,貪欲なこともこのうえ + ありません),悪臭を避けたりするにはタオルを顔に巻きつけます. + 遭難したときはタオルを振って合図できますし,もちろん,まだきれ + いだなと思ったら,身体を拭いてもいいのです. + [ The Hitchhiker's Guide to the Galaxy,by Douglas Adams ] + [ 銀河ヒッチハイク・ガイド,風見潤訳,新潮文庫 ] +*塔 +*tower + (_のしかかるような_,_暗い_)塔は,荒地にぽつんと立っており, + ほとんど例外なく魔法使いのものである.どの塔も数階建ての高 + さで,円形をしており,扉がなく,事実上窓もなく,なめらかな + 石材でできているので,よじ登ることは非常に難しい. [...] + ツアーが終わりに近づいたころ,あなたは塔におもむき,中に侵 + 入しなければならない. + [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] + [ ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, + 原島文世・岸野あき恵訳, 東洋書林 ] +# ダイアナ・ウィン・ジョーンズのファンタジーランド観光ガイド, +# ダイアナ・ウィン・ジョーンズ, 原島文世・岸野あき恵訳, 東洋書林, 2004, +# p.179, 塔 +落し扉 +trap*door + わたしはエリックをよく知っていたので,彼が自分で作り上げたさ + まざまな仕掛けに出くわすのではないか,という推測をそのとき抱 + いていた.だから彼の家にとび降りても,少しも安心してはいなか + った.わたしは彼があのマゼンデランの宮殿をどんなふうに作り変 + えたかを知っていた.この世でいちばんまっとうな建造物を,彼は + やがて悪魔の家にしてしまったのであり,そこではもはや反響によ + って盗み聞きされたり,告げ口されたりしないでは,ひとことも口 + にできなくなったのだ.あの化け物は切穴と一緒に,どんな家庭内 + のドラマを,どんな血なまぐさい悲劇を引きずっていたことか! + [ The Phantom of the Opera, by Gaston Leroux ] + [ オペラ座の怪人, 三輪秀彦訳, 創元推理文庫 ] +# オペラ座の怪人, ガストン・ルルー, 三輪秀彦訳, 創元推理文庫, 東京創元社, +# 1987, p.376 +トラッパー +trapper + トラッパーは,ダンジョンの周囲にとけこむというカメレオンのよう + な能力を持つように進化した生物である.トラッパーは非常に静かに, + そしてダンジョンの周囲にとけこみ,何の疑いも持たない生物が通り + 過ぎるまで待ち,獲物を捕獲する.トラッパーは獲物にすっぽり覆い + 被さり,消化する. +木 +tree + 私は思う + 木ほどに美しい詩を見ることはないと + 大地の甘く流れるような胸に + 飢えた口を焦がれる木よ + ひねもす神を見つめて + 葉の茂い腕を祈りにもたげる木よ + 夏になればその髪に + コマドリの巣をいただき + その胸に雪を横たえ + 親しく雨とともに生きる木よ + 詩は私のような愚者によってさえなされる + しかし木は神のみが作りうる + [ Trees - Joyce Kilmer ] +*し肉 +tripe +tripe ration + もしゼロから始めようとしたら,牛の胃の料理は大変な長仕事です. + 新鮮な牛の胃全体の料理には最低でも12時間かかりますし,いくつかの + 由緒ある料理法は24時間ほど要します. + 新鮮な牛の胃の準備には,必要なら余計な部分を除きます.徹底的に + 洗い,一晩水に浸し,塩水で30分湯通しします.再びよく洗って, + 水気を切り,カットします.料理すると,牛の胃の手触りは柔らかい + すじのようになるでしょう.よくあることですが,悲しいかな,火力が + 充分に低く保たれてないと,濡れた靴の皮のように硬くなります. + [ Joy of Cooking, by I Rombauer and M Becker ] +*トロル +*troll + トロルは,よたよたと近よってきた.みたところ,8フィート,ある + いは,それ以上はあるにちがいない.両手をうしろにぶらつかせ,ふ + とい爪のある足でかがみこんで歩くさまは,見るだに恐ろしいものだっ + た.毛のない緑色の肌が体のうえで波うち,頭部には耳まで裂けた口 + と1ヤードも突出した鼻がついていて,落ちくぼんだ眼は,黒い眼窩 + がプールのように穴をあけ,瞳孔も白眼もみえず,松明の光を吸いこ + んでしまうだけで,ひとかけらも反射しなかった. + [...] + 巨大な緑のクモのように,トロルの切断された手首が,指で這いはじ + める.盛り土した床をこえ,丸太につきあたって鉤爪をひっかけて這 + いのぼり,また下りて這いすすみ,腕の一端へたどりついた.そして, + トロルの手首は,そこにぴたりと癒着した.同時に,トロルのひしゃ + げた顔が,溶けたようにうごめき,ついに元どおりに剥ぎあわされた. + トロルは立ちあがって歯をむきだした.消えかけた松明の赤い火が, + ふとい牙を照らしだした. + [ Three Hearts and Three Lions, by Poul Anderson ] + [ 魔界の紋章, 豊田有恒訳, ハヤカワ文庫SF ] +村正* +*tsurugi of muramasa + この古の剣は,数百年の昔から幕府の指導者によって代々受け継がれ + てきた.その所有者に幸運をもたらすをいわれているが,その真の力 + は目にするも恐しい.それは所有者に反抗するすべての生物をまっぷ + たつにし,即死させる能力を持っている. +大刀 +~*muramasa +tsurugi + 剣は侍の長剣として知られており,侍が好んで使用した極めて鋭利な + 両手持ちの剣である.それは鍛えられた鉄で出来ており,決して錆び + ないように特殊な工程を経て作られている.剣はその鋭利さ故に,し + ばしばその敵を真っ二つにすることができると噂されている. +ガイド +ツーフロアー +ツゥフロア +twoflower +guide + 「リンスウィンドか!」 + + ツーフラワーがベッドから飛び出してきた.魔術師は飛びすさったが, + 顔には何とかねじれた笑顔を浮かべた. + + 「やぁ君!時間どおりだ!昼ご飯を食べたら,午後は盛りだくさんの + 計画を立ててくれてるはずだね!」 + 「えぇと−−」 + 「それはすごい!」 + リンスウィンドは深呼吸した. + 「いいかい」必死になって伝える.「昼飯はどこかよそで食おう.下 + ではちょっとした騒ぎがあったんだ」 + 「酒場の喧嘩だ!どうして起こしてくれなかったの?」 + + 「そりゃだって,君−−何だって?」 + + 「今朝はっきり言っておいたと思うんだけど,リンスウィンド.僕は + 本物のモルポークらしい生活を見てみたいんだ−−奴隷市場や,<娼 + 婦の穴蔵>,<小神の寺院>,乞食のギルド・・・それに本物の酒場 + の喧嘩」ツーフラワーの声に,行くぶん疑うような口調が加わった. + 「本当にあるよね?ほら,シャンデリアにぶら下がったり,テーブル + の上の剣を交わしたり−−蛮人フルンや<イタチ>がいつも巻き込ま + れているような出来事.つまり−−血湧き肉踊る冒険だよ!」 + + [ The Colour of Magic, by Terry Pratchett ] + [ ディスクワールド騒動記,安田均訳,角川文庫 ] +チュール +tyr + チュールという名のアース神がまだいる.この神は最も大胆な神 + と考えられている.戦いにおいて,勝敗を決めることもしばしば + あるのだ.だから,戦士はこの神に祈願するのがよい.ほかの人 + より強くて,何物をも恐れない者を,チュールのように強い,と + いう表現があるくらいだ.この神はまた非常に賢くて,賢い人を + チュールのように賢いというくらいだ.アース神たちが,フェン + リスウールヴ(狼)をそそのかして,グレイプニルという足枷をは + かせようとしたときに,チュールの勇気が証明されたのだ.その + とき,フェンリスウールヴはアース神たちが,自分を再びはなし + てくれることを,その保証として,チュールが手を口の中に差し + 込むまで,信用しなかった.そこでアース神たちが狼をはなそう + としなかったとき,狼はチュールの手を,俗に<狼の関節>と呼ば + れているところから噛み切ったのだ.それでチュールは片手しか + ないし,人々の調停者と呼ばれないのだ. + [ The Prose Edda, by Snorri Sturluson ] + [ エッダ,谷口幸男訳,新潮社] +*hulk +*ハルク + アンバーハルクは強力な地下の肉食動物で,その鉄のような爪は固い + 岩をえじきを求めて掘り抜ける.そいつらは途方もなく強い.ふくら + はぎの下方や鱗状の獣皮は筋肉がもりがっており,力強い腕と足は全 + て大きな爪がある. +*ユニコーン +ユニコーンの角 +*unicorn +unicorn horn + 人間はいつも捉えどころのないユニコーンを見てきた.頭の前に生 + えている一本のねじれた角は力強い魔除けの効果があると考えられ + てきた.ユニコーンは泥だらけの水たまりを浄化するため,角の先 + っぽをちょっと入れると言われている.人間はまた,この角で飲む + ことにより,あらゆる病気から身を守ることができ,角を煎じるこ + とができるのなら,それはあらゆる毒の中和剤となると信じてきた. + 200年前のフランスではユニコーンの角は王家の食物を毒を調べる + セレモニーに用いられていた. + + 小さい馬くらいの大きさであるが,ユニコーンは獰猛な動物で,そ + の角からの一突きは象をも殺す力がある.また,その足の俊敏さは + この群を作らない生き物を捉えることを困難にする.しかしながら, + ユニコーンは処女の手により手なづけ捉えることができる.ユニコ + ーンは処女を見ることによりおとなしくなり,頭をその女のひざに + 押しつけ魅了させられてしまう.このとき処女は金のロープで安全 + に捉えることができる. + [ Mythical Beasts, by Deirdre Headon (The Leprechaun Library) ] + [ 神話の生物, Deirede Headon(レプレコーン図書) ] + + Martinは少しビールをすすった.「ほとんどいける」と彼は言っ + た.「あんたはビールをおそろしくうまく保ってるね」 + Tlingelは笑った.「ユニコーンの角は解毒剤なんだ.それを持っ + ていればあらゆるものを治すことができる.私は温かく輝く段階 + になるまで待って,それから私の角を使って余計な部分を焼きは + らい,そのままの状態に保っているんだ」 + [ Unicorn Variations, by Roger Zelazny ] +ワルキューレ +valkyrie +* valkyrie + ワルキューレは13人の選ばれた殺人者で,天空を駆けるオーディンに + 仕える美しい女戦士である.彼女らは戦いの進行状況を見,戦いから + 戦士を選ぶ.彼等が死んだあと,処女達は戦士達にキスを与え,魂を + 戦士達にとって安息の地であるヴァルハラへと導く.酒も食事も尽き + ることなく,終末の時まで何度でも戦い,永遠の名声を得ることがで + きる. + [ The Encyclopaedia of Myths and Legends of All + Nations, by Herbert Robinson and Knox + Wilson ] +吸血* +vampire +vampire bat +vampire lord + オックスフォード英語辞典は極めて明解である: + ヴァンパイア --- 有害な本性を持った超自然的な生物(原書もしく + は通常伝来では,生き返った死体).糧を捜し求め,傷つけ,眠って + いる人間の血を吸う. +ビーナス +venus + アプロディテ(ウェヌス)は,愛と美の女神で,ゼウスとディオネのあ + いだに生まれたむすめです.ほかの説によれば,海の泡のなかから生ま + れたともいいます.アプロディテは西風に吹き送られて,波のまにまに + キュプロス(サイプラス)島に,流れつきました.そこで,四季の女神 + たちに迎えられ,美しい着物をきせられて,神々の集まっている天上の + 大広間に連れてゆかれました.アプロディテの美しさに心をうわばれた + 神々は,みんなアプロディテを自分の妻にと望みました.ゼウスは,む + すこのヘパイストスが雷をきたえあげてくれた礼として,かれにアプロ + ディテを与えました.そういうわけで,女神のなかで,一ばん美しい女 + 神が,一ばんみにくい神の妻となることになりました. + [ Bulfinch's Mythology, by Thomas Bulfinch ] + [ ギリシア・ローマ神話, 野上弥生子訳, 岩波少年文庫 ] +*ヴラド +ヴァラド +vlad* + ヴラド・ドラキュラ侯は15聖記のカルパチア山脈地方のバーガウ + (現在のルーマニア)の君主である.ルーマニアの歴史では,彼は2 + つの点でよく知られている.1つはオスマントルコのキリスト教 + 文化圏であるヨーロッパへの侵攻を防いだその統制手腕.もう1つ + は戦場での冷酷な行動である.彼のやり方に反対するものには木の杭 + を突き刺した.帽子を脱ぐのに失敗した教会の高僧を訪ね頭を釘で打 + ちつけた. +*渦 +*vortex +vortices + 純粋な精霊のエネルギーの雲の渦巻き.渦はより巨大な精霊に関係 + があると思われる.渦は触っただけではダメージを喰らうことはない + が,それらは油断している冒険者を取り込んでしまうことに注意せよ. + 不運な冒険者はこのようにして渦に飲み込まれ,渦を構成する + 精霊に身をさらし非業の死を遂げる. +ヴァロック +vrock + ヴァロックは悪魔としては比較的弱い.人間とコンドルの混血に + 似ている.噛んだり手足の爪で攻撃してくる. +脇差し +wakizashi + 侍は伝統的に二本剣を差している.脇差しは短いほうである.刀 + の項目も見よ. +~アエスキュラピス* +*杖 +wand of * +*wand + 「サルマン!」かれは声を張り上げました.その声は次第に力と権威を + 帯びてきました.「見よ,わしはお前が裏切った灰色のガンダルフでは + ない.わしは黄泉より戻った白のガンダルフじゃ.お前は今では色を持 + たぬ.わしはお前をわが賢人団から追放し,白の会議から追放する.」 + かれは片手をあげると,はっきりした冷い声でゆっくりといいました. + 「サルマン,お前の杖は折れたぞ.」メキメキと音がして,杖は杖はサ + ルマンの手の中で割れ,握りがガンダルフの足許に転げ落ちてきました. + 「行け!」ガンダルフがいいました.サルマンは一声叫び声をあげると, + 後に退き,はうように逃げて行きました. + [ The Two Towers, by J.R.R. Tolkien ] + [ 評論社, 瀬田貞二訳 ] +ワーグ +warg + 突然アラゴルンが跳び上って叫びました.「何てひどく風が吠えるだ + と!吠えているのは狼の声だ.ワーグどもが山脈の西にやって来たの + だ!」 + 「では,朝まで待つことがあろうか?」とガンダルフがいいました. + 「いった通りじゃ,追跡が始まったぞ!こうなればたとえ生きて明日 + の日の出を仰ごうと,気ちがい狼どもに後をつけられて,南への夜の + 度を続けて行こうと思う者がおるじゃろうか?」 + 「モリアまでどのくらいあるのですか?」と,ボロミアはたずねまし + た. + 「カラズラスの南西に入口が一つある.鴉が飛ぶように直線に行けば + 十五マイルばかり,狼どもが走るがごとく行けば二十マイルばかりあ + ろう.」ガンダルフがきびしい顔で答えました. + 「それでは,できれば,日が明るみ次第すぐ出かけましょう.」と, + ボロミアがいいました.「現に耳に聞く狼どもは,話で恐れるオーク + 鬼どもより悪いものです.」 + 「その通り!」アラゴルンはそういって,さやに入った剣をベルトか + らはずしました.「だが,狼の吠えるところには,オーク鬼もうろつ + いているものだ.」 + [ The Fellowship of the Ring, by J.R.R. Tolkien ] + [ 評論社, 瀬田貞二訳 ] +~ミュルニール +ウォーハンマー +~mjollnir +war*hammer + | + 激しい戦闘が周囲で行なわれているさなかに,二人はトライデント川 + の渡り場で相見えたのだった.ロバートは愛用の戦鎚をたずさえ,大 + きな枝角つきの兜をかぶっていた.そして,ターガリエン家のプリン + スは真っ黒な鎧兜に身をかため,その甲冑の胸当には,三つの頭を持 + つドラゴンの紋章がついていた.その紋章のすべてがルビーでできて + おり,日光を受けると火のようにきらめいた.かれらが何度も何度も + 旋回して激突すると,軍馬の蹄のまわりのトライデント川の水が赤く + 染まった.そしてついに,ロバートの激しい戦鎚の打撃が,ドラゴン + の紋章とその下の胸を打ち砕いた.ネッドがやっとその場面に駆けつ + けたとき,レーガーは川の中に死んで横たわっており,両軍の兵士た + ちが渦巻く川の水をかきまわして,かれの鎧から打ち落とされたルビー + を拾っていた. + [ A Game of Thrones, by George R.R. Martin ] + [ 七王国の玉座, 岡部宏之訳, 早川書房 ] +# 七王国の玉座 上, ジョージ・R・R・マーティン, 岡部宏之訳, 早川書房, 2002, p.49 +水 +water + 来る日も来る日も次の日も + そよとの風も波もなく + 動かないこと絵に描いた海の + 絵に描いた船のようじゃった. + + あちらを向いても水ばかり, + なのに船板干割れてちぢむ. + こちらを向いても水ばかり, + なのに一滴飲めはせぬ. + [ The Rime of the Ancient Mariner, by Samuel Taylor + Coleridge ] + [対訳コウルリッジ詩集,上島建吉編,岩波文庫] + [ イェイツ全詩集,鈴木弘訳,北星堂 ] +くもの巣 +web + おお,なんともつれた蜘蛛の巣を織りあげることか, + 我々が人を欺くことを学んだときから! + [ Marmion, by Sir Walter Scott ] +*ワイト +*wight + ふたたび正気づいた時,とっさには恐怖感のほかは何一つ思い出せま + せんでした.それから突然自分が囚われの身となり,絶望的な状態に + 陥ったことを知りました.フロドは古墳の中にいました.塚人がかれ + を捕えたのです.そしておそらくすでに,噂話に語られたかの塚人た + ちの身の毛のよだつような呪文をかけられてしまったのでしょう.か + れは身動きする勇気もなく,気がついたときのままの姿勢で,冷い石 + に背中をあて,胸に両手を置いてじっと横になっていました. + [ The Fellowship of the Ring, by J.R.R. Tolkien ] + [ 評論社, 瀬田貞二訳 ] +# note: need to convert player character "gnomish wizard" into just "wizard" +# in the lookup code to avoid conflict with the monster of that same name +~gnomish wizard +wizard +* wizard +apprentice +~ノームの魔法使い +魔法使い +実習生 + Ebenezum は我々がこれらの育ち過ぎた森で見いだした道の,最も + 近いものに沿って私の前を歩いていた. 数歩歩く度に彼は一休み + しなければならなかったので,それで私は,神秘的で重い道具一式 + が詰まった袋を重荷に思いつつも,彼の驚くべき歩幅に追いつく事 + ができた.彼は,いつものように,好んで,彼がしばしば言ってい + るように,素早く魔法をかける為と魔法の瞑想において思考を自由 + にする為に,何も運ばなかった. + [ A Dealing with Demons, by Craig Shaw Gardner ] +イェンダーの魔法使い +wizard of yendor + この強大な魔法使いが何歳だとか,何処から来たのとかを知るものは + いない.普通の人間より遥かに長く生きており,死なない体に退屈し + はじめていることが知られている.そして,人間とのつきあいや人間 + について考えることもやめ,はるか地の奥深くに向った.彼は,恐し + い聖器「死者の書」をもっている.それは偉大なパワーをもっている + と言う.多くの人間が魔法使いとその宝を探そうとした.が,誰も発 + 見することができず,それどころか生きて話を語るものすらいない. + この強大な魔法使いをかき乱す無謀な冒険者に苦痛あれ! +狼* +*狼 +wolf +*wolf +*wolf cub + 現代の飼い犬の祖先である狼は強力な力を毛むくじゃらの尻尾に持っ + ている.狼は,賢く,社会的生活を営む.家族または家族の集まった + 群で行動する.これらの群は獲物を狩るため協力しあう. +woodchuck +リス + UseNetの託宣者は,この問題に答えることを要求する! + + >リス(woodchuck)が木質(wood)を食える(could chuck)とすれば, + >一匹のウッドチャックはどのくらいの木質を食えるのか? + + 「なんだって!僕は*これ*をなんとかするのか!」託宣者は自分にター + ミナルを戻して,ZOT安全装置ロックをはずし,ZOTキーからガラスガー + ドをスライドさせて取り去った.「うーーむ.ちょっと変えてもらえま + すか?初心者にはZOTはとてもグラフィカルです.*僕*でさえ,ときど + き少々吐き気を催す・・」その初心者が変更すると,託宣者がコンピュー + タキーに指を乱暴に打ち付けるのが聞こえた.大きなZZZZOTTTTTの音と + オゾンの匂いがしてきた. + [ Excerpted from Internet Oracularity 576.6 ] +*ワーム +*ワームの尻尾 +クリスナイフ +ワームの歯 +*worm +long worm tail +worm tooth +crysknife + 「クリスナイフ」は死んだサンドワームから取った歯から作られ,二 + つの使い方がある.二つの使い方とは,固体と粉末である.粉末のナ + イフは粉砕を防ぐ電子のフィールドを人間の体のまわりに作る.固体 + したナイフは貯蔵用として扱う.20センチメートルくらいの長さである. + [ Dune, by Frank Herbert ] +レイス +ナズクル +wraith +nazgul + たちまち,ほかのすべての物はもとのままぼんやりと暗く見える中で, + 黒い影たちの姿だけが恐しいほどはっきり見えてきました.かれはか + れらの黒い装束の下まで見通すことができました.背の高い姿は全部 + で五つありました.二人は谷のふちに立ち,三人は前進して来るとこ + ろでした.かれらの蒼白い顔には鋭い無慈悲な目が燃えていました. + 黒いマントの下には灰色の長衣をまとっていました.灰色の顔には銀 + のかぶとがかぶせられていました.やせさらばえた手には鋼の剣が握 + られていました.かれらの視線はかれを捕え,かれを突き刺しました. + それとともにかれらはかれに向って走り出しました.死にもの狂いで + かれは自分の剣を抜きました.かれにはそれがまるで松明のように赤 + くちらちらとゆらぐように見えました.五人のうち二人が立ち止まり + ました.三人めはあとの者よりいっそう高く,長い髪をきらめかし, + かぶとの上に冠をいただいていました.かれは片手に長い剣を持ち, + もう一方の手にナイフを握っていました.ナイフもそれを握る手も蒼 + 白い光を放っていました.かれはぱっと跳び上がったかと思うと,急 + にフロドに襲いかかってきました. + [ The Fellowship of the Ring, by J.R.R. Tolkien ] + [ 評論社, 瀬田貞二訳 ] +ワンパス +wumpus + ところで,ワンパスは吸盤のついた足があるため障害に悩まされること + はなく,そして大きすぎるのでコウモリに持ち上げられることもない. + また,もし彼を射ようとして外せば,起き上がって別の洞穴に動くかも + しれない.元来ワンパスは固着性の生き物ではあるが. + [ wump (6) -- "Hunt the Wumpus" ] +ザン +xan + 前方になにがあるかを調べるため,彼らは友人の蚊「ザン」をおくり + こんだ.「おまえは道ゆく人間の血を吸う者だから,行って,シバル + バの者どもを刺してこい」と彼らは蚊に言った.蚊は地下への暗い道 + を飛んでおりていった.「死の王」の家に入ると,蚊は最初に見かけ + た人を刺した. + + …蚊はこの男も同じように刺し,彼が叫ぶと,となりにいた男が「『た + くさん集まった血』よ,どうした?」とたずねた.そこで蚊は列にそっ + て飛び,座っている男をすべて刺し,12人全員の名前を知った. + [ Popul Vuh, as translated by Ralph Nelson ] +ゾーン +xorn + 地の精霊の遠い従姉妹にあたる.ゾーンは体を構成する細胞を移動さ + せ物体の内部に浸透する能力を持つ.これにより,壁や障害物を自在 + に通り抜ける能力を持つ. +竹矢 +ya + 侍の使用する矢である.矢は真直な竹から作り,矢じりは堅い鉄で + ある. +イーノグ +yeenoghu + イーノグはノールの支配者であり,その手下が地表から一掃されて + しまったにもかかわらず,いまだに存在している.近付くと魔術弾 + を発射する.その鋭い目を単にちらりと見ただけでも,戦いにつか + れた冒険者はどうしようもなく混乱してしまうかもしれない. +イェティ +yeti + 「忌まわしい雪男」またはイエティは,20世紀の真に正体不明な巨大 + 動物のひとつである.それは大きく毛深い二足動物であり,アジアの + ヒマラヤ山脈地域に棲息している.「忌まわしい雪男」に関する話は + 大小の神秘にみたされているが,もっとも難解なことのひとつは,な + ぜそんなおそろしい名前になったか,ということである.この生物は + とりたてて忌まわしいというわけでもないし,必ずしも雪の中に住ん + でいるわけでもない.イエティというのはチベット語で,ヒマラヤ山 + 脈に実在する正体不明の動物か,あるいは山の精か悪魔を意味するよ + うだが,確かなことはわからない.そして西洋人がイエティを求めて + うろつきまわるようになって半世紀近くになってからというもの,こ + の化物にまつわる本来の土着の伝統は,ますますごちゃまぜで混乱し + たものになってしまった. + [ The Encyclopedia of Monsters, by Daniel Cohen ] +弓懸 +*yugake + 日本の革製のアーチェリーの小手である.実際には鎧とともに,親 + 指を補強するために使われた.これらの防具は実戦では革を二重に + して,親指を補強したという. +和弓 +yumi + 侍は高度なトレーニングを特殊な武器である弓に対して行なってい + る.矢の様に,弓は竹で作られている.弓矢を持つことにより,侍 + は極めて精密な殺人戦士となる. +*ゾンビ +*zombie + ゾンビ...は魂のない人間の死体であるが墓から出て,魔術によっ + て機械的な装いを受けている.-- さも生きているかのように歩き, + 演じ,動くための死の体である. + [ W. B. Seabrook ] +ズルティ +zruty + ズルティは兇暴で巨大な生物である.タトラ山の荒地に住んでいる. diff -aurbN -xCVS -xXTAGS nethack/dat/jhelp jnethack/dat/jhelp --- nethack/dat/jhelp 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/dat/jhelp 2005-01-24 06:41:04.000000000 +0900 @@ -0,0 +1,192 @@ + NetHack へようこそ! ( description of version 3.4 ) + + NetHack は20階下のどこかに隠されていると噂されている「イェンダーの魔 +よけ」を求め,ダンジョンの深みに降りて行く「Dungeons and Dragons」ふう +のゲームである. + あなたは一匹のペットを伴っている.ペットはいろいろと助けてくれたり, +いろんなことをするようにしつけることができる. + あなたは途中で便利な(時には役立たずの)道具 (魔法の品もある) や,いろ +いろなモンスターに出会う.モンスターのいる所へ体当りをすることによって +攻撃することができる.(しかし大抵の場合は離れていた方が賢明だろう) + + 言葉であなたの位置を表現するような多くのアドベンチャーゲームと違って, +NetHack はあなたのいるダンジョンのビジュアルイメージをあたえてくれる. + + + NetHack では以下の文字を使う: + + - と | 部屋の壁.開いたドアや墓のこともある. + . 床 または 出入口. + # 廊下 鉄棒 または 木.流し台(もしあれば)や + 跳ね橋のこともある. + > 次の階への階段等. + < 前の階への階段等. + @ ( ふつうは )プレーヤー または 別の人間. + ) いろんな種類の武器. + [ 服 または 鎧. + % 食べもの.(腐ってないとは限らない) + / 魔法の杖. + = 指輪. + ? 巻物. + ! 水薬. + ( 道具.(つるはし, 鍵, ランプ...) + $ 金の塊. + * 宝石 または 岩.(役に立つ場合も,無価値の場合もある) + + 閉じた扉 または 呪文の本. + ^ (見つけた後の) 罠. + " 魔除け または 蜘蛛の巣. + 0 鉄の玉. + _ 祭壇 または 鉄の鎖. + { 泉. + } 水溜り や 塵だまり + \ 豪華な王座. + ` 玉石 または 彫像. + A から Z, a から z, その他: 怪物 + I 透明または見えていない怪物が最後にいた場所 + + '/' の後に文字を入力することで,それが何を表しているのか + 見分けることができる.たとえば "/A" は,'A' は猿, + のように表示する. + + + +y k u 7 8 9 移動コマンド: + \|/ \|/ yuhjklbn: 指定された方向に1ステップ移動する. +h-.-l 4-.-6 YUHJKLBN: 壁に当たるか何かに入るまで移動する. + /|\ /|\ +b j n 1 2 3 g: 何かに出会うまで の方向に移動する. + numberpad G, 上と同じ ただし廊下の分かれ道でも気にしない. + + < 上 ^: (ここでの ^ はコントロールキーを意味する) + > 下 m: ものを拾わずに移動する. + number_pad オプションをセットすると,テンキーで移動できる. + プラットフォームによっては,Shift+数字,Meta-数字,Alt+数字で + YUHJKLBNコマンドを発動するものもある. + Control <方向> は number_pad オプションがセットされている場合 + はプラットフォームによって動いたり動かなかったりする. + +コマンド一覧: + NetHack では以下のコマンドを使うことができる. + ? ヘルプメニュー. + / シンボルが何を表しているか教える. + 位置で指定するか,アーギュメントで指定するかで選ぶ. + & コマンドの意味を教える. + < 階段を登る. (その上にいる場合のみ) + > 階段を降りる.(その上にいる場合のみ) + . 何もしない.(待つ) + _ マップで示された点に最小経路アルゴリズムで移動する + a 道具を使う.(つるはし, 鍵, ランプ…) + A すべての防具を外す. + ^A 直前に実行したコマンドを繰り返す. + c ドアを閉める. + C 特定のモンスターに名前をつける. + d 何かを落す. d7a: 'a' を7個落す. + D いくつかのものを置く.このコマンドのふるまいは2種類あり + ユーザが選択できる. + 1: + 「D」はあなたの持つアイテム全ての一覧を表示する.「+」は + 「置く」を「-」は置かないを意味する.一覧の文字をタイプ + することにより,選択,非選択を変えることができる.全ての + アイテムを選択するには「.」,非選択にするには「-」である. + スペースキーで次のページへ移動するこができる. + 2: + "どの種類のものを置きますか? [!%= au]"の質問の答えと + して,タイプを表す文字をゼロ個以上 'a' や 'u' を後に付 + けて指定できる. + Da - 確認に答えたもの以外のすべての持ちものを落す. + Du - 勘定を払っていないものだけ落す.(店の中の場合) + D%u - 勘定を払っていない食糧だけ落す. + ^D (普通はドアを)蹴る. + e ものを食べる. + E 床に文字を彫る. + E- - 指でホコリに字を書く. + f 装填されたものを射る + F 方向を指定して怪物と戦う(そこにいるかどうかは別として) + i 持ちものを表示する. + I 以下のように,持ちものの種類を選んで表示する. + I* - 持っている宝石を全部表示する. + Iu - 勘定を払っていないものを表示する. + Ix - 消費して勘定を払っていないものを表示する. + I$ - 金を勘定する. + o ドアを開ける. + O 現在のオプション設定を表示し可能なら変更する. + 変更するためのメニューが表示され,ほとんどは選択するだけ + で変更できる.通常,オプションはプレイするときに環境変数 + NETHACKOPTIONSもしくは,設定ファイル(defaults.nh, + NetHack Defaults,nethack.cnf,.jnethackrcなど)で行う. + p 買いものの勘定を払う. + P アクセサリーをつける.(指輪,魔除け,etc) + ^P 最後のメッセージをくりかえす. + (続けるとより古いメッセージを表示する) + q 何かを飲む(水薬, 水, など) + Q 装填するものを選択する. + r 巻物や呪文の本を読む. + R アクセサリーをはずす.(指輪,魔除け,etc) + ^R 画面の再表示. + s 隠されたドアや罠を探す. + S ゲームをセーブする. + t ものを投げる.または飛び道具を使う. + T 防具を外す. + ^T (出来るなら)テレポートする. + v バージョンを表示する. + V 長い形式のバージョンと,このゲームの歴史を含めて表示する. + + w 武器を身につける.w- は何も使わず素手で戦うことを意味する. + W 防具をつける. + x 左右の武器を交換する. + X 探検モードと調査モードを切り替える. + ^X 属性を表示する. + z 魔法の杖を振りかざす. + Z 呪文を唱える. + ^Z ゲームを中断する. + : ここに何があるのか見る. + ; 別な場所にある物が何かを調べる. + , 拾う. + @ pickup オプションを反転する. + ^ 直前に見付けた罠の種類を聞く + ) 使っている武器を表示する. + [ 使っている防具を表示する. + = はめている指輪を表示する. + " 身につけている魔除けを表示する. + ( 使っている道具を表示する. + * 使用している装備類を表示する. + $ 持っている金貨の数を数える. + + 知っている呪文を表示する.並び換えも出来る. + \ 発見した物の種類を表示する. + ! OSでサポートされているなら shell を実行する. + ` オリジナルモードと日本語モードを切り替える.'i','I',';', + '/'コマンドでの名前がオリジナル名になる. + # 「拡張」コマンドを指定する."#" で使えるコマンドのリス + トは "#?" で得られる.使える拡張コマンドは,nethack を + コンパイルした時のオプション,あなたのクラス,どんな種 + 類の怪物だったか,に依存する. キーボードにメタキー + (それは,他のキーと一緒に押されることで,「メタ」(8番 + 目の,または 'high')ビットをセットする) があれば,それ + と拡張コマンドの1文字目だけで呼び出す事ができる. + Alt キーも似たような効果がある. + + "number_pad" オプションがセットされている場合,いくつかの追加 + のコマンドが使えるようになる. + + h '?'と同様にヘルプを表示する. + j 別の場所に飛ぶ. + k 蹴る.(大抵の場合はドア) + l 床に置かれている箱を略奪する. + n 続いて数字を入力し,次のコマンドを何回繰り返すかを指定する. + N 物や物の型に名前をつける. + u 罠の仕掛けられているドアや物の罠を外す. + + "40." または "20s"のように,コマンドの前に繰り返し回数をつけること + ができる.もし number_pad オプションをセットしていたら"n40." また + は "n20s"のように回数の前に'n'を付けなければならない. + + + いくつかの情報は画面の下または別ウィンドウ(プラットフォームによる) + に表示される.あなたの属性,あなたの信仰,ダンジョンの何階にいる + か,いまヒットポイントをどれだけ持っているか(そして最大がいくつ + か),アーマークラスがいくつか(小さいほど良い),経験レベル,腹の + 具合がわかる.オプションとして,スペルポイント,金貨の保有数,そ + の他を見るか見ないかは自由である. + + Have Fun, and Happy Hacking! + diff -aurbN -xCVS -xXTAGS nethack/dat/jhh jnethack/dat/jhh --- nethack/dat/jhh 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/dat/jhh 2003-12-10 00:54:07.000000000 +0900 @@ -0,0 +1,110 @@ +y k u 7 8 9 移動: + \|/ \|/ yuhjklbn: 指定方向に,一歩歩く +h-.-l 4-.-6 YUHJKLBN: 指定方向に,何かにぶつかるまで歩く, + /|\ /|\ または何かの中へ入る. +b j n 1 2 3 g: 指定方向に,何かが見えるまで歩く + numberpad G: 指定方向に,何かが見えるまで歩く. + ただし,通路の分岐で止まらない. + < up ^: 上に同じ.(コントロールを押しながら) + > down m: 何もせずに移動する. + `number_pad'のオプションがセットされているなら,ナン + バーパッドを移動に使用できる. + +一般: +? help ヘルプ +#quit quit ゲームをやめる. +S save ゲームを(後で続けるために)中断する. +! sh (もしできるなら)シェルを実行する. +^Z suspend ゲームを中断する. +O options オプションを設定する. +/ whatis 画面の記号が何かを知る. +\ known 今までに発見した道具の一覧を表示する. +v version バージョンを表示する. +V history ゲームの歴史を表示する. +X explore ゲームを発見モードに切り替える. +^A again 1つ前のコマンドを実行する.(^Aはコントロールを押しな + がらAを押すことを意味する.) +^R redraw 画面を書きなおす. +^P prevmsg 前のメッセージを見る.(^Pは繰り返し使える) +` オリジナルモードと日本語モードの切り替え +# 拡張コマンド(#?でヘルプ) + +ゲーム: +^D kick 蹴る.(扉等) +^T 'port 瞬間移動.(可能なら) +a apply 道具を使う.(つるはし,鍵,カメラ等) +A armor 全ての鎧を脱ぐ. +c close 扉を閉める. +C call 怪物に名前をつける.(例えば,あなたの犬を命名する) +d drop 物を置く. d7a:aなるものを7個置く. +D Drop 種類を選んで物を置く. +e eat 何かを食べる. +f fire 装填されているものを射る. +F fight 方向を指定し戦う. +E engrave 床のほこりに文字を書く.(E- 指を使って) +i invent あなたの持ち物一覧.(あなたが持っているもの全て) +I Invent 種類を選択して持ち物一覧. + Iu: 未払の道具一覧. + Ix: 未払だが使いはたした道具一覧. + I$: お金を数える. +o open 扉を開ける. +p pay 勘定を払う.(店の中で) +P puton アクセサリを身につける.(指輪,魔除けなど) +q quaff 何かを飲む(水薬, 水, など) +Q quiver 装填するものを選択する. +r read 巻物や魔法の本を読む. +R remove アクセサリをはずす.(指輪,魔除けなど) +s search 秘密の扉,隠れた罠,怪物を探す. +t throw 武器を投げる,撃つ,射る. +T takeoff 鎧を脱ぐ. +w wield 武器を装備する.(w- 何も装備しない) +W wear 鎧を着る. +x xchange 左右の武器を交換する. +z zap 杖を振る. +Z Zap 魔法を唱える. +< up 階段を昇る. +> down 階段を降りる. +^ trap_id 罠を調べる. +),[,=,",( 現在装備している記号に対応したものを表示 +* 装備しているものを表示 +$ gold お金を数える. ++ spells 唱えることのできる魔法の一覧. +. rest 休む. +, pickup 物を拾う. +@ `pickup'(自動pickup)のオプションを切り替える. +: look 何があるかを見る. +; farlook 他に何があるか調べる.(地図上の記号を選択する) + +メタキーのあるキーボードでは以下の拡張コマンドを # のかわりにメタキー +を押しながら実行できる. + +M-a adjust 持ち物一覧の調整 +M-c chat 誰かと話す +M-d dip 何かに物を浸す. +M-e enhance 武器の技量を高めるまたは見る +M-f force 鍵をこじあける. +M-i invoke 物の特別な力を使う. +M-j jump 他の位置に飛びうつる. +M-l loot 床の上の箱の中身を略奪する. +M-m monster 怪物の特別能力を使う. +M-n name アイテムや物に名前をつける. +M-o offer 神に供物を捧げる. +M-p pray 神に祈る. +M-q quit ゲームをやめる +M-r rub ランプをこする. +(none) twoweapon 両手持ちの切り替え +M-s sit 座る. +M-t turn アンデットを土に返す. +M-u untrap 罠をはずす. +M-v version コンパイル時のオプションを表示する. +M-w wipe 顔を拭う. + +`number_pad'のオプションがオンなら,次のコマンドが可能になる. + +n これに続く数字だけ次のコマンドを実行する. +j jump 他の位置に飛びうつる. +k kick 蹴る.(扉等) +l loot 床の上の箱の中身を略奪する. +N name アイテムや物に名前をつける. +u untrap 罠をはずす.(通常はしかけられた物) + diff -aurbN -xCVS -xXTAGS nethack/dat/jhistory jnethack/dat/jhistory --- nethack/dat/jhistory 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/dat/jhistory 2003-12-10 00:54:07.000000000 +0900 @@ -0,0 +1,109 @@ + +見よ,死すべきものよ,NetHackの起源を... + +Jay Fenlasonが最初のHackを Kenny Woodland, Mike Thome および Jon Payne +の助けのもと書いた. + +Andries Brouwerはこれを大きく書き直し,Hackをまったく違うゲームに仕立て, +UNIX(tm)で動く(少なくとも)3つのバージョン(1.0.1, 1.0.2 および 1.0.3)を +Usenetで公開した. + +Don G. Knellerは Hack 1.0.3を Microsoft(tm) C および MS-DOS(tm)へ移植し, +PC HACK 1.01eを制作した.加えて DEC Rainbowグラフィックを 1.03gでサ +ポートし,少なくとも4つ以上のバージョンを制作した.(3.0, 3.2, 3.51 +および 3.6). + +P. Blackは PC HACK 3.51を Lattice(tm) Cおよび,Atari 520/1040STへ移植し, +ST Hack 1.03を開発した. + +Mike Stephensonはこれら色々なバージョンを一緒に統合し,新な機能を加え, +Nethackバージョン1.4を制作した.彼はその後1000にも及ぶ,NetHack 1.4の +改良やデバッグを重ね整え,NetHackバージョン 2.2および 2.3をリリースした. + +その後,Mikeはゲームを大幅に書き換え,調整し,Ken Arromdee, +Jean-Christophe Collet, Steve Creps, Eric Hendrickson, Izchak Miller, +Eric S. Raymond, John Rupley, Mike Threepoint および Janet Walzを含む +チームの先頭に立ち,NetHack 3.0cを制作した.同じグループがその後10のリ +ビジョンパッチをリリースし,3.0をアプデートした. + +NetHack 3.0は Eric R. Smithによって Atariに移植され,Timo Hakulinenによって +OS/2に移植され, Dabvid Gentzelによって VMSに移植された.彼ら3人および, +Kevi Darcyは後に 3.0のリビジョンを制作したメイン開発チームに合流した. + +Olaf Seibertは NetHack 2.3および 3.0を Amigaに移植した. Norm Meluch, +Stephen Spackman および Pierre Martineauは PC NetHack 3.0のオーバレイ +コードをデザインした.Johnny Leeは NetHack 3.0を Macintoshに移植した. +沢山の他のダンジョナーにより,彼らは,PC, Macintosh および Amigaに +3.0後のリビジョンを移植した. + +Mike Stephensonを先頭に,Izchak Millerおよび Janet Walzが調整し, +今や Ken Arromdee, David Cohrs, Jean-Christophe Collet, Kevin Darcy, +Matt Day, Timo Hakulinen, Steve Linhart, Dean Luick, Pat Rankin, +Eric Raymond および, Eric Smithを含む開発チームは3.0の抜本的なリビジョン +に着手した.彼らはゲームをデザインしなおし,コードの大きな改良を行なった. +彼らはマルチプルダンジョン,新しいディスプレイ,キャラクター毎のクエスト, +新しい最終試練および沢山の新しい機能を加え,NetHack 3.1を制作した. + +Ken Lorber, Gregg Wonderlyおよび Grag Olsonは Richard Addison, +Mike Passaretti および Olaf Seibertの手を借り Amigaの NetHack 3.1を開発 +した. + +Norm Meluch および Kevin Smolkowskiは Carl Schelin, Stephen Spackman +Steve VanDevenderおよび Paul Winnerの手を借り NetHack 3.1をPCに移植した. + +Jon W{tte および Hao-yang Wangは Ross Brown, Mike Engber, David Hairston, +Micheal Hamel, Jonathan Handler, Johnny Lee, Tim Lennan, Rob Menke +および Andy Swansonの手を借り Macintoshの Nethack 3.1を開発し,MPW用に +移植した.それの開発の際,Barton Houseは Think Cに移植した. + +Timo Hakulinenは NetHack 3.1を OS/2に移植した. Eric Smithは NetHack 3.1 +を Atariに移植した. Pat Rankinは Joshua Delahuntyの手を借り,NetHack 3.1 +のVMSバージョンに応じている.Michael Allisonは NetHack3.1を Windows NTに +移植した. + +Dean Luickは David Cohrsの手を借り,X11のNetHack 3.1を開発した. + + - - - - - - - - - - + +時々,堕落した人物が彼らのネットランドからゲームの手助けとなるような興 +味をそそる改良案を送ってくる.ダンジョンの神はこれら堕ちるところまで堕 +ちた人間たちの名前をきまぐれでひかえている.そのダンジョンナーたちは以 +下である: + + Adam Aronow Izchak Miller Mike Stephenson + Alex Kompel J. Ali Harlow Norm Meluch + Andreas Dorn Janet Walz Olaf Seibert + Andy Church Janne Salmijarvi Pasi Kallinen + Andy Swanson Jean-Christophe Collet Pat Rankin + Ari Huttunen Jochen Erwied Paul Winner + Barton House John Kallen Pierre Martineau + Benson I. Margulies John Rupley Ralf Brown + Bill Dyer John S. Bien Ray Chason + Boudewijn Waijers Johnny Lee Richard Addison + Bruce Cox Jon W{tte Richard Beigel + Bruce Holloway Jonathan Handler Richard P. Hughey + Bruce Mewborne Joshua Delahunty Rob Menke + Carl Schelin Keizo Yamamoto Robin Johnson + Chris Russo Ken Arnold Roderick Schertler + David Cohrs Ken Arromdee Roland McGrath + David Damerell Ken Lorber Ron Van Iwaarden + David Gentzel Ken Washikita Ronnen Miller + David Hairston Kevin Darcy Ross Brown + Dean Luick Kevin Hugo Sascha Wostmann + Del Lamb Kevin Sitze Scott Bigham + Deron Meranda Kevin Smolkowski Scott R. Turner + Dion Nicolaas Kevin Sweet Stephen Spackman + Dylan O'Donnell Lars Huttar Stephen White + Eric Backus Malcolm Ryan Steve Creps + Eric Hendrickson Mark Gooderum Steve Linhart + Eric R. Smith Mark Modrall Steve VanDevender + Eric S. Raymond Marvin Bressler Teemu Suikki + Erik Andersen Matthew Day Tim Lennan + Frederick Roeber Merlyn LeRoy Timo Hakulinen + Gil Neiger Michael Allison Tom Almy + Greg Laskin Michael Feir Tom West + Greg Olson Michael Hamel Warren Cheung + Gregg Wonderly Michael Sokolov Warwick Allison + Hao-yang Wang Mike Engber Yitzhak Sapir + Helge Hafting Mike Gallop + Irina Rempt-Drijfhout Mike Passaretti diff -aurbN -xCVS -xXTAGS nethack/dat/jopthelp jnethack/dat/jopthelp --- nethack/dat/jopthelp 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/dat/jopthelp 2005-05-06 06:13:03.000000000 +0900 @@ -0,0 +1,225 @@ +コンパイル時の指定に関わらず利用可能な真偽オプション(デフォルトは[]である.): +('O'コマンドを使用して現在のオプションの設定をチェックし,どのオプションが +あなたのバージョンにあるか知ることができる) + +autodig 掘る道具を装備して移動した場合は掘る [FALSE] +autopickup 移動したとき自動で物を拾う [TRUE] +autoquiver 何かを射るときに矢筒(など)が空の場合,適当な武器を + 装填する. [FALSE] +cmdassist 方向やその他のコマンドでエラー時にヘルプを表示する [TRUE] +confirm ペットや友好的な怪物を攻撃する前に確認する [TRUE] +DECgraphics ダンジョンにDEC/VTの罫線を使用する [FALSE] +eight_bit_tty 8-bitキャラクタを端末にそのまま送信する [FALSE] +extmenu 拡張コマンド (#) を選択するときにメニューを使用する [FALSE] +fixinv できるだけ,同じ物は同じ文字に当てる [TRUE] +help '/'コマンド時にさらなる情報を見るか確認する [TRUE] +IBMgraphics ダンジョンにIBM拡張文字を使用する [FALSE] +ignintr ブレークを含むインタラプトシグナルを無視する [FALSE] +legacy ゲーム最初にイントロダクションを表示する [TRUE] +lit_corridor 暗い回廊でもプレーヤの周囲を明るく表示する [FALSE] +lootabc 箱を開けたときにo/i/bではなくa/b/cを使う [FALSE] +mail メールデーモンの存在を許す [TRUE] +null 端末にヌルを送る. [TRUE] + 移動する物体が部屋をテレポートしているように見えるなら + ば,このオプションをオフにせよ.(強制的にディレイコード + を送るようになる) +number_pad yuhjklbnの代わりに移動にナンバーパッドを使用する [FALSE] +perm_invent 持ち物一覧をずっとウィンドウに表示しておく [FALSE] +prayconfirm #prayコマンドが実行されるときに確認する [TRUE] +pushweapon 何かを新しく装備するとき,右手の武器を左手に持ち替える [FALSE] +rawio raw I/Oの仕様を許可する [FALSE] +rest_on_space スペースバーで休憩する [FALSE] +safe_pet (わかっているなら)ペットを攻撃するのを避ける [TRUE] +showrace 自分自身を職業でなく種族で表示する [FALSE] +silent 端末のベルを鳴らさない [TRUE] +sortpack 似たような種類の物をまとめる [TRUE] +sound キャラクタが聞いたものについてのメッセージを表示する [TRUE] + (注意: これはあなたのコンピューターのオーディオ機能に + 何かをするものではない.また定期的にリセットされる.) +sparkle 魔法攻撃にレジストしたとき(火への耐性を持つ怪物に [TRUE] + 火の攻撃を行ったときなど)にエフェクトを表示する +standout --More--を太字で表示する [FALSE] +time ゲームの経過時間を表示する [FALSE] +tombstone 死んだとき墓石を表示する [TRUE] +toptenwin トップ10を標準出力ではなくウィンドウに表示する [FALSE] +travel 地図の特定の位置に最小経路アルゴリズムを用いて移動する + コマンド(普通は '_' コマンドで起動する)を有効にする [TRUE] +verbose ゲームのコメントを詳しく表示する [TRUE] + + + +コンパイル時の設定によってはさらに真偽オプションが存在する. + +コンパイル時に INSURANCE が設定されてるならば: +checkpoint 階を移動する度にゲームセーブし,可能ならばプログ [TRUE] + ラムがクラッシュしても復活できるようにする + +コンパイル時に NEWS が設定されているならば: +news スタートアップ時にゲーム管理者からのメッセージを [TRUE] + 表示する + +コンパイル時に DGKが設定されているならば: +BIOS IBM ROM BIOSを使用する [FALSE] +rawio I/Oを直接操作する(スタート時のみ設定可能) [FALSE] + +コンパイル時に EXP_ON_BTOL が設定されているならば: +showexp 経験値を表示する [FALSE] + +コンパイル時に SCORE_ON_BOTL が設定されているならば: +showscore スコアを表示する [FALSE] + +コンパイル時に TEXTCOLOR が設定されているならば: +color 画面の物の色々な色を使用する [TRUE for micros] +hilite_pet ペットを強調表示する [FALSE] + +コンパイル時に TIMED_DELAY が設定されているならば(tty インターフェースのみ): +timed_delay UNIXやVMSではディスプレイへ表示をポーズする代りに [TRUE] + タイマーを使う.MSDOSで termcapライブラリを使用し + ない場合は,表示をポーズのあるなしにかかわらず + タイマーが使われる. + +コンパイル時に USE_TILES が設定されているならば (MSDOS プロテクトモードのみ): +preload_tiles ゲーム開始時にタイルを予め RAM に読み込むかを制御する. + これによりタイルグラフィックの性能が向上するが, + より多くのメモリを使う. [TRUE] + +任意の真偽オプションは'!'や'no'をつけることにより否定できる. + +パラメータつきオプションは option_name:option_value のように既述する. +漢字コードは内部コードにする必要がある.(普通はEUC) + +ゲーム中に設定できるパラメータつきオプションは: + +boulder 巨岩の文字を他のものに変える [`] +disclose ゲーム終了時に見る情報の種類 [all] +fruit 好物の果物の名前 [slime mold] + (基本的にNetHackが気まぐれで使ってきた) +menustyle 複数オブジェクトを選択するときのユーザーインタフェース + Traditional -- 1 つのアイテムを迅速に選択 + Combination -- 対象とするクラスを迅速に選択しメニュー表示 + Partial -- クラス選択を使用しない + Full -- 対象とするクラスをメニューで選択し, + オブジェクトをメニューで + 最初の一文字('T', 'C', 'P', 'F')で決定.'N' は 'T' + と同様の意味.[Full] +packorder 背負い袋内の物の順番を決めるシンボル [")[%?+!=/(*`0_] + (いくつかの物体しか特定しない場合,残りのはデフォルトの + 順番に並ぶ) +pickup_burden 何かを持ちあげようとしてふらめく状態になったときに,続けるか + どうかの確認をする.(通常:U,よろめき:B,圧迫:S,限界:N, + 荷重:N,超過:T) [B] +pickup_types 自動で拾いあげる物のシンボル [all] +runmode (様々な移動コマンドやトラベルコマンドによって)複数マス移動する + 場合に地図ウィンドウを更新する頻度を指定する: + teleport -- 移動が終了するまで更新しない; + run -- 時々地図を更新する (間隔は 7 マス); + walk -- 一歩毎に地図を更新する; + crawl -- walk と同様だが、一歩毎にウェイトを入れる; + (これは画面表示にのみ作用し,実際の移動には影響しない.) [run] +scores ゲーム終了時に見るスコアの種類 [!own/3 top/2 around] + トップスコア,トップスコアの周辺,あなた自身のスコアの + 組み合せを選ぶ. +suppress_alert 例えばゲーム終了コマンドは以前は 'Q' だったが今は #quit、 + といった、ゲームプレイやユーザーインターフェースのバージョン + 間の違いに関する警告メッセージを無効化する. + (例: suppress_alert:3.3.1 とすると、このバージョン以前に加えら + れた警告メッセージが停止される.) [(none)] +kcode 端末の漢字コード [EUC] + +スタート時にのみ設定できるパラメータつきオプションは: + +align ゲームスタート時の属性(align:lawful, align:neutral, align:chaotic + のいずれか).最初の一文字を指定するだけでよい.[RANDOM] +catname 冒険を供にする最初の猫の名前 [NONE] +dogname 冒険を供にする最初の犬の名前 [NONE] +dungeon + ダンジョンを描画するためにデフォルトの代わりに用いるシンボルのリス + ト. + シンボルは沢山の処理をこなせるようになっている, + コントロールキャラクタ ^xやメタキャラクタ \Mxはもちろん + \nや \081のような C言語ライクなエスケープを使える. + 普通, \は次の文字を強制的に文字通りにする.デフォルトのシン + ボルの多くが重複され使用されているので,ここではいくつかの注 + 意とともにシンボルの代りに名前を与える: + + stone (固い岩,普通は ' ' ) + vwall hwall tlcorn trcorn blcorn brcorn (部屋の壁) + crwall tuwall tdwall tlwall trwall (まがりくねった迷路の壁) + nodoor vodoor hodoor (なし,垂直,水平の開いた扉) + vcdoor hcdoor (垂直,水平の閉じた扉) + irocnbars tree room darkcorr litcorr + upstair dnstair upladder dnladder + altar grave throne sink fountain pool ice lava + vodbridge hodbridge (垂直,水平の開いた跳ね橋) + vcdbridge hcdbridge (垂直,水平の降りた跳ね橋) + air cloud water + default: \ |--------||.-|++.##<><>_\\#{}.}..##\ #} +effects + dungeon 同様だが,特殊効果の描画に使われるもの. + vbeam hbeam lslant rslant (普通は杖のビーム) + digbeam flashbeam (穴掘りとカメラの特殊なビーム) + boomleft boomright (ブーメラン) + ss1 ss2 ss3 ss4 (防御の課程) + sw_topl, sw_topm, sw_topr, (飲み込まれたときの上段) + sw_midl, sw_midr, (飲み込まれたときの中段) + sw_botl, sw_botm, sw_botr (飲み込まれたときの下段) + extl extm extr (爆発の上段) + exml exmm exmr (爆発の中段) + exbl exbm exbr (爆発の下段) + default: |-\\/*!)(0#@*/-\\||\\-//-\\|\ |\\-/ +gender ゲーム開始時の性別(gender:male または gender:female).最初の + 1 文字を指定するだけでよい.male や female オプションも使用でき + るが,gender オプションが優先する. +horsename 冒険を供にする最初の馬の名前 [NONE] +menu_* メニューコマンドで使用する一文字のキャラクタ.以下にあるのは + 全てのコマンドのメニューである.それぞれに続く( )内文字の意味 + は次の通り: 'x' = x11, 't' = tty, 'g' = Gem, 'a' = Amiga. + menu_deselect_all 全てのアイテムを非選択 [-](gxta) + menu_deselect_page 現在表示されているページのアイテムを非選択 [\](gta) + menu_first_page メニューの最初のページへ [^](gta) + menu_invert_all 全てのアイテムを反転 [@](gxta) + menu_invert_page 現在表示されているページのアイテムを反転 [~](gta) + menu_last_page メニューの最後のページへ [|](gta) + menu_next_page 次のメニューのページへ [>](gta) + menu_previous_page 前のメニューのページへ [<](gta) + menu_search メニューの検索 [:](gxa) + menu_select_all 全てのアイテムを選択 [.](gxta) + menu_select_page 現在表示されている全てのアイテムを選択 [,](gta) +monsters + dungeon同様,怪物のためのシンボル. + デフォルト: abcdefghijklmnopqrstuvwxyz + ABCDEFGHIJKLMNOPQRSTUVWXYZ@\ \\&;:~] +msghistory 先頭行に表示されたメッセージ履歴の保存数 [20] +name あなたの名前 [システムかあなたに名前を尋ねて得られたもの] +objects dungeon同様,オブジェクトのシンボル + デフォルト: ])[="(%!?+/$*`0_. +pettype あなたのキャラクタがどちらも使えるなら,あなたの好きな + ペットの種類(猫か犬か).'none' とするとペットなしになる.[RANDOM] +race ゲーム開始時の種族 (例 race:Human, race:Elf) [RANDOM] +role ゲーム開始時の職業 (例 race:Barbarian, role: Valk) + 最初の一文字を指定するだけでよいが,単に最初にマッチした + 職業を選ぶだけである.完全に識別可能な文字を記述すること + をお薦めする.名前の後に職業を指定することも可能であるが, + (例 Vic-V)roleオプションが優先する. +traps + dungeon同様,罠のためのシンボル. + arrow_trap dart_trap falling_rock_trap squeaky_board + bear_trap land_mine rolling_boulder_trap sleeping_gas_trap + rust_trap fire_trap pit spiked_pit hole trap_door + teleportation_trap level_teleporter magic_portal web statue_trap + magic_trap anti_magic_trap polymorph_trap + デフォルト: ^^^^^^^^^^^^^^^^^"^^^^ +windowtype 使用するウインドゥシステム [システム依存] + +コンパイル時に TTY_GRAPHICS が設定されているならば: +msg_window 使用するメッセージウィンドウの種類: + single -- 一度に 1 メッセージずつ + full -- 保存されている全てのメッセージを降るウィンドウで表示 + reverse -- full と同様だが、新しいメッセージから順に表示 + combination -- 1 メッセージを 2 回、その後は full + default: single + +オプションの例: +!autopickup,!tombstone,name:Gandalf,scores:own/3 top/2 around +female,nonews,dogname:Rover,dungeon: |--------||.-|++.##<><>_\\#{}.}..## #} +rest_on_space,!verbose,menustyle:traditional diff -aurbN -xCVS -xXTAGS nethack/dat/joracles.txt jnethack/dat/joracles.txt --- nethack/dat/joracles.txt 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/dat/joracles.txt 2003-12-10 00:54:07.000000000 +0900 @@ -0,0 +1,138 @@ +----- +汝その杖使いきりしとき, +汝それを振りまわせ. +はじめは無のみ生ずれど, +その働きに応え, +末期の力が引きだされん. +----- +げに店主が心せしとも, +賊は杖で穴を掘り, +金を払うことなく逃げ退き, +あまたの品を盗まん. +----- +汝武具の錆に悩まされしときは, +乱れしときに武具の力を高める書物を読まん. +脂の軟膏は, +瞬きの間なれど, +等しき守りの種を与えん. +----- +コカトリスなる物を見よ, +小なる背丈なれど隠れた力を秘めし. +コカトリスは触れしものを石と化せん. +冒険者よ!石となるのを好まぬならば, +賢き冒険者の行いを見ならわん! +死したるトカゲを食すとき. +酸のブロブを食すとき. +----- +冒険者よ! +機知に富む冒険者は, +神秘的な意味を知りたり. +ドラゴンの住みかの鱗から, +いずれの鎧が作られしや. +----- +汝の目が幻にまどわされしとき, +冒険者の中でよく知られしことあり. +ひと飲みの超回復の薬が五感を直らせん. +しかし,忘れてはならぬ! +汝を病に侵せし卑しき薬も等しき効あらん! +----- +神の寵愛を受けし水やトカゲの肉を食せ! +さすれば乱れし汝を解放せん. +極めて純潔なる生物の角を使え! +さすれば他の苦悩も同様に解放されん! +----- +汝遠く離れた地に疾く立ち渡らんと望むなら, +瞬間移動の制御を収得せよ. +そして常には汝の身をその地でのみ瞬間移動さする巻物を手にし, +乱れしときに読むべし. +肝々し冒険者は巻き物や薬なくとも, +特別な待ち伏せに飛び込みてそれを成し遂げん. +----- +この地を訪ねる全ての冒険者よ! +恐るべきメデューサを出抜けんと思いし冒険者よ! +殊なき諌めを汝に贈らん! +汝の目を目隠しで覆い +メデューサの姿を反射する鏡を見い出すべし! +----- +"ad aerarium"と書かれし場所を, +入念に探索せん. +時に,金持ちクロイソスの, +魔法の記念倉庫へと送られる罠の道をあきらかにできるだろう. +されど忘るることなかれ. +倉庫から金を盗みて出しは +入るよりはるかに難し. +----- +賢い店主は値段を吊りあげん. +きらきら光る出で立ちの旅人と行見たとき, +不公正な常連客の顔つきの旅人と見しとき. +彼らは偏愛する. +行い良き客を見しとき, +公正な顔の客を見たとき, +無作法者は利を得ず. +----- SINKS +台所の流し台は, +その表に触れしことにより +偉大なる真理や多くの訓戒を得られん. +そのむさぼり喰らうからくりは +多くの指輪を吸い込まん. +----- +魔法の生物の肉体は, +食みたる者に魔法の特性をしばしば与えん. +さまよう目の新しき死体は, +魔法使いの間で高い値をつけん. +盲目のとき心に浮かびあがる, +テレパシーの授与という使い道のため, +----- +祝福と呪いの発見は神の領分である. +神はこの情報を与えん. +崇拝の地において死すべきものへ, +献身を捧げる死すべきものへ. +----- +神は立派な嘆願者に力をもたらさん. +伝説で語りつがれた名のある力の大剣, +力ある旅人は助けなしに, +生み出すことができる. +オークに忌み嫌われるエルフの血統の大剣を. +----- +強力な魔除けには数多の逸話あり, +その原型は古代のイェンダー. +魔除けは畏怖の力を持ち, +神はその偉大さを望む. +死すべきものはその恐しき能力の一部に触れるのみ. +逸話は死すべきものに告げている. +この魔法の魔除けを所有しているとき. +彼らの目は見ることができぬものを見, +魔法の輸送道の場所を探せると言う. +死すべきものはその力を引き出すためには +身につけねばならぬとも言われている. +しかし均衡のため, +そのような偉大な力を得るには, +大きな犠牲を払わねばならぬ. +----- +汝モーロックの聖域に踏みこまんとするなら, +ゲヘナの奥深く地面の揺れし場所より入らん. +汝は三種の魔法の道具の手助けが必要なり. +祝福されし燭台の光が道を開き, +銀のベルの清かなる音が汝に告げ, +モーロックの本より読まれし恐しきルーンは地を力強く揺らさん. +----- +ダンジョンの奥のさらなる奥で, +その下を守るべく城が行く手をはばまん. +そこには望みの杖が置かれん. +汝入ろうとするならば, +音楽を奏でるべし. +正しき音色ならば +跳ね橋がおりてこよう. +その音色は神のみぞ知るものなれど, +音楽の推理は可能なり. +それが不可能ならば, +城の裏門に行くのだ. +----- ELBERETH +Elberethの名前は, +汝足元にその名を書くならば +汝の敵に畏怖の念を与えん. +汝極めて静かにしておれば, +偉大な力を得ることが可能なり. +足でその文字を +消さないように注意せよ. +----- diff -aurbN -xCVS -xXTAGS nethack/dat/jquest.txt jnethack/dat/jquest.txt --- nethack/dat/jquest.txt 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/dat/jquest.txt 2004-08-29 13:58:33.000000000 +0900 @@ -0,0 +1,5430 @@ +# SCCS Id: @(#)quest.txt 3.4 2002/01/30 +# Copyright (c) 1991 by M. Stephenson +# NetHack may be freely redistributed. See license for details. +# +# The quest text file for NetHack 3.4 +# +# These are the "standard" message numbers from qtext.h. All class +# dialogue must have at least these entries. +# +# QT_FIRSTTIME 1 +# QT_NEXTTIME 2 +# QT_OTHERTIME 3 +# +# QT_GUARDTALK 5 /* 5 random things guards say before quest */ +# QT_GUARDTALK2 10 /* 5 random things guards say after quest */ +# +# QT_FIRSTLEADER 15 +# QT_NEXTLEADER 16 +# QT_OTHERLEADER 17 +# QT_LASTLEADER 18 +# QT_BADLEVEL 19 +# QT_BADALIGN 20 +# QT_ASSIGNQUEST 21 +# +# QT_ENCOURAGE 25 /* 1-10 random encouragement messages */ +# +# QT_FIRSTLOCATE 35 +# QT_NEXTLOCATE 36 +# +# QT_FIRSTACQUIRE 40 +# QT_NEXTACQUIRE 41 +# +# QT_FIRSTNEMESIS 50 +# QT_NEXTNEMESIS 51 +# QT_OTHERNEMESIS 52 +# QT_NEMWANTSIT 53 /* you somehow got the artifact */ +# +# QT_DISCOURAGE 60 /* 1-10 random maledictive messages */ +# +# QT_GOTIT 70 +# +# QT_KILLEDNEM 80 +# QT_OFFEREDIT 81 +# QT_OFFEREDIT2 82 /* if you throw artifact to leader after #81 */ +# +# QT_POSTHANKS 90 +# QT_HASAMULET 91 +# +# Japanese version staff +# +# director issei@jaist.ac.jp +# A issei@jaist.ac.jp +# B issei@jaist.ac.jp +# C issei@jaist.ac.jp +# E fujieda@jaist.ac.jp +# F issei@jaist.ac.jp +# H tshira@mtl.t.u-tokyo.ac.jp +# K mya@jaist.ac.jp +# P s92458km@sfc.keio.ac.jp +# R issei@jaist.ac.jp +# S issei@jaist.ac.jp +# T s92458km@sfc.keio.ac.jp +# V issei@jaist.ac.jp +# W nao@jaist.ac.jp +# general issei@jaist.ac.jp +# angelic/demonic s92458km@sfc.keio.ac.jp +# +# for 3.4.0 So-Miya and Kentaro Shirakata +# + +# +# Archeologist +# +%Cc Arc 00001 +#You are suddenly in familiar surroundings. The buildings in the distance +#appear to be those of your old alma mater, but something is wrong. It looks +#as if there has been a riot recently, or %H has +#been under siege. +# +#All of the windows are boarded up, and there are objects scattered around +#the entrance. +# +#Strange forbidding shapes seem to be moving in the distance. +あなたは突然見覚えのある場所にいた.遠方に見える建物はあなたの +母校に違いない,しかし何かが違う.まるで最近,暴動があったか +%Hが包囲されていたかのように見える. + +全ての窓と言う窓は塞がれ,学校の入口は散らかったままだ. + +恐しいほど不気味な形をしたものが遠方で動いているのが見えた. +%E +%Cp Arc 00002 +#Once again, you are back at %H. +もう一度,あなたは%Hに戻った. +%E +%Cp Arc 00003 +#You are back at %H. +#You have an odd feeling this may be the last time you ever come here. +あなたは%Hに戻った. +ここに戻ってくるのは最後であるような奇妙な気がした. +%E +%Cp Arc 00005 +#"Did you see Lash LaRue in 'Song of Old Wyoming' the other night?" +「こないだの『古きワイオミングの歌』見た?」 +%E +%Cp Arc 00006 +#"Hey man, got any potions of hallucination for sale?" +「やぁ,幻覚の薬を売ってくれないかい?」 +%E +%Cp Arc 00007 +#"Did you see the artifact %l brought back from the last dig?" +「%lがこの前の発掘調査で持ち帰った聖器を見たかい?」 +%E +%Cp Arc 00008 +#"So what species do *you* think we evolved from?" +「我々はいったいどのような生物から進化したんだろう?」 +%E +%Cp Arc 00009 +#"So you're %ls prize pupil! I don't know what he sees in you." +「君は%lの一番の生徒だが,彼が君をどのように見ていることやら.」 +%E +%Cp Arc 00010 +#"Did you see Lash LaRue in 'Song of Old Wyoming' the other night?" +「こないだの『古きワイオミングの歌』見た?」 +%E +%Cp Arc 00011 +#"Hey man, got any potions of hallucination for sale?" +「やぁ,幻覚の薬を売ってくれないかい?」 +%E +%Cp Arc 00012 +#"I guess you are guaranteed to make full professor now." +「今回,あなたが正教授になることが保障されると思います.」 +%E +%Cp Arc 00013 +#"So, what was worse, %n or your entrance exams?" +「そうすると,%nとあなたの入学試験のどちらが悪かったのだろう?」 +%E +%Cp Arc 00014 +#"%oC is impressive, but nothing like the bones I dug up!" +「%oCは印象的だが,私が掘り出した骨とはわけが違う!」 +%E +%Cc Arc 00015 +#"Finally you have returned, %p. You were always +#my most promising student. Allow me to see if you are ready for the +#most difficult task of your career." +「戻ってきたか,%p君.君は私がもっとも信頼している学生だ. + 君の人生でもっとも困難な仕事に対する準備が出来たら,私に会うこと + を許そう.」 +%E +%Cp Arc 00016 +#"Again, %p, you stand before me. +#Let me see if you have gained experience in the interim." +「また来たか,%p君.私の前に来たまえ. + そして,君が経験を積んだかどうか見せてくれたまえ.」 +%E +%Cp Arc 00017 +#"Once more, %p, you have returned from the field. +#Are you finally ready for the task that must be accomplished?" +「もう一度だ,%p君.君は野原から戻ってきた. + 君は目標を達成しなければならないと言う仕事への準備が出来たの + かな?」 +%E +%Cc Arc 00018 +#"%p, you have failed us. All of my careful training has been in +#vain. Begone! Your tenure at this college has been revoked! +# +#"You are a disgrace to the profession!" +「%p君,私は君に失望したよ.私は教師としての自信を失なった. + どこでも行きたまえ!君の大学での在職権は取り消しだ! + + 君は同業者としてまったく恥ずかしいやつだ!」 +%E +%Cc Arc 00019 +#"%p, you are yet too inexperienced to undertake such a demanding +#quest. A mere %r could not possibly face the rigors demanded and +#survive. Go forth, and come here again when your adventures have further +#taught you." +「%p君,君は私のクエストを実行するにはちょっと経験が足りない + ようだ.単なる%rではおそらく厳しさに耐え生き残ることはできない + だろう.冒険が教師だ!力をつけろ,そして戻ってこい.」 +%E +%Cc Arc 00020 +#"%p! I've heard that you've been using sloppy techniques. Your +#results lately can hardly be called suitable for %ra! +# +#"How could you have strayed from the %a path? Go from here, and come +#back only when you have purified yourself." +「%p君!私は君がいいかげんな冒険をしていると聞いとるよ.そん + なんじゃ%rとはとても呼べないね. + +「%aの道からいかにはずれているかわかるか?ここからとっとと消え + 去り自分自身を浄化して戻ってくるがよい.」 +%E +%Cc Arc 00021 +#"Grave times have befallen the college, for %na has +#stolen %o. Without it, the board of directors of +#the university will soon have no choice but to revoke our research grants. +# +#"You must locate the entrance to %i. Within it, +#you will find %n. +# +#"You must then defeat %n and return %o +#to me. +# +#"Only in this way will we be able to prevent the budget cuts that could +#close this college. +# +#"May the wisdom of %d be your guide." +「大学に暗雲がさしかかっている.実は%nが%oを + 盗んだのだ.あれがないと直ちに大学の理事会は問答言わせず我々 + の研究を無効にするであろう. + +「君は%iの入口に行かねばならない.そこに行けば, + %nがいるだろう. + +「君は%nを打ち負かさねばらなない.そして%oを取り + 返すのだ. + +「この大学を閉鎖に導く研究費の削除を防ぐにはこれしか方法がない. + +「%dの知識が君の助けとならんことを.」 +%E +%Cp Arc 00025 +#"Beware, for %n is powerful and cunning." +「気をつけろ!%nは強い上に狡猾なやつだ.」 +%E +%Cp Arc 00026 +#"To locate the entrance to %i, you must pass +#many traps." +「%iの入口へ行くには,多くの危険な罠を通り抜けねばならない.」 +%E +%Cp Arc 00027 +#"A %nt may be vulnerable to attacks by magical cold." +「%nは冷気の魔法に弱いはずだ.」 +%E +%Cp Arc 00028 +#"Call upon %d when you encounter %n." +「%nに出逢ったら,%dに祈りを求めるのだ.」 +%E +%Cp Arc 00029 +#"You must destroy %n. It will pursue you otherwise." +「君は%nを殺さねばならない.そいつは君を追いかけまわすのだから.」 +%E +%Cp Arc 00030 +#"%oC is a mighty talisman. With it you +#can destroy %n." +%oは強力な護符だ.それがあれば君も%nを打ちのめせる.」 +%E +%Cp Arc 00031 +#"Go forth with the blessings of %d." +「%dの祝福のあらんことを.」 +%E +%Cp Arc 00032 +#"I will have my %gP watch for your return." +「我%gが君の帰還を見守らんことを.」 +%E +%Cp Arc 00033 +#"Remember not to stray from the true %a path." +「真実の%aの道からはずれぬようつねに注意するのだ.」 +%E +%Cp Arc 00034 +#"You may be able to sense %o when you are near." +「君なら%oに近づいたときその存在を感じることができるはずだ.」 +%E +%Cp Arc 00035 +#You have the feeling that you will soon find the entrance to +#%i. +あなたはもうすぐ%iの入口を発見できるような気がした. +%E +%Cp Arc 00036 +#Once again, you are near the entrance to %i. +もう一度,あなたは%iの入口の近くまでやってきた. +%E +%Cp Arc 00040 +#You sense the presence of %o. +あなたは%oの存在を感じた. +%E +%Cp Arc 00041 +#The familiar presence of %o is in the ether. +%oの存在が空気を通してつたわってきた. +%E +%Cc Arc 00050 +#"So, %p, you think that you can succeed in recovering +#%o, when your teacher, %l, has already failed. +# +#"Come, try your best! I shall destroy you, and gnaw on your bones." +「け!%pよ,お前は%oを奪回できると思っているだろう,だが + お前の師である%lは失敗しているのだ. + +「さあ,全力で来い!お前の骨は本当にいい味がしそうだ.」 +%E +%Cc Arc 00051 +#"Again you try to best me, eh %p? Well, you shall fail again. +# +#"You shall never recover %o. +# +#"I shall bear your soul to the Plane of Origins for my master's pleasure." +「け!また来たか!どうせまた失敗さ. + +「%oを取り返すなんて不可能だ. + +「我がマスターのために,お前の魂をあの世に送ってやろう.」 +%E +%Cp Arc 00052 +#"You persist yet %p! Good. Now, you shall die!" +「%p!まだ生きていたのか.よし,今度こそ殺してやる!」 +%E +%Cp Arc 00053 +#"I shall have %o from you, %p, then feast +#upon your entrails!" +「%p!おまえから%oを取り返し,はらわたを晩飯にしてやろう!」 +%E +%Cp Arc 00060 +#"Try your best, %p. You cannot defeat me." +「全力でこい%p.お前なんかにゃ殺されないさ.」 +%E +%Cp Arc 00061 +#"I shall rend the flesh from your body whilst you still breathe!" +「一瞬でお前の体をひきさいてやるぜ!」 +%E +%Cp Arc 00062 +#"First you, %p, then I shall destroy your mentor, %l." +「%p!まずお前を殺して,次に師である%lを殺してやる.」 +%E +%Cp Arc 00063 +#"Tiring yet, %p? I draw my power from my master and cannot +#falter!" +「まだやるのか%p?私は我があるじから力を得ている.決して死なない +のさ!」 +%E +%Cp Arc 00064 +#"I shall rend thy soul from thy body and consume it!" +「お前の魂を喰ったら本当にうまそうだ!」 +%E +%Cp Arc 00065 +#"You are far too %a -- it weakens you. You shall die in this place." +「%aには程遠いな.お前はこの地で死ぬのだ.」 +%E +%Cp Arc 00066 +#"%d has forsaken you! You are lost now!" +「%dはお前を見すてたぞ!お前はここで消滅するのだ!」 +%E +%Cp Arc 00067 +#"A mere %r cannot hope to defeat me!" +「単なる%rじゃオレには勝てん!」 +%E +%Cp Arc 00068 +#"If you are the best %l can send, I have nothing to fear." +「%lは本当に一番強いやつを送ってきたのか?これじゃ恐れること + など何もない!」 +%E +%Cp Arc 00069 +#"Die %c! I shall exhibit your carcass as a trophy." +「死ね!%cよ.お前の残骸を我がコレクションに加えよう.」 +%E +%Cc Arc 00070 +#The power of %o flows through your body! You feel +#as if you could now take on the Wizard of Yendor himself and win, but +#you know you must return %o to %l. +%oの力が体に注がれた!あなたは,まるで大魔法使いイェンダー自身 +を相手にして,勝利できるかのような気持になった.しかし,%oを +持って%lのもとへ戻らねばならないことに気がついた. +%E +%Cp Arc 00080 +#The body of %n dissipates in a cloud of noxious fumes. +%nの体は毒性の蒸気へと飛び散った. +%E +%Cc Arc 00081 +#%lC touches %o briefly, gazes into it, +#then smiles at you and says: +# +#"Well done, %p. You have defeated the and +#recovered %o. But I fear that it shall never be safe +#here. +# +#Please take %o with you. You, %p, can +#guard it now far better than I. +# +#May the blessings of %d follow you and guard you." +%lは軽く%oに触れ,それをじっと見つめ,あなたに向って +微笑みかけた: + +「%pよ.よくやった.お前は%nを倒し,%oを + 取り戻した.しかし,ここに置くのやはり安全ではない. + + %oを持っていくがよい.%pよ.お前に預けておけば安心だ. + + %dの祝福と加護があらんことを.」 +%E +%Cc Arc 00082 +#"Careful, %p! %oC might break, and that would be +#a tragic loss. You are its keeper now, and the time has come to +#resume your search for the Amulet. %Z await your +#return through the magic portal that brought you here." +「気をつけろ%p!%oが壊れてしまう. + そうなったら大きな痛手だ.お前は%oの守護者だ. + 魔除け探索を再開せよ.魔法の入口の向こうで, + %Zがお前を待っているぞ. +%E +%Cc Arc 00090 +#"Welcome back, %p. Have you progressed with your quest to +#regain the Amulet of Yendor for %d?" +「よく戻ってきた%pよ.%dのためイェンダーの魔除けを探す旅は + 進展したかね?」 +%E +%Cc Arc 00091 +#"Congratulations, %p. I wondered if anyone could prevail against +#the Wizard and the minions of Moloch. Now, you must embark on one +#final adventure. +# +#"Take the Amulet, and find your way onto the astral plane. +#There you must find the altar of %d and sacrifice the +#Amulet on that altar to fulfill your destiny. +# +#"Remember, your path now should always be upwards." +「おめでとう%p!私は大魔法使いやモーロックの使い魔に + 打ち勝てる者がいるのかどうか疑問に思っていたのだ.今,お前は最終試練 + に向って船出せねばならない. + +「魔除けを使い,精霊界への道を見つけるのだ.運命を果すため,お前は + %dの祭壇を見つけ,魔除けを祭壇に捧げねばならない. + +「お前の進む道は常に一本であることを覚えておくのだ.」 +%E +# +# Barbarian +# +%Cc Bar 00001 +#Warily you scan your surroundings, all of your senses alert for signs +#of possible danger. Off in the distance, you can %x the familiar shapes +#of %H. +# +#But why, you think, should %l be there? +# +#Suddenly, the hairs on your neck stand on end as you detect the aura of +#evil magic in the air. +# +#Without thought, you ready your weapon, and mutter under your breath: +# +# "By %d, there will be blood spilt today." +ゆっくりとあなたは目蓋を開けた.ありとあらゆる感覚が危険信号を発して +いる.遠方に%Hの懐かしい光景を%xた. + +しかし,何故か%lがそこにいる?! + +突然,空中に邪悪な魔法のオーラを感じ,あなたのうなじにむしずが走った. + +何も考えず,あなたは武器を構えた.そして一人言をつぶやいた: + + 「%dの名において血しぶきを許したまえ」 +%E +%Cp Bar 00002 +#Once again, you near %H. You know that %l +#will be waiting. +もう一度%Hにやってきた.%lが待っている. +%E +%Cp Bar 00003 +#Again, and you think possibly for the last time, you approach +#%H. +またやってきた.%Hに来るのは,多分これが最後であろうと思った. +%E +%Cp Bar 00005 +#"The battles here have been good -- our enemies' blood soaks the soil!" +「ここでの戦いは好調だ.敵の血が土壌に浸みこんでるぜ!」 +%E +%Cp Bar 00006 +#"Remember that glory is crushing your enemies beneath your feet!" +「栄光とは足元で敵を踏み砕く事だということを忘れるな!」 +%E +%Cp Bar 00007 +#"There has been little treasure to loot, since the horde arrived." +「軍団が来てからは,ほとんど略奪する宝箱は残っていない,」 +%E +%Cp Bar 00008 +#"The horde is mighty in numbers, but they have little courage." +「軍団は数の力で押してくる,なにせ,あいつらは憶病ものだからな.」 +%E +%Cp Bar 00009 +#"%lC is a strange one, but he has helped defend us." +「%lと言うのは変ったやつだ,しかし彼は我々を守ってくれている.」 +%E +%Cp Bar 00010 +#"The battles here have been good -- our enemies' blood soaks the soil!" +「ここでの戦いは好調だ.敵の血が土壌に浸みこんでるぜ!」 +%E +%Cp Bar 00011 +#"Remember that glory is crushing your enemies beneath your feet!" +「栄光とは足元で敵を踏み砕く事だということを忘れるな!」 +%E +%Cp Bar 00012 +#"Times will be good again, now that the horde is vanquished." +「軍団は征服され,またよい時代になるだろう.」 +%E +%Cp Bar 00013 +#"You have brought our clan much honor in defeating %n." +「お前は%nを打ち破り,我々一族に多くの名誉をもたらしてくれた.」 +%E +%Cp Bar 00014 +#"You will be a worthy successor to %l." +「お前は%lのよい後継者になるだろう.」 +%E +%Cc Bar 00015 +#"Ah, %p. You have returned at last. The world is in dire +#need of your help. There is a great quest you must undertake. +# +#"But first, I must see if you are ready to take on such a challenge." +「おお!%pよ.やっと戻ってきてくれたか.この世界は至急お前の + 助けを必要としている.お前が引き受けねばならぬ偉大なクエストが待ち構え + ているのだ. +「しかし,まずお前がそれを受け負うだけの力があるか調べねばならぬ.」 +%E +%Cp Bar 00016 +#"%p, you are back. Are you ready now for the challenge?" +「%pよ.戻ってきたか.偉大な挑戦の準備は整ったかな?」 +%E +%Cp Bar 00017 +#"Again, you stand before me, %p. Surely you have prepared yourself." +「%pよ.またお前は私の前に立っているのだが,準備は + いいかな?」 +%E +%Cc Bar 00018 +#"Pah! You have betrayed the gods, %p. You will never attain +#the glory which you aspire to. Your failure to follow the true path has +#closed this future to you. +# +#"I will protect these people as best I can, but soon %n will overcome +#me and destroy all who once called you %s. Now begone!" +「ふん!お前は%pの神を裏切った.お前が熱望する + 名誉を得ることもないだろう.真実の道を辿りお前の失敗が未来を閉ざす + はずだ. + +「私はここにいる人々を全力で守るつもりだ,しかしすぐにでも%n + が私を倒し,お前を一度でも%sと呼んだ人々を殺すだろう. + 消えうせろ!」 +%E +%Cc Bar 00019 +#"%p, I fear that you are as yet too inexperienced to face +#%n. Only %Ra with the help of %d could ever hope to +#defeat him." +「%pよ,%nと正対するにはちと経験不足のようだな. + %Rだけが%dの助けを得て%nを倒せよう.」 +%E +%Cp Bar 00020 +#"%p! You have wandered from the path of the %a! +#If you attempt to overcome %n in this state, he will surely +#enslave your soul. Your only hope, and ours, lies in your purification. +#Go forth, and return when you feel ready." +「%p!%aの道から外れさまよっているな!この状態で%nを + 打ちまかそうとするなら,確実にお前の魂はとりこにされるだろう. + 唯一の望みは自分自身の浄化だ.進め!そして準備ができたと思ったら + 戻ってこい.」 +%E +%Cc Bar 00021 +#"The world is in great need of your assistance, %p. +# +#"About six months ago, I learned that a mysterious sorcerer, known +#as %n, had begun to gather a large group of cutthroats and brigands +#about him. +# +#"At about the same time, these people you once rode with `liberated' a +#potent magical talisman, %o, from a Turanian caravan. +# +#"%nC and his Black Horde swept down upon %i and defeated +#the people there, driving them out into the desert. He has taken +#%o, and seeks to bend it to his will. I detected the +#subtle changes in the currents of fate, and joined these people. +#Then I sent forth a summons for you. +# +#"If %n can bend %o to his will, he will become +#almost indestructible. He will then be able to enslave the minds of +#men across the world. You are the only hope. The gods smile upon you, +#and with %d behind you, you alone can defeat %n. +# +#"You must go to %i. From there, you can track down +#%n, defeat him, and return %o to us. Only +#then will the world be safe." +「世界はお前の助けを必要としている,%pよ. + +「半年ほど前,私は%nとして知られている神秘的な魔法使いが, + 殺人鬼や略奪者を集めていると言うのを知った. + +「またほぼ同じころ,この地の人間が強力な魔法の護符である%oを + ツラニアンの洞窟から持ち去った. + +「%nおよび彼の暗黒軍団は,%iに押し寄せ,そこの + 人々を打ち負かし砂漠へ追いやった.彼は%oを手に入れ + 彼の意のままにする方法を探している.私は運命の微妙な変化を嗅ぎとり, + そしてこの地の人々と合流した.そしてお前に召喚のための力を送ったのだ. + +「もし%nが%oを意のままにすることができたならば, + 彼は不滅の魂を得,世界中の人間の心を奴隷にすることができるだろう. + お前は唯一の希望だ.神の祝福があらんことを, + また%dの加護があらんことを.お前だけが唯一 + %nを倒せる. + +「お前は%iに行かねばならぬ.ここから%nのところ + まで降りて行ける.そして%oを私に戻しておくれ.それが唯一 + 世界を救う方法だ.」 +%E +%Cp Bar 00025 +#"%nC is strong in the dark arts, but not immune to cold steel." +「%nは暗黒の術には強い.しかし冷たい鋼には抵抗力がない.」 +%E +%Cp Bar 00026 +#"Remember that %n is a great sorcerer. He lived in the time +#of Atlantis." +「%nは偉大な魔法使いであることを忘れるな.彼はアトランティス + の時代から生きているのだ.」 +%E +%Cp Bar 00027 +#"If you fail, %p, I will not be able to protect these people long." +「%pよ.お前が失敗したなら私はこの地の人間を長くは守って + いられないぞ.」 +%E +%Cp Bar 00028 +#"To enter %i, you must be very stealthy. The horde will be on +#guard." +「%iに入るには,よほど静かに行動しなければならぬ.軍団が守って + いるはずだ.」 +%E +%Cp Bar 00029 +#"Call upon %d in your time of need." +「必要ならば%dを呼ぶのだ.」 +%E +%Cp Bar 00030 +#"May %d protect you, and guide your steps." +「%dの加護と導きのあらんことを.」 +%E +%Cp Bar 00031 +#"If you can lay hands upon %o, carry it for good fortune." +「%oの上に手をかざすことができたならば,幸運を手に入れられる + だろう.」 +%E +%Cp Bar 00032 +#"I cannot stand against %ns sorcery. But %d will help you." +「%nの魔術の前に私は無力だ.しかし%dがお前を助けて + くれよう」 +%E +%Cp Bar 00033 +#"Do not fear %n. I know you can defeat him." +「%nを恐れるな.お前なら彼を倒すことができる.」 +%E +%Cp Bar 00034 +#"You have a great road to travel, %p, but only after you defeat +#%n." +「%pよ,お前の偉大なる冒険は%nを倒してこそ成り立つのだ.」 +%E +%Cc Bar 00035 +#The scent of water comes to you in the desert breeze. You know that +#you have located %i. +水の匂いが砂漠の風に溶けこんでいる.あなたは%iにいることを +実感した. +%E +%Cp Bar 00036 +#Yet again you have a chance to infiltrate %i. +また%iに潜入する機会がやってきた. +%E +%Cc Bar 00040 +#The hairs on the nape of your neck lift as you sense an energy in the +#very air around you. You fight down a primordial panic that seeks to +#make you turn and run. This is surely the lair of %n. +周囲のエネルギーを感じ取り,あなたのうなじの毛が逆立った. +あなたは振り返って走り去りたいという本能的な恐怖を懸命に抑えつけた. +ここはまさに%nのすみかなのだ. +%E +%Cp Bar 00041 +#Yet again you feel the air around you heavy with malevolent magical energy. +あなたは再び,重くのしかかってくる +悪意に満ちた魔法のエネルギーの存在を感じた. +%E +%Cc Bar 00050 +#"So. This is what that second rate sorcerer %l sends to do his bidding. +#I have slain many before you. You shall give me little sport. +# +#"Prepare to die, %c." +「そうか,お前が二級魔法使い%lの送りこんできたやつか. + ワシはお前の前に随分と殺したもんだ.おまえの相手をするのもいい運動になる + だろう. + +「死ぬ準備は出来たか?%cよ.」 +%E +%Cp Bar 00051 +#"I have wasted too much time on you already. Now, you shall die." +「お前の準備ができるまで随分と暇だったぞ.ついに,お前の死ぬときが + 来たか.」 +%E +%Cp Bar 00052 +#"You return yet again, %c! Are you prepared for death now?" +「また来たのか%c!今度こそ死ぬ準備はできたのか?」 +%E +%Cp Bar 00053 +#"I shall have %o back, you pitiful excuse for %ca. +#And your life as well." +「%oを取り戻してやる,哀れを乞うがよい%cよ. + そして,おまえの命も同様だ.」 +%E +%Cp Bar 00060 +#"My pets will dine on your carcass tonight!" +「ワシのペットがお前の屍の食事を楽しみにしとるわ!」 +%E +%Cp Bar 00061 +#"You are a sorry excuse for %ra." +「%rの面目まるつぶれだな.」 +%E +%Cp Bar 00062 +#"Run while you can, %c. My next spell will be your last." +「全力で逃げろ,%c.次の魔法がお前の最後だ.」 +%E +%Cp Bar 00063 +#"I shall use your very skin to bind my next grimoire." +「お前の皮を新しい呪文書の装丁に使うとしよう.」 +%E +%Cp Bar 00064 +#"%d cannot protect you now. Here, you die." +「%dはお前を守ってやることなぞできない.死ね.」 +%E +%Cp Bar 00065 +#"Your %a nature makes you weak. You cannot defeat me." +「お前の%aさがお前を弱くするのだ.お前にワシは倒せない.」 +%E +%Cp Bar 00066 +#"Come, %c. I shall kill you, then unleash the horde on your tribe." +「来い,%c.お前を殺してやる.そして軍団をお前の部族へ + 送りこんでやる.」 +%E +%Cp Bar 00067 +#"Once you are dead, my horde shall finish off %l, and your tribe." +「お前が死んだなら,ワシの軍団は%lや部族をすっかり片付ける + ことだろう.」 +%E +%Cp Bar 00068 +#"Fight, %c, or are you afraid of the mighty %n?" +「戦え%c!それとも偉大な%nにおじけづいたか?」 +%E +%Cp Bar 00069 +#"You have failed, %c. Now, my victory is complete." +「勝負あったな%c.ワシの勝利は近づいた.」 +%E +%Cc Bar 00070 +#As you pick up %o, you feel the power of it +#flowing through your hands. It seems to be in two or more places +#at once, even though you are holding it. +%oを拾うと,手からパワーが伝わってくるのを感じた. +それを握っていてさえ,何ヶ所にも存在しているような気がした. +%E +%Cp Bar 00080 +#%nC falls to the ground, and utters a last curse at you. Then his +#body fades slowly, seemingly dispersing into the air around you. You +#slowly become aware that the overpowering aura of magic in the air has +#begun to fade. +%nは地に伏し,最後の呪いを口から発した.彼の体はゆっくりと +消えはじめ,あなたの周りの空気に溶けこんだ.あなたは周囲にはりめぐらさ +れていた魔法のオーラが消えはじめているのになんとなく気がついた. +%E +%Cc Bar 00081 +#When %l sees %o, he smiles, and says: +# +# Well done, %p. You have saved the world from certain doom. +# What, now, should be done with %o? +# +# These people, brave as they are, cannot hope to guard it from +# other sorcerers who will detect it, as surely as %n did. +# +# Take %o with you, %p. It will guard you in +# your adventures, and you can best guard it. You embark on a +# quest far greater than you realize. +# +# Remember me, %p, and return when you have triumphed. I +# will tell you then of what you must do. You will understand when the +# time comes. +%lは%oを見ると微笑んで,こう言った. + + よくやった,%pよ.お前は世界を破滅から救ったのだ. + さて,%oは何のために使うのがよいであろう? + + この地の者達は勇敢ではある. + しかし仮に%oを奪おうとする者が再び現れたとき, + 阻止出来るとはとても思えぬ.%nがそうしたようにな. + + %oを持ってゆくがよい.%pよ.%oは + お前を守ってくれるだろうし,またお前も%oの + よき守り手となるであろう.お前が実感しているよりはるかに偉大な + クエストに向けて船出するのだ. + + 私を忘れるな%pよ,そして勝利のあかつきには戻って来るのだ. + その時にまたそなたが為すべきことを教えよう. + 時が来ればこの意味も理解できるであろう. +%E +%Cc Bar 00082 +#%l gazes reverently at %o, then back at you. +# +#"You are its keeper now, and the time has come to resume your search +#for the Amulet. %Z await your return through the +#magic portal which brought you here." +%lは%oを受けとりあなたに戻した. + +「今や,お前は%oの守護者だ. + 魔除け探索を再開せよ.魔法の入口の向こうで, + %Zがお前を待っているぞ. +%E +%Cp Bar 00090 +#"Tell us, %p, have you fared well on your great quest?" +「%pよ.お前の偉大なクエストについて話しておくれ.」 +%E +%Cc Bar 00091 +#"This is wondrous, %p. I feared that you could not possibly +#succeed in your quest, but here you are in possession of the Amulet +#of Yendor! +# +#"I have studied the texts of the magi constantly since you left. In +#the Book of Skelos, I found this: +# +# %d will cause a child to be sent into the world. This child is to +# be made strong by trial of battle and magic, for %d has willed it so. +# It is said that the child of %d will recover the Amulet of Yendor +# that was stolen from the Creator at the beginning of time. +# +#"As you now possess the amulet, %p, I suspect that the Book +#speaks of you. +# +# The child of %d will take the Amulet, and travel to the Astral +# Plane, where the Great Temple of %d is to be found. The Amulet +# will be sacrificed to %d, there on His altar. Then the child will +# stand by %d as champion of all %cP for eternity. +# +#"This is all I know, %p. I hope it will help you." +「信じがたい!%p.お前がクエストを成功させることはできないのでは + ないかと心配してたのだが,今まさにイェンダーの魔除けを持っているでは + ないか! + +「私はお前が去ってから魔法の文献を常に読みあさっていた.そのとき + スケロスの書に次のような一節を見つけたのだ: + + %d1人の子を世界に送らん.この子%dの意思により戦いに + 於いて強く,魔術に於いても強く作られり.%dの子世界の始めより + 造られし生物に盗まれたイェンダーの魔除けを取り戻さん. + +「そして%pよ,今はお前が魔除けを持っている.この本はお前のことを + 語っているのであろう. + + %dの子魔除けを手に入れ,%dの偉大なる寺院を見つけんと + 精霊界へ旅だたん.祭壇にて魔除けを%dに献上し,その子 + %dの前にて完壁なる永遠の%cとなれり. + +「これが私の知る全てだ,%pよ.何らかの助けになることを + 祈っているぞ.」 +%E +# +# Cave(wo)man +# +%Cc Cav 00001 +#You descend through a barely familiar stairwell that you remember +#%l showing you when you embarked upon your vision quest. +# +#You arrive back at %H, but something seems +#wrong here. The usual smoke and glowing light of the fires of the +#outer caves are absent, and an uneasy quiet fills the damp air. +あなたは見なれた階段を降りながら,冒険に旅立ったとき,%l +があなたを見ていたのをふと思いだした. + +あなたは%Hに戻ってきた,しかし何かが違っているように見える.いつも +の煙や洞窟の外の火の灯が消えうせており,何とも言えない沈黙が漂って +いた. +%E +%Cp Cav 00002 +#Once again, you arrive back at %H. +もう一度,あなたは%Hに戻ってきた. +%E +%Cp Cav 00003 +#For some reason, you think that this may be the last time you will +#enter %H. +なぜか,あなたは%Hに来るのはこれが最後である +ような気がした. +%E +%Cp Cav 00005 +#"We have not been able to gather as much food since the Giants sealed +#off our access to the outer world." +「巨人が外への出入りを封印して以来我らは十分な食料を集めることは + できないのだ.」 +%E +%Cp Cav 00006 +#"Since %n sent her minions, we have been constantly fighting." +「%nが彼女の下僕を送ってきて以来,我らは常に + 戦っているのだ.」 +%E +%Cp Cav 00007 +#"I have heard your vision quest was successful. Is this so?" +「私はあなたの冒険が成功しそうだと聞いているが,どうなんだ?」 +%E +%Cp Cav 00008 +#"So, tell me, %p, how have you fared?" +「%pよ.うまくいっているかどうか教えてくれ」 +%E +%Cp Cav 00009 +#"%lC grows old. We know not who will guide us after he ascends." +「%lは年老いた.彼亡き後,誰が我らを守ってくれると言うのだ.」 +%E +%Cp Cav 00010 +#"The rains have returned and the land grows lush again." +「雨は戻り,大地は再び豊潤になるだろう.」 +%E +%Cp Cav 00011 +#"Peace has returned, give thanks to %d!" +「平和が戻ってきた!%dのおかげだ!」 +%E +%Cp Cav 00012 +#"Welcome back! Did you find %o?" +「よく戻ってきた!%oは見つかったかね?」 +%E +%Cp Cav 00013 +#"So, %p, tell us the story of your fight with %n." +「おぉ,%p,おまえと%nの戦いは伝説として語り継がれるだろう.」 +%E +%Cp Cav 00014 +#"%lC grows old. Perhaps you will guide us after he ascends." +「%lは年老いた.彼亡き後,あなたが我々を導いてくれるだろう.」 +%E +%Cc Cav 00015 +#"You have returned from your vision quest, %p. Thank %d. +# +#"We are in dire need of your help, my %S. +# +#"But first, I must see if you are yet capable of the quest I would +#ask you to undertake." +「冒険から戻ってきたか%pよ.%dに感謝しよう. + +「我%sよ.我らはお前の助けを必要としている. + +「しかし手始めに,私の要求するクエストを受けいれるだけの技量があるか + 調べねばならぬ.」 +%E +%Cp Cav 00016 +#"Again, you return to us, %p. Let me see if you are ready now." +「また戻ってきたか%pよ.準備が出来たかどうか見てやろう.」 +%E +%Cp Cav 00017 +#"Ah, %p. Are you finally ready?" +「おお%p.準備はできたかな?」 +%E +%Cc Cav 00018 +#"%p! You have sealed our fate. You seem unable to reform yourself, +#so I must select another to take your place. +# +#"Begone from %H! You have betrayed us by choosing +#the path of the %C over the true path of the %L. +# +#"You no longer live in our eyes." +「%p!お前は我らの運命を封印してしまった.お前は自分自身を改める + ことができないと見える.この任務には替りの者をたてることとしよう. + +「%Hから去るがよい!お前は%Lの真実の道の替りに + %Cの道を撰択し,我らを裏切った. + +「我が目の前に二度と現われるな.」 +%E +%Cc Cav 00019 +#"Alas, %p, you are as yet too inexperienced to embark upon such +#a difficult quest as that I propose to give you. +# +#"%rA could not possibly survive the rigors demanded to find +#%i, never mind to confront %n herself. +# +#"Adventure some more, and you will learn the skills you will require. +#%d decrees it." +「あぁ%pよ.お前は私がさずける困難なクエストの旅に出るには + 少し経験不足のようだ. + +「%rでは%iを見つけ,生きている可能性などないだろう. + ましていわんや%nと対面などできぬ. + +「冒険を重ねよ.そして必用な技量を学んでくるがよい. + %dはそう命じでいる.」 +%E +%Cc Cav 00020 +#"%p! You have deviated from my teachings. You no longer follow +#the path of the %a as you should. I banish you from these caves, to +#go forth and purify yourself. Then, you might be able to accomplish this +#quest." +「%pよ!我が教えにそむいておるな.お前は成すべき%aの + 道から外れている.力をつけ自分自身を浄化してもらうため,お前を + この洞窟から追い払おう.そしてこのクエストをやりとげるくらい + の力をつけてくるのだ.」 +%E +%Cc Cav 00021 +#"You are indeed ready now, %p. I shall tell you a tale of +#great suffering among your people: +# +#"Shortly after you left on your vision quest, the caves were invaded by +#the creatures sent against us by %n. +「ふむ.準備ができたようだな%pよ.まず,この地で起きた大いなる + 受難の話をしよう: + +「お前が冒険に出かけた後すぐに,この洞窟は%nが + 我々に送ってきた生物に侵略されてしまった. + +#"She, herself, could not attack us due to her great size, but her minions +#have harassed us ever since. In the first attacks, many died, and the +#minions of %n managed to steal %o. +#They took it to %i and there, none of our +#%g warriors have been able to go. +「彼女はその巨体のため自分自身では攻撃できないのだが,彼女の下僕達は + 我々の悩みの種だ.最初の攻撃で多くが死に,%n + の下僕達は%oを盗んでしまった.彼らは%iに + 持ちかえり,我ら%gの戦士は誰もそこへ行くこと + ができない. + +#"You must find %i, and within it wrest +#%o from %n. She guards it as +#jealously as she guards all treasures she attains. But with it, +#we can make our caves safe once more. +# +#"Please, %p, recover %o for us, and return it here." +「お前は%iを見つけ,%nから%oを + もぎ取ってくるのだ.彼女は全力でそれを守っている.それを取り戻せ + ば我らは安泰だ. + +「%pよ.どうか我らのために%oを取り戻し,ここへ戻ってきて + ほしい.」 +%E +%Cp Cav 00025 +#"%nC is immune to her own breath weapons. +#You should use magic upon her that she does not use herself." +「%nは彼女自身のブレス攻撃に対しては耐性がある. + お前は彼女の使わない魔法を用いるべきだ.」 +%E +%Cp Cav 00026 +#"When you encounter %n, call upon %d for assistance." +「%nに会ったなら,%dの助けを呼ぶのだ.」 +%E +%Cp Cav 00027 +#"There will be nowhere to hide inside %n's inner sanctum." +「%nの聖域内では隠れるところなどないぞ.」 +%E +%Cp Cav 00028 +#"Your best chance with %n will be to keep moving." +「%nに対しては常に動き,チャンスをうかがえ.」 +%E +%Cp Cav 00029 +#"Do not be distracted by the great treasures in %ns lair. +#Concentrate on %o." +「%nの住みかの宝には目もくれるな.%oに + 集中するのだ.」 +%E +%Cp Cav 00030 +#"%oC is the only object that %n truly fears." +「%oは%nが畏れる唯一の物体だ.」 +%E +%Cp Cav 00031 +#"Do not be fooled by %ns size. She is fast, and it is +#rumored that she uses magic." +「%nの大きさに迷わされるな.彼女は素早く,また魔法を + 使うと噂されている.」 +%E +%Cp Cav 00032 +#"I would send a party of %gP with you, but we will need all +#of our strength to defend ourselves." +「%gの一隊を送りたいのだが,我らの精鋭はここの守りのために必要 + なのだ.」 +%E +%Cp Cav 00033 +#"Remember, be %a at all times. This is your strength." +「いつでも%aの精神を忘れるな.それがお前の強さなのだ.」 +%E +%Cp Cav 00034 +#"If only we had an amulet of reflection, this would not have happened." +「反射の魔除けさえ持っていれば,このようなことは + 起こらかったであろう.」 +%E +%Cc Cav 00035 +#You %x many large claw marks on the ground. The tunnels ahead +#of you are larger than most of those in any cave complex you have +#ever been in before. +# +#Your nose detects the smell of carrion from within, and bones litter +#the sides of the tunnels. +あなたは,地面に巨大な爪跡があるのを%xた.あなたの前方にあるトンネルは +今迄にあなたが見たことのあるものより巨大で,複雑である. + +死肉の臭いがそこから漂ってくるのを感じ,骨がトンネルの両側に散乱して +いる. +%E +%Cp Cav 00036 +#Once again, you approach %i. +もう一度,あなたは%iに近づいた. +%E +%Cc Cav 00040 +#You find yourself in a large cavern, with neatly polished walls, that +#nevertheless show signs of being scorched by fire. +# +#Bones litter the floor, and there are objects scattered everywhere. +#The air is close with the stench of sulphurous fumes. +# +#%nC is clearly visible, but she seems to be asleep. +あなたは壁が丁寧に磨かれた大きな洞窟にいるのに気がついた.しかし,それ +でも,火で焦がされた跡があちこちにある. + +骨が床に散乱しており,いろんなものが無造作にちらばっている. +空気の流れは滞っており,硫黄の臭いが鼻につく. + +%nははっきりと見えている.しかし彼女は寝ているようだ. +%E +%Cp Cav 00041 +#Once again, you find yourself in the lair of %n. +もう一度,あなたは%nの住みかにいた. +%E +%Cc Cav 00050 +#"So, follower of %l, you seek to invade the lair of %n. +#Only my meals are allowed down here. Prepare to be eaten!" +「%lに従う者よ.%nの住みかに侵入して何かをお捜しですか? + ここへは私の食料以外は入ってこれないのです.食べられる準備をしなさい!」 +%E +%Cp Cav 00051 +#"So, again you face me, %c. No one has ever before escaped me. +#Now I shall kill you." +「またお会いしましたね,%c.だれも私からは逃げられません. + 今度こそ殺してさしあげましょう.」 +%E +%Cp Cav 00052 +#"You are getting annoying, %c. Prepare to die." +「あなたはいらいらさせられます,%c.死ぬ準備をしなさい.」 +%E +%Cp Cav 00053 +#"I'll have %o from you, %c. You shall die." +「私こそ%oを持つべきだ,%c.死ね.」 +%E +%Cp Cav 00060 +#"You are weak, %c. No challenge for the Mother of all Dragons." +「弱ってきたようね,%c.全てのドラゴンの母へ挑戦するなど + 無謀だったようですね.」 +%E +%Cp Cav 00061 +#"I grow hungry, %r. You look like a nice appetizer!" +「ちょうど腹が減ってきたところよ,%r.あなたを見てると食欲が湧い + てきます.」 +%E +%Cp Cav 00062 +#"Join me for lunch? You're the main course, %c." +「昼食をいっしょにどうですか?もちろんあなたがメインディッシュです + けど,%c」 +%E +%Cp Cav 00063 +#"With %o, I am invincible! You cannot succeed." +「%oにより私は無敵です.あなたが目的を達成するなど + 不可能ですよ.」 +%E +%Cp Cav 00064 +#"Your mentor, %l has failed. You are nothing to fear." +「あなたの指導者である%lは失敗したのですよ.あなたも何も恐れる + ことなどないでしょう.」 +%E +%Cp Cav 00065 +#"You shall die here, %c. %rA cannot hope to defeat me." +「あなたはここで死ぬのです,%c.%rごときでは私を + 倒すなど夢物語ですね.」 +%E +%Cp Cav 00066 +#"You, a mere %r challenge the might of %n? Hah!" +「%nの力に挑戦するとは希な%rですね.ふーん」 +%E +%Cp Cav 00067 +#"I am the Mother of all Dragons! You cannot hope to defeat me." +「私は全ドラゴンの母です!倒すなど言う馬鹿げた考えは棄てなさい.」 +%E +%Cp Cav 00068 +#"My claws are sharp now. I shall rip you to shreds!" +「今日の私の爪は鋭いですよ.ずたずたにしてあげましょう!」 +%E +%Cp Cav 00069 +#"%d has deserted you, %c. This is my domain." +「%dはあなたを見捨てたようですね,%c.ここは私の + 領域なのですよ.」 +%E +%Cc Cav 00070 +#As you pick up %o it seems heavy at first, but as you +#hold it strength flows into your arms. +# +#You suddenly feel full of power, as if nothing could possibly stand +#in your path. +あなたは,%oを拾った.最初は重く感じたがそれを持つと力が腕に +注がれてきた. + +あなたは,力が満たされたように感じ,誰も行く手を阻むことなどできないよ +うな気がした. +%E +%Cp Cav 00080 +#%nC sinks to the ground, her heads flailing about. +#As she dies, a cloud of noxious fumes billows about her. +%nは地面に崩れ,彼女の頭がガクンとうなだれた. +彼女が死ぬと,有毒ガスが体からたちこめた. +%E +%Cc Cav 00081 +#%lC glimpses %o in your possession. +#He smiles and says: +# +# You have done it! We are saved. But I fear that %o +# will always be a target for %C forces who will want it for their +# own. +# +# To prevent further trouble, I would like you, %p, +# to take %o away with you. It will help you as you +# quest for the Amulet of Yendor. +%lはあなたが持っている%oをちらっと見ると,微笑み +ながら話しかけた: + + 見事なしとげたか!我らは助かった.しかし,私は%oが + それを手に入れんとする者の,いつでも%cの力の脅威 + にあることを恐れている. + + そのような問題を避けるため,私は次のようにしてはどうかと思って + いる.%pよ,お前が%oを持っていくのだ. + それはお前のイェンダーの魔除けを捜す冒険の助けになるだろう. +%E +%Cc Cav 00082 +%lは%oを勢いよく掴み,あなたを見つめた. + +「今や,お前は%oの守護者だ. + 魔除け探索を再開せよ.魔法の入口の向こうで, + %Zがお前を待っているぞ. +%E +%Cp Cav 00090 +#"%p! Welcome back. +#How goes your quest to recover the Amulet for %d?" +「%p!戻ってきたか. + %dの魔除けを取り戻す冒険はどんな調子だい?」 +%E +%Cc Cav 00091 +#"You have been successful, I see, %p. +# +#"Now that the Amulet of Yendor is yours, here is what you must do: +# +#"Journey upwards to the open air. The Amulet you carry will then +#take you into the Astral Planes, where the Great Temple of %d +#casts its influence throughout our world. +# +#"Sacrifice the Amulet on the altar. Thus shall %d become supreme!" +「成功したのか%pよ. + +「いまや,イェンダーの魔除けはお前の手にある,何をすべきか教えて + しんぜよう: + +「大いなる空へ旅を続けるのだ.魔除けがお前を精霊界へつれて行って + くれるだろう.そこには世界中に影響を与えている + %dの大寺院がある. + +「魔除けを献上せよ.%dが迎えてくれるだろう!」 +%E +# +# Healer +# +%Cc Hea 00001 +#What sorcery has brought you back to %H? The smell +#of fresh funeral pyres tells you that something is amiss with the healing +#powers that used to practice here. +# +#No rhizotomists are tending the materia medica gardens, and where are the +#common folk who used to come for the cures? +# +#You know that you must quickly make your way to the collegium, and +#%ls iatreion, and find out what has happened in your +#absence. +どんな魔法があなたを%Hに連れ戻したのだ?真新しい火葬用の +薪の匂いが,ここで開業するために使った治癒の力のどこかに不具合が生じて +いると告げている. + +薬用植物園へ向かう神経科医の姿もない.治療に来ていた人々はいったい +どこに行ってしまったのだ? + +あなたがいない間に何が起こったのかを知るために,すぐに委員会と +%lの医療所に出向く必要があるだろう. +%E +%Cp Hea 00002 +#After your last experience you expected to be here, but you certainly +#did not expect to see things so much worse. This time you must +#succeed. +予想された最後の経験を終えた後でも,しかしこれほどまで +事態が酷くなっていようとは思ってもいなかった.あなたは必ず +成功しなければならないのだ. +%E +%Cp Hea 00003 +#Again, you %x %H in the distance. +# +#The smell of death and disease permeates the air. You do not have +#to be %Ra to know that %n is on the verge of victory. +ふたたび,あなたは遠くに%Hを%xた. + +死と病の匂いが空気中に立ちこめている.%Raならずとも, +%nがまさに勝利を収めんとしていることが分かるだろう. +%E +%Cp Hea 00005 +#"Did you read that new treatise on the therapeutic use of leeches?" +「ヒルの治療学的使用法に関する新しい論文は読んだか?」 +%E +%Cp Hea 00006 +#"Paint a red caduceus on your shield and monsters won't hit you." +「赤い蛇杖を盾に描けば,怪物は攻撃してこなくなるだろう.」 +%E +%Cp Hea 00007 +#"I passed handwriting so they are demoting me a rank." +「筆記試験に合格したので,彼らは私を降格する.」 +%E +%Cp Hea 00008 +#"I've heard that even %l has not been able to cure Chiron." +「%lですら,ケイローンを治療することは出来ぬと聞いたぞ.」 +%E +%Cp Hea 00009 +#"We think %n has used his alchemists, and %o, +#to unleash a new disease we call 'the cold' on Gehennom." +「我らは%nが錬金術と%oを使って,ゲヘナで + 『風邪』と呼ばれる新たな病を解き放ったと考えている.」 +%E +%Cp Hea 00010 +#"Did you read that new treatise on the therapeutic use of leeches?" +「ヒルの治療学的使用法に関する新しい論文は読んだか?」 +%E +%Cp Hea 00011 +#"Paint a red caduceus on your shield and monsters won't hit you." +「赤い蛇杖を盾に描けば,怪物は攻撃してこなくなるだろう.」 +%E +%Cp Hea 00012 +#"How are you feeling? Perhaps a good bleeding will improve your sprits." +「どんな感じだい?たぶん,いい流血がおまえの魂を良くしてくれるだろうよ.」 +%E +%Cp Hea 00013 +#"Have you heard the absurd new theory that diseases are caused by +#microscopic organisms, and not ill humors?" +「疾病が,悪い血ではなく微生物によって引き起こされるという +ばかげた新説を聞いたかい?」 +%E +%Cp Hea 00014 +#"I see that you bring %o, now you can cure this plague!" +「あなたは%oを持ち帰り,この疫病を癒してくれるでしょう.」 +%E +%Cc Hea 00015 +#Feebly, %l raises his head to look at you. +# +#"It is good to see you again, %p. I see the concern in your +#eyes, but do not worry for me. I am not ready for Hades yet. We have +#exhausted much of our healing powers holding off %n. +#I need your fresh strength to carry on our work. +# +#"Come closer and let me lay hands on you, and determine if you have +#the skills necessary to accomplish this mission." +力なく,%lはあなたに顔を向けた. + +「再び会えて良かった,%pよ.心配そうな目だな,だが案ずるこ + とはない.まだハデスの世話にはならん.我らは%nを防ぐのに + 癒しの力を使い尽くしてしまった.この仕事を続けるにはお前の若い力が + 必要なのだ. + +「近くに寄って手を取るがいい.お前にこの任務を成し遂げる技量があるか + 見きわめよう.」 +%E +%Cp Hea 00016 +#"Again you return to me, %p. I sense that each trip back +#the pleurisy and maladies of our land begin to infect you. Let us +#hope and pray to %d that you become ready for your task before +#you fall victim to the bad humors." +「また帰ってきたな,%pよ.それぞれの旅は肋膜炎と背中合わせで, + 我らの国の病気がそなたに影響をおよぼし始めているのが感じられる. + %dに祈りを捧げて,そなたが悪しき気の犠牲になる前に仕事の + 準備ができるよう期待しているぞ.」 +%E +%Cp Hea 00017 +#"Chiron has fallen, Hermes has fallen, what else must I tell you to +#impress upon you the importance of your mission! I hope that you +#have come prepared this time." +「ケイローンが死に,ヘルメスが死に,他に何をもってお前に任務の + 重要性を認識させればよいのだ!もう覚悟は決めたのだろうな.」 +%E +%Cc Hea 00018 +#"You have failed us, %p. You are a quack! A charlatan! +# +#"Hades will be happy to hear that you are once again practicing your +#arts on the unsuspecting." +「お前には失望した,%pよ.お前はにせ医者だ!いんちき野郎! + +「お前がまた医者を始めたと聞いたら,ハデスはさぞ喜ぶだろうよ.」 +%E +%Cc Hea 00019 +#"Alas, %p, you are yet too inexperienced to deal with the rigors +#of such a task. You must be able to draw on the knowledge of botany, +#vetenary, and alchemy before I can send you on this quest with good +#conscience. +# +#"Return when you wear %Ra's caduceus." +「ああ!%pよ,お前はまだこの様な難しい仕事をこなすに + はあまりにも未熟だ.安心してこの探索に送り出す前には,植物学,獣医学, + 錬金術の知識を利用できなければならぬ. + +「%Raの蛇杖を身につけたら戻って来るのだ.」 +%E +%Cc Hea 00020 +#"You have learned much of the remedies that benefit, but you must also +#know which physic for which ail. That is why %ds teachings are a +#part of your training. +# +#"Return to us when you have healed thyself." +「そなたは数多くの有益な治療法を学んだ.だがどの薬がどの病に + 効くかも学ばねばならぬ.%dの教えがそなたの訓練の一部と + なっているのはそのためだ. + +「汝自身を癒したら戻って来い.」 +%E +%Cc Hea 00021 +#For the first time, you sense a smile on %ls face. +# +# You have indeed learned as much as we can teach you in preparation +# for this task. Let me tell you what I know of the symptoms and hope +# that you can provide a cure. +# +# A short while ago, the dreaded %nt was fooled by the gods +# into thinking that he could use %o to find a +# cure for old age. Think of it, eternal youth! But his good +# health is accomplished by drawing the health from those around him. +# +# He has exhausted his own supply of healthy people and now he seeks to +# extend his influence into our world. You must recover from him +# %o and break the spell. +# +# You must travel into the swamps to %i, and from there +# follow the trail to the %ns island lair. Be careful. +最初に,%lの顔に笑みが浮かんでいるのを感じた. + + そなたは確かに我々がこの仕事の準備にと教えうる限りのことを + 学んだ.私が知っているきざしを話し,そなたが癒しを + 施すことを期待しよう. + + 少し前に,恐るべき%nは神々に騙されて + %oを用いれば老いを癒すことができると考えた. + 永遠の若さだ!しかしやつの健康は,周囲の健康を奪うことに + よってなされている. + + やつは健康な人々の備えを使い尽くし,今やその影響力を + 我らの世界にまで広げようとしている.そなたは%oを + やつから取り戻し,呪文を打ち破らねばならない. + + 沼地を通って%iへ赴き,そこから%nの + 隠れ家となっている島への手がかりを追うのだ.注意せよ. +%E +%Cp Hea 00025 +#"Remember, %p, to always wash your hands before operating." +「忘れるな,%pよ.手術の前には必ず手を洗うのだ.」 +%E +%Cp Hea 00026 +#"%nC has no real magic of his own. To this he is vulnerable." +「%nは自らの魔法を持たぬ.そこがやつの弱味だ.」 +%E +%Cp Hea 00027 +#"If you have been true to %d, you can draw on the power of +#%o." +「%dに対して誠実であったのなら, + %oの力が利用できる.」 +%E +%Cp Hea 00028 +#"Bring with you antidotes for poisons." +「解毒剤を持って来なさい.」 +%E +%Cp Hea 00029 +#"Remember this, %n cannot use %o +#to harm you, it has only healing powers." +「覚えておけ,%nは%oでお前を傷つけることは出来ぬ. + 癒しの力しか持っていないからだ.」 +%E +%Cp Hea 00030 +#"I have sent for Chiron, but I am afraid he will come too late." +「ケイローンには使いを出した.しかし彼が来る頃にはもう + 遅すぎるかもしれぬ.」 +%E +%Cp Hea 00031 +#"Maybe when you return the snakes will once again begin to shed." +「そなたが戻って来た時,蛇は再び脱皮するかもしれぬ.」 +%E +%Cp Hea 00032 +#"The plague grows worse as we speak. Hurry, %p!" +「話している間にも疫病は一層悪くなってきている.急げ,%pよ!」 +%E +%Cp Hea 00033 +#"Many times %n has caused trouble in these lands. It is +#time that he was eradicated like the diseases he has caused." +「%nは何度もこの地に禍を引き起こした.やつがもたらした病気の + ように,今度はやつが滅ぼされる番だ.」 +%E +%Cp Hea 00034 +#"With but one eye, %n should be easy to blind. Remember this." +「片目しかないがゆえに,%nは盲目になりやすい.覚えておけ.」 +%E +%Cc Hea 00035 +#You stand before the entrance to %i. Strange +#scratching noises come from within the building. +# +#The swampy ground around you seems to stink with disease. +あなたは%iの入口の前に立った.奇妙な +引っかく音が建物の中から聞こえてくる. + +まわりの沼地は病で腐っているように見える. +%E +%Cp Hea 00036 +#Once again you stand at the entrance to %i. +もう一度あなたは%iの入口に立った. +%E +%Cc Hea 00040 +#You stand within sight of the infamous Isle of %n. Even +#the words of %l had not prepared you for this. +# +#Steeling yourself against the wails of the ill that pierce your ears, +#you hurry on your task. Maybe with %o you can +#heal them on your return, but not now. +あなたは忌まわしき%nの島が見える場所に立った. +%lの言葉ですらこのことを覚悟させるものではなかった. + +耳を貫く不吉な風の音に心を固くして,あなたは仕事を急いだ. +%oをもってすれば,帰って彼らを癒すことが出来るかもしれぬ. +だがそれは今ではない. +%E +%Cp Hea 00041 +#Once again, you %x the Isle of %n in the distance. +もう一度,あなたは向こうに%nの島を%xた. +%E +%Cc Hea 00050 +#"They have made a mistake in sending you, %p. +# +#"When I add your youth to mine, it will just make it easier for me +#to defeat %l." +「やつらがお前を送り込んだのは間違いだったようだな,%pよ. + +「お前の若さを手に入れれば,%lを滅ぼすのは更にたやすくなるだろう.」 +%E +%Cp Hea 00051 +#"Unlike your patients, you seem to keep coming back, %p!" +「お前の患者とは違って,戻って来たようだな,%pよ!」 +%E +%Cp Hea 00052 +#"Which would you like, %p? Boils, pleurisy, convulsions?" +「どれが好みだ,%p?腫れ物,腹膜炎,それとも痙攣か?」 +%E +%Cp Hea 00053 +#"I'll have %o back from you, %r. You are +#not going to live to escape this place." +「きっと%oを取り戻す,%rよ.この場所から逃げ出して + 生き延びることなど出来ぬぞ.」 +%E +%Cp Hea 00060 +#"They might as well give scalpels to wizards as to let you try to +#use %o!" +「お前に%oを使わせるとは,魔法使いにメスを + 与えるようなものだ!」 +%E +%Cp Hea 00061 +#"If I could strike %l, surrounded by his %gP, imagine what I +#can do to you here by yourself." +「%gPに囲まれた%lを倒すことができるとはどういうことか, + 想像してみたまえ.」 +%E +%Cp Hea 00062 +#"I will put my %Rp to work making a physic out of your ashes." +「お前の骸の届かぬところで%Rpに治療をさせてくれる.」 +%E +%Cp Hea 00063 +#"As we speak, Hades gathers your patients to join you." +「我らが話している間にも,ハデスはお前の患者を集めて + お前の道連れにしてくれるぞ.」 +%E +%Cp Hea 00064 +#"After I'm done with you, I'll destroy %l as well." +「お前が済んだら,%lも同じように滅ぼしてくれるわ.」 +%E +%Cp Hea 00065 +#"You will have to kill me if you ever hope to leave this place." +「この地を去りたいのなら,私を殺さねばならぬ.」 +%E +%Cp Hea 00066 +#"I will impale your head on my caduceus for all to see." +「皆に見えるように,お前の頭を私の蛇杖に突き刺してやろう.」 +%E +%Cp Hea 00067 +#"There is no materia medica in your sack which will cure you of me!" +「袋の中に,お前を直してくれるような薬品はない.」 +%E +%Cp Hea 00068 +#"Do not fight too hard, I want your soul strong, not weakened!" +「あまり激しく戦うな.お前の魂を強くしたいのであって, + 弱くしたいのではない!」 +%E +%Cp Hea 00069 +#"You should have stopped studying at vetenary." +「獣医学を勉強するのをやめるべきだ.」 +%E +%Cc Hea 00070 +#As you pick up %o, you feel its healing begin to +#warm your soul. You curse Zeus for taking it from its rightful owner, +#but at least you hope that %l can put it to good use once +#again. +%oを拾い上げると,癒しの力があなたの魂を温め始めるのが +感じられた.あなたはこれを正しい持ち主から奪ったゼウスを +呪ったが,少なくとももう一度適切に使われることを望んだ. +%E +%Cc Hea 00080 +#The battered body of %n slumps to the ground and gasps +#out one last curse: +# +# You have defeated me, %p, but I shall have my revenge. +# How, I shall not say, but this curse shall be like a +# cancer on you. +# +#With that %n dies. +%nの潰れた体は地面へと崩れ落ち,喘ぎながら最後の呪いを放った. + + お前の勝ちだ,%p.だがきっと復讐してやる. + その方法は言わぬが,この呪いは癌のようにお前を蝕むだろう. + +かくして%nは死んだ. +%E +%Cc Hea 00081 +#As soon as %l sees %o he summons his %gP. +# +#Gently, %l reaches out and touches %o. +#He instructs each of the assembled to do the same. When everyone +#has finished he speaks to you. +# +# Now that we have been replenished we can defeat this plague. You must +# take %o with you and replenish the worlds you have +# been called upon to travel next. I wish you could ride Chiron to the +# end of your journey, but I need him to help me spread the cure. Go +# now and continue your journey. +%lは%oを見るやいなや,彼の%gPを呼び寄せた. + +静かに,%lは手を伸ばして%oに触れた. +彼は集まった各々に同じことをするように教えた.全てが終った後, +彼はあなたに話しかけた. + + 今こそ我らは満たされ,この疫病を打ち破ることができる. + そなたは%oを携えて,次に旅するよう求められている世界を + 満たさねばならぬ.ケイローンに乗って行ければよいのだが, + 癒しの力を広めるのに彼が必要だ.行ってそなたの旅を続けるのだ. +%E +%Cc Hea 00082 +#%l cautiously handles %o while watching you. +# +#"You are its keeper now, and the time has come to resume your search +#for the Amulet. %Z await your return through the +#magic portal which brought you here." +%lは%oを気をつけて掴み,あなたを見つめた. + +「今や,そなたは%oの守護者だ. + 魔除け探索を再開せよ.魔法の入口の向こうで, + %Zがそなたを待っているぞ. +%E +%Cp Hea 00090 +#"You have again returned to us, %p. We have done well in your +#absence, yes? How fare you upon your quest for the Amulet?" +「再び戻って来たな,%pよ.我々はそなたのいない間も + うまくやっている.魔除けの探索はどうだ?」 +%E +%Cc Hea 00091 +#"Ah, you have recovered the Amulet, %p. Well done! +# +#"Now, you should know that you must travel through the elemental planes +#to the astral, and there return the Amulet to %d. Go forth and +#may our prayers be as a wind upon your back." +「おお,魔除けを取り戻したのだな,%pよ.よくやった! + +「今こそ,界面を通って精霊界へと向かい,魔除けを%dに + 戻す旅に出なければならぬ.行け,そして我らの祈りが + そなたの背に吹く風とならんことを.」 +%E +# +# Knight +# +%Cc Kni 00001 +#You materialize in the shadows of %H. Immediately, you notice +#that something is wrong. The fields around the castle are trampled and +#withered, as if some great battle has been recently fought. +# +#Looking closer, you %x long gouges in the walls of %H. +#You know of only one creature that makes those kinds of marks... +あなたは%Hの影の中に現れた.が,すぐに何かが違っている +ことに気付いた.城の周囲の草原は踏みつけられて萎れている.まるでつい +最近なにか大きな争いがあったかのようである. + +間近をみると,%Hの壁に細長い溝があるのが見える. +このような傷をつけられるのは唯一あの生物だけであることを, +あなたは知っている... +%E +%Cp Kni 00002 +#Once again you stand in the shadows of %H. +あなたは%Hの影の中に再び現れた. +%E +%Cp Kni 00003 +#Again, you stand before %H. You vaguely sense that this +#may be the last time you stand before %l. +あなたはまた%Hの前にいる.あなたはなんとなく, +%lの前に立つのがこれで最後となろうことを感じていた. +%E +%Cp Kni 00005 +#"Hail, %p! Verily, thou lookest well." +「ようこそ%pよ!汝は実に元気そうだ.」 +%E +%Cp Kni 00006 +#"There is word, %p, that %n hath been sighted in the fens +#near %i." +「%pよ,話がある.%nが%iの側の沼地で + 目撃されたというのだ.」 +%E +%Cp Kni 00007 +#"Thou art our only hope now, %p." +「%pよ,汝だけが我らが最後の希望となった.」 +%E +%Cp Kni 00008 +#"Verily, %l could have no better champion, %p." +「実に%lには勝者は%pを除いては見当たるまい.」 +%E +%Cp Kni 00009 +#"Many brave %cP died when %n attacked." +「多くの%cPが%nと戦い,そして死んでいった.」 +%E +%Cp Kni 00010 +#"Hail, %p! Verily, thou lookest well." +「ようこそ%pよ!汝は実に元気そうだ.」 +%E +%Cp Kni 00011 +#"So, %p, didst thou find %n in the fens +#near %i?" +「なぁ,%p,%nを%iの側の沼地で見なかったかい?」 +%E +%Cp Kni 00012 +#"Worthy %p, hast thou proven thy right purpose on the body of %n?" +「偉大なる%pよ,汝は%nの身体の上に正しき目的を見い出すであろう.」 +%E +%Cp Kni 00013 +#"Verily, %l could have no better champion, %p." +「実に%lには勝者は%pを除いては見当たるまい.」 +%E +%Cp Kni 00014 +#"Hast thou indeed recovered %o?" +「まことに汝が%oを取り戻してくれるのだな?」 +%E +%Cc Kni 00015 +#"Ah, %p. We see thou hast received our summons. +#We are in dire need of thy prowess. But first, We must needs +#decide if thou art ready for this great undertaking." +「おお,%pよ.汝は我らが召喚に応じたのであろう. +我々には汝の武勇が必要だ.だがまず最初に,汝がこの偉大な使命に +対して準備ができているかどうか決めなければならない.」 +%E +%Cp Kni 00016 +#"Welcome again, %p. We hope thou art ready now." +「よくぞ参った,%pよ.汝の準備が整っていることを期待するぞ.」 +%E +%Cp Kni 00017 +#"Once again, thou standest before us, %p. Art thou ready now?" +「またも汝は我らがもとに来た,%pよ.準備はできたか?」 +%E +%Cp Kni 00018 +#"Thou disgracest this noble court with thine impure presence. We have been +#lenient with thee, but no more. Thy name shall be spoken no more. We +#hereby strip thee of thy title, thy lands, and thy standing as %ca. +#Begone from our sight!" +「汝はこの高貴なる廷をその汚らわしい存在で辱めたのだ.我々は +汝には寛大であった.が,それもこれまでである.汝の名は二度と口 +にされるまい.これにより我らは汝の称号,土地,そして%cとして +の地位も剥奪してくれよう.立ち去るがいい!」 +%E +%Cp Kni 00019 +#"Verily, %p, thou hast done well. That thou hast survived thus +#far is a credit to thy valor, but thou art yet unprepared for +#the demands required as Our Champion. %rA, no matter how +#pure, could never hope to defeat the foul %n. +# +#"Journey forth from this place, and hone thy skills. Return to +#Our presence when thou hast attained the noble title of %R." +「%pよ,実によくやった.汝がこれまでに切り抜けてきたことは, +その武勇伝に刻まれている.しかし汝は,我らの擁護者に +必要とされる要求に対してまだ準備ができていない. +%rAは,たとえどんなに高潔であっても, +卑劣な%nをうち負かすことはまったく望めない. + +「この場所から旅立ち,そして汝の能力を磨け.%Rの高貴な称号を +勝ち得たら,我々の場所へ戻ってくるがいい.」 + +%E +%Cp Kni 00020 +#"Thou dishonourest us, %p! Thou hast strayed from the path of +#chivalry! Go from our presence and do penance. Only when thou art again +#pure mayst thou return hence." +「%pよ,汝は我らが名誉を汚した!汝は騎士道を踏み外したのだ! +ここから立ち去り,そして懺悔するがよい.汝が再び純粋になったなら, +ここに戻ることを許そう.」 +%E +%Cc Kni 00021 +#"Ah, %p. Thou art truly ready, as no %c before thee hath +#been. Hear now Our words: +# +#"As thou noticed as thou approached %H, a great battle hath +#been fought recently in these fields. Know thou that Merlin himself +#came to aid us here as we battled the foul %n. In the midst of that +#battle, %n struck Merlin a great blow, felling him. Then, as our +#forces were pressed back, %n stole %o. +# +#"We eventually turned the tide, but lost many %cP in doing so. +#Merlin was taken off by his apprentice, but hath not recovered. We have +#been told that so long as %n possesseth %o, +#Merlin will not regain his health. +# +#"We hereby charge thee with this most important of duties: +# +#"Go forth from this place, to the fens, and there thou wilt find +#%i. From there, thou must track down %n. Destroy the +#beast, and return to Us %o. Only then can +#We restore Merlin to health." +「おお,%pよ.汝の用意が整ったようだ.汝のような%cはこれまで +現れなかった.さあ,我らが命を伝えよう: + +「汝が%Hに到着してすぐに気付いたとおり,つい最近この平原で + 戦いがあった.知っての通り,醜い%nと戦うために + マーリン自身がここに我らの手助けに来たのだ.その戦いの中で, + %nの強大な一撃でマーリンは倒れてしまった. + そして我らが軍勢は撤退を余儀なくされ,%nに + %oを奪われたのだ. + +「結果として形勢は変わり,多くの%cPを失ってしまった. + マーリンはその弟子に連れていかれたが,まだ回復していない. + %nが%oを所有している限り,マーリンがその健康を + 回復しないと聞いている. + +「そこで我々は汝に次の極めて重大な義務を課すこととなったのだ: + +「この場所から沼地に向かい,そしてそこで汝は%iを探す. + そして,そこから汝は%nを追跡し捉える.その獣を倒し,我らに + %oを取り返すのだ.そしてその時初めてマーリンは健康を回復する + ことができるだろう.」 +%E +%Cp Kni 00025 +#"Remember, %p, follow always the path of %d." +「%pよ,常に%dの足跡に従うことを忘れるでない.」 +%E +%Cp Kni 00026 +#"Though %n is verily a mighty foe, we have confidence in thy victory." +「%nは実に強力な敵だが,我々は汝の勝利に自信を持っている.」 +%E +%Cp Kni 00027 +#"Beware, for %n hath surrounded himself with hordes of foul creatures." +「%nはそのまわりをおぞましい生物の大群で守られているという. +気を付けるがいい.」 +%E +%Cp Kni 00028 +#"Great treasure, 'tis said, is hoarded in the lair of %n." +「すばらしい宝物が%nの巣に貯えられているという.」 +%E +%Cp Kni 00029 +#"If thou possessest %o, %p, %ns magic +#shall therewith be thwarted." +「%pよ,もし汝が%oを手に入れているのであれば, + それによって%nの魔法をくじくことができよう.」 +%E +%Cp Kni 00030 +#"The gates of %i are guarded by forces unseen, %p. +#Go carefully." +「%pよ,%iの門は見えない力で守られているぞ. +気を付けて行くがいい.」 +%E +%Cp Kni 00031 +#"Return %o to us quickly, %p." +「%oを直ちに我らが手に取り返すのだ,%pよ.」 +%E +%Cp Kni 00032 +#"Destroy %n, %p, else %H shall surely fall." +「%nを倒すのだ,%pよ.さもなくば + %Hは確実に落ちよう.」 +%E +%Cp Kni 00033 +#"Call upon %d when thou art in need." +「汝が必要になれば,%dを求めるがよい.」 +%E +%Cp Kni 00034 +#"To find %i, thou must keep thy heart pure." +「汝が%iを見つけるには,純粋な心を保たねばならない.」 +%E +%Cc Kni 00035 +#You stand at the foot of %i. Atop, you can %x a shrine. +#Strange energies seem to be focused here, and the hair on the back +#of your neck stands on end. +あなたは%iのすそに立たずんでいる.その頂上にはほこらが見えた. +怪しいエネルギーがそこに集中しているように見え,そしてあなたの後ろ髪は +ピンと逆立った. +%E +%Cp Kni 00036 +#Again, you stand at the foot of %i. +再びあなたは%iのすそにいる. +%E +%Cc Kni 00040 +#As you exit the swamps, you %x before you a huge, gaping hole in the +#side of a hill. From within, you smell the foul stench of carrion. +# +#The pools on either side of the entrance are fouled with blood, and +#pieces of rusted metal and broken weapons show above the surface. +あなたがその沼から脱出すると,目前に,大きくぱっくりと開いた穴が +丘の側面にあるのが見えた.その中から屍肉の悪臭がただよってくる. + +入り口の周囲の水たまりは血で汚れ,その表面には錆びた金属や壊れた +武器が見える. +%E +%Cp Kni 00041 +#Again, you stand at the entrance to %ns lair. +再び,あなたは%nの巣の入り口に立っていた. +%E +%Cp Kni 00050 +#"Hah! Another puny %c seeks death. I shall dine well tonight, +#then tomorrow, %H shall fall!" +「むふふ,またしてもおろかな%sが死を求めておる.今夜はごちそう + にしようぞ.そして明日は%Hが落ちるのだ!」 +%E +%Cp Kni 00051 +#"Thy strength waneth, %p. The time of thy death draweth near." +「またしても汝は我に挑もうというのか,%rよ?好きにするがいい. +が,ここで死ぬことになるぞ.」 +%E +%Cp Kni 00052 +#"Thou art truly foolish, %r. I shall dispatch thee anon." +「まったくもって汝はたわけだな,%r.さっさと汝を片付けてくれよう.」 +%E +%Cp Kni 00053 +#"So, thou darest touch MY property! I shall have that bauble back, +#puny %r. Thou wilt die in agony!" +「ずうずうしくも我が財産に触れようとは!それは子供だましの後ろにあるのだ, +おろかな%rよ.苦しみもだえて死ぬがいい!」 +%E +%Cp Kni 00060 +#"A mere %r can never withstand me!" +「たかが%rでは我には耐えられぬぞ!」 +%E +%Cp Kni 00061 +#"I shall kill thee now, and feast!" +「汝をすぐに殺して,食ってくれよう!」 +%E +%Cp Kni 00062 +#"Puny %c. What manner of death dost thou wish?" +「ちっぽけな%cよ.どのような死を汝は望むのだ?」 +%E +%Cp Kni 00063 +#"First thee, %p, then I shall feast upon %l." +「最初は汝だ,%p.それから%lを食らおうぞ.」 +%E +%Cp Kni 00064 +#"Hah! Thou hast failed, %r. Now thou shalt die." +「むふふ,汝は失敗したようだな,%rよ.今こそ汝の死すべき時なり.」 +%E +%Cp Kni 00065 +#"Die, %c. Thou art as nothing against my might." +「死ね,%c.汝では我の力には適わぬ.」 +%E +%Cp Kni 00066 +#"I shall suck the marrow from thy bones, %c." +「汝の骨の髄まで吸ってやろうぞ,%cよ.」 +%E +%Cp Kni 00067 +#"Let's see... Broiled? No. Fried? Nay. Baked? Yea verily, +#that is the way I like my %c for dinner." +「ええい,あぶってやろうか?いや,揚げるか?否,焼く方がいいか? +しかり,こうやって%cをいただくのが実に我は好きなのだ.」 +%E +%Cp Kni 00068 +#"Thy strength waneth, %p. The time of thy death draweth near." +「%pよ,力が抜けていくだろう.もうじき汝に死が訪れようぞ」 +%E +%Cp Kni 00069 +#"Call upon thy precious %d, %p. It shalt not avail thee." +「貴重なる%dを求めてきたのか,%pよ. + 汝ではこれは使えぬぞ.」 +%E +%Cc Kni 00070 +#As you pick up %o, you feel its protective fields +#form around your body. You also feel a faint stirring in your mind, +#as if you are in two places at once, and in the second, you are waking +#from a long sleep. +あなたは%oを拾うと,あなたのまわりにその結界が生じるのを +感じた.また,まるで同時に二ヶ所にいるような,そしてたちまち長い眠りから +覚めたような,そんな軽い感動を覚えた. +%E +%Cc Kni 00080 +#As %n sinks to the ground, blood gushing from his open mouth, he +#defiantly curses you and %l: +# +# Thou hast not won yet, %r. By the gods, I shall return and dog +# thy steps to the grave! +# +#His tail flailing madly, %n tries to crawl towards you, but slumps +#to the ground and dies in a pool of his own blood. +%nはその開いた口から血を吹き出し地に沈んでいく一方で,挑戦的に +あなたと%lを呪って言った: + + 汝はまだ勝ったわけではないぞ,%rよ.ええい口惜しい,必ずや舞い戻り + 汝の血で汝の名を墓に刻んでやるぞ. + +狂ったように尻尾を振り回し,%nはあなたに近づこうともがいたが, +地面に伏して自らの血の海の中で死んだ. +%E +%Cc Kni 00081 +#As you approach %l, he beams at you and says: +# +# Well done! Thou art truly the Champion of %H. We +# have received word that Merlin is recovering, and shall soon +# rejoin us. +# +# He hath instructed us that thou art now to be the guardian of +# %o. He feeleth that thou mayst have need of +# its powers in thine adventures. It is our wish that thou keepest +# %o with thee as thou searchest for the fabled +# Amulet of Yendor. +%lに近づくと,彼はあなたに微笑み,そして言った: + + よくやった!汝は%Hの真の勝者となった.我々はマーリンが + 回復し,そしてじきに我らに合流すると伝えられている. + + 彼は我らに今や汝が%oの護衛として適していることを + 教えてくれた.彼は汝の冒険においてその力を汝が必要としているで + あろうことを感じているのだ.偉大なるイェンダーの魔除けの探索と + して,汝が%oとともにあることを我らは望んでいる. +%E +%Cc Kni 00082 +#"Careful, %p! %oC might break, and that would +#be a tragic loss. Thou art its keeper now, and the time hath come +#to resume thy search for the Amulet. %Z await thy +#return through the magic portal that brought thee here." +「気をつけろ%p!%oが壊れてしまう. + そうなったら大きな痛手だ.汝は%oの守護者だ. + 魔除け探索を再開せよ.魔法の入口の向こうで, + %Zが汝を待っているぞ.」 +%E +%Cp Kni 00090 +#"Well met, %p. How goeth thy search for the Amulet of Yendor?" +「よくぞ来た,%pよ.イェンダーの魔除けの探索はどうなっておる?」 +%E +%Cc Kni 00091 +#"Thou hast succeeded, we see, %p! Now thou art commanded to take +#the Amulet to be sacrificed to %d in the plane of the astral. +# +#"Merlin hath counseled us that thou must travel always upwards through +#the planes of the elements, to achieve this goal. +# +#"Go with %d, %p." +「よくやった,%pよ!汝は次は精霊界の%dに捧げるべく, +かの魔除けを持っていくのだ. + +「マーリンから次の助言をうけておる.それは汝がその目的を達成するには, +界面を通り抜けて上に向かわねばならないというものだ. + +「%pに%dの加護のあらんことを.」 +%E +# +# Monk +# +%Cc Mon 00001 +#You find yourself standing in sight of %H. Something +#is obviously wrong here. The doors to %H, which usually +#stand open, are closed. Strange human shapes shamble around +#outside. +# +#You realize that %l needs your assistance! +気がつくと,あなたは%Hの前に立っていた.が,何かが違う. +普段開いている%Hの戸は完全に閉ざされているし,奇妙な人間 +の格好をしたものが外をよろよろと歩いている. + +あなたは%lが手助けを求めていることに気付いた. +%E +%Cp Mon 00002 +#Once again, you stand before %H. +もう一度,あなたは%Hの前に立っていた. +%E +%Cp Mon 00003 +#Again you face %H. Your intuition hints that this may be +#the final time you come here. +あなたは再び %H の前に立っていた.虫の知らせか, +あなたはここに来るのがこれで最後なのかもしれないとを感じた. +%E +%Cp Mon 00005 +#"Greetings, honored %r. It is good to see you." +「よくぞ来た,光栄なる%rよ.そなたに会えて私は非常にうれしい.」 +%E +%Cp Mon 00006 +#"Ah, %p! Surely you can help us in our hour of need." +「%pよ.そなたならこの重大な時期に立たされている我らを助ける + ことが出来るであろう.」 +%E +%Cp Mon 00007 +#"Greetings, %s. %lC has great need of your help." +「ようこそ,我%sよ.%lがあなたに手助けを求めていらっしゃる.」 +%E +%Cp Mon 00008 +#"Alas, it seems as if even %d has deserted us." +「ああ,我々は%dにも見放されてしまったのではなかろうか.」 +%E +%Cp Mon 00009 +#"May %d be with you, %s." +「%dがあなたとともにあらんことを.」 +%E +%Cp Mon 00010 +#"Greetings, honorable %r. It is good to see you again." +「よくぞ来た,偉大なる%rよ.そなたに再び会えて私は非常にうれしい.」 +%E +%Cp Mon 00011 +#"Ah, %p! Our deepest gratitude for all of your help." +「%pよ.あなたの助けには深い感謝の念が絶えない.」 +%E +%Cp Mon 00012 +#"Greetings, %s. Perhaps you will take some time to meditate with us?" +「ようこそ,我%sよ.おそらく我々との計画はある程度の時間を要するでしょう.」 +%E +%Cp Mon 00013 +#"With this test behind you, may %d bring you enlightenment." +「後に控えているこの試練で,%dはあなたに悟りをもたらすだろう.」 +%E +%Cp Mon 00014 +#"May %d be with you, %s." +「%dがあなたとともにあらんことを.」 +%E +%Cc Mon 00015 +#"Ah, %p, my %S. You have returned to us at last. +#A great blow has befallen our order; perhaps you can help us. +#First, however, I must determine if you are prepared for this +#great challenge." +「我が%S%pよ.そなたはやっと我々のもとへ戻ってきた. + 我々の教団は現在重大な危機に頻しておる.これについて,そなたは我々の手 + 助けを出来るやもしれぬ. + しかし,まず最初に,私はそなたがこの大いなる挑戦に対する心構えが出来て + いるかどうか試さねばならぬ.」 +%E +%Cp Mon 00016 +#"Again, my %S, you stand before me. Are you ready now to help us?" +「我が%Sよ,そなたは再び私の前に現れた.我々の手助けをする + 心構えは出来たか?」 +%E +%Cp Mon 00017 +#"Once more, %p, you stand within the sanctum. Are you ready now?" +「%p,そなたは再び聖域の内に現れた.準備は出来たか?」 +%E +%Cc Mon 00018 +#"You are a heretic, %p! How can you, %ra, deviate so from the +#teachings of %d? Begone from this temple. You are no longer +#%sa to this order. We will pray to %d for other assistance, +#as you have failed us utterly." +「%p,この異端が!どうしたら,そなたのような%rが%d + の教えからそれることが出来るのだ!この寺院の内から出ていけい!そなた + はもうこの教団の%sではない!そなたが我々の期待に応えられなかった + 手前,%dには他の手助けを乞うよう祈ろう.」 +%E +%Cc Mon 00019 +#"Alas, %p, it is not yet to be. A mere %r could never +#withstand the might of %n. Go forth, again into the world, and return +#when you have attained the post of %R." +「%p,残念ながら,そちはまだ用意できておらぬようだ. + %rでは%nに太刀打ちすることは無理だ.また再び世の中へ出て, + %Rの地位をおさめることが出来たら帰ってくるがよい.」 +%E +%Cc Mon 00020 +#"This is terrible, %p. You have deviated from the true path! +#You know that %d requires the most strident devotion of this +#order. The %shood must stand for utmost piety. +# +#"Go from here, atone for your sins against %d. Return only when +#you have purified yourself." +「これはなんとひどいことじゃ,%p.そなたは正道から踏み外し + ている.そなたも存じておろう,%dは強い信仰心をこの教団に + 求めていることを.そなたは完璧なまでの信心を見せねばならぬ. + + ここから出て,%dへと働いた罪を懺悔するのだ.己の身を浄めら + れたときのみ,ここへと戻るがよい.」 +%E +%Cc Mon 00021 +#"Yes, %p. You are truly ready now. Attend to me and I shall +#tell you of what has transpired: +# +#"At one of the Great Festivals a short time ago, %n and a legion +#of undead invaded %H. Many %gP were killed, including +#the one carrying %o. +# +#"As a final act of vengefulness, %n desecrated the altar here. +#Without it, we could not mount a counter-attack. Now, there are +#barely enough %gP left to keep the undead at bay. +# +#"We need you to find %i, then, from there, travel +#to %ns lair. If you can manage to defeat %n and return +#%o here, we can then drive off the legions of +#undead that befoul the land. +# +#"Go with %d as your guide, %p." +「%pよ.そなたは用意が出来ておるようだ.今から何が起こったか + 話すので,私のいうことに耳を傾けてくれ. + +「少し前の大祭に,%nと,%nに引き連られたアンデッドの軍団が + %Hを攻めたのだ.%oを持っていた者を始め,多くの + %gが殺されたのだ. + +「そしてその後,恐れ多くも%nはここの祭壇を汚したのだ. + 祭壇なしでは我々は逆襲することは出来ない.そして現在,我々のもとには + %Hに軍勢を寄せつけないためにするだけの,ごく小数の%g + しかいないのだ. + +「まず最初に,%iを探し,そして,そこから%nのアジトへと向かっ + てもらう.もしそなたが%nを倒して,%oを持ち帰ってくることが + 出来るのならば,我々はこの土地を汚すアンデッド + どもを追い返せるのだ. + +「さあ,%dの加護のもと,行くのだ,%pよ.」 +%E +%Cp Mon 00025 +#"You can prevail, if you rely on %d." +「%dを信ずれば,そなたは勝てる.」 +%E +%Cp Mon 00026 +#"Remember that %n has great magic at his command." +「%nはすさまじい魔術を意のままに操る,ということを肝に命じておけ.」 +%E +%Cp Mon 00027 +#"Be pure, my %S." +「清くあれ,我が%Sよ.」 +%E +%Cp Mon 00028 +#"Beware, %i is surrounded by a great graveyard." +「%iは巨大な墓地に囲まれておる,気をつけるように.」 +%E +%Cp Mon 00029 +#"You may be able to affect %n with magical cold." +「もしかすれば,%nを冷気の呪文で冒すことが出来るかもしれない.」 +%E +%Cp Mon 00030 +#"Acquire and wear %o if you can. It will aid you +#against %n." +「できるならば%oを手にいれ,装着するのだ.%nに対し効力を発揮 + するであろう.」 +%E +%Cp Mon 00031 +#"Call upon %d when your need is greatest. You will be answered." +「最も困ったと思われるときには%dに助けを求めよ. + そなたの願いは受けれられるであろう.」 +%E +%Cp Mon 00032 +#"Remember to use the elementals' strength against them!" +「元素の力を使うことを忘れるな!」 +%E +%Cp Mon 00033 +#"Do not loose faith, %p. If you do so, %n will grow stronger." +「%pよ,信仰心を忘れるな.もしそのようなことがあれば, + %nはより強くなることであろう.」 +%E +%Cp Mon 00034 +#"Wear %o. It will assist you against the undead." +「%oを装着せよ.さすれば,アンデッドに対し,効力を発揮する.」 +%E +%Cc Mon 00035 +#You stand facing a large graveyard. The sky above is filled with clouds +#that seem to get thicker closer to the center. You sense the presence of +#undead in larger numbers than you have ever encountered before. +# +#You remember the descriptions of %i, given to you by +#%lC. It is ahead that you will find %ns trail. +あなたは大きな墓地の前に立っている.空は中心へいくに連れてどんよりとし +ていく雲に囲まれている.あなたは今までに遭遇したことのないほどのアンデッ +ドの大軍の存在を察した. + +あなたは%lが教えてくれた,%iの構造を思い出した. +前方に%nの通った跡があるようだ. +%E +%Cp Mon 00036 +#Again, you stand before %i. +あなたは再び%iの前に立った. +%E +%Cc Mon 00040 +#The stench of brimstone is all about you, and the shrieks and moans +#of tortured souls assault your psyche. +# +#Ahead, there is a small clearing amidst the bubbling pits of lava... +そこらじゅうが硫黄の臭いによって包まれ,不具な魂供の叫びやうめきが,あ +なたの不安をかりたてた. + +手前の,ぐつぐつと煮えたった溶岩の狭間に,小さな空き地がある. +%E +%Cp Mon 00041 +#Again, you have invaded %ns domain. +あなたは再び%nの領域を襲撃した. +%E +%Cc Mon 00050 +#"Ah, so %lC has sent another %g to retrieve +#%o. +# +#"No, I see you are no %g. Perhaps I shall have some fun today +#after all. Prepare to die, %r! You shall never regain +#%o." +「ケッ!%lがまたもや%gをよこしたのか, + %oを取り返すために. + +「いや,待て.そちは,ただの%gではないらしいな.もしかしたら, + 今日は少し楽しめるかもしれない.死ぬ準備でもするのだな,%r! + そなたが%oを取り返すことなど不可能なのだからな.」 +%E +%Cp Mon 00051 +#"So, %r. Again you challenge me." +「ほう,%r.そちはまた私に挑戦するのか.」 +%E +%Cp Mon 00052 +#"Die now, %r. %d has no power here to aid you." +「死ねい,%r.ここでは%dがそちを助けることはできぬ.」 +%E +%Cp Mon 00053 +#"You shall die, %r, and I will have %o back." +「%r,そちは死んで,私は%oを取り返すのだ.」 +%E +%Cp Mon 00060 +#"Submit to my will, %c, and I shall spare you." +「%cよ,私に服従すれば,私はそちを生かす.」 +%E +%Cp Mon 00061 +#"Your puny powers are no match for me, %c." +「%cよ,そちのような猪小才では私には到底及ばぬ.」 +%E +%Cp Mon 00062 +#"I shall have you turned into a zombie for my pleasure!" +「私の楽しみのために,そちをゾンビにでもしてやろう.」 +%E +%Cp Mon 00063 +#"Despair now, %r. %d cannot help you." +「絶望だな,%r.%dはそちを助けることはできぬ.」 +%E +%Cp Mon 00064 +#"I shall feast upon your soul for many days, %c." +「そちの魂を何日にも渡って喰らいつづけてやろうではないか,%c.」 +%E +%Cp Mon 00065 +#"Your death will be slow and painful. That I promise!" +「そちはじわじわと苦しめて殺してくれよう.それだけ私は約束する」 +%E +%Cp Mon 00066 +#"You cannot defeat %n, you fool. I shall kill you now." +「そちのようなうつけでは,%nに勝てぬのだ.殺して差し上げよう.」 +%E +%Cp Mon 00067 +#"Your precious %lt will be my next victim." +「%lが私の次の餌食となるであろう.」 +%E +%Cp Mon 00068 +#"I feel your powers failing you, %r. You shall die now." +「そちは力を調節出来ぬようだな,%r.そちはもう死ぬ.」 +%E +%Cp Mon 00069 +#"With %o, nothing can stand in my way." +「%oさえあれば,私に恐れるべきものはない.」 +%E +%Cc Mon 00070 +#As you pick up %o, you feel the essence of +#%d fill your soul. You know now why %n stole it from +#%H, for with it, %ca of %d could +#easily defeat his plans. +# +#You sense a message from %d. Though not verbal, you +#get the impression that you must return to %lC as soon +#as possible. +%oを拾うと,あなたは%dの本質を感じとった.そして, +%dの%cならば%nの野望を打ち破れるから, +%nが%Hより%oを盗んだ,ということに気付いた. + +あなたは%dからのメッセージを感じ取った.それは言葉に +よるものではないが,あなたはすぐ%lのもとへ帰らねばならない +ことを感じた. +%E +%Cc Mon 00080 +#%nC gasps: +# +# "You have only defeated this mortal body. Know this: my spirit +# is strong. I shall return and reclaim what is mine!" +# +#With that, %n expires. +%nはあえいだ. + + おまえはわが定命の肉体を退けたに過ぎぬ.覚えておくがよい. + 我が魂は強大である.私は必ず戻り,我が物を取り戻す! + +そして,%nは死んだ. +%E +%Cc Mon 00081 +#"You have returned, %p. And with %o, I see. +#Congratulations. +# +#"I have been in meditation, and have received direction from +#a minion of %d. %d commands that you retain +#%o. With it, you must recover the Amulet +#of Yendor. +# +#"Go forth, and let %d guide your steps." +%p,帰ってきたか..しかも,%oを手にして. +おめでとう. + +私はずっと瞑想していたのだが,%dの使者より命令を承った. +%dは,そなたに%oを持ち続けるように,と命じた.そして, +それをもって,イェンダーの魔除けを取り戻すのだ. +%E +%Cc Mon 00082 +#%lC studies %o for a moment, +#then returns his gaze to you. +# +#"%oC must remain with you. Use them +#as you resume your search for the Amulet. +#%Z await your return through the magic portal +#that brought you here." +%lは素早く%oをあなたに返した. + +「今や,そなたは%oの守護者だ. + 魔除け探索を再開せよ.魔法の入口の向こうで, + %Zがそなたを待っているぞ. +%E +%Cp Mon 00090 +#"Welcome back, %p. How is your quest for the Amulet going?" +よくぞ帰ってきた,%p.魔除けを探す方はどうなっているのだ. +%E +%Cc Mon 00091 +#"You have prevailed, %p! %d is surely with you. Now, +#you must take the amulet, and sacrifice it on %ds altar on +#the Astral plane. I suspect that I shall never see you again in this +#life, but I hope to at %ds feet." +%pよ,そちは打ち勝ったのだ!真に,%dはそちとともに在る. +さあ,そなたは魔除けを持って,これから精霊界にある%dの祭壇 +にそれを捧げるのだ.今生ではそなたに会うことはもうないだろう, +しかし,%dの足元でそなたに会うことを楽しみにしているぞ. +%E +# +# Priest +# +%Cc Pri 00001 +#You find yourself standing in sight of %H. Something +#is obviously wrong here. The doors to %H, which usually +#stand open, are closed. Strange human shapes shamble around +#outside. +# +#You realize that %l needs your assistance! +気がつくと,あなたは%Hの前に立っていた.が,何かが違う. +普段開いている%Hの戸は完全に閉ざされているし,奇妙な人間 +の格好をしたものが外をよろよろと歩いている. + +あなたは%lが手助けを求めていることに気付いた. +%E +%Cp Pri 00002 +#Once again, you stand before %H. +もう一度,あなたは%Hの前に立っていた. +%E +%Cp Pri 00003 +#Again you face %H. Your intuition hints that this may be +#the final time you come here. +あなたは再び %H の前に立っていた.虫の知らせか, +あなたはここに来るのがこれで最後なのかもしれないとを感じた. +%E +%Cp Pri 00005 +#"Greetings, honored %r. It is good to see you." +「よくぞ来た,光栄なる%rよ.そなたに会えて私は非常にうれしい.」 +%E +%Cp Pri 00006 +#"Ah, %p! Surely you can help us in our hour of need." +「%pよ.そなたならこの重大な時期に立たされている我らを助ける + ことが出来るであろう.」 +%E +%Cp Pri 00007 +#"Greetings, %s. %lC has great need of your help." +「ようこそ,我%sよ.%lがあなたに手助けを求めていらっしゃる.」 +%E +%Cp Pri 00008 +#"Alas, it seems as if even %d has deserted us." +「ああ,我々は%dにも見放されてしまったのではなかろうか.」 +%E +%Cp Pri 00009 +#"May %d be with you, %s." +「%dがあなたとともにあらんことを.」 +%E +%Cp Pri 00010 +"Greetings, %r. It is good to see you again." +「よくぞ来た,%rよ.そなたに再び会えて私は非常にうれしい.」 +%E +%Cp Pri 00011 +"Ah, %p! Our deepest gratitude for all of your help." +「%pよ.あなたの助けには深い感謝の念が絶えない.」 +%E +%Cp Pri 00012 +#"Welcome back, %s! With %o, no undead can stand against us." +「よく戻ってきた%sよ.%oとともにあれば,我々の通った後にはアンデッドはおるまい.」 +%E +%Cp Pri 00013 +#"Praise be to %d, for delivering us from %n." +「%dを崇めよ.%nから我々を救うものなり.」 +%E +%Cp Pri 00014 +#"May %d be with you, %s." +「%dがあなたとともにあらんことを.」 +%E +%Cc Pri 00015 +#"Ah, %p, my %S. You have returned to us at last. +#A great blow has befallen our order; perhaps you can help us. +#First, however, I must determine if you are prepared for this +#great challenge." +「我が%S%pよ.そなたはやっと我々のもとへ戻ってきた. + 我々の教団は現在重大な危機に頻しておる.これについて,そなたは我々の手 + 助けを出来るやもしれぬ. + しかし,まず最初に,私はそなたがこの大いなる挑戦に対する心構えが出来て + いるかどうか試さねばならぬ.」 +%E +%Cp Pri 00016 +#"Again, my %S, you stand before me. Are you ready now to help us?" +「我が%Sよ,そなたは再び私の前に現れた.我々の手助けをする + 心構えは出来たか?」 +%E +%Cp Pri 00017 +#"Once more, %p, you stand within the sanctum. Are you ready now?" +「%p,そなたは再び聖域の内に現れた.準備は出来たか?」 +%E +%Cc Pri 00018 +#"You are a heretic, %p! How can you, %ra, deviate so from the +#teachings of %d? Begone from this temple. You are no longer +#%sa to this order. We will pray to %d for other assistance, +#as you have failed us utterly." +「%p,この異端が!どうしたら,そなたのような%rが%d + の教えからそれることが出来るのだ!この寺院の内から出ていけい!そなた + はもうこの教団の%sではない!そなたが我々の期待に応えられなかった + 手前,%dには他の手助けを乞うよう祈ろう.」 +%E +%Cc Pri 00019 +#"Alas, %p, it is not yet to be. A mere %r could never +#withstand the might of %n. Go forth, again into the world, and return +#when you have attained the post of %R." +「%p,残念ながら,そちはまだ用意できておらぬようだ. + %rでは%n に太刀打ちすることは無理だ.また再び世の中へ出て, + %Rの地位をおさめることが出来たら帰ってくるがよい.」 +%E +%Cc Pri 00020 +#"This is terrible, %p. You have deviated from the true path! +#You know that %d requires the most strident devotion of this +#order. The %shood must stand for utmost piety. +# +#"Go from here, atone for your sins against %d. Return only when +#you have purified yourself." +「これはなんとひどいことじゃ,%p.そなたは正道から踏み外し + ている.そなたも存じておろう,%dは強い信仰心をこの教団に + 求めていることを.そなたは完璧なまでの信心を見せねばならぬ. + + ここから出て,%dへと働いた罪を懺悔するのだ.己の身を浄めら + れたときのみ,ここへと戻るがよい.」 +%E +%Cc Pri 00021 +#"Yes, %p. You are truly ready now. Attend to me and I shall +#tell you of what has transpired: +# +#"At one of the Great Festivals a short time ago, %n and a legion +#of undead invaded %H. Many %gP were killed, including +#the one carrying %o. +# +#"As a final act of vengefulness, %n desecrated the altar here. +#Without it, we could not mount a counter-attack. Now, there are +#barely enough %gP left to keep the undead at bay. +# +#"We need you to find %i, then, from there, travel +#to %ns lair. If you can manage to defeat %n and return +#%o here, we can then drive off the legions of +#undead that befoul the land. +# +#"Go with %d as your guide, %p." +「%pよ.そなたは用意が出来ておるようだ.今から何が起こったか + 話すので,私のいうことに耳を傾けてくれ. + +「少し前の大祭に,%nと,%nに引き連られたアンデッドの軍団が + %Hを攻めたのだ.%oを持っていた者を始め,多くの + %gが殺されたのだ. + +「そしてその後,恐れ多くも%nはここの祭壇を汚したのだ. + 祭壇なしでは我々は逆襲することは出来ない.そして現在,我々のもとには + %Hに軍勢を寄せつけないためにするだけの,ごく小数の%g + しかいないのだ. + +「まず最初に,%iを探し,そして,そこから%nのアジトへと向かっ + てもらう.もしそなたが%nを倒して,%oを持ち帰ってくることが + 出来るのならば,我々はこの土地を汚すアンデッド + どもを追い返せるのだ. + +「さあ,%dの加護のもと,行くのだ,%pよ.」 +%E +%Cp Pri 00025 +#"You can prevail, if you rely on %d." +「%dを信ずれば,そなたは勝てる.」 +%E +%Cp Pri 00026 +#"Remember that %n has great magic at his command." +「%nはすさまじい魔術を意のままに操る,ということを肝に命じておけ.」 +%E +%Cp Pri 00027 +#"Be pure, my %S." +「清くあれ,我が%Sよ.」 +%E +%Cp Pri 00028 +#"Beware, %i is surrounded by a great graveyard." +「%iは巨大な墓地に囲まれておる,気をつけるように.」 +%E +%Cp Pri 00029 +#"You may be able to affect %n with magical cold." +「もしかすれば,%nを冷気の呪文で冒すことが出来るかもしれない.」 +%E +%Cp Pri 00030 +#"Acquire and wear %o if you can. It will aid you +#against %n." +「できるならば%oを手にいれ,装着するのだ.%nに対し効力を発揮 + するであろう.」 +%E +%Cp Pri 00031 +#"Call upon %d when your need is greatest. You will be answered." +「最も困ったと思われるときには%dに助けを求めよ. + そなたの願いは受けれられるであろう.」 +%E +%Cp Pri 00032 +#"The undead legions are weakest during the daylight hours." +「アンデッドの軍団は日中,最も弱い.」 +%E +%Cp Pri 00033 +#"Do not loose faith, %p. If you do so, %n will grow stronger." +「%pよ,信仰心を忘れるな.もしそのようなことがあれば, + %nはより強くなることであろう.」 +%E +%Cp Pri 00034 +#"Wear %o. It will assist you against the undead." +「%oを装着せよ.さすれば,アンデッドに対し,効力を発揮する.」 +%E +%Cc Pri 00035 +#You stand facing a large graveyard. The sky above is filled with clouds +#that seem to get thicker closer to the center. You sense the presence of +#undead in larger numbers than you have ever encountered before. +# +#You remember the descriptions of %i, given to you by +#%lC. It is ahead that you will find %ns trail. +あなたは大きな墓地の前に立っている.空は中心へいくに連れてどんよりとし +ていく雲に囲まれている.あなたは今までに遭遇したことのないほどのアンデッ +ドの大軍の存在を察した. + +あなたは%lが教えてくれた,%iの構造を思い出した. +前方に%nの通った跡があるようだ. +%E +%Cp Pri 00036 +#Again, you stand before %i. +あなたは再び%iの前に立った. +%E +%Cc Pri 00040 +#The stench of brimstone is all about you, and the shrieks and moans +#of tortured souls assault your psyche. +# +#Ahead, there is a small clearing amidst the bubbling pits of lava... +そこらじゅうが硫黄の臭いによって包まれ,不具な魂供の叫びやうめきが,あ +なたの不安をかりたてた. + +手前の,ぐつぐつと煮えたった溶岩の狭間に,小さな空き地がある. +%E +%Cp Pri 00041 +#Again, you have invaded %ns domain. +あなたは再び%nの領域を襲撃した. +%E +%Cc Pri 00050 +#"Ah, so %lC has sent another %g to retrieve +#%o. +# +#"No, I see you are no %g. Perhaps I shall have some fun today +#after all. Prepare to die, %r! You shall never regain +#%o." +「ケッ!%lがまたもや%gをよこしたのか, + %oを取り返すために. + +「いや,待て.そちは,ただの%gではないらしいな.もしかしたら, + 今日は少し楽しめるかもしれない.死ぬ準備でもするのだな,%r! + そなたが%oを取り返すことなど不可能なのだからな.」 +%E +%Cp Pri 00051 +#"So, %r. Again you challenge me." +「ほう,%r.そちはまた私に挑戦するのか.」 +%E +%Cp Pri 00052 +#"Die now, %r. %d has no power here to aid you." +「死ねい,%r.ここでは%dがそちを助けることはできぬ.」 +%E +%Cp Pri 00053 +#"You shall die, %r, and I will have %o back." +「%r,そちは死んで,私は%oを取り返すのだ.」 +%E +%Cp Pri 00060 +#"Submit to my will, %c, and I shall spare you." +「%cよ,私に服従すれば,私はそちを生かす.」 +%E +%Cp Pri 00061 +#"Your puny powers are no match for me, %c." +「%cよ,そちのような猪小才では私には到底及ばぬ.」 +%E +%Cp Pri 00062 +#"I shall have you turned into a zombie for my pleasure!" +「私の楽しみのために,そちをゾンビにでもしてやろう.」 +%E +%Cp Pri 00063 +#"Despair now, %r. %d cannot help you." +「絶望だな,%r.%dはそちを助けることはできぬ.」 +%E +%Cp Pri 00064 +#"I shall feast upon your soul for many days, %c." +「そちの魂を何日にも渡って喰らいつづけてやろうではないか,%c.」 +%E +%Cp Pri 00065 +#"Your death will be slow and painful. That I promise!" +「そちはじわじわと苦しめて殺してくれよう.それだけ私は約束する」 +%E +%Cp Pri 00066 +#"You cannot defeat %n, you fool. I shall kill you now." +「そちのようなうつけでは,%nに勝てぬのだ.殺して差し上げよう.」 +%E +%Cp Pri 00067 +#"Your precious %lt will be my next victim." +「%lが私の次の餌食となるであろう.」 +%E +%Cp Pri 00068 +#"I feel your powers failing you, %r. You shall die now." +「そちは力を調節出来ぬようだな,%r.そちはもう死ぬ.」 +%E +%Cp Pri 00069 +#"With %o, nothing can stand in my way." +「%oさえあれば,私に恐れるべきものはない.」 +%E +%Cc Pri 00070 +#As you pick up %o, you feel the essence of +#%d fill your soul. You know now why %n stole it from +#%H, for with it, %ca of %d could +#easily defeat his plans. +# +#You sense a message from %d. Though not verbal, you +#get the impression that you must return to %lC as soon +#as possible. +%oを拾うと,あなたは%dの本質を感じとった.そして, +%dの%cならば%nの野望を打ち破れるから, +%nが%Hより%oを盗んだ,ということに気付いた. + +あなたは%dからのメッセージを感じ取った.それは言葉に +よるものではないが,あなたはすぐ%lのもとへ帰らねばならない +ことを感じた. +%E +%Cc Pri 00080 +#You feel a wrenching shift in the ether as %n's body dissolves +#into a cloud of noxious gas. +# +#Suddenly, a voice booms out: +# +# Thou hast defeated the least of my minions, %r. +# Know now that Moloch is aware of thy presence. +# As for thee, %n, I shall deal with thy failure +# at my leisure. +# +#You then hear the voice of %n, screaming in terror... +%nの肉体が毒性の気体へと空気に融けこむにつれ, +天空が響いているのに気付いた. + +すると突然,声が轟きわたった: + + %rよ,汝は私のもっとも汚わらしい下僕を倒してくれた. + モーロックがそちの存在に気付いているということを肝に命じよ. + %nよ,汝の不首尾は私が直に裁こう. + +そして,あなたは%nの悲鳴を聞いた. +%E +%Cc Pri 00081 +#"You have returned, %p. And with %o, I see. +#Congratulations. +# +#"I have been in meditation, and have received direction from +#a minion of %d. %d commands that you retain +#%o. With it, you must recover the Amulet +#of Yendor. +# +#"Go forth, and let %d guide your steps." +%p,帰ってきたか..しかも,%oを手にして. +おめでとう. + +私はずっと瞑想していたのだが,%dの使者より命令を承った. +%dは,そなたに%oを持ち続けるように,と命じた.そして, +それをもって,イェンダーの魔除けを取り戻すのだ. +%E +%Cp Pri 00090 +#"Welcome back, %p. How is your quest for the Amulet going?" +よくぞ帰ってきた,%p.魔除けを探す方はどうなっているのだ. +%E +%Cc Pri 00091 +#"You have prevailed, %p! %d is surely with you. Now, +#you must take the amulet, and sacrifice it on %ds altar on +#the Astral plane. I suspect that I shall never see you again in this +#life, but I hope to at %ds feet." +%pよ,そちは打ち勝ったのだ!真に,%dはそちとともに在る. +さあ,そなたは魔除けを持って,これから精霊界にある%dの祭壇 +にそれを捧げるのだ.今生ではそなたに会うことはもうないだろう, +しかし,%dの足元でそなたに会うことを楽しみにしているぞ. +%E +# +# Ranger +# +%Cc Ran 00001 +#You arrive in familiar surroundings. In the distance, you %x the +#ancient forest grove, the place of worship to %d. +# +#Something is wrong, though. Surrounding the grove are centaurs! +#And they've noticed you! +あなたは見なれた場所にたどりつき,遠方に%dの崇拝の地で +ある古森の木立を%xた. + +しかし,何かが違う.なんとサークルの回りにいるのはケンタウロスだ! +彼らはあなたに気がついた! +%E +%Cp Ran 00002 +#Once again, you stand before %H. +再び,あなたは%Hの前に立った. +%E +%Cp Ran 00003 +#You have the oddest feeling that this may be the last time you +#are to enter %H. +あなたは,%Hに入るのはこれが最後かもしれないという奇妙な感じがした. +%E +%Cp Ran 00005 +#"%pC! I have not seen you in many moons. How do you fare?" +「%pよ! ずいぶん長いこと会わなかったが,元気にやっているかね?」 +%E +%Cp Ran 00006 +#"%nC continues to threaten the grove. But we hold fast." +「%nは木立を脅かし続けているが,我々がしっかり支えている.」 +%E +%Cp Ran 00007 +#"%lC is growing weak. The magic required to defend the grove drains us." +「%lはだんだん弱ってきた. +木立を守るために必要な魔力が我々を消耗させるのだ.」 +%E +%Cp Ran 00008 +#"Remember %i is hard to enter. Beware the +#distraction of leatherwings." +#*** leatherwings = こうもり? +「%iに潜入するのは難しいぞ.皮の翼たちの狂気に気をつけなさい.」 +%E +%Cp Ran 00009 +#"We must regain %o. Without it we will be overrun." +「我々は%oを取り戻さなければならない.さもなくば + やられてしまうだろう.」 +%E +%Cp Ran 00010 +#"%pC! I have not seen you in many moons. How do you fare?" +「%pよ! ずいぶん長いこと会わなかったが,元気にやっているかね?」 +%E +%Cp Ran 00011 +#"Birdsong has returned to the grove, surely this means you have defeated %n." +「鳥の歌が木々の合間に戻ってきました.これは,あなたが%nを打ち破ったことを表しています.」 +%E +%Cp Ran 00012 +#"%lC seems to have regained some of his strength." +「%lはその力のいくばくかを回復できたようです.」 +%E +%Cp Ran 00013 +#"So, tell us how you entered %i, in case some new evil arises there." +「新たな問題が持ち上がったとき,どうやって%iに入ったか教えてくれ.」 +%E +%Cp Ran 00014 +#"Is that truely %o that I see you carrying?" +「あなたのもたらしたものは真の%oなのですか?」 +%E +%Cc Ran 00015 +#"%p! You have returned! Thank %d. +# +#"We have great need of you. But first, I must see if you have the +#required abilities to take on this responsibility." +「%pよ! よく戻って来てくれた! %dよ感謝します. + +我々はお前が必要だが,この大事な役目を果たす能力をお前が持っているか +最初に確かめさせてくれ.」 +%E +%Cp Ran 00016 +#"Once again, %p, you stand in our midst. Are you ready now?" +「おお%pよ.再びお前は我々の中心に立っている.準備はできているか?」 +%E +%Cp Ran 00017 +#"Ah, you are here again, %p. Allow me to determine your readiness..." +「おお,また来たな%pよ.お前の準備ができているか調べさせてくれ…」 +%E +%Cc Ran 00018 +#"%p! You have doomed us all. You fairly radiate %L influences +#and weaken the power we have raised in this grove as a result! +# +#"Begone! We renounce your %shood with us! You are an outcast now!" +「%pよ! お前は我々すべてを破滅させる気なのか! +お前が%Lの影響力をまき散らしているせいで, +木立を支えている我々の力が弱まっているではないか! + +「立ち去れ! 我々はお前と%s分の縁を切る.お前は追放だ!」 +%E +%Cc Ran 00019 +#"%p, you are yet too inexperienced to withstand the demands of that +#which we need you to do. %RA might just be able to do this thing. +# +#"Return to us when you have learned more, my %S." +「%pよ.お前はまだ経験不足だ. +これでは我々が要求することには耐えられないだろう. +%Rならどうにか耐えられるかもしれん. + +「もっと経験を積んでから我々の元に戻ってくるが良い.わが%Sよ.」 +%E +%Cc Ran 00020 +#"You have strayed, %p! You know that %d requires that +#we maintain a pure devotion to things %a! +# +#"You must go from us. Return when you have purified yourself." +「正しい道からそれているようだな,%pよ.お前も知っているように, +%dは我々に%aに対する純粋な信心を持つことを求めている. + +我々の前から立ち去れ.そして穢れを浄めてから戻ってくるのだ.」 +%E +%Cc Ran 00021 +#"You are indeed ready, %p. I shall tell you what has transpired, +#and why we so desperately need your help: +# +#"A short time ago, the Uruk-hai tribes of the mountains to the east +#invaded and enslaved the goblin tribes in this area. The local +#%nt is now only a figurehead, and serves the Uruk-hai Overlord. +# +#"During our last gathering of worship here, we were beset by hordes of +#orcs and goblins, as you witnessed. In the first onslaught a group, +#headed by %n himself, managed to breach the grove and +#steal %o. +# +#"Since then, we have been besieged. We do not know how much longer +#we will be able to maintain our magical barriers. +# +#"If we are to survive, you, %p, must infiltrate +#%i. There, you will find a pathway down, to the +#underground castle of %n. He has always coveted +#%o, and will surely keep it on his person, +#until he delivers it to the Uruk-hai Overlord. +# +#"Recover %o for us, %p! Only then will +#the circle of %d be safe." +「%pよ,準備は良いようだな.まずは何が起こったのか,そして, +なぜ我々がこんなにもお前の助けを必要としているのかを聞いて欲しい. + +「つい最近のことだ,あの東方山脈のウルク・ハイ共が押し寄せてきて, +この地方のゴブリンどもを奴隷にした.この地方の%nは +ただの傀儡で,奴はウルク・ハイの大君主に仕えている. + +「この間礼拝のために我々がここに集まっている間に,お前が目撃したように, +我々はオークとゴブリンの群れに囲まれてしまった.そして最初の猛攻撃の時に, +%nのグループが木立をうまく突破して%oを盗んだのだ. + +「それ以来,我々はずっと包囲されている. +我々が後どれくらい魔法のバリアを維持できるかわからん. + +「我々が生きのびるためには,%pよ,お前は%iに潜入しな +ければならない.そこには下へ,すなわち%nの地下城へ降りる +道があるはずだ.奴はいつも%oを欲しがっていたから, +ウルク・ハイの大君主に渡すまでの間は,必ず身につけているだろう. + +「我々のために%oを取り返してくれ,%pよ! +取り返してくれれば,%dのサークルは安泰だ.」 +%E +%Cp Ran 00025 +#"It is rumored that the Uruk-hai have a pact with the Hill Ogres." +「噂によると例のウルク・ハイがヒル・オーガと条約を結んだらしい.」 +%E +%Cp Ran 00026 +#"%nC is strong, but not very smart." +「%nは強いがとても賢いというわけではない.」 +%E +%Cp Ran 00027 +#"Use %o, when you find it. It will help you survive +#to reach us." +「%oを見付けたらまず使ってみるんだ. +我々の元に生還するのに役に立つだろう.」 +%E +%Cp Ran 00028 +#"Remember, let %d be your guide." +「忘れるな,%dをお前の案内人にするのだ.」 +%E +%Cp Ran 00029 +#"Call upon %d when you face %n. +#The very act of doing so will infuriate him, and give you advantage." +「%nに立ち向かうときには%dに祈るんだ. +その行動が奴を激怒させて,お前を有利にするだろう.」 +%E +%Cp Ran 00030 +#"%n and his kind have always hated us." +「%nと奴の種族は常に我々を憎んでいる.」 +%E +%Cp Ran 00031 +#"We cannot hold the grove much longer, %p. Hurry!" +「我々はこれ以上木立を支えていけそうにない.%pよ,急いでくれ!」 +%E +%Cp Ran 00032 +#"To infiltrate %i, you must be very stealthy." +「%iに潜入するには,人目を盗む能力が必要だ.」 +%E +%Cp Ran 00033 +#"Remember that %n is a braggart. Trust not what he says." +「%nがほら吹きであることを覚えておくんだ. + 奴の言うことを信用するなよ.」 +%E +%Cp Ran 00034 +#"You can triumph, %p, if you trust in %d." +「%pよ,もしお前が%dを信じるのなら,勝利を得ることが + できるだろう.」 +%E +%Cc Ran 00035 +#This must be %i. +# +#You are in a cave built of many different rooms, all interconnected +#by tunnels. Your quest is to find and shoot the evil wumpus that +#resides elsewhere in the cave without running into any bottomless +#pits or using up your limited supply of arrows. Good luck. +# +#You are in room 9 of the cave. There are tunnels to rooms +#5, 8, and 10. +#*rustle* *rustle* (must be bats nearby) +#*sniff* (I can smell the evil wumpus nearby!) +ここは%iに違いない. + +トンネルにより相互接続された多くの部屋からなる洞窟中にあなたはいる. +あなたの目的は,底なしの落し穴に落ちたり矢を使い尽くす前に, +洞窟中のどこかにいる悪いワンパスを見つけて射殺すことだ. +幸運を祈る. + +あなたは洞窟の9番目の部屋に居る. +ここには,5,8,10の部屋へと続くトンネルがある. +カサカサ,カサカサ(近くにこうもりが居るに違いない) +クンクン(近くで邪悪なワンパスの臭いがする) +%E +%Cc Ran 00036 +#Once again, you descend into %i. +# +#*whoosh* (I feel a draft from some pits). +#*rustle* *rustle* (must be bats nearby) +#*** +再びあなたは%iに降り立った. + +シューッ(いくつかの孔から隙間風を感じる) +カサカサ,カサカサ(近くにこうもりが居るに違いない) +%E +%Cc Ran 00040 +#You descend into a weird place, in which roughly cut cave-like walls +#join with smooth, finished ones, as if someone was in the midst of +#finishing off the construction of a subterranean complex. +# +#Off in the distance, you hear the sounds of a large, raucous gathering. +あなたは気味の悪い場所に降り立った. +荒く切断した洞窟のような壁が,完成されたなめらかな壁とつながっている. +まるで誰かが地下迷宮の建築を仕上げている最中のようである. + +遠く離れた所で,大勢が集まってざわざわ騒いでいる音が聞こえる. +%E +%Cp Ran 00041 +#Once again, you enter the distorted castle of %n. +再びあなたは%nのねじ曲がった城に侵入した. +%E +%Cc Ran 00050 +#"So, %c. %lC has sent you to recover %o. +# +#"Well, I shall keep that bauble. It pleases me. You, %c, shall die." +「ほう%cか.%lが%oを取り戻させるために + お前を送り込んだんだな. + +だがわしはこいつを手放す気はないぞ.%cよ,お前は死ぬのだ.」 +%E +%Cp Ran 00051 +#"Back again, eh? Well, a mere %r is no threat to me! Die, %c!" +「ほう,また来たか.だが,たかが%rでは脅威にはならないぞ. + 死ね,%c!」 +%E +%Cp Ran 00052 +#"You haven't learned your lesson, %c. You can't kill me! You shall die now." +「経験不足だな%cよ.お前ではこのわしは倒せん! + お前は今ここで死ぬのだ.」 +%E +%Cp Ran 00053 +#"I shall have %o from you, %r. Then I shall +#kill you." +「%rよ,お前に%oを渡すつもりはない.お前は殺す.」 +%E +%Cp Ran 00060 +#"Your %d is nothing, %c. You are mine now!" +「%c,お前の%dは役に立たんよ. + お前は今からわしのものだ!」 +%E +%Cp Ran 00061 +#"Run away little %c! You can never hope to defeat %n!" +「ほら逃げるがいい,ちっぽけな%cよ! %nを倒そうなどと + 思わないことだな.」 +%E +%Cp Ran 00062 +#"My Uruk-hai servants will rip you to shreds!" +「我がしもべのウルク・ハイどもがお前をずたずたに引き裂くだろう!」 +%E +%Cp Ran 00063 +#"I shall display your head as a trophy. What do you think about that wall?" +「わしはお前の頭をトロフィーとして飾るつもりだ.あの壁でどうかな?」 +%E +%Cp Ran 00064 +#"I shall break your %ls grove, and destroy all the %gP!" +「%lの木立を壊し,そして%gを全員殺してやる!」 +%E +%Cp Ran 00065 +#"%d has abandoned you, %c. You are doomed." +「%cよ,%dはお前を見捨てたぞ.お前は + 死すべき定めなのだ.」 +%E +%Cp Ran 00066 +#"%rA? %lC sends a mere %r against me? Hah!" +「%r? わしを倒すのに%rごときを送り込むとは + %lめ.愚かなやつよ!」 +%E +%Cp Ran 00067 +#"%lC has failed, %c. %oC will never leave here." +「%lは失敗したな,%cよ. + %oをここから持ち出すことは不可能だ.」 +%E +%Cp Ran 00068 +#"You really think you can defeat me, eh %c? You are wrong!" +「%cよ,お前は本当にこのわしを倒せると思っているのか? + 大きな間違いだぞ!」 +%E +%Cp Ran 00069 +#"You weaken, %c. I shall kill you now." +「弱っているな,%cよ.今すぐ殺してやる.」 +%E +%Cc Ran 00070 +#As you pick up %o, it seems to glow, and a warmth +#fills you completely. You realize that its power is what has protected +#your %sp against their enemies for so long. +# +#You must now return it to %l without delay -- their lives depend +#on your speed. +あなたが%oを拾うと,それは光ったように見えて,そしてあなたを +暖かさで満たした.あなたはこの力が敵と戦う%s達を長い間守って +きたものであることを悟った. + +あなたは一刻も早くこれを%lの元に届けなければならない― +彼らの命はあなたのスピードにかかっている. +%E +%Cc Ran 00080 +#%nC collapses to the ground, cursing you and %l, then says: +# +# You have defeated me, %r! But I curse you one final time, with my +# dying breath! You shall die before you leave my castle! +%nはあなたと%lを呪いながら地面に倒れ,そして言った: + + お前の勝ちだ,%rよ! しかし,わしは今際の際に + お前を呪ってやる,わしの最期の息でな! お前は自分の城に戻る前 + に死ぬのだ! +%E +%Cc Ran 00081 +#"%p! You have succeeded! I feared it was not possible! +# +#"You have returned with %o! +# +#"I fear, now, that the Centaurs will regroup and plot yet another raid. +#This will take some time, but if you can recover the Amulet of Yendor +#for %d before that happens, we will be eternally safe. +# +#"Take %o with you. It will aid in your quest for +#the Amulet." +「%pよ! よくやった! 私は無理ではないかと恐れていたのだ! + +「%oを持って戻ってきたな! + +「私は今,かのケンタウロスが別の%nを選ぶことを恐れている. +それはいつかなされるだろう,しかし,その前にお前が%dのために +イェンダーの魔除けを取り戻すことができれば,我々は永遠に安泰だ. + +「%oを持って行くがいい.魔除けを探す冒険の助けとなるだろう.」 +%E +# assumes The Longbow of Diana +%Cc Ran 00082 +#%l flexs %o reverently. +# +#"With this wondrous bow, one need never run out of arrows. +#You are its keeper now, and the time has come to resume your +#search for the Amulet. %Z await your return +#through the magic portal that brought you here." +%lはうやうやしく%oをしならせた。 + +「この不思議な弓を使っていると、決して矢が尽きない. +お前は%oの守護者だ. +魔除け探索を再開せよ.魔法の入口の向こうで, +%Zがお前を待っているぞ.」 +%E +%Cp Ran 00090 +#"Welcome, %p. How have you fared on your quest for the Amulet +#of Yendor?" +「良く来た,%pよ.イェンダーの魔除けの探索は順調かな?」 +%E +%Cc Ran 00091 +#"You have it! You have recovered the Amulet of Yendor! +#Now attend to me, %p, and I will tell you what must be done: +# +#"The Amulet has within it magic, the capability to transport you to +#the Astral Plane, where the primary circle of %d resides. +# +#"To activate this magic, you must travel upwards as far as you can. +#When you reach the temple, sacrifice the Amulet to %d. +# +#"Thus will you fulfill your destiny." +「おお! イェンダーの魔除けを取り戻したのか! +これから何をするべきか教えるから,注意して聞くのだ: + +この魔除けはある魔力を内に秘めている.それはお前を精霊界に転送するものだ. +精霊界には%dの最初のサークルが存在する. + +この魔力を働かせるには,お前は登れるだけ上に登らなければならない. +寺院にたどり着いたら,魔除けを%dに捧げるのだ. + +そうすればお前は宿命を果たすことができるだろう.」 +%E +# +# Rogue (with apologies to all Norsk speakers -dean) +# (訳注)すんげー意訳.意味よくわからん.^_^; +# +%Cc Rog 00001 +#Unexpectedly, you find yourself back in Ransmannsby, where you trained to +#be a thief. Quickly you make the guild sign, hoping that you AND word +#of your arrival reach the %ls den. +ふと,あなたは盗賊になるために修業した,ランスマンスベイに +戻っているのに気がついた.あなたは素早くギルドの印を作った. +%lに届くことを祈りながら. +%E +%Cp Rog 00002 +#Once again, you find yourself back in Ransmannsby. Fond memories are +#replaced by fear, knowing that %l is waiting for you. +もういちど,あなたはランスマンスベイに戻っているのに気がついた.甘い +記憶が恐れに置きかえられている.%lがあなたを待っている +のに気がついた. +%E +%Cp Rog 00003 +#You rub your hands through your hair, hoping that the little ones on +#the back of your neck stay down, and prepare yourself for your meeting +#with %l. +あなたは髮をとかした,誰にも首ねっこを圧えつけられることは +ないことを祈りながら.そして,%lに会う準備をした. +%E +%Cp Rog 00005 +#"I hear that Lady Tyvefelle's household is lightly guarded." +「レディ・タイヴェフェルの家の警備は手薄だそうだ.」 +%E +%Cp Rog 00006 +#"You're back? Even the Twain don't come back anymore." +「戻ってきた?トウェーンですら戻ってこないのに.」 +%E +%Cp Rog 00007 +#"Can you spare an old cutpurse a zorkmid for some grog?" +「この年寄スリにラム酒のための金を恵んでくれ.」 +%E +%Cp Rog 00008 +#"Fritz tried to join the other side, and now he's hell-hound chow." +「フリッツは裏切りやがった.いまやすっかりカタギだ.」 +%E +%Cp Rog 00009 +#"Be careful what you steal, I hear the boss has perfected turning +#rocks into worthless pieces of glass." +「何でも盗めばいいってもんじゃない,ボスが岩を価値のないガラスに + 仕上げている音を聞いたぜ.」 +%E +%Cp Rog 00010 +#"I was sure wrong about Lady Tyvefelle's house; I barely got away with my +#life and lost my lock pick in the process." +「レディ・タイヴェフェルの家は確実にヤバイぜ. +俺は鍵開け道具を失うのと引き換えにかろうじて命からがら逃げ出せた.」 +%E +%Cp Rog 00011 +#"You're back? Even the Twain don't come back anymore." +「戻ってきた?トウェインですら戻ってこないのに.」 +%E +%Cp Rog 00012 +#"Can you spare an old cutpurse a zorkmid for some grog?" +「この年寄スリにラム酒のための金を恵んでくれ.」 +%E +%Cp Rog 00013 +#"Fritz tried to join the other side, and now he's hell-hound chow." +「フリッツは裏切りやがった.いまやすっかりカタギだ.」 +%E +%Cp Rog 00014 +#"Be careful what you steal, I hear the boss has perfected turning +#rocks into worthless pieces of glass." +「何でも盗めばいいってもんじゃない,ボスが岩を価値のないガラスに + 仕上げている音を聞いたぜ.」 +%E +%Cc Rog 00015 +#"Well, look who it is boys -- %p has come home. You seem to have +#fallen behind in your dues. I should kill you as an example to these +#other worthless cutpurses, but I have a better plan. If you are ready +#maybe you could work off your back dues by performing a little job for +#me. Let us just see if you are ready..." +「誰か来たようだな.%pか.何だ?任務に失敗しやがったのか.ふん. + ここにいる価値のないスリのように殺してやろうと思ったが,もっといいこと + を思いついた.準備はいいか?なーに,俺のためにちょいと仕事をしてくれれば + いいのさ.準備ができてるかな...」 +%E +%Cp Rog 00016 +#"Well, I didn't expect to see you back. It shows that you are either stupid, +#or you are finally ready to accept my offer. Let us hope for your sake it +#isn't stupidity that brings you back." +「また会えるとは思わなかったぜ.お前は馬鹿か?俺の任務を請け負う + だけの技量があるか見てやろう.せいぜいお前があいかわらず馬鹿で + ないことを祈ろう.」 +%E +%Cp Rog 00017 +#"Did you perhaps mistake me for some other %lt? You must +#think me as stupid as your behavior. I warn you not to try my patience." +「%l以外にそそのかされておらんだろうな?俺のことをお前 + くらい馬鹿だと考えてるだろう.俺にも我慢の限界ってものがあるんだぜ.」 +%E +%Cc Rog 00018 +#"Well %gp, it looks like our friend has forgotten who is the boss +#around here. Our friend seems to think that %rp have been put in +#charge. Wrong. DEAD WRONG!" +# +#Your sudden shift in surroundings prevents you from hearing the end +#of %ls curse. +「%g!俺の友は誰がここのボスだか忘れたと見える.俺の友は + %rが裏切ったと考えている.間違いだ.死すべき間違いだ!」 + +%lの呪いの言葉が遠のき,まわりの景色が突然変った. +%E +%Cc Rog 00019 +#"In the time that you've been gone you've only been able to master the +#arts of %ra? I've trained ten times again as many %Rp +#in that time. Maybe I should send one of them, no? Where would that +#leave you, %p? Oh yeah, I remember, I was going to kill you!" +「現時点で%rを極めたか?俺は10年前に%Rを極めたものだ. + 私は%Rを極めた1人として送られたのだが,それに比べて%p + お前はどうだ?ふん.忘れるな!俺はお前を殺そうとしてるのだぜ.」 +%E +%Cc Rog 00020 +#"Maybe I should chain you to my perch here for a while. Perhaps watching +#real %A men at work will bring some sense back to you. I don't +#think I could stand the sight of you for that long though. Come back +#when you can be trusted to act properly." +「どうやら,お前を止まり木につなりでおくべきだったようだ.おおかた働く + %Aの人間を見てつまらん感情でも抱いたんだろう.お前の前に + 立っているなんて考えたくもない.何を信じるべきかわかったら戻ってこい.」 +%E +%Cc Rog 00021 +#"Will everyone not going to retrieve %o from that +#jerk, %n, take one step backwards. Good choice, +#%p, because I was going to send you anyway. My other %gp +#are too valuable to me. +# +#"Here's the deal. I want %o, %n +#has %o. You are going to get %o +#and bring it back to me. So simple an assignment even you can understand +#it." +「誰も%oを馬鹿野郎の%nから取りかえしてきや + がらねぇ.よく聞け!%p,なぜなら俺はお前を送りつけるからだ. + 他の%gたちはお前なんかより大事だからな. + +「取り引きと行こうじゃないか.俺は%oが欲しい.%nが + %oを持っている.お前は%oを取りに行き, + 俺のところへ持ってこい.簡単なこった.お前でも十分理解できるだろ.」 +%E +%Cc Rog 00025 +#"You don't seem to understand, %o isn't here so +#neither should you be!" +「なんでぇ,わからなかったのか?%oはここにはねぇ.何しろお前が + 取り返してねぇんだからな!」 +%E +%Cp Rog 00026 +#"May %d curse you with lead fingers. Get going!" +「%dの呪いがあらんことを.行け!」 +%E +%Cp Rog 00027 +#"We don't have all year. GET GOING!" +「俺らには暇がねぇんだ.行け!」 +%E +%Cc Rog 00028 +#"How would you like a scar necklace? I'm just the jeweler to do it!" +「傷もののネックレスは好きか?俺はそういうことをする宝石屋だぜ!」 +%E +%Cp Rog 00029 +#"Lazy S.O.B. Maybe I should call up someone else..." +「怠けもんが!このクソ野郎.誰か他のやつを呼ぶぞ...」 +%E +%Cp Rog 00030 +#"Maybe I should open your skull and see if my instructions are inside?" +「お前の頭を開いて俺の命令が本当にてめぇの中に入ってるか見てやろうか?」 +%E +%Cp Rog 00031 +#"This is not a task you can complete in the afterlife, you know." +「安心して老後を送りたいなら,この仕事はちゃんとやっとくんだな.」 +%E +%Cc Rog 00032 +#"Inside every living person is a dead person trying to get out, and I have +#your key!" +「生きている人間と言うのはもがき続ける死んだ人間だ.そして俺はお前の + 鍵を持っている!」 +%E +%Cp Rog 00033 +#"We're almost out of hell-hound chow, so why don't you just get moving!" +「俺らは皆カタギにはなれねぇ.何いまさらじたばたしてんだ!」 +%E +%Cp Rog 00034 +#"You know, %o isn't going to come when you +#whistle. You must get it yourself." +「%oは笛を吹いたって来やがらねぇ.自分で取って + くるしかねぇんだ.」 +%E +%Cp Rog 00035 +#Those damn little hairs tell you that you are nearer to +#%o. +くそったれの髮の毛が%oに近づいたことを知らせた. +%E +%Cp Rog 00036 +#Not wanting to face %l without having stolen +#%o, you continue. +%oを盗むまでは%lには会いたくなかったが,続けた. +%E +%Cc Rog 00040 +#You feel a great swelling up of courage, sensing the presence of +#%o. Or is it fear? +あなたは勇気が湧いてくるような気がした.%oが近いに違いない. +それとも恐れ? +%E +%Cp Rog 00041 +#The hairs on the back of your neck whisper -- it's fear. +あなたのうなじの髮がささやいた.-- 恐怖なんかじゃない. +%E +%Cc Rog 00050 +#"Ah! You must be %ls ... er, `hero'. A pleasure +#to meet you." +「お前が%lの...使いのヒーローか.お前に会えて嬉しいぜ.」 +%E +%Cc Rog 00051 +#"We meet again. Please reconsider your actions." +「また会ったな.もういいかげんにしてほしいものだ.」 +%E +%Cp Rog 00052 +#"Surely, %p, you have learned that you cannot trust any bargains +#that %l has made. I can show you how to continue on +#your quest without having to run into him again." +「おい%p,%lとの取り引きは信用できないってことは + 知ってんだろうな.俺がお前がどうやったら冒険を続けるか示してやろう. + 彼のところに逃げこむ前にな.」 +%E +%Cp Rog 00053 +#"Please, think for a moment about what you are doing. Do you truly +#believe that %d would want %l to have +#%o?" +「ちょっとまて,考えなおしてくれ.本当に%lが%o + を持つことを%dが望んでいると思ってるのか?」 +%E +%Cp Rog 00060 +#"May I suggest a compromise. Are you interested in gold or gems?" +「妥協しようじゃねぇか.金と宝石のどっちがいい?」 +%E +%Cp Rog 00061 +#"Please don't force me to kill you." +「お前は殺したくねぇんだがな.」 +%E +%Cp Rog 00062 +#"Grim times are upon us all. Will you not see reason?" +「いやな時間だけありやがる.理由はわかってんのか?」 +%E +%Cp Rog 00063 +#"I knew %l, and you're no %l, thankfully." +「俺は%lを知っている.お前は%lじゃない.ありがてぇ.」 +%E +%Cp Rog 00064 +#"It is a shame that we are not meeting under more pleasant circumstances." +「俺たちがもっと喜ばしい状況で会えねぇとはひでぇ話だ.」 +%E +%Cp Rog 00065 +#"I was once like you are now, %p. Believe in me -- our way +#is better." +「俺はかつては今のお前のような立場だった,%pよ.俺を信じろ, + 俺のやりかたの方がすぐれてるってもんだ.」 +%E +%Cp Rog 00066 +#"Stay with me, and I will make you %os guardian." +「俺のところに来ねぇか?お前を%oの番兵にしてやろう.」 +%E +%Cp Rog 00067 +#"When you return, with or without %o, +#%l will have you killed." +「お前が戻ったら%oの如何にかかわらず + %lはお前を殺すぜ.」 +%E +%Cp Rog 00068 +#"Do not be fooled; I am prepared to kill to defend %o." +「馬鹿はやめろ,俺は%oのため殺してもいいんだぜ.」 +%E +%Cp Rog 00069 +#"I can reunite you with the Twain. Oh, the stories you can swap." +「お前をトウェインに会わせてやれるぜ.ミイラ取りがミイラか?」 +%E +%Cc Rog 00070 +#"As you pick up %o, the hairs on the back of your +#neck fall out. At once you realize why %n was +#willing to die to keep it out of %ls hands. Somehow +#you know that you must do likewise." +あなたが%oを拾うと,うなじの髪の毛がはらりと落ちた.すぐに +あなたは,何故%nがそれを%lの手元から +離しておくために進んで死んだのかを悟った. +どういうわけか,あなたも同じことをしなければ +ならないような気になった. +%E +%Cc Rog 00080 +#"I know what you are thinking, %p. It is not too late for you +#to use %o wisely. For the sake of your guild +#%sp, do what is right." +# +#You sit and wait for death to come for %n, and then you +#brace yourself for your next meeting with %l! +「%p,お前が何を考えてるのか知ってるぞ.%oを賢く + 使うにはまだ遅くない.お前のギルドの%lのため正しく使うのだ.」 + +あなたは座りこみ,%nの死を待った,そして次に%lに会うため +神経を緊張させた! +%E +%Cc Rog 00081 +#"Well, I'll be damned. You got it. I am proud of you, a fine %r +#you've turned out to be. +# +#"While you were gone I got to thinking, you and %o +#together could bring me more treasure than either of you apart, so why don't +#you take it with you. All I ask is a cut of whatever loot you come by. +#That is a better deal than I offered %n. +# +#"But, you see what happened to %n when he refused. +#Don't make me find another to send after you this time." +「ふん.ちょうどけなしてたとろだ.ブツを手に入れたようだな.お前を + 誇りに思っとるよ.お前は素晴しい%rだ. + +「お前が行ってしまったあと,考えてたんだが,お前と%o + は一緒にしとくと俺をもっと宝のあるところへ導いてくれそうだ.どうだい? + つまり,俺が聞きてぇのはお前が略奪したものの分け前ってことだ. + %nなんかよりずっとすげぇ分け前にちがいねぇ. + +「しかし,お前は%nが拒否したとき何が起きたか見ただろう.また別の + 人間を今度はお前のところに送るなんてことがねぇようにしとけ.」 +%E +%Cc Rog 00082 +%lはさっと%oと彼のポケットにあるつまらない +物とを交換しようとした.しかし,あなたはそれに気がついた. + +「魔除け探索を再開するんだな.魔法の入口の向こうで, + %Zがお前を待ってるぜ. +%E +%Cc Rog 00090 +#"Quite the little thief, aren't we, %p. Can I interest you in a +#swap for %o. Look around, anything in the keep +#is yours for the asking." +「チンケな盗賊だが%p,俺は%oのかわりにお前に興味がある. + 良く見まわせ,ここにあるもん全部を望むならお前にくれてやってもいいぜ.」 +%E +%Cc Rog 00091 +#"I see that with your abilities, and my brains, we could rule this world. +# +#"All that we would need to be all-powerful is for you to take that little +#trinket you've got there up to the Astral plane. From there, %d will +#show you what to do with it. Once that's done, we will be invincible!" +「お前の能力は俺のふんだ通りのものだった,俺らはこの世界の掟だ. + +「万能の力を得るためにお前がすることは,そのチンケな装飾具を精霊界に + 持ってくことだ.そこで%dが何をすりゃいいのか教えてくれる.これができ + たら,俺らは無敵だ!」 +%E +# +# Samurai +# +%Cc Sam 00001 +#Even before your senses adjust, you recognize the kami of +#%H. +# +#You %x the standard of your teki, %n, flying above +#the town. How could such a thing have happened? Why are ninja +#wandering freely; where are the samurai of your daimyo, %l? +# +#You quickly say a prayer to Izanagi and Izanami and walk towards +#town. +意識が完全に戻る前に,あなたは%Hの都にいることがわかった. + +あなたの宿敵である%nが何故町の上空を飛んでいるのを%xた. +なぜこんなことが起きているのだ? +忍者が何故あちこちで放浪しているのだ?あなたの大 +名である%lの侍はどこにいるのだ? + +あなたは急いで伊邪那岐および伊邪那美に祈りをささげ,町へ向って +歩いていった. +%E +%Cp Sam 00002 +もう一度,あなたは%Hに戻った. +%E +%Cp Sam 00003 +#You are back at %H. +# +#Instantly you sense a subtle change in your karma. You seem to know that +#if you do not succeed in your quest, %n will have destroyed +#the kami of %H before you return again. +あなたは%Hに戻った. + +即座に,あなたはカルマの微妙な違いを感じとった.あなたは,もしクエストに +失敗したら,あなたが戻る前に%nが%Hの都を破壊すると言う重大な +事態に気がついた. +%E +%Cp Sam 00005 +#"To succeed, you must walk like a butterfly on the wind." +「成功のためには,蝶のように歩かねばならない」 +%E +%Cp Sam 00006 +#"Ikaga desu ka?" +「もうかりまっか?」 +%E +%Cp Sam 00007 +#"I fear for The Land of The Gods." +「私は神の地を恐れている」 +%E +%Cp Sam 00008 +#"%nC has hired the Ninja -- be careful." +「%nは忍者を雇ったそうだ.気をつけろ.」 +%E +%Cp Sam 00009 +#"If %o is not returned, we will all be ronin." +「もし%oが手に戻らなければ,我々はずっと浪人のままだ.」 +%E +%Cp Sam 00010 +#"Come, join us in celebrating with some sake." +「来い.祝杯を上げようじゃないか.」 +%E +%Cp Sam 00011 +#"Ikaga desu ka?" +「いかがですか?」 +%E +%Cp Sam 00012 +#"You have brought our clan and %l much honor." +「おまえは我らが氏族と%lに多くの名誉をもたらしてくれた.」 +%E +%Cp Sam 00013 +#"Please %r, sit for a while and tell us how you overcame the Ninja." +「さぁさぁ%r,まぁ,ここに座って,忍者をどうやってあしらったか我々に教えてくれよ.」 +%E +%Cp Sam 00014 +#"%lC still lives! You have saved us from becoming ronin." +「%lは安泰なり!おまえは我々を浪人になることから救ってくれた.」 +%E +%Cc Sam 00015 +#"Ah, %p-san, it is good to see you again. I need someone who can +#lead my samurai against %n. If you are ready, you will be +#that person." +「おお%pよ,おまえに会えて非常に嬉しい.私は%nに + 対して我が侍魂を導く者を必要としている. + もし,おまえに準備ができているなら, + おまえがその選ばれた人間だ.」 +%E +%Cp Sam 00016 +#"Once again, %p-san, you kneel before me. Are you yet capable of +#being my vassal?" +「また来たな%pよ.私の前にひざまずけ.おまえにわたしの臣下 + になるだけの技量があるかな?」 +%E +%Cp Sam 00017 +#"You begin to test my matsu, %p-san. +#If you cannot determine what I want in a samurai, how can I rely on you +#to figure out what I need from a samurai?" +「おまえは私の松の試練を受けはじめた,%pよ.もし,おまえが + 私が侍に望むべきものを決めかねているなら,どうやっておまえを信頼したら + よいのだ?」 +%E +%Cp Sam 00018 +#"You are no longer my samurai, %p. +# +#"Hara-kiri is denied. You are ordered to shave your head and then to +#become a monk. Your fief and family are forfeit. Wakarimasu?" +「おまえはもはや私の侍ではない,%pよ. + +「ハラキリはやめよう.頭を剃り,僧にでもなるがよい.おまえの + 領地や家族は没収する.わかったか?」 +%E +%Cp Sam 00019 +#"%p-san, you have learned well and honored your family. +#I require the skills of %Ra in order to defeat %n. +#Go and seek out teachers. Learn what they have learned. When you +#are ready, return to me." +「%pよ,おまえはよく学び,家族を名誉に思っている.おまえが%nを + 倒すには%Rくらいの技量が必要だ. + 行け!そして師を捜せ!学ぶべきことを学べ!用意ができたなら + 私のところへ戻ってくるのだ.」 +%E +%Cp Sam 00020 +#"%p-san, you would do better to join the kyokaku. +# +#"You have skills, but until you can call upon the bushido to know when and +#how to use them you are not samurai. When you can think %A and +#act %A then return." +「%pよ.侠客に加わったほうがよいのではないか? + +「おまえは技量を持っている,しかし武士道のなんたるかを知るまでは, + おまえは侍ではない.%aについてよく考え,%aを実行し + そして戻るがよい.」 +%E +%Cc Sam 00021 +#"Domo %p-san, indeed you are ready. I can now tell you what +#it is that I require of you. +# +#"The daimyo, %n, has betrayed us. He has stolen from us +#%o and taken it to his donjon deep within +#%i. +# +#"If I cannot show the emperor %o when he comes +#for the festival he will know that I have failed in my duty, and +#request that I commit seppuku. +# +#"You must gain entrance to %i and retrieve the +#emperor's property. Be quick! The emperor will be here for the +#cha-no-you in 5 sticks. +# +#"Wakarimasu?" +「%pよ,実にすばらしい.私はお前に私が何を求めているか + 告げよう. + +「大名の%nが我々を裏切った.彼は我々から%oを盗み, + %iの地下深くに持ち去ったのだ. + +「帝が祭にやってきたとき,%oを献上できねば,帝は私の失敗に + 気がつき,切腹を要求するであろう. + +「おまえは,%iに入り,帝の財産を回収せねばならない.急げ! + 帝は5日後の茶の湯に来るのだ. + +「わかったか?」 +%E +%Cp Sam 00025 +#"To defeat %n you must overcome the seven emotions: +#hate, adoration, joy, anxiety, anger, grief, and fear." +「%nを倒すには,おまえは7つの感情を打ち破らねばならぬ: + 憎しみ,愛慕,楽しみ,不安,怒り,悲しみ,そして恐れだ.」 +%E +%Cp Sam 00026 +#"Remember your honor is my honor, you perform in my name." +「おまえの名誉は私の名誉であることを忘れるな,我が名のもとで戦え!」 +%E +%Cp Sam 00027 +#"I will go to the temple and burn incense for your safe return." +「私は寺へ行き,おまえの安全のため香を焚くつもりだ.」 +%E +%Cp Sam 00028 +#"Sayonara." +「さらばだ.」 +%E +%Cp Sam 00029 +#"There can be honor in defeat, but no gain." +「打ち負かした際には力や金はないが,名誉がある.」 +%E +%Cp Sam 00030 +#"Your kami must be strong in order to succeed." +「成功のためにはおまえの神は強者でなければならない.」 +%E +%Cp Sam 00031 +#"You are indeed a worthy %R, but now you must be a worthy samurai." +「おまえは実に%Rにふさわしい,しかし今やおまえは侍としても + ふさわしくなければならぬ.」 +%E +%Cp Sam 00032 +#"If you fail, %n will be like a tai-fun on the land." +「もしおまえが失敗するなら,%nはこの地の台風のようになる + であろう.」 +%E +%Cp Sam 00033 +#"If you are truly %A, %d will listen." +「もしおまえが本当に%aを守っているなら,%dは聞きいれてく + れるだろう.」 +%E +%Cp Sam 00034 +#"Sharpen your swords and your wits for the task before you." +「任務のため,おまえの剣を研ぎ,知恵を鍛えよ.」 +%E +%Cc Sam 00035 +#You instinctively reach for your swords. You do not recognize the +#lay of this land, but you know that your teki are everywhere. +あなたは直感的に剣に手が伸びた.あなたは自分がどこにいるのかわからなかっ +たが,敵があちこちにいるのだけはわかった. +%E +%Cp Sam 00036 +#Thankful that your %sp at %H cannot see +#your fear, you prepare again to advance. +%Hにいるあなたの%sがあなたの恐怖にひきつった +顔を見られないことが幸いだ.あなたは前進する準備をした. +%E +%Cc Sam 00040 +#In your mind, you hear the taunts of %n. +# +#You become like the rice plant and bend to the ground, offering a +#prayer to %d. But when the wind has passed, you stand +#proudly again. Putting your kami in the hands of fate, you advance. +気のせいか,%nのあざけ笑いを聞いた. + +あなたは稲穂のように首を垂れ,地面に屈伏し, +%dへの祈りを捧げた.一陣の風が通りすぎると, +神の宿命を手に,あなたはまた勇ましげに前進した. +%E +%Cp Sam 00041 +#As you arrive once again at the home of %n, your thoughts +#turn only to %o. +%nの地へもう一度戻るときは,%oだけを考えて +いるような気がした. +%E +%Cp Sam 00050 +#"Ah, so it is to be you, %p-san. I offer you seppuku. +#I will be your second if you wish." +「おまえか,%pよ.切腹するという手段が残っているぞよ. + お前が望むなら,介錯人になろうぞ.」 +%E +%Cp Sam 00051 +#"I have offered you the honorable exit. Now I will have your +#head to send unwashed to %l." +「名誉ある死を勧めよう.さすれば,%lにお前の生首を + 届けてやる.」 +%E +%Cp Sam 00052 +#"After I have dispatched you, I will curse your kami." +「お前をとっとと処刑して,おまえの神を呪ってやろうぞ.」 +%E +%Cp Sam 00053 +#"You have fought my samurai; surely you must know that you +#will not be able to take %o back to +#%H" +「お前は私の侍と戦った.%oを持って + %Hに帰ることなど不可能であると痛いほど知るがよい」 +%E +%Cp Sam 00060 +#"Ahh, I finally meet the daimyo of the kyokaku!" +「おお,私はとうとう侠客の大名に会った!」 +%E +%Cp Sam 00061 +#"There is no honor for me in your death." +「お前の死など私にとっては名誉でもなんでもない.」 +%E +%Cp Sam 00062 +#"You know that I cannot resash my swords until they have killed." +「我が剣は血を求めてやまない.」 +%E +%Cp Sam 00063 +#"Your presence only compounds the dishonor of %l in not coming himself." +「お前の存在は単に%lの不名誉を高めるだけだ.」 +%E +%Cp Sam 00064 +#"I will make tea with your hair and serve it to %l." +「お前の髪で茶を沸かし,%lに捧げよう.」 +%E +%Cp Sam 00065 +#"Your fear shows in your eyes, coward!" +「お前の恐怖心が目に見えるぞ,憶病者め!」 +%E +%Cp Sam 00066 +#"I have not heard of you, %p-san; has your life been that unworthy?" +「"%p?知らないな.お前の存在など一片の価値もない」 +%E +%Cp Sam 00067 +#"If you will not obey me, you will die." +「従わねば,死あるのみ.」 +%E +%Cp Sam 00068 +#"Kneel now and make the two cuts of honor. I will tell your %sp +#of your honorable death." +「ひざまずけ,名誉を捨てよ.さすればお前の%sに + 名誉の死を伝えてやろう」 +%E +%Cp Sam 00069 +#"Your master was a poor teacher. You will pay for his mistakes in +#your teaching." +「お前の師は間抜けだな.彼の教え間違いの報いを受けるがよい」 +%E +%Cc Sam 00070 +#As you pick up %o, you feel the strength of its karma. +#You realize at once why so many good samurai had to die to defend it. +#You are humbled knowing that you hold one of the artifacts of the +#sun god. +%oを拾うと,そのカルマの強さを感じた. +あなたは直ちに,なぜ多くの侍がそれを守るために死んだのかを +悟った.あなたは太陽神の聖器の1つを手にしたことを知って謙虚 +な気持になった. +%E +%Cc Sam 00080 +#Your healing skills tell you that %ns wounds are mortal. +# +#You know that the bushido tells you to finish him and let his kami +#die with honor, but the thought of so many samurai dead due to this +#man's dishonor prevents you from giving the final blow. +# +#You order that his unwashed head be given to the crows and his body +#thrown into the sea. +%nの傷は致命傷であることが感覚的にわかった. + +あなたは武士道では主のため,または主の神のために死ぬことは名誉であると +教えていることを知っている.しかし,この不名誉な男のために死んだ数多く +の侍への思いがとどめの一撃を与えることを妨げた. + +あなたは彼の生首をカラスに与え,彼の体を海へ投げることにした. +%E +%Cc Sam 00081 +#As you bow before %l, he welcomes you: +# +# You have brought your family great honor, %p-sama. +# +# While you have been gone the emperor's advisors have discovered in +# the ancient texts that the karma of the samurai who seeks to recover +# the amulet and the karma of %o are joined +# as the seasons join to make a year. +# +# Because you have shown such fidelity, the emperor requests +# that you take leave of other obligations and continue on the +# road that fate has set your feet upon. I would consider it +# an honor if you would allow me to watch your household until +# you return with the amulet. +# +#With that, %l bows, and places his sword atop +#%o. +%lに礼をする前に,彼はあなたを迎えた: + + あなたは家族に偉大な名誉をもたらしました,%p様. + + あなたが行く前に帝の従者が古代の文献の中に魔除けを取り戻す + ために探索する侍のカルマを発見し,%oのカルマは + 四季の季節として結びつけられていることを発見しました. + + あなたの忠誠心を見て,帝はあなたが他の義務を放棄し,あなたの宿命の + 道をたどることを求めました.もしあなたが魔除けを持ってくる + までわたしがあなたの家族の世話をしてもよいなら,それは + 非常に名誉なことです. + +このように%lは礼をし,彼の剣を差し出した. +%E +%Cc Sam 00082 +%lは%oをじっくりと眺め,あなたに返した. + +「魔除け探索の時が迫っています. + 魔除け探索を再開するのです.魔法の入口の向こうで, + %Zがあなたを待っています. +%E +%Cp Sam 00090 +#%lC bows. "%p-sama, tell us of your search for the Amulet." +%lは礼をした.「%p様,魔除け探索の話をお聞かせください.」 +%E +%Cc Sam 00091 +#"Ah, %p-sama. You have wasted your efforts returning home. +#Now that you are in possession of the Amulet, you are honor-bound to +#finish the quest you have undertaken. There will be plenty of time +#for saki and stories when you have finished. +# +#"Go now, and may our prayers be a wind at your back." +「おお%p様,故郷に帰られるとはもったいのうございます. + 今や,あなたは魔除けの所有者です.あなたが請け負っている冒険を + 終了することは名誉なことです.無事終了した際には,酒宴と冒険談 + のためにあまるほどの時間があるでしょう. + +「お進みください,あなたに我々の祈りのあらんことを.」 +%E +# +# Tourist +# +%Cc Tou 00001 +#You breathe a sigh of relief as you find yourself back in the familiar +#surroundings of %H. +# +#You quickly notice that things do not appear the way they did when you +#left. The town is dark and quiet. There are no sounds coming from +#behind the town walls, and no campfires burning in the fields. As a +#matter of fact, you do not %x any movement in the fields at all, and +#the crops look as though they have been untended for many weeks. +# +あなたは見慣れた%Hの敷地について安堵の一息をついた. + +しかし,ここを離れた時とはなんだか違うのに気付いた. +町は暗く,静まり返っている.町の壁の向こう側からはなにも音が聞こえず, +広場でのキャンプファイアーも見当たらない. +というより,広場では何の動きも感じられず,作物は何週間 +にも渡って手入れされていないようだ. +%E +%Cp Tou 00002 +#Once again, you are back at %H. +# +あなたは再び%Hへと戻ってきた. +%E +%Cp Tou 00003 +#You are back at %H. +#Things appear to have become so bad that you fear that soon +#%H will not be here to return to. +# +あなたは%Hへと戻ってきた. + +状況がひどくなりすぎて, +帰ってくる頃には%Hがなくなってしまうのではないかと危惧した. +%E +%Cp Tou 00005 +#"Gehennom on 5 zorkmids a day -- more like 500 a day if you ask me." +# +「ゲヘナで一日5ゴールドだって?500の間違いじゃぁないのかい?」 +%E +%Cp Tou 00006 +#"Do you know where I could find some nice postcards of The Gnomish Mines?" +# +「ノームの炭坑のきれいな絵葉書を売ってるところ知りません?」 +%E +%Cp Tou 00007 +#"Have you tried the weird toilets?" +# +「あのー.変なトイレを使ったことあります?」 +%E +%Cp Tou 00008 +#"Don't stay at the Inn, I hear the food is terrible and it has rats." +# +「宿には泊まらない方がいいよ.食事がひどくて, + おまけに鼠がでるんだってさ.」 +%E +%Cp Tou 00009 +#"They told me that this was the off season!" +# +「えー.聞いてないよー.今がオフシーズンじゃなかったの?」 +%E +%Cp Tou 00010 +#"Gehennom on 5 zorkmids a day -- more like 500 a day if you ask me." +「ゲヘナで一日5ゴールドだって?500の間違いじゃぁないのかい?」 +%E +%Cp Tou 00011 +#"Do you know where I could find some nice postcards of The Gnomish Mines?" +「ノームの炭坑のきれいな絵葉書を売ってるところ知りません?」 +%E +%Cp Tou 00012 +#"Have you tried the weird toilets?" +「あのー.変なトイレを使ったことあります?」 +%E +%Cp Tou 00013 +#"If you stick around, I'll show you the pictures from my latest trip." +「ちょっとそこで待ってくれれば,私の今回の旅行についての写真を見せてあげるよ.」 +%E +%Cp Tou 00014 +#"Did you bring me back any souvenirs?" +「私のお土産を取り返してくれたのかい?」 +%E +%Cc Tou 00015 +#"Is it really you, %p! I had given up hope for your return. +#As you can %x, we are desperately in need of your talents. Someone must +#defeat %n if our town is become what it once was. +# +#"Let me see if you are ready to be that someone." +# +「やや,%p君かい.戻ってくるとは思わなかったよ. + 君にも分かると思うが,我々はヒジョーに困ってるんだ. + 誰かが%nを倒さねば,町はもとのように戻らないんだ.」 + +「君が我々を助けるに値するほどか確かめてみよう.」 +%E +%Cp Tou 00016 +#"Things are getting worse, %p. +#I hope that this time you are ready." +# +「状況は刻一刻悪化してるんだ,%p君. + 今回は用意できているだろうね.」 +%E +%Cp Tou 00017 +#"I hope that for the sake of %H you have prepared +#yourself this time." +# +「%Hのためにも,今回は準備してきただろうね.」 +%E +%Cc Tou 00018 +#"It is too late, %p. You are not even worthy to die amongst us. +#Leave %H and never return." +# +「遅すぎたね,%p君.君は我々の仲間として死ぬにも値しない. + %Hを離れて,二度と帰ってくるな.」 +%E +%Cc Tou 00019 +#"There is still too much that you have to learn before you can undertake +#the next step. Return to us as a proven %R, and perhaps then +#you will be ready. +# +#"Go back now, and may the teachings of %d serve you well." +# +「君は次の行動を起こす前にもっと学ばなければいけない. + %R として我々の前に帰ってこれたら,もしかしたら用意 + できてるかもしれない.」 + +「ささ,戻りたまえ.んで,%dの教えが君の為にならんことを.」 +%E +%Cc Tou 00020 +#"It would be an affront to %d to have one not true to the +#%a path undertake her bidding. +# +#"You must not return to us until you have purified yourself of these +#bad influences on your actions. Remember, only by following the %a +#path can you hope to overcome the obstacles you will face." +# +「%aでない道を歩むものをこの試練に送ることは%dに対し + 不貞を働くことになる.」 + +「君は自らの業を浄めるまでわれわれの元に帰ってくるな. + そして覚えておけ.%aな道だけを進ことによって君はさらなる + 試練に立ち向かうことができるんだ.」 +%E +%Cc Tou 00021 +#"You have indeed proven yourself a worthy %c, %p. +# +#"But now your kinfolk and I must ask you to put aside your travels and +#help us in our time of need. After you left us we elected a new mayor, +#%n. He proved to be a most heinous and vile creature. +# +#"Soon after taking office he absconded with %o +#and fled town, leaving behind his henchmen to rule over us. In order +#for us to regain control of our town, you must enter %i +#and recover %o. +# +#"Do not be distracted on your quest. If you do not return quickly I fear +#that all will be lost. Let us both pray now that %d will guide you +#and keep you safe." +# +「確かに君はしょーしんしょーめーの%cだ,%p君.」 + +「しかし,私及び我が一族は君に旅を一時休止して + この困ってる状況において助けてほしい.君が旅に出た直後, + %nが新しい町長として当選したんだが, + 奴は残忍にして情け容赦ない,とんでもないやつだったんだ..」 + +「町長になってからというもの,奴は%oを + 盗みだし, 町を自分の手下どもに好きなように任せ, + 町を出ていった.我々がこの町を元に戻すためには君に + %iにいってもらい,%oを + 取ってきてもらわなければならない.」 + +「道草を食うようなことはしないでくれ.もし君が早く帰ってこれなけ + れば我々は全てを失ってしまうかもしれないんだ.%dが + 君を導き,安全に守ってくれることを祈ろう.」 + +%E +%Cp Tou 00025 +#"Do not be fooled by the false promises of %n." +# +「%nの口車にのるな.奴は必ず裏切る.」 +%E +%Cp Tou 00026 +#"To enter %i you must pass many traps." +# +「%iに入るためには様々な罠をくぐり抜けなければならないっす.」 +%E +%Cp Tou 00027 +#"If you do not return with %o, your quest +#will be in vain." +# +「%oなくして帰ってきたら,あなたのしてきた + ことはなーんの意味も持たない.」 +%E +%Cp Tou 00028 +#"Do not be afraid to call upon %d if you truly need help." +# +「どうしても助けが必要なら,ためらわずに%dに祈りなさい.」 + +%E +%Cp Tou 00029 +#"If you do not destroy %n, he will follow you back here!" +# +「%nを倒さなければ,%nはあなたをここまで追ってきますよ.」 + +%E +%Cp Tou 00030 +#"Take %o from %n +#and you may be able to defeat him." +# +「%nから%oをとることが出来たら + %nを倒すことが出来るかもしれないっす.」 +%E +%Cp Tou 00031 +#"You must hurry, %p!" +# +「%p,急ぎなさい!」 +%E +%Cp Tou 00032 +#"You are like %Sa to me, %p. Do not let me down." +# +「%p君,私にとって君は%Sのようなものだ. + 期待を裏切るようなことはしないでくれ.」 +%E +%Cp Tou 00033 +#"If you are %a at all times you may succeed, %p." +# +「%p君,君が常に%aであるならば, + もしかしたら成功するかもしれない.」 +%E +%Cp Tou 00034 +#"Let all who meet you on your journey know that you are on an quest for +#%l and grant safe passage." +# +「旅の途中で会う全ての者が君に安全であるように, + 君が%lの為に旅に出ている, + ということを知らせておいたほうがいい.」 +%E +%Cp Tou 00035 +#Only your faith in %d keeps you from trembling. You %x +#the handiwork of %ns henchlings everywhere. +# +%dに対する信仰だけがあなたを恐怖から遠ざけているようだ. +あなたは%nのごろつきどもの作ったものをそこらじゅうで見かけた. +%E +%Cp Tou 00036 +#You know that this time you must find and destroy %n. +# +今回こそあなたは%nを探して倒さなければならない, +と感じた. +%E +%Cp Tou 00040 +#You sense the presence of %o. +# +あなたは%oがここのどこかに +あることに気づいた. +%E +%Cp Tou 00041 +#You gain confidence, knowing that you may soon be united with +#%o. +# +あなたはもう少ししたら%oと共になれる, +ということで自信を取り戻した. +%E +%Cc Tou 00050 +#"So, %p, %l thinks that you can wrest +#%o from me! +# +#"It only proves how desperate he has become that he sends %ra to +#try and defeat me. When this day is over, I will have you enslaved +#in the mines where you will rue the day that you ever entered +#%i. +# +「ほほう,%p,%lはお前ごときが私から +%oを取り返せると思っているのか!」 + +「%r程度の雑魚を私のもとに送りつけるとは笑止な. + よほど部下に恵まれていないらしい.今日という日が終わったら, + お前を地下の奥深くで働かせ,%iに来たことをうんと + 後悔させてやろう.」 +%E +%Cc Tou 00051 +#"I let you live the last time because it gave me pleasure. This time I will +#destroy you, %p." +「この前私がお前を生かしておいたのは,この上なく楽しませてもらったから + だ.しかし%p,今回は本当に殺す!」 +%E +%Cp Tou 00052 +#"These meetings come to bore me. You disturb my workings with +#%o. +# +#"If you do not run away now, I will inflict so much suffering on you that +#%l will feel guilty for ever having sent his %S to me!" +# +「なんだかこうしてお前と何回も会うのもつまらん. + 私と%oを邪魔してるだけだ.」 + +「もし私の前から失せなければ,お前にこの上ない苦しみを味わせてくれる. + そうすれば,%lは自分の%Sを私の元に送ったことをさぞや + 後悔するだろう.」 +%E +%Cp Tou 00053 +#"You fool. You do not know how to call upon the powers of%o. +# +# +#"Return it to me and I will teach you how to use it, and together we +#will rule %H. But do so now, as my patience +#grows thin." + +「愚か者が!お前に%oを扱う + 知識はないだろうが.」 + +「今私にそれを返せばそれの使い方を教えてやる. + それでもって,二人で%Hを支配しよう.ただ,今すぐ返せ. + 私は気が短いんでね.」 +%E +%Cp Tou 00060 +#"I defeated %l and I will defeat you, %p." +# +「私は%lに勝った.そして今度はお前に勝つ番だ,%p.」 +%E +%Cp Tou 00061 +#"Where is %d now! You must realize no one can help you here." +# +「%dとやらはここにはいない.ここでお前を助けるものなぞ + 誰もいない.」 + +%E +%Cp Tou 00062 +#"Beg for mercy now and I may be lenient on you." +# +「詫びろ.そうすれば助けてやらないこともない.」 +%E +%Cp Tou 00063 +#"If you were not so %a, you might have stood a chance." +# +「それほど%aでなければ,もしかしたら互角に戦えたかもしれない.」 +%E +%Cp Tou 00064 +#"Vengeance is mine at last, %p." +# +「最後に勝つのは私だ,%p」 +%E +%Cp Tou 00065 +#"I only wish that %l had a more worthy %r to send against me." +# +「弱い!%lももう少し骨のある%rを送り出せばよかったものを.」 +%E +%Cp Tou 00066 +#"With %o in my possession you cannot +#hope to defeat me." +# +「%oが私の手元にある以上, + お前に勝つ見込みはない!」 +%E +%Cp Tou 00067 +#"%nC has never been defeated, NEVER!" +# +「%nは一度たりとも負けたことはないのだ.一度もな.」 +%E +%Cp Tou 00068 +#"Are you truly the best %H has to send against me? +#I pity %l." +# +「お前は本当に%Hで一番強いのか?そうならば + %lを憐れむよ.」 +%E +%Cp Tou 00069 +#"How do you spell %p? I want to ensure the marker on your grave is +#correct as a warning to your %sp." +# +「%pのつづりはどう書くんだ?墓石にどう書くのかちゃんと + 確かめないと,お前の%sに対する 見せしめにならないからな.」 +%E +%Cc Tou 00070 +#As you pick up %o, you feel a great +#weight has been lifted from your shoulders. Your only thoughts are +#to quickly return to %H and find %l. +# +%oを拾うにつれて,背中から +重荷を下ろしたときのような +安堵感を感じた.今思うことはただ一つ. +%Hへ早くかえって%lを探すことだ. +%E +%Cc Tou 00080 +#You turn in the direction of %n. As his earthly body begins +#to vanish before your eyes, you hear him curse: +# +# You shall never be rid of me, %p! +# I will find you where ever you go and regain what is rightly mine. +# +あなたは%nの方向へ目を向ける.彼の体があなたの目の前から +消えるにつれ,彼の呪いの言葉を聞いた. + +「%p,お前にはずっとつきまとってやる! + お前がどこにいようがお前を必ず探し出して + 私の為にあるべきものを取り返してみせる.」 +%E +%Cc Tou 00081 +#As %l detects the presence of %o, +#he almost smiles for the first time in many a full moon. +# +#As he looks up from %o he says: +# +# You have recovered %o. You are its +# owner now, but not its master. Let it work with you as you continue +# your journey. With its help, and %d to guide you on the +# %a path, you may yet recover the Amulet of Yendor. +# +%lは%oの存在を確認するにつれ, +何月ぶりかというほどの笑顔を見せた. + +そして,%oから目を離すにつれて話した. + +「君は%oを取り戻してくれた. + それは君が持ち主となったわけだが,君はまだ真の主となったわけではない. + 君が旅を続けるにつれ,それは真の姿を見せるだろう.それと%dの + %aな導きがあればもしやしたらイェンダーの魔除けを手にすることが + できるかもしれない.」 +%E +%Cc Tou 00082 +「今や,君は%oの守護者だよ. + 魔除け探索を再開しなきゃ.魔法の入口の向こうで, + %Zが君を待っているよ. +%E +%Cc Tou 00090 +#"I could not be more proud than if you were my own %S, %p! +#Tell me of your adventures in quest of the Amulet of Yendor." +# +「君が私の本当の%Sであればよかったものの.しかし,それにしても +これは私にとって君はこの上ない誇りだ. +ささ,君のイェンダーの魔除けを探すまでの冒険談を聞かせてくれたまえ.」 +%E +%Cc Tou 00091 +#"Stand back and let me look at you, %p. +#Now that you have recovered the Amulet of Yendor, I'm afraid living +#out your days in %H would seem pretty tame. +# +#"You have come too far to stop now, for there are still more tasks that +#our oral history foretells for you. Forever more, though, your name shall +#be spoken by the %gP with awe. You are truly an inspiration to your +#%sp!" +「もう少し下がって君の姿を見せてくれ,%p. + イェンダーの魔除けを手にした以上,これからずっと + %Hで生きていくというのはちとつまらないであろう.」 + +「君はもう後戻りする訳にはいかない.なぜなら, + 君はこれから後に様々な冒険をすることを運命づけられている. + そして,%pと言う名は%gの間で伝説として語り継がれるだろう. + %p,君は自分の%sの偉大なる手本となったのだ.」 + +%E +# +# Valkyrie +# +%Cc Val 00001 +#You materialize at the base of a snowy hill. Atop the hill sits +#a place you know well, %H. You immediately realize +#that something here is very wrong! +# +#In places, the snow and ice have been melted into steaming pools of +#water. Fumaroles and pools of bubbling lava surround the hill. +#The stench of sulphur is carried through the air, and you %x creatures +#that should not be able to live in this environment moving towards you. +あなたは雪の降る丘に突如現われた.この地の丘の頂上にある%Hは +よく知っている場所だが,あなたは即座に何かが大きく違うことに気がついた. + +何故か,雪や氷が水溶け水蒸気をもくもくとあげている.噴気孔やぶくぶく +と泡だっている溶岩が丘を囲んでいる.硫黄の匂いが空気を漂っており, +このような環境では生きていけない生物があなたの前方で動いているの +を%xた. +%E +%Cp Val 00002 +#Once again, you are near the abode of %l. +もう一度,あなたは%lの住まいの近くにやってきた. +%E +%Cp Val 00003 +#Again you materialize near %ls abode. You have a nagging feeling +#that this may be the last time you come here. +再度,あなたは%lの住まいの近くに現われた.ここにやってくるのはこれが +最後であるようないらだつ気持になった. +%E +%Cp Val 00005 +#"Hail, and well met, brave %c." +「ようこそ!偉大なる%c.」 +%E +%Cp Val 00006 +#"May %d guide your steps, %p." +「%pよ,%dがお前を導いてくれるであろう.」 +%E +%Cp Val 00007 +#"%lC weakens. Without %o, her foresight is dim." +「%lは衰弱している.%oなしでは彼女の + 洞察力はかすんでしまうのだ.」 +%E +%Cp Val 00008 +#"You must hurry, %p, else Ragnarok may well come." +「お前は急がねばならぬ%p.さもなければラグナロックがやってくる.」 +%E +%Cp Val 00009 +#"I would deal with this foul %n myself, but %d forbids it." +「むかつく%nにこの身をぶつけたい,しかし%dがそれを + してはならぬと言うのだ.」 +%E +%Cp Val 00010 +#"Hail, and well met, brave %c." +「ようこそ!偉大なる%c.」 +%E +%Cp Val 00011 +#"May %d guide your steps, %p." +「%pよ,%dがお前を導いてくれるであろう.」 +%E +%Cp Val 00012 +#"%lC told us you had succeeded!" +「%lは君の成功を話してくれたよ!」 +%E +%Cp Val 00013 +#"You recovered %o just in time, %p." +「ちょうどいいときに%oを取り戻してきてくれた.%p.」 +%E +%Cp Val 00014 +#"Hail %d, for delivering %o back to us." +「おぉ,%dよ,%oを我々のもとに返してくださった.」 +%E +%Cc Val 00015 +#"Ah, %p, my %S. You have returned to %H +#at last. We are in dire need of your aid, but I must determine if you +#are yet ready for such an undertaking. +# +#"Let me read your fate..." +「まぁ,わたしの%s%pよ!%Hに戻ってきてくれましたのね. + 我々はあなたの力が至急必要なのです,しかしその前にあなたがそれを + 受け負うだけの力があるか決めなければなりません. + +「あなたの運命を読んでみましょう...」 +%E +%Cp Val 00016 +#"Let me read the future for you now, %p, perhaps you have managed to +#change it enough..." +「あなたの未来を読んでみましょう%p,たぶんあなたは簡単に + 修業をなさってくるでしょうけど...」 +%E +%Cp Val 00017 +#"Again, I shall read your fate, my %S. Let us both hope that you have +#made changes to become ready for this task..." +「また,あなたの運命を読んでみましょう,わたしの%Sよ.この + 任務をこなすだけの修業をなさってきたことを望みましょう.」 +%E +%Cc Val 00018 +#"No, %p. Your fate is sealed. I must cast about for another +#champion. Begone from my presence, and never return. Know this, that +#you shall never succeed in this life, and Valhalla is denied to you." +「いけません%p!あなたの運命は封印されてしまいました. + わたしは別の勇者を頼ることにします.わたしの前から去りなさい.戻って + くることはまかりなりません.次のことをよく覚えておくのです.あなたは + 決して成功することはないでしょう.ヴァルハラ宮殿もあなたを拒んでいます.」 +%E +%Cc Val 00019 +#"I see you and %n fighting, %p. But you are not prepared and +#shall die at %ns hand if you proceed. No. This will not do. +#Go back out into the world, and grow more experienced at the ways of +#war. Only when you have returned %Ra will you be able to defeat +#%n." +「%pよ,私はあなたと%nの戦いを見ています.しかし + あなたは準備ができてないようです.今のままではあなたは%n + の手により殺されてしまうでしょう.いけません.こんなことになっては + いけない.戻りなさい,そして戦いにより経験を積むのです.%R + になってから戻ってくるのです.そうすれば,%nを打ち負かすこ + とができるでしょう.」 +%E +%Cc Val 00020 +#"NO! This is terrible. I see you becoming an ally of %n, and +#leading his armies in the final great battles. This must not come to +#pass! You have strayed from the %a path. You must purge yourself, +#and return here only when you have regained a state of purity." +「いけません!恐しいことです.%nに心を奪われ, + 偉大なる最終戦で彼の部下を導く姿が見えます.大変困った + ことですわね.あなたは%aの道から外れているようです. + 自分自身を浄め,純粋な気持を取り戻したときにまた戻ってくるのです.」 +%E +%Cc Val 00021 +#"It is not clear, %p, for my sight is limited without +#%o. But it is now likely that you can defeat %n, +#and recover %o. +# +#"A short time ago, %n and his minions attacked this place. They +#opened the huge volcanic vents you %x about the hill, and attacked. +#I knew that this was to come to pass, and had asked %d for a group +#of %gP to help defend this place. The few you %x here are the +#mightiest of Valhalla's own, and are all that are left of one hundred +#%d sent. +# +#"Despite the great and glorious battle we fought, %n managed at last +#to steal %o. This has upset the balance of the universe, and +#unless %o is returned into my care, %n may start Ragnarok. +# +#"You must find the entrance to %i. Travel downward +#from there and you will find %ns lair. Defeat him and +#return %o to me." +「%pよ,わたしの眼力は%o無しでは極めて制限されてしま + うので正確なことは言えません.しかし,あなたは%nを打ち負かし, + %oを取り返すだけの力を得たようです. + +「少し前に,%nと彼の使い魔がこの地に攻撃をしかけました.丘の上 + にあるのを見たと思いますが,彼らは巨大な火口を開き,攻撃をしかけてき + たのです.わたしはこれが困ったことになるのを知り,%gの一隊にこの地を + 守るよう%dに懇願しました.ここにいる者達はヴァルハラ宮殿直属 + の選ばれた精鋭で,%dの送った100人の戦士の生き残りなのです. + +「偉大かつ栄誉ある戦いにもかかわらず,とうとう%nは + %oを盗んでしまいました.%oがわたしの手元に戻らな + ければ,%nはラグナロックを始めてしまい,世界の均衡は崩れて + しまうでしょう. + +「あなたは,%iの入口を探さなければなりません.ここから地下に + 旅を進め,%nの隠れ家をみつけるのです.彼を打ち負かし, + %oを私の元へ取り返してください.」 +%E +%Cp Val 00025 +#"Go with the blessings of %d." +「%dの祝福のあらんことを.」 +%E +%Cp Val 00026 +#"Call upon %d when you are in need." +「必要ならば%dを呼びなさい.」 +%E +%Cp Val 00027 +#"Use %o if you can. It will protect you." +「可能なら%oを使いなさい.あなたを守るてしょう.」 +%E +%Cp Val 00028 +#"Magical cold is very effective against %n." +「%nには寒さの魔法が効果的です.」 +%E +%Cp Val 00029 +#"To face %n, you will need to be immune to fire." +「%nと直面するには,炎への耐性が必要です.」 +%E +%Cp Val 00030 +#"May %d strengthen your sword-arm." +「%dがあなたの利き腕に力を与えてくれるでしょう.」 +%E +%Cp Val 00031 +#"Trust in %d. He will not desert you." +「%dを信じなさい.彼はあなたを見捨てたりしませんわ.」 +%E +%Cp Val 00032 +#"It becomes more likely that Ragnarok will come with every passing moment. +#You must hurry, %p." +「ラグナロックが今すぐにでも起きそうです.急ぎなさい%p!」 +%E +%Cp Val 00033 +#"If %n can master %o, he will be powerful enough to +#face %d far earlier than is fated. This must not be!" +「もし%nが%oを支配しているなら,彼は%dに + 匹敵するくらい強力なはずです.これだけは避けねばなりません!」 +%E +%Cp Val 00034 +#"Remember your training, %p. You can succeed." +「あなたの力を信じなさい%p.きっと成功しますわ.」 +%E +%Cc Val 00035 +#The ice and snow gives way to a valley floor. You %x ahead of you +#a huge round hill surrounded by pools of lava. This then is the entrance +#to %i. It looks like you're not going to get in without +#a fight though. +氷と雪が谷底に道を作っていた.あなたは目の前に,溶岩に囲まれた大きな +丸い丘を見た.これは%iへの入口である.戦うことなしに内部に +入ることは無理なようだ. +%E +%Cp Val 00036 +#Once again, you stand before the entrance to %i. +もう一度,あなたは%iの入口の前にやってきた. +%E +%Cc Val 00040 +#Through clouds of sulphurous gasses, you %x a rock palisade +#surrounded with a moat of bubbling lava. You remember the description +#from something that %l said. This is the lair of %n. +硫黄のガスの雲間に,あなたは泡だつ溶岩の堀を囲む石の柵を見つけた. +あなたは%lが言っていたことを思いだした.これは%nの +住み家だ. +%E +%Cp Val 00041 +#Once again, you stand in sight of %ns lair. +もう一度,あなたは%nの住み家の見えるところにやってきた. +%E +%Cc Val 00050 +#"So! %lC has finally sent %ca to challenge me! +# +#"I thought that mastering %o would enable me to challenge %d, +#but it has shown me that first I must kill you! +#So come, little %s. Once I defeat you, I can at last begin +#the final battle with %d." +「ほう.%lは私を倒すため%cを送ってきたか! + +「私は%oを支配することにより%dを倒せると思ってるのだが, + 手始めに貴様を殺すことによってその力をためしてみよう!来るがよい. + 哀れな%sよ.貴様を殺してから,%dとの最終戦争を始めよう + ではないか.」 +%E +%Cp Val 00051 +#"Again you challenge me, %r. Good. I will kill you now." +「またきたか%r.よろしい.今度こそ貴様に止めを刺してやろう.」 +%E +%Cp Val 00052 +#"Have you not learned yet? You cannot defeat %n!" +「まだわからんのか?貴様に%nは倒せないのさ!」 +%E +%Cp Val 00053 +#"I will kill you, %c, and wrest %o from your mangled hands." +「%cよ死ね!貴様の腕を切りきざみ%oをもぎとってやる.」 +%E +%Cp Val 00060 +#"I am your death, %c." +「我に貴様の死を,%c.」 +%E +%Cp Val 00061 +#"You cannot prevail, %r. I have foreseen your every move." +「私には勝てんよ,%r.貴様の動きなど手に取るようにわかるわい.」 +%E +%Cp Val 00062 +#"With you out of the way, Valhalla will be mine for the taking." +「貴様が道から外れているので,ヴァルハラ宮殿は我がものだ.」 +%E +%Cp Val 00063 +#"I killed scores of %ds best when I took %o. +#Do you really think that one %c can stand against me?" +「%oを手にしてたときは,%dの精鋭を何十人となく殺したもんだ. + たった1人の%cが私にはむかってくる?滑稽な話だ.」 +%E +%Cp Val 00064 +#"Who bears the souls of %c to Valhalla, %r?" +「誰が%cの魂をヴァルハラ宮殿に生みつけるんだ,%rよ?」 +%E +%Cp Val 00065 +#"No, %d cannot help you here." +「無駄無駄,ここでは%dは助けてくれないぞ.」 +%E +%Cp Val 00066 +#"Some instrument of %d you are, %p. You are a weakling!" +「貴様は%dの道具さ%p.軟弱者め!」 +%E +%Cp Val 00067 +#"Never have I seen %ca so clumsy in battle." +「%cがこんなにも戦いが下手とは知らなかったわい.」 +%E +%Cp Val 00068 +#"You die now, little %s." +「貴様はすぐにでも死ぬさ,可愛いそうな%sよ.」 +%E +%Cp Val 00069 +#"Your body I destroy now, your soul when my hordes overrun Valhalla!" +「貴様の体を破壊し,貴様の魂は我が軍がヴァルハラ宮殿を襲うときに + 破壊するとしよう!」 +%E +%Cc Val 00070 +#As you pick up %o, your mind is suddenly filled with images, +#and you perceive all of the possibilities of each potential choice you +#could make. As you begin to control and channel your thoughts, you +#realize that you must return %o to %lC immediately. +%oを拾うと,あなたの心は突然イメージで満たされ,選択可能な全ての +可能性を理解した.あなたの思いを制御し伝達しはじめると,あなたは +%oを%lに直ちに返さなければならないことに気がついた. +%E +%Cc Val 00080 +#A look of surprise and horror appears on %ns face. +# +# No!!! %o has lied to me! I have been misled! +# +#Suddenly, %n grasps his head and screams in agony, then dies. +驚きと恐怖が%nの顔に現われた. + + ばかな!%oは我が手中にあったはずだ.何故だ!! + +突然%nは顔を掴み,苦痛の声をあげ,死んだ. +%E +%Cc Val 00081 +#As you approach, %lC rises and touches %o. +# +#"You may take %o with you, %p. I have removed from +#it the power to foretell the future, for that power no mortal should +#have. Its other abilities, however, you have at your disposal. +# +#"You must now begin in %ds name to search for the Amulet of Yendor. +#May your steps be guided by %d, my %S." +あなたが近づくと,%lは立ちあがり,%oに触れた. + +「%pよ.%oを持っていきなさい.わたしは%oから + 人間の手に触れてはならぬ未来を告げる力を取り除きました. + しかしながら%oの他の力は,あなたの思い通りに + してかまいません. + +「あなたは%dの名のもとイェンダーの魔除けを探さねばなりません. + あなたの進む道が%dの導きにより開かれますように. + わたしの%sよ.」 +%E +%Cc Val 00082 +「気をつけなさい%p!%oが壊れてしまうわ. + そうなったら大きな痛手です.あなたは%oの守護者なのです. + 魔除け探索を再開しなさい.魔法の入口の向こうで, + %Zがあなたを待っていますよ. +%E +%Cp Val 00090 +#"Greetings, %p. I have not been able to pay as much attention to +#your search for the Amulet as I have wished. How do you fare?" +「%p,ようこそ.私はあなたの魔除け探索についての助言を + 述べることはできません.今の旅はどんな感じかしら?」 +%E +%Cc Val 00091 +#"Excellent, %p. I see you have recovered the Amulet! +# +#"You must take the Amulet to the Great Temple of %d, on the Astral +#plane. There you must offer the Amulet to %d. +# +#"Go now, my %S. I cannot tell you your fate, as the power of the +#Amulet interferes with mine. I hope for your success." +「まぁ,なんてことでしょう%p.あなたが魔除けを取り戻すのを + この目で見られるなんて! + +「あなたは魔除けを精霊界にある%dの偉大な寺院に持っていかねば + なりません.そこで%dに魔除けを捧げるのです. + +「さぁ,わたしの%S.私はあなたに運命を告げることはできま + せん.魔除けの力が邪魔をするのです.あなたの成功を祈っていますわ.」 +%E +# +# Wizard +# +%Cc Wiz 00001 +#You are suddenly in familiar surroundings. You notice what appears to +#be a large, squat stone structure nearby. Wait! That looks like the +#tower of your former teacher, %l. +# +#However, things are not the same as when you were last here. Mists and +#areas of unexplained darkness surround the tower. There is movement in +#the shadows. +# +#Your teacher would never allow such unaesthetic forms to surround the +#tower... unless something were dreadfully wrong! +突然,あなたは見なれた景色の中に自分を見い出した.大きくてずんぐりした +石づくりの建造物が,そばにあるのにあなたは気がついた.待てよ,それはあ +なたの老師,%lの塔のようだ. + +だが,前回ここへ来た時と状況は変わってしまっている.霧と,名状しがたい +暗黒とが塔を覆っている.闇の中に,動く影がある. + +あなたの師の美意識は,こんなものが塔を覆うことを決して許しはしないはず +だ....何かとてつもなく恐ろしいことが起こったとでもいうのでないかぎ +り! +%E +%Cp Wiz 00002 +#Once again, you are back at %H. +ふたたび,あなたは%Hに戻ってきた. +%E +%Cp Wiz 00003 +#You are back at %H. +#You have an odd feeling this may be the last time you ever come here. +あなたは%Hに戻ってきた. +ここに来るのはこれで最後になるかもしれない,そんな奇妙な気がした. +%E +%Cp Wiz 00005 +#"Would you happen to have some eye of newt in that overstuffed pack, %s?" +「%sよ,そのぱんぱんの荷物の中には,ひょっとしてイモリの目が + 入っていたりはしないか?」 +%E +%Cp Wiz 00006 +#"Ah, the spell to create the magic portal worked. Outstanding!" +「おお,魔法の入口を作る魔法が働いた.見よ!」 +%E +%Cp Wiz 00007 +#"Hurry! %lC may not survive that casting of the +#portal spell!!" +「急げ!魔法の入口を作る魔法を唱えたからには%lはもう長いこと + はないぞ!!」 +%E +%Cp Wiz 00008 +#"The spells of %n were just too powerful for us to withstand." +「%nの呪文は我々が抵抗するにはまったく強力でした.」 +%E +%Cp Wiz 00009 +#"I, too, will venture into the world, because %n is but one of +#many evils to be vanquished." +「わたしも思い切って冒険に出よう.%nは,滅ぼすべき + 魔物どものひとつにすぎんのだから.」 +%E +%Cp Wiz 00010 +#"I have some eye of newt to trade, do you have a spare blind-worm's sting?" +「私の持ってるイモリの目と交換できるような余った盲目虫の針は持ってないかい?」 +%E +%Cp Wiz 00011 +#"The magic portal now seems like it will remain stable for quite some time." +「今,魔法の入り口はまるで今までずっと安定していたかのように見えます.」 +%E +%Cp Wiz 00012 +#"Have you noticed how much stronger %l is since %o was recovered?" +「%oが戻されてから%lがどれほど強くなったか教えてくれるかい?」 +%E +%Cp Wiz 00013 +#"Thank %d! We weren't positive you would defeat %n." +「%dに感謝を!おまえが%nを倒せるとは確信していなかった.」 +%E +%Cp Wiz 00014 +#"I, too, will venture into the world, because %n was but one of +#many evils to be vanquished." +「わたしも思い切って冒険に出よう.%nは,滅ぼすべき + 魔物どものひとつにすぎなかったのだから.」 +%E +%Cc Wiz 00015 +#"Come closer, %p, for my voice falters in my old age. +#Yes, I see that you have come a long way since you went out into the +#world, leaving the safe confines of this tower. However, I must first +#determine if you have all of the skills required to take on the task +#I require of you." +「%pよ,もっと近くに来てくれ.わたしの声は年のせいで掠れてし + まったのでな.おまえが安全なこの塔の領域を去り,世に旅立ってからもう, + ずいぶんになる.やっと来てくれたのだな.だが,まずはじめに,おまえに + 使命を果たすため充分な腕前があるのかどうか,試さねばならん.」 +%E +%Cp Wiz 00016 +#"Well, %p, you have returned. Perhaps you are now ready..." +「%pよ,戻ってきてくれたのだな.準備は万端のことと思うが...」 +%E +%Cp Wiz 00017 +#"This is getting tedious, %p, but perseverance is a sign of a true mage. +#I certainly hope that you are truly ready this time!" +「%pよ,待つのは退屈だ.しかし,忍耐こそは真の勇気の証なのだ. + 今度こそはまさに準備を整えておろうな!」 +%E +%Cc Wiz 00018 +#"You fool, %p! Why did I waste all of those years teaching you +#the esoteric arts? Get out of here! I shall find another." +「%pよ,このうつけものめが!何故わたしはこの数年まるまる, + おまえに奥義を伝授するのに費やしてしまったというのだろう?出ていけ! + お前なんぞに期待はせん.」 +%E +%Cc Wiz 00019 +#"Alas, %p, you have not yet shown your proficiency as a worthy +#spellcaster. As %ra, you would surely be overcome in the challenge +#ahead. Go, now, expand your horizons, and return when you have attained +#renown as %Ra." +「ああ,%pよ.おまえはまだ,まじない師にふさわしい熟練を + 見せておらん.%raとしては,確かに試練に耐えてきたのであろう.さあ, + 行け.もっと能力を高めよ.%Raとしての名声を勝ちとった時, + 再び戻ってくるのだ.」 +%E +%Cc Wiz 00020 +#"You amaze me, %p! How many times did I tell you that the way of a mage +#is an exacting one. One must use the world with care, lest one leave it +#in ruins and simplify the task of %n. +# +#"You must go back and show your worthiness. Do not return until you are +#truly ready for this quest. May %d guide you in this task." +「%pよ,おまえには驚いた.魔法使いの道は厳しいものだと, + 何度言ったらわかるのだ.世界を扱うには注意をもってせよ.さもなくば, + 世界は廃虚と化し,%nの仕事を楽にするだけだ. + +「戻って,自分がいかに価値ある者か,示すのだ.冒険の準備が本当に整うま + で,ここに戻ることは許さん.%dの導きのあらんことを.」 +%E +%Cc Wiz 00021 +#"Yes, %p, you truly are ready for this dire task. Listen, +#carefully, for what I tell you now will be of vital importance. +# +#"Since you left us to hone your skills in the world, we unexpectedly came +#under attack by the forces of %n. As you know, we thought +#%n had perished at the end of the last age, but, alas, this was +#not the case. +# +#"%nC sent an army of abominations against us. Among them was a +#minion, mindless and ensorcelled, and thus, in the confusion, it was able +#to penetrate our defenses. Alas, this creature has stolen +#%o and I fear it has delivered %o +#to %n. +# +#"Over the years, I had woven most of my power into this amulet, and thus, +#without it, I have but a shadow of my former power, and I fear that I +#shall soon perish. +# +#"You must travel to %i, and within its dungeons, +#find and overcome %n, and return %o to me. +# +#"Go now, with %d, and complete this quest before it is too late." +「%pよ,このおそろしい仕事への準備はまさに整ったようだな. + よく聞け.これからわたしの言うことは,おまえにとってきわめて重要なこ + となのだ. + +「おまえが技を磨くため,我々を残し,世に出て行ってからというもの,我々 + は%nの手により予期しない攻撃を食らっている.%nは + 先の時代の終りに滅んだものと思っていた.しかし,ああ,それは間違いだ + ったのだ. + +「%nは忌まわしきものの大群を,我々のもとへよこした.そのなか + には理性のない魔術使いの手下がおり,混乱に乗じて我々の防衛線を突破す + ることができたのだ.ああ,そいつは%oを盗んでしまった. + そして%oを%nのもとへ届けてしまったのではないかとわた + しは恐れている. + +「長年の間,わたしは自分の力のほとんどを,この魔よけに注ぎ込んだ.その + せいでわたしは魔よけなしでは,力をほとんど発揮できない.そして,その + まま死んでしまうのではないかとわたしは恐れている. + +「おまえは%iへ行き,その迷路の中で%nを見つけ打ち倒し, + %oをわたしのもとへ奪い返してくるのだ. + +「%dとともに行け.そして手遅れになる前にこの使命を果たすのだ.」 +%E +%Cp Wiz 00025 +#"Beware, for %n is immune to most magical attacks." +「気をつけろ.%nを魔法で攻撃しても,大抵効かないぞ.」 +%E +%Cp Wiz 00026 +#"To enter %i you must pass many traps." +「%iに入るためには,罠をたくさんかわさねばならない.」 +%E +%Cp Wiz 00027 +#"%nC may be vulnerable to physical attacks." +「%nは,物理的攻撃には弱いということもありうる.」 +%E +%Cp Wiz 00028 +#"%d will come to your aid when you call." +「%dは,呼べば,あなたを助けに来てくれることだろう.」 +%E +%Cp Wiz 00029 +#"You must utterly destroy %n. He will pursue you otherwise." +「%nは完全に殺してしまわねばならない.そうしないと,いつまでも + 追いかけてくる.」 +%E +%Cp Wiz 00030 +#"%oC is a mighty artifact. With it you can +#destroy %n." +「%oCは強力な聖器だ.これを使えば,%nを殺すことができる.」 +%E +%Cp Wiz 00031 +#"Go forth with the blessings of %d." +「%dの祝福とともに進め.」 +%E +%Cp Wiz 00032 +#"I will have my %gP watch for your return." +「わたしの%gPに,あなたの帰還を待たせるとしよう.」 +%E +%Cp Wiz 00033 +#"Feel free to take any items in that chest that might aid you." +「この箱の中のもので,役立つものがあれば何でも持っていくがよい.」 +%E +%Cp Wiz 00034 +#"You will know when %o is near. Proceed with care!" +「%oが近付いてくると,それを感じるだろう.注意深く進め!」 +%E +%Cp Wiz 00035 +#Wisps of fog swirl nearby. You feel that %ns lair is close. +近くで煙が一筋,渦を巻いている.あなたは%nの隠れ家が +近付いたのを感じた. +%E +%Cp Wiz 00036 +#You believe that you may once again invade %i. +あなたは,自分が再び,%iに侵入することになるかもしれないことを +確信した. +%E +%Cp Wiz 00040 +#You feel your mentor's presence; perhaps %o is nearby. +あなたは師の存在を感じた.%oが近いのだろう. +%E +%Cp Wiz 00041 +#The aura of %o tingles at the edge of your perception. +%oのオーラのせいで,あなたの知覚のへりがひりひりした. +%E +%Cc Wiz 00050 +#"Ah, I recognize you, %p. So, %l has sent you to steal +#%o from me, hmmm? Well, %l is a +#fool to send such a mental weakling against me. +# +#"Your destruction, however, should make for good sport. In the end, you +#shall beg me to kill you!" +「おお,%p,君か.つまり,%lはわたしから%oを + 盗み出すために君を送り込んだってわけだね?こんなうすら馬鹿をわたしに + 差し向けるとは,%lもヤキがまわったもんだねぇ.」 + +「まっ,君をやっつけるのも,いい運動になるだろう.しまいには,自分から + 殺してくれってわたしに懇願させてあげようじゃないか!」 +%E +%Cc Wiz 00051 +#"How nice of you to return, %p! I enjoyed our last meeting. Are you +#still hungry for more pain? +# +#"Come! Your soul, like %o, shall soon be mine to +#command." +「%pよ,よくぞ戻ってきた.このまえはとても楽しかったよ. + 痛い思いにまだまだ飢えてるってわけかい?」 + +「かかってこい!すぐに君の魂を,%oと同じく,わたしの思うまま + にしてあげようじゃないか.」 +%E +%Cp Wiz 00052 +#"I'm sure that your perseverance shall be the subject of innumerable +#ballads, but you shall not be around to hear them, I fear!" +「おまえの忍耐力は,無数の物語の語るところとなることだろう.だが,わた + しが恐れるのは,おまえがそれを聞くことはついぞないのではないかという + ことだ!」 +%E +%Cp Wiz 00053 +#"Thief! %o belongs to me, now. I shall feed +#your living flesh to my minions." +「泥棒!%oは今やわたしのものだ.おまえの肉を,わたしの手下ども + にくれてやるぞ.」 +%E +%Cp Wiz 00060 +#"Your puny powers are no match for me, fool!" +「馬鹿ものめ,そんなひよわなことでわたしにかなうと思ったか!」 +%E +%Cp Wiz 00061 +#"When you are defeated, your torment will last for a thousand years." +「君の死の苦しみは1000年ものあいだ続くことになろう.」 +%E +%Cp Wiz 00062 +#"After your downfall, %p, I shall devour %l +#for dessert!" +「%pよ,君を斃したあとは,デザートに%lを滅ぼして + やろうじゃないか!」 +%E +%Cp Wiz 00063 +#"Are you ready yet to beg for mercy? I could be lenient..." +「もう慈悲を乞う準備はできたかい?わたしが寛大であったらよかったかもな...」 +%E +%Cp Wiz 00064 +#"Your soul shall join the enslaved multitude I command!" +「君の魂を,わたしの命に従うやつらに加えてやろうじゃないか!」 +%E +%Cp Wiz 00065 +#"Your lack of will is evident, and you shall die as a result." +「君に気力がないことは目に見えているんだ.それが命とりになるんだよ.」 +%E +%Cp Wiz 00066 +#"Your faith in %d is for naught! Come, submit to me now!" +「君の%dへの信心は無駄だ!さあ,もはや,わたしに従うのだ!」 +%E +%Cp Wiz 00067 +#"A mere %r is nothing compared to my skill!" +「%rなど,わたしの技に比べればものの数ではない!」 +%E +%Cp Wiz 00068 +#"So, you are the best hope of %l? How droll." +「ほう,君は%lの最大の希望であるってわけかね?こりゃあ,傑作だ.」 +%E +%Cp Wiz 00069 +#"Feel my power, %c! My victory is imminent!" +「%cよ,わたしの力を感じるのだ!わたしの勝利は目に見えてるじゃないか!」 +%E +%Cc Wiz 00070 +#As you touch %o, its comforting power infuses you +#with new energy. You feel as if you can detect others' thoughts flowing +#through it. Although you yearn to wear %o +#and attack the Wizard of Yendor, you know you must return it to its +#rightful owner, %l. +%oに触れると,その心地よい力はおまえに新たなる力を注いで +くれる.おまえはそれから流れ出てくる他の者の思考を理解できるような気が +することだろう.おまえは%oをまとってイェンダーの魔法使い +を攻撃することを切に願うであろうが,おまえはその正当なる所有者, +%lのもとへ自分が戻らねばならぬのだ. +%E +%Cc Wiz 00080 +#%nC croaks out, as his body begins to shrivel up: +# +# I shall haunt your progress until the end of time. A thousand +# curses on you and %l. +# +#Then, the body bursts into a cloud of choking dust, and blows away. +%nが叫ぶと,その体はみるみるうちにしぼみはじめた. + + おまえの行く先々,時の終りまでたたってやる. + おまえと%lに千の呪いのあらんことを. + +すると,その体は爆発して息のつまりそうな煙に変わり,流れて消えた. +%E +%Cc Wiz 00081 +#%lC notices %o in your possession, +#beams at you and says: +# +# I knew you could defeat %n and retrieve +# %o. We shall never forget this +# brave service. +# +# Take %o with you in your quest for +# the Amulet of Yendor. I can sense that it has attuned +# itself to you already. +# +# May %d guide you in your quest, and keep you from harm. +%lはあなたが%oを持っていることに気がつき, +あなたを見て言った. + + どうやら,%nをたおして%oをとりかえす + ことができたようだな.わたしはこの勇気ある行ないを決して忘れはしま + いぞ. + + イェンダーの魔除けを求めに,%oを携えて行くがよい. + すでにおまえに同調しているのがわたしにはわかるのだ. + + %dがおまえの旅を導き,危険より守らんことを. +%E +%Cc Wiz 00082 +「今や,おまえは%oの守護者だ. + *他の*魔除け探索を再開せよ.魔法の入口の向こうで, + %Zがおまえを待っているぞ. +%E +%Cc Wiz 00090 +#"Come near, my %S, and share your adventures with me. So, have you +#succeeded in your quest for the Amulet of Yendor?" +「わが%Sよ,もっと近くに来て,冒険を共にしてくれ.イェンダー + の魔よけはもう,手に入れたかね?」 +%E +%Cc Wiz 00091 +#"Congratulations, %p. I always knew that if anyone could succeed +#in defeating the Wizard of Yendor and his minions, it would be you. +# +#"Go now, and take the Amulet to the astral plane. Once there, present +#the Amulet on the altar of %d. Along the way you shall pass through the +#four elemental planes. These planes are like nothing you have ever +#experienced before, so be prepared! +# +#"For this you were born, %s! I am very proud of you." +「%pよ,おめでとう.イェンダーの魔法使いとその一味をたおすこと + ができるものがいるとすれば,おまえであろうことはわたしにはいつもわかっ + ていたよ. + +「その魔除けを持ち,精霊界に行くのだ.昔,その魔除けは%dの祭壇にあったの + だ.その途中,おまえは4つの界面を通過することになろう.今までの経験に + ない場所だ,覚悟を決めておくのだぞ! + +「%sよ,おまえはこのために生まれてきたのだ.おまえをわたしはとても + ほこらしく思うぞ.」 +%E +# +# General +# +%Cc - 00001 +#It is written in the Book of %d: +# +# After the Creation, the cruel god Moloch rebelled +# against the authority of Marduk the Creator. +# Moloch stole from Marduk the most powerful of all +# the artifacts of the gods, the Amulet of Yendor, +# and he hid it in the dark cavities of Gehennom, the +# Under World, where he now lurks, and bides his time. +# +#Your %G %d seeks to possess the Amulet, and with it +#to gain deserved ascendance over the other gods. +# +#You, a newly trained %r, have been heralded +#from birth as the instrument of %d. You are destined +#to recover the Amulet for your deity, or die in the +#attempt. Your hour of destiny has come. For the sake +#of us all: Go bravely with %d! +これは,%dの書に述べられているものである. + + 天地創造の後,破壊神モーロック,創造主マルドゥークと違いして + 反乱す.破壊神モーロック,マルドゥークの聖器のなかより,万物 + の力の源「イェンダーの魔除け」を盗みだし,それを彼の潜む + 世界の底,ゲヘナの闇の洞窟に隠し,時を待てり. + +%G%dは「魔除け」を望み,他の神々に対し +絶対的優勢を得ようとしている. + +あなたは現在,まだ%rではあるが,生まれたときから%d +の下僕と予言されている.%Gのため,イェンダーの魔除けを発見 +するか,そのために死ぬかが運命づけらている.あなたの運命の時 +は来た!我々のために,%dの加護のあらんことを! +%E +%Cp - 00002 +#You receive a faint telepathic message from %l: +#Your help is urgently needed at %H! +#Look for a ...ic transporter. +#You couldn't quite make out that last message. +あなたは,%lから微かなテレパシーメッセージを受けとった: +%Hで助けを火急に必要としている. +魔..の..口を探す..... +あなたは最後のメッセージを完全に受けとれなかった. +%E +%Cp - 00003 +#You again sense %l pleading for help. +あなたは,また%lが助けを求めているのを感じた. +%E +%Cp - 00004 +#You again sense %l demanding your attendance. +あなたは,また%lがあなたを求めているのを感じた. +%E +# Completed the quest by returning with artifact, but not carrying +# the Bell of Opening; quest leader lets you know that it is needed. +#[ Should this be role-specific so that each leader has variant text? ] +%Cp - 00005 +#"The silver bell which was hoarded by %n will be +#essential in locating the Amulet of Yendor." +「%nの所持していた銀のベル.それは,イェンダーの魔除けを探し出すのに +必要不可欠である.」 +%E +# +# Angelic maledictions. +# +%Cp - 00010 +#"Repent, and thou shalt be saved!" +「悔いあらためよ,されば汝救われん!」 +%E +%Cp - 00011 +#"Thou shalt pay for thine insolence!" +「汝,己の働きし傲慢の報いを受けるべし!」 +%E +%Cp - 00012 +#"Very soon, my child, thou shalt meet thy maker." +「我が子よ,汝は己の作りたもう者にあいま見えることになろう.」 +%E +%Cp - 00013 +#"The great %D has sent me to make you pay for your sins!" +「偉大なる%Dが汝の罪の償いのため我を使わせん.」 +%E +%Cp - 00014 +#"The wrath of %D is now upon you!" +「そなたは%Dの怒りに触れた!」 +%E +%Cp - 00015 +#"Thy life belongs to %D now!" +「汝の生命,いまや%Dの掌の上なり!」 +%E +%Cp - 00016 +#"Dost thou wish to receive thy final blessing?" +「汝最後の祝福を受けることを所望するか?」 +%E +%Cp - 00017 +#"Thou art but a godless void." +「汝,神をも信じぬ異端者以外の何者でもない.」 +%E +%Cp - 00018 +#"Thou art not worthy to seek the Amulet." +「汝,魔除けを探し求めるに値せず!」 +%E +%Cp - 00019 +#"No one expects the Spanish Inquisition!" +「異端審問を受けることを予想する者など誰もいない!」 +%E +# +# Demonic maledictions. +# +%Cp - 00030 +#"I first mistook thee for a statue, when I regarded thy head of stone." +「お前の石頭を見て,お前を石像と間違えたわい.」 +%E +%Cp - 00031 +#"Come here often?" +「ここへはよく来るのか?」 +%E +%Cp - 00032 +#"Doth pain excite thee? Wouldst thou prefer the whip?" +「お前は苦痛に興奮を感じるか?鞭のほうがよいかな?」 +%E +%Cp - 00033 +#"Thinkest thou it shall tickle as I rip out thy lungs?" +「お前のはらわたを引き裂いたら楽しいと思うか?」 +%E +%Cp - 00034 +#"Eat slime and die!" +「スライムでも喰らって死ねい!」 +%E +%Cp - 00035 +#"Go ahead, fetch thy mama! I shall wait." +「失せろ!お前のママでも呼んできな!それまで待ってやる.」 +%E +%Cp - 00036 +#"Go play leapfrog with a herd of unicorns!" +「ユニコーンの群れと馬飛びでもして遊んでな!」 +%E +%Cp - 00037 +#"Hast thou been drinking, or art thou always so clumsy?" +「お前は酔っぱらいか?それともそれが実力か?」 +%E +%Cp - 00038 +#"This time I shall let thee off with a spanking, but let it not happen again." +「今回は尻叩きだけで許そう.しかし二度目はそうはいかぬ.」 +%E +%Cp - 00039 +#"I've met smarter (and prettier) acid blobs." +「お前よりずっと賢い(かつ綺麗な)酸のブロブを見たことがあるぞ.」 +%E +%Cp - 00040 +#"Look! Thy bootlace is undone!" +「見ろ!靴紐がほどけてるぞ!」 +%E +%Cp - 00041 +#"Mercy! Dost thou wish me to die of laughter?" +「わはは,やめてくれ!お前は私を笑い殺すつもりか?」 +%E +%Cp - 00042 +#"Run away! Live to flee another day!" +「逃げ失せろ!一日でも長く生き続けるがよい!」 +%E +%Cp - 00043 +#"Thou hadst best fight better than thou canst dress!" +「お前は着こなすより戦うほうがうまいな!」 +%E +%Cp - 00044 +#"Twixt thy cousin and thee, Medusa is the prettier." +「お前とお前の従兄弟より,メデューサの方がかわいいぞ.」 +%E +%Cp - 00045 +#"Methinks thou wert unnaturally interested in yon corpse back there, eh, varlet?" +「見る限りでは,向こうにある己の屍に無関心なようだが, + 実際はどうなのだ?こわっぱ」 +%E +%Cp - 00046 +#"Up thy nose with a rubber hose!" +「鼻にゴムホースでも突っこんでろ!」 +%E +%Cp - 00047 +#"Verily, thy corpse could not smell worse!" +「はっきりいって,そちの屍の匂いは最悪だ!」 +%E +%Cp - 00048 +#"Wait! I shall polymorph into a grid bug to give thee a fighting chance!" +「おっと!グリッドバグにでも変化して戦いを楽にしてやろうか!」 +%E +%Cp - 00049 +#"Why search for the Amulet? Thou wouldst but lose it, cretin." +「何故魔除けを探索する?お前のようなうつけではなくすだけだ.」 +%E +# +# Banishment message (for converted hero) +# +%Cc - 00060 +#"You have betrayed all those who hold allegiance to %d, as you once did. +#My allegiance to %d holds fast and I cannot condone or accept what you +#have done. +# +#Leave this place. You shall never set foot at %H again. +#That which you seek is now lost forever, for without the Bell of Opening, +#you will never be able to enter the place where he who has the Amulet +#resides. +# +#Go now! You are banished from this place. +「お前は%dを信ずる人々全てを裏切った. +%dへの忠誠をもってすれば、お前の行いを見逃したり許したりすることはできない. + +この場を去れ.二度と%Hに足を踏み入れることはならぬ. +お前の捜し求めていたものは今となっては永遠に失われた. +開放のベルなしでは,魔除けを持つ者のいる地に入ることは出来ぬ. + +さあ行け!お前はこの地から追放されたのだ.」 +%E +# +# TEST PATTERN +# +%Cc - 00099 + %p: return(plname); + %c: return(pl_character); + %r: return((char *)rank_of(u.ulevel)); + %R: return((char *)rank_of(MIN_QUEST_LEVEL)); + %s: return((flags.female) ? "sister" : "brother" ); + %S: return((flags.female) ? "daughter" : "son" ); + %l: return((char *)ldrname()); + %i: return(intermed()); + %o: return(artiname()); + %n: return((char *)neminame()); + %g: return((char *)guardname()); + %G: return((char *)align_gtitle(u.ualignbase[1])); + %H: return((char *)homebase()); + %a: return(Alignnam(u.ualignbase[1])); + %A: return(Alignnam(u.ualign.type)); + %d: return((char *)align_gname(u.ualignbase[1])); + %D: return((char *)align_gname(A_LAWFUL)); + %C: return("chaotic"); + %N: return("neutral"); + %L: return("lawful"); + %x: return((Blind) ? "sense" : "see"); + %Z: return("The Dungeons of Doom"); + %%: return(percent_sign); + a suffix: return an(root); + A suffix: return An(root); + C suffix: return capitalized(root); + p suffix: return makeplural(root); + P suffix: return makeplural(capitalized(root)); + s suffix: return s_suffix(root); + S suffix: return s_suffix(capitalized(root)); + t suffix: return strip_the_prefix(root); +%E diff -aurbN -xCVS -xXTAGS nethack/dat/jrumors.fal jnethack/dat/jrumors.fal --- nethack/dat/jrumors.fal 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/dat/jrumors.fal 2005-06-05 17:37:07.000000000 +0900 @@ -0,0 +1,392 @@ +「俺が死んだら最初に天国で見るのはスコアのリストかな?」 +ハッキングの第一法則: 出るのは入るのより難しい. +ハッキングの第二法則: ファーストイン,ファーストアウト. +ハッキングの第三法則: 最後の一撃が一番痛い. +ハッキングの第四法則: 入口は出口である. +メイルデーモンに化けたカメレオンがたまに炎の巻物を持ってくる. +コカトリスの死体は腐ることがないことが保証されている! +コカトリスの死体とはトカゲの死体のことである. +ドラゴンとは炎の巻物を食べた蛇のことである. +暗い回廊は洞察力を高める. +輝く薬は熱すぎて飲むことができない. +ある種の魔除けは番兵の攻撃を防ぐことができる. +トカゲの死体は不死の生き物を土に還す効果がある. +ロングワームは再帰的に定義されている.一体どうやって攻撃すりゃいいんだい? +怪物の心境はまさにおもちゃのロボットだ. +ニンフは彼女の本当の名前(ローレライ)で呼ばれるととても喜ぶ. +ダンジョンマスターを制御する指輪があるらしい. +薬指を増やす指輪は魔法をかけない限り使いものにならない. +紐を迷宮の入口に結んで置くと迷子にならない. +杖は床にしばらく置いていると使用可能量が増える. +動物園を見学することはいろんな動物に会え教育上非常によろしい. +空耳の杖は羊飼いの杖より危険な武器である. +振動の杖は洞窟を完全に潰してしまうだろう. +勝者は決して途中でやめたりしない.途中でやめたものは勝者ではない. +願い?よし,私に占いクッキーを作っておくれ. +ミミックが恐い?真実の指輪を身につけるのだ. +全ての怪物は邪悪に作られているが,ある種の怪物はさらに邪悪である. +さまよう目は背後から攻撃するよう心がけよ. +エルフのクロークを身につけてるとセンスがよいと言われる. +ときどき小さな物体が大きな物体の下に隠れていることがある. +考古学者は骨を発見する確率が高い. +オースティン・パワーズは言った: オレのアレが帰ってきた! +バルログは地下20階より上では出てこない. +バナナの皮は警備員に対して特に効果的である. +バナナを食べるときは注意せよ.怪物が皮で滑るかもしれない. +迷宮はとっと抜けたほうがよい.さもなければ大怪我をする. +ニトログリセリンの薬には気をつけよ.心筋梗塞の薬じゃないぞ. +気をつけろ!杖を使うときにはいつでも爆発の危険が伴う. +地下23階を越えれば自分の部屋で楽隠居できる. +剣を落さずに着替える?御冗談を! +扉を閉めろ!熱が逃げるじゃないか! +コカトリスは鏡に写った自分の顔を見ると石になってしまう. +迷宮では飲食物の持ち込みを禁止している. +暗い部屋では写真を現像できるらしい. +暗い部屋は「完全」に暗いのではない.目が暗闇に慣れるまで待ってみよ... +デビットロンドン曰く:「冒険者よ!トカゲの死体をコカトリスに対して武器とせよ!」 +デスは炎に包まれたとき人生の教訓を教えてくれる. +半神は神の助けは不要だ. +魔神は僧侶や尼僧を憎んでいる. +支払いを忘れてないかい? +ママに拾い喰いをしちゃいけないように言われてないかい? +絶対的に面している敵に絶対命中するよう絶対的にやれ!絶対に正しい絶対方向だ. +何?お金が欲しい?ローディオス砦番兵組合があなたの期待にお答えします. +あなたが今何をしているかボスは知ってるかい? +何かを願うのにためらってはならない.次の階で手に入るだろうけどね. +食べすぎは体によくない.しゃっくりが始まるぞ! +仕事中にネットハックで遊んではならない.ボスに怒られるぞ! +秘密の扉を見つけても他言してはならない.そんなをことしたら秘密じゃなくなる. +20歳未満の未成年が酔っぱらいの薬を飲んだら牢屋行きになる. +うぬぼれを捨て,宝石を処分せよ!スリがうろついているんだぞ! +にんにくを10株ほど食べると,2マス四方ほど人間を遠ざけることができる. +巨大ウナギが泥の底に隠れている.ユニコーンの角で水を清め,見えるようにせよ. +エルフは一段と速い. +願いの杖であなたの望むものを床に刻め! +最終的に魅力的な素早く逃げたニンフを称賛することになろう. +シューっという音を聞いたことがあるか?お前が聞いたことないのを知ってるけど. +ドラゴンの死体を持ち上げたことがあるかい? +レオクロッタが天狗の舞いを踊っているのを見たことがあるかい? +武器がラシャ状に輝いたのを見たことがあるかい? +店主を手なずけたことがあるかい? +倉庫の番兵に穴を開けようとしたことがあるかい? +紐を強化したことがあるかい? +さまよう目はアロハシャツの前には立たない. +診察はとっても痛い. +巨大こうもりは巨大吸血鬼に変身する. +障害物記念日には障害物競争をせよ. +今晩が半月だ.少なくとも新月よりはましなはずだ. +お願い助けて!あたしは占いクッキー工場の牢屋に閉じ込められているわ. +家猫は9つの命を持っている.子猫はたった1つだ. +どのくらい水を踏んでいられる? +ハラヘリ?下の階には沢山食料があるぞ. +イェンダーの魔除けを持っているとメイルデーモンを攻撃できないだろう. +店主だったら,自由に物を持ち出せるぞ. +うまく質問すれば,魔法使いはあなたに魔除けを渡してくれるだろう. +上手くいく方法が判らないなら,上手くいかない方法を楽しめばよい. +魔法使いが邪悪だと思うのなら,将軍に会ってみるとよい. +目が見えなくなっても,ペットの犬が盲導犬になることを期待してはいけない. +とてもいい気持になりたかったら,巨大なものを食べないといけない. +体を浮かせたかったら,さまよう目を食べるのがよい. +もし自分の幽霊に殺されたなら,スコアが増加する. +霊力を高める方法:自分の幽霊を手なずけよ. +偉大なる人間を見つけるために前進せよ. +森の内部の怪物を見つけることは簡単だ. +落し扉の下には別の落し扉がある.落ち続けよ! +侍の刀はとても鋭い.自分自身を切らないように注意せよ. +心を無にする方法:無色の薬を飲むのだ. +端末を蹴ったところで怪物は傷つかない. +殺人蜂はその女王を殺すまで現われつづける. +殺人ウサギはにんじんでのみ手なずけられる. +最新のニュースが知りたい? fj.rec.games.roguelike を .newsrcに書くのだ! +綴りを覚えたい? ネットハックを遊ぶのだ! +レプラコーンは秘密の部屋にゴールドを隠している. +歩くために指を yulkjhnb のキーの上に置こう. +現実を直視しよう:今回君は勝利を得ることができない. +宴会をしよう,酔っぱらいの薬を飲もう! +酒屋は決して酒を飲まない;彼らは二度訪れられるのを嫌う. +今晩は月食だ.やめたほうがいいんじゃないかい? +自分の幽霊に会うとかなりの運を失う. +投資するための金?魔法の記念倉庫の支店から取ってくるがよい. +怪物はあらゆるところで君を打ちまかそうと,どこからともなくやって来る. +怪物は君が穴掘りしている間は眠っているが,決して疲れているからではない. +ほとんどの怪物はひき肉を好む.これが君を攻撃する理由だ. +ネットハックのほとんどのバグは床の上にいる. +から騒ぎが発生. +マルチプレイヤーネットハックってのは神話だ. +ネットハックは中毒性がある.君はもう手遅れだ. +店主に品物の値段一覧を尋ねてはいけない. ++5シャベルでひっぱたかれたのでない限り,木を燃やしてはいけない. +手が輝いているときに食事をしてはならない. +怪物に攻撃されても気にするな:そいつらは掃除婦のかわりだから. +ユニコーンで馬とびをしてはならない. +呪われた落書を踏んではならない. +カメラを持ったまま泳いではならない:被写体なんてないんだから. +錆の怪物を誘い出すようにペットを教育してはならない. +魔法のフィールド内でのランダムジェネレータを信用してはならない. +死の杖を使ってはならない. +どの階にも店は二軒ない.迷宮には階がない.だから.... +復帰可能なようにされているこのシステムだが運命のどんな一部分も再生できない. +全ての噂がこの文章のように騙そうとしているわけではない. +ニンフと看護婦は綺麗な指輪を好む. +ニンフはブロンドだ.君は神士かな? +ユニコーンに無価値のガラスをあげることは致命的な間違いであろう! +年寄ハッカーは死ぬことがない.若いやつはよく死ぬ. +閉店前に店を去らねばならない. +ホムンクルスは一日中医者に近付かないようにしている. +ちょうど今,もう一階下りたところで誰かが殺されそうになっている. +魔法使いのみが魔法の笛を使うことができる. +邪悪な属性の冒険者のみが飼い犬を殺すことを考えるそうだ. +混沌に属する邪悪な者のみが眠っている怪物を殺すそうだ. +本当のトラッパーのみが罠から抜けだせる. +真の魔法使いのみが巻物を書くとができる. +『過剰殺戮』作戦がいま始まった. +うげ.それはやだなあ. +さきほどのウワサは無視してください. +エティンに変化せよ.敵と顔と顔と顔で向きあえる. +祈りは魔神を恐れさせる. +♪ゆったりとしたカロン[Charon(4x)]の流れに沿ってのボート遊び[Row(3x)].死とは単なる夢だ. +ランニングは足によい. +勇気を奮い起せ!そうすりゃ日常生活でも勇気を奮い起せる. +水漏れ?漏れ穴のあるパイプ?湿度が上昇?配管工を召喚せよ. +Segmentation fault (core dumped). +店主はCroesus自身によって保証されている! +店主はときどき老齢のため死ぬ. +マニュアルによるといくつかの迷路(とくに小さいもの)には抜けられないものがある. +スフィンクスが出す問題には答えのないものもある. +『無』が答えのときもある. +残念でした.今回占いは入ってません!次回のクッキーに期待しましょう. +食料を作る巻物はそれが必要になるまで使わないようにしておけ. +ストームブリンガーが魂を盗むのではない.民衆が魂を盗むのだ. +突然,迷宮が崩れた... +メイルデーモンを手なずけることはシステムセキュリティ違反である. +聴衆はとても頑固だから,つっこみ役は迷宮でつっこまないほうがいいらしいぞぉ. +レプラコーンは小さな隠し部屋に宝を隠している. +長いほど杖はよい. +魔法の言葉「XYZZY」 +従順はあなたのbone fileを継承する. +炭坑は暗く深い.私は,寝る前に行けるレベルにしている. +ダイナマイトを迷宮で使うのは危険だ. +UNIXバージョンにはワームはいない. +この階には罠がある. +アスモデウス,オーケス,イェーノゴゥ,ジョウビレックスは法律事務所じゃないそうだ. +ゲリューオーンには危険な双子がいるそうだ.気をつけろ! +メデューサは恐しいペットを生み出すそうだ. +ネットハックのバグはシェルダンが計画したものだそうだ. +ネットハックには256個の風味があるそうだ. +ネットハックは単なるコンピューターゲームだそうだ. +ネットハックは単なるコンピューターゲーム以上のものがあるそうだ. +ネットハックの存在意義などないそうだ. +子供のドラゴンは小さすぎて,攻撃などできないそうだ. +黒プリンは単に茶色プリンが腐ったものだそうだ. +黒羊からは100%ウールの鞄を3つ作れるそうだ. +白紙の巻物は白紙の小切手のようなものだそうだ. +モリスという名の猫は9つの生命を持っているそうだ. +無鉄砲な買い物客は店の中で湯水のごとく金を使うそうだ. +ダイヤモンドの犬は誰にとっても最大の友だそうだ. +ドワーフの貴族は着ている鎧が軽いので,つるはしを持てるそうだ. +さまよう目はメデューサを打ち負かすそうだ. +占いは一行しかないので,行間を読むことはできないそうだ. +占いは一行しかないが,行間を読むことはできるそうだ. +泉は普通の燃える間欠泉のようには見えないそうだ. +黄金の鳥は同じ重さの金より価値があるそうだ. +グリッドバグは店の中であなたをピリっとさせ店主に金を払わないそうだ. +ジプシーは金額次第であなたの未来を告げてくれるそうだ. +その昔,アリスという名のハッカーは鏡でテレポートしたことがあるそうだ. +その昔,ダビデという名のハッカーはスリングと岩で巨人を笑い殺したそうだ. +その昔,ドロシーという名のハッカーはオズの国へ行く雲に乗ったことがあるそうだ. +その昔,メアリーという名のハッカーは迷路の中で白羊を失ったそうだ. +知性の兜は軽々しく手に入れられないそうだ. +ホットドッグとヘルハウンドは同じものだそうだ. +アラジンのランプという名のランプには3つの願いをかなえてくれるジンがいるそうだ. +ラッシーという名の犬はあなたを魔除けへと導いてくれるそうだ. +長剣は軽い剣ではないそうだ. +亡霊とは生気を抜きとる恐しいものだそうだ. +心とは生気を抜きとる恐しいものだそうだ. +普通のニンフは針金の指輪を片方の耳にしているそうだ. +桃の帽子は,かつてとさかのある兜のために使われていたそうだ. +オイルの薬を掴むのは難しいそうだ. +ヨーグルトの薬は病気の薬への特効薬だそうだ. +紫ワームは紫ドラゴンの子供ではないそうだ. +震えるブロッブの味はゼラチンキューブとはまた違ったものだそうだ. +ストームブリンガーと名づけられた神秘的な幅広の剣は渦をひきよせるそうだ. +召喚の巻物は他の名前でも呼ばれるそうだ. +呪術師は祝福を贈ることがでるが,普通はしないそうだ. +呪術師にイモリの目とこうもりの羽をあげると祝福してくれるそうだ. +輝く金の盾は磨かれた銀の盾とは違うそうだ. +槍はネオ・チューに命中するそうだ.(意味わかる?) +斑点のあるドラゴンは究極の形態変化だそうだ. +聴診器は自分の鼓動を聞くだけなら無用の長物だそうだ. +スージィという名のサキュバスはときどき危険を教えてくれるそうだ. +無力化の杖は変化の杖ではないらしい. +ピノキオという名の木のゴーレムは簡単に制御できるそうだ. +ドラゴンを殺したあとは舞台の背景を変更する時間だそうだ. +絞殺の魔除けは襟のカラーの輪よりたちが悪いそうだ. +屋根裏はおもちゃを隠すのには絶好の場所だそうだ. +クリーバーと名づけられた斧はビーバーという名のハッカーがかつて持っていたそうだ. +いもりの目とこうもりの羽はトラブルの危険が2倍になるそうだ. +イズィーという名のインキュバスはときどき女性をヒステリックにさせるそうだ. +華やかな玉座の部屋はめったにあなたが望んだ場所にないそうだ. +不幸なハッカーはその昔祭壇で鼻血を流し死んだそうだ. +というそうだが決してそうだとは言われていないそうだ. +ときどき量子場では速度が失なわれるそうだ. +ユニコーンの角を使うということは理解できかねる行為だそうだ. +青い岩は放射線を発っしているそうだ.気をつけろ. +迷宮を建設するのは共同作業だったそうだ. +混沌の職業は祭壇の蹴りを喰らうことがないそうだ. +迷宮の崩解はしばしばパニックを引き起すそうだ. +孵化する前に卵の数を数えておくことはあなたの心配症を示すものだそうだ. +手品の鞄を泉の水で濡らしてもアイスボックスにはならないそうだ. +ウナギと茶色モールドをお湯で煮るとブイヤベースというフランス料理になるそうだ. + 1ドブロン寄進するのは極めて敬虔な慈善行為だそうだ. +冒険家はダークチョコレートを好む. +ロイヤルゼリーを食べると灰色アウルベアが誘い寄せられるそうだ. +卵とパンケーキとジュースは単なるありきたりの朝食だそうだ. +誰もが何故メデューサが暗闇に一人で立っているのか知っているそうだ. +みんなrec.games.hackという名前は変えてほしいと思っているそうだ. +勝利のための戦略を発見するには気長にやるしかないそうだ. +無価値のガラスを見つけることは価値あることだそうだ. +占いクッキーは思索の食べ物だそうだ. +ゴールドを消費するペットはドラゴンだけだそうだ. +果報は寝て待てばいいそうだ. +油を塗った物は怪物の手から滑り落るそうだ. +読み書きができないなら,魔法の本を貰えるように願うといいそうだ. +剣の世界に生きるなら,剣によって死ぬと言われている. +怪物の真似をしたいなら,いいゲームに出あったと言えよう. +悪魔といっしょに眠ったならば,頭痛ともに目が覚めるであろう. +割れ目を踏んでしまったら母親のかばんを壊してしまうそうだ. +姿が見えなくなっても音はするそうだ. +幸運の持ち主でも巻物のルーン文字を感じとることができるそうだ. +巨大な絵の中では金なんてほんの小銭だそうだ. +迷宮では知識なんて大した問題じゃないそうだ. +迷宮では月の石が真のデリジウムの結晶だそうだ. +迷宮ではがさつな客に権利はないそうだ. +迷宮では時刻を教えてくれる時計は不要だそうだ. +迷宮では何か古いもの,新しいもの,穴の開いたもの,青いものが必要だそうだ. +迷宮では常に祝福の数を数えなければならないそうだ. +鉄のゴーレムの鋼鉄の鎧は望んでもらうほど価値あるものではないそうだ. +一本の杖を作るには4本の六尺棒が必要だそうだ. +太った女性が歌うまで終わらないそうだ. +太った女性が「首をちょん切っておしまい!」と叫ぶまで終わらないそうだ. +重い像を蹴るというのは無駄な行為だそうだ. +貴重な宝石を蹴るというのは無意味な行為と思われるだろう. +レプラコーンはラテン語を知っている,あなたも学ぶべきだ. +ミノタウロスは迷宮の外で迷子になっている. +ほとんどのトロルは復活する. +ガーフィールドと名づけられた猫はあなたをより魅力的にするそうだ. +迷宮内のあらゆる物に関するあらゆることを知っている者はいないそうだ. +単なる楽しみでネットハックをプレイできる者などいないそうだ. +fj.rec.games.roguelikeを講読しているものなど実際にはいないそうだ. +誰も噂を流すことを許してないそうだ. +看護婦はときどきメスを持っているが決して使わないそうだ. +魔法使いは一人見たら三十人いるそうだ. +一匹のトロールは10,000のイモリの価値があるそうだ. +デビットだけが動物園を見つけられるそうだ. +天使だけがペットのためにハープを演奏できるそうだ. +浪費家だけが金を持ち運べるそうだ. +オークの呪術師は健康的で裕福で賢いそうだ. +ネットハックで遊ぶということは死の罠の上を歩いているようなものだそうだ. +呼吸困難には適当な食事制限が一番だそうだ. +浮遊の薬をたくさん飲むと頭痛になるそうだ. +女王蜂はロイヤルゼリーを食べることによりできるそうだ. +怪物を怯えさせる巻物を読むことはElberethと喋ること同じだそうだ. +真のハッカーは常に制御されているそうだ. +真のハッカーは眠らないそうだ. +店主はクロイソス自身によって傷つけられるそうだ. +店主は夜中には20ゴールド以上を持ち歩かないそうだ. +店主は祝福された透明の薬を絶体売らないそうだ. +兵士は子供手袋に,まぬけヘルメットを装備しているそうだ. +何人かの警官は賄賂を期待しているそうだ. +番兵の手に脂を塗ることができるそうだ. +ドラムの演奏を止めさせるため,靴にキスする怪物がいるそうだ. +ホルンを演奏すると,政党の殺し屋になれるそうだ. +ネットハックの神々は一般的に献上物を歓迎するそうだ. +ヴィルヤ,ネンヤ,ナルヤと名づけられた3つの指環が存在するそうだ. +大魔法使いイェンダーは死の望みをもっているそうだ. +犬の髪の毛はときには効果的な治療薬となるそうだ. +ゲームをセーブするのは今だ!手遅れになるまえに... +ネットハック最大の障害は,あなたの心だそうだ. +神があなたに物をぶつけるときは激怒しているそうだ. +神は僧職にあるものがおきにいりだそうだ. +ユニコーンを幸福にさせるには,望むものを渡せばよいそうだ. +白や黒の石はなく灰色しかないそうだ. +骸骨は存在しない.故に骸骨の鍵もない. +全てハッカーの中には死にかけたとき脱出してしまう賢い盗賊がいるそうだ. +タダのアドバイスのようなものはないそうだ. +ネットハックの勝利者になる道は1つしかないそうだ. +かつて,楽能という恐怖のサムライがいたそうだ. +呪われた聖なる水は水でないときがあるそうだ. +こぼれた灰色ウーズは盆に戻らないそうだ. +パンドラの箱を開けてしまったら,希望しかのこってないそうだ. +扉の罠にはいつも「罠に注意!」と記されているそうだ. +性転換の魔除けを使うのはそんなに難しいことではないそうだ. +水上歩行の靴はヘルメスのように早く歩きたいときに便利だそうだ. +丸い魔除けを身に付けるとトロルに見えるそうだ. +腹が減ったときはピザを注文できる.30歩以内にこないとタダだそうだ. +神が怒っているときは,他の神に頼るべきだそうだ. +ユニコーンの角を装備すると強くなれるそうだ. +速さの靴を履くと,ひき逃げの心配がないそうだ. +殺人蜂はユニコーンの角で倒せるそうだ. +ステュクス川はカロンの舟でのみ渡れるそうだ. +リッチは一度だけ殺せるので,慎重にやる必要があるそうだ. +既に持っているものしか願えないそうだ. +親切に話しかけることによって,猫を訓練できるそうだ. +毅然として話しかけることによって,犬を訓練できるそうだ. +金は王の名によって信頼できるそうだ. +脂ぎった手を白紙の巻物でふきとれないそうだ. +噂の巻物は信用できないそうだ. +エネルギーの渦で天地がひっくり返るそうだ. +鍵のかかった扉を開けるには鍵が必要だそうだ. +アンティークショップでミミックを見わけるには鏡が必要だそうだ. +つるはしは使いたいときには使えないそうだ. +いつでも地下室に道具をしまっておくべきだそうだ. +成功への階段を上っている間は注意するべきだそうだ. +鎧に「錆びない」と名付けるとよいそうだ. +クールなペットを持ちたければ,犬にスパッズと名前をつけるとよいそうだ. +最初の怪物を倒したあとに武器に名前をつけるべきだそうだ. +紐のゴーレムをサキュバスに導いてはいけないそうだ. +見えない指輪の亡霊の側で寝てはいけないそうだ. +宝石鞄を持ってダンジョンを抜けてはいけないそうだ. +玉座に座る前に鎧を脱ぐべきだそうだ. +占いクッキーはコピープロテクトされている. +占いクッキーは有限会社 Fortune Cookiesが版権を握っている. +このバージョンの10%は再生資源で作られています. +時はサキュバスがカレンダーを2000年1月1日に変えるまで待っているそうだ. +疲れた?充填の巻き物を自分自身に使え! +より高い次の評価を得るには,あと3ポイント必要だ. +天国に行くには,浮遊の指輪を身につけてダンジョンを抜けだすといいそうだ. +シャツを着た観光客は死人を起すのに十分やかましい. +あなたの刀をMoulinetteと呼んでみよ. +うげ!肉は色が塗られている! +不幸にも,メッセージは故意に空白のままだ. +夕方にモーニングスターを使うと効果がない. +色は匂えど,散りぬるお和歌. +ヒントが欲しい?透明の杖を武器に振るのだ! +急いで昇天したい?ナントカ学園がよい. +募集:アルバイト.地下35階の魔法使いイェンダーに手紙を届ける仕事. +警告:未来を読むことはあなたの健康に害を与えます. +我々は裏切り者を見つけ出す為の新たな方法を編み出した... +濡れたタオルは強力な武器となるぞ! +なんてことだ!あなたは読むことができない. +おかしくなる可能性があるなら,おかしくなる. +頭の上にトゲが落ちてきら,天井に攻撃を加えたくなるだろう. +迷宮では右の壁をつたっていくと,迷子にならないはずだ. +鍵を持っているなら,番兵を待つ必要がない. +なぜこんなもの読んでるだ?時間の無駄じゃないか. +マスターキーを望むがよい.魔法のメモリー倉庫が開くはずだ. +魔法使いは全ての怪物が任務をはたすことを期待している. +ワォ!フルーツジュースをどうぞ! +まだ,他の,くだらない,ルーマー(またくる)がある. +あなたは占いにより間違って導かれる運命だ. +次のことをすれば本物のイェンダーの魔除けを手に入れることができる: --More-- +徹底的に沸騰させることで聖水を作ることができる. +次のことをして,黒ドラゴンの攻撃を防ぐのだ: --More-- +蛇を追い抜くことはできない. +あなたは占いクッキーを喉に詰まらせた. --More-- +誰かが足をひっぱているような気がした. +スフィンクスを出し抜くか,金を払わねばならない. +占いクッキーがシーッという音を聞いた. +手紙を売ることによりリッチになれる.しかし,不幸の手紙には気をつけろ. +シャイフルドに血なまぐさくない鞘のないクリスナイフをささげよ. +おみくじを飲みこんでしまった! +より強くなりたい?2レベル先にゲストハウスがある! +背が高く,暗く,身の毛もよだつ生き物に会うであろう. diff -aurbN -xCVS -xXTAGS nethack/dat/jrumors.tru jnethack/dat/jrumors.tru --- nethack/dat/jrumors.tru 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/dat/jrumors.tru 2004-04-29 03:25:59.000000000 +0900 @@ -0,0 +1,359 @@ +テレパシー能力があるなら目隠しが役に立つ. +7本のろうそくを差した燭台は魔法の光で道を示す. +水晶の鎧が錆びることはない. +刀はワームを真二つにすることもある. +魔法の嘔吐ポンプがグルメには役立つこともあるだろう. +ニンフは鎖の外し方を知っている. +盲目の薬は見えないものを見えるようにする. +僧侶は簡単に神に願いを聞いてもらうことができる. +たとえ処女の尼僧でも,ユニコーンは気にとめない. +部屋に看護婦がいるのなら,争いの指輪は悪しき品となる. +小剣は長剣ほど良くはない. +サキュバスはニンフよりも更にすごいことをする. +古の冒険者の亡霊を除霊する杖がある. +酸のブロッブは素手で攻撃すべきだ. +ニンフとの情事はしばしば高くつく. +ニンフが恐いって?飾りの指輪を身につけろ. +大切な物を盗まれたくないって?もっとがらくたを持ってな! +月の満ち欠けには気をつけろ! +重要なメッセージを刻む前にはいつも床を掃除しろ. +イェンダーの魔除けを作り出すことは困難だ.たとえ願いの杖をもってしても. +エルフのクロークは魔法から身を守ってくれる. +アンバーハルクは混乱させる視線を持っている. +クロムが我が証人であるかぎり,私は二度と飢えることはない! +怪物について尋ねることは,非常に有益なことだろう. +ロングワームは背後から攻撃しろ -- 非常に安全だ! +何もないところのウナギを攻撃するのは致命的な間違いだ! +怪我に包帯を巻くと姿が見えてしまう. +弓で怪物を殴るのはそれほど良い考えではない. +注意しろ!魔法使いが待ち伏せているぞ! +看護婦には親切に.武器をはずして服を脱ぎなさい. +消化されるのは非常に遅いプロセスだ. +白紙の巻物はもっと面白い読み物になる. +目が見えない?さまよう目を捕まえな! +本屋は決して巻物を読まない.ただ運び去るだけだ. +化学のイロハ: 水を酸に混ぜるべからず. +簡明な征服.制御,混乱,懇願,非難 +エネルギーを大切に,灯りを消しましょう. +墓をほりおこすのはいい考えとは言えないことがある… +ディリジウムの結晶は本当に珍しい. +犬は乾し肉の匂いに引き寄せられる. +犬は迷信深い.決して呪われた品を踏もうとしない. +幽霊の飼い犬は怒っているのではない.単に空腹なのだ. +忘れるな!大きな犬は小さい犬よりずっと殺しにくい. +店主にちょっかいを出すのはやめろ.さもなくばギルドがお前を付け狙う. +ドラゴンは決して子供を鞭打たない.どうせ感じないのだから. +にんじんを食べなさい.目にいい. +凍った球体を食べるのは,イエティを食べるようなものだ. +殺人蜂を食べるのは,サソリを食べるようなものだ. +天狗を食べるのは,ニンフを食べるようなものだ. +レイスを食べるのは価値のある経験だ! +未払いのレプラコーンを食べると得になることもある. +このあたりではエルベレスは絶大な人気がある. +エルフの死体は睡魔と両立しない.時には神々さえも. +エルフのクロークは錆びない. +邪悪なプレイヤーにさえ守護天使がいる. +魔法をかけた歯で戦ってみたかい? +混乱している時に巻物を読んでみたか? +トロルを大きな箱に入れてみたか? +薬に何かを浸す人がいるのはどうしてか不思議に思ったことはないか? +高価なカメラは突き刺すようなフラッシュライトを持っている. +階段が多ければ行き先も多い. +火の文字は怪物を思い止まらせるかもしれない. +快適に過ごすためには『Elbereth』と刻め. +宝石は無造作に投げ捨てるにはあまりにも貴重だ. +腹が減った?指輪をするのをやめるんだな! +暑すぎる? イェンダーの魔除けを外して出口から離れろ! +神は聖職者には多くを期待している. +神は半神を軽蔑している. +質問? rec.games.roguelike.nethackにどうぞ. +墓を掘りおこすと,時として金持ちになれる. +モンタグの野郎は鞄に巻物を入れている. +薬瓶は注意して扱うように -- 幽霊が中にいるかもしれない. +聖水にはたくさんの使い途がある. +馬は乗り手を信頼する.たとえそれほど信頼するに値しない乗り手でも. +飢餓は犬にとって混乱させるような経験だ! +かつて急いで食べすぎて窒息死したハッカーを知っている. +曲がりくねった小さな通路の迷路の匂いがする. +願いの杖を願わねばよかっのたにと願う.(願望的思考.) +巨人とキャッチボールをするとはお勧めできんな. +見張っているぞ -- イェンダーの魔法使い +アイスボックスは食料を新鮮に保つ. +罰せられているなら,その罰は強力無比な武器となる. +大魔法使いを殺したのなら,半神への道が開かれる. +穴を掘る杖が欲しければ,ミノタウロスにお願いすることだ. +攻撃を命中させたいのなら,短剣を使いなさい. +店で盗みを働きたいなら,犬を訓練することだ. +道に迷ったのなら,次から店で地図を買うようにすることだ. +店の中では,買いものをする前に値札を見た方がいい. +店の中で杖を使うのは行儀の悪いことだ. +真夜中に墓場を訪れるのは危険だ. +笛を吹いて犬を呼ぶのは良い考えであるとは限らない. +大魔法使いはいくらかの助けを雇ったと噂されている. +"status"を"statue"にするのはeではなくcである. +ユニコーンにルビーを差し出すのは良い考えだろう. +あなたの犬が石になるのは異様に悲しい. +dの世界を食べるのはdである. +鎧は錆びないようにしておけ. +武器を酸に近付けるな. +自分と同じ属性のユニコーンを殺すと運が悪くなる. +皮には防水性がある.牛が傘をさしているのを見たことがあるかい? +レプラコーンはこの迷宮で最も腕のいいスリだ. +トカゲの死体はコカトリスから守ってくれる. +金を失うのはささいな損失,名誉を失うのは大きな損失,勇気を失うのは何もかも終わり. +大抵の怪物は泳げない. +音楽には頑固な跳ね橋に作用する魔力がある. +音楽には残忍な獣をなだめる魔力がある. +決して番兵を攻撃するな. +ロングワームには決して乗るな. +呪いの言葉を刻むのに決して最上の武器を使ってはいけない. +重い荷物を抱えて戦うのは容易ではない. +看護婦は裸の人間に触るように慣れている.害は加えない. +ニンフは鎖かたびら以上のものでも奪い去ることができる. +そのうち仔犬は大きな犬になり,あなたはそれを誇りにすることだろう. +雌の怪物だけが卵を生むことができる. +缶詰を開けるのは難しい.特に素手の時は. +オークと殺人蜂は生活様式を同じにしている. +オークは暗い部屋では子をなすことはできない. +不器量なニンフは害がない. +AD&Dをプレイするのは役に立つかもしれない. +ガントレットをプレイするのはある状況では啓発的だ. +ビリヤードをプレイするのは店の中で役に立つ. +店主を変化させるとより安全になるかもしれない. +あなたの犬を変化させると多分より安全だ. +薬は普通は混ざらない.だが時々... +しーっ! 鏡のしわざだ! +瞬間移動の指輪を身に付けよ.猛攻撃から運び去ってくれる. +光線はブーメランではない.もちろん.だがしかし... +洞窟に入る前に説明書を読め -- さもなくば殺されるであろう. +ハーバートを読むことは,あるケースで啓発的だ. +トールキンを読むことは助けになるだろう. +酔っぱらって巻物を読むことは,混乱した結果をもたらすだろう. +ドラゴンに騎乗するのは天にものぼる経験になるだろう. +錆の怪物は水を好む.だがしかし,奴等が嫌う薬もある. +鞄は中身を華氏452まで守ることができる. +巻物の文字が薄れた? 熱のせいじゃなく,濡れたせいだ. +店主はクレジットカードもうけつける.ただし,現金で支払うかぎり. +店主は1マイル向こうの観光客でもアロハシャツによって見分けることができる. +店主は一卵性双生児を見分けることができない. +店主は字を読めない.店の中に刻むことに意味はあるか? +店主は信じられないほど忍耐強い. +店主は観光客には値段をふっかけることもある. +店主は復讐より金に価値をおく. +飼いならすことができる怪物もいる.ドラゴンをならしたハッカーに会ったこともある. +かつて誰かが言ったことには,<を登ったものは>を降りてくるかもしれない. +誰かが落し穴にトゲを仕掛けていたぞ! +時に怪物はあなたを攻撃しないで互いに戦うこともある. +ほうれん草,にんじん,ゼリー -- 看護婦に相応しい食事! +腐った肉は毒よりも体に悪い! +遠視は単なるコツだ.一度やり方を知れば,簡単なこと. +レプラコーン信用金庫は魔法の記念倉庫の一部門ではない. +イェンダーの魔法使いにとって,死はちょっとした経験でしかない. +最高の装備は,もちろん最も高くつく. +神はやっかいな聖職者を評価しない. +ペットの犬を殺すと神は怒る. +魔法のマーカは剣より強し. +月はこのゲームに影響する唯一の天体ではない. +オークはエルフリストという名の幅広の剣を振りまわした.あなたは死んだ... +何も起こらない杖の秘密.もう一度試してみろ! +鏡には常に神秘的な何かがあった. +迷宮の奥深くにはマスターマインドがある. +動物園には莫大な宝が隠されている. +目に見えるよりも更なる魔法がこの洞窟にある. +大きな犬を褒めても害はない. +ミミックを食べるのに似たことはない. +昔,ランスを持って馬に乗るのが大好きなランスロットという騎士がいた. +ゼラチンキューブはあなたを麻痺させることができるらしい. +ジョウビレックスは穴堀りの杖を恐れているらしい. +メデューサはあなたを台座に置きたがっているそうだ. +ヴラドは生きているらしい!! ... 迷宮の中で. +しばしば『Elbereth』について書かれているらしい. +軽量化の鞄にはなんでも入れられるわけではないそうだ. +祝福されたクアシトの肉の缶詰は素早い食事になるそうだ. +猫は罠を避けるそうだ. +洞窟グモは,時おり洞窟グモの卵を食べるそうだ. +賢い魔法使いの持つ能力値.18/** 24 18 24 24 24 +にんにくは正しく扱えば良いお守りになるそうだ. +呪われた瞬間移動の巻物はあなたを危機に陥れるかもしれない. +ダイヤモンドはもう一つの種類の幸せの石らしい. +犬は物を取ってくるように訓練することができるそうだ. +ゼラチンキューブは健康的な朝食をつくるそうだ. +巨人はちゃんと食べることで強くなるそうだ.試してみな! +グリッドバグはすれ違う時には攻撃しないらしい. +レンバスはとても軽い食事らしい. +重しには奇妙な引力があるが,悪運ではないらしい. +どんな名前で呼ぼうとも,鍵開け器具は鍵開け器具だそうだ. +幸運な魔除けは毒の矢から守ってくれるらしい. +鏡はさまよう目を動けなくするが,あなたはそれを見ることができるらしい. +中立の人間は,ジャイアントスレイヤーを手に入れるだろう. +変化の罠は魔法の罠なので,魔法防御があれば防げるらしい. +回復の薬は病気の薬を打ち消すらしい. +怪物を探す薬は,しばしば双方向に働くそうだ. +流し台は床より高い場所から見るとまた違って見えるらしい. +召喚された悪魔はゲームを好転させるかもしれない. +レイスの肉の缶詰は珍しい晩餐の体験だそうだ. +ユニコーンは幸運をもたらすかもしれない. +無力化の杖は変化の杖のようなものらしい. +施錠の杖は扉以外のものも閉めることができるらしい. +変化の杖はゲームを変えることができるらしい. +魔法使いは二度目以降はより強力にさえなっているらしい. +ゾーンはあなたを追跡する時に障害物のことは気付きもしないらしい. +クレジットカードの乱用は遅かれ早かれ衝撃を与えるだろう. +魔除けは大艇のものと同じように,命を奪うことも救うこともあるらしい. +祭壇は祝福を識別することができるらしい. +ウーズは靴をかじり,岩もぐらは靴を食べるそうだ. +缶詰の爆発で死んだ不幸なハッカーがいるそうだ. +骨董屋は常に貴重な宝石に興味をもっているらしい. +傷を包帯で巻くことは存在を知らしめることになるらしい. +酔っぱらいの薬は薄めることはできるが,効かなくすることはできない. +注意して聞けば,隠し扉の音が聞けるそうだ. +にんじんとにんじんジュースは視力を良くするらしい. +洞窟グモは高価な健康食とはみなされていないそうだ. +半神は手に入れたこの世の持ちものを手放さねばならない. +風のジンを起こすことは,高くつく間違いかもしれない. +ドラゴンの鱗は魔法をかける価値があるらしい. +泉にコインを投げ入れても,願いをかなえてはくれないだろう. +ドワーフは秩序正しく自分の仕事に専念しているそうだ. +こうもりの死体を食べると,しばらくこうもりのようになるらしい. +クラムを食べると活発に動くらしい. +青色ゼリーを食べると寒気が襲ってくるらしい. +迷宮からの脱出は,終りの始まりに過ぎないらしい. +思いもよらないすきま風を感じることは,一種の突破口になるだろう. +呪われた灰色の石を発見することは常に不運なことだそうだ. +レベルが上がることは,視力を増すことのできる経験だそうだ. +小さなヘビの肉が美味なることは稀だが,それでもなお健康的だそうだ. +器用さの小手には隠された魔法のタッチがあるらしい. +天国へ行くのは迷宮から抜け出すもう一つの方法に過ぎない. +金色ナーガはあなたがそうである限り,法を守る住人だそうだ. +グレムリンは今よりも涼しさを感じさせてくれるかもしれない. +グリッドバグはデカルト座標に厳密である. +ニンフを食べるとしばしばハッカーは飛んだり跳ねたりするように感じるそうだ. +変化制御の能力を持っていれば,ショックを受けることもないだろう. +食料を平らげるのが難しいなら,あとひとかじりで死に至ることがあるそうだ. +眼鏡をかけていないのなら,どうしてにんじんを嫌がるのか? +足元のゆるんだ板に気付いたら,その上に乗らない方がいいそうだ. +底からスタートしたのなら,行くべき唯一の場所は上だそうだ. +天国に瞬間移動したならば,既に死んでいると思われるそうだ. +店ではツケも請求されるそうだ. +軽い時には石を通り抜ける方法を考え付くかもしれない. +迷宮で鏡を壊すと7年にわたって不幸にみまわれるそうだ. +普通迷宮ではいかなる運も持ち合わせていないそうだ. +祝福された幸せの石はあなたの神の機嫌を良くするそうだ. +大魔法使いを殺す方が,大人しくさせるより簡単だそうだ. +警備員に会うためには,たった1ゴールド盗むだけでいいそうだ. +うまく薬を混ぜ合わせると,爆発が起こるらしい. +メデューサをちらりと見られても偶然の幸運とは言えないそうだ. +店主を殺すと運が悪くなるらしい. +怪物は怪物を怯えさせる巻物を踏めないらしい. +大抵の怪物はフルートの演奏には極めてうんざりしているそうだ. +ミイラの死体は保存状態が悪いらしい. +願いの杖はもちろん厳重にガードされているそうだ. +岩の下のがらくたには誰も見向きもしないらしい. +ユニコーンの角が錆びるなんてことはないらしい. +探検家が永久に生きられるかどうか誰も知らないそうだ.君は? +とある薬の中には風のジンが入っているという事実は決して変わらないそうだ. +とある薬の中には幽霊が入っているという事実は決して変わらないそうだ. +ニンフはいつもロックンロールにひっかかるそうだ.試してみな! +一旦オログハイを缶詰にすれば,再び顔を出すことはないだろう. +昔々,ザンは決して靴を引っ掻こうとはしなかったそうだ. +経験を積んだ魔法使いのみが天狗をごまかすことができるらしい. +混沌に属する者のみが店主を殺しても大丈夫だそうだ. +メスの怪物のみが卵を生むことができるそうだ. +角笛を本当に下手に演奏すると,本当にいいことがあるらしい. +輝く薬をこすっても,魔法のランプにはならないそうだ. +メスはアサメではないが故になまくらになる. +店主はつるはしが嫌いらしい. +店主はペットを店に入れても気にしないらしい. +店主はあなたが店にこっそり入っても普段は気にしないらしい. +店主はしばしば財布の中に多額の金を持っているらしい. +店主はあなたが忘れたことでも覚えていることがあるらしい. +流し台と鎧が相容れることはない.すぐにクロークを脱ぐのだ! +流し台に流れているもの: 熱いの,冷たいの,風味いろいろ. +ヘビ使いは魅力的なのではなく,単に音楽の才能があるだけなのだそうだ. +兵士は常に備え,そして大抵は身を守っているらしい. +幸か不幸か,あなたの背負い袋で孵る卵があるそうだ. +火蟻はあなたを熱い食事にしてしまうそうだ. +ホルンには熱い音楽を奏でるものもあり,またあるものは言葉にできないほど冷たいそうだ. +ヒューマノイドには完全に人間なのもいるそうだ. +店主の中には宝石を家宝と考えている者がいるらしい. +宝石を鑑定できる店主もいるが,それを告げようとはしないそうだ. +石の中には,他の石よりもずっとずっと重い物があるらしい. +イエティには熱い空気で満たされているものがいるらしい. +警備の固いところには,何か特別な物があるそうだ. +韋駄天の靴は水の上を歩けるほどには速くしてくれないそうだ. +瞬間移動の罠は悪魔の所業らしい. +天狗は指輪を装備しないらしい.あなたはするべきか? +天狗はそれが得意なのにもかかわらず決して金を盗まないらしい. +一度盗まれた物は,再び盗まれるらしい.ニンフに頼んでみろ. +デルファイの賢者はトカゲの死体が混乱させるようなものではないことを知っているらしい. +エルベルスの御手はあなたの祈りを妨げるそうだ. +レプラコーンの王はクロイソスとおなじくらい金持ちだそうだ. +イェンダーの魔法使いは精神分裂症で自殺的らしい. +経験を積んだキャラクタは,祭壇を改宗させる方法を知っているらしい. +神々はご機嫌麗しい時あなたの足元に物を落すそうだ. +透明なナズグルという考えにはある指輪がむすびついている. +湖の貴夫人は,今はどこかの泉にいるらしい. +田舎の店主は失礼な旅行者にいやな顔をするそうだ. +吸血鬼の塔への唯一の扉は,その最下層にあるそうだ. +良いジンとは感謝しているジンだけだそうだ. +虐殺について重要なのは,それが両方向に働くということだそうだ. +ユニコーンの角の法則とは,壊れていないものは直さないということだそうだ. +霧の曇からの眺めは本当によく動く. +店の壁は特別堅い物質で出来ているそうだ. +浮遊の靴を失うには少なくとも15通りの方法があるそうだ. +ガラス玉を投げることは,石を投げるのと同じことらしい. +岩に侵入することは,おそらく価値のないことだろう +ユニコーンは貴重な宝石を好むそうだ. +祭壇で祈るとそこにある水が時々聖水になるらしい. +排水口に落ちたものがまた上ってくることがあるそうだ. +ファイアブランドという名の長剣を装備すると,涼しく感じるらしい. +フロストブランドという名の長剣を装備すると,熱くなるらしい. +さまよう目は自分の顔を拭けないらしい. +さまよう目があれば暗闇でも見えるそうだ. +ユニコーンにルビーをくわえさせることができれば幸運になるらしい. +あなたはあなたが食べたものになるらしい. +運が良ければ祭壇で銘のある武器を見出すことができるだろう. +コカトリスの卵を触っても平気らしい.それで? +反射の魔除けを壊すことはできないらしい. +常に望んだものが得られるわけではないらしい. +最終試練に向けて,常に準備を怠ってはいけない. +鍵のかかった店へ入るにはドワーフに頼むべきらしい. +天の啓示のために祈るがいい. +信心深くお金を寄付すべきだそうだ. +ヤモリを食べて健康になるなど絶対に有り得ないそうだ. +死人がえしの杖を自分に振りかざすのは愚かなことだと言われている. +魔法使いの城にはブービートラップが仕掛けられているらしい. +自分の犬を殺すと神は立腹なさるらしい. +祈り過ぎると神は立腹なさるらしい. +迷宮の奥深くの城には強力な魔法の道具が隠されているらしい. +コカトリスの死体を装備する者の前には岩だらけの道ができるらしい. +野性の犬に食料を与えてやれば,飼い慣らせるかもしれない. +満腹の時にはどの食料もまずい. +トロルはゴムのようだと言われている.彼らは打たれても立ち直り続ける. +幽霊には引きつけて回り込む戦法を取ってみよ. +濡れた巻物に魔法のマーカを使ってみなさい. +不正をふたつ重ねても正義にはならないが,三つの残りものならそうなる. +ワルキューレは北からやってきたのに相応しい能力を持っている. +吸血鬼はにんにくを嫌っている. +倉庫の番兵は彼らの主人を決して邪魔しない. +菜食主義者は苔や海藻が好きだ. +お客様には店主を虐殺なさらぬようお願い申し上げます. +注意しろ!魔法使いが戻ってくるぞ. +ドラゴンには水の罠は効かない. +コカトリスは空腹になると何を食べるのだろう? +ガラス人間はエプロンを必要としない. +何故これが「魔法の」マーカと呼ばれるか分かるかい? +どうして傭兵と呼ぶのだと思う? +正気の人間ならだれでも『Elbereth』を刻むのはなぜだろう? +あまりに多くの望みは極めて少ない実りしかもたらさぬ. +兵隊蟻を買収することはできない. +裏口から店を出ることはできない.そんなものはないのだ! +純度の高いアルコールの入った薬ビンを見つけるかもしれない. +祝福された薬瓶に浸してみるのもいいかもしれない. +悪魔の貴族を買収することもできるかもしれぬ. +お前が透明なら店主をだますことも可能だろう. +量子力学者についての知識をつけておくべきだ. +真夜中に死体安置所に行くつもりか??? +犬は何を食べたら良いか知っている.よく見てみたまえ. +自らに杖を振りかざし,何が起こるか確かめよ... +死人がえしの杖を振りかざせば,お前の犬は生き返るかもしれない. diff -aurbN -xCVS -xXTAGS nethack/dat/jtrnsmon.dat jnethack/dat/jtrnsmon.dat --- nethack/dat/jtrnsmon.dat 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/dat/jtrnsmon.dat 2005-01-02 02:45:32.000000000 +0900 @@ -0,0 +1,832 @@ +# +# Japanese NetHack Copyright (c) Issei Numata 2000 +# JNetHack may be freely redistributed. See license for details. +# +# English -> Japanese monster table +# +player: あなた: +# +# ants +# +giant ant: 巨大蟻: +killer bee: 殺人蜂: +soldier ant: 兵隊蟻: +fire ant: 火蟻: +giant beetle: 巨大カブト虫: +queen bee: 女王蜂: +# +# blobs +# +acid blob: 酸のブロッブ: +quivering blob: 震えるブロッブ: +gelatinous cube: ゼラチンキューブ: +# +# cockatrice +# +chickatrice: チカトリス: +cockatrice: コカトリス: +pyrolisk: ピロリスク: +# +# dogs and other canines +# +jackal: ジャッカル: +fox: 狐: +coyote: コヨーテ: +werejackal: ジャッカル人間: +little dog: 仔犬: +dog: 犬: +large dog: 大きな犬: +dingo: 野犬: +wolf: 狼: +werewolf: 狼人間: +warg: ワーグ: +winter wolf: 冬狼: +winter wolf cub: 冬狼の子: +hell hound pup: ヘルハウンドの仔: +hell hound: ヘルハウンド: +Cerberus: ケルベロス: +# +# eyes +# +gas spore: 包子ガス: +floating eye: さまよう目: +freezing sphere: 氷の球体: +flaming sphere: 炎の球体: +shocking sphere: 電撃の球体: +beholder: ビホルダー: +# +# felines +# +kitten: 小猫: +housecat: 家猫: +jaguar: ジャガー: +lynx: 山猫: +panther: パンサー: +large cat: 大きな猫: +tiger: 虎: +# +# gremlins +# +gremlin: グレムリン: +gargoyle: ガーゴイル: +winged gargoyle: 羽のあるガーゴイル: +# +# humanoids +# +hobbit: ホビット: +dwarf: ドワーフ: +bugbear: バグベアー: +dwarf lord: ドワーフの貴族: +dwarf king: ドワーフの王: +mind flayer: マインドフレア: +master mind flayer: マスターマインドフレア: +# +# imps & other minor demons/devils +# +manes: 亡霊: +homunculus: ホムンクルス: +imp: インプ: +lemure: レムレース: +quasit: クアシト: +tengu: 天狗: +# +# jellies +# +blue jelly: 青色ゼリー: +spotted jelly: まだらゼリー: +ochre jelly: 黄土色ゼリー: +# +# kobolds +# +kobold: コボルド: +large kobold: 大きなコボルド: +kobold lord: コボルドの貴族: +kobold shaman: コボルドの呪術師: +# +# leprechauns +# +leprechaun: レプラコーン: +# +# mimics +# +small mimic: 小さなミミック: +large mimic: 大きなミミック: +giant mimic: 巨大なミミック: +# +# nymphs +# +wood nymph: 木のニンフ: +water nymph: 水のニンフ: +mountain nymph: 山のニンフ: +# +# orcs +# +goblin: ゴブリン: +hobgoblin: ホブゴブリン: +orc: オーク: +hill orc: 丘のオーク: +Mordor orc: モルドールのオーク: +Uruk-hai: ウルク・ハイ: +orc shaman: オークの呪術師: +orc-captain: オークの隊長: +# +# piercers +# +rock piercer: 岩喰い: +iron piercer: 鉄喰い: +glass piercer: ガラス喰い: +# +# quadrupeds (generic) +# +rothe: ロゼ: +mumak: ムーマク: +leocrotta: レオクロッタ: +wumpus: ワンパス: +titanothere: チタノゼア: +baluchitherium: バルキテリウム: +mastodon: マストドン: +# +# rodents +# +sewer rat: ドブネズミ: +giant rat: 巨大ネズミ: +rabid rat: 兇暴ネズミ: +rat: ねずみ: +wererat: ねずみ人間: +rock mole: 岩もぐら: +woodchuck: リス: +# +# spiders and scorpions +# +cave spider: 洞窟グモ: +centipede: ムカデ: +giant spider: 巨大グモ: +scorpion: サソリ: +# +# trappers, lurkers, &c. +# +lurker above: ラーカー: +trapper: トラッパー: +# +# unicorns +# +white unicorn: 白ユニコーン: +gray unicorn: 灰色ユニコーン: +black unicorn: 黒ユニコーン: +pony: 仔馬: +horse: 馬: +warhorse: 戦闘用の馬: +# +# vortices +# +fog cloud: 霧の雲: +dust vortex: ほこりの渦: +ice vortex: 氷の渦: +energy vortex: エネルギーの渦: +steam vortex: 蒸気の渦: +fire vortex: 炎の渦: +# +# worms +# +baby long worm: ロングワームの子供: +baby purple worm: 紫ワームの子供: +long worm: ロングワーム: +purple worm: 紫ワーム: +# +# Dummy monster needed for visual interface. +# +long worm tail: ロングワームの尻尾: +# +# xan, &c. +# +grid bug: グリッドバグ: +xan: ザン: +# +# lights +# +yellow light: 黄色い光: +black light: 黒い光: +# +# zruty +# +zruty: ズルティ: +# +# Angels and other lawful minions +# +couatl: コウアトル: +Aleax: アレアックス: +Angel: 天使: +ki-rin: 麒麟: +Archon: アルコン: +# +# Bats +# +bat: こうもり: +giant bat: 巨大こうもり: +raven: オオガラス: +vampire bat: 吸血こうもり: +# +# Centaurs +# +plains centaur: 草原のケンタウロス: +forest centaur: 森のケンタウロス: +mountain centaur: 山のケンタウロス: +# +# Dragons +# +baby gray dragon: 灰色ドラゴンの子供: +baby silver dragon: 銀色ドラゴンの子供: +baby red dragon: 赤色ドラゴンの子供: +baby white dragon: 白ドラゴンの子供: +baby orange dragon: オレンジドラゴンの子供: +baby black dragon: 黒ドラゴンの子供: +baby blue dragon: 青ドラゴンの子供: +baby green dragon: 緑ドラゴンの子供: +baby yellow dragon: 黄色ドラゴンの子供: +gray dragon: 灰色ドラゴン: +silver dragon: 銀色ドラゴン: +red dragon: 赤色ドラゴン: +white dragon: 白ドラゴン: +orange dragon: オレンジドラゴン: +black dragon: 黒ドラゴン: +blue dragon: 青ドラゴン: +green dragon: 緑ドラゴン: +yellow dragon: 黄色ドラゴン: +# +# Elementals +# +stalker: ストーカー: +air elemental: 風の精: +fire elemental: 火の精: +earth elemental: 土の精: +water elemental: 水の精: +# +# Fungi +# +lichen: 苔の怪物: +brown mold: 茶色モールド: +yellow mold: 黄色モールド: +green mold: 緑モールド: +red mold: 赤色モールド: +shrieker: シュリーカー: +violet fungus: 紫キノコ: +# +# Gnomes +# +gnome: ノーム: +gnome lord: ノームの貴族: +gnomish wizard: ノームの魔法使い: +gnome king: ノームの王: +# +# giant Humanoids +# +giant: 巨人: +stone giant: 岩石巨人: +hill giant: 丘の巨人: +fire giant: 炎の巨人: +frost giant: 吹雪の巨人: +storm giant: 雷の巨人: +ettin: エティン: +titan: タイタン: +minotaur: ミノタウロス: +# +# Invisible stalker +# +stalker: ストーカー: +# +# Jabberwock +# +jabberwock: ジャバウォック: +# +# Kops +# +Keystone Kop: 警備員: +Kop Sergeant: 巡査: +Kop Lieutenant: 巡査部長: +Kop Kaptain: 警部補: +# +# Liches +# +lich: リッチ: +demilich: デミリッチ: +master lich: マスターリッチ: +arch-lich: アーチリッチ: +# +# Mummies +# +kobold mummy: コボルドのミイラ: +gnome mummy: ノームのミイラ: +orc mummy: オークのミイラ: +dwarf mummy: ドワーフのミイラ: +elf mummy: エルフのミイラ: +human mummy: 人間のミイラ: +ettin mummy: エティンのミイラ: +giant mummy: 巨人のミイラ: +# +# Nagas +# +red naga hatchling: 赤色ナーガの雛: +black naga hatchling: 黒ナーガの雛: +golden naga hatchling: 金色ナーガの雛: +guardian naga hatchling: 番兵ナーガの雛: +red naga: 赤色ナーガ: +black naga: 黒ナーガ: +golden naga: 金色ナーガ: +guardian naga: 番兵ナーガ: +# +# Ogres +# +ogre: オーガ: +ogre lord: オーガの君主: +ogre king: オーガの王: +# +# Puddings +# +gray ooze: 灰色ウーズ: +brown pudding: 茶色プリン: +black pudding: 黒プリン: +green slime: 緑スライム: +# +# Quantum Mechanics +# +quantum mechanic: 量子物理学者: +# +# Rust Monster +# +rust monster: 錆の怪物: +disenchanter: 吸魔の怪物: +# +# Snakes +# +garter snake: 小さなヘビ: +snake: ヘビ: +water moccasin: 水ヘビ: +pit viper: 穴ヘビ: +python: ニシキヘビ: +cobra: コブラ: +# +# Trolls +# +troll: トロル: +ice troll: 氷のトロル: +rock troll: 岩のトロル: +water troll: 水のトロル: +Olog-hai: オログハイ: +# +# Umber Hulk +# +umber hulk: アンバーハルク: +# +# Vampires +# +vampire: 吸血鬼: +vampire lord: 吸血鬼の貴族: +Vlad the Impaler: 吸血鬼ヴラド: +# +# Wraiths +# +barrow wight: バロウ・ワイト: +wraith: レイス: +Nazgul: ナズグル: +# +# Xorn +# +xorn: ゾーン: +# +# Yeti, Apes and other large beasts +# +monkey: 猿: +ape: 類人猿: +owlbear: アウルベア: +yeti: イエティ: +carnivorous ape: 人喰い猿: +sasquatch: サスカッチ: +# +# Zombies +# +kobold zombie: コボルドのゾンビ: +gnome zombie: ノームのゾンビ: +orc zombie: オークのゾンビ: +dwarf zombie: ドワーフのゾンビ: +elf zombie: エルフのゾンビ: +human zombie: 人間のゾンビ: + +ettin zombie: エティンのゾンビ: +giant zombie: 巨人のゾンビ: +ghoul: グール: +skeleton: 骸骨: +# +# Golems +# +straw golem: 藁のゴーレム: +paper golem: 紙のゴーレム: +rope golem: 紐のゴーレム: +gold golem: 金のゴーレム: +leather golem: 皮のゴーレム: +wood golem: 木のゴーレム: +flesh golem: 肉のゴーレム: +clay golem: 土のゴーレム: +stone golem: 岩のゴーレム: +glass golem: ガラスのゴーレム: +iron golem: 鉄のゴーレム: +# +# Humans +# +human: 人間: +#werejackal: ジャッカル人間: +#werewolf: 狼人間: +Woodland-elf: 森のエルフ: +Green-elf: 緑エルフ: +Grey-elf: 灰色エルフ: +elf-lord: エルフの貴族: +Elvenking: エルフの王: +doppelganger: ドッペルゲンガー: +nurse: 看護婦: +shopkeeper: 店主: +guard: 番兵: +prisoner: 囚人: +Oracle: 賢者: +aligned priest: 僧侶: +high priest: 法王: +#unarmored watchman: 丸腰の見張り: +#unarmored soldier: 丸腰の戦士: +soldier: 兵士: +sergeant: 下士官: +lieutenant: 副官: +captain: 指揮官: +watchman: 見張り: +watch captain: 見張りの隊長: +Medusa: メデューサ: +Wizard of Yendor: イェンダーの魔法使い: +Croesus: クロイソス: +Charon: カロン: +# +# Ghosts +# +ghost: 幽霊: +shade: 影: +water demon: 水の魔神: +horned devil: 角のある悪魔: +succubus: サキュバス: +incubus: インキュバス: +erinys: イリニス: +barbed devil: 棘の悪魔: +marilith: マリリス: +vrock: ヴァロック: +hezrou: ヘズロウ: +bone devil: 骨の悪魔: +ice devil: 氷の悪魔: +nalfeshnee: ナルフェシニ: +pit fiend: 穴の悪霊: +balrog: バルログ: +Juiblex: ジョウビレックス: +Yeenoghu: イーノグ: +Orcus: オーケス: +Geryon: ゲーリュオーン: +Dispater: ディスペータ: +Baalzebub: ベルゼブブ: +Asmodeus: アスモデウス: +Demogorgon: デモゴルゴン: +Death: デス: +Pestilence: ペスティレンス: +Famine: フェミン: +mail daemon: メイルデーモン: +djinni: 風のジン: +sandestin: サンデスティン: +# +# sea monsters +# +jellyfish: クラゲ: +piranha: ピラニア: +shark: サメ: +giant eel: 巨大ウナギ: +electric eel: 電気ウナギ: +kraken: クラーケン: +# +# lizards +# +newt: イモリ: +gecko: ヤモリ: +iguana: イグアナ: +baby crocodile: ワニの子供: +lizard: トカゲ: +chameleon: カメレオン: +crocodile: ワニ: +salamander: サラマンダー: +# +# character classes +# +Archeologist: 考古学者: +Barbarian: 野蛮人: +Caveman: 洞窟人: +Cavewoman: 洞窟人: +Healer: 薬師: +Knight: 騎士: +Monk: 武闘家: +Priest: 僧侶: +Priestess: 尼僧: +Ranger: レンジャー: +Rogue: 盗賊: +Samurai: 侍: +Tourist: 観光客: +Valkyrie: ワルキューレ: +Wizard: 魔法使い: +archeologist: 考古学者: +barbarian: 野蛮人: +caveman: 洞窟人: +cavewoman: 洞窟人: +elf: エルフ: +healer: 薬師: +knight: 騎士: +monk: 武闘家: +priest: 僧侶: +priestess: 尼僧: +ranger: レンジャー: +rogue: 盗賊: +samurai: 侍: +tourist: 観光客: +valkyrie: ワルキューレ: +wizard: 魔法使い: +# +# leader +# +Lord Carnarvon: カーナボン卿: +Pelias: ペリアス: +Shaman Karnov: 呪術師カルノフ: +Hippocrates: ヒポクラテス: +King Arthur: アーサー王: +Grand Master: 総師範: +Arch Priest: 主席司祭: +Orion: 勇者オリオン: +Master of Thieves: 盗賊の頭領: +Lord Sato: 大名佐藤: +Twoflower: ツーフラワー: +Norn: ノルン: +Neferet the Green: 緑のネフェレト: +# +# The nemesis monsters +# +Minion of Huhetotl: フヘトトルの使い: +Thoth Amon: トート・アモン: +Chromatic Dragon: クロマティック・ドラゴン: +Cyclops: サイクロプス: +Ixoth: イクソス: +Master Kaen: カエン: +Nalzok: ナルゾク: +Scorpius: 大蠍: +Master Assassin: 暗殺者の頭領: +Ashikaga Takauji: 足利尊氏: +#Master of Thieves: 盗賊の頭領: +Lord Surtur: 支配者スルト: +Dark One: 暗きもの: +# +# The "guards" +# +student: 学生: +chieftain: 首領: +neanderthal: ネアンデルタール人: +attendant: 随行員: +page: 小姓: +abbot: 師範: +acolyte: 侍者: +hunter: ハンター: +thug: ちんぴら: +ninja: 忍者: +roshi: 浪士: +guide: ガイド: +warrior: 戦士: +apprentice: 実習生: +man: 男: +woman: 女: +# +# Gods +# +Quetzalcoatl: ケツアルカトル: +Camaxtli: カマキシトリ: +Huhetotl: フヘトトル: +Mitra: ミトラ: +Crom: クロム: +Set: セト: +Anu: アヌ: +Ishtar: イシュタル: +Anshar: アンシャル: +Athena: アテナ: +Hermes: ヘルメス: +Poseidon: ポセイドン: +Lugh: ルーフ: +Brigit: ブリジット: +Manannan Mac Lir: マナンナン・マクリール: +Shan Lai Ching: 山雷精: +Chih Sung-tzu: 赤松子: +Huan Ti: 黄帝: +Issek: イセック: +Mog: モグ: +Kos: コス: +Amaterasu Omikami: 天照大神: +Raijin: 雷神: +Susanowo: 須佐之男: +Blind Io: ブラインド・イオ: +The Lady: レディ: +Offler: オフラー: +Tyr: チュール: +Odin: オーディン: +Loki: ロキ: +Ptah: プタハ: +Thoth: トート: +Anhur: アンフル: +Mercury: マーキュリー: +Venus: ビーナス: +Mars: マーズ: + +# +Moloch: モーロック: +# +# bogus monster +# +jumbo shrimp: 巨大甘エビ: +giant pigmy: 巨大ピグミー: +gnu: ヌー: +killer penguin: 殺人ペンギン: +giant cockroach: 巨大ゴキブリ: +giant slug: 巨大ナメクジ: +maggot: 蛆虫: +pterodactyl: プテラノドン: +tyrannosaurus rex: ティラノザウルス: +basilisk: バジリスク: +nightmare: ナイトメア: +efreeti: イフリート: +marid: マリッド: +master lichen: マスター苔: +hologram: ホログラム: +rot grub: 腐ったうじ虫: +bookworm: 紙魚: +shadow: シャドウ: +jester: 道化師: +attorney: 弁護士: +sleazoid: おちょうし者: +killer tomato: 殺人トマト: +amazon: アマゾン: +robot: ロボット: +battlemech: バトルメック: +rhinovirus: 鼻風邪: +harpy: ハーピー: +lion-dog: ライオン犬: +rat-ant: ネズミ蟻: +Y2K bug: 2000年問題: +# +# misc +# +grue: グルー: +Christmas-tree monster: クリスマスツリーの怪物: +luck sucker: 厄病神: +paskald: パスカルド: +# +# Quendor (Zork, &c.) +# +brogmoid: ブログモイド: +dornbeast: ドルンビースト: +# +# Moria +# +Ancient Multi-Hued Dragon: 古代万色ドラゴン: +Evil Iggy: 邪悪なるイギー: +# +# Rogue +# +emu: おおうずら: +kestrel: おおはやぶさ: +xeroc: ものまねの怪物: +venus flytrap: はえとりぐさ: +# +# Wizardry +# +creeping coins: クリーピングコイン: +# +# Greek legend +# +hydra: ヒドラ: +siren: セイレーン: +# +# Monty Python +# +killer bunny: 兇悪ウサちゃん: +# +# The Princess Bride +# +rodent of unusual size: 異常な大きさのリスちゃん: +# +# "Only you can prevent forest fires!" +# +Smokey the bear: 森林火災防止マークの熊ちゃん: +# +# Discworld +# +Luggage: ルッゲージ: +# +# Lord of the Rings +# +Ent: エント: +# +# Xanth +# +tangle tree: 触手木: +nickelpede: ニッケルさそり: +wiggle: ぴくぴく虫: +# +# Lewis Carroll +# +white rabbit: 白うさぎ: +snark: スナーク: +# +# Dr. Doolittle +# +pushmi-pullyu: オシツオサレツ: +# +# The Smurfs +# +smurf: スマーフ: +# +# Star Trek +# +tribble: トリブル: +Klingon: クリンゴン: +Borg: ボーグ: +# +# Star Wars +# +Ewok: イオーク: +# +# Tonari no Totoro +# +Totoro: となりのトトロ: +# +# Nausicaa +# +ohmu: 王蟲: +# +# monster movies +# +youma: 妖魔: +# +# pocket monster +# +nyaasu: ニャース: +# +Godzilla: ゴジラ: +King Kong: キングコング: +# +# old L of SH +# +earthquake beast: 大ナマズ: +# +# Robotech +# +Invid: インビッド: +# +# The Terminator +# +Terminator: ターミネーター: +# +# Bubblegum Crisis +# +boomer: ブーマー: +# +# Dr. Who ("Exterminate!") +# +Dalek: ダレク: +# +# HGttG +# +microscopic space fleet: 超微細宇宙船: +Ravenous Bugblatter Beast of Traal: がつがつむしゃむしゃトラアル獣: +# +# TMNT +# +teenage mutant ninja turtle: 激亀忍者: +# +# Usagi Yojimbo +# +samurai rabbit: 侍兎: +# +# Cerebus +# +aardvark: ツチブタ: +# +# Little Shop of Horrors +# +Audrey II: オードリーII: +# +# 50's rock 'n' roll +# +witch doctor: 呪術医: +one-eyed one-horned flying purple people eater: 一目一手空飛ぶ紫人食類: +# +# saccharine kiddy TV +# +Barney the dinosaur: 恐竜バニーちゃん: +# +Morgoth: モルゴス: +Vorlon: ヴォーロン: +questing beast: 探求のけもの: +Predator: プレデター: +mother-in-law: 姑: diff -aurbN -xCVS -xXTAGS nethack/dat/jtrnsobj.dat jnethack/dat/jtrnsobj.dat --- nethack/dat/jtrnsobj.dat 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/dat/jtrnsobj.dat 2005-04-09 04:56:46.000000000 +0900 @@ -0,0 +1,1074 @@ +# +# Japanese NetHack Copyright (c) Issei Numata 2000 +# For 3.4, (c) Kentaro Shirakata 2003-2004 +# JNetHack may be freely redistributed. See license for details. +# +# English -> Japanese objects transfer table +# +# missiles +# +)arrow: 矢: +)elven arrow: エルフの矢: +)runed arrow: 神秘的な矢: +)orcish arrow: オークの矢: +)crude arrow: 粗末な矢: +)silver arrow: 銀の矢: +)crossbow bolt: クロスボゥボルト: +)bamboo arrow: 竹の矢: +)dart: 投げ矢: +)shuriken: 手裏剣: +)throwing star: 星型の投げるもの: +)boomerang: ブーメラン: +)spear: 槍: +)elven spear: エルフの槍: +)runed spear: 神秘的な槍: +)orcish spear: オークの槍: +)crude spear: 粗末な槍: +)dwarvish spear: ドワーフの槍: +)stout spear: 丈夫な槍: +)silver spear: 銀の槍: +)javelin: ジャベリン: +)throwing spear: 投げ槍: +)trident: トライデント: +)lance: ランス: +)dagger: 短剣: +)elven dagger: エルフの短剣: +)runed dagger: 神秘的な短剣: +)orcish dagger: オークの短剣: +)silver dagger: 銀の短剣: +)crude dagger: 粗末な短剣: +)athame: アサメ: +)scalpel: メス: +)knife: ナイフ: +)stiletto: スティレット: +)worm tooth: ワームの歯: +)crysknife: クリスナイフ: +)dwarvish mattock: ドワーフのつるはし: +)broad pick: 幅広のつるはし: +)heavy pick: 重いつるはし: +)axe: 斧: +)battle-axe: 戦斧: +)double-headed axe: 両刃の斧: +)short sword: 小剣: +)elven short sword: エルフの小剣: +)runed short sword: 神秘的な小剣: +)orcish short sword: オークの小剣: +)crude short sword: 粗末な小剣: +)dwarvish short sword: ドワーフの小剣: +)broad short sword: 幅広の小剣: +)scimitar: シミター: +)curved sword: 曲った剣: +)silver saber: 銀のサーベル: +)broadsword: 幅広の剣: +)elven broadsword: エルフの幅広の剣: +)runed broadsword: 神秘的な幅広の剣: +)long sword: 長剣: +)two-handed sword: 両手剣: +)katana: 刀: +)samurai sword: 侍の剣: +)tsurugi: 大刀: +)long samurai sword: 侍の長剣: +)runesword: ルーンの剣: +)partisan: パルチザン: +)vulgar polearm: 長斧: +)ranseur: ランサー: +)hilted polearm: 柄付の長斧: +)spetum: スペタム: +)forked polearm: フォーク付き長斧: +)glaive: グレイブ: +)single-edged polearm: 片刃長斧: +)halberd: ハルバード: +)angled poleaxe: 曲ったまさかり: +)bardiche: バーディック: +)long poleaxe: 長いまさかり: +)voulge: ボルゲ: +)pole cleaver: 肉切り包丁: +)fauchard: 槍剣: +)pole sickle: かま: +)guisarme: ギザルム: +)pruning hook: 刈り込みがま: +)bill-guisarme: ビル・ギザルム: +)hooked polearm: 鈎付の長斧: +)lucern hammer: ルッツェルンハンマー: +)pronged polearm: 二股の長斧: +)bec de corbin: ベック・ド・コルバン: +)beaked polearm: 槍つきの長斧: +)mace: メイス: +)morning star: モーニングスター: +)war hammer: ウォーハンマー: +)club: こん棒: +)rubber hose: ゴムホース: +)quarterstaff: 六尺棒: +)staff: 棒: +)aklys: アキリス: +)thonged club: 紐付のこん棒: +)flail: フレイル: +)bullwhip: 鞭: +# +# bows +# +)bow: 弓: +)elven bow: エルフの弓: +)runed bow: 神秘的な弓: +)orcish bow: オークの弓: +)crude bow: 粗末な弓: +)yumi: 和弓: +)long bow: 長弓: +)sling: スリング: +)crossbow: クロスボゥ: +# +# dummy weapon(for #enhance) +# +)polearms: 長斧: +)saber: サーベル: +)two weapon combat: 二刀流: +)pick-axe: つるはし: +)bare handed combat: 素手: +)martial arts: マーシャルアーツ: +)unicorn horn: ユニコーンの角: +# +# armors +# +]elven leather helm: エルフの革帽子: +]leather hat: 革帽子: +]orcish helm: オークの兜: +]iron skull cap: 鉄の帽子: +]dwarvish iron helm: ドワーフの鉄兜: +]hard hat: 固い帽子: +]fedora: フィドーラ: +]cornuthaum: とんがり帽子: +]conical hat: 円錐形の帽子: +]dunce cap: 低能帽: +]dented pot: くぼんだ鍋: +]helmet: 兜: +]plumed helmet: 羽兜: +]helm of brilliance: 知性の兜: +]etched helmet: 模様入り兜: +]helm of opposite alignment: 逆属性の兜: +]crested helmet: とさかの兜: +]helm of telepathy: 千里眼の兜: +]visored helmet: 面頬付きの兜: +]gray dragon scale mail: 灰色ドラゴンの鱗鎧: +]silver dragon scale mail: 銀色ドラゴンの鱗鎧: +]red dragon scale mail: 赤色ドラゴンの鱗鎧: +]white dragon scale mail: 白ドラゴンの鱗鎧: +]orange dragon scale mail: オレンジドラゴンの鱗鎧: +]black dragon scale mail: 黒ドラゴンの鱗鎧: +]blue dragon scale mail: 青ドラゴンの鱗鎧: +]green dragon scale mail: 緑ドラゴンの鱗鎧: +]yellow dragon scale mail: 黄色ドラゴンの鱗鎧: +]gray dragon scales: 灰色ドラゴンの鱗: +]silver dragon scales: 銀色ドラゴンの鱗: +]red dragon scales: 赤色ドラゴンの鱗: +]white dragon scales: 白ドラゴンの鱗: +]orange dragon scales: オレンジドラゴンの鱗: +]black dragon scales: 黒ドラゴンの鱗: +]blue dragon scales: 青ドラゴンの鱗: +]green dragon scales: 緑ドラゴンの鱗: +]yellow dragon scales: 黄色ドラゴンの鱗: +]plate mail: 鋼鉄の鎧: +]crystal plate mail: 水晶の鎧: +]bronze plate mail: 青銅の鎧: +]splint mail: 鉄片の鎧: +]banded mail: 帯金の鎧: +]dwarvish mithril-coat: ドワーフのミスリル服: +]elven mithril-coat: エルフのミスリル服: +]chain mail: 鎖かたびら: +]orcish chain mail: オークの鎖かたびら: +]crude chain mail: 粗末な鎖かたびら: +]scale mail: 鱗の鎧: +]studded leather armor: 鋲付き革鎧: +]ring mail: 鉄環の鎧: +]orcish ring mail: オークの鉄環の鎧: +]crude ring mail: 粗末な鉄環の鎧: +]leather armor: 革鎧: +]leather jacket: 革の服: +# +# cloaks +# +]mummy wrapping: ミイラの包帯: +]elven cloak: エルフのクローク: +]faded pall: 陰気な外套: +]orcish cloak: オークのクローク: +]coarse mantelet: 粗末なマント: +]dwarvish cloak: ドワーフのクローク: +]hooded cloak: フードつきのクローク: +]oilskin cloak: 防水クローク: +]slippery cloak: つるつるしたクローク: +]cloak of protection: 守りのクローク: +]tattered cape: ぼろぼろのケープ: +]cloak of invisibility: 透明のクローク: +]opera cloak: オペラクローク: +]cloak of magic resistance: 魔法を防ぐクローク: +]ornamental cope: 装飾用の外套: +]cloak of displacement: 幻影のクローク: +]piece of cloth: 布切れ: +]robe: ローブ: +]alchemy smock: 錬金術の仕事着: +]apron: エプロン: +]leather cloak: 革のクローク: +# +# shields +# +]small shield: 小さな盾: +]elven shield: エルフの盾: +]blue and green shield: 青と緑の盾: +]Uruk-hai shield: ウルク・ハイの盾: +]white-handed shield: 白の手の盾: +]orcish shield: オークの盾: +]red-eyed shield: 赤い目の盾: +]large shield: 大きな盾: +]dwarvish roundshield: ドワーフの丸盾: +]large round shield: 大きな丸盾: +]shield of reflection: 反射の盾: +]polished silver shield: 銀色の磨かれた盾: +]Hawaiian shirt: アロハシャツ: +]T-shirt: Tシャツ: +# +# gloves +# +]leather gloves: 革の手袋: +]old gloves: 古い手袋: +]gauntlets of fumbling: お手玉の小手: +]padded gloves: 詰めもののある手袋: +]gauntlets of power: 力の小手: +]riding gloves: 乗馬用の手袋: +]gauntlets of dexterity: 器用さの小手: +]fencing gloves: フェンシングの小手: +# +# boots +# +]low boots: かかとの低い靴: +]walking shoes: 散歩用の靴: +]iron shoes: 鉄の靴: +]hard shoes: 固い靴: +]high boots: かかとの高い靴: +]jackboots: 軍隊靴: +]speed boots: 韋駄天の靴: +]combat boots: 戦闘靴: +]water walking boots: 水上歩行の靴: +]jungle boots: ジャングルの靴: +]jumping boots: 飛び跳ねる靴: +]hiking boots: ハイキングの靴: +]elven boots: エルフの靴: +]mud boots: ドロだらけの靴: +]fumble boots: つまずきの靴: +]riding boots: 乗馬用の靴: +]levitation boots: 浮遊の靴: +]snow boots: 雪靴: +]kicking boots: 蹴り挙げ靴: +]buckled boots: 留め金のある靴: +# +# rings +# +=adornment: 飾りの指輪: +=gain strength: 強さの指輪: +=gain constitution: 体力の指輪: +=increase accuracy: 命中の指輪: +=increase damage: 攻撃の指輪: +=protection: 守りの指輪: +=regeneration: 回復の指輪: +=searching: 探索の指輪: +=stealth: 忍びの指輪: +=sustain ability: 能力維持の指輪: +=levitation: 浮遊の指輪: +=hunger: 飢餓の指輪: +=aggravate monster: 反感の指輪: +=conflict: 争いの指輪: +=warning: 警告の指輪: +=poison resistance: 耐毒の指輪: +=fire resistance: 耐炎の指輪: +=cold resistance: 耐冷の指輪: +=shock resistance: 耐電の指輪: +=free action: 自由行動の指輪: +=slow digestion: 消化不良の指輪: +=teleportation: 瞬間移動の指輪: +=teleport control: 瞬間移動制御の指輪: +=polymorph: 変化の指輪: +=polymorph control: 変化制御の指輪: +=invisibility: 透明の指輪: +=see invisible: 可視の指輪: +=protection from shape changers: 耐変化怪物の指輪: +# +=wooden: 木の指輪: +=granite: 花崗岩の指輪: +=opal: オパールの指輪: +=clay: 土の指輪: +=coral: 珊瑚の指輪: +=black onyx: 黒めのうの指輪: +=moonstone: 月長石の指輪: +=tiger eye: 虎目石の指輪: +=jade: ひすいの指輪: +=bronze: 青銅の指輪: +=agate: めのうの指輪: +=topaz: トパーズの指輪: +=sapphire: サファイアの指輪: +=ruby: ルビーの指輪: +=diamond: ダイアモンドの指輪: +=pearl: 真珠の指輪: +=iron: 鉄の指輪: +=brass: 真鍮の指輪: +=copper: 銅の指輪: +=twisted: ねじれた指輪: +=steel: 鋼鉄の指輪: +=silver: 銀の指輪: +=gold: 金の指輪: +=ivory: 象牙の指輪: +=emerald: エメラルドの指輪: +=wire: 針金の指輪: +=engagement: 婚約指輪: +=shiny: 光る指輪: +# +# amulets +# +"amulet of ESP: 遠視の魔除け: +"amulet of life saving: 命の魔除け: +"amulet of strangulation: 絞殺の魔除け: +"amulet of restful sleep: 安眠の魔除け: +"amulet versus poison: 耐毒の魔除け: +"amulet of change: 性転換の魔除け: +"amulet of unchanging: 無変化の魔除け: +"amulet of reflection: 反射の魔除け: +"amulet of magical breathing: 呼吸の魔除け: +"circular: 丸い魔除け: +"spherical: 球の魔除け: +"oval: 卵型の魔除け: +"triangular: 三角形の魔除け: +"pyramidal: 四角錐の魔除け: +"square: 四角の魔除け: +"concave: 凹面の魔除け: +"hexagonal: 六角形の魔除け: +"octagonal: 八角形の魔除け: +"cheap plastic imitation of the Amulet of Yendor:偽物のイェンダーの魔除け: +"Amulet of Yendor: イェンダーの魔除け: +# +# containers +# +(large box: 大箱: +(chest: 宝箱: +(ice box: アイスボックス: +(sack: 袋: +(oilskin sack: 防水袋: +(bag of holding: 軽量化の鞄: +(bag of tricks: トリックの鞄: +(bag: 鞄: +# +# lock opening tools +# +(skeleton key: 万能鍵: +(key: 鍵: +(lock pick: 鍵開け器具: +(credit card: クレジットカード: +# +# light sources +# +(tallow candle: 獣脂のろうそく: +(candle: ろうそく: +(wax candle: 蜜蝋のろうそく: +(brass lantern: 真鍮のランタン: +(oil lamp: オイルランプ: +(lamp: ランプ: +(magic lamp: 魔法のランプ: +(expensive camera: 高価なカメラ: +(mirror: 鏡: +(looking glass: ガラス: +(crystal ball: 水晶玉: +(glass orb: ガラスの球: +(lenses: レンズ: +(blindfold: 目隠し: +(towel: タオル: +(saddle: 鞍: +(leash: 紐: +(stethoscope: 聴診器: +(tinning kit: 缶詰作成道具: +(tin opener: 缶切り: +(can of grease: 脂の缶: +(figurine: 人形: +(magic marker: 魔法のマーカ: +# +# instruments +# +(tin whistle: ブリキの笛: +(whistle: 笛: +(magic whistle: 魔法の笛: +(wooden flute: 木のフルート: +(flute: フルート: +(magic flute: 魔法のフルート: +(tooled horn: 細工のほどこされたホルン: +(horn: ホルン: +(frost horn: 吹雪のホルン: +(fire horn: 炎のホルン: +(horn of plenty: 恵みのホルン: +(wooden harp: 木の竪琴: +(harp: 竪琴: +(magic harp: 魔法の竪琴: +(bell: ベル: +(bugle: ラッパ: +(leather drum: 革の太鼓: +(drum: 太鼓: +(drum of earthquake: 地震の太鼓: +(land mine: 地雷: +(beartrap: 熊の罠: +# +# tools useful as weapons +# +(pick-axe: つるはし: +(grappling hook: ひっかけ棒: +(iron hook: 鉄のフック: +(unicorn horn: ユニコーンの角: +# +# special tools +# +(Candelabrum of Invocation: 祈りの燭台: +(candelabrum: 燭台: +(Bell of Opening: 開放のベル: +(silver bell: 銀のベル: +# +# meat +# +%tripe ration: 乾し肉: +%corpse: 死体: +%egg: 卵: +%meatball: ミートボール: +%meat stick: ミートスティック: +%huge chunk of meat: 大きな肉のかたまり: +%meat ring: ミートリング: +%kelp frond: ワカメ: +%eucalyptus leaf: ユーカリの葉: +# +# fruits & veggies +# +%apple: りんご: +%orange: オレンジ: +%pear: 洋ナシ: +%melon: メロン: +%banana: バナナ: +%carrot: にんじん: +%sprig of wolfsbane: トリカブト: +%clove of garlic: にんにく: +%slime mold: ねばねばカビ: +%slice of pizza: ピザ: +# +# human food +# +%lump of royal jelly: ロイヤルゼリー: +%cream pie: クリームパイ: +%candy bar: キャンディ: +%fortune cookie: 占いクッキー: +%pancake: パンケーキ: +%lembas wafer: レンバス: +%cram ration: クラム: +%food ration: 食料: +%K-ration: Kレーション: +%C-ration: Cレーション: +%tin: 缶: +# +# potions +# +!gain ability: 能力獲得の薬: +!restore ability: 能力回復の薬: +!confusion: 混乱の薬: +!blindness: 盲目の薬: +!paralysis: 麻痺の薬: +!speed: 加速の薬: +!levitation: 浮遊の薬: +!hallucination: 幻覚の薬: +!invisibility: 透明の薬: +!see invisible: 可視の薬: +!healing: 回復の薬: +!extra healing: 超回復の薬: +!gain level: レベルアップの薬: +!enlightenment: 啓蒙の薬: +!monster detection: 怪物を探す薬: +!object detection: 物体を探す薬: +!gain energy: 魔力の薬: +!sleeping: 睡眠の薬: +!full healing: 完全回復の薬: +!polymorph: 変化の薬: +!booze: 酔っぱらいの薬: +!sickness: 病気の薬: +!fruit juice: フルーツジュース: +!water: 水: +!oil: 油: +!acid: 酸の薬: +!ruby: ルビー色の: +!pink: ピンク色の: +!orange: オレンジ色の: +!yellow: 黄色の: +!emerald: エメラルド色の: +!dark green: 暗緑色の: +!cyan: シアン色の: +!sky blue: 水色の: +!brilliant blue: 明るい青色の: +!magenta: マゼンダ色の: +!purple-red: 赤紫色の: +!puce: 暗褐色の: +!milky: ミルク色の: +!swirly: 渦を巻いている: +!bubbly: 泡だっている: +!smoky: 煙がでている: +!cloudy: 曇っている: +!effervescent: 沸騰している: +!black: 黒い: +!white: 白い: +!brown: 茶色の: +!fizzy: 発泡している: +!dark: 陰気な色の: +!clear: 無色の: +!murky: 濃黒の: +!golden: 金色の: +# +# scrolls +# +?enchant armor: 鎧に魔法をかける巻物: +?destroy armor: 鎧を破壊する巻物: +?confuse monster: 怪物を混乱させる巻物: +?scare monster: 怪物を怯えさせる巻物: +?remove curse: 解呪の巻物: +?enchant weapon: 武器に魔法をかける巻物: +?create monster: 怪物を作る巻物: +?taming: 怪物を飼いならす巻物: +?genocide: 虐殺の巻物: +?light: 光の巻物: +?teleportation: 瞬間移動の巻物: +?gold detection: 金貨を探す巻物: +?food detection: 食料を探す巻物: +?identify: 識別の巻物: +?magic mapping: 地図の巻物: +?amnesia: 記憶喪失の巻物: +?fire: 炎の巻物: +?earth: 大地の巻物: +?punishment: 罰の巻物: +?charging: 充填の巻物: +?stinking cloud: 悪臭雲の巻物: +?mail: 手紙の巻物: +?blank paper: 白紙の巻物: +?ZELGO MER: 『へろへろっす』と書かれた巻物: +?JUYED AWK YACC: 『ぱーるあぱっち』と書かれた巻物: +?NR 9: 『せぶんすぎょざー』と書かれた巻物: +?XIXAXA XOXAXA XUXAXA: 『びーえすでー』と書かれた巻物: +?PRATYAVAYAH: 『おろかぶー』と書かれた巻物: +?DAIYEN FOOELS: 『あらほらさっさ』と書かれた巻物: +?LEP GEX VEN ZEA: 『りなっくす』と書かれた巻物: +?PRIRUTSENIE: 『げろげーろ』と書かれた巻物: +?ELBIB YLOH: 『ばくしょうもんだい』と書かれた巻物: +?VERR YED HORRE: 『ちぇっくめいと』と書かれた巻物: +?VENZAR BORGAVVE: 『おーくすだーびー』と書かれた巻物: +?THARR: 『かねかねかね』と書かれた巻物: +?YUM YUM: 『おぶちけいぞう』と書かれた巻物: +?KERNOD WEL: 『くっくー』と書かれた巻物: +?ELAM EBOW: 『じゃいすと』と書かれた巻物: +?DUAM XNAHT: 『まえをみろ』と書かれた巻物: +?ANDOVA BEGARIN: 『どっくりびんきー』と書かれた巻物: +?VE FORBRYDERNE: 『すてーきみゃ』と書かれた巻物: +?HACKEM MUCHE: 『じゃいしょく』と書かれた巻物: +?VELOX NEB: 『ちゃんぴお〜ん』と書かれた巻物: +?FOOBIE BLETCH: 『はにゃ〜ん』と書かれた巻物: +?TEMOV: 『ぽちっとな』と書かれた巻物: +?GARVEN DEH: 『しびびんしびびん』と書かれた巻物: +?READ ME: 『うしろをみろ』と書かれた巻物: +?KIRJE: 『よしのやぎゅどーん』と書かれた巻物: +?stamped: 消印の押された巻物: +?unlabeled: ラベルのない巻物: +# +# spellbooks +# ++dig: 穴掘りの魔法書: ++magic missile: 矢の魔法書: ++fireball: 火の玉の魔法書: ++cone of cold: 冷気の魔法書: ++sleep: 眠りの魔法書: ++finger of death: 死の指の魔法書: ++light: 灯りの魔法書: ++detect monsters: 怪物を探す魔法書: ++healing: 回復の魔法書: ++knock: 開錠の魔法書: ++force bolt: 衝撃の魔法書: ++confuse monster: 混乱の魔法書: ++cure blindness: 盲目を癒す魔法書: ++drain life: 脱力の魔法書: ++slow monster: 牛歩の魔法書: ++wizard lock: 施錠の魔法書: ++create monster: 怪物を造る魔法書: ++detect food: 食料を探す魔法書: ++cause fear: 恐怖の魔法書: ++clairvoyance: 千里眼の魔法書: ++cure sickness: 病気を癒す魔法書: ++charm monster: 魅了の魔法書: ++haste self: 速攻の魔法書: ++detect unseen: 霊感の魔法書: ++levitation: 浮遊の魔法書: ++extra healing: 超回復の魔法書: ++restore ability: 能力回復の魔法書: ++invisibility: 透明の魔法書: ++detect treasure: 宝を探す魔法書: ++remove curse: 解呪の魔法書: ++magic mapping: 地図の魔法書: ++identify: 識別の魔法書: ++turn undead: 蘇生の魔法書: ++polymorph: 変化の魔法書: ++teleport away: 瞬間移動の魔法書: ++create familiar: 造魔の魔法書: ++cancellation: 無力化の魔法書: ++protection: 守りの魔法書: ++jumping: 跳躍の魔法書: ++stone to flesh: 軟化の魔法書: +# ++parchment: 羊皮紙の魔法書: ++vellum: 子牛皮の魔法書: ++ragged: ぼろぼろの魔法書: ++dog eared: ページの折られた魔法書: ++mottled: まだらの魔法書: ++stained: よごれた魔法書: ++cloth: 布地の魔法書: ++leather: 革の魔法書: ++white: 白い魔法書: ++pink: ピンク色の魔法書: ++red: 赤い魔法書: ++orange: オレンジ色の魔法書: ++yellow: 黄色い魔法書: ++velvet: ビロードの魔法書: ++light green: 淡緑色の魔法書: ++dark green: 濃緑色の魔法書: ++turquoise: 青緑色の魔法書: ++cyan: シアン色の魔法書: ++light blue: 淡青の魔法書: ++dark blue: 濃青の魔法書: ++indigo: 藍色の魔法書: ++magenta: マゼンダ色の魔法書: ++purple: 紫色の魔法書: ++violet: スミレ色の魔法書: ++tan: 黄褐色の魔法書: ++plaid: ラシャの魔法書: ++light brown: 淡茶色の魔法書: ++dark brown: 濃茶色の魔法書: ++gray: 灰色の魔法書: ++dusty: ほこりっぽい魔法書: ++bronze: 青銅の魔法書: ++copper: 銅の魔法書: ++silver: 銀の魔法書: ++gold: 金の魔法書: ++glittering: きらびらかな魔法書: ++shining: 輝く魔法書: ++thin: 薄い色の魔法書: ++thick: 濃い色の魔法書: ++plain: 真っ白な魔法書: ++dull: 鉛色の魔法書: ++canvas: 麻の魔法書: ++hardcover: 固い表紙の魔法書: ++Book of the Dead: 死者の書: ++papyrus: パピルスの魔法書: ++blank paper: 白紙の魔法書: ++wrinkled: くしゃくしゃの魔法書: +# +# wands +# +/light: 灯りの杖: +/secret door detection: 扉探索の杖: +/enlightenment: 啓蒙の杖: +/create monster: 怪物を造る杖: +/wishing: 願いの杖: +/nothing: 単なる杖: +/striking: 衝撃の杖: +/make invisible: 透明化の杖: +/slow monster: 減速の杖: +/speed monster: 加速の杖: +/undead turning: 蘇生の杖: +/polymorph: 変化の杖: +/cancellation: 無力化の杖: +/teleportation: 瞬間移動の杖: +/opening: 開錠の杖: +/locking: 施錠の杖: +/probing: 探査する杖: +/digging: 穴掘りの杖: +/magic missile: 矢の杖: +/fire: 炎の杖: +/cold: 吹雪の杖: +/sleep: 眠りの杖: +/death: 死の杖: +/lightning: 雷の杖: +# +/glass: ガラスの杖: +/balsa: バルサの杖: +/crystal: 水晶の杖: +/maple: 楓の杖: +/pine: 松の杖: +/oak: 樫の杖: +/ebony: 黒檀の杖: +/marble: 大理石の杖: +/tin: ブリキの杖: +/brass: 真鍮の杖: +/copper: 銅の杖: +/silver: 銀の杖: +/platinum: プラチナの杖: +/iridium: イリジウムの杖: +/zinc: 亜鉛の杖: +/aluminum: アルミニウムの杖: +/uranium: ウラニウムの杖: +/iron: 鉄の杖: +/steel: 鋼鉄の杖: +/hexagonal: 六角形の杖: +/short: 短い杖: +/runed: ルーン文字の書かれた杖: +/long: 長い杖: +/curved: 曲った杖: +/forked: 二叉の杖: +/spiked: くさびの打ちつけられた杖: +/jeweled: 宝石が埋められた杖: +# +# gold +# +$gold piece: 金貨: +# +# gems & rocks +# +*dilithium crystal: ディリジウムの結晶: +*white: 白い石: +*diamond: ダイヤモンド: +*ruby: ルビー: +*red: 赤い石: +*sapphire: サファイア: +*blue: 青い石: +*emerald: エメラルド: +*turquoise: トルコ石: +*aquamarine: アクアマリン: +*green: 緑の石: +*amber: 琥珀: +*yellowish brown: 茶褐色の石: +*topaz: トパーズ: +*opal: オパール: +*garnet: ガーネット: +*amethyst: アメジスト: +*violet: 紫の石: +*jasper: ジャスパー: +*fluorite: フルオライト: +*jade: ひすい: +# +# jactinthは出エジプト記28章で黄水晶と訳されているが, +# citrineとかぶるので橙水晶 +# +*jacinth: 橙水晶: +*orange: 橙色の石: +*black opal: 黒オパール: +*black: 黒い石: +*citrine: 黄水晶: +*yellow: 黄色い石: +*jet: 黒玉: +*chrysoberyl: 金緑石: +*obsidian: 黒燿石: +*agate: めのう: +*worthless piece of white glass: 白いガラス: +*worthless piece of blue glass: 青いガラス: +*worthless piece of red glass: 赤いガラス: +*worthless piece of yellowish brown glass: 茶褐色のガラス: +*worthless piece of green glass: 緑のガラス: +*worthless piece of violet glass: 紫のガラス: +*worthless piece of orange glass: 橙色のガラス: +*worthless piece of black glass: 黒色のガラス: +*worthless piece of yellow glass: 黄色のガラス: +# +*luckstone: 幸せの石: +*gray: 灰色の宝石: +*loadstone: 重し: +*touchstone: 試金石: +*flint: 火打ち石: +*rock: 石: +# +# miscellaneous +# +'boulder: 岩: +'statue: 像: +0heavy iron ball: 重い鉄球: +_iron chain: 鉄の鎖: +'blinding venom: 盲目の毒液: +'splash of venom: 毒液のしぶき: +'acid venom: 酸の毒液: +# +# samurai's item +# +)wakizashi: 脇差し: +)ninja-to: 忍者刀: +)nunchaku: ヌンチャク: +)naginata: なぎなた: +)ya: 竹矢: +(osaku: おさく: +(koto: 琴: +)shito: 刺刀: +]tanko: 短甲: +]kabuto: 兜: +]yugake: 弓懸: +%gunyoki: 丸薬: +%nori: 海苔: +!sake: 酒: +# +# artifacts +# +AExcalibur: エクスカリバー: +AStormbringer: ストームブリンガー: +AMjollnir: ミュルニール: +ACleaver: クリーバー: +AGrimtooth: グリムトゥース: +AOrcrist: オークリスト: +ASting: スティング: +AMagicbane: マジックベーン: +AFrost Brand: フロストブランド: +AFire Brand: ファイアブランド: +ADragonbane: ドラゴンベーン: +ADemonbane: デーモンベーン: +AWerebane: ウェアベーン: +AGrayswandir: グレイスワンダー: +AGiantslayer: ジャイアントスレイヤー: +AOgresmasher: オーガスマッシャー: +ATrollsbane: トロルスベーン: +AVorpal Blade: ボーパルブレード: +ASnickersnee: スニッカーズニー: +ASunsword: サンソード: +# A +AThe Orb of Detection: 探索のオーブ: +# B +AThe Heart of Ahriman: アーリマンの心臓: +# C +AThe Sceptre of Might: 権力の笏: +# H +AThe Staff of Aesculapius: アエスキュラピスの杖: +# K +AThe Magic Mirror of Merlin: マーリンの魔法の鏡: +# Mon +AThe Eyes of the Overworld: 超世界の目: +# P +AThe Mitre of Holiness: 聖なる冠: +# Ran +AThe Longbow of Diana: ダイアナの長弓: +# R +AThe Master Key of Thievery: 盗賊のマスターキー: +# S +AThe Tsurugi of Muramasa: 村正の刀: +# T +AThe Platinum Yendorian Express Card: プラチナイェンダー印エクスプレスカード: +# V +AThe Orb of Fate: 運命のオーブ: +# W +AThe Eye of the Aethiopica: エチオピアの目: +# +# name of dungeon +# +dSokoban: 倉庫番: +dThe Dungeons of Doom: 運命の大迷宮: +dThe Gnomish Mines: ノームの鉱山: +dThe Quest: クエスト: +dGehennom: ゲヘナ: +dFort Ludios: ローディオス砦: +dVlad's Tower: ヴラド候の塔: +dThe Elemental Planes: 精霊界: +# +# Symbols or other things name (this is not a object name (See: drawing.c)) +# +Sremembered, unseen, creature: 見えるはずのない生物: +# +Sstrange object: 奇妙な物体: +Sweapon: 武器: +Ssuit or piece of armor: 服または鎧のたぐい: +Sring: 指輪: +Samulet: 魔除け: +Suseful item (pick-axe, key, lamp...): 便利な道具(つるはし,鍵,ランプ...): +Spiece of food: 食料: +Spotion: 薬: +Sscroll: 巻物: +Sspell book: 魔法の本: +Swand: 杖: +Spile of coins: 金貨の山: +Sgem or rock: 宝石または石: +Sboulder or statue: 岩または像: +Siron ball: 鉄球: +Siron chain: 鉄の鎖: +Ssplash of venom: 毒液: +# +Sillegal objects: 奇妙な物体: +Sweapons: 武器: +Sarmor: 鎧: +Srings: 指輪: +Samulets: 魔除け: +Stools: 道具: +Sfood: 食料: +Spotions: 薬: +Sscrolls: 巻物: +Sspell books: 魔法の本: +Swands: 杖: +Scoins: 金貨: +Srocks: 石: +Slarge stones: 巨石: +Siron balls: 鉄球: +Schains: 鎖: +Svenoms: 毒: +# +Sant or other insect: 蟻または他の昆虫: +Sblob: ブロッブ: +Scockatrice: コカトリス: +Sdog or other canine: 犬またはイヌ科の動物: +Seye or sphere: 目または球体: +Sfeline: 猫またはネコ科の動物: +Scat or other feline: 猫またはネコ科の動物: +Sgremlin: グレムリン: +Shumanoid: ヒューマノイド: +Simp or minor demon: インプまたは下級悪魔: +Sjelly: ゼリー: +Skobold: コボルト: +Sleprechaun: レプラコーン: +Smimic: ミミック: +Snymph: ニンフ: +Sorc: オーク: +Spiercer: 穴喰い: +Squadruped: 四足動物: +Srodent: 齧歯動物: +Sarachnid or centipede: クモ形類動物またはムカデ: +Strapper or lurker above: トラッパーまたはラーカー: +Sunicorn: ユニコーン: +Sunicorn or horse: ユニコーンまたは馬: +Svortex: 渦: +Sworm: ワーム: +Sxan or other mythical/fantastic insect: ザンまたは神話やファンタジーの昆虫: +Slight: 光: +Szruty: ズルティ: +Sangelic being: 天使: +Sbat: こうもり: +Sbat or bird: こうもりまたは鳥: +Scentaur: ケンタウロス: +Sdragon: ドラゴン: +Selemental: 精霊: +Sfungus or mold: キノコまたはモールド: +Sgnome: ノーム: +Sgiant humanoid: 巨人: +Sinvisible stalker: 透明ストーカー: +Sjabberwock: ジャバウォック: +SKeystone Kop: 警備員: +Slich: リッチ: +Smummy: ミイラ: +Snaga: ナーガ: +Sogre: オーガ: +Spudding or ooze: プリンまたはウーズ: +Squantum mechanic: 量子場: +Srust monster: 錆の怪物: +Srust monster or disenchanter: 錆の怪物または吸魔の怪物: +Ssnake: ヘビ: +Stroll: トロル: +Sumber hulk: アンバーハルク: +Svampire: 吸血鬼: +Swraith: レイス: +Sxorn: ゾーン: +Sapelike creature: 猿のような生物: +Szombie: ゾンビ: +Shuman: 人間: +Shuman or elf: 人間またはエルフ: +Sranger: レンジャー: +Sghost: 幽霊: +Sgolem: ゴーレム: +Sdemon: 悪魔: +Smajor demon: 悪魔: +Ssea monster: 海の怪物: +Slizard: トカゲ: +Slong worm tail: ロングワームの尻尾: +# +# part of room +# +Sdark part of a room: 部屋の暗い部分: +Swall: 壁: +Sdoorway: 出入口: +Sopen door: 開いた扉: +Sclosed door: 閉じた扉: +Sfloor of a room: 部屋の床: +Scorridor: 通路: +Slit corridor: 明るい通路: +Sstaircase up: 上り階段: +Sstaircase down: 下り階段: +Sladder up: 上りはしご: +Sladder down: 下りはしご: +Strap: 罠: +Sweb: くもの巣: +Saltar: 祭壇: +Sopulent throne: 華やかな玉座: +Ssink: 流し台: +Sfountain: 泉: +Swater filled area: 水のたまった場所: +Swater: 水のたまった場所: +Sice: 氷: +Smolten lava: 溶岩: +Slowered drawbridge: 降りている跳ね橋: +Sraised drawbridge: 上っている跳ね橋: +Sair filled area: 空気のたまった場所: +Sair: 空気のたまった場所: +Scloud filled area: 曇: +Scloud: 曇: +Sgrave: 墓: +Stree: 木: +Siron bars: 鉄棒: +# +# traps +# +^arrow trap: 矢の罠: +^dart trap: 投げ矢の罠: +^falling rock trap: 落石の罠: +^squeaky board: きしむ板: +^beartrap: 熊の罠: +^bear trap: 熊の罠: +^land mine: 地雷: +^sleeping gas trap: 睡眠ガスの罠: +^hole: 穴: +^rust trap: 腐食の罠: +^fire trap: 火の罠: +^pit: 落し穴: +^spiked pit: トゲだらけの落し穴: +^trapdoor: 落し扉: +^trap door: 落し扉: +^teleportation trap: 瞬間移動の罠: +^level teleporter: 別の階への瞬間移動の罠: +^magic portal: 魔法の入口: +^web: くもの巣: +^statue trap: 彫像の罠: +^magic trap: 魔法の罠: +^anti-magic field: 反魔法空間の罠: +^anti-magic trap field: 反魔法空間の罠: +^polymorph trap: 変化の罠: +^rolling boulder trap: 巨岩の罠: +# +# SKILLs +# +Kmartial arts: 体術: +Kbare handed combat: 素手: +Ktwo weapon combat: 二刀流: +Kriding: 騎乗: +Kdagger: 短剣: +Kaxe: 斧: +Kknife: ナイフ: +Kpick-axe: つるはし: +Kshort sword: 小剣: +Kbroadsword: 幅広の剣: +Klong sword: 長剣: +Ktwo-handed sword: 両手剣: +Kscimitar: シミター: +Ksaber: サーベル: +Kclub: こん棒: +Kmace: メイス: +Kquarterstaff: 六尺棒: +Kmorning star: モーニングスター: +Kflail: フレイル: +Khammer: ハンマー: +Kpolearms: 長斧: +Kspear: 槍: +Kjavelin: ジャベリン: +Ktrident: トライデント: +Klance: ランス: +Ksling: スリング: +Kunicorn horn: ユニコーンの角: +Kcrossbow: クロスボゥ: +Kdart: ダーツ: +Kboomerang: ブーメラン: +Kwhip: 鞭: +Kshuriken: 手裏剣: +Kbow: 弓: +Kdivination spells: 予知: +Kattack spells: 攻撃: +Kescape spells: 脱出: +Kmatter spells: 物質: +Khealing spells: 治癒: +Kenchantment spells: 補助: +Kclerical spells: 僧侶: diff -aurbN -xCVS -xXTAGS nethack/dat/jwizhelp jnethack/dat/jwizhelp --- nethack/dat/jwizhelp 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/dat/jwizhelp 2003-12-10 00:54:07.000000000 +0900 @@ -0,0 +1,23 @@ +デバッグモード: + +^E == 秘密のドアや罠を調べる. +^F == 魔法の地図. +^G == 怪物を造る. +^I == 持ち物を識別する. +^O == 特殊階の位置を知る. +^T == その階での瞬間移動. +^V == 違う階への瞬間移動. +^W == 望みをかなえる. +^X == 属性を見る. + +#levelchange == change experience level +#lightsources == show mobile light sources +#monpolycontrol == control monster polymorphs +#panic == panic test +#polyself == polymorph self +#seenv == show seen vectors +#stats == show memory statistics +#timeout == look at timeout queue +#vision == show vision array +#wmode == show wall modes + diff -aurbN -xCVS -xXTAGS nethack/dat/mines.des jnethack/dat/mines.des --- nethack/dat/mines.des 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/dat/mines.des 2003-12-10 00:54:07.000000000 +0900 @@ -844,8 +844,10 @@ NON_DIGGABLE:(53,07,55,07) NON_DIGGABLE:(53,14,61,14) # The Gnome King's wine cellar. -ENGRAVING:(12,03),engrave,"You are now entering the Gnome King's wine cellar." -ENGRAVING:(12,04),engrave,"Trespassers will be persecuted!" +#ENGRAVING:(12,03),engrave,"You are now entering the Gnome King's wine cellar." +#ENGRAVING:(12,04),engrave,"Trespassers will be persecuted!" +ENGRAVING:(12,03),engrave,"ノームの王のワイン倉庫" +ENGRAVING:(12,04),engrave,"侵入者はそれ相応の償いを求められる!" OBJECT:'!',"booze",(10,07) OBJECT:'!',"booze",(10,07) OBJECT:'!',random,(10,07) diff -aurbN -xCVS -xXTAGS nethack/doc/jGuidebook.mn jnethack/doc/jGuidebook.mn --- nethack/doc/jGuidebook.mn 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/doc/jGuidebook.mn 2005-01-24 06:41:27.000000000 +0900 @@ -0,0 +1,4750 @@ +.\" "Guidebook.mn" Japanese Translation +.\" +.\" Translated +.\" for NetHack 3.1.0 PL10 by Keizo Yamamoto +.\" for NetHack 3.1.3 by Kentaro Shirakata +.\" for JNetHack 1.0.5 by Issei Numata +.\" for NetHack 3.3.0 by Kentaro Shirakata +.\" for (J)NetHack 3.4 by Kentaro Shirakata +.\" +.\" Usage: +.\" tbl tmac.n jGuideBook.mn | nroff -Tnippon +.\" +.\"WORD: Dungeoneer 洞窟の主 +.\"WORD: the Mazes of Menace 恐怖の迷宮 +.\"WORD: dungeon 洞窟 +.\"WORD: proficiency 技量 +.\" +.ds h0 "NetHack Guidebook +.ds h1 +.ds h2 % +.ds vr "NetHack 3.4 +.ds f0 "\*(vr +.ds f1 +.ds f2 "December 2, 2003 +.mt +.\"O A Guide to the Mazes of Menace +.\"O (Guidebook for NetHack) +恐怖の迷宮への招待 +(NetHack ガイドブック) +.au +Eric S. Raymond +.\"O (Extensively edited and expanded for 3.4) +(バージョン 3.4 のための広範囲な校訂と拡充) +.hn 1 +.\"O Introduction +はじめに +.pg +.\"O Recently, you have begun to find yourself unfulfilled and distant +.\"O in your daily occupation. Strange dreams of prospecting, stealing, +.\"O crusading, and combat have haunted you in your sleep for many months, +.\"O but you aren't sure of the reason. You wonder whether you have in +.\"O fact been having those dreams all your life, and somehow managed to +.\"O forget about them until now. Some nights you awaken suddenly +.\"O and cry out, terrified at the vivid recollection of the strange and +.\"O powerful creatures that seem to be lurking behind every corner of the +.\"O dungeon in your dream. Could these details haunting your dreams be real? +.\"O As each night passes, you feel the desire to enter the mysterious caverns +.\"O near the ruins grow stronger. Each morning, however, you quickly put +.\"O the idea out of your head as you recall the tales of those who entered +.\"O the caverns before you and did not return. Eventually you can resist +.\"O the yearning to seek out the fantastic place in your dreams no longer. +.\"O After all, when other adventurers came back this way after spending time +.\"O in the caverns, they usually seemed better off than when they passed +.\"O through the first time. And who was to say that all of those who did +.\"O not return had not just kept going? +.\"O +最近、あなたは日々の仕事に満たされなく、敬遠しつつある自分に気がついた。 +最近数ヶ月、あなたが見る夢は探査、盗み、十字軍、戦闘といったものであったが、 +あなたにはその理由がはっきりとはわからなかった。 +あなたはこれらの夢を実際には生まれてこのかたずっと見続けていて、 +なぜか今までそれらについて忘れようとしていたのではないか、と思った。 +ある夜、あなたは飛び起きて、 +夢の中の洞窟のあらゆる角の後ろに潜んでいるように見える、 +奇妙で強力な怪物の鮮明な記憶にぞっとして大声で叫んだ。 +あなたの夢に出没する内容は本当なのだろうか? +夜毎に、廃墟の近くの不思議な洞窟に入るという欲求が強くなった。 +それでも、毎朝あなたはそのような考えを、 +洞窟に入って帰って来なかった人々の話を思い出すことで頭から追い出した。 +しかし、ついにあなたは夢の中に出てくる不思議な場所を捜し求めるという思いを +抑えきれなくなった。 +何といっても、冒険者は最初にその道を通っていった時より、 +こちらに戻って来る時の方が裕福になっているように見えるのだ。 +戻って来ない人たちは皆、単にまだ冒険を続けているだけなのでは? + +.pg +.\"O Asking around, you hear about a bauble, called the Amulet of Yendor by some, +.\"O which, if you can find it, will bring you great wealth. One legend you were +.\"O told even mentioned that the one who finds the amulet will be granted +.\"O immortality by the gods. The amulet is rumored to be somewhere beyond the +.\"O Valley of Gehennom, deep within the Mazes of Menace. Upon hearing the +.\"O legends, you immediately realize that there is some profound and +.\"O undiscovered reason that you are to descend into the caverns and seek +.\"O out that amulet of which they spoke. Even if the rumors of the amulet's +.\"O powers are untrue, you decide that you should at least be able to sell the +.\"O tales of your adventures to the local minstrels for a tidy sum, especially +.\"O if you encounter any of the terrifying and magical creatures of +.\"O your dreams along the way. You spend one last night fortifying yourself +.\"O at the local inn, becoming more and more depressed as you watch the odds +.\"O of your success being posted on the inn's walls getting lower and lower. +あちこちで尋ねるうちに、あなたはある噂を耳にした。 +イェンダーの魔除けとかいうものがあり、手に入れることができたなら、 +すばらしい財産をもたらすと言うのだ。 +あなたが聞いたとある伝説では、 +魔除けを見つけたものは神から不死の体を授かるとさえ言われているらしい。 +魔除けは恐怖の迷宮の奥深く、ゲヘナの谷を越えたどこかにあるという噂である。 +伝説を聞いた瞬間、あなたは自分には洞窟に入って彼らの話している +魔除けを捜し求めるべき深遠で未知のなんらかの理由があると確信した。 +あなたはたとえ魔除けの力が真実でなくても、 +少なくとも冒険談を地元のの吟遊詩人にかなりの金額で売り込めるだろうと考えた。 +夢の中で出てきた恐ろしく、不思議な怪物に出会うことができればなおさらである。 +あなたは地元の安宿で最後の宿を取り対策を練った。 +安宿の壁に掲げられた成功率のオッズが下がれば下がるほど、 +あなたは意気消沈した。 + +.pg +.\"O In the morning you awake, collect your belongings, and +.\"O set off for the dungeon. After several days of uneventful +.\"O travel, you see the ancient ruins that mark the entrance to the +.\"O Mazes of Menace. It is late at night, so you make camp at the entrance +.\"O and spend the night sleeping under the open skies. In the morning, you +.\"O gather your gear, eat what may be your last meal outside, and enter the +.\"O dungeon... +朝起きると、あなたは所持品をかき集め、あなたは洞窟に向けて旅立った。 +無事何日かの旅を続けて恐怖の迷宮への入口を +示す古代の遺跡へとたどり着いた。夜も更けていたので入口でキャンプをすることにし、 +その夜は広々とした空の下で眠りに就いた。翌朝あなたは道具をかき集め、 +もしかすると地上での最後になるかもしれない食事を済ませ、 +洞窟へと入っていった。 + +.hn 1 +.\"O What is going on here? +あなたを取り巻く状況 +.pg +.\"O You have just begun a game of NetHack. Your goal is to grab as much +.\"O treasure as you can, retrieve the Amulet of Yendor, and escape the +.\"O Mazes of Menace alive. +こうしてあなたは NetHack というゲームを始めることになった。あなたの目的は +持てる限りの宝を集め、イェンダーの魔除けを見つけ出し、さらにはこの恐怖 +の迷宮から生きて脱出することである。 +.pg +.\"O Your abilities and strengths for dealing with the hazards of adventure +.\"O will vary with your background and training: +冒険におけるいろいろな困難に対応するための各種の能力や力は、 +あなたの生い立ちと修行によって変化する。 +.pg +.\"O \fIArcheologists\fP understand dungeons pretty well; this enables them +.\"O to move quickly and sneak up on the local nasties. They start equipped +.\"O with the tools for a proper scientific expedition. +\fI考古学者(Archeologist)\fP は洞窟について多くの知識を持っている。 +このため素早く動いたり洞窟での不快な事態を切り抜けることができる。 +彼らは学術的調査のための探検旅行に適した道具を持って出発する。 +.pg +.\"O \fIBarbarians\fP are warriors out of the hinterland, hardened to battle. +.\"O They begin their quests with naught but uncommon strength, a trusty hauberk, +.\"O and a great two-handed sword. +\fI 野蛮人(Barbarian)\fP は奥地からやってきた戦士であり、戦闘のために鍛えられている。 +彼らは類まれな力の強さを持ち、丈夫な鎖かたびらと大きな両手持ちの +剣のみを持って探求に出発する。 +.pg +.\"O \fICavemen\fP and \fICavewomen\fP start with exceptional strength but, +.\"O unfortunately, with neolithic weapons. +\fI 洞窟人(Caveman と Cavewoman)\fPはとりわけ強い力を持っているが、 +新石器時代に使われた武器を持って出発する。 +.pg +.\"O \fIHealers\fP are wise in medicine and apothecary. They know the +.\"O herbs and simples that can restore vitality, ease pain, anesthetize, +.\"O and neutralize poisons; and with their instruments, they can divine a +.\"O being's state of health or sickness. Their medical practice earns them +.\"O quite reasonable amounts of money, with which they enter the dungeon. +\fI医者(Healer)\fPは医術や薬物について精通している。 +生気を回復させたり、苦痛を和らげたり、麻酔をかけたり、 +毒を中和させたりする香草や薬草について詳しい。 +そして器具を使って生物の健康状態を見抜くことができる。 +彼らは開業医としてかなりよい報酬を得て、それを持って洞窟に入っていく。 +.pg +.\"O \fIKnights\fP are distinguished from the common skirmisher by their +.\"O devotion to the ideals of chivalry and by the surpassing excellence of +.\"O their armor. +\fI騎士(Knight)\fP は騎士道に忠実であることと防具が驚くほど優れていることとい +う点で、普通の戦士とは区別される。 +.pg +.\"O \fIMonks\fP are ascetics, who by rigorous practice of physical and mental +.\"O disciplines have become capable of fighting as effectively without weapons +.\"O as with. They wear no armor but make up for it with increased mobility. +\fI モンク(Monk) \fP は修道者であり、厳格な肉体的習慣と精神的訓練によって、 +武器なしでも武器を使うのと同じように戦うことが出来る。 +モンクは防具をつけないが、機動性を向上させることで埋め合わせている。 +.pg +.\"O \fIPriests\fP and \fIPriestesses\fP are clerics militant, crusaders +.\"O advancing the cause of righteousness with arms, armor, and arts +.\"O thaumaturgic. Their ability to commune with deities via prayer +.\"O occasionally extricates them from peril, but can also put them in it. +\fI僧侶と尼僧(Priest と Priestess)\fP は聖職の戦士であり、 +武器と防具を持ち魔法の業を駆使して正義を広めんとする聖戦士である。 +祈りを通じて神と語る能力により、彼らはしばしば危難から逃れることができる… +が、祈りは危難をもたらすこともある。 +.pg +.\"O \fIRangers\fP are most at home in the woods, and some say slightly out +.\"O of place in a dungeon. They are, however, experts in archery as well +.\"O as tracking and stealthy movement. +\fI レンジャー(Ranger)\fP はほとんど森を住みかとし、洞窟は少々場違いかもしれない。 +しかし、彼らは追跡術や隠密行動と共に、弓術の達人である。 +.pg +.\"O \fIRogues\fP are agile and stealthy thieves, with knowledge of locks, +.\"O traps, and poisons. Their advantage lies in surprise, which they employ +.\"O to great advantage. +\fI 盗賊(Rogue)\fP は敏捷で身を隠す業に長けた泥棒であり、 +錠や罠や毒に詳しい。 +彼らの長所は奇襲であり、これは非常な長所となる。 +.pg +.\"O \fISamurai\fP are the elite warriors of feudal Nippon. They are lightly +.\"O armored and quick, and wear the \fIdai-sho\fP, two swords of the deadliest +.\"O keenness. +\fI 侍(Samurai)\fP は封建時代の日本の精鋭の武人である。 +防具は軽装で身のこなし +に秀でており、この上なく研ぎ澄まされた \fI 大小 \fP 2本の刀を帯びている。 +.pg +.\"O \fITourists\fP start out with lots of gold (suitable for shopping with), +.\"O a credit card, lots of food, some maps, and an expensive camera. Most +.\"O monsters don't like being photographed. +\fI 観光客(Tourist)\fP は多額の金(買物に最適である)とクレジットカード、大量の食料、 +地図、そして高価なカメラを持って出発する。 +ほとんどの怪物は写真に撮られるのを嫌うものである。 +.pg +.\"O \fIValkyries\fP are hardy warrior women. Their upbringing in the harsh +.\"O Northlands makes them strong, inures them to extremes of cold, and instills +.\"O in them stealth and cunning. +\fI ワルキューレ(Valkyrie)\fP は勇敢な女戦士である。 +過酷なスカンジナビアの国々で育った彼女らは頑強で、厳しい寒さにも耐え、 +身を隠す業と巧妙さを身につけている。 +.pg +.\"O \fIWizards\fP start out with a knowledge of magic, a selection of magical +.\"O items, and a particular affinity for dweomercraft. Although seemingly weak +.\"O and easy to overcome at first sight, an experienced Wizard is a deadly foe. +\fI 魔法使い(Wizard)\fPは魔術の知識とに選び抜かれた魔法の道具を準備しており、 +いにしえの魔法学に対して特に造詣が深い。 +見かけは弱そうで簡単に打ち倒せるように思えるが、 +経験を積んだ魔法使いは恐るべき敵である。 +.pg +.\"O You may also choose the race of your character: +また、キャラクターの種族も選ぶことができる。 +.pg +.\"O \fIDwarves\fP are smaller than humans or elves, but are stocky and solid +.\"O individuals. Dwarves' most notable trait is their great expertise in mining +.\"O and metalwork. Dwarvish armor is said to be second in quality not even to the +.\"O mithril armor of the Elves. +\fI ドワーフ(Dwarf) \fP は人間やエルフよりも小さいが、がっしりした体つきで丈夫である。 +ドワーフの注目すべき特性は採掘と金属工作の専門的技術である。 +ドワーフの防具はエルフのミスリル防具と同じとまではいかないまでも、 +それに次ぐ品質である。 +.pg +.\"O \fIElves\fP are agile, quick, and perceptive; very little of what goes +.\"O on will escape an Elf. The quality of Elven craftsmanship often gives +.\"O them an advantage in arms and armor. +\fI エルフ(Elf) \fP は機敏さと迅速さ、そして鋭敏な感覚を持っている。 +周囲で起きるどんな些細なことも彼らの目を逃れることはできない。 +職人気質の彼らの持つ武器と防具は優秀なものである。 +.pg +.\"O \fIGnomes\fP are smaller than but generally similar to dwarves. Gnomes are +.\"O known to be expert miners, and it is known that a secret underground mine +.\"O complex built by this race exists within the Mazes of Menace, filled with +.\"O both riches and danger. +\fI ノーム(Gnome) \fP はドワーフよりもさらに小さいが、ドワーフと似ている。 +ノームは熟練した採掘師として知られ、 +富と危険で満ちている秘密の地下坑道を恐怖の迷宮に作っていることで知られる。 +.pg +.\"O \fIHumans\fP are by far the most common race of the surface world, and +.\"O are thus the norm by which other races are often compared. Although +.\"O they have no special abilities, they can succeed in any role. +\fI 人間(Human) \fP は地上で最も一般的な種族で、ゆえに他の種族と比較される時の基準となっている。 +特別な能力は持っていないが、あらゆる職業で成功することができる。 +.pg +.\"O \fIOrcs\fP are a cruel and barbaric race that hate every living thing +.\"O (including other orcs). Above all others, Orcs hate Elves with a passion +.\"O unequalled, and will go out of their way to kill one at any opportunity. +.\"O The armor and weapons fashioned by the Orcs are typically of inferior quality. +\fI オーク(Orc) \fP は残酷で野蛮な種族で、(他のオークを含む)あらゆる生物を嫌っている。 +特に、オークはエルフを感性の違いゆえに嫌い、わざわざあらゆる機会を見つけて殺そうとする。 +オークによって作られた防具と武器は一般的に品質が劣る。 +.hn 1 +.\"O What do all those things on the screen mean? +画面に表示されるものの意味 +.pg +.\"O On the screen is kept a map of where you have +.\"O been and what you have seen on the current dungeon level; as you +.\"O explore more of the level, it appears on the screen in front of you. +画面上にはあなたが現在いる洞窟の階 +ですでに探索を終えた部分の地図と、そこで目にした物が示されている。さら +に深く探検を進めるに連れて洞窟はその姿を次第にあなたの前の画面に明らか +にしていく。 +.pg +.\"O When NetHack's ancestor \fIrogue\fP first appeared, its screen +.\"O orientation was almost unique among computer fantasy games. Since +.\"O then, screen orientation has become the norm rather than the +.\"O exception; NetHack continues this fine tradition. Unlike text +.\"O adventure games that accept commands in pseudo-English sentences and +.\"O explain the results in words, NetHack commands are all one or two +.\"O keystrokes and the results are displayed graphically on the screen. A +.\"O minimum screen size of 24 lines by 80 columns is recommended; if the +.\"O screen is larger, only a 21x80 section will be used for the map. +NetHack の祖先である \fIrogue\fP が最初に現れたとき、そのスクリーン指向は +コンピュータファンタジーゲームの中でも全く独特のものであった。それ以来 +スクリーン指向は例外的なものというよりむしろ標準となった。NetHack はこ +のすばらしい伝統を受け継いでいる。疑似的な英語でコマンドを入力し、結果 +が文章で表示されるテキストアドベンチャーゲームとは異なり、NetHack のコ +マンドはすべて 1 文字か 2 文字のキー入力で与えられ、その結果は画面上に +グラフィカルに表示される。画面は最低 80 桁および 24 行の大きさが推奨さ +れる。それ以上の大きさがあっても 80 × 21 の領域だけが地図の表示に使わ +れる。 +.pg +.\"O NetHack can even be played by blind players, with the assistance of Braille +.\"O readers or speech synthesisers. Instructions for configuring NetHack for +.\"O the blind are included later in this document. +NetHack は点字や音声合成の助けを借りて、目の不自由な人でもプレイできる。 +目の不自由な人のためのNetHackの設定方法については、このドキュメントで +後述する。 +.pg +.\"O NetHack generates a new dungeon every time you play it; even the +.\"O authors still find it an entertaining and exciting game despite +.\"O having won several times. +NetHack はプレイするたびに新しい洞窟を作成する。 +このため何回かゲームに勝利したことのある作者たちにも、 +いまだこのゲームは楽しく興奮に満ちたものと感じられる。 +.pg +.\"O NetHack offers a variety of display options. The options available to you +.\"O will vary from port to port, depending on the capabilities of your +.\"O hardware and software, and whether various compile-time options were +.\"O enabled when your executable was created. The three possible display +.\"O options are: a monochrome character interface, a color character interface, +.\"O and a graphical interface using small pictures called tiles. The two +.\"O character interfaces allow fonts with other characters to be substituted, +.\"O but the default assignments use standard ASCII characters to represent +.\"O everything. There is no difference between the various display options +.\"O with respect to game play. Because we cannot reproduce the tiles or +.\"O colors in the Guidebook, and because it is common to all ports, we will +.\"O use the default ASCII characters from the monochrome character display +.\"O when referring to things you might see on the screen during your game. +NetHack はさまざまな表示のオプションを提供する。 +オプションはあなたのハードウェアやソフトウェアの能力に依存し、 +プラットフォーム毎にさまざまである。 +さまざまなコンパイル時のオプションは実行ファイルが作られたときにのみ可能となる。 +モノクロキャラクタインタフェース、 +カラーキャラクタインタフェース、 +タイルと呼ばれる小さな絵を用いたグラフィカルインタフェースの 3 つの表示方法がある。 +2 つのキャラクタインタフェースはフォントを他の文字に置き換えることもできるが、 +標準設定では 標準の ASCII キャラクタを用いて全てを表現する。 +さまざまな表示のオプションはゲーム内容には影響を与えない。 +タイルや色はガイドブックで表記できないし、 +それは全てのプラットフォームに共通ではないので、 +ゲーム中に表示されるものの説明としては +モノクロキャラクタディスプレイで表示される標準の ASCII キャラクタを用いる。 +.pg +.\"O In order to understand what is going on in NetHack, first you must +.\"O understand what NetHack is doing with the screen. The NetHack screen +.\"O replaces the ``You see ...'' descriptions of text adventure games. +.\"O Figure 1 is a sample of what a NetHack screen might look like. +.\"O The way the screen looks for you depends on your platform. +NetHack で何が起きているのかを理解するには、まず NetHack では画面が +どうなっているのかを理解しなくてはならない。NetHack の画面は、テキストアド +ベンチャーゲームにおける「あなたは…を見た」のような文章の代わりである。 +図 1 は NetHack では画面に何が表示されるかの一例である。 +画面がどのように表示されるかはプラットホームに依存する。 + +.TS S +center tab(~); +a. +_ +The bat bites! + + ------ + |....| ---------- + |.<..|####...@...$.| + |....-# |...B....+ + |....| |.d......| + ------ -------|-- + + + +Player the Rambler St:12 Dx:7 Co:18 In:11 Wi:9 Ch:15 Neutral +Dlvl:1 $:0 HP:9(12) Pw:3(3) AC:10 Exp:1/19 T:257 Weak + +_ +.TE +.ce 1 +Figure 1 + +.hn 2 +.\"O The status lines (bottom) +ステータス行(画面の下部) +.pg +.\"O The bottom two lines of the screen contain several cryptic pieces of +.\"O information describing your current status. If either status line +.\"O becomes longer than the width of the screen, you might not see all of +.\"O it. Here are explanations of what the various status items mean +.\"O (though your configuration may not have all the status items listed +.\"O below): +画面の下 2 行には、あなたの現在の状態を表す暗号のような情報の断片が含まれている。 +どちらかの行が画面の幅よりも長くなるとその全部を見ることはできない +かもしれない。以下に状態を示すいろいろな項目が何を意味するのかを述べる +(コンフィグレーションによっては、以下に一覧されている状態を示す項目の +すべてが表示されるとは限らない)。 +.\"O .lp "Rank " +.lp 名前とランク(Rank) +.\"O Your character's name and professional ranking (based on the +.\"O experience level, see below). +あなたのキャラクタ名と(後述の経験レベルに基づく)職業別の等級。 +.\"O .lp Strength +.lp 強さ(Strength) +.\"O A measure of your character's strength; one of your six basic +.\"O attributes. A human character's attributes can range from 3 to 18 inclusive; +.\"O non-humans may exceed these limits +.\"O (occasionally you may get super-strengths of the form 18/xx, and magic can +.\"O also cause attributes to exceed the normal limits). The +.\"O higher your strength, the stronger you are. Strength affects how +.\"O successfully you perform physical tasks, how much damage you do in +.\"O combat, and how much loot you can carry. +あなたのキャラクタの力の強さの値であり、6 つの基本的な属性の 1 +つである。人間のキャラクターの場合,力の強さは 3 から 18 の間の値をとる。 +その他の場合,この制限を越えることもある +(時折 18/xx のような特別な力を得ることもあり、魔法の力も普通の制限を越える +能力を与えることがある)。 +力の強さの値が大きいほど、あなたの力は強い。 +力の強さは力仕事をどれだけうまくやれるか、戦いでどれだけの +ダメージを与えるか、どれくらい荷物を運べるかに影響する。 +.\"O .lp Dexterity +.lp 素早さ(Dexterity) +.\"O Dexterity affects your chances to hit in combat, to avoid traps, and +.\"O do other tasks requiring agility or manipulation of objects. +素早さは戦いにおける命中率、罠を逃れる可能性、そしてその他の +敏捷さを必要とする仕事や物をいかに器用に扱えるかなどのことがら +に影響を与える。 +.\"O .lp Constitution +.lp +耐久力(Constitution) +.\"O Constitution affects your ability to recover from injuries and other +.\"O strains on your stamina. +耐久力は怪我やその他の圧迫によるスタミナの消耗から回復する能力に影響する。 +.\"O .lp Intelligence +.lp 知力(Intelligence) +.\"O Intelligence affects your ability to cast spells and read spellbooks. +知力は呪文を唱える能力や魔法書を読む能力に影響を与える。 +.\"O .lp Wisdom +.lp 賢さ(Wisdom) +.\"O Wisdom comes from your practical experience (especially when dealing with +.\"O magic). It affects your magical energy. +賢さは(特に魔法を扱う)実戦的な経験により得られる。 +魔法のエネルギーに影響する。 +.\"O .lp Charisma +.lp 魅力(Charisma) +.\"O Charisma affects how certain creatures react toward you. In +.\"O particular, it can affect the prices shopkeepers offer you. +魅力はある種の生物があなたに対してとる態度に影響を与える。 +特に店主が示す価格に影響する。 +.\"O .lp Alignment +.lp 属性(Alignment) +.\"O \fBLawful\fP, \fBNeutral\fP, or \fBChaotic\fP. Often, Lawful is +.\"O taken as good and Chaotic as evil, but legal and ethical do not always +.\"O coincide. Your alignment influences how other +.\"O monsters react toward you. Monsters of a like alignment are more likely +.\"O to be non-aggressive, while those of an opposing alignment are more likely +.\"O to be seriously offended at your presence. +属性には \fB 秩序 (Lawful)\fP, \fB 中立 (Neutral)\fP, +\fB 混沌(Chaotic)\fP がある。 +しばしば、秩序は善、混沌は悪であるとされるが、法と道徳が +常に一致するとは限らない。 +あなたの属性は他の怪物のあなたに対する反応に影響を与える。 +属性が似ている怪物は好戦的ではなく、 +反対の属性に対してはあなたの存在に対して極めて好戦的であるらしい。 +.\"O .lp "Dungeon Level +.lp "階数(Dungeon Level)" +.\"O How deep you are in the dungeon. You start at level one and the number +.\"O increases as you go deeper into the dungeon. Some levels are special, +.\"O and are identified by a name and not a number. The Amulet of Yendor is +.\"O reputed to be somewhere beneath the twentieth level. +どれだけ洞窟の奥深くまで行ったかを示す。 +初期値は 1 で、洞窟を奥深く行くほど大きな値になる。 +いくつかの階は特別で、数字ではなく名前で識別される。 +イェンダーの魔除けは地下 20 階より深くのどこかにあると考えられている。 +.\"O .lp "Gold " +.lp 金(Gold) +.\"O The number of gold pieces you are openly carrying. Gold which you have +.\"O concealed in containers is not counted. +大っぴらに所持している金貨の数である。箱などに隠したお金は勘定に入っていない。 +.\"O .lp "Hit Points +.lp "体力(Hit Points) +.\"O Your current and maximum hit points. Hit points indicate how much +.\"O damage you can take before you die. The more you get hit in a fight, +.\"O the lower they get. You can regain hit points by resting, or by using +.\"O certain magical items or spells. The number in parentheses is the maximum +.\"O number your hit points can reach. +体力の現在値と最大値である。 +体力はあとどれだけのダメージを受けると死ぬかを示す。 +戦いで傷つくほど値は減少する。体力は休息や魔法のアイテムや呪文により回復できる。 +括弧の中の数字は体力のとり得る最大値である。 +.\"O .lp Power +.lp 魔力(Power) +.\"O Spell points. This tells you how much mystic energy (\fImana\fP) +.\"O you have available for spell casting. Again, resting will regenerate the +.\"O amount available. +呪文に使う魔力である。これは呪文を唱えるのに必要な神秘の力 +(\fImana: マナ \fP) がどれほどあるかを示す。 +魔力もまた休息することにより回復する。 +.\"O .lp "Armor Class +.lp "防御値(Armor Class) +.\"O A measure of how effectively your armor stops blows from unfriendly +.\"O creatures. The lower this number is, the more effective the armor; it +.\"O is quite possible to have negative armor class. +非友好的な生物からの攻撃を防具がどれほど食い止められるかを示す値である。 +数字が小さいほど防具は有効であり、 +防御値が負の値になることさえ十分あり得る。 +.\"O .lp Experience +.lp 経験値(Experience) +.\"O Your current experience level and experience points. As you +.\"O adventure, you gain experience points. At certain experience point +.\"O totals, you gain an experience level. The more experienced you are, +.\"O the better you fight and withstand magical attacks. Many dungeons +.\"O show only your experience level here. +現在の経験レベルと経験値である。冒険が進むと経験値を得ること +ができる。経験値の合計がある一定値まで達すると、経験レベルが上 +がる。経験を積むにつれ、戦い方が上達し魔法の攻撃にも耐えられるよ +うになる。多くのバージョンでは経験レベルだけが表示される。 +.\"O .lp "Time " +.lp 時間(Time) +.\"O The number of turns elapsed so far, displayed if you have the +.\"O .op time +.\"O option set. +経過したターン数である。 +.op time +オプションがオンのときに表示される。 +.\"O .lp "Hunger status +.lp "腹具合(Hunger status) +.\"O Your current hunger status, ranging from \fBSatiated\fP down to +.\"O \fBFainting\fP. If your hunger status is normal, it is not displayed. +現在の腹具合である。腹具合は \fB 満腹(Satiated)\fP から +\fB ふらふら(Fainting) \P までの値をとる。腹具合が普通なら表示されない。 +.pg +.\"O Additional status flags may appear after the hunger status: \fBConf\fP +.\"O when you're confused, \fBFoodPois\fP or \fBIll\fP +.\"O when sick, \fBBlind\fP when you can't +.\"O see, \fBStun\fP when stunned, and \fBHallu\fP when hallucinating. +この他にも状態を示す表示が腹具合の後ろに表示されることがあるかもしれ +ない。混乱しているときには \fBConf\fP、病気のときには \fBFoodPois\fP または \fBIll\fP、 +目が見えないときには \fBBlind\fP、眩暈がしたときは \fBStun\fP、 +幻覚を見ているときは \fBHallu\fP と表示される。 +.hn 2 +.\"O The message line (top) +メッセージ行(画面の上部) +.pg +.\"O The top line of the screen is reserved for messages that describe +.\"O things that are impossible to represent visually. If you see a +.\"O ``\fB--More--\fP'' on the top line, this means that NetHack has +.\"O another message to display on the screen, but it wants to make certain +.\"O that you've read the one that is there first. To read the next message, +.\"O just press the space bar. +画面の最上行は視覚的に表現できないことを説明するメッセージのために使われる。 +最上行に``\fB--More--\fP''が表示されたときは、 +このあとにさらにメッセージが続いているけれども +現在のメッセージをまず確実に読むよう促しているということである。 +次のメッセージを読むためには単にスペースキーを押せばよい。 +.hn 2 +.\"O The map (rest of the screen) +地図(画面のその他の部分) +.pg +.\"O The rest of the screen is the map of the level as you have explored it +.\"O so far. Each symbol on the screen represents something. You can set +.\"O various graphics options to change some of the symbols the game uses; +.\"O otherwise, the game will use default symbols. Here is a list of what the +.\"O default symbols mean: +画面のその他の部分は、あなたが現在いる階で +それまでに探索し終わった部分の地図である。 +画面上のシンボルはそれぞれ何かを表している。 +表示されるシンボルのうちいくつかは、 +さまざまなグラフィックオプションを設定することによって変えることができる。 +そうでなければ標準設定のシンボルが用いられる。 +次に標準設定のシンボルの意味の一覧を示す。 +.\"O .lp "- and | +.lp "- と | +.\"O The walls of a room, or an open door. Or a grave (|). +部屋の壁、または開いた扉、または墓 (|)。 +.lp . +.\"O The floor of a room, ice, or a doorless doorway. +部屋の床、氷、または扉のない出入口。 +.lp # +.\"O A corridor, or iron bars, or a tree, or possibly a kitchen sink (if +.\"O your dungeon has sinks), or a drawbridge. +通路、鉄の棒、木、あるいは台所の流し台(流し台がインプリメントされているとき) +または跳ね橋 +.lp > +.\"O Stairs down: a way to the next level. +上り階段:上の階への通路。 +.lp < +.\"O Stairs up: a way to the previous level. +下り階段:下の階への通路。 +.lp + +.\"O A closed door, or a spellbook containing a spell you may be able to learn. +閉じた扉、または学習できるかもしれない呪文の書かれた魔法書。 +.lp @ +.\"O Your character or a human. +あなたのキャラクター、または人間。 +.lp $ +.\"O A pile of gold. +金貨の山。 +.lp ^ +.\"O A trap (once you have detected it). +罠(ひとたび発見すれば表示される)。 +.lp ) +.\"O A weapon. +武器。 +.lp [ +.\"O A suit or piece of armor. +服またはなんらかの防具。 +.lp % +.\"O Something edible (not necessarily healthy). +食料(衛生的であるとは限らない)。 +.lp ? +.\"O A scroll. +巻物。 +.lp / +.\"O A wand. +杖。 +.lp = +.\"O A ring. +指輪。 +.lp ! +.\"O A potion. +水薬。 +.lp ( +.\"O A useful item (pick-axe, key, lamp...). +便利なアイテム(つるはし、鍵、ランプ…)。 +.lp """ +.\"O An amulet or a spider web. +.lp * +.\"O A gem or rock (possibly valuable, possibly worthless). +宝石または岩(貴重なものかもしれないし、価値のないものかもしれない)。 +.lp ` +.\"O A boulder or statue. +岩、または彫像。 +.lp 0 +.\"O An iron ball. +鉄球。 +.lp _ +.\"O An altar, or an iron chain. +祭壇、または鉄の鎖。 +.lp { +.\"O A fountain. +泉 +.lp } +.\"O A pool of water or moat or a pool of lava. +水たまり、または堀、または溶岩の海。 +.lp "\e +.\"O An opulent throne. +豪華な王座 +.\"O .lp "a-zA-Z and other symbols +.lp "a-zA-Z およびその他のシンボル +.\"O Letters and certain other symbols represent the various inhabitants +.\"O of the Mazes of Menace. Watch out, they can be nasty and vicious. +.\"O Sometimes, however, they can be helpful. +これらの文字とその他のいくつかのシンボルは恐怖の迷宮のいろいろな住人たちを表す。 +彼らは不機嫌で悪意に満ちているかも知れないので警戒しなければならない。 +が、ときには何かの手助けになることもある。 +.lp I +.\"O This marks the last known location of an invisible or otherwise unseen +.\"O monster. Note that the monster could have moved. The 'F' and 'm' commands +.\"O may be useful here. +このマークは透明、あるいはその他の見えない怪物が最後にいたらしい場所に表示される。 +怪物はすでに移動しているかもしれないことに注意すること。 +ここでは'F'と'm'のコマンドが便利だろう。 +.pg +.\"O You need not memorize all these symbols; you can ask the game what any +.\"O symbol represents with the `/' command (see the next section for +.\"O more info). +これらのシンボルをすべて記憶する必要はない。`/' コマンドでどのシンボ +ルが何を表すか知ることができる(詳細は次の項を参照のこと)。 + +.hn 1 +.\"O Commands +コマンド +.pg +.\"O Commands are initiated by typing one or two characters. Some commands, +.\"O like ``search'', do not require that any more information be collected by +.\"O NetHack. Other commands might require additional information, for +.\"O example a direction, or an object to be used. For those commands that +.\"O require additional information, NetHack will present you with either a +.\"O menu of choices or with a command line prompt requesting information. Which +.\"O you are presented with will depend chiefly on how you have set the +.\"O .op menustyle +.\"O option. +コマンドは 1 文字か 2 文字のキー入力を行うことで実行される。 +いくつかのコマンド、例えば``search''はそれ以上 NetHack に情報を与える必要がない。 +他のコマンドは例えば方向や使用する物などの情報をさらに与える必要がある。 +これらさらなる情報を必要とするコマンドに対しては、 +NetHack は選択メニューもしくはコマンドラインプロンプトのいずれかを表示する。 +どちらが表示されるかは主として +.op menustyle +オプションをどのように設定したかによる。 +.pg +.\"O For example, a common question, in the form ``What do you want to +.\"O use?\ [a-zA-Z\ ?*]'', asks you to choose an object you are carrying. +.\"O Here, ``a-zA-Z'' are the inventory letters of your possible choices. +.\"O Typing `?' gives you an inventory list of these items, so you can see +.\"O what each letter refers to. In this example, there is also a `*' +.\"O indicating that you may choose an object not on the list, if you +.\"O wanted to use something unexpected. Typing a `*' lists your entire +.\"O inventory, so you can see the inventory letters of every object you're +.\"O carrying. Finally, if you change your mind and decide you don't want +.\"O to do this command after all, you can press the ESC key to abort the +.\"O command. +例えば ``What do you want to use?\ [a-zA-Z\ ?*]'' という形式の質問がよくあるが、 +これはあなたに持っている物のうちどれを選ぶかを尋ねるものである。 +この質問において「a-zA-Z」はあなたが選べる持物の目録記号である。 +`?' を入力するとこれらの物の目録一覧が得られ、 +個々の記号が何を表しているのか知ることができる。 +この例では、`*' もある。これは一覧には表示されておらず、 +通常そのコマンドでの使用を想定していない物でも、使おうと思えばそれを +選ぶことができることを示している。`*' を入力するとすべての持物の目録が +表示され、個々の持物すべてについての目録記号を知ることができる。 +考え直して結局このコマンドを使わないことにしたときには ESC キーを押せば +コマンドを終了することができる。 +.pg +.\"O You can put a number before some commands to repeat them that many +.\"O times; for example, ``10s'' will search ten times. If you have the +.\"O .op number_pad +.\"O option set, you must type `n' to prefix a count, so the example above +.\"O would be typed ``n10s'' instead. Commands for which counts make no +.\"O sense ignore them. In addition, movement commands can be prefixed for +.\"O greater control (see below). To cancel a count or a prefix, press the +.\"O ESC key. +コマンドの中には、その前に数字を入力することで何回も繰り返すこと +ができるものもある。例えば「10s」は 10 回の探索を表している。もし +.op number_pad +オプションがオンのときには数字の前に `n' を入力しなければならない。 +つまり上の例では代わりに「n 10s」と入力しなければならない。 +複数回実行することが無意味なコマンドではこれは無視される。 +さらに、移動コマンドの前に特定の文字(プレフィックス)を付けることによって +さまざまな移動方法をとることができる(後述)。 +繰り返し回数やプレフィックスを取り消すためには ESC キーを押せばよい。 +.pg +.\"O The list of commands is rather long, but it can be read at any time +.\"O during the game through the `?' command, which accesses a menu of +.\"O helpful texts. Here are the commands for your reference: +コマンドの一覧はかなり長いが、ゲーム中に `?' コマンドを使用して +ヘルプメニューを見ることにより、いつでもコマンドの一覧を見ることができる。 +以下はコマンドの一覧である。 +.lp ? +.\"O Help menu: display one of several help texts available. +ヘルプメニュー: 表示可能なヘルプ画面のうちの 1 つを表示する。 +.lp / +.\"O Tell what a symbol represents. You may choose to specify a location +.\"O or type a symbol (or even a whole word) to explain. +シンボルが何を意味するかを示す。指定するには場所を示すか、 +またはシンボル(あるいは単語全体)を入力するかを選択することができる。 +.\"O Specifying a location is done by moving the cursor to a particular spot +.\"O on the map and then pressing one of `.', `,', `;', +.\"O or `:'. `.' will explain the symbol at the chosen location, +.\"O conditionally check for ``More info?'' depending upon whether the +.\"O .op help +.\"O option is on, and then you will be asked to pick another location; +.\"O `,' will explain the symbol but skip any additional +.\"O information; `;' will skip additional info and also not bother asking +.\"O you to choose another location to examine; `:' will show additional +.\"O info, if any, without asking for confirmation. When picking a location, +.\"O pressing the ESC key will terminate this command, or pressing `?' +.\"O will give a brief reminder about how it works. +.pg +場所の指定は、適切な位置までカーソルを移動させてから`.'、`,'、`;'、`:'の +どれかを押すことによって行なう。 +`.'を押すと、選んだ場所で表示されているシンボルの説明が表示され、 +もし +.op help +オプションがオンなら場合によっては``More info?''(詳細を見る?)と質問され、 +それからさらに他の場所を指定することができる。 +`,'を押すと、シンボルの説明が表示されるが、詳細情報は表示されない。 +`;'を押すと、詳細情報は表示されず、さらに他の場所の指定もできない。 +`:'を押すと、(もしあるなら)確認なしで詳細情報が表示される。 +場所を選ぶ時に ESC キーを押すことによってこのコマンドを中断でき、 +`?'を押すとどのように動作するかの簡単な説明が表示される。 +.\"O Specifying a name rather than a location +.\"O always gives any additional information available about that name. +場所でなく名前を指定した場合は、 +常にその名前に対する追加情報が表示される。 +.lp & +.\"O Tell what a command does. +コマンドの動作を示す。 +.lp < +.\"O Go up to the previous level (if you are on a staircase or ladder). +上の階へ行く(階段やはしごにいるとき)。 +.lp > +.\"O Go down to the next level (if you are on a staircase or ladder). +下の階へ行く(階段やはしごにいるとき)。 +.lp [yuhjklbn] +.\"O Go one step in the direction indicated (see Figure 2). If you sense +.\"O or remember +.\"O a monster there, you will fight the monster instead. Only these +.\"O one-step movement commands cause you to fight monsters; the others +.\"O (below) are ``safe.'' +指定した方向へ一歩進む(図 2 参照)。その方向に怪物がいると感じているか +覚えているときは、 +移動するのではなく怪物と戦うことになる。 +怪物と戦うことになるのはこの一歩移動のコマンドだけである。 +その他のコマンド(後述)は「安全」である。 +.sd +.TS S +center; +c c. +y k u 7 8 9 +\e | / \e | / +h- . -l 4- . -6 +/ | \e / | \e +b j n 1 2 3 +.\"O (if \fBnumber_pad\fP is set) + (\fBnumber_pad\fP がオンのとき) +.TE +.ed +.ce 1 +Figure 2 + +.lp [YUHJKLBN] +.\"O Go in that direction until you hit a wall or run into something. +壁に突き当たるか何かに衝突するまで指定した方向に進む。 +.lp m[yuhjklbn] +.\"O Prefix: move without picking up objects or fighting (even if you remember +.\"O a monster there) +プレフィックス: 物を拾ったり、 +(たとえそこに怪物がいると思っていても)戦ったりせずに移動する。 +.lp F[yuhjklbn] +.\"O Prefix: fight a monster (even if you only guess one is there) +プレフィックス: (そこに怪物がいると予想しているだけでも)怪物と戦う +.lp M[yuhjklbn] +.\"O Prefix: move far, no pickup. +プレフィックス: 物を拾わずに遠くへ移動する。 +.lp "g[yuhjklbn] +.\"O Prefix: move until something interesting is found. +プレフィックス: 何かが見つかるまで移動する。 +.lp "G[yuhjklbn] or [yuhjklbn] +.\"O Prefix: same as `g', but forking of corridors is not considered interesting. +プレフィックス: 'g' と同じ。ただし通路の分岐点では止まらない。 +.lp _ +.\"O Travel to a map location via a shortest-path algorithm. The shortest path +.\"O is computed over map locations the hero knows about (e.g. seen or +.\"O previously traversed). If there is no known path, a guess is made instead. +指定された位置まで、最短距離アルゴリズムを用いて移動する。 +最短距離は、あなたが知っている(見た、または以前に通った)地図配置を +基に計算される。 +知っている道がない場合、代わりに推測が行われる。 +.\"マウスに対応している版では、現在位置以外の位置を +.\"マウスでクリックしたときにもこのコマンドが発動する。 +.\"O Stops on most of +.\"O the same conditions as the `G' command, but without picking up +.\"O objects, similar to the `M' command. For ports with mouse +`G'コマンドとほぼ同じ条件で停止するが、 +`M'コマンドと同様に物を拾わないで移動する。 +.lp . +.\"O Rest, do nothing for one turn. +休憩する。1 ターン何もしない。 +.lp a +.\"O Apply (use) a tool (pick-axe, key, lamp...). +道具(つるはし、鍵、ランプ…)を用いる(使う)。 +.lp A +.\"O Remove one or more worn items, such as armor. +.\"O Use `T' (take off) to take off only one piece of armor +.\"O or `R' (remove) to take off only one accessory. +1 つまたは複数の身につけているもの(防具など)をはずす。防具を1 +つだけはずすときには 'T'(take off: 防具をはずす)を、アクセサリを +1 つだけはずすときは 'R'(remove: アクセサリをはずす)を使用せよ。 +.lp ^A +.\"O Redo the previous command. +1 つ前のコマンドを繰り返す。 +.lp c +.\"O Close a door. +扉を閉じる。 +.lp C +.\"O Call (name) an individual monster. +個々の怪物に名前を付ける。 +.lp ^C +.\"O Panic button. Quit the game. +パニックボタン。ゲームを放棄する。 +.lp d +.\"O Drop something. Ex. ``d7a'' means drop seven items of object \fIa\fP. +何かを下に置く。例:「d7a」は a という物を 7 個下に置くことを意味する。 +.lp D +.\"O Drop several things. In answer to the question +.\"O ``What kinds of things do you want to drop? [!%= BUCXaium]'' +.\"O you should type zero or more object symbols possibly followed by +.\"O `a' and/or `i' and/or `u' and/or `m'. In addition, one or more of +.\"O the blessed/uncursed/cursed groups may be typed. +いくつかの物を下に置く。``What kinds of things do you want to drop?[!%= BUCXaium]'' +(どの種類のものを置きますか?) +の質問に対して、0 個以上の物のシンボルを入力することで答える。 +さらに`a', `i', `m', `u' をその後に入力することもできる。 +加えて、祝福された(B)/呪われていない(U)/呪われた(C)アイテムを指定することもできる。 +.sd +.si +.\"O DB - drop all objects known to be blessed. +.\"O DU - drop all objects known to be uncursed. +.\"O DC - drop all objects known to be cursed. +.\"O DX - drop all objects of unknown B/U/C status. +.\"O Da - drop all objects, without asking for confirmation. +.\"O Di - examine your inventory before dropping anything. +.\"O Du - drop only unpaid objects (when in a shop). +.\"O Dm - use a menu to pick which object(s) to drop. +.\"O D%u - drop only unpaid food. +DB - 祝福されていると判明している物全てを下に置く。 +DU - 呪われていないと判明している物全てを下に置く。 +DC - 呪われていると判明している物全てを下に置く。 +DX - 祝福/呪いが判明していない物全てを下に置く。 +Da - 確認なしにすべての物を下に置く。 +Di - 物を置く前に持ち物を確認する。 +Du - (店にいるとき)代金未払の物だけを下に置く。 +Dm - 置く物を選ぶのにメニューを用いる。 +D%u - 代金未払の食料だけを下に置く。 +.ei +.ed +.lp ^D +.\"O Kick something (usually a door). +何か(普通は扉)を蹴る。 +.lp e +.\"O Eat food. +食料を食べる。 +.\"O .\" Make sure Elbereth is not hyphenated below, the exact spelling matters +.hw Elbereth +.lp E +.\"O Engrave a message on the floor. +.\"O Engraving the word ``Elbereth'' will cause most monsters to not attack +.\"O you hand-to-hand (but if you attack, you will rub it out); this is +.\"O often useful to give yourself a breather. (This feature may be compiled out +.\"O of the game, so your version might not have it.) +床にメッセージを刻み込む。``Elbereth'' という語を刻み込むと、 +たいていの怪物はあなたに白兵戦を挑んで来なくなる +(しかしあなたが攻撃をすると文字は消えてしまう)。 +これは、一息いれたいときになかなか便利である。 +(この機能はコンパイル時に削除されているかも知れないので、 +あなたのバージョンで必ずしも機能するとは限らない。) +.sd +.si +.\"O E- - write in the dust with your fingers. +E- - ほこりの中に指で書く。 +.ei +.ed +.lp f +.\"O Fire one of the objects placed in your quiver. You may select +.\"O ammunition with a previous `Q' command, or let the computer pick +.\"O something appropriate if +.\"O .op autoquiver +.\"O is true. +矢筒に入れてあるものを発射する。 +発射するものは予め`Q'コマンドで選択することも出来るし、 +.op autoquiver +オプションが設定されている場合は、コンピューターに +自動的に適当なものを設定させることもできる。 +.lp i +.\"O List your inventory (everything you're carrying). +持物の目録(持っている物すべて)を表示する。 +.lp I +.\"O List selected parts of your inventory. +持物の目録のうち指定した一部を表示する。 +.sd +.si +.\"O I* - list all gems in inventory; +.\"O Iu - list all unpaid items; +.\"O Ix - list all used up items that are on your shopping bill; +.\"O I$ - count your money. +I* - 持物のうち宝石をすべて表示する。 +Iu - 代金未払いの物をすべて表示する。 +Ix - 代金未払いだが使ってしまった物をすべて表示する。 +I$ - お金を数える。 +.ei +.ed +.lp o +.\"O Open a door. +扉を開ける。 +.lp O +.\"O Set options. A menu showing the current option values will be +.\"O displayed. You can change most values simply by selecting the menu +.\"O entry for the given option (ie, by typing its letter or clicking upon +.\"O it, depending on your user interface). For the non-boolean choices, +.\"O a further menu or prompt will appear once you've closed this menu. +オプションを設定する。 +現在のオプションの値の一覧が表示される。 +(見出し文字をタイプするかクリックすることによって)変更したいオプションを選んで、 +ほとんどの値を変更することができる。 +ブール値でないオプションの場合は、さらにメニューが出るか、プロンプトが出る。 +.\"O The available options +.\"O are listed later in this Guidebook. Options are usually set before the +.\"O game rather than with the `O' command; see the section on options below. +設定可能なオプションはこのガイドブックの後ほどに一覧がある。 +オプションは通常は `O' コマンドではなく、ゲームを始める前に設定する。 +後述のオプションの項を参照のこと。 +.lp p +.\"O Pay your shopping bill. +代金を払う。 +.lp P +.\"O Put on a ring or other accessory (amulet, blindfold). +指輪、あるいはその他の装飾品(魔除け、目隠し)を身につける。 +.lp ^P +.\"O Repeat previous message. Subsequent ^P's repeat earlier messages. +.\"O The behavior can be varied via the msg_window option. +1 つ前のメッセージをもう一度表示する。 +続けて ^P を入力するとさらに前のメッセージが順に表示される。 +この振る舞いは msg_windows オプションによって変化する。 +.lp q +.\"O Quaff (drink) something (potion, water, etc). +何か(水薬,水など)を飲む。 +.lp Q +.\"O Select an object for your quiver. You can then throw this using +.\"O the `f' command. (In versions prior to 3.3 this was the command to quit +.\"O the game, which has now been moved to `#quit'.) +矢筒に入れるものを選択する。 +ここで選択したものは`f'コマンドで発射することができる。 +(バージョン 3.3 以前ではこのコマンドはゲームを放棄するものだったが、 +その機能は`#quit'に移動した) +.lp r +.\"O Read a scroll or spellbook. +巻物や魔法書を読む。 +.lp R +.\"O Remove an accessory (ring, amulet, etc). +装飾品(指輪、魔除けなど)をはずす。 +.lp ^R +.\"O Redraw the screen. +画面を描き直す。 +.lp s +.\"O Search for secret doors and traps around you. It usually takes several +.\"O tries to find something. +周囲の隠し扉や罠を探す。何かを見つけるには普通何回も探す必要がある。 +.lp S +.\"O Save (and suspend) the game. The game will be restored automatically the +.\"O next time you play. +ゲームをセーブして、中断する。ゲームは次回プレイ時に自動的に復旧される。 +.lp t +.\"O Throw an object or shoot a projectile. +物を投げる。または矢などを発射する。 +.lp T +.\"O Take off armor. +防具をはずす。 +.lp ^T +.\"O Teleport, if you have the ability. +テレポート能力があればテレポートする。 +.lp v +.\"O Display version number. +バージョン番号を表示する。 +.lp V +.\"O Display the game history. +このゲームの履歴を表示する。 +.lp w +.\"O Wield weapon. +武器を持つ。 +.sd +.si +.\"O w- - wield nothing, use your bare hands. +w- - 武器として何も持たず素手になる。 +.ei +.ed +.lp W +.\"O Wear armor. +.lp x +.\"O Exchange your wielded weapon with the item in your alternate +.\"O weapon slot. The latter is used as your secondary weapon when engaging in +.\"O two-weapon combat. Note that if one of these slots is empty, +.\"O the exchange still takes place. +装備している武器を予備の武器と交換する。 +予備の武器は二刀流攻撃で用いられる。 +予備の武器がなくても交換は実行される(今持っているものを予備にして、 +素手になる)ことに注意。 +.lp X +.\"O Enter explore (discovery) mode, explained in its own section later. +後述する探検(発見)モードに入る。 +.lp ^X +.\"O Display your name, role, race, gender, and alignment as well as +.\"O the various deities in your game. +あなたの名前、職業、種族、性別、属性および、今回のゲームにおける +さまざまな神の名前を表示する。 +.lp z +.\"O Zap a wand. To aim at yourself, use `.' for the direction. +杖を振る。自分に振る場合は、方向に`.'を使う。 +.lp Z +.\"O Zap (cast) a spell. To cast at yourself, use `.' for the direction. +呪文を唱える。自分に呪文を唱えたいときは、方向として`.'を使う。 +.lp ^Z +.\"O Suspend the game +.\"O .ux " versions with job control only)." ( +ゲームを一時中止する(ジョブコントロール機能のある +.ux +バージョンのみ)。 +.lp : +.\"O Look at what is here. +足元に何があるか見る。 +.lp ; +.\"O Show what type of thing a visible symbol corresponds to. +見えているシンボルが何を示すかを表示する。 +.lp , +.\"O Pick up some things. May be preceded by `m' to force a selection menu. +何かを拾う。`m'の後に押すことによって、設定に関わらず選択メニューを表示する。 +.lp @ +.\"O Toggle the +.\"O .op autopickup +.\"O option on and off. +.op autopickup +オプションのオン・オフを切り替える。 +.lp ^ +.\"O Ask for the type of a trap you found earlier. +今までに発見した罠の種類を調べる。 +.lp ) +.\"O Tell what weapon you are wielding. +持っている武器を表示する。 +.lp [ +.\"O Tell what armor you are wearing. +付けている防具を表示する。 +.lp = +.\"O Tell what rings you are wearing. +はめている指輪を表示する。 +.lp """ +.\"O Tell what amulet you are wearing. +付けている魔除けを表示する。 +.lp ( +.\"O Tell what tools you are using. +使っている道具を表示する。 +.lp * +.\"O Tell what equipment you are using; combines the preceding five type-specific +.\"O commands into one. +装備しているものを表示する。上の 5 つのコマンドを一つにしたもの。 +.lp $ +.\"O Count your gold pieces. +持っている金貨を数える。 +.lp + +.\"O List the spells you know. Using this command, you can also rearrange +.\"O the order in which your spells are listed. They are shown via a menu, +.\"O and if you select a spell in that menu, you'll be re-prompted for +.\"O another spell to swap places with it, and then have opportunity to +.\"O make further exchanges. +知っている呪文の一覧を表示する。 +このコマンドによって、呪文の表示される順番を変えることもできる。 +呪文をメニュー形式で表示させ、まず一つ目の呪文を選択し、 +さらに入れ替えたい呪文を選択することによって順番が入れ替わる。 +さらに入れ替えたい場合はこの操作を繰り返す。 +.lp "\e +.\"O Show what types of objects have been discovered. +今までにどんな種類の物を見つけたかを表示する。 +.lp ! +.\"O Escape to a shell. +シェルに抜ける。 +.lp # +.\"O Perform an extended command. As you can see, the authors of NetHack +.\"O used up all the letters, so this is a way to introduce the less frequently +.\"O used commands. +.\"O What extended commands are available depends on what features the game was +.\"O compiled with. +拡張コマンドを実行する。以上から分かるように +NetHack の作者たちはすべての文字を使い果たしてしまったので、 +あまり頻繁に使われないコマンドはこのようにして導入された。 +どの拡張コマンドが使用可能かは、 +ゲームのコンパイル時にどの機能が有効にされたかによる。 +.lp #adjust +.\"O Adjust inventory letters (most useful when the +.\"O .op fixinv +.\"O option is ``on''). +持物の目録記号を変更する( +.op fixinv +オプションが「オン」の時に非常に便利である)。 +.lp #chat +.\"O Talk to someone. +誰かと話をする。 +.lp #conduct +.\"O List which challenges you have adhered to. See the section below entitled +.\"O ``Conduct'' for details. +どの挑戦がまだ守られているかを表示する。詳しくは後述する「制限プレイ」の章を +参照すること。 +.lp #dip +.\"O Dip an object into something. +物を何かに浸す。 +.lp #enhance +.\"O Advance or check weapons and spell skills. +武器の技量を高めたり、調べたりする。 +.lp #force +.\"O Force a lock. +錠をこじ開ける。 +.lp #invoke +.\"O Invoke an object's special powers. +物が持つ特別な能力を発動する。 +.lp #jump +.\"O Jump to another location. +別の場所へジャンプする。 +.lp #loot +.\"O Loot a box or bag on the floor beneath you, or the saddle +.\"O from a horse standing next to you. +あなたのそばにある床に置いてある箱や鞄、またはあなたの隣に立っている馬の +鞍の中身を調べる。 +.lp #monster +.\"O Use a monster's special ability (when polymorphed into monster form). +(怪物の姿に変化している時に)怪物の特殊能力を使う。 +.lp #name +.\"O Name an item or type of object. +物や物の種類に名前を付ける。 +.lp #offer +.\"O Offer a sacrifice to the gods. +神にいけにえを捧げる。 +.lp #pray +.\"O Pray to the gods for help. +神に祈って助けを求める。 +.lp #quit +.\"O Quit the program without saving your game. +ゲームをセーブせずにプログラムを終了する。 +.lp #ride +.\"O Ride (or stop riding) a monster. +怪物に乗る(あるいは乗るのをやめる)。 +.lp #rub +.\"O Rub a lamp or a stone. +ランプや石をこする。 +.lp #sit +.\"O Sit down. +座る。 +.lp #turn +.\"O Turn undead. +不死の怪物を追い払う。 +.lp #twoweapon +.\"O Toggle two-weapon combat on or off. Note that you must +.\"O use suitable weapons for this type of combat, or it will +.\"O be automatically turned off. +二刀流戦闘のオン・オフを切り替える。 +二刀流に適切な武器を使うこと。 +さもなければ自動的にオフになる。 +.lp #untrap +.\"O Untrap something (trap, door, or chest). +何か(罠、扉、宝箱)の罠をはずす。 +.lp #version +.\"O Print compile time options for this version of NetHack. +このバージョンの NetHack をコンパイルしたときのオプションを表示する。 +.lp #wipe +.\"O Wipe off your face. +顔を拭う。 +.lp #? +.\"O Help menu: get the list of available extended commands. +ヘルプメニュー: 利用可能な拡張コマンドの一覧を表示する。 +.pg +.\"O If your keyboard has a meta key (which, when pressed in combination +.\"O with another key, modifies it by setting the `meta' [8th, or `high'] +.\"O bit), you can invoke many extended commands by meta-ing the first +.\"O letter of the command. +.\"O .\" In {\it NT, OS/2, PC\/ {\rm and} ST NetHack}, +.\"O .\" the `Alt' key can be used in this fashion; +.\"O .\" on the Amiga set the {\it altmeta\/} option to get this behavior. +.\"O In NT, OS/2, and PC NetHack, the `Alt' key +.\"O can be used in this fashion. +もしあなたのキーボードにメタキー +(別のキーと一緒に押すことによって +そのキーの`メタ'[第 8、または`上位']ビットをセットする)があれば、 +コマンドの頭文字をメタキーと一緒に押すことによって多くの +拡張コマンドを起動することができる。 +.\" NT, OS/2, PC および ST NetHack では 'Alt' キーがこの目的に使われる. +NT, OS/2, PC NetHack では 'Alt' キーがこの目的に使われる. +.\" (Amiga ではこれを用いるには altmetaオプションをセットする。) +.lp M-? +.\"O #? (not supported by all platforms) +#? (対応していないプラットホームもある) +.lp M-2 +.\"O #twoweapon (unless the number_pad option is enabled) +#twoweapon (number_pad がオフの場合) +.lp M-a +#adjust +.lp M-c +#chat +.lp M-d +#dip +.lp M-e +#enhance +.lp M-f +#force +.lp M-i +#invoke +.lp M-j +#jump +.lp M-l +#loot +.lp M-m +#monster +.lp M-n +#name +.lp M-o +#offer +.lp M-p +#pray +.lp M-q +#quit +.lp M-r +#rub +.lp M-s +#sit +.lp M-t +#turn +.lp M-u +#untrap +.lp M-v +#version +.lp M-w +#wipe +.pg +.\"O If the +.\"O .op number_pad +.\"O option is on, some additional letter commands are available: +.op number_pad +オプションがオンのときは、これらに加えいくつかの文字コマンドが有効になる。 +.lp h +.\"O Help menu: display one of several help texts available, like ``?''. +ヘルプメニュー: ``?'' と同様にヘルプメニューを表示する。 +.lp j +.\"O Jump to another location. Same as ``#jump'' or ``M-j''. +別の場所へジャンプする。「#jump」や「M-j」と同じ。 +.lp k +.\"O Kick something (usually a door). Same as `^D'. +何か(通常は扉)を蹴る。'^D' と同じ。 +.lp l +.\"O Loot a box or bag on the floor beneath you, or the saddle +.\"O from a horse standing next to you. Same as ``#loot'' or ``M-l''. +あなたのそばにある床に置いてある箱や鞄、またはあなたの隣に立っている馬の +鞍の中身を調べる。「#loot」や「M-l」と同じ。 +.lp N +.\"O Name an item or type of object. Same as ``#name'' or ``M-n''. +物や物の種類に名前を付ける。「#name」や「M-n」と同じ。 +.lp u +.\"O Untrap a trap, door, or chest. Same as ``#untrap'' or ``M-u''. +罠、扉、宝箱などの仕掛けられた罠をはずす。「#untrap」や「M-u」と同じ。 + +.hn 1 +.\"O Rooms and corridors +部屋と通路 +.pg +.\"O Rooms and corridors in the dungeon are either lit or dark. +.\"O Any lit areas within your line of sight will be displayed; +.\"O dark areas are only displayed if they are within one space of you. +.\"O Walls and corridors remain on the map as you explore them. +洞窟内の部屋や通路は明りがついていることもあるし、ついていないこともある。 +明りのついている部分で自分の視野に入る部分は画面に表示される。 +暗いところでは周囲 1 つ分の空間だけが見える。 +壁や通路は画面に表示されたままになる。 +.pg +.\"O Secret corridors are hidden. You can find them with the `s' (search) +.\"O command. +隠し通路は表示されない。これらは `s'(search: 探す) コマンドで +発見することができる。 +.hn 2 +.\"O Doorways +出入口 +.pg +.\"O Doorways connect rooms and corridors. Some doorways have no doors; +.\"O you can walk right through. Others have doors in them, which may be +.\"O open, closed, or locked. To open a closed door, use the `o' (open) +.\"O command; to close it again, use the `c' (close) command. +出入口は部屋と通路を接続するものである。出入口の中には扉のないものがある。 +このときにはそのまま通り抜けることができる。その他の出入口には扉があるが、 +その扉は開いているか、閉じているか、錠がかかっているかのいずれかである。 +閉じている扉を開けるには `o'(open: 扉を開ける) コマンドを +用いる。再び扉を閉じるには `c'(close: 扉を閉じる) コマンドを用いる。 +.pg +.\"O You can get through a locked door by using a tool to pick the lock +.\"O with the `a' (apply) command, or by kicking it open with the `^D' +.\"O (kick) command. +扉に錠がかかっているときは `a'(apply: 道具を用いる) コマンドで錠をはずす +道具を使うか、`^D'(kick: 蹴る) コマンドで扉を蹴破ることで +通ることができる。 +.pg +.\"O Open doors cannot be entered diagonally; you must approach them +.\"O straight on, horizontally or vertically. Doorways without doors are +.\"O not restricted in this fashion. +開いた扉に斜めから入ることはできない。水平あるいは垂直方向から真っ直ぐに +近付かなければならない。扉のない出入口にはこのような制限はない。 +.pg +.\"O Doors can be useful for shutting out monsters. Most monsters cannot +.\"O open doors, although a few don't need to (ex. ghosts can walk through +.\"O doors). +扉は怪物を締め出すのに役に立つ。たいていの怪物は扉を開けることができない。 +けれどもいくつかの怪物にとっては扉を開ける必要などない(例: 亡霊は +扉を通り抜けることができる)。 +.pg +.\"O Secret doors are hidden. You can find them with the `s' (search) +.\"O command. Once found they are in all ways equivalent to normal doors. +隠し扉は表示されない。これらは `s'(search: 探す) コマンドで発見する +ことができる。一度発見すると普通の扉と同様になる。 +.hn 2 +.\"O Traps (`^') +罠 (`^') +.pg +.\"O There are traps throughout the dungeon to snare the unwary delver. +.\"O For example, you may suddenly fall into a pit and be stuck for a few +.\"O turns trying to climb out. Traps don't appear on your map until you +.\"O see one triggered by moving onto it, see something fall into it, or you +.\"O discover it with the `s' (search) command. Monsters can fall prey to +.\"O traps, too, which can be a very useful defensive strategy. +そそっかしい冒険者を陥れようとする罠が洞窟のあちこちにある。 +例えば落し穴に落ちると上り出るのに数ターンの間その場から動けなくなるであろう。 +そこに誰かが足を踏み入れて引っかかるか、`s'(search: 探す) コマンドで見つけるか +して初めて罠は表示される。怪物も罠の餌食になることがある。これは非常に有効な +防御戦術である。 +.\"O .pg +.\"O There is a special pre-mapped branch of the dungeon based on the +.\"O classic computer game ``Sokoban.'' The goal is to push the boulders +.\"O into the pits or holes. With careful foresight, it is possible to +.\"O complete all of the levels according to the traditional rules of +.\"O Sokoban. Some allowances are permitted in case the player gets stuck; +.\"O however, they will lower your luck. +古典的コンピュータゲームである「倉庫番」を基にした特別なダンジョンへの +分かれ道も存在する。 +このダンジョンでの目的は大岩を落し穴に入れることである。 +慎重に先読みすれば、全ての階は倉庫番の伝統のルールでクリアできる。 +行き詰まってしまった冒険者のためにいくつかの助け舟が用意されているが、 +これらは運を低下させてしまう。 +.hn 2 +.\"O Stairs (`<', `>') +階段 (`<', `>') +.pg +.\"O In general, each level in the dungeon will have a staircase going up +.\"O (`<') to the previous level and another going down (`>') to the next +.\"O level. There are some exceptions though. For instance, fairly early +.\"O in the dungeon you will find a level with two down staircases, one +.\"O continuing into the dungeon and the other branching into an area +.\"O known as the Gnomish Mines. Those mines eventually hit a dead end, +.\"O so after exploring them (if you choose to do so), you'll need to +.\"O climb back up to the main dungeon. +一般的に洞窟の各階には、前の階への上り階段('<')と、 +次の階への下り階段('>')がひとつずつある。 +しかし、例外もある。 +例えば、洞窟の比較的浅い階であなたは二つの下り階段がある階を発見するだろう。 +ひとつは洞窟の続きであり、 +もうひとつはノームの坑道として知られる地帯に続いている。 +この坑道は最後には行き止まりになっていて、 +ここを探検した(あなたがそうすることを選択した場合)後、 +元の洞窟にまで戻って来る必要がある。 +.pg +.\"O When you traverse a set of stairs, or trigger a trap which sends you +.\"O to another level, the level you're leaving will be deactivated and +.\"O stored in a file on disk. If you're moving to a previously visited +.\"O level, it will be loaded from its file on disk and reactivated. If +.\"O you're moving to a level which has not yet been visited, it will be +.\"O created (from scratch for most random levels, from a template for +.\"O some ``special'' levels, or loaded from the remains of an earlier game +.\"O for a ``bones'' level as briefly described below). Monsters are only +.\"O active on the current level; those on other levels are essentially +.\"O placed into stasis. +階段を使うか、あるいは他の階に移動する罠に引っ掛かった場合、 +いままでいた階は非活性化されて、ディスク上のファイルに貯えられる。 +昔訪れた階に再び訪れた場合、ディスク上のファイルが読み込まれて再活性化される。 +初めて訪れる階に移動した場合、その階は(ほとんどの階は一から、 +「特別な」階はテンプレートから、「骨の」階(後述)の場合はファイルから読み込んで) +新たに作成される。 +怪物は現在の階にいるものだけが行動する。 +他の階にいるものは止まっている。 +.pg +.\"O Ordinarily when you climb a set of stairs, you will arrive on the +.\"O corresponding staircase at your destination. However, pets (see below) +.\"O and some other monsters will follow along if they're close enough when +.\"O you travel up or down stairs, and occasionally one of these creatures +.\"O will displace you during the climb. When that occurs, the pet or other +.\"O monster will arrive on the staircase and you will end up nearby. +普通、あなたが階段を使うと、あなたは目的地で対応する階段の上に現れる。 +しかし、ペット(後述)といくつかの怪物はあなたが階段を上り降りした時についてきて、 +時々それらの一体があなたと入れ替わることがある。 +こうなった場合、ペットやその他の怪物が階段の上に現れ、 +あなたはそのそばに現れる。 +.hn 2 +.\"O Ladders (`<', `>') +はしご (`<', `>') +.pg +.\"O Ladders serve the same purpose as staircases, and the two types of +.\"O inter-level connections are nearly indistinguishable during game play. +はしごは階段と同じ役目であり、階を繋ぐこの二つの種類は +ゲーム中ほとんど区別ができない。 +.hn 2 +.\"O Shops and shopping +店と買い物 +.pg +.\"O Occasionally you will run across a room with a shopkeeper near the door +.\"O and many items lying on the floor. You can buy items by picking them +.\"O up and then using the `p' command. You can inquire about the price +.\"O of an item prior to picking it up by using the ``#chat'' command +.\"O while standing on it. Using an item prior to paying for it will incur a +.\"O charge, and the shopkeeper won't allow you to leave the shop until you +.\"O have paid any debt you owe. +時々ドアのそばに店主がいて、床にたくさんの物が置いてある部屋に +行き当たることがある.物を拾って、`p'コマンドを使うことで +物を買うことができる. +物を拾う前に、物の上に立って``#chat''コマンドを使うことで値段を確認できる. +支払いをする前に物を使うと借金になり、店主は債務を支払うまでは +店の外に出してくれなくなる. +.pg +.\"O You can sell items to a shopkeeper by dropping them to the floor while +.\"O inside a shop. You will either be offered an amount of gold and asked +.\"O whether you're willing to sell, or you'll be told that the shopkeeper +.\"O isn't interested (generally, your item needs to be compatible with the +.\"O type of merchandise carried by the shop). +店の中にいるときに物を落すことで物を店主に売ることができる. +売却価格を提示され、売るかどうかを確認されるか、 +単に店主が興味がないことを知らされる(一般的に、 +店で売っている物と同じ種類の物が買い取り対象である)。 +.pg +.\"O If you drop something in a shop by accident, the shopkeeper will usually +.\"O claim ownership without offering any compensation. You'll have to buy +.\"O it back if you want to reclaim it. +偶然で物を店の中に落してしまうと、店主は普通代償なしに所有権を主張する. +物を取り戻すためには買い戻す必要がある. +.pg +.\"O Shopkeepers sometimes run out of money. When that happens, you'll be +.\"O offered credit instead of gold when you try to sell something. Credit +.\"O can be used to pay for purchases, but it is only good in the shop where +.\"O it was obtained; other shopkeepers won't honor it. (If you happen to +.\"O find a "credit card" in the dungeon, don't bother trying to use it in +.\"O shops; shopkeepers will not accept it.) +店主は資金不足になることがある。こうなった場合、何かを売ろうとすると +現金の代わりに信用貸しを提案される。 +信用貸しは物を買うときに使えるが、同じ店でだけ有効である。 +他の店主は引き受けない。 +(迷宮で「クレジットカード」を手に入れることがあるが、 +これを店で使おうとしてはいけない。店主は受け入れない。) +.pg +.\"O The `$' command, which reports the amount of gold you are carrying +.\"O (in inventory, not inside bags or boxes), will also show current shop +.\"O debt or credit, if any. The `Iu' command lists unpaid items +.\"O (those which still belong to the shop) if you are carrying any. +.\"O The `Ix' command shows an inventory-like display of any unpaid +.\"O items which have been used up, along with other shop fees, if any. +`$'コマンドを使うと、今持ち運んでいる金貨の数(かばんや箱に入っているものは +除く)とともに、負債や信用貸しがあれば表示される。 +`Iu'コマンドは未払いの物(まだ店が所有する物)の一覧(あれば)を表示する。 +`Ix'コマンドは使ってしまった物の代金の一覧(あれば)が表示される。 +.hn 3 +.\"O Shop idiosyncracies +店の特殊な性質 +.pg +.\"O Several aspects of shop behavior might be unexpected. +.\"O .\" note: using * instead of \(bu is better for plain text output +店のいくつかの性質は意外なものかもしれない。 +.lp * 2 +.\"O The price of a given item can vary due to a variety of factors. +アイテムの値段は色々な要素によって様々に変化する。 +.lp * 2 +.\"O A shopkeeper treats the spot immediately inside the door as if it were +.\"O outside the shop. +店主はドアの一つ内側の場所は店の外として扱う。 +.lp * 2 +.\"O While the shopkeeper watches you like a hawk, he will generally ignore +.\"O any other customers. +店主はあなたを鷹のように注意深く見張っているが、 +一般的にその他の消費者については無視する。 +.lp * 2 +.\"O If a shop is "closed for inventory", it will not open of its own accord. +店が"closed for inventory"(「棚卸のため閉店」)の場合、 +待っていても開店はしない。 +.lp * 2 +.\"O Shops do not get restocked with new items, regardless of inventory depletion. +店は例え品物が枯渇しても新しいアイテムが入荷することはない。 + +.hn 1 +.\"O Monsters +怪物 +.pg +.\"O Monsters you cannot see are not displayed on the screen. Beware! +.\"O You may suddenly come upon one in a dark place. Some magic items can +.\"O help you locate them before they locate you (which some monsters can do +.\"O very well). +画面上にはあなたから見える怪物しか表示されないが、ひょっとすると闇の +中で怪物とばったり出くわすことになるかもしれないので注意が必要である。 +魔法のアイテムの中には、怪物があなたを発見するよりも前にあなたが怪物を +発見するのに役立つ物もある(しかしこの能力に大変優れている怪物もいる。) +.pg +.\"O The commands `/' and `;' may be used to obtain information about those +.\"O monsters who are displayed on the screen. The command `C' allows you +.\"O to assign a name to a monster, which may be useful to help distinguish +.\"O one from another when multiple monsters are present. Assigning a name +.\"O which is just a space will remove any prior name. +`/' コマンドと `;' コマンドが画面上に表示されている怪物に関する情報を得るのに用いられる。 +`C' コマンドは怪物に名前をつけるのに用いられ、 +複数の怪物がいる時に、ある怪物を他のものと見分けたいときに便利である。 +名前としてスペースを指定すると、以前につけた名前を消すことになる。 +.pg +.\"O The extended command ``#chat'' can be used to interact with an adjacent +.\"O monster. There is no actual dialog (in other words, you don't get to +.\"O choose what you'll say), but chatting with some monsters such as a +.\"O shopkeeper or the Oracle of Delphi can produce useful results. +拡張コマンド「#chat」によって、隣接する怪物と交流できる。 +実際の台詞は選択できない(言い換えると、あなたが何をしゃべるかは選べない)が、 +店主や Oracle of Delphi(デルファイの神殿)といった相手と話をすることは、 +有益な結果をもたらす。 + +.hn 2 +.\"O Fighting +戦闘 +.pg +.\"O If you see a monster and you wish to fight it, just attempt to walk +.\"O into it. Many monsters you find will mind their own business unless +.\"O you attack them. Some of them are very dangerous when angered. +.\"O Remember: discretion is the better part of valor. +発見した怪物と戦いたいときには、 +単にその怪物に向かって移動するようにすればよい。 +多くの怪物はあなたが戦いを挑まない限り、 +他のことを気にすることはない。 +腹を立てると大変危険な怪物もいる。 +「三十六計逃げるにしかず」ということわざを忘れずに。 +.pg +.\"O If you can't see a monster (if it is invisible, or if you are blinded), +.\"O the symbol `I' will be shown when you learn of its presence. +.\"O If you attempt to walk into it, you will try to fight it just like +.\"O a monster that you can see; of course, +.\"O if the monster has moved, you will attack empty air. If you guess +.\"O that the monster has moved and you don't wish to fight, you can use the `m' +.\"O command to move without fighting; likewise, if you don't remember a monster +.\"O but want to try fighting anyway, you can use the `F' command. +怪物が見えない(怪物が透明、またはあなたが目が見えない)場合、 +怪物がいるとあなたが思った位置に`I'の文字が表示される。 +その区画に歩こうとすると、見えている時と同じようにあなたは怪物に攻撃しようとする。 +もちろん、もし怪物が移動してしまっていたら、あなたの攻撃は空を切ることになる。 +もし怪物がすでに移動してしまっていると考え、戦いたくない場合は、 +`m'コマンドを使うことで戦うことなく移動できる。 +逆に、そこに怪物がいるかどうかわからないけれどもとにかく戦って見たい場合は、 +`F'コマンドが使える。 +.hn 2 +.\"O Your pet +ペット +.pg +.\"O You start the game with a little dog (`d'), cat (`f'), or pony (`u'), which +.\"O follows you about the dungeon and fights monsters with you. Like you, your +.\"O pet needs food to survive. It usually feeds itself on fresh carrion +.\"O and other meats. If you're worried about it or want to train it, you +.\"O can feed it, too, by throwing it food. A properly trained pet can be +.\"O very useful under certain circumstances. +あなたは仔犬(`d')、子猫(`f')、ポニー(`u')のいずれかとともにゲームを始める。 +あなたのペットはあなたとともに洞窟をさまよい、怪物と戦う。 +ペットはあなたと同様に生きのびるための食料を必要とする。 +ペットは新鮮な死肉やその他の肉をえさにしている。 +もしもペットのことが気がかりであったり、ペットを飼い慣らしておきたいと思うなら、 +あなたが直接えさを与えることもできる。 +そのためには食料をペットに向かって投げてやればよい。 +きちんと訓練されたペットはある種の状況のもとで極めて利用価値が高い。 +.pg +.\"O Your pet also gains experience from killing monsters, and can grow +.\"O over time, gaining hit points and doing more damage. Initially, your +.\"O pet may even be better at killing things than you, which makes pets +.\"O useful for low-level characters. +ペットも怪物を倒していくにつれて経験を積んでいく。 +また時間とともに成長もし、体力や相手に与えるダメージも増加する。 +初めのうちはあなたよりもペットの方が強いだろうから、 +レベルの低いキャラクタにとっては役に立つだろう。 +.pg +.\"O Your pet will follow you up and down staircases if it is next to you +.\"O when you move. Otherwise your pet will be stranded and may become +.\"O wild. Similarly, when you trigger certain types of traps which alter +.\"O your location (for instance, a trap door which drops you to a lower +.\"O dungeon level), any adjacent pet will accompany you and any non-adjacent +.\"O pet will be left behind. Your pet may trigger such traps itself; you +.\"O will not be carried along with it even if adjacent at the time. +あなたが他の階へ移動するとき、隣にペットを連れていればペットもあなた +について移動する。置き去りにすると野生化してしまうかもしれない。 +同様に、もしあなたが自分の位置が変わるような罠にかかった場合 +(例えば、トラップドアで下の階に落ちた場合)、 +隣にいたペットはついていき、隣にいなかったペットは取り残される。 +ペットが自分でそのような罠にかかることもある。 +あなたはたとえその時にペットの隣にいても一緒に移動することはない。 +.hn 2 +.\"O Steeds +軍馬 +.pg +.\"O Some types of creatures in the dungeon can actually be ridden if you +.\"O have the right equipment and skill. Convincing a wild beast to let +.\"O you saddle it up is difficult to say the least. Many a dungeoneer +.\"O has had to resort to magic and wizardry in order to forge the alliance. +ダンジョンにいるある種の生物は、あなたが正しい装備と能力を +持っていれば、乗ることができる。 +野生の生物にあなたが乗ることを納得させるのは困難である。 +多くの洞窟の主は協力関係をでっち上げるのに魔法の力に頼らなければならない。 +.\"O Once you do have the beast under your control however, you can +.\"O easily climb in and out of the saddle with the `#ride' command. Lead +.\"O the beast around the dungeon when riding, in the same manner as +.\"O you would move yourself. It is the beast that you will see displayed +.\"O on the map. +しかし、一旦動物をあなたの支配下に置いたなら、 +`#ride'コマンドで乗り降りすることができる。 +動物に乗って洞窟を移動する方法は、自分自身が移動するのと同じである。 +地図に表示されるのはあなたが乗っている動物である。 +.pg +.\"O Riding skill is managed by the `#enhance' command. See the section +.\"O on Weapon proficiency for more information about that. +乗馬技術は`#enhance'コマンドで管理することができる。 +詳しくは後述する武器の技術の章を参照すること。 +.hn 2 +.\"O Bones levels +骸骨の階 +.pg +.\"O You may encounter the shades and corpses of other adventurers (or even +.\"O former incarnations of yourself!) and their personal effects. Ghosts +.\"O are hard to kill, but easy to avoid, since they're slow and do little +.\"O damage. You can plunder the deceased adventurer's possessions; +.\"O however, they are likely to be cursed. Beware of whatever killed the +.\"O former player; it is probably still lurking around, gloating over its +.\"O last victory. +冒険者の幽霊とその死体(あるいはそれは生まれ変わる前のあなた自身であ +ることさえある)や、その所持品に出くわすかもしれない。 +幽霊を殺すことは難しいが、 +動きがのろくほとんどダメージを受けないので簡単に逃げることができる。 +あなたは死んだ冒険者の所持品を奪うこともできる。 +しかしそれらは呪われていることが多い。 +以前の冒険者を死に到らしめたものにはすべて注意を払わねばならない。 +それはあたりを徘徊し、その直前の勝利に酔いしれているからだ。 + +.hn 1 +.\"O Objects +物 +.pg +.\"O When you find something in the dungeon, it is common to want to pick +.\"O it up. In NetHack, this is accomplished automatically by walking over +.\"O the object (unless you turn off the +.\"O .op autopickup +.\"O option (see below), or move with the `m' prefix (see above)), or +.\"O manually by using the `,' command. +洞窟の中で何かを見つけた場合、それを拾いたいと思うのはよくあることである。 +NetHack ではその物の上を通ることによって自動的に拾うことができ( +.op autopickup +オプション(後述)がオフになっているときや `m' プレフィックス +(前述)を用いて移動するときはこの限りではない)、 +または `,' コマンドを使って手動で拾うことができる。 +.pg +.\"O If you're carrying too many items, NetHack will tell you so and you won't +.\"O be able to pick +.\"O up anything more. Otherwise, it will add the object(s) to your pack and tell +.\"O you what you just picked up. +持物が多すぎるときには、NetHack はあなたにそのように告げ、 +それ以上拾うことはできなくなる。 +そうでなければ NetHack はその物をあなたの荷物に加え、何を拾ったかが表示される。 +.pg +.\"O As you add items to your inventory, you also add the weight of that object +.\"O to your load. The amount that you can carry depends on your strength and +.\"O your constitution. The +.\"O stronger you are, the less the additional load will affect you. There comes +.\"O a point, though, when the weight of all of that stuff you are carrying around +.\"O with you through the dungeon will encumber you. Your reactions +.\"O will get slower and you'll burn calories faster, requiring food more frequently +.\"O to cope with it. Eventually, you'll be so overloaded that you'll either have +.\"O to discard some of what you're carrying or collapse under its weight. +持ち物が増えるに連れて、荷物の重さが重くなる。 +どれだけの重さの物を運べるかは筋力と耐久力による。 +力が強いほど、荷物の重さの影響は小さくなる。 +しかしそれでも、洞窟の中を持ち歩いている荷物の重さがあなたに負担になるときがくる。 +反応は鈍くなり、カロリー消費が早くなってより多くの食料が必要となる。 +そして最終的には荷物が重すぎて何かを捨てないと動けなくなってしまう。 +.pg +.\"O NetHack will tell you how badly you have loaded yourself. The symbols +.\"O `Burdened', `Stressed', `Strained', `Overtaxed' and `Overloaded' are +.\"O displayed on the bottom line display to indicate your condition. +NetHack では荷物の重さがどれくらい悪影響を与えるかを教えてくれる。 +最下行に表示される`Burdened', `Stressed', `Strained', `Overtaxed',`Overloaded' +の表示があなたの状態を示している。 +.pg +.\"O When you pick up an object, it is assigned an inventory letter. Many +.\"O commands that operate on objects must ask you to find out which object +.\"O you want to use. When NetHack asks you to choose a particular object +.\"O you are carrying, you are usually presented with a list of inventory +.\"O letters to choose from (see Commands, above). +物を拾ったとき、その物には目録記号が割り当てられる。 +物に関する多くのコマンドはあなたがどの物を使いたいのかを尋ねてくる。 +持物のうち特定の物を選ぶように NetHack が尋ねてきたときは、 +普通目録記号の一覧が表示されてその中から選ぶ(前述のコマンドの項を参照のこと)。 +.pg +.\"O Some objects, such as weapons, are easily differentiated. Others, like +.\"O scrolls and potions, are given descriptions which vary according to +.\"O type. During a game, any two objects with the same description are +.\"O the same type. However, the descriptions will vary from game to game. +いくつかの物、例えば武器類のような物は、どんなものか簡単に区別が付けられる。 +この他の物、例えば巻物や水薬はその種類に応じていろいろな名前が付けられている。 +1 回のゲームの間は同じ名前を持った物は同じ種類の物である。 +しかし物に付けられる名前はゲームごとに違うものになる。 +.pg +.\"O When you use one of these objects, if its effect is obvious, NetHack +.\"O will remember what it is for you. If its effect isn't extremely +.\"O obvious, you will be asked what you want to call this type of object +.\"O so you will recognize it later. You can also use the ``#name'' +.\"O command for the same purpose at any time, to name all objects of a +.\"O particular type or just an individual object. +.\"O When you use ``#name'' on an object which has already been named, +.\"O specifying a space as the value will remove the prior name instead +.\"O of assigning a new one. +このような物を使った時、もしその効果が明らかな場合は NetHack がそれが +何であるかを憶えていてくれる。 +その効果があまり明らかでない場合はその物の種類を何と名付けるか尋ねてくる。 +このため後になってそれを思い出すことができる。 +またいつでも``#name''コマンドを使って同様のことができ、 +ある種類の物すべてに名前を付けたり個々の物に名前を付けたりできる。 +すでに名前をつけているものに``#name''を使う場合、 +新しい名前としてスペースを指定することによって、 +以前つけていた名前を消すことができる。 +.hn 2 +.\"O Curses and Blessings +呪いと祝福 +.pg +.\"O Any object that you find may be cursed, even if the object is +.\"O otherwise helpful. The most common effect of a curse is being stuck +.\"O with (and to) the item. Cursed weapons weld themselves to your hand +.\"O when wielded, so you cannot unwield them. Any cursed item you wear +.\"O is not removable by ordinary means. In addition, cursed arms and armor +.\"O usually, but not always, bear negative enchantments that make them +.\"O less effective in combat. Other cursed objects may act poorly or +.\"O detrimentally in other ways. +あなたが発見したいろいろな物は、たとえそれが役に立つものであったとしても +呪いがかけられているかも知れない。呪いがかけられている物を使うと +それが張り付いてしまうことは最もよく見られる結果である。 +呪いがかけられている武器を持つとそれは手に張り付いてしまって取れなくなる。 +呪いがかけられている物を身につけると普通の方法でははずすことができない。 +さらに、呪いがかけられている武器や防具には必ずと言うわけではないが +たいていの場合負の魔力が与えられていて、そうでない物よりも戦闘時の効力が劣る。 +その他の呪いがかけられている物は、あまり役に立たなかったり +またはその他の点で害を及ぼしたりするだろう。 +.pg +.\"O Objects can also be blessed. Blessed items usually work better or +.\"O more beneficially than normal uncursed items. For example, a blessed +.\"O weapon will do more damage against demons. +また祝福されている物もある。祝福されている物は +呪いがかけられていない普通の物に比べて具合良く働き役に立つ。 +例えば祝福された武器は悪魔たちに一層のダメージを与えることができるだろう。 +.pg +.\"O There are magical means of bestowing or removing curses upon objects, +.\"O so even if you are stuck with one, you can still have the curse +.\"O lifted and the item removed. Priests and Priestesses have an innate +.\"O sensitivity to this property in any object, so they can more easily avoid +.\"O cursed objects than other character roles. +魔法を使うと物に呪いをかけたり呪いを解いたりすることができる。 +このためたとえ物が張り付いてしまっても、 +呪いを解いてはずすことができる。 +僧侶は生来呪いや祝福に敏感なので、 +他の職業の冒険者よりも容易に呪われているものを避けることができる。 +.pg +.\"O An item with unknown status will be reported in your inventory with no prefix. +.\"O An item which you know the state of will be distinguished in your inventory +.\"O by the presence of the word ``cursed'', ``uncursed'' or ``blessed'' in the +.\"O description of the item. +あなたの持物の目録の中で呪いがかけられているかどうか分からない物は +目録のなかで特に何の説明もない。どんな状態にあるか知っている物は +目録一覧で「cursed(呪われた)」「uncursed(呪われていない)」「blessed(祝福された)」などの +言葉が物の説明に与えられる。 +.hn 2 +.\"O Weapons (`)') +武器 (`)') +.pg +.\"O Given a chance, most monsters in the Mazes of Menace will gratuitously try to +.\"O kill you. You need weapons for self-defense (killing them first). Without a +.\"O weapon, you do only 1-2 hit points of damage (plus bonuses, if any). +.\"O Monk characters are an exception; they normally do much more damage with +.\"O bare hands than they do with weapons. +恐怖の迷宮に住むほとんどすべての怪物は、チャンスと見れば見境なくあなたを +殺そうとするだろう。自分の身を守る(先に怪物を殺してしまう)ために +あなたは武器を必要とする。武器なしではポイントにして 1 〜 2 のダメージ +(いくらかの加算があるかも知れないが)を与えることしかできない。 +但し、モンクは例外である。モンクは武器を使って攻撃するよりも +素手で攻撃した方が遥かに大きなダメージを与えることができる。 +.pg +.\"O There are wielded weapons, like maces and swords, and thrown weapons, +.\"O like arrows and spears. To hit monsters with a weapon, you must wield it and +.\"O attack them, or throw it at them. You can simply elect to throw a spear. +武器には鎚矛や剣のような振り回すためのものと、矢や槍のような投げつけるためのものがある。 +武器で怪物に打撃を与えるためには、武器を手にもって怪物を攻撃するか +武器を怪物に投げなければならない。投げるには、単純に槍を投げるように選択するだけでよい。 +.\"O To shoot an arrow, you should first wield a bow, then throw the arrow. +.\"O Crossbows shoot crossbow bolts. Slings hurl rocks and (other) stones +.\"O (like gems). +弓から矢を発射するには、まず弓を手に持ってから矢を投げればよい。クロスボウは +crossbow bolt(クロスボウ用の太矢)を発射するためのものである。 +投石器は岩や(宝石のような)その他の石を投げつけるために用いる。 +.pg +.\"O Enchanted weapons have a ``plus'' (or ``to hit enhancement'' which can be +.\"O either positive or negative) that adds to your chance to +.\"O hit and the damage you do to a monster. The only way to determine a weapon's +.\"O enchantment is to have it magically identified somehow. +魔力のある武器には「追加能力」(攻撃能力と言うことで正と負の両方を取り得る)が +付けられており、 +攻撃が怪物に当たる可能性と与えるダメージに追加される。 +武器の魔力を測定するには、なんらかの方法で魔法を使って鑑定するしかない。 +.\"O Most weapons are subject to some type of damage like rust. Such +.\"O ``erosion'' damage can be repaired. +多くの武器は錆のようなある種のダメージを受けやすい。このような +「腐食」ダメージは修復可能である。 +.pg +.\"O The chance that an attack will successfully hit a monster, and the amount +.\"O of damage such a hit will do, depends upon many factors. Among them are: +.\"O type of weapon, quality of weapon (enchantment and/or erosion), experience +.\"O level, strength, dexterity, encumbrance, and proficiency (see below). The +.\"O monster's armor class - a general defense rating, not necessarily due to +.\"O wearing of armor - is a factor too; also, some monsters are particularly +.\"O vulnerable to certain types of weapons. +攻撃がうまく怪物に命中するかと、命中した時にどれくらいのダメージを与えるかは、 +多くの要素によって決定される。それらには以下のものがある: +武器の種類、武器の品質(魔力や腐食)、経験レベル、筋力、敏捷性、荷物の重さ、 +技量(後述)。 +怪物の防御値(一般的な防御率。防具を着ることによるとは限らない)も要素の一つである。 +また、ある種の武器に対して特に耐性を持つ怪物もいる。 +.pg +.\"O Many weapons can be wielded in one hand; some require both hands. +.\"O When wielding a two-handed weapon, you can not wear a shield, and +.\"O vice versa. When wielding a one-handed weapon, you can have another +.\"O weapon ready to use by setting things up with the `x' command, which +.\"O exchanges your primary (the one being wielded) and alternate weapons. +多くの武器は片手持ちであるが、両手が必要な武器もある。 +両手持ちの武器と盾を同時に持つことはできない。 +片手持ちの武器を持っている場合、 +もうひとつの武器を予備として準備しておいて、 +`x'コマンドで今使っている武器と交換することができる。 +.\"O And if you have proficiency in the ``two weapon combat'' skill, you +.\"O may wield both weapons simultaneously as primary and secondary; use the +.\"O `#twoweapon' extended command to engage or disengage that. Only +.\"O some types of characters (barbarians, for instance) have the necessary +.\"O skill available. Even with that skill, using two weapons at once incurs +.\"O a penalty in the chance to hit your target compared to using just one +.\"O weapon at a time. +さらに「二刀流戦闘」技能の技量がある場合、二つの武器を同時に使うことができる。 +`#twoweapon' 拡張コマンドで二刀流戦闘をするかどうかを切り替えられる。 +一部のキャラクター(例えば野蛮人)だけがこの技能を持っている。 +たとえこの技能を持っていても、一度に二つの武器を使うと +ひとつしか使わない時に比べて敵に命中する確率にペナルティを受ける。 +.pg +.\"O There might be times when you'd rather not wield any weapon at all. +.\"O To accomplish that, wield `-', or else use the `A' command which +.\"O allows you to unwield the current weapon in addition to taking off +.\"O other worn items. +全く何の武器も装備したくない時もあるかもしれない。 +そうするためには、装備するものを選ぶ時に`-'を選ぶか、あるいは`A'コマンドで +その他の身につけているものを外すのと同時に現在使っている武器を外すことができる。 +.pg +.\"O Those of you in the audience who are AD&D players, be aware that each +.\"O weapon which existed in AD&D does roughly the same damage to monsters in +.\"O NetHack. Some of the more obscure weapons (such as the \fIaklys\fP, +.\"O \fIlucern hammer\fP, and \fIbec-de-corbin\fP) are defined in an +.\"O appendix to \fIUnearthed Arcana\fP, an AD&D supplement. +AD&D をプレイしたことのある読者はお気付きだろうが、AD&D に登場した武器は +NetHack においても怪物にだいたい同じダメージを与える。 +あまり良く知られていない武器( +\fIaklys\fP(アキリス), \fIlucern hammer\fP(ルッツェンハンマー), +\fIbec-de-corbin\fP(ベッグ・デ・コルビン) など)のいくつかは AD&D の +追加ルールである \fIUnearthed Arcana\fP の付録で詳しく説明されている。 +.pg +.\"O The commands to use weapons are `w' (wield), `t' (throw), +.\"O `f' (fire, an alternative way of throwing), `Q' (quiver), +.\"O `x' (exchange), `#twoweapon', and `#enhance' (see below). +武器を使うコマンドは `w'(wield: 武器を持つ)、 `t'(throw: 投げる)、 +`f' (fire: 武器を発射するもうひとつの方法), `Q'(quiver: 矢筒)、 +`x' (exchange: 武器を交換する)、`#twoweapon'、`#enhance'(後述) である。 +.hn 3 +.\"O Throwing and shooting +ものを投げることと発射すること +.pg +.\"O You can throw just about anything via the `t' command. It will prompt +.\"O for the item to throw; picking `?' will list things in your inventory +.\"O which are considered likely to be thrown, or picking `*' will list +.\"O your entire inventory. After you've chosen what to throw, you will +.\"O be prompted for a direction rather than for a specific target. The +.\"O distance something can be thrown depends mainly on the type of object +.\"O and your strength. Arrows can be thrown by hand, but can be thrown +.\"O much farther and will be more likely to hit when thrown while you are +.\"O wielding a bow. +`t'コマンドを使うことによって、どんな物でも投げることができる。 +このコマンドを指定すると、投げる物を尋ねてくる。 +`?'を押すと、持ち物の中で投げるのに向いていそうな物の一覧が表示され、 +`*'を押すと、全ての持ち物の一覧が表示される。 +何を投げるかを指定した後、(どの目標に投げるかではなく)どの方向に投げるかを尋ねられる。 +投げることができる距離は、主に物の種類と筋力による。 +矢は手で投げることもできるが、弓を持って投げた方が遥かに遠くまで飛び、 +目標にも当たりやすい。 +.pg +.\"O You can simplify the throwing operation by using the `Q' command to +.\"O select your preferred ``missile'', then using the `f' command to +.\"O throw it. You'll be prompted for a direction as above, but you don't +.\"O have to specify which item to throw each time you use `f'. There is +.\"O also an option, +.\"O .op autoquiver, +.\"O which has NetHack choose another item to automatically fill your +.\"O quiver when the inventory slot used for `Q' runs out. +`Q'コマンドで予め好みの「発射物」を選択しておき、 +`f'コマンドで投げることによって、投げる操作を簡単にすることが出来る。 +先程と同様に投げる方向は尋ねられるが、 +`f'コマンドを使うたびに何を投げるかを指定する必要はない。 +.op autoquiver +オプションをオンにすると、 +`Q'コマンドで設定した物がなくなった時に、 +NetHack が自動的に矢筒に他の物を入れてくれる。 +.pg +--- +.\"O Some characters will throw multiple items in a single action. Rangers, +.\"O for instance, or anyone who achieves a high level of proficiency in +.\"O the relevant weapon skill (in bow skill if you're wielding one to +.\"O shoot arrows, or in sling skill if you're wielding one to shoot stones). +.\"O There is little you can do +.\"O to control this; if NetHack decides that you'll be shooting 3 arrows +.\"O on the current shot, then three arrows will travel in the direction +.\"O you've indicated, even if the first or second succeeds in killing the +.\"O target. You can explicitly limit the number of shots by using a numeric +.\"O prefix before the `t' or `f' command. +--- +.\"O Some characters have the ability to fire a volley of multiple items in a +.\"O single turn. Knowing how to load several rounds of ammunition at +.\"O once -- or hold several missiles in your hand -- and still hit a +.\"O target is not an easy task. Rangers are among those who are adept +.\"O at this task, as are those with a high level of proficiency in the +.\"O relevant weapon skill (in bow skill if you're wielding one to +.\"O shoot arrows, in crossbow skill if you're wielding one to shoot bolts, +.\"O or in sling skill if you're wielding one to shoot stones). +.\"O The number of items that the character has a chance to fire varies from +.\"O turn to turn. You can explicitly limit the number of shots by using a +.\"O numeric prefix before the `t' or `f' command. +一度に複数の物を投げることができるキャラクターもいる。 +一度に複数の矢を装填し(あるいは一度に複数の物を持ち)、 +それを目標に当てることはたやすい仕事ではない。 +レンジャーはこの技能に優れているし、適切な武器の技能 +(弓を持って矢を射るなら弓の技能、クロスボゥを使うならクロスボゥの技能、 +スリングを持って石を投げるならスリングの技能) +において高いレベルの技量があれば他の職業でも可能である。 +あなたがいくつのアイテムを同時に投げることができるかは +毎ターン変化する。 +`t'コマンドや`f'コマンドの前に数字を指定することによって、 +発射する数を明示的に制限することもできる。 +.\"O For example, ``2f'' (or ``n2f'' if using +.\"O .op number_pad +.\"O mode) would ensure that at most 2 arrows are shot +.\"O even if you could have fired 3. If you specify +.\"O a larger number than would have been shot (``4f'' in this example), +.\"O you'll just end up shooting the same number (3, here) as if no limit +.\"O had been specified. Once the volley is in motion, all of the items +.\"O will travel in the same direction; if the first ones kill a monster, +.\"O the others can still continue beyond that spot. +例えば、``2f''( +.op number_pad +オプションがオンの時には``n2f'')と指定すると、 +たとえ 3 本発射可能でも最大 2 本しか発射されない。 +もし、実際に発射できる数よりも大きい数を指定した場合 +(この例では ``4f'')は、 +特に数字を指定しなかった場合と同様、 +実際に発射可能な数(ここでは 3 本)しか発射されない。 +一旦動作を開始したなら、全てのアイテムは同じ方向に飛ぶ。 +もし 1 本目で怪物を倒したなら、残りはその先まで飛んでいくことになる。 +.hn 3 +.\"O Weapon proficiency +武器の技量 +.pg +.\"O You will have varying degrees of skill in the weapons available. +.\"O Weapon proficiency, or weapon skills, affect how well you can use +.\"O particular types of weapons, and you'll be able to improve your skills +.\"O as you progress through a game, depending on your role, your experience +.\"O level, and use of the weapons. +利用できる武器の技能はさまざまに異なっている。 +武器の技量(技能)はある種の武器をどれくらいうまく扱えるかに影響する。 +技能はゲームを通じて向上させることが出来るが、 +それは職業や経験レベルや武器の使用回数による。 +.pg +.\"O For the purposes of proficiency, weapons have +.\"O been divided up into various groups such as daggers, broadswords, and +.\"O polearms. Each role has a limit on what level of proficiency a character +.\"O can achieve for each group. For instance, wizards can become highly +.\"O skilled in daggers or staves but not in swords or bows. +技量を示すために、武器は daggers 、 broadswords 、 polearms といった風に +いくつかのグループに分けられている。 +それぞれのグループで技量レベルをどこまで高めることが出来るかは職業毎に決まっている。 +例えば魔法使いは daggers や staves に対しては高いレベルに達することが出来るが、 +swords や bows に対してはそうではない。 +.pg +.\"O The `#enhance' extended command is used to review current weapons proficiency +.\"O (also spell proficiency) and to choose which skill(s) to improve when +.\"O you've used one or more skills enough to become eligible to do so. The +.\"O skill rankings are ``none'' (sometimes also referred to as ``restricted'', +.\"O because you won't be able to advance), ``unskilled'', ``basic'', ``skilled'', +.\"O and ``expert''. Restricted skills simply will not appear in the list +.\"O shown by `#enhance'. (Divine intervention might unrestrict a particular +.\"O skill, in which case it will start at unskilled and be limited to basic.) +.\"O Some characters can enhance their barehanded combat or martial arts skill +.\"O beyond expert to ``master'' or ``grand master''. +`#enhance'拡張コマンドで現在の武器(と呪文)の技量を見ることができる。 +さらに、ひとつまたは複数の技能を向上させることができる状態なら、 +どの技能を向上させるかを選択することができる。 +技能のランクは"none" (技能を向上させることができないという意味で +"restricted"(制限された) と呼ばれることもある)、 "unskilled"(初心者), +"basic"(入門者), "skilled"(熟練者), "expert"(エキスパート)である。 +制限された技能は単に`#enhance'コマンドで一覧に表示されない。 +(神の介入によりある種の技能の制限が解除されることもある。 +その時には技能は"unskilled"となり、限界は"basic"までとなる) +キャラクターによっては、素手での戦闘やマーシャルアーツの技能を +``master''(マスター)や``grand master''(グランドマスター)にまで向上させる +ことができる。 +.pg +.\"O Use of a weapon in which you're restricted or unskilled +.\"O will incur a modest penalty in the chance to hit a monster and also in +.\"O the amount of damage done when you do hit; at basic level, there is no +.\"O penalty or bonus; at skilled level, you receive a modest bonus in the +.\"O chance to hit and amount of damage done; at expert level, the bonus is +.\"O higher. A successful hit has a chance to boost your training towards +.\"O the next skill level (unless you've already reached the limit for this +.\"O skill). Once such training reaches the threshold for that next level, +.\"O you'll be told that you feel more confident in your skills. At that +.\"O point you can use `#enhance' to increase one or more skills. Such skills +.\"O are not increased automatically because there is a limit to your total +.\"O overall skills, so you need to actively choose which skills to enhance +.\"O and which to ignore. +技能レベルが"restricted"や"unskilled"の武器を使うと、怪物への命中率や +命中した時に与えるダメージにペナルティがある。 +"basic"ではペナルティもボーナスもない。 +"skilled"では命中率と与えるダメージにささやかなボーナスがある。 +"expert"ではボーナスは大きくなる。 +攻撃が命中すると、使っている武器に関する技能を(もし最大に達していないなら) +向上させるための訓練度を増やすチャンスがある。 +この訓練度が次のレベルに必要な値に達すると、 +自分の技能により自信を持てるように感じたことが告げられる。 +この時点で`#enhance'コマンドを使うことによってひとつまたは複数の技能を +向上させることができる。 +技能は自動的には向上しない。 +なぜなら全ての技能レベルの合計には制限があるので、 +どの技能を向上させて、どれを無視するかを決める必要があるからである。 +.hn 2 +.\"O Armor (`[') +防具 (`[') +.pg +.\"O Lots of unfriendly things lurk about; you need armor to protect +.\"O yourself from their blows. Some types of armor offer better +.\"O protection than others. Your armor class is a measure of this +.\"O protection. Armor class (AC) is measured as in AD&D, with 10 being +.\"O the equivalent of no armor, and lower numbers meaning better armor. +.\"O Each suit of armor which exists in AD&D gives the same protection in +.\"O NetHack. Here is an (incomplete) list of the armor classes provided by +.\"O various suits of armor: +多くの非友好的なものが洞窟には潜んでいる。 +そういったものからの攻撃から我が身を守るには防具が必要である。 +防具の中には他の種類の防具よりも防御効果に優れた物がある。 +Armor class(AC)(防御値)はこの防御効果の尺度である。 +防御値 (AC)は AD&D での場合と同じように評価される。 +10 が防具なしの状態と等しく、数値が小さいほど優れた防具であることを示す。 +AD&D に存在する鎧はいずれも NetHack においても同じ防御効果を示す。 +以下に(不完全ではあるが) 各種の鎧ごとに規定される防御値の一覧を示す。 + +.TS S +center; +a n. +dragon scale mail(ドラゴンの鱗鎧) 1 +plate mail(鋼鉄の鎧) 3 +crystal plate mail(水晶の鎧) 3 +bronze plate mail(青銅の鎧) 4 +splint mail(鉄片の鎧) 4 +banded mail(帯金の鎧) 4 +dwarvish mithril-coat(ドワーフのミスリル服) 4 +elven mithril-coat(エルフのミスリル服) 5 +chain mail(鎖かたびら) 5 +orcish chain mail(オークの鎖かたびら) 6 +scale mail(鱗の鎧) 6 +studded leather armor(鋲付き皮鎧) 7 +ring mail(鉄環の鎧) 7 +orcish ring mail(オークの鉄環の鎧) 8 +leather armor(皮鎧) 8 +leather jacket(皮ジャケット) 9 +no armor(鎧なし) 10 +.TE +.pg +.\"O You can also wear other pieces of armor (ex. helmets, boots, shields, cloaks) +.\"O to lower your armor class even further, but you can only wear one item +.\"O of each category (one suit of armor, one cloak, one helmet, one +.\"O shield, and so on) at a time. +さらに他の防具(例: 兜、靴、楯、クローク) を身につけ、 +防御値の値を小さくすることもできる。 +ただし同じ範疇に入る物は 1 つしか身につけることはできない +(鎧は一式、クロークは 1 着、兜は 1 個、楯は 1 枚など)。 +.pg +.\"O If a piece of armor is enchanted, its armor protection will be better +.\"O (or worse) than normal, and its ``plus'' (or minus) will subtract from +.\"O your armor class. For example, a +1 chain mail would give you +.\"O better protection than normal chain mail, lowering your armor class one +.\"O unit further to 4. When you put on a piece of armor, you immediately +.\"O find out the armor class and any ``plusses'' it provides. Cursed +.\"O pieces of armor usually have negative enchantments (minuses) in +.\"O addition to being unremovable. +防具に魔力があればその防具の防御効果は通常の物よりも良く(もしくは悪く)なっており、 +それに付いている「+記号」(あるいは−記号)の分だけ防御値の値が小さくなる。 +例えば +1 鎖かたびらは、通常の鎖かたびらよりも防御効果が高く、 +防御値は 1 単位分小さくなって 4 になる。 +防具を身につけると直ちに防御値と「+記号」の値が分かる。 +呪いがかけられた防具は通常負の魔力(−記号)を持っており、取りはずすことはできない。 +.pg +.\"O Many types of armor are subject to some kind of damage like rust. Such +.\"O damage can be repaired. Some types of armor may inhibit spell casting. +多くの鎧は錆のようなある種のダメージを受けやすい。 +このようなダメージは修復可能である。 +魔法を唱えるのを妨げる防具もある。 +.pg +.\"O The commands to use armor are `W' (wear) and `T' (take off). +鎧を使うためのコマンドは `W'(wear: 防具を付ける) と +`T'(take off: 防具をはずす) である。 +.\"O The `A' command can also be used to take off armor as well as other +.\"O worn items. +`A'(remove all: 全てをはずす)もまた他の身につけるもの同様、 +防具をはずすのに使用できる。 +.hn 2 +.\"O Food (`%') +食料 (`%') +.pg +.\"O Food is necessary to survive. If you go too long without eating you +.\"O will faint, and eventually die of starvation. Some types of food will +.\"O spoil, and become unhealthy to eat, if not protected. Food stored in +.\"O ice boxes or tins (``cans'') will usually stay fresh, but +.\"O ice boxes are heavy, and tins take a while to open. +生きのびるには食料が不可欠である.長い間食料を口にしないままでいると +やがて昏倒し、徐々に餓死への道をたどることになる。 +保存の処置を取ってないと傷んでしまい、食べるには不衛生になる食料もある。 +アイスボックスや缶に入っている食料は通常はいつまでも傷まないが、 +アイスボックスは重く、缶は開けるのに少しばかり時間が必要である。 +.pg +.\"O When you kill monsters, they usually leave corpses which are also +.\"O ``food.'' Many, but not all, of these are edible; some also give you +.\"O special powers when you eat them. A good rule of thumb is ``you are +.\"O what you eat.'' +怪物を殺すと通常はその死体が残るが、これは「食料」にもなる。 +すべてと言うわけではないが多くは食べられるし、 +中には食べると特別な力がつくものもある。 +大ざっぱに言えば「食べたものになる」ということである。 +.pg +.\"O Some character roles and some monsters are vegetarian. Vegetarian monsters +.\"O will typically never eat animal corpses, while vegetarian players can, +.\"O but with some rather unpleasant side-effects. +菜食主義の職業や怪物もいる。 +菜食主義の怪物は決して動物の死体を食べない。 +一方菜食主義のプレイヤーは動物の死体を食べることができるが、 +なんらかのありがたくない副作用がある。 +.pg +.\"O You can name one food item after something you like to eat with the +.\"O .op fruit +.\"O option. +.op furit +オプションによってあなたの好物の食料にちなんで +その名前を 1 つ設定することができる。 + +.pg +.\"O The command to eat food is `e'. +食料を食べるためのコマンドは `e' である。 +.hn 2 +.\"O Scrolls (`?') +巻物 (`?') +.pg +.\"O Scrolls are labeled with various titles, probably chosen by ancient wizards +.\"O for their amusement value (ex. ``READ ME,'' or ``THANX MAUD'' backwards). +.\"O Scrolls disappear after you read them (except for blank ones, without +.\"O magic spells on them). +巻物にはいろいろな表題が付けられているが、 +これはおそらくいにしえの魔術師たちが暇潰しとして選んだのであろう +(例:``READ ME'' とか ``THANX MAUD'' の逆さ読みとか)。 +巻物は読むと消滅する(ただし魔法の呪文の書かれていない白紙は消滅しない)。 +.pg +.\"O One of the most useful of these is the \fIscroll of identify\fP, which +.\"O can be used to determine what another object is, whether it is cursed or +.\"O blessed, and how many uses it has left. Some objects of subtle +.\"O enchantment are difficult to identify without these. +これらの中で最も利用価値の高いものは\fIscroll of identify(識別の巻物)\fPである。 +これは他の物についてそれが何であるか、 +呪いがかけられているか祝福されているか、 +あと何回効力を発揮できるかを確定できる。 +得体の知れない魔力を持つ物の中にはこの巻物なしでは何であるか鑑定し難いものもある。 +.pg +.\"O A mail daemon may run up and deliver mail to you as a +.\"O \fIscroll of mail\fP (on versions compiled with this feature). +メイルデーモンが走ってきてあなたに\fIscroll of mail(手紙の巻物)\fPを渡してくれることもある +(この機能を有効にしてコンパイルされているバージョンの場合)。 +.\"O To use this feature on versions where NetHack mail delivery is triggered +.\"O by electronic mail appearing in your system mailbox, +.\"O you must let NetHack know where to look for new mail by setting +.\"O the ``MAIL'' environment variable to the file name of your mailbox. +NetHack のメール配達機能はシステムのメールボックスに電子メールが +やってきた場合に起動される。 +この機能を使用するには環境変数``MAIL''にあなたのメールボックスの +ファイル名を設定して NetHack に新しいメールを探す場所を知らせる必要が +ある。 +.\"O You may also want to set the ``MAILREADER'' environment +.\"O variable to the file name of your favorite reader, so NetHack can shell to it +.\"O when you read the scroll. +また望むならば環境変数``MAILREADER''に使いたいメール受信プログラ +ムのファイル名を設定することもできる。 +このとき NetHack からそのプログラムを起動してその巻物を読むことができる。 +.\"O On versions of NetHack where mail is randomly generated internal to the game, +.\"O these environment variables are ignored. +メールがゲーム内においてランダムに生成されるバージョンの NetHack では +これらの環境変数は無視される。 +.\"O You can disable the mail daemon by turning off the +.\"O .op mail +.\"O option. +メイルデーモンは +.op mail +オプションでオフにできる。 +.pg +.\"O The command to read a scroll is `r'. +巻物を読むためのコマンドは `r' である。 +.hn 2 +.\"O Potions (`!') +水薬 (`!') +.pg +.\"O Potions are distinguished by the color of the liquid inside the flask. +.\"O They disappear after you quaff them. +水薬は小びんに入っている液体の色によって区別される。 +水薬は飲むと消滅してしまう。 +.pg +.\"O Clear potions are potions of water. Sometimes these are blessed or cursed, +.\"O resulting in holy or unholy water. Holy water is the bane of the undead, so +.\"O potions of holy water are good things to throw (`t') at them. It is also +.\"O sometimes very useful to dip (``#dip'') an object into a potion. +透明な水薬は水である。これらはしばしば祝福されていたり呪いがかけられていたりして、 +聖水や不浄な水になったりする。不死の怪物にとって聖水は有害なので、 +聖水を不死の怪物に投げつける(`t')と有効である。 +聖水に他の物を浸す(``#dip'')のもたいへん有益である。 +.pg +.\"O The command to drink a potion is `q' (quaff). +水薬を飲むためのコマンドは `q'(quaff: 飲む) である。 +.hn 2 +.\"O Wands (`/') +杖 (`/') +.pg +.\"O Magic wands usually have multiple magical charges. Some wands are +.\"O directional\(emyou must give a direction in which to zap them. You can also +.\"O zap them at yourself (just give a `.' or `s' for the direction). Be warned, +.\"O however, for this is often unwise. Other wands are nondirectional\(emthey +.\"O don't require a direction. The number of charges in a wand is random and +.\"O decreases by one whenever you use it. +魔法の杖は通常何回も魔力を発揮する.杖の中には方向性のあるものがあり、 +この場合杖を振る方向を指示しなくてはならない。 +杖を自分に向けて振ることもできる(方向として `.' か `s' を入力する)が、 +これはしばしば愚かな行為となる。 +その他の杖には方向性がなく、杖を振る方向を尋ねてこない。 +杖が効力を発揮する回数は杖ごとに不定で、杖を使う度にその回数は 1 ずつ減る。 +.pg +.\"O When the number of charges left in a wand becomes zero, attempts to use the +.\"O wand will usually result in nothing happening. Occasionally, however, it may +.\"O be possible to squeeze the last few mana points from an otherwise spent wand, +.\"O destroying it in the process. A wand may be recharged by using suitable +.\"O magic, but doing so runs the risk of causing it to explode. The chance +.\"O for such an explosion starts out very small and increases each time the +.\"O wand is recharged. +杖の魔法の量がなくなると、通常は杖を使用しても何も起きない。 +しかしながら時折、最後の一握りの魔力を使いきった杖から搾り取ることが可能である。 +しかしこれをすると杖は壊れてしまう。 +杖は適切な魔法によって再充填することができるが、 +そうすると杖が爆発してしまう可能性がある。 +爆発する可能性は最初は非常に小さく、同じ杖に何度も再充填するごとに大きくなる。 +.pg +.\"O In a truly desperate situation, when your back is up against the wall, you +.\"O might decide to go for broke and break your wand. This is not for the faint +.\"O of heart. Doing so will almost certainly cause a catastrophic release of +.\"O magical energies. +自暴自虐なな行為ではあるが、どうにもならなくなったときには杖を壊すという手もある。 +これは弱気な行為ではない。それを行うことにより、 +破壊的な魔法のエネルギーが解放されるからである。 +.pg +.\"O When you have fully identified a particular wand, inventory display will +.\"O include additional information in parentheses: the number of times it has +.\"O been recharged followed by a colon and then by its current number of charges. +ある杖を完全に鑑定した場合、持ち物の一覧では括弧の中に追加の情報が表示される。 +それは再充填された回数、コロン、現在の使用可能な回数である。 +.\"O A current charge count of -1 is a special case indicating that the wand +.\"O has been cancelled. +杖が無効化された場合には使用可能な回数は -1 になる。 +.pg +.\"O The command to use a wand is `z' (zap). To break one, use the `a' (apply) +.\"O command. +杖を使うためのコマンドは `z'(zap: 杖を振る) である。壊すには `a' +(apply: 道具を使う)である。 +.hn 2 +.\"O Rings (`=') +指輪 (`=') +.pg +.\"O Rings are very useful items, since they are relatively permanent +.\"O magic, unlike the usually fleeting effects of potions, scrolls, and +.\"O wands. +指輪は大変役に立つ物である。 +というのも水薬や巻物や杖のように魔力が一過性にしか働かないものと違い、 +指輪の魔力は比較的恒久的であるからだ。 +.pg +.\"O Putting on a ring activates its magic. You can wear only two +.\"O rings, one on each ring finger. +指輪をはめることによってその魔力は発揮される。 +指輪は両手の薬指に 1 つずつ、計 2 つしかはめることはできない。 +.pg +.\"O Most rings also cause you to grow hungry more rapidly, the rate +.\"O varying with the type of ring. +またたいていの指輪は身につけると腹の減り方が速くなる。 +減り方は指輪の種類によって異なる。 +.pg +.\"O The commands to use rings are `P' (put on) and `R' (remove). +指輪を使うためのコマンドは `P'(put on: 指輪をはめる) と +`R'(remove: 指輪をはずす) である。 +.hn 2 +.\"O Spellbooks (`+') +魔法書 (`+') +.pg +.\"O Spellbooks are tomes of mighty magic. When studied with the `r' (read) +.\"O command, they transfer to the reader the knowledge of a spell (and +.\"O therefore eventually become unreadable) \(em unless the attempt backfires. +魔法書は強力な魔法を記した大きな本である。`r'(read: 読む) コマンドで +学ぶと呪文の知識が読み手に転送される(したがって最後には読めなくなる)か、 +さもなくばその試みは不測の結果に終る。 +.\"O Reading a cursed spellbook or one with mystic runes beyond +.\"O your ken can be harmful to your health! +呪いがかけられた魔法書や知識の及ばない神秘の古代文字で記された魔法書を +読むと健康状態に害が及ぶ可能性がある! +.pg +.\"O A spell (even when learned) can also backfire when you cast it. If you +.\"O attempt to cast a spell well above your experience level, or if you have +.\"O little skill with the appropriate spell type, or cast it at +.\"O a time when your luck is particularly bad, you can end up wasting both the +.\"O energy and the time required in casting. +呪文を唱えたとき(学んでいる時も)にも魔力が逆流することもある。 +あなたの経験レベルでは遠く及ばない高度な呪文を唱えようと試みたり、 +対応する呪文タイプに関する技能が低かったり、 +ひどくついてないときに呪文を唱えたりすると、 +呪文を唱えるのに必要なエネルギーと時間を浪費しただけに終わってしまうこともある。 +.pg +.\"O Casting a spell calls forth magical energies and focuses them with +.\"O your naked mind. Some of the magical energy released comes from within +.\"O you, and casting several spells in a row may tire you. +.\"O Casting of spells also requires practice. With practice, your +.\"O skill in each category of spell casting will improve. Over time, however, +.\"O your memory of each spell will dim, and you will need to relearn it. +呪文を唱えることは、魔法のエネルギーを呼び起こしてそれを精神そのもの +に集中させることである。 +あなた自身の内部から出る魔法のエネルギーが開放され、 +連続して呪文を唱えると疲れてしまう。 +呪文を唱えるには練習が必要である。 +練習していれば、それぞれの呪文領域の技能は向上していく。 +しかしながら、時間が経つにつれてそれぞれの呪文に関する記憶は薄れ、 +もう一度呪文を学ぶ必要がでてくるだろう。 +.pg +.\"O Some spells are +.\"O directional\(emyou must give a direction in which to cast them. You can also +.\"O cast them at yourself (just give a `.' or `s' for the direction). Be warned, +.\"O however, for this is often unwise. Other spells are nondirectional\(emthey +.\"O don't require a direction. +指向性のある呪文の場合、呪文を唱える方向を指定する必要がある。 +方向として`.'または`s'を指定することで自分自身に対して呪文を唱えることもできる。 +しかし、これはしばしば愚かな行為である。 +指向性のない呪文の場合、方向を指定する必要はない。 +.pg +.\"O Just as weapons are divided into groups in which a character can become +.\"O proficient (to varying degrees), spells are similarly grouped. +.\"O Successfully casting a spell exercises the skill group; sufficient skill +.\"O may increase the potency of the spell and reduce the risk of spell failure. +.\"O Skill slots are shared with weapons skills. (See also the section on +.\"O ``Weapon proficiency''.) +武器が習熟度の面でグループ分けされているのと同様、呪文もグループ分けされている。 +呪文を唱えるのに成功すると、そのグループを訓練したことになる。 +十分な技能があれば呪文の効果を高め、失敗の可能性を低めることができる。 +技能スロットは武器スキルと共有する。(``武器の技量''の項も参照のこと) +.pg +.\"O Casting a spell also requires flexible movement, and wearing various types +.\"O of armor may interfere with that. +魔法を唱えるには自由に移動できなければならない。また、いくつかの種類の鎧を +着ていると魔法を唱えるのを妨げるだろう。 +.pg +.\"O The command to read a spellbook is the same as for scrolls, `r' +.\"O (read). The `+' command lists your current spells, their levels, +.\"O categories, and chances for failure. +.\"O The `Z' (cast) command casts a spell. +魔法書を読むためのコマンドは巻物を読むときと同じく `r'(read: 読む) である。 +`+' コマンドにより、知っている呪文とそのレベル,分野,成功率が一覧表示される。 +`Z'(cast: 呪文を唱える) コマンドにより呪文を唱える。 +.hn 2 +.\"O Tools (`(') +道具 (`(') +.pg +.\"O Tools are miscellaneous objects with various purposes. Some tools +.\"O have a limited number of uses, akin to wand charges. For example, lamps burn +.\"O out after a while. Other tools are containers, which objects can +.\"O be placed into or taken out of. +道具はいろいろな目的に使う種々雑多な物である。杖などと同じように使用 +回数に制限のある物もある。例えばランプはしばらくたつと燃え尽きてしまう。 +その他の道具の中には容器も含まれており、物を出し入れすることができる。 +.pg +.\"O The command to use tools is `a' (apply). +道具を使うためのコマンドは `a'(apply: 道具を用いる) である。 +.hn 3 +.\"O Containers +箱 +.pg +.\"O You may encounter bags, boxes, and chests in your travels. A tool of +.\"O this sort can be opened with the ``#loot'' extended command when +.\"O you are standing on top of it (that is, on the same floor spot), +.\"O or with the `a' (apply) command when you are carrying it. However, +.\"O chests are often locked, and are in any case unwieldy objects. +冒険の途中で鞄や箱やひつに出くわすこともあるであろう。 +これらは置いてある場所に立っている場合には +拡張コマンド「#loot」によって、 +また持っているときには `a'(apply: 道具を用いる) コマンドで開けることができる。 +しかしながらひつにはしばしば錠がかかっており、大抵は重くて運びにくい物体である。 +.\"O You must set one down before unlocking it by +.\"O using a key or lock-picking tool with the `a' (apply) command, +.\"O by kicking it with the `^D' command, +.\"O or by using a weapon to force the lock with the ``#force'' extended command. +ひつは手に持つことはできない物なので、 +錠をはずす(`a'(apply: 道具を用いる) コマンドで鍵や錠をはずす道具を使ったり、 +`^D'コマンドで蹴とばしたり、 +拡張コマンド``#force''により武器を使ってこじ開けるなどの方法による)には +床に置かなくてはならない。 +.pg +.\"O Some chests are trapped, causing nasty things to happen when you +.\"O unlock or open them. You can check for and try to deactivate traps +.\"O with the ``#untrap'' extended command. +ひつには罠が仕掛けられているものもあり、錠をはずしたりふたを開けたり +したときに不快な出来事が起きる。拡張コマンド``#untrap''によってチェックを +して罠が無効になるよう試みることができる。 +.hn 2 +.\"O Amulets (`"') +魔除け (`"') +.pg +.\"O Amulets are very similar to rings, and often more powerful. Like +.\"O rings, amulets have various magical properties, some beneficial, +.\"O some harmful, which are activated by putting them on. +魔除けは指輪と大変よく似ており、しばしばもっと大きな効力を持っている。 +指輪と同じように魔除けにはいろいろな魔法の特性があり、有益なものも有害 +なものもあって、身につけることにより効力を発揮する。 +.pg +.\"O Only one amulet may be worn at a time, around your neck. +魔除けは一つだけしか首にかけることができない。 +.pg +.\"O The commands to use amulets are the same as for rings, `P' (put on) +.\"O and `R' (remove). +魔除けを使うためのコマンドは指輪の場合と同じく `P'(put on: 指輪を +はめる) と `R'(remove: 指輪をはずす) である。 +.hn 2 +.\"O Gems (`*') +宝石 (`*') +.pg +.\"O Some gems are valuable, and can be sold for a lot of gold. They are also +.\"O a far more efficient way of carrying your riches. Valuable gems increase +.\"O your score if you bring them with you when you exit. +宝石の中には価値のあるものもあり、高値で売れる。 +宝石は財産を持ち歩く方法としてとして極めて効果的なやり方である。 +価値のある宝石を脱出時に所持していれば得点に加算される。 +.pg +.\"O Other small rocks are also categorized as gems, but they are much less +.\"O valuable. All rocks, however, can be used as projectile weapons (if you +.\"O have a sling). In the most desperate of cases, you can still throw them +.\"O by hand. +他の小さな石も宝石に分類されるが、その価値はほとんどない。 +しかし、全ての石は(もしスリングを持っているなら)弾として有効である。 +窮余に陥いったら手で投げることも可能である。 +.hn 2 +.\"O Large rocks (`\`') +大きな岩 (`\`') +.pg +.\"O Statues and boulders are not particularly useful, and are generally +.\"O heavy. It is rumored that some statues are not what they seem. +彫像や巨石は特に有用ではないし、一般的に重いものである。 +見かけとは異なった彫像もあるという噂である。 +.pg +.\"O Very large humanoids (giants and their ilk) have been known to use boulders +.\"O as weapons. +巨大なヒューマノイド(巨人やその仲間)は巨石を武器として用いることができる。 +.hn 2 +.\"O Gold (`$') +金 (`$') +.pg +.\"O Gold adds to your score, and you can buy things in shops with it. +金は得点に加算され、また店では金で物を買うことができる。 +.\"O There are a number +.\"O of monsters in the dungeon that may be influenced by the amount of gold +.\"O you are carrying (shopkeepers aside). +迷宮にはあなたの持つお金に影響されるかもしれない数多くの怪物が +いる(店主は別として)。 + +.hn 1 +.\"O Conduct +制限プレイ +.pg +.\"O As if winning NetHack were not difficult enough, certain players +.\"O seek to challenge themselves by imposing restrictions on the +.\"O way they play the game. The game automatically tracks some of +.\"O these challenges, which can be checked at any time with the #conduct +.\"O command or at the end of the game. When you perform an action which +.\"O breaks a challenge, it will no longer be listed. This gives +.\"O players extra ``bragging rights'' for winning the game with these +.\"O challenges. Note that it is perfectly acceptable to win the game +.\"O without resorting to these restrictions and that it is unusual for +.\"O players to adhere to challenges the first time they win the game. +単に NetHack に勝利するだけでは満足できない一部のプレイヤーは、 +プレイに制限を設けることに挑戦している。 +これらの挑戦の一部はゲームによって自動的に記録され、 +ゲーム中いつでも #conduct コマンドで確認できる。 +またゲーム終了時にも表示される。 +挑戦に反するような行動を取ると、もはやその挑戦は表示されない。l +これらの挑戦に勝利することによって、プレイヤーは追加の``自慢する権利''を +得られる。 +なお、これらの制限に従うことなくゲームに勝利することも +完全に有効であり、最初にゲームに勝利するときは普通これらの挑戦は関係ない。 +.pg +.\"O Several of the challenges are related to eating behavior. The most +.\"O difficult of these is the foodless challenge. Although creatures +.\"O can survive long periods of time without food, there is a physiological +.\"O need for water; thus there is no restriction on drinking beverages, +.\"O even if they provide some minor food benefits. +.\"O Calling upon your god for help with starvation does +.\"O not violate any food challenges either. +挑戦のいくつかは食べ物に関するものである。 +最も困難な挑戦は食料なしの挑戦である。 +生物は食料なしでも長い間生存できるが、水は必要である。 +従って、飲み物に対しては何の制限もない。例え栄養分があってもである。 +神に祈って飢えをしのぐことはいかなる食べ物に関する挑戦にも違反しない。 +.pg +.\"O A strict vegan diet is one which avoids any food derived from animals. +.\"O The primary source of nutrition is fruits and vegetables. The +.\"O corpses and tins of blobs (`b'), jellies (`j'), and fungi (`F') are +.\"O also considered to be vegetable matter. Certain human +.\"O food is prepared without animal products; namely, lembas wafers, cram +.\"O rations, food rations (gunyoki), K-rations, and C-rations. +.\"O Metal or another normally indigestible material eaten while polymorphed +.\"O into a creature that can digest it is also considered vegan food. +.\"O Note however that eating such items still counts against foodless conduct. +厳密な菜食主義者は動物から作られた食べ物を食べない。 +基本的な栄養源は果物と野菜である。 +ブロッブ(`b')、ゼリー(`j')、細菌(`F')も野菜とみなされる。 +人間の食料にも動物を使っていないものがある。 +レンバス、クラム、「食料」(丸薬)、Kレーション、Cレーションがそうである。 +他の生物に変化しているときは、金属などの普通消化できない物質も +厳密な菜食主義者用の食料として扱われる。 +しかし、これらの物も食料なしの挑戦には反することに注意すること。 +.pg +.\"O Vegetarians do not eat animals; +.\"O however, they are less selective about eating animal byproducts than vegans. +.\"O In addition to the vegan items listed above, they may eat any kind +.\"O of pudding (`P') other than the black puddings, +.\"O eggs and food made from eggs (fortune cookies and pancakes), +.\"O food made with milk (cream pies and candy bars), and lumps of +.\"O royal jelly. Monks are expected to observe a vegetarian diet. +菜食主義者は動物を食べない。 +しかし、動物からの副生産物を食べることは厳密な菜食主義者ほどは厳しくない。 +上記の厳密な菜食主義者が食べられるものに追加して、 +ブラックプリン以外のプリン(`P')、卵、卵から作られた食べ物 +(占いクッキーとパンケーキ)、牛乳から造られた食べ物 +(クリームパイとキャンディーバー)、ロイヤルゼリーを食べることができる。 +モンクは菜食主義者とみなされる。 +.pg +.\"O Eating any kind of meat violates the vegetarian, vegan, and foodless +.\"O conducts. This includes tripe rations, the corpses or tins of any +.\"O monsters not mentioned above, and the various other chunks of meat +.\"O found in the dungeon. Swallowing and digesting a monster while polymorphed +.\"O is treated as if you ate the creature's corpse. +.\"O Eating leather, dragon hide, or bone items while +.\"O polymorphed into a creature that can digest it, or eating monster brains +.\"O while polymorphed into a mind flayer, is considered eating +.\"O an animal, although wax is only an animal byproduct. +肉を食べることは厳密な菜食主義者、菜食主義者、食料なしの挑戦に反する。 +これにはほし肉、上記以外の怪物の死体や缶詰、迷宮で見つかる +その他の肉のかたまりを含む。 +変化中に「飲み込んで消化」攻撃をかけるのはその怪物の死体を +食べたものとみなす。 +皮、竜鱗、骨でできた物体を、これらを消化できる怪物に変化して食べたり、 +マインドフレイヤーに変化して脳を食べることは動物を食べたとみなす。 +ただし、蜜蝋は動物の副生成物とみなす。 +.pg +.\"O Regardless of conduct, there will be some items which are indigestible, +.\"O and others which are hazardous to eat. Using a swallow-and-digest +.\"O attack against a monster is equivalent to eating the monster's corpse. +.\"O Please note that the term ``vegan'' is used here only in the context of +.\"O diet. You are still free to choose not to use or wear items derived +.\"O from animals (e.g. leather, dragon hide, bone, horns, coral), but the +.\"O game will not keep track of this for you. Also note that ``milky'' +.\"O potions may be a translucent white, but they do not contain milk, +.\"O so they are compatible with a vegan diet. Slime molds or +.\"O player-defined ``fruits'', although they could be anything +.\"O from ``cherries'' to ``pork chops'', are also assumed to be vegan. +挑戦に関わらず、消化不可能な物もあり、食べると危険なものもある。 +怪物に対して「飲み込んで消化」攻撃をかけることは、 +その怪物の死体を食べたものとみなす。 +「厳格な菜食主義者(``vegan'')」という言葉は食べ物に関する文脈でのみ +用いられることに注意してほしい。 +動物から作られた物(皮、竜の鱗、骨、角、さんご)を使ったり身につけたり +することは制限に違反しない。 +また、「ミルク色の」水薬は不透明な白色ではあるが、牛乳を含んでいるわけ +ではないので、厳密な菜食主義者の制限に違反しない。 +スライムモルドやプレイヤーが定義した``fruits''は、 +例え「さくらんぼ」であろうが「ポークチョップ」であろうが、 +厳密な菜食主義者の制限に違反しない。 +.pg +.\"O An atheist is one who rejects religion. This means that you cannot +.\"O #pray, #offer sacrifices to any god, #turn undead, or #chat with a priest. +.\"O Particularly selective readers may argue that playing Monk or Priest +.\"O characters should violate this conduct; that is a choice left to the +.\"O player. Offering the Amulet of Yendor to your god is necessary to +.\"O win the game and is not counted against this conduct. You are also +.\"O not penalized for being spoken to by an angry god, priest(ess), or +.\"O other religious figure; a true atheist would hear the words but +.\"O attach no special meaning to them. +無神論者は宗教を否定する。つまり、#pray(祈る), #offer(いけにえを捧げる), +#turn (不死のものを戻す), 僧侶に対する #chat(話す)ことはできない。 +一部の読者はモンクや僧侶でプレイするのもこの制限に反していると主張するかもしれないが、 +ここではプレイヤーの選択の余地を残してある。 +イェンダーの魔除けを神に捧げるのはゲームに勝利するために必要なので +制限には反しないものとする。 +また、怒った神や僧侶やその他の宗教的存在が話す言葉を聞いても制限には反しない。 +真の無神論者は言葉は聞くが,そこになんら特別な意味を見出さない。 +.pg +.\"O Most players fight with a wielded weapon (or tool intended to be +.\"O wielded as a weapon). Another challenge is to win the game without +.\"O using such a wielded weapon. You are still permitted to throw, +.\"O fire, and kick weapons; use a wand, spell, or other type of item; +.\"O or fight with your hands and feet. +ほとんどのプレイヤーは武器(あるいは武器として装備することを +考慮している道具)を手に戦う。 +挑戦の一つはこのような武器を手にして使わずにゲームに勝利することである。 +武器を投げたり、発射したり、蹴ったりするのは許される。 +また、杖、呪文、あるいはその他のアイテムを使ったり、 +素手や脚で戦うことも許される。 +.pg +.\"O In NetHack, a pacifist refuses to cause the death of any other monster +.\"O (i.e. if you would get experience for the death). This is a particularly +.\"O difficult challenge, although it is still possible to gain experience +.\"O by other means. +NetHack において、平和主義者は他の怪物を殺してはならない(言い換えると、 +怪物の死によって経験値を得てはならない)。 +これは特に難しい挑戦であるが、他の手段によって経験値を得ることは可能である。 +.pg +.\"O An illiterate character cannot read or write. This includes reading +.\"O a scroll, spellbook, fortune cookie message, or t-shirt; writing a +.\"O scroll; or making an engraving of anything other than a single ``x'' (the +.\"O traditional signature of an illiterate person). Reading an engraving, +.\"O or any item that is absolutely necessary to win the game, is not counted +.\"O against this conduct. The identity of scrolls and spellbooks (and +.\"O knowledge of spells) in your starting inventory is assumed to be +.\"O learned from your teachers prior to the start of the game and isn't +.\"O counted. +文盲者は読み書きができない。これには以下の行為が含まれる。 +巻き物を読む、魔法書を読む、占いクッキーのメッセージを読む、Tシャツの文字を読む、 +巻き物を書く、``x''一文字(文盲者の伝統的なサイン)以外の文字を刻む。 +刻んである文字を読むことと、ゲームに勝利するために絶対に必要なアイテムを +読むことは制限には反しないものとする。 +ゲーム開始時に持っている巻き物と魔法書の内容を知っていることおよび +呪文の知識は、ゲーム開始以前に教師から教わったものとみなし、 +制限には反しないものとする。 +.pg +.\"O There are several other challenges tracked by the game. It is possible +.\"O to eliminate one or more species of monsters by genocide; playing without +.\"O this feature is considered a challenge. When the game offers you an +.\"O opportunity to genocide monsters, you may respond with the monster type +.\"O ``none'' if you want to decline. You can change the form of an item into +.\"O another item of the same type (``polypiling'') or the form of your own +.\"O body into another creature (``polyself'') by wand, spell, or potion of +.\"O polymorph; avoiding these effects are each considered challenges. +.\"O Polymorphing monsters, including pets, does not break either of these +.\"O challenges. +.\"O Finally, you may sometimes receive wishes; a game without an attempt to +.\"O wish for an object is a challenge, as is a game without wishing for +.\"O an artifact (even if the artifact immediately disappears). +.\"O wish for any items is a challenge, as is a game without wishing for +.\"O an artifact (even if the artifact immediately disappears). When the +.\"O game offers you an opportunity to make a wish for an item, you may +.\"O choose ``nothing'' if you want to decline. +その他にいくつかの細かいゲームとして記録される挑戦がある。 +怪物は虐殺することが可能である。これをせずにプレイするのも挑戦とみなす。 +怪物を虐殺する機会が与えられたとき、 +``none''(または``なし'')と答えると、虐殺しないままにすることができる。 +あなたはアイテムを同じグループの他のアイテムに変化させたり (``polypiling'')、 +変化の杖・呪文・薬で自分の体を他の生物に変えたり(``polyself'')できる。 +これらの効果を用いないことはそれぞれ挑戦とみなす。 +最後に、あなたはときどき願いをかなえてもらうことがある。 +なんのアイテムも願わずにプレイするのは一つの挑戦であり、 +聖器を願わない(たとえ直ちに消滅したとしても)でプレイするのも一つの挑戦である。 +アイテムを願う機会を与えられたとき、 +``nothing''または``なし''と答えると、願わないままにすることができる。 + +.hn 1 +.\"O Options +オプション +.pg +.\"O Due to variations in personal tastes and conceptions of how NetHack +.\"O should do things, there are options you can set to change how NetHack +.\"O behaves. +人にはそれぞれいろいろな好みがあり NetHack の遊び方もそれぞれ異なっているの +で、NetHack の振る舞いを変更するため設定できるオプションがある。 +.hn 2 +.\"O Setting the options +オプションの設定 +.pg +.\"O Options may be set in a number of ways. Within the game, the `O' +.\"O command allows you to view all options and change most of them. +.\"O You can also set options automatically by placing them in the +.\"O NETHACKOPTIONS environment variable or in a configuration file. +.\"O Some versions of NetHack also have front-end programs that allow +.\"O you to set options before starting the game. +オプションを設定する方法にはいくつかある。ゲーム中に `O' コマンドを +使うことによって全てのオプションを見ることができ、そのほとんどを変更で +きる。また、環境変数``NETHACKOPTIONS''や設定ファイルで自動的に設定する +こともできる。NetHack のバージョンによってはゲーム開始前にオプションを設 +定することができるプログラムがついていることもある。 +.hn 2 +.\"O Using the NETHACKOPTIONS environment variable +環境変数 NETHACKOPTIONS を使う +.pg +.\"O The NETHACKOPTIONS variable is a comma-separated list of initial +.\"O values for the various options. Some can only be turned on or off. +.\"O You turn one of these on by adding the name of the option to the list, +.\"O and turn it off by typing a `!' or ``no'' before the name. Others take a +.\"O character string as a value. You can set string options by typing +.\"O the option name, a colon or equals sign, and then the value of the string. +.\"O The value is terminated by the next comma or the end of string. +環境変数 NETHACKOPTIONS にはいろいろなオプションの初期値をカンマで区 +切って列挙し設定する。オプションのうちのいくつかのものは単にオンかオフ +の選択ができるだけである。そのオプション名をリストに入れるとオンになり、 +オプション名の前に `!' か``no''をつけるとオフになる。その他のオプショ +ンでは設定値として文字列が必要である。これらのオプションを設定するには +オプション名、コロンまたはイコール記号、設定値の順で入力すればよい。 +設定値は次のカンマもしくは文字列の最後までとなる。 +.pg +.\"O For example, to set up an environment variable so that ``autoquiver'' is on, +.\"O ``autopickup'' is off, the name is set to ``Blue Meanie'', and the fruit +.\"O is set to ``papaya'', you would enter the command +例えば``autoquiver''をオン、``autopickup''をオフ、名前が``Blue Meanie'' +に、フルーツが``papaya''になるように環境変数を設定するには \fIcsh\fP では次の +コマンドを入力すればよい。 +(!は特殊文字なのでエスケープしてやる必要があることに注意) +.sd +% \fBsetenv NETHACKOPTIONS "autoquiver,\e!autopickup,name:Blue Meanie,fruit:papaya"\fP +.ed +.\"O in \fIcsh\fP (note the need to escape the ! since it's special to the shell), or +\fBsh\fP または \fBksh\fP では +.sd +$ \fBNETHACKOPTIONS="autoquiver,!autopickup,name:Blue Meanie,fruit:papaya"\fP +$ \fBexport NETHACKOPTIONS\fP +.ed +.\"O in \fIsh\fP or \fIksh\fP. +とすればよい。 +.hn 2 +.\"O Using a configuration file +設定ファイルを使う +.pg +.\"O Any line in the configuration file starting with `#' is treated as a comment. +.\"O Any line in the configuration file starting with ``OPTIONS='' may be +.\"O filled out with options in the same syntax as in NETHACKOPTIONS. +設定ファイルの中の`#'で始まる行はコメントとして扱われる。 +設定ファイルの中の``OPTION=''で始まる行は環境変数``NETHACKOPTIONS'' +と同じ文法でオプションが記述されているものと見なす。 +.\"O Any line starting with ``DUNGEON='', ``EFFECTS='', ``MONSTERS='', +.\"O ``OBJECTS='', ``TRAPS='', or ``BOULDER='' +.\"O is taken as defining the corresponding +.\"O .op dungeon, +.\"O .op effects, +.\"O .op monsters, +.\"O .op objects +.\"O .op traps +.\"O or +.\"O .op boulder +.\"O option in a different syntax, +.\"O a sequence of decimal numbers giving the character position +.\"O in the current font to be used in displaying each entry. +``DUNGEON=''、``EFFECTS=''、``MONSTERS=''、``OBJECTS=''、``TRAPS=''、``BOULDER=''で +始まる行はそれぞれ +.op dungeon +、 +.op effects +、 +.op monsters +、 +.op objects +、 +.op traps +、 +.op boulder + オプションとして扱われるが、その指定方法は、 +現在使われているフォントのかわりに使われるキャラクタコードを示す 10 進数の列である。 +.\"O A zero in any entry in such a sequence leaves the display of that +.\"O entry unchanged; this feature is not available using the option syntax. +この列に 0 を指定すると、その項目は変更されない。 +この機能はオプションの文法では利用できない。 +.\"O Such a sequence can be continued to multiple lines by putting a `\e' +.\"O at the end of each line to be continued. +この列は各行の最後に`\e'をつけることによって複数行に渡ることができる。 +.pg +.\"O If your copy of the game included the compile time AUTOPICKUP_EXCEPTIONS +.\"O option, then any line starting with ``AUTOPICKUP_EXCEPTION='' is taken +.\"O as defining an exception to the +.\"O .op pickup_types +.\"O option. +.\"O There is a section of this Guidebook that discusses that. +コンパイル時に AUTOPICKUP_EXCEPTIONS オプションが設定されていると、 +``AUTOPICKUP_EXCEPTION=''で始まる行によって +.op pickup_type +オプションの例外を定義できる。 +.pg +.\"O The default name of the configuration file varies on different +.\"O operating systems, but NETHACKOPTIONS can also be set to +.\"O the full name of a file you want to use (possibly preceded by an `@'). +標準設定の設定ファイル名は OS によって異なるが、 +環境変数``NETHACKOPTIONS''で +(先頭に`@'を付けることで)使用したい設定ファイル名を指定することができる。 +.hn 2 +.\"O Customization options +カスタマイズオプション +.pg +.\"O Here are explanations of what the various options do. +.\"O Character strings that are too long may be truncated. +.\"O Some of the options listed may be inactive in your dungeon. +以下にいろいろなオプションの役割を説明する。 +あまりに長すぎる文字列の部分は無視される。 +以下のオプションのうち実装によっては無効となっているオプションもある。 +.lp align +.\"O Your starting alignment (align:lawful, align:neutral, +.\"O or align:chaotic). You may specify just the first letter. +.\"O The default is to randomly pick an appropriate alignment. +.\"O Cannot be set with the `O' command. +スタート時の属性(align:lawful, align:neutral, align:chaotic)。 +最初の一文字で指定することもできる。 +標準設定ではランダムに選択される。 +`O' コマンドで設定することはできない。 +.lp autodig +.\"O Automatically dig if you are wielding a digging tool and moving into a place +.\"O that can be dug (default false). +掘るための道具を手にしていて、掘ることができる地形に移動しようとしたとき、 +自動的に掘る(標準設定はオフ)。 +.lp "autopickup " +.\"O Automatically pick up things onto which you move (default on). +.\"O See +.\"O .op pickup_types +.\"O to refine the behavior. +移動先にあるものを自動的に拾う(標準設定はオン)。 +この振る舞いをカスタマイズするためには +.op pickup_types +を参照すること。 +.lp "autoquiver " +.\"O This option controls what happens when you attempt the `f' (fire) +.\"O command with an empty quiver. When true, the computer will fill +.\"O your quiver with some suitable weapon. Note that it will not take +.\"O into account the blessed/cursed status, enchantment, damage, or +.\"O quality of the weapon; you are free to manually fill your quiver with +.\"O the `Q' command instead. If no weapon is found or the option is +.\"O false, the `t' (throw) command is executed instead. (default false) +このオプションは矢筒が空の時に`f'(fire:矢筒の中にあるものを発射する)コマンドを +実行した時にどうするかを決める。 +オンなら、コンピューターは適当な武器を矢筒に入れる。 +この時、呪い、祝福、魔法、劣化、武器の数などは考慮されないので注意すること。 +代わりに`Q'コマンドを使って自分の好きな物を矢筒に入れる。 +入れる武器がないか、このオプションがオフの時は +代わりに`t'(throw:物を投げる)コマンドが実行される。 +(標準設定はオフ) +.lp boulder +.\"O Set the character used to display boulders (default is rock class symbol). +巨岩を表示するのに用いるキャラクタ(標準設定は岩を表すキャラクタ)。 +.lp catname +.\"O Name your starting cat (ex. ``catname:Morris''). +.\"O Cannot be set with the `O' command. +スタート時の猫の名前(例: catname:Morris)。 +`O' コマンドで設定することはできない。 +.lp character +.\"O Pick your type of character (ex. ``character:Monk''); +.\"O synonym for ``role''. See ``name'' for an alternate method +.\"O of specifying your role. Normally only the first letter of +.\"O the value is examined; the string ``random'' is an exception. +キャラクターのタイプを設定する(例:``character:Monk'')。 +``role''オプションと同じである。 +職業を設定するその他の方法については``name''オプションを参照のこと。 +``random''以外の文字列は最初の 1 文字だけで判別される。 +.lp checkpoint +.\"O Save game state after each level change, for possible recovery after +.\"O program crash (default on). +プログラムがクラッシュした時に復旧できるように +階を移動する毎に状態をセーブする(標準設定はオン)。 +.lp "color " +.\"O Use color for different monsters, objects, and dungeon features +.\"O (default on for microcomputers). +色々な怪物や物や洞窟の地形をカラーで表示する +(マイクロコンピュータでは標準設定はオン)。 +.lp checkspace +.\"O Check free disk space before writing files to disk (default on). +.\"O You may have to turn this off if you have more than 2 GB free space +.\"O on the partition used for your save and level files. +.\"O Only applies when MFLOPPY was defined during compilation. +ファイルを書き込む前にディスクの空き容量をチェックする(標準設定はオン)。 +セーブファイルやレベルファイルのために使うパーティションに2GB以上の +空き容量がある場合、このオプションをオフをしなければならないかもしれない。 +このオプションはコンパイル時にMFLOPPYが定義されているときのみ適用される。 +.lp cmdassist +.\"O Have the game provide some additional command assistance for +.\"O new players if it detects some anticipated mistakes (default on). +ありがちなミスを検出したときに新規プレイヤーのために +追加のコマンド補助メッセージを表示する(標準設定はオン)。 +.lp "confirm " +.\"O Have user confirm attacks on pets, shopkeepers, and other +.\"O peaceable creatures (default on). +ペット、店主、その他の攻撃してこない生物を +攻撃しようとしたときに確認をする(標準設定はオン)。 +.lp DECgraphics +.\"O Use a predefined selection of characters from the DEC VT-xxx/DEC +.\"O Rainbow/ANSI line-drawing character set to display the dungeon/effects/traps +.\"O instead of having to define a full graphics set yourself (default off). +.\"O This option also sets up proper handling of graphics +.\"O characters for such terminals, so you should specify it when appropriate +.\"O even if you override the selections with your own graphics strings. +洞窟の表示に用いる文字をあなた自身ですべて定義する代わりに、 +DEC VT-xxx/DEC Rainbow/ANSI 罫線文字セットから +あらかじめ用意された設定を使用する(標準設定はオフ)。 +このオプションはまたターミナルが適切なグラフィックキャラクターを扱えるよう設定する。 +すなわち、あなたが自分でグラフィック文字を上書き設定するときにも +明示しなくてはいけない。 +.lp disclose +.\"O Controls options for disclosing various information when the game ends (defaults +.\"O to all possibilities being disclosed). +.\"O The possibilities are: +.\"O .sd +.\"O .si +.\"O i - disclose your inventory. +.\"O a - disclose your attributes. +.\"O v - summarize monsters that have been vanquished. +.\"O g - list monster species that have been genocided. +.\"O c - display your conduct. +.\"O .ei +.\"O .ed +ゲーム終了時に表示する情報を制御する(標準設定は、全てを表示する)。 +設定できるものは以下の通り。 +.sd +.si +i - 持ち物の鑑定 +a - 属性の公開 +v - 退治した怪物の一覧 +g - 抹殺した怪物種 +c - 挑戦 +.ei +.ed +.\"O Each disclosure possibility can optionally be preceded by a prefix which +.\"O let you refine how it behaves. Here are the valid prefixes: +.\"O .sd +.\"O .si +.\"O y - prompt you and default to yes on the prompt. +.\"O n - prompt you and default to no on the prompt. +.\"O + - disclose it without prompting. +.\"O - - do not disclose it and do not prompt. +.\"O .ei +.\"O .ed +それぞれの表示に対して、その前にどのように振舞うかを指示する文字を +つけることができる。文字の意味は以下のとおり。 +.sd +.si +y - 確認するが、標準設定はイエスにする。 +n - 確認するが、標準設定はノーにする。 ++ - 確認なしに表示する。 +- - 確認なしで非表示とする。 +.ei +.ed +.\"O (ex. ``disclose:yi na +v -g -c'') +(例: ``disclose:yi na +v -g -c'') +.\"O The example sets +.\"O .op inventory +.\"O to prompt and default to yes, +.\"O .op attributes +.\"O to prompt and default to no, +.\"O .op vanquished +.\"O to disclose without prompting, +.\"O .op genocided +.\"O to not disclose and not to prompt, +.\"O .op conduct +.\"O to not disclose and not to prompt. +このように設定した場合、 +.op 持ち物 +は確認する(標準設定はイエス)。 +.op 属性 +は確認する(標準設定はノー)。 +.op 退治した怪物 +は確認なしに表示する。 +.op 抹殺した怪物 +は確認せずに非表示とする。 +.op 挑戦 +は確認せずに非表示とする。 +.\"O Note that the vanquished monsters list includes all monsters killed by +.\"O traps and each other as well as by you. +退治した怪物の一覧は罠や同士討ちによって死んだ怪物も含むことに注意。 +.lp dogname +.\"O Name your starting dog (ex. ``dogname:Fang''). +.\"O Cannot be set with the `O' command. +スタート時の犬の名前(例: dogname:Fang)。 +`O' コマンドで設定することはできない。 +.lp dungeon +.\"O Set the graphics symbols for displaying the dungeon +.\"O (default \&``\ |--------||.-|++##.##<><>_|\e\e#{}.}..##\ #}''). +迷宮表示のためのグラフィックシンボルを設定する +(標準設定は \&``\ |--------||.-|++##.##<><>_|\e\e#{}.}..##\ #}'') +.\"O The +.\"O .op dungeon +.\"O option should be followed by a string of 1-41 +.\"O characters to be used instead of the default map-drawing characters. +.op dungeon +オプションは標準設定の文字の代わりに地図を描くのに使用する 1 から 41 文字の +文字列を書く。 +.\"O The dungeon map will use the characters you specify instead of the +.\"O default symbols, and default symbols for any you do not specify. +.\"O Remember that you may need to escape some of these characters +.\"O on a command line if they are special to your shell. +標準設定の文字の代わりにここで設定した文字を使って洞窟の地図が +表示され、標準設定の文字は使われない。 +もしあなたのシェルが特別扱いする文字を使うなら、 +それらのキャラクタをエスケープする必要があるかもしれないことに注意。 + +.\"O Note that NetHack escape-processes this option string in conventional C +.\"O fashion. This means that `\e' is a prefix to take the following +.\"O character literally. Thus `\e' needs to be represented as `\e\e'. +.\"O The special escape +.\"O form `\em' switches on the meta bit in the following character, and the `^' +.\"O prefix causes the following character to be treated as a control +.\"O character. +このオプションで設定される文字列は、現在では通常の C 言語で使 +われる方式でエスケープ処理されることに注意しなくてはならない。 +`\e' の後の文字はその文字そのものとして取り扱われ、 +特別なプレフィックスとしては扱われないということである。 +従って、`\e' は `\e\e' とする必要がある。 +特殊なエスケープ形式である `\em' は後ろの文字のメタビットをオンにし、 +'^' プレフィックスは後ろの文字をコントロールキャラクタとみなすようにする。 + +.\"O The order of the symbols is: solid rock, vertical wall, horizontal +.\"O wall, upper left corner, upper right corner, lower left corner, lower +.\"O right corner, cross wall, upward T wall, downward T wall, leftward T +.\"O wall, rightward T wall, no door, vertical open door, horizontal open +.\"O door, vertical closed door, horizontal closed door, iron bars, tree, +.\"O floor of a room, dark corridor, lit corridor, stairs up, stairs down, +.\"O ladder up, ladder down, altar, grave, throne, kitchen sink, fountain, pool or moat, +.\"O ice, lava, vertical lowered drawbridge, horizontal lowered drawbridge, +.\"O vertical raised drawbridge, horizontal raised drawbridge, air, cloud, +.\"O under water. +シンボルは以下の順序である: +堅い岩、壁(縦)、壁(横)、左上の角、右上の角、左下の角、右下の角, +壁の交差、T 字状の壁、逆 T 字状の壁、左向きの T字状の壁, +右向きの T 字状の壁、扉のない出入口、開いた扉(縦)、開いた扉(横), +閉じた扉(縦)、閉じた扉(横)、鉄の棒、木、部屋の床、暗い通路、明るい通路, +上への階段、下への階段、上へのはしご、下へのはしご、祭壇、墓, 玉座、 +流し台、泉、水たまりまたは堀、氷、溶岩、降りている跳ね橋(縦)、 +降りている跳ね橋(横)、上がっている跳ね橋(縦)、上がっている跳ね橋(横)、 +空気、雲、水中 + +.\"O You might want to use `+' for the corners and T walls for a more +.\"O aesthetic, boxier display. Note that in the next release, new symbols +.\"O may be added, or the present ones rearranged. +より美しく四角の表示を得るためには角と T 字状の壁に '+' を使った +方がよいかも知れない。 +次のリリースでは新しいシンボルが加わったり、 +現在のものが再構成される可能性があるので注意。 + +.\"O Cannot be set with the `O' command. +`O' コマンドで設定することはできない。 +.lp effects +.\"O Set the graphics symbols for displaying special effects +.\"O (default \&``|-\e\e/*!)(0#@*/-\e\e||\e\e-//-\e\e|\ |\e\e-/''). +効果表示のためのグラフィックシンボルを設定する +(標準設定は\&``|-\e\e/*!)(0#@*/-\e\e||\e\e-//-\e\e|\ |\e\e-/''). +.\"O The +.\"O .op effects +.\"O option should be followed by a string of 1-29 +.\"O characters to be used instead of the default special-effects characters. +.op effects +オプションは標準設定の文字の代わりに地図を描くのに使用する 1-29 文字の +文字列を書く。 +.\"O This string is subjected to the same processing as the +.\"O .op dungeon +.\"O option. +この文字列は +.op dungeon +オプションと同様に処理される。 + +.\"O The order of the symbols is: vertical beam, horizontal beam, left slant, +.\"O right slant, digging beam, camera flash beam, left boomerang, right boomerang, +.\"O four glyphs giving the sequence for magic resistance displays, +.\"O the eight surrounding glyphs for swallowed display, +.\"O nine glyphs for explosions. +シンボルは以下の順序である: +光線(縦)、光線(横)、光線(左上から右下)、光線(右上から左下)、 +掘削光線、カメラのフラッシュ、ブーメラン(左)、ブーメラン(右)、 +魔法防御に用いる 4 つの記号、飲み込まれたときに使われる 8 つの記号、 +爆発に用いる 9 つの記号。 +.\"O An explosion consists of three rows (top, middle, and bottom) of three +.\"O characters. The explosion is centered in the center of this 3 by 3 +.\"O array. +爆発は 3 キャラクタ 3 列からなり、 +爆発の中心はこの 3 × 3 の配列の中心になる。 + +.\"O Note that in the next release, new symbols may be added, +.\"O or the present ones rearranged. +次のリリースでは新しいシンボルが加わったり、 +現在のものが再構成される可能性があるので注意。 + +.\"O Cannot be set with the `O' command. +`O' コマンドで設定することはできない。 +.lp extmenu +.\"O Changes the extended commands interface to pop-up a menu of available commands. +.\"O It is keystroke compatible with the traditional interface except that it does +.\"O not require that you hit Enter. It is implemented only by the tty port +.\"O (default off), when the game has been compiled to support tty graphics. +拡張コマンドインターフェースを、有効なコマンドの一覧メニューが出るように変更する。 +キー入力は、最後に Enter を押す必要がないこと以外は伝統的なインターフェースと互換性がある。 +tty インターフェースにだけ実装されている。(標準設定はオフ) +.lp female +.\"O An obsolete synonym for ``gender:female''. +``gender:female'' の古い別名。 +.\"O Cannot be set with the `O' command. +`O' コマンドで設定することはできない。 +.lp fixinv +.\"O An object's inventory letter sticks to it when it's dropped (default on). +.\"O If this is off, dropping an object shifts all the remaining inventory letters. +持物の目録記号と物との対応はその物を下に置いても +変化しない(標準設定はオン)。 +オフにしたときは物を下に置くとその物の目録記号以降の記号と +物との対応が 1 つずつずれる。 +.lp "fruit " +.\"O Name a fruit after something you enjoy eating (ex. ``fruit:mango'') +.\"O (default ``slime mold''). Basically a nostalgic whimsy that NetHack uses +.\"O from time to time. You should set this to something you find more +.\"O appetizing than slime mold. Apples, oranges, pears, bananas, and melons +.\"O already exist in NetHack, so don't use those. +あなたの好物の果物にちなんでその名前を設定する(例:fruit:mango) +(標準設定は「slime mold」)。 +元来 NetHack で時々使われる懐古趣味的な妙な言葉である。 +slime mold(ネバネバかび)よりももっと食欲のわく食べ物にするべきであろう。 +apples(リンゴ)、oranges(オレンジ)、 pears(洋なし)、 bananas(バナナ)、 +melons (メロン) は NetHack にはもう存在しているので、設定してはならない。 +.lp gender +.\"O Your starting gender (gender:male or gender:female). +.\"O You may specify just the first letter. Although you can +.\"O still denote your gender using the ``male'' and ``female'' +.\"O options, the ``gender'' option will take precedence. +.\"O The default is to randomly pick an appropriate gender. +開始時の性別(gender:male または gender:female). +最初の一文字で指定することもできる。 +``male'' と ``female'' オプションを指定していても、 +``gender'' オプションが優先される。 +標準設定では適切な性別がランダムに選択される。 +.\"O Cannot be set with the `O' command. +`O' コマンドで設定することはできない。 +.lp "help " +.\"O If more information is available for an object looked at +.\"O with the `/' command, ask if you want to see it (default on). Turning help +.\"O off makes just looking at things faster, since you aren't interrupted with the +.\"O ``More info?'' prompt, but it also means that you might miss some +.\"O interesting and/or important information. +`/' コマンドを使って調べている物について何らかの情報がある場合、 +それを見るかどうかを尋ねる(標準設定はオン)。 +ヘルプが出ないようにすれば ``More info?'' というプロンプトに煩わされなくなるので、 +素早く物を調べることができる。 +しかしそれは興味深く重要な情報を見逃してしまうかも知れないことを意味する。 +.lp hilite_pet +.\"O Visually distinguish pets from similar animals (default off). +.\"O In text windowing, use text highlighting when color is turned off; +.\"O with X tiles, display a heart symbol near pets. +ペットを同種の動物から視覚的に区別する(標準設定はオフ)。 +テキストウィンドウ表示では color がオフのときに強調表示する。 +Xのタイルを使用するときは、ハートの記号をペットにつける。 +.lp horsename +.\"O Name your starting horse (ex. ``horsename:Trigger''). +開始時の馬の名前をつける (例:``horsename:Trigger''). +.\"O Cannot be set with the `O' command. +`O' コマンドで設定することはできない。 +.lp IBMgraphics +.\"O Use a predefined selection of IBM extended ASCII characters to display the +.\"O dungeon/effects/traps instead of having to define a full graphics set +.\"O yourself (default off). +洞窟、効果、罠の表示に用いる文字をあなた自身ですべて定義する代わりに、 +IBM 拡張 ASCII 文字セットからあらかじめ用意された設定を使用する +(標準設定はオフ)。 +.\"O This option also sets up proper handling of graphics +.\"O characters for such terminals, so you should specify it when appropriate +.\"O even if you override the selections with your own graphics strings. +このオプションはまたターミナルが適切なグラフィックキャラクターを扱えるよう設定する。 +すなわち、あなたが自分のグラフィック文字で上書き設定するときにも +明示しなくてはいけない。 +.lp ignintr +.\"O Ignore interrupt signals, including breaks (default off). +ブレークを含む割り込み信号を無視する(標準設定はオフ)。 +.lp legacy +.\"O Display an introductory message when starting the game (default on). +ゲーム開始時に説明メッセージを表示する(標準設定はオン)。 +.lp lit_corridor +.\"O Show corridor squares seen by night vision or a light source held by your +.\"O character as lit (default off). +夜目やあなたのキャラクタが持っている光源によって見える通路を +表示する (標準設定はオフ)。 +.lp lootabc +.\"O Use the old `a', `b', and `c' keyboard shortcuts when +.\"O looting, rather than the mnemonics `o', `i', and `b' (default off). +箱を開けるときに`o', `i', `b'ではなく`a', `b', `c'のキーを使う +(標準設定はオフ)。 +.lp "mail " +.\"O Enable mail delivery during the game (default on). +ゲーム中にメールを配達するようにする(標準設定はオン)。 +.lp "male " +.\"O An obsolete synonym for ``gender:male''. +``gender:male'' の古くなった別名。 +.\"O Cannot be set with the `O' command. +`O' コマンドで設定することはできない。 +.lp menustyle +.\"O Controls the interface used when you need to choose various objects (in +.\"O response to the Drop command, for instance). The value specified should +.\"O be the first letter of one of the following: traditional, combination, +.\"O partial, or full. Traditional was the only interface available for +.\"O earlier versions; it consists of a prompt for object class characters, +.\"O followed by an object-by-object prompt for all items matching the selected +.\"O object class(es). Combination starts with a prompt for object class(es) +.\"O of interest, but then displays a menu of matching objects rather than +.\"O prompting one-by-one. Partial skips the object class filtering and +.\"O immediately displays a menu of all objects. Full displays a menu of +.\"O object classes rather than a character prompt, and then a menu of matching +.\"O objects for selection. +いろいろなオブジェクトを指定するとき(たとえば Dropコマンド)に用 +いるインタフェースの制御。値は tradional, combination, partial, full +の 4 つのタイプの最初の一文字を指定する。 +``tradional''は古いバージョンで唯一利用できたもので、 +物の種類を示す文字の入力、次に選んだ種類に当てはまる全ての物を一つずつ +確認する。 +``combination''は選択したい物の種類を示す文字を入力するが、 +次に当てはまる物を一つずつ確認で選択するのではなく、メニュー形式で選択する。 +``partial''は物の種類を選ぶことをせず、 +直ちに全ての物が表示されたメニューを表示する。 +``full''は物の種類の文字入力のかわりに、最初に物の種類のメニューを表示し、 +それから選択した種類に当てはまる物のメニューを表示する。 +.lp menu_deselect_all +.\"O Menu character accelerator to deselect all items in a menu. +.\"O Implemented by the Amiga, Gem, X11 and tty ports. +.\"O Default '-'. +メニューの全ての項目を非選択にするキー。 +Amiga, Gem, X11, ttyで実装されている。(標準設定は `-') +.lp menu_deselect_page +.\"O Menu character accelerator to deselect all items on this page of a menu. +.\"O Implemented by the Amiga, Gem and tty ports. +.\"O Default '\e'. +メニューのうち、現在表示されている全ての項目を非選択にするキー。 +Amiga, Gem, tty で実装されている。(標準設定は `\e') +.lp menu_first_page +.\"O Menu character accelerator to jump to the first page in a menu. +.\"O Implemented by the Amiga, Gem and tty ports. +.\"O Default '^'. +メニューの最初のページへ移動するキー。 +Amiga, Gem, tty で実装されている。(標準設定は `^') +.lp menu_headings +.\"O Controls how the headings in a menu are highlighted. +.\"O Values are 'bold', 'inverse', or 'underline'. +.\"O Not all ports can actually display all three types. +メニューのうち注目している部分をどのように表示するかを指定する。 +値は 'bold'(太字), 'inverse'(反転), 'underline'(下線)のいずれかである。. +全てのポートで実際に三つ全てのタイプを表示できるわけではない。 +.lp menu_invert_all +.\"O Menu character accelerator to invert all items in a menu. +.\"O Implemented by the Amiga, Gem, X11 and tty ports. +.\"O Default '@'. +メニューの全ての項目の選択状態を反転するキー。 +Amiga, Gem, X11, tty で実装されている。(標準設定は `@') +.lp menu_invert_page +.\"O Menu character accelerator to invert all items on this page of a menu. +.\"O Implemented by the Amiga, Gem and tty ports. +.\"O Default '~'. +メニューの現在のページの全ての項目の選択状態を反転するキー。 +Amiga, Gem, tty で実装されている。(標準設定は `~') +.lp menu_last_page +.\"O Menu character accelerator to jump to the last page in a menu. +.\"O Implemented by the Amiga, Gem and tty ports. +.\"O Default '|'. +メニューの最後のページへ移動するキー。 +Amiga, Gem, tty で実装されている。(標準設定は '|') +.lp menu_next_page +.\"O Menu character accelerator to goto the next menu page. +.\"O Implemented by the Amiga, Gem and tty ports. +.\"O Default '>'. +メニューの次のページへ移動するキー。 +Amiga, Gem, tty で実装されている。(標準設定は `>') +.lp menu_previous_page +.\"O Menu character accelerator to goto the previous menu page. +.\"O Implemented by the Amiga, Gem and tty ports. +.\"O Default '<'. +メニューの前のページへ移動するキー。 +Amiga, Gem, tty で実装されている。(標準設定は `<') +.lp menu_search +.\"O Menu character accelerator to search for a menu item. +.\"O Implemented by the Amiga, Gem and X11 ports. +.\"O Default ':'. +メニューで検索を行うキー。 +Amiga, Gem, X11 で実装されている。(標準設定は `:') +.lp menu_select_all +.\"O Menu character accelerator to select all items in a menu. +.\"O Implemented by the Amiga, Gem, X11 and tty ports. +.\"O Default '.'. +メニューの全ての項目を選択にするキー。 +Amiga, Gem, X11, tty で実装されている。(標準設定は `.') +.lp menu_select_page +.\"O Menu character accelerator to select all items on this page of a menu. +.\"O Implemented by the Amiga, Gem and tty ports. +.\"O Default ','. +メニューのうち、現在表示されている全ての項目を選択にするキー。 +Amiga, Gem, tty で実装されている。(標準設定は `,') +.lp monsters +.\"O Set the characters used to display monster classes (default +.\"O ``abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@\ \'&;:~]''). +怪物の種類を表示するのに使用するキャラクタを指定する。 +(標準設定は +``abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@\ \'&;:~]''). +.\"O This string is subjected to the same processing as the +.\"O .op dungeon +.\"O option. +この文字列は +.op dungeon +オプションと同様に処理される。 +.\"O The order of the symbols is +シンボルの順序は、 +ant or other insect(蟻あるいはその他の昆虫), +blob(ブロッブ), +cockatrice(コカトリス), +dog or other canine(犬またはその他のイヌ科の動物), +eye or sphere(目または球体), +feline(猫), +gremlin(グレムリン), +humanoid(人間), +imp or minor demon(インプまたは低級悪魔), +jelly(ゼリー), +kobold(コボルド), +leprechaun(レプラコーン), +mimic(ミミック), +nymph(ニンフ), +orc(オーク), +piercer(突き刺すもの), +quadruped(四つ足動物), +rodent(鼠), +arachnid or centipede(くもまたはムカデ), +trapper or lurker above(トラッパーまたは天井に潜むもの), +horse or unicorn(馬またはユニコーン), +vortex(渦巻き), +worm(ワーム), +xan or other mythical/fantastic insect(ザンまたはその他の不思議な昆虫), +light(ライト), +zruty(ズルティ), +angelic being(天使のような存在), +bat or bird(コウモリまたは鳥), +centaur(ケンタウルス), +dragon(龍), +elemental(エレメンタル), +fungus or mold(カビやコケ), +gnome(ノーム), +giant humanoid(大型人類), +invisible monster(見えない怪物), +jabberwock(ジャバーウォック), +Keystone Kop(キーストーンコップ), +lich(リッチ), +mummy(ミイラ), +naga(ナーガ), +ogre(オーガ), +pudding or ooze(スライム), +quantum mechanic(量子力学), +rust monster(錆の怪物), +snake(蛇), +troll(トロール), +umber hulk(アンバーハルク), +vampire(バンパイア), +wraith(レイス), +xorn(ゾーン), +apelike creature(猿のような生き物), +zombie(ゾンビ), +human(人間), +ghost(幽霊), +golem(ゴーレム), +demon(悪魔), +sea monster(海の怪物), +lizard(トカゲ), +long worm tail(ロングワームの尻尾), +mimic(ミミック) +.\"O Cannot be set with the `O' command. +`O' コマンドで設定することはできない。 +.lp msghistory +.\"O The number of top line messages to save (and recall with ^P) (default 20). +後で ^P で呼び出すために保存しておく最上行のメッセージの数(標準設定は 20)。 +.\"O Cannot be set with the `O' command. +`O' コマンドで設定することはできない。 +.lp msg_window +.\"O Allows you to change the way recalled messages are displayed. +.\"O (It is currently implemented for tty only.) +.\"O The possible values are: +.\"O .sd +.\"O .si +.\"O s - single message (default, this was the behavior before 3.4.0). +.\"O c - combination, two messages as `single', then as `full'. +.\"O f - full window, oldest message first. +.\"O r - full window, newest message first. +.\"O .ei +.\"O .ed +.\"O For backward compatibility, no value needs to be specified (which +.\"O defaults to `full'), or it can be negated (which defaults to `single'). +過去のメッセージの表示方法を変更する(現時点では tty にのみ実装されている)。 +指定できる値は以下のとおり。 +.sd +.si +s - `single': 1 メッセージだけ (標準設定。これは 3.4.0 以前での振る舞いである) +c - `conbination': 最初の 2 メッセージは `single'、その後は `full'。 +f - `full': 全画面。古いメッセージが先。 +r - 全画面。新しいメッセージが先。 +.ei +.ed +過去との互換性のために、値なしにもできる(`full'とみなす)し、 +否定もできる(`single'とみなす)。 +.lp "name " +.\"O Set your character's name (defaults to your user name). You can also +.\"O set your character's role by appending a dash and one or more letters of +.\"O the role (that is, by suffixing one of +.\"O .op "-A -B -C -H -K -M -P -Ra -Ro -S -T -V -W" ). +あなたのキャラクタの名前を設定する(標準設定はあなたの ユーザー名)。 +-記号とキャラクタの職業の頭文字を付け加える(つまり +.op "-A -B -C -H -K -M -P -Ra -Ro -S -T -V -W" +のどれかを後に付ける)ことによって職業を設定することもできる。 +.\"O If +.\"O .op "-@" +.\"O is used for the role, then a random one will be automatically chosen. +職業として +.op "-@" +を使用すると、ランダムなひとつが自動的に選択される。 +.\"O Cannot be set with the `O' command. +`O' コマンドで設定することはできない。 +.lp "news " +.\"O Read the NetHack news file, if present (default on). +.\"O Since the news is shown at the beginning of the game, there's no point +.\"O in setting this with the `O' command. +NetHack のニュースファイルがあればそれを読む(標準設定はオン)。 +ニュースはゲームの最初に表示されるので、 +`O' コマンドでこれを設定するのは無意味である。 +.lp "null " +.\"O Send padding nulls to the terminal (default off). +端末にパディングのためのナルキャラクタを送る(標準設定はオフ)。 +.lp number_pad +.\"O Use the number keys to move instead of [yuhjklbn] (default 0 or off). +.\"O (number_pad:2 invokes the old DOS behavior where `5' means `g', meta-`5' +.\"O means `G', and meta-`0' means `I'.) +移動のために[yuhjklbn]のかわりに数字キーを使用する(標準設定は 0 またはオフ)。 +(number_pad:2 は昔の DOS 版の振る舞いにする。 +`5'は`g'、meta-`5'は`G'、meta-`0'は`I'となる。) +.lp objects +.\"O Set the characters used to display object classes +.\"O (default ``])[="(%!?+/$*`0_.''). +物の種類を表示する時に使う文字を設定する +(標準設定は ``])[="(%!?+/$*`0_.'') +.\"O This string is subjected to the same processing as the +.\"O .op dungeon +.\"O option. +この文字列は +.op dungeon +オプションと同様に処理される。 +.\"O The order of the symbols is +.\"O illegal-object (should never be seen), weapon, armor, ring, amulet, tool, +.\"O food, potion, scroll, spellbook, wand, gold, gem or rock, boulder or statue, +.\"O iron ball, chain, and venom. +シンボルの順番は +(見たこともないような)おかしな物体、武器、防具、指輪、魔除け、工具、 +食料、水薬、巻物、魔法書、杖、金貨、宝石または石、巨石または彫像、 +鉄球、鎖、毒液。 +.\"O Cannot be set with the `O' command. +`O' コマンドで設定することはできない。 +.lp packorder +.\"O Specify the order to list object types in (default ``")[%?+!=/(*`0_'') +.\"O The value of this option should be a string containing the +.\"O symbols for the various object types. Any omitted types are filled in +.\"O at the end from the previous order. +物の種類を表示するときの順番を指定する(標準設定は +``")[%?+!=/(*`0_''). +このオプションにはいろいろな物の種類を表す文字の列を設定する。 +設定されなかった種類は以前の順序で最後に表示される。 +.lp perm_invent +.\"O If true, always display your current inventory in a window. This only +.\"O makes sense for windowing system interfaces that implement this feature. +もしオンならば、現在の持ち物一覧を常にウィンドウに表示しておく。 +この機能が実装されているウィンドウシステムでのみ有効。 +.lp pettype +.\"O Specify the type of your initial pet, if you are playing a character class +.\"O that uses multiple types of pets; or choose to have no initial pet at all. +.\"O Possible values are ``cat'', ``dog'' and ``none''. +プレイするキャラクタクラスが複数のタイプのペットを使用できる時に +初期のペットを指定する、または初期のペットを全く指定しない。 +指定出来るのは``cat'', ``dog'', ``none'' である。 +.\"O Cannot be set with the `O' command. +`O' コマンドで設定することはできない。 +.lp pickup_burden +.\"O When you pick up an item that would exceed this encumbrance +.\"O level (Unburdened, Burdened, streSsed, straiNed, overTaxed, +.\"O or overLoaded), you will be asked if you want to continue. +.\"O (Default `S'). +物を拾った時にここで指定した荷物の重さレベル +(Unburdened, Burdened, streSsed, straiNed, overTaxed, overLoaded) +以上になると、続行するかどうかを確認する。 +(標準設定は `S'). +.lp pickup_types +.\"O Specify the object types to be picked up when +.\"O .op autopickup +.\"O is on. Default is all types. If your copy of the game has the experimental +.\"O compile time option AUTOPICKUP_EXCEPTIONS included, you may be able to use +.\"O .op autopickup_exception +.\"O configuration file lines to further refine +.\"O .op autopickup +.\"O behavior. +.op autopickup +オプションが設定されている時に拾う物の種類を指定する(標準設定は全ての種類)。 +実験的コンパイル時オプションである AUTOPICKUP_EXCEPTIONS が指定されていると、 +.op autopickup_exception +行を使うことで +.op autopickup +の振る舞いをより細かく制御できる。 +.lp prayconfirm +.\"O Prompt for confirmation before praying (default on). +神に祈る前に確認する(標準設定はオン)。 +.lp preload_tiles +.\"O For the protected mode MSDOS version, control whether tiles +.\"O get pre-loaded into RAM at the start of the game. Doing so +.\"O enhances performance of the tile graphics, but uses more memory. (default on). +MSDOSのプロテクトモードで、タイルをゲームの始めにあらかじめ RAM に +読み込んでおくかどうかを制御する。 +オンにすると、タイルグラフィックのパフォーマンスが高まるが、 +より多くのメモリを使用する(標準設定はオン)。 +.\"O Cannot be set with the `O' command. +`O' コマンドで設定することはできない。 +.lp pushweapon +.\"O Using the `w' (wield) command when already wielding +.\"O something pushes the old item into your alternate weapon slot (default off). +既に武器を持っている時に `w' (wield: 武器を持つ) コマンドを使ったとき、 +既に持っていた武器を予備の武器に設定する(標準設定はオフ)。 +.lp "race " +.\"O Selects your race (for example, ``race:human''). Default is random. +種族を選択する(例: ``race:human'')。標準設定はランダムである。 +.\"O Cannot be set with the `O' command. +`O' コマンドで設定することはできない。 +.lp rest_on_space +.\"O Make the space bar a synonym for the `.' (rest) command (default off). +スペースキーを `.'(rest: 休憩する) コマンドとして使用する +(標準設定はオフ)。 +.lp "role " +.\"O Pick your type of character (ex. ``role:Samurai''); +.\"O synonym for ``character''. See ``name'' for an alternate method +.\"O of specifying your role. Normally only the first letter of the +.\"O value is examined; `r' is an exception with ``Rogue'', ``Ranger'', +.\"O and ``random'' values. +キャラクターのタイプを設定する (例:``role:Samurai'')。 +``character''オプションと同じである。 +職業を設定するその他の方法については``name''オプションを参照のこと。 +普通は先頭の 1 文字だけで判別されるが、 +`r'は例外である。``Rogue''、``Ranger''、``random''があるからである。 +.lp runmode +.\"O Controls the amount of screen updating for the map window when engaged +.\"O in multi-turn movement (running via shift+direction or control+direction +.\"O and so forth, or via the travel command or mouse click). +「まとめて移動」する(shift+方向やcontrol+方向で移動するか、 +旅行コマンドやマウスのクリックを使った場合) +ときにどれくらいの頻度で地図を更新するかを制御する。 +.\"O The possible values are: +.\"O .sd +.\"O .si +.\"O teleport - update the map after movement has finished; +.\"O run - update the map after every seven or so steps; +.\"O walk - update the map after each step; +.\"O crawl - like walk, but pause briefly after each step. +.\"O .ei +.\"O .ed +設定可能な値は以下の通り。 +.sd +.si +teleport - 移動が完了してから地図を更新する。 +run - 7 歩ぐらい毎に地図を更新する。 +walk - 1 歩毎に地図を更新する。 +crawl - ``walk'' と同様だが、一歩毎にしばらく停止する。 +.ei +.ed +.\"O This option only affects the game's screen display, not the actual +.\"O results of moving. The default is `run'; versions prior to 3.4.1 +.\"O used `teleport' only. Whether or not the effect is noticeable will +.\"O depend upon the window port used or on the type of terminal. +このオプションは画面表示にのみ影響し、実際の移動結果には影響しない。 +標準設定は `run' である。バージョン 3.4.1 以前は `teleport' のみであった。 +効果が確認できるかどうかは使っている版や端末の種類に依存する。 +.lp safe_pet +.\"O Prevent you from (knowingly) attacking your pets (default on). +ペットを(ペットと知りつつ)攻撃してしまうのを防ぐ(標準設定はオン)。 +.lp scores +.\"O Control what parts of the score list you are shown at the end (ex. +.\"O ``scores:5 top scores/4 around my score/own scores''). Only the first +.\"O letter of each category (`t', `a', or `o') is necessary. +最後にスコアリストのどの部分を見るかを制御する +(例:``scores:5 top scores/4 around my score/own scores'')。 +それぞれの分野の最初の文字 (`t', `a', `o')のみが必要である。 +.lp showexp +.\"O Show your accumulated experience points on bottom line (default off). +最下行に現在の経験点を表示する(標準設定はオフ)。 +.lp showrace +.\"O Display yourself as the glyph for your race, rather than the glyph +.\"O for your role (default off). Note that this setting affects only +.\"O the appearance of the display, not the way the game treats you. +あなたを表示するときに、職業に対応するマークではなく、 +種族に対応するマークで表示する(標準設定はオフ)。 +この設定は表示にだけ用いられ、ゲームとしては何も変わらないことに注意。 +.lp showscore +.\"O Show your approximate accumulated score on bottom line (default off). +最下行に現在のスコアを表示する(標準設定はオフ)。 +.lp "silent " +.\"O Suppress terminal beeps (default on). +端末のビープ音を鳴らさない(標準設定はオン)。 +.lp sortpack +.\"O Sort the pack contents by type when displaying inventory (default on). +持物の目録を表示するとき種類毎に荷物の内容を並べ替える +(標準設定はオン)。 +.lp sound +.\"O Enable messages about what your character hears (default on). +.\"O Note that this has nothing to do with your computer's audio capabilities. +.\"O This option is only partly under player control. The game toggles it +.\"O off and on during and after sleep, for example. +あなたのキャラクターが聞いたものに関するメッセージを表示する(標準設定はオン)。 +これはコンピューターの音声出力機能とは何の関係もないことに注意すること。 +このオプションは部分的にだけプレイヤーの制御下にある。 +例えば、眠っている間はこのオプションは自動的にオフにされ、 +目覚めるとオンになる。 +.lp sparkle +.\"O Display a sparkly effect when a monster (including yourself) is hit by an +.\"O attack to which it is resistant (default on). +怪物(やあなた)が攻撃を受け、それに抵抗した場合に画面効果を表示する +(標準設定はオン)。 +.lp standout +.\"O Boldface monsters and ``\fB--More--\fP'' (default off). +怪物と``\fB--More--\fP''を太字で表示する(標準設定はオフ)。 +.lp suppress_alert +.\"O This option may be set to a NetHack version level to suppress +.\"O alert notification messages about feature changes for that +.\"O and prior versions (ex. ``suppress_alert:3.3.1''). +前のバージョンから変更された機能に対して注意を促すメッセージを +表示しないようにする NetHack のバージョンを設定する。 +(例: ``suppress_alert:3.3.1'') +例のように指定すると 3.3.1 以前に変更された機能に対する注意メッセージは表示されない。 +.lp "time " +.\"O Show the elapsed game time in turns on bottom line (default off). +最下行にゲームで経過した時間をターン数で表示する(標準設定はオフ)。 +.lp timed_delay +.\"O When pausing momentarily for display effect, such as with explosions and +.\"O moving objects, use a timer rather than sending extra characters to the +.\"O screen. (Applies to ``tty'' interface only; ``X11'' interface always +.\"O uses a timer based delay. The default is on if configured into the +.\"O program.) +爆発や物体の移動など、効果を表示するためにちょっと時間待ちするとき、 +特殊なキャラクタを画面に送るかわりにタイマーを使用する。 +(tty インタフェースにのみ適用される。 +X11 インタフェースは常にタイマーを使用する。 +標準設定はタイマーによる時間待ちが組み込まれているならばオン) +.lp tombstone +.\"O Draw a tombstone graphic upon your death (default on). +死んだとき墓石を表示する(標準設定はオン)。 +.lp toptenwin +.\"O Put the ending display in a NetHack window instead of on stdout (default off). +.\"O Setting this option makes the score list visible when a windowing version +.\"O of NetHack is started without a parent window, but it no longer leaves +.\"O the score list around after game end on a terminal or emulating window. +ゲーム終了時の表示を標準出力のかわりにNetHackのウィンドウに表示する +(標準設定はオフ)。 +このオプションを設定すると +ウィンドウを使うバージョンの NetHack では +起動した親ウィンドウとは別のウィンドウにスコアリストが表示される。 +しかし、スコアリストはゲームが終了したあとターミナルやウィンドウには残らない。 +.lp traps +.\"O Set the graphics symbols for displaying traps +.\"O (default \&``^^^^^^^^^^^^^^^^^"^^^^''). +罠の種類を表示するのに使用するキャラクタを指定する。(標準設定は +\&``^^^^^^^^^^^^^^^^^"^^^^''). +.\"O The +.\"O .op traps +.\"O option should be followed by a string of 1-22 +.\"O characters to be used instead of the default traps characters. +.op traps +オプションは標準設定の文字の代わりに罠を描くのに使用する +1 から 22 文字の文字列を書く。 +この文字列は dungeon +オプションと同じ処理をする。 +.\"O This string is subjected to the same processing as the +.\"O .op dungeon +.\"O option. +この文字列は +.op dungeon +オプションと同様に処理される。 + +.\"O The order of the symbols is: +シンボルの順序は、 +arrow trap(矢の罠), +dart trap(投げ矢の罠), +falling rock trap(岩落しの罠), +squeaky board(きしむ板), +bear trap(熊の罠), +land mine(地雷), +rolling boulder trap(落岩の罠), +sleeping gas trap(睡眠ガスの罠), +rust trap(腐食の罠), +fire trap(火の罠), +pit(落し穴), +spiked pit(トゲだらけの落し穴), +hole(穴), +trap door(落し扉), +teleportation trap(瞬間移動の罠), +level teleporter(別の階への瞬間移動の罠), +magic portal(魔法の入口), +web(くもの巣), +statue trap(彫像の罠), +magic trap(魔法の罠), +anti-magic field(反魔法空間の罠), +polymorph trap(変化の罠)。 + +.\"O Cannot be set with the `O' command. +`O' コマンドで設定することはできない。 +.lp travel +.\"O Allow the travel command (default on). Turning this option off will +.\"O prevent the game from attempting unintended moves if you make inadvertent +.\"O mouse clicks on the map window. +トラベルコマンドを有効にする(標準設定はオン)。 +このオプションをオフにすることによって、うっかり地図ウィンドウを +クリックすることによって、望まない移動をしようとすることを防ぐことができる。 +.lp verbose +.\"O Provide more commentary during the game (default on). +ゲーム中のコメントを詳細に表示する(標準設定はオン)。 +.lp windowtype +.\"O Select which windowing system to use, such as ``tty'' or ``X11'' +.\"O (default depends on version). +ウインドウシステムを使用するかどうかを「tty」または「X11」で選択する +(標準設定はバージョンによる)。 +.\"O Cannot be set with the `O' command. +`O' コマンドで設定することはできない。 +.hn 2 +.\"O Window Port Customization options +ウインドウシステム版専用カスタマイズオプション +.pg +.\"O Here are explanations of the various options that are +.\"O used to customize and change the characteristics of the +.\"O windowtype that you have chosen. +以下はあなたが選択したウィンドゥタイプの特性をカスタマイズして +変更するために用いる様々なオプションの説明である。 +.\"O Character strings that are too long may be truncated. +.\"O Not all window ports will adjust for all settings listed +.\"O here. You can safely add any of these options to your config +.\"O file, and if the window port is capable of adjusting to +.\"O suit your preferences, it will attempt to do so. If it +.\"O can't it will silently ignore it. You can find out if an +.\"O option is supported by the window port that you are currently +.\"O using by checking to see if it shows up in the Options list. +.\"O Some options are dynamic and can be specified during the game +.\"O with the `O' command. +長すぎる文字列は適当に切り詰められる。 +全てのウィンドゥタイプに対してこれら全てのオプションが有効というわけではない。 +これらのオプションが設定されたとき、もしウィンドゥタイプがその設定を +受け付けるなら、そうされる。もし受け付けられないなら、単に無視される。 +現在のウィンドゥタイプで対応しているオプションは、オプション一覧表示 +(`O')で表示される。 +一部のオプションは`O'コマンドで動的に変更できる。 +.lp align_message +.\"O Where to align or place the message window (top, bottom, left, or right) +メッセージウィンドウをどこに置くか(top, bottom, left, right) +.lp align_status +.\"O Where to align or place the status window (top, bottom, left, or right). +ステータスウィンドウをどこに置くか(top, bottom, left, right) +.lp ascii_map +.\"O NetHack should display an ascii character map if it can. +可能ならASCIIキャラクタマップを表示する +.lp color +.\"O NetHack should display color if it can for different monsters, +.\"O objects, and dungeon features +怪物、物体、洞窟の構成要素をカラーで表示する +.lp eight_bit_tty +.\"O NetHack should pass eight-bit character values (for example, specified with the +.\"O .op traps +.\"O option) straight through to your terminal (default off). +8ビットキャラクタ(例えば +.op traps +オプションで指定したもの)をそのままターミナルに表示する(標準設定はオフ)。 +.lp font_map +.\"O NetHack should use a font by the chosen name for the map window. +マップウィンドウを表示するフォント名 +.lp font_menu +.\"O NetHack should use a font by the chosen name for menu windows. +メニューを表示するフォント名 +.lp font_message +.\"O NetHack should use a font by the chosen name for the message window. +メッセージを表示するフォント名 +.lp font_status +.\"O NetHack should use a font by the chosen name for the status window. +ステータスを表示するフォント名 +.lp font_text +.\"O NetHack should use a font by the chosen name for text windows. +テキストを表示するフォント名 +.lp font_size_map +.\"O NetHack should use this size font for the map window. +マップウィンドウを表示するフォントサイズ +.lp font_size_menu +.\"O NetHack should use this size font for menu windows. +メニューウィンドウを表示するフォントサイズ +.lp font_size_message +.\"O NetHack should use this size font for the message window. +メッセージウィンドウを表示するフォントサイズ +.lp font_size_status +.\"O NetHack should use this size font for the status window. +ステータスウィンドウを表示するフォントサイズ +.lp font_size_text +.\"O NetHack should use this size font for text windows. +テキストウィンドウを表示するフォントサイズ +.lp fullscreen +.\"O NetHack should try and display on the entire screen rather than in a window. +ウィンドウでなく画面全体で表示しようと試みる +.lp hilite_pet +.\"O Visually distinguish pets from similar animals (default off). +.\"O The behavior of this option depends on the type of windowing you use. +.\"O In text windowing, text highlighting or inverse video is often used; +.\"O with tiles, generally displays a heart symbol near pets. +ペットを目立つように表示する(標準設定はオフ)。 +このオプションの振る舞いは使っているウィンドウシステムに依存する。 +テキストウィンドウの場合、高輝度か反転が主に用いられる。 +タイルの場合、一般的にはペットの近くにハートマークが表示される。 +.lp large_font +.\"O NetHack should use a large font. +大きいフォントを使う。 +.lp map_mode +.\"O NetHack should display the map in the manner specified. +指定された方法でマップを表示する。 +.lp mouse_support +.\"O Allow use of the mouse for input and travel. +入力と移動にマウスを使えるようにする。 +.lp player_selection +.\"O NetHack should pop up dialog boxes, or use prompts for character selection. +キャラクター選択時にダイアログボックスや確認画面を用いる +.lp popup_dialog +.\"O NetHack should pop up dialog boxes for input. +入力時にポップアップダイアログボックスを用いる +.lp preload_tiles +.\"O NetHack should preload tiles into memory. +.\"O For example, in the protected mode MSDOS version, control whether tiles +.\"O get pre-loaded into RAM at the start of the game. Doing so +.\"O enhances performance of the tile graphics, but uses more memory. (default on). +.\"O Cannot be set with the `O' command. +タイルをメモリに予め読み込んでおく。 +例えば、プロテクトモードMSDOS版の場合、ゲーム開始時にタイルを +RAM に予め読み込むかどうかを制御する。 +予め読み込むとタイルグラフィックの性能は向上するが、より多くのメモリを消費する +(標準設定はオン)。 +`O' コマンドで設定することはできない。 +.lp scroll_amount +.\"O NetHack should scroll the display by this number of cells +.\"O when the hero reaches the scroll_margin. +scroll_margin オプションで指定された位置に来たときに、 +どれだけの数スクロールさせるかを指定する。 +.lp scroll_margin +.\"O NetHack should scroll the display when the hero or cursor +.\"O is this number of cells away from the edge of the window. +ウィンドウの端からここで指定されたマス数にあなたまたはカーソルが +移動したときに、画面をスクロールさせる。 +.lp softkeyboard +.\"O Display an onscreen keyboard. Handhelds are most likely to support this option. +.lp splash_screen +.\"O NetHack should display an opening splash screen when it starts up (default yes). +起動時にスプラッシュスクリーンを表示する(標準設定はオン) +.lp tiled_map +.\"O NetHack should display a tiled map if it can. +可能ならタイルマップを表示する +.lp tile_file +.\"O Specify the name of an alternative tile file to override the default. +標準設定を上書きする別のタイルファイルの名前 +.lp tile_height +.\"O Specify the preferred height of each tile in a tile capable port. +タイルが表示できる環境でのタイルの高さ +.lp tile_width +.\"O Specify the preferred width of each tile in a tile capable port +タイルが表示できる環境でのタイルの幅 +.lp use_inverse +.\"O NetHack should display inverse when the game specifies it. +ゲームが指定したときに画面を反転する +.lp vary_msgcount +.\"O NetHack should display this number of messages at a time in +.\"O the message window. +メッセージウィンドウに一度に表示するメッセージの数 +.lp windowcolors +.\"O NetHack should display windows with the specified foreground/background +.\"O colors if it can. +可能ならウィンドウを指定した前景色/背景色で表示する +.lp wraptext +.\"O NetHack port should wrap long lines of text if they don't fit in +.\"O the visible area of the window. +.hn 2 +.\"O Platform-specific Customization options +プラットフォーム固有の設定オプション +.pg +.\"O Here are explanations of options that are used by specific platforms or ports +.\"O to customize and change the port behavior. +以下は特定のプラットフォームでカスタマイズや振る舞いの変更をするために +用いられるオプションの説明である。 +.lp altkeyhandler +.\"O Select an alternate keystroke handler dll to load (Win32 tty NetHack only). +.\"O The name of the handler is specified without the .dll extension and without any +.\"O path information. +.\"O Cannot be set with the `O' command. +キー入力を扱う DLL を選択する(Win32 tty NetHack のみ)。 +DLL の名前は、.dll の拡張子やパス抜きで指定する。 +`O' コマンドで設定することはできない。 +.lp altmeta +.\"O (default on, AMIGA NetHack only). +(標準設定はオン。 AMIGA NetHack のみ)。 +.lp "BIOS " +.\"O Use BIOS calls to update the screen +.\"O display quickly and to read the keyboard (allowing the use of arrow +.\"O keys to move) on machines with an IBM PC compatible BIOS ROM (default off, +.\"O OS/2, PC, and ST NetHack only). +高速に画面を書き換え、移動にカーソルキーを使えるようにキーボードを読むために、 +IBM-PC 互換の BIOS ROM を使用しているマシンで BIOS コールを使用する。 +(標準設定はオフ。OS/2 , PC, および ST NetHack のみ) +.lp flush +.\"O (default off, AMIGA NetHack only). +(標準設定はオフ。 AMIGA NetHack のみ)。 +.lp "MACgraphics" +.\"O (default on, Mac NetHack only). +(標準設定はオン。 Mac NetHack のみ)。 +.lp page_wait +.\"O (default on, Mac NetHack only). +(標準設定はオン。 Mac NetHack のみ)。 +.lp "rawio " +.\"O Force raw (non-cbreak) mode for faster output and more +.\"O bulletproof input (MS-DOS sometimes treats `^P' as a printer toggle +.\"O without it) (default off, OS/2, PC, and ST NetHack only). +.\"O Note: DEC Rainbows hang if this is turned on. +.\"O Cannot be set with the `O' command. +raw(cbreak でない) モードを使用して、 +より高速な出力と問題の起こらない入力を実現する +(MS-DOS ではプリンタがないにも関わらず `^P' をプリンタ出力の +トグルとみなしてしまうことがある) +(標準設定はオフ)。 +注意: DEC Rainbow ではこれがオンのときはハングアップしてしまう。 +`O' コマンドで設定することはできない。 +.lp soundcard +.\"O (default on, PC NetHack only). +.\"O Cannot be set with the `O' command. +(標準設定はオン。 PC NetHack のみ)。 +`O' コマンドで設定することはできない。 +.lp subkeyvalue +.\"O (Win32 tty NetHack only). +.\"O May be used to alter the value of keystrokes that the operating system +.\"O returns to NetHack to help compensate for international keyboard issues. +.\"O OPTIONS=subkeyvalue:171/92 +.\"O will return 92 to NetHack, if 171 was originally going to be returned. +.\"O You can use multiple subkeyvalue statements in the config file if needed. +.\"O Cannot be set with the `O' command. +(Win32 tty NetHack のみ)。 +国際キーボードの問題を補正するのを助けるために、 +OS が NetHack に返すキー入力の値を変更するために使用する。 +OPTIONS=subkeyvalue:171/92 +とすると、もともと 171 が返されようとしていた場合、 +NetHack に 92 を返す。 +必要なら、複数の subkeyvalue 行を設定ファイルに書いてもよい。 +`O' コマンドで設定することはできない。 +.lp video +.\"O Set the video mode used (PC NetHack only). +.\"O Values are `autodetect', `default', or `vga'. +.\"O Setting `vga' (or `autodetect' with vga hardware present) will cause +.\"O the game to display tiles. +.\"O Cannot be set with the `O' command. +使用するビデオモードを設定する(PC NetHack のみ)。 +値は `autodetect', `default', `vga' のいずれかである。 +`vga' (または VGA ハードウェアがあるときに`autodetect')に設定すると、 +表示にタイルを用いる。 +`O' コマンドで設定することはできない。 +.lp videocolors +.\"O Set the color palette for PC systems using NO_TERMS +.\"O (default 4-2-6-1-5-3-15-12-10-14-9-13-11, (PC NetHack only). +NO_TERMを使用しているPCシステムのカラーパレットをセットする +(標準設定は「4-2-6-1-5-3-15-12-10-14-9-13-11」)(PC NetHack のみ)。 +.\"O The order of colors is red, green, brown, blue, magenta, cyan, +.\"O bright.white, bright.red, bright.green, yellow, bright.blue, +.\"O bright.magenta, and bright.cyan. +シンボルの順番は、赤・緑・茶色・青・マゼンタ・シアン・輝く白・ +輝く赤・輝く緑・黄色・輝く青・輝くマゼンタ・輝くシアン。 +.\"O Cannot be set with the `O' command. +`O' コマンドで設定することはできない。 +.lp videoshades +.\"O Set the intensity level of the three gray scales available +.\"O (default dark normal light, PC NetHack only). +.\"O If the game display is difficult to read, try adjusting these scales; +.\"O if this does not correct the problem, try !color. +3 段階の利用可能なグレイスケールを設定する +(標準設定は ``dark normal light'' PC Nethackのみ)。 +もしゲーム画面が見にくい場合は、 +3つのスケールを調整してみること。 +もしこれでうまくいかなかったら、!colorを試してみること。 +.\"O Cannot be set with the `O' command. +`O' コマンドで設定することはできない。 +.hn 2 +.\"O Configuring autopickup exceptions +自動拾い例外の設定 +.pg +.\"O There is an experimental compile time option called AUTOPICKUP_EXCEPTIONS. +.\"O If your copy of the game was built with that option defined, you can +.\"O further refine the behavior of the +.\"O .op autopickup +.\"O option beyond what is available through the +.\"O .op pickup_types +.\"O option. +実験的コンパイル時オプションとして AUTOPICKUP_EXCEPTIONS がある。 +このオプションを定義してコンパイルされたバイナリの場合、 +.op autopickup +オプションの振る舞いを +.op pickup_types +オプションを使ってより洗練させることができる。 +.pg +.\"O By placing +.\"O .op autopickup_exception +.\"O lines in your configuration +.\"O file, you can define patterns to be checked when the game is about to +.\"O autopickup something. +.op autopickup_exception +行を設定ファイルに書くことで、 +何かを拾おうとするときにチェックするべきパターンを定義できる。 +.lp autopickup_exception +.\"O Sets an exception to the +.\"O .op pickup_types +.\"O option. +.op pickup_types +オプションの例外を設定する。 +.\"O The +.\"O .op autopickup_exception +.\"O option should be followed by a string of 1-80 characters to be used as a +.\"O pattern to match against the singular form of the description of an +.\"O object at your location. +.op autopickup_exception +オプションはあなたの位置にある物体の説明の単数形に一致するパターンを +指定する。これは 1-80 文字の文字列であるべきである。 +.pg +.\"O You may use the following special characters in a pattern: +パターンでは以下の特殊文字が使える。 +.sd +.si +.\"O *--- matches 0 or more characters. +.\"O ?--- matches any single character. + *--- 0 以上の文字にマッチする。 + ?--- 任意の 1 文字にマッチする。 +.ei +.ed +.pg +.\"O In addition, some characters are treated specially if they occur as the first +.\"O character in the string pattern, specifically: +さらに、文字列パターンの先頭に置いた場合に特別扱いされる文字もある。 +.sd +.si +.\"O < - always pickup an object that matches the pattern that follows. +.\"O > - never pickup an object that matches the pattern that follows. +< - 以下のパターンに一致する物体は常に拾う。 +> - 以下のパターンに一致する物体は決して拾わない。 +.ei +.ed +.pg +.\"O Can be set with the `O' command, but the setting is not preserved +.\"O across saves and restores. +`O' オプションで設定することもできるが、設定はセーブ・ロードしたときには +保存されない。 +.pg +.\"O Here's a couple of examples of autopickup_exceptions: +以下は autopickup_exceptions の例である。 +.sd +.si +.\"O autopickup_exception="<*arrow" +.\"O autopickup_exception=">*corpse" +.\"O autopickup_exception=">* cursed*" +.ei +.ed +.\"O The first example above will result in autopickup of any type of arrow. +.\"O The second example results in the exclusion of any corpse from autopickup. +.\"O The last example results in the exclusion of items known to be cursed from autopickup. +.\"O A `never pickup' rule takes precedence over an `always pickup' rule if both match. +上記の例の最初のものは、全ての矢を自動的に拾う。 +二番目の例は、死体は自動拾いの例外とする。 +最後の例は、呪われているとわかっているものは自動拾いの例外とする。 +`決して拾わない'ルールは`常に拾う'ルールに優先する。 +.hn 2 +.\"O Configuring User Sounds +音声の設定 +.pg +.\"O Some platforms allow you to define sound files to be played when a message +.\"O that matches a user-defined pattern is delivered to the message window. +.\"O At this time the Qt port and the win32tty and win32gui ports support the +.\"O use of user sounds. +メッセージウィンドウに表示されたメッセージが +ユーザー定義のパターンと一致したときに +特定の音声ファイルを鳴らすことができるプラットフォームもある。 +現在のところ、Qt, win32tty, win32gui がユーザー音声に対応している。 +.pg +.\"O The following config file entries are relevant to mapping user sounds +.\"O to messages: +ユーザー音声とメッセージの関連付けに関する設定ファイル項目は +以下のとおりである。 +.lp SOUNDDIR +.\"O The directory that houses the sound files to be played. +音声ファイルのあるディレクトリ +.lp SOUND +.\"O An entry that maps a sound file to a user-specified message pattern. +.\"O Each SOUND entry is broken down into the following parts: +.\"O .sd +.\"O .si +.\"O MESG - message window mapping (the only one supported in 3.4). +.\"O pattern - the pattern to match. +.\"O sound file - the sound file to play. +.\"O volume - the volume to be set while playing the sound file. +.\"O .ei +.\"O .ed +音声ファイルとユーザーが指定するメッセージパターンを関連付ける項目。 +各 SOUND 項目は以下の項目に分解される。 +.sd +.si +MESG - メッセージウィンドウ指定 (3.4 ではただ一つだけに対応している) +pattern - マッチするパターン +sound file - 鳴らす音声ファイル +volume - 音声ファイルを鳴らすときの音量 +.ei +.ed +.pg +.\"O The exact format for the pattern depends on whether the platform is +.\"O built to use ``regular expressions'' or NetHack's own internal pattern +.\"O matching facility. The ``regular expressions'' matching can be much more +.\"O sophisticated than the internal NetHack pattern matching, but requires +.\"O 3rd party libraries on some platforms. There are plenty of references +.\"O available elsewhere for explaining ``regular expressions''. You can verify +.\"O which pattern matching is used by your port with the #version command. +パターンの正確な書式はプラットフォームが ``正規表現'' を用いるか +NetHack の内蔵パターンマッチング機能を用いるかによって変わる。 +``正規表現'' マッチングは NetHack 内蔵パターンマッチングより洗練されているが、 +サードパーティライブラリが必要なプラットフォームもある。 +``正規表現'' に関する説明はどこか他のところを参照のこと。 +どちらのパターンマッチングが用いられているかは #version コマンドで確認できる。 +.pg +.\"O NetHack's internal pattern matching routine uses the following +.\"O special characters in its pattern matching: +.\"O .sd +.\"O .si +.\"O *--- matches 0 or more characters. +.\"O ?--- matches any single character. +.\"O .ei +.\"O .ed +NetHack の内蔵パターンマッチングルーチンは以下の特殊文字を用いる。 +.sd +.si + *--- 0 個以上の文字にマッチする。 + ?--- 任意の 1 文字にマッチする。 +.ei +.ed +.pg +.\"O Here's an example of a sound mapping using NetHack's internal +.\"O pattern matching facility: +.\"O .sd +.\"O SOUND=MESG "*chime of a cash register*" "gong.wav" 50 +.\"O .ed +.\"O specifies that any message with "chime of a cash register" contained +.\"O in it will trigger the playing of "gong.wav". You can have multiple +.\"O SOUND entries in your config file. +.\"O .sd +.\"O SOUND=MESG "*chime of a cash register*" "gong.wav" 50 +.\"O .ed +以下は NetHack 内蔵パターンマッチング機能を用いた例である。 +.sd + SOUND=MESG "*chime of a cash register*" "gong.wav" 50 +.ed +ここでは "chime of a cash register" を含むメッセージに反応して +"gong.wav" を鳴らす。 +設定ファイルには複数の SOUND 設定を書くことができる。 +.pg +.hn 2 +.\"O Configuring NetHack for Play by the Blind +視覚障害者がNetHackをプレイするための設定 +.pg +.\"O NetHack can be set up to use only standard ASCII characters for making +.\"O maps of the dungeons. This makes the MS-DOS versions of NetHack completely +.\"O accessible to the blind who use speech and/or Braille access technologies. +NetHack は洞窟の地図を作るのに標準の ASCII キャラクターだけを使うように +設定することもできる。これにより、 MS-DOS 版の NetHack は +音声合成または点字技術を用いれば目の不自由な人でも完全にプレイ可能である。 +.\"O Players will require a good working knowledge of their screen-reader's +.\"O review features, and will have to know how to navigate horizontally and +.\"O vertically character by character. They will also find the search +.\"O capabilities of their screen-readers to be quite valuable. Be certain to +.\"O examine this Guidebook before playing so you have an idea what the screen +.\"O layout is like. You'll also need to be able to locate the PC cursor. It is +.\"O always where your character is located. Merely searching for an @-sign will +.\"O not always find your character since there are other humanoids represented +.\"O by the same sign. Your screen-reader should also have a function which +.\"O gives you the row and column of your review cursor and the PC cursor. +.\"O These co-ordinates are often useful in giving players a better sense of the +.\"O overall location of items on the screen. +プレイヤーはこれらの画面読み取りシステムに関する十分な知識が必要で、 +上下左右に一文字ずつ移動する方法を知らなければならないだろう。 +画面読み取りシステムの検索能力を知ることもかなり価値がある。 +プレイする前にこのガイドブックを十分に読めば、 +画面のレイアウトがどんな感じかがわかるだろう。 +また、 PC カーソルの位置を突き止めることができる必要がある。 +これは自分のキャラクターの位置を示している。 +`@'は他のヒューマノイドを表わすのにも用いられるので、 +自分の位置を探すのに`@'を検索するだけでは不十分である。 +さらに、あなたが見ている位置と PC カーソルの位置の物理的な行と桁を知らせる機能が +必要だろう。この機能はスクリーン全体にどのようなアイテムがあるかを判別するのに +便利である。 +.pg +.\"O While it is not difficult for experienced users to edit the \fBdefaults.nh\fP +.\"O file to accomplish this, novices may find this task somewhat daunting. +慣れたユーザーなら \fBdefaults.nh\fPを修正することは難しくないだろうが、 +初心者は少しひるんでしまう仕事かもしれない。 +.\"O Included in all official distributions of NetHack is a file called +.\"O \fBNHAccess.nh\fP. Replacing \fBdefaults.nh\fP with this file will cause +.\"O the game to run in a manner accessible to the blind. After you have gained +.\"O some experience with the game and with editing files, you may want to alter +.\"O settings to better suit your preferences. Instructions on how to do this +.\"O are included in the \fBNHAccess.nh\fP file itself. The most crucial settings to +.\"O make the game accessible are: +NetHack の全ての公式配布には \fBNHAccess.nh\fPというファイルが含まれている。 +\fBdefault.nh\fPファイルをこのファイルと入れ替えることにより、 +目の不自由な人がプレイできるような設定になる。 +ファイルを修正することやゲームそのものに慣れたなら、 +より好みに合うように設定を変更したいと思うことだろう。 +そのための説明は \fBNHAccess.nh\fP そのものに含まれている。 +ゲームのアクセシビリティに最も影響を与える設定は以下のものである: +.pg +.lp IBMgraphics +.\"O Disable IBMgraphics by commenting out this option. +このオプションをコメントアウトすることによって IBM グラフィックを無効にする。 +.lp menustyle:traditional +.\"O This will assist in the interface to speech synthesizers. +これは音声合成システムを利用する助けになる。 +.lp number_pad +.\"O A lot of speech access programs use the number-pad to review the screen. +.\"O If this is the case, disable the number_pad option and use the traditional +.\"O Rogue-like commands. +多くの発声プログラムは number-pad を画面の確認に用いる。 +この場合、 number_pad オプションをオフにして、伝統的な Rogue 風コマンドを使うこと。 +.lp "Character graphics" +.\"O Comment out all character graphics sets found near the bottom of the +.\"O \fBdefaults.nh\fP file. Most of these replace \fBNetHack\fP's +.\"O default representation of the dungeon using standard ASCII characters +.\"O with fancier characters from extended character sets, and these fancier +.\"O characters can annoy screen-readers. +\fBdefaults.nh\fP ファイルの下の方にある全てのキャラクターグラフィック設定を +コメントアウトする。これらのほとんどは \fBNetHack\fP の +標準である、標準 ASCII キャラクターを用いた洞窟の表現を +拡張キャラクターセットのより凝ったキャラクターで置き換える。 +これらのキャラクターは画面読み取りシステムを煩わせるだろう。 +.hn 1 +.\"O Scoring +得点 +.pg +.\"O NetHack maintains a list of the top scores or scorers on your machine, +.\"O depending on how it is set up. In the latter case, each account on +.\"O the machine can post only one non-winning score on this list. If +.\"O you score higher than someone else on this list, or better your +.\"O previous score, you will be inserted in the proper place under your +.\"O current name. How many scores are kept can also be set up when +.\"O NetHack is compiled. +NetHack は設定によって、あなたの機械における高得点の一覧または高得点 +者の一覧を作成する。後者の設定になっている場合、ゲームを最後まで終えた +場合を除きそのマシンの 1 つのアカウントにつき 1 つだけしかこの一覧には +載らない。あなたがこの一覧に載っている他の誰かより高い得点を取ったとき、 +もしくはあなたの前の得点より高い得点を取ったときにのみ、その一覧のしか +るべき位置にあなたの名前が載る。得点が何個まで載るかもコンパイル時に設 +定できる。 +.pg +.\"O Your score is chiefly based upon how much experience you gained, how +.\"O much loot you accumulated, how deep you explored, and how the game +.\"O ended. If you quit the game, you escape with all of your gold intact. +.\"O If, however, you get killed in the Mazes of Menace, the guild will +.\"O only hear about 90% of your gold when your corpse is discovered +.\"O (adventurers have been known to collect finder's fees). So, consider +.\"O whether you want to take one last hit at that monster and possibly +.\"O live, or quit and stop with whatever you have. If you quit, you keep +.\"O all your gold, but if you swing and live, you might find more. +得点は主に経験値、戦利品、到達した階とゲームの終わり方に基づいている。 +ゲームを放棄した場合には持っている金を全額手にして脱出できる。 +しかし恐怖の迷宮の中で殺された場合には、亡骸が発見されると持っている金の 90% +だけがギルドに伝えられる(冒険者は亡骸を発見した場合には手数料を取るこ +とが知られている)。従って怪物にさらに一撃を加えて運あらば生き残らんと +するか、放棄してその時点で持っている物で終了するかはあなたが決めること +である。放棄した場合はすべての金を手にすることができる。しかし戦って生 +き残ればさらに多くを得ることができるかも知れない。 +.pg +.\"O If you just want to see what the current top players/games list is, you +.\"O can type \fBnethack -s all\fP on most versions. +単に現時点での高得点者・高得点の一覧を見たい場合にはほとんどの +バージョンでは \fBnethack -s all\fP と入力すればよい。 + +.hn 1 +.\"O Explore mode +探検モード +.pg +.\"O NetHack is an intricate and difficult game. Novices might falter +.\"O in fear, aware of their ignorance of the means to survive. Well, fear +.\"O not. Your dungeon may come equipped with an ``explore'' or ``discovery'' +.\"O mode that enables you to keep old save files and cheat death, at the +.\"O paltry cost of not getting on the high score list. +NetHack は複雑で難しいゲームである。初心者は生き残るすべを知らないこ +とに気づき、恐怖におじけづいてしまうかもしれない。しかし恐れることはな +い。冒険する洞窟に「探検」もしくは「発見」モードがある場合には、高得点 +の一覧に載らないというとるに足らないデメリットと引き替えに前のセーブファ +イルを残しておけたり不死身となれたりするのである。 +.pg +.\"O There are two ways of enabling explore mode. One is to start the game +.\"O with the +.\"O .op -X +.\"O switch. The other is to issue the `X' command while already playing +.\"O the game. The other benefits of explore mode are left for the trepid +.\"O reader to discover. +探検モードに入るには 2 通りの方法がある。1 つはゲームの開始時に +.op -X +スイッチを付けることである。もう 1 つはゲームのプレイ中に `X' コマンド +を入力することである。探検モードで得られる他の利点は大胆な読者諸君自ら +確かめて欲しい。 + +.hn +.\"O Credits +クレジット +.pg +.\"O The original \fIhack\fP game was modeled on the Berkeley +.\"O .ux +.\"O \fIrogue\fP game. Large portions of this paper were shamelessly +.\"O cribbed from \fIA Guide to the Dungeons of Doom\fP, by Michael C. Toy +.\"O and Kenneth C. R. C. Arnold. Small portions were adapted from +.\"O \fIFurther Exploration of the Dungeons of Doom\fP, by Ken Arromdee. +最初の hack というゲームは、バークレイ版 +.ux +のゲーム \fIrogue\fP をモデルとしている。 +このドキュメントの大部分は Michael C. Toy と Kenneth C. R. C. Arnold の手になる +\fIA Guide to the Dungeons of Doom(運命の洞窟への招待)\fP を図々しくも盗用したものである。 +また一部は Ken Arromdee による +\fIFurther Exploration of the Dungeons of Doom(運命の洞窟の深部への探検)\fP +から採っている。 +.pg +.\"O NetHack is the product of literally dozens of people's work. +.\"O Main events in the course of the game development are described below: +NetHack は文字どおり何十人もの人々の手によって完成された。 +以下はゲームの開発の過程での主な出来事である。 + +.pg +.\"O \fBJay Fenlason\fP wrote the original Hack, with help from +.\"O \fBKenny Woodland\fP, \fBMike Thome\fP and \fBJon Payne\fP. +\fBJay Fenlason\fP は \fBKenny Woodland\fP, \fBMike Thome\fP, \fBJon Payne\fP +らの助けを得て、最初の Hack を書いた。 +.pg +.\"O \fBAndries Brouwer\fP did a major re-write, transforming Hack into a +.\"O very different game, and published (at least) three versions (1.0.1, +.\"O 1.0.2, and 1.0.3) for +.\"O .ux +.\"O machines to the Usenet. +\fBAndries Brouwer\fP はプログラムを大幅に書き換えて Hack を元とはかなり異 +なったゲームに仕立て上げ、 +.ux +マシン用の(少なくとも)3 バージョン(1.0.1、1.0.2、1.0.3)を Usenet で発表した。 +.pg +.\"O \fBDon G. Kneller\fP ported Hack 1.0.3 to Microsoft C and MS-DOS, producing PC +.\"O HACK 1.01e, added support for DEC Rainbow graphics in version 1.03g, and went +.\"O on to produce at least four more versions (3.0, 3.2, 3.51, and 3.6). +\fBDon G. Kneller\fP は Hack 1.0.3 を Microsoft C を使用して MS-DOS へ移植 +し PC HACK 1.01e を作成した。バージョン 1.03g では DEC Rainbow のグラ +フィックをサポートし、続いて少なくともあと 4 つのバージョン(3.0、3.2、 +3.51、3.6)を作成した。 +.pg +.\"O \fBR. Black\fP ported PC HACK 3.51 to Lattice C and the Atari 520/1040ST, +.\"O producing ST Hack 1.03. +\fBR. Black\fP は PC HACK 3.51 を Lattice C を使用して Atari 520/1040ST へ +移植し ST Hack 1.03 を作成した。 +.pg +.\"O \fBMike Stephenson\fP merged these various versions back together, +.\"O incorporating many of the added features, and produced NetHack 1.4. +.\"O He then coordinated a cast of thousands in enhancing and debugging +.\"O NetHack 1.4 and released NetHack versions 2.2 and 2.3. +\fBMike Stephenson\fP はこれらのいろいろなバージョンを再び 1 つに統合し、 +多くの追加要素と合わせて NetHack バージョン 1.4 を作成した。さらに彼は +何千人もの人々に作業を分担して NetHack 1.4 の拡張とデバッグを行い、 +NetHack バージョン 2.2 と 2.3 を発表した。 +.pg +.\"O Later, Mike coordinated a major rewrite of the game, heading a +.\"O team which included \fBKen Arromdee\fP, \fBJean-Christophe Collet\fP, \fBSteve +.\"O Creps\fP, \fBEric Hendrickson\fP, \fBIzchak Miller\fP, \fBJohn Rupley\fP, +.\"O \fBMike Threepoint\fP, and \fBJanet Walz\fP, to produce NetHack 3.0c. +さらにその後、Mike は \fBKen Arromdee\fP, \fBJean-Christophe Collet\fP, +\fBSteve Creps\fP, \fBEric Hendrickson\fP、\fBIzchak Miller\fP、\fBJohn Rupley\fP、 +\fBMike Threepoint\fP、\fBJanet Walz\fP +を含むチームを率いてゲームの大幅な書き直しを行ない、 +NetHack 3.0c を作成した。 +.pg +.\"O NetHack 3.0 was ported to the Atari by \fBEric R. Smith\fP, to OS/2 by +.\"O \fBTimo Hakulinen\fP, and to VMS by \fBDavid Gentzel\fP. The three of them +.\"O and \fBKevin Darcy\fP later joined the main development team to produce +.\"O subsequent revisions of 3.0. +NetHack 3.0 は \fBEric R. Smith\fP によって Atari へ、 +\fBTimo Hakulinen\fP によって OS/2 へ、 +\fBDavid Gentzel\fP によって VMS へ移植された。 +この 3 人と \fBKevin Darcy\fP はその後主力開発チームに加わり、 +3.0 のその後のいくつかの改訂版を作成した。 +.pg +.\"O \fBOlaf Seibert\fP ported NetHack 2.3 and 3.0 to the Amiga. +.\"O \fBNorm Meluch\fP, \fBStephen Spackman\fP and \fBPierre Martineau\fP designed +.\"O overlay code for PC NetHack 3.0. \fBJohnny Lee\fP ported +.\"O NetHack 3.0 to the Macintosh. Along with various other Dungeoneers, they +.\"O continued to enhance the PC, Macintosh, and Amiga ports through the later +.\"O revisions of 3.0. +\fBOlaf Seibert\fP は NetHack 2.3 と 3.0 を Amiga へ移植した。 +\fBNorm Meluch、\fBStephen Spackman\fP、\fBPierre Martineau\fP は +PC NetHack 3.0 のためのオーバーレイルーチンを設計した。 +\fBJohnny Lee\fP は NetHack 3.0 を Macintosh へ移植した。 +彼らは他のさまざまな洞窟の主たちとともに PC、Macintosh、Amiga +の移植版の拡張を続け、 3.0 のその後のいくつかの改訂版を作成した。 +.pg +.\"O Headed by \fBMike Stephenson\fP and coordinated by \fBIzchak Miller\fP and +.\"O \fBJanet Walz\fP, the development team which now included \fBKen Arromdee\fP, +.\"O \fBDavid Cohrs\fP, \fBJean-Christophe Collet\fP, \fBKevin Darcy\fP, +.\"O \fBMatt Day\fP, \fBTimo Hakulinen\fP, \fBSteve Linhart\fP, \fBDean Luick\fP, +.\"O \fBPat Rankin\fP, \fBEric Raymond\fP, and \fBEric Smith\fP undertook a radical +.\"O revision of 3.0. They re-structured the game's design, and re-wrote major +.\"O parts of the code. They added multiple dungeons, a new display, special +.\"O individual character quests, a new endgame and many other new features, and +.\"O produced NetHack 3.1. +\fBMike Stephenson\fPをリーダーとし、\fBIzchak Miller\fPと\fBJanet Walz\fPの助けによって +\fBKen Arromdee\fP, \fBDavid Cohrs\fP, \fBJean-Christophe Collet\fP, \fBKevin Darcy\fP, +\fBMatt Day\fP, \fBTimo Hakulinen\fP, \fBSteve Linhart\fP, \fBDean Luick\fP, +\fBPat Rankin\fP, \fBEric Raymond\fP, \fBEric Smith\fP を含む制作チームが +3.0の徹底的な見直しを行なった。 +彼らはゲームデザインを再構築し、コードの大部分を書き直した。 +複合ダンジョン、新しいディスプレイ、それぞれのキャラクター毎の特別のクエスト、 +新しいエンドゲームとその他の多くの新しい要素を追加し、 +NetHack 3.1を制作した。 +.pg +.\"O \fBKen Lorber\fP, \fBGregg Wonderly\fP and \fBGreg Olson\fP, with help +.\"O from \fBRichard Addison\fP, \fBMike Passaretti\fP, and \fBOlaf Seibert\fP, +.\"O developed NetHack 3.1 for the Amiga. +\fBKen Lorber\fP, \fBGregg Wonderly\fP, \fBGreg Olson\fP は +\fBRichard Addison\fP, \fBMike Passaretti\fP, \fBOlaf Seibert\fP の助けを借りて +Amiga 用 NetHack 3.1 を作成した。 +.pg +.\"O \fBNorm Meluch\fP and \fBKevin Smolkowski\fP, with help from +.\"O \fBCarl Schelin\fP, \fBStephen Spackman\fP, \fBSteve VanDevender\fP, +.\"O and \fBPaul Winner\fP, ported NetHack 3.1 to the PC. +\fBNorm Meluch\fP と \fBKevin Smolkowski\fP は +\fBCarl Schelin\fP, \fBStephen Spackman\fP, \fBSteve VanDevender\fP, +\fBPaul Winner\fP の助けを借りて NetHack 3.1 を PC に移植した。 +.pg +.\"O \fBJon W{tte\fP and \fBHao-yang Wang\fP, with help from \fBRoss Brown\fP, +.\"O \fBMike Engber\fP, \fBDavid Hairston\fP, \fBMichael Hamel\fP, +.\"O \fBJonathan Handler\fP, \fBJohnny Lee\fP, \fBTim Lennan\fP, \fBRob Menke\fP, +.\"O and \fBAndy Swanson\fP, developed NetHack 3.1 for the Macintosh, +.\"O porting it for MPW. Building on their development, \fBBarton House\fP +.\"O added a Think C port. +\fBJon Watte\fP と \fBHao-yang Wang\fP は \fBRoss Brown\fP, +\fBMike Engber\fP, \fBDavid Hairston\fP, \fBMichael Hamel\fP, +\fBJonathan Handler\fP, \fBJohnny Lee\fP, \fBTim Lennan\fP, \fBRob Menke\fP, +\fBAndy Swanson\fP の助けを借りて MPW 用の Macintosh 用 NetHack 3.1 を作成した。 +その作成中に、\fBBarton House\fP は Think C 用を加えた。 +.pg +.\"O \fBTimo Hakulinen\fP ported NetHack 3.1 to OS/2. \fBEric Smith\fP +.\"O ported NetHack 3.1 to the Atari. \fBPat Rankin\fP, with help from +.\"O \fBJoshua Delahunty\fP, was responsible for the VMS version of NetHack 3.1. +.\"O \fBMichael Allison\fP ported NetHack 3.1 to Windows NT. +\fBTimo Hakulinen\fP は NetHack 3.1 を OS/2 に移植した。 +\fBEric Smith\fP は NetHack 3.1 を Atari に移植した。 +\fBPat Rankin\fP は \fBJoshua Delahunty\fP の助けを借りて VMS 版 NetHack 3.1 を作成した。 +\fBMichael Allison\fP は NetHack 3.1 を Windows NT に移植した。 +.pg +.\"O \fBDean Luick\fP, with help from \fBDavid Cohrs\fP, developed NetHack +.\"O 3.1 for X11. +.\"O \fBWarwick Allison\fP wrote a tiled version of NetHack for the Atari; +.\"O he later contributed the tiles to the DevTeam and tile support was +.\"O then added to other platforms. +\fBDean Luick\fP は \fBDavid Cohrs\fP の助けを借りて X11 用 NetHack3.1 を作成した。 +\fBWarwick Allison\fP は Atari 用に NetHack のタイルバージョンを作成した。 +彼は後にタイルを開発チームに寄贈し、タイルサポートは他のプラットフォームにも追加された。 +.pg +.\"O The 3.2 development team, comprised of \fBMichael Allison\fP, \fBKen +.\"O Arromdee\fP, \fBDavid Cohrs\fP, \fBJessie Collet\fP, \fBSteve Creps\fP, +.\"O \fBKevin Darcy\fP, \fBTimo Hakulinen\fP, \fBSteve Linhart\fP, \fBDean +.\"O Luick\fP, \fBPat Rankin\fP, \fBEric Smith\fP, \fBMike Stephenson\fP, +.\"O \fBJanet Walz\fP, and \fBPaul Winner\fP, released version 3.2 in April of +.\"O 1996. +\fBMichael Allison\fP, \fBKen +Arromdee\fP, \fBDavid Cohrs\fP, \fBJessie Collet\fP, \fBSteve Creps\fP, +\fBKevin Darcy\fP, \fBTimo Hakulinen\fP, \fBSteve Linhart\fP, \fBDean +Luick\fP, \fBPat Rankin\fP, \fBEric Smith\fP, \fBMike Stephenson\fP, +\fBJanet Walz\fP, and \fBPaul Winner\fP +からなる 3.2の開発チームは バージョン 3.2 を 1996 年 4 月にリリースした。 +.pg +.\"O Version 3.2 marked the tenth anniversary of the formation of the development +.\"O team. In a testament to their dedication to the game, all thirteen members +.\"O of the original development team remained on the team at the start of work +.\"O on that release. During the interval between the release of 3.1.3 +.\"O and 3.2, one of the founding members of the development team, \fBDr. Izchak +.\"O Miller\fP, was diagnosed with cancer and passed away. That release of the +.\"O game was dedicated to him by the development and porting teams. +バージョン 3.2 は開発チームが結成されてから 10 周年のものであった。 +彼らのゲームへの貢献について記すと、13 人の初期の開発チーム全員は +このリリースの開始時の最初の時点までチームに残っていた。 +が、 3.1.3 から 3.2 の間に、開発チームの創始者の一人である +\fBIzchak Miller博士\fPが癌と診断され、亡くなった。 +このリリースは開発チームおよび移植チームから彼に捧げられた。 +.pg +.\"O During the lifespan of NetHack 3.1 and 3.2, several enthusiasts +.\"O of the game added +.\"O their own modifications to the game and made these ``variants'' publicly +.\"O available: +NetHack 3.1 と 3.2 の時代に、ゲームに熱狂した何人かが +ゲームに自分自身の変更を加えた「亜種」を公に発表した。 +.pg +.\"O \fBTom Proudfoot\fP and \fBYuval Oren\fP created NetHack++, +.\"O which was quickly renamed NetHack--. +\fBTom Proudfoot\fP と \fBYuval Oren\fP は NetHack++ を作成し、 +これはすぐに NetHack-- に改名された。 +.\"O Working independently, \fBStephen White\fP wrote NetHack Plus. +これとは独立に、\fBStephen White\fP は NetHack Plus を作成した。 +.\"O \fBTom Proudfoot\fP later merged NetHack Plus +.\"O and his own NetHack-- to produce SLASH. +\fBTom Proudfoot\fP は後に NetHack Plus と NetHack-- を統合し、 +SLASH を作成した。 +.\"O \fBLarry Stewart-Zerba\fP and \fBWarwick Allison\fP improved the spell +.\"O casting system with the Wizard Patch. +\fBLarry Stewart-Zerba\fP と \fBWarwick Allison\fP は呪文詠唱システムを改良した +Wizard Patch を作成した。 +.\"O \fBWarwick Allison\fP also ported NetHack to use the Qt interface. +\fBWarwick Allison\fP は NetHack を Qt インターフェースを使うように変更した。 +.pg +.\"O \fBWarren Cheung\fP combined SLASH with the Wizard Patch to produce Slash'em, +.\"O and with the help of \fBKevin Hugo\fP, added more features. +\fBWarren Cheung\fP は SLASH と Wizard Patch を統合して Slash'em を作成し、 +\fBKevin Hugo\fP の力を借りて、多くの要素を追加した。 +.\"O Kevin later joined the +.\"O DevTeam and incorporated the best of these ideas in NetHack 3.3. +Kevin は後に開発チームに加わり、これらのアイデアを NetHack 3.3 に統合した。 +.pg +.\"O The final update to 3.2 was the bug fix release 3.2.3, which was released +.\"O simultaneously with 3.3.0 in December 1999 just in time for the Year 2000. +3.2 の最終バージョンはバグ修正版である 3.2.3 である。 +これは 2000 年問題対策のために 3.3.0 と同時に 1999 年 12 月に発表された。 +.pg +.\"O The 3.3 development team, consisting of \fBMichael Allison\fP, \fBKen Arromdee\fP, +.\"O \fBDavid Cohrs\fP, \fBJessie Collet\fP, \fBSteve Creps\fP, \fBKevin Darcy\fP, +.\"O \fBTimo Hakulinen\fP, \fBKevin Hugo\fP, \fBSteve Linhart\fP, \fBKen Lorber\fP, +.\"O \fBDean Luick\fP, \fBPat Rankin\fP, \fBEric Smith\fP, \fBMike Stephenson\fP, +.\"O \fBJanet Walz\fP, and \fBPaul Winner\fP, released 3.3.0 in +.\"O December 1999 and 3.3.1 in August of 2000. +\fBMichael Allison\fP, \fBKen Arromdee\fP, +\fBDavid Cohrs\fP, \fBJessie Collet\fP, \fBSteve Creps\fP, \fBKevin Darcy\fP, +\fBTimo Hakulinen\fP, \fBKevin Hugo\fP, \fBSteve Linhart\fP, \fBKen Lorber\fP, +\fBDean Luick\fP, \fBPat Rankin\fP, \fBEric Smith\fP, \fBMike Stephenson\fP, +\fBJanet Walz\fP, \fBPaul Winner\fP +からなる 3.3 の開発チームは 1999 年 12 月に 3.3.0を、 +2000 年 8 月に 3.3.1 をリリースした。 +.pg +.\"O Version 3.3 offered many firsts. It was the first version to separate race +.\"O and profession. The Elf class was removed in preference to an elf race, +.\"O and the races of dwarves, gnomes, and orcs made their first appearance in +.\"O the game alongside the familiar human race. Monk and Ranger roles joined +.\"O Archeologists, Barbarians, Cavemen, Healers, Knights, Priests, Rogues, Samurai, +.\"O Tourists, Valkyries and of course, Wizards. It was also the first version +.\"O to allow you to ride a steed, and was the first version to have a publicly +.\"O available web-site listing all the bugs that had been discovered. Despite +.\"O that constantly growing bug list, 3.3 proved stable enough to last for +.\"O more than a year and a half. +バージョン 3.3 は多くの新要素を提供した。 +まず、種族と職業を分離した最初のバージョンである。 +職業としてのエルフは削除され、種族の一つとなった。 +また、ドワーフ、ノーム、オークが種族として追加された。 +モンクとレンジャーの二つが職業として追加された。 +さらに、動物に乗ることが出来る最初のバージョンでもあり、 +発見された全てのバグをウェブサイトで公表した最初のバージョンでもある。 +バグリストが順調に伸びていったにも関わらず、 +3.3 は 1 年半続いたことで十分安定していたことを証明した。 +.pg +.\"O The 3.4 development team initially consisted of +.\"O \fBMichael Allison\fP, \fBKen Arromdee\fP, +.\"O \fBDavid Cohrs\fP, \fBJessie Collet\fP, \fBKevin Hugo\fP, \fBKen Lorber\fP, +.\"O \fBDean Luick\fP, \fBPat Rankin\fP, \fBMike Stephenson\fP, +.\"O \fBJanet Walz\fP, and \fBPaul Winner\fP, with \fB Warwick Allison\fP joining +.\"O just before the release of NetHack 3.4.0 in March 2002. +3.4 開発チームは \fBMichael Allison\fP, \fBKen Arromdee\fP, +\fBDavid Cohrs\fP, \fBJessie Collet\fP, \fBKevin Hugo\fP, \fBKen Lorber\fP, +\fBDean Luick\fP, \fBPat Rankin\fP, \fBMike Stephenson\fP, +\fBJanet Walz\fP, and \fBPaul Winner\fP で開始され、 +NetHack 3.4.0 リリース直前の 2002 年 3 月に \fB Warwick Allison\fP が加わった。 +.pg +.\"O As with version 3.3, various people contributed to the game as a whole as +.\"O well as supporting ports on the different platforms that NetHack runs on: +バージョン 3.3 と同様に、様々な人々が NetHack の色々なプラットフォームへの +移植を行なってくれた。 +.pg +.\"O \fBPat Rankin\fP maintained 3.4 for VMS. +\fBPat Rankin\fP は 3.4 の VMS への移植を担当した。 +.pg +.\"O \fBMichael Allison\fP maintained NetHack 3.4 for the MS-DOS platform. \fBPaul Winner\fP +.\"O and \fBYitzhak Sapir\fP provided encouragement. +\fBMichael Allison\fP は MS-DOS 版の NetHack 3.4 を管理している。 +\fBPaul Winner\fP と \fBYitzhak Sapir\fP が手伝っている。 +.pg +.\"O \fBDean Luick\fP, \fBMark Modrall\fP, and \fBKevin Hugo\fP maintained and enhanced the +.\"O Macintosh port of 3.4. +\fBDean Luick\fP, \fBMark Modrall\fP, \fBKevin Hugo\fP は +3.4 の Macintosh への移植と拡張を担当した。 +.pg +.\"O \fBMichael Allison\fP, \fBDavid Cohrs\fP, \fBAlex Kompel\fP, \fBDion Nicolaas\fP, and +.\"O \fBYitzhak Sapir\fP maintained and enhanced 3.4 for the Microsoft Windows platform. +.\"O \fBAlex Kompel\fP contributed a new graphical interface for the Windows port. +.\"O \fBAlex Kompel\fP also contributed a Windows CE port for 3.4.1. +\fBMichael Allison\fP, \fBDavid Cohrs\fP, \fBAlex Kompel\fP, \fBDion Nicolaas\fP, +\fBYitzhak Sapir\fP は 3.4 の Microsoft Windows プラットフォームへの移植と拡張を担当した。 +\fBAlex Kompel\fP は Windows 版への新しいグラフィックインターフェースを提供した。 +\fBAlex Kompel\fP はまた、3.4.1 の Windows CE 版を提供した。 +.pg +.\"O \fBRon Van Iwaarden\fP maintained 3.4 for OS/2. +\fBRon Van Iwaarden\fP は 3.4 の OS/2 版を管理している。 +.pg +.\"O \fBJanne Salmijarvi\fP and \fBTeemu Suikki\fP maintained and +.\"O enhanced the Amiga port of 3.4 after \fBJanne Salmijarvi\fP resurrected +.\"O it for 3.3.1. +3.3.1 で復活した Amiga への移植と拡張は \fBJanne Salmijarvi\fP と \fBTeemu Suikki\fP が +行っている。 +.pg +.\"O \fBChristian ``Marvin'' Bressler\fP maintained 3.4 for the Atari after he +.\"O resurrected it for 3.3.1. +3.3.1 で復活した Atari 版は \fBChristian ``Marvin'' Bressler\fP が管理している。 +.pg +.\"O There is a NetHack web site maintained by \fBKen Lorber\fP at http://www.nethack.org/. +\fBKen Lorber\fP によって管理されている NetHack のウェブサイトが http://www.nethack.org/ にある。 +.pg + - - - - - - - - - - +.pg +.\"O From time to time, some depraved individual out there in netland sends a +.\"O particularly intriguing modification to help out with the game. The Gods of +.\"O the Dungeon sometimes make note of the names of the worst of these miscreants +.\"O in this, the list of Dungeoneers: +.\"O +時々ネットワークの世界のどうしようもない連中が、 +ゲームの改良の手助けをしようとしてとりわけ興味をそそるような修正を送ってよこす。 +洞窟の神々は、ときにはこういった悪党のうちでも最も邪悪な連中の名前を +洞窟の主たちの一覧としてここに記すのだ。 +.sd +.TS S +center; +c c c. +.\"TABLE_START +Adam Aronow Izchak Miller Mike Stephenson +Alex Kompel J. Ali Harlow Norm Meluch +Andreas Dorn Janet Walz Olaf Seibert +Andy Church Janne Salmijarvi Pasi Kallinen +Andy Swanson Jean-Christophe Collet Pat Rankin +Ari Huttunen Jochen Erwied Paul Winner +Barton House John Kallen Pierre Martineau +Benson I. Margulies John Rupley Ralf Brown +Bill Dyer John S. Bien Ray Chason +Boudewijn Waijers Johnny Lee Richard Addison +Bruce Cox Jon W{tte Richard Beigel +Bruce Holloway Jonathan Handler Richard P. Hughey +Bruce Mewborne Joshua Delahunty Rob Menke +Carl Schelin Keizo Yamamoto Robin Johnson +Chris Russo Ken Arnold Roderick Schertler +David Cohrs Ken Arromdee Roland McGrath +David Damerell Ken Lorber Ron Van Iwaarden +David Gentzel Ken Washikita Ronnen Miller +David Hairston Kevin Darcy Ross Brown +Dean Luick Kevin Hugo Sascha Wostmann +Del Lamb Kevin Sitze Scott Bigham +Deron Meranda Kevin Smolkowski Scott R. Turner +Dion Nicolaas Kevin Sweet Stephen Spackman +Dylan O'Donnell Lars Huttar Stephen White +Eric Backus Malcolm Ryan Steve Creps +Eric Hendrickson Mark Gooderum Steve Linhart +Eric R. Smith Mark Modrall Steve VanDevender +Eric S. Raymond Marvin Bressler Teemu Suikki +Erik Andersen Matthew Day Tim Lennan +Frederick Roeber Merlyn LeRoy Timo Hakulinen +Gil Neiger Michael Allison Tom Almy +Greg Laskin Michael Feir Tom West +Greg Olson Michael Hamel Warren Cheung +Gregg Wonderly Michael Sokolov Warwick Allison +Hao-yang Wang Mike Engber Yitzhak Sapir +Helge Hafting Mike Gallop +Irina Rempt-Drijfhout Mike Passaretti +.\"TABLE_END Do not delete this line. +.TE +.ed + +.\"O .\"Microsoft and MS-DOS are registered trademarks of Microsoft Corporation. +.\"O .\"Lattice is a trademark of Lattice, Inc. +.\"O .\"Atari and 1040ST are trademarks of Atari, Inc. +.\"O .\"AMIGA is a trademark of Commodore-Amiga, Inc. +.\"O .sm "Brand and product names are trademarks or registered trademarks \ +.\"O of their respective holders." +.sm ブランドと製品名は各社の商標または登録商標である。 diff -aurbN -xCVS -xXTAGS nethack/doc/jGuidebook.txt jnethack/doc/jGuidebook.txt --- nethack/doc/jGuidebook.txt 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/doc/jGuidebook.txt 2005-04-19 00:35:32.000000000 +0900 @@ -0,0 +1,3366 @@ + + + + + + + + + + + 恐怖の迷宮への招待 + (NetHack ガイドブック) + + + Eric S. Raymond + (バージョン 3.4 のための広範囲な校訂と拡充) + + + + 1. はじめに + + 最近、あなたは日々の仕事に満たされなく、敬遠しつつある自分に + 気がついた。最近数ヶ月、あなたが見る夢は探査、盗み、十字軍、戦 闘 + と いったものであったが、あなたにはその理由がはっきりとはわからな + かった。あなたはこれらの夢を実際には生まれてこのかたずっと見続 け + て い て、 なぜか今までそれらについて忘れようとしていたのではない + か、と思った。ある夜、あなたは飛び起きて、夢の中の洞窟のあらゆ る + 角 の後ろに潜んでいるように見える、奇妙で強力な怪物の鮮明な記憶に + ぞっとして大声で叫んだ。あなたの夢に出没する内容は本当なのだろ う + か? 夜毎に、廃墟の近くの不思議な洞窟に入るという欲求が強くなっ + た。それでも、毎朝あなたはそのような考えを、洞窟に入って帰って 来 + な かった人々の話を思い出すことで頭から追い出した。しかし、ついに + あなたは夢の中に出てくる不思議な場所を捜し求めるという思いを抑 え + き れなくなった。何といっても、冒険者は最初にその道を通っていった + 時より、こちらに戻って来る時の方が裕福になっているように見える の + だ。戻って来ない人たちは皆、単にまだ冒険を続けているだけなのでは? + + + あちこちで尋ねるうちに、あなたはある噂を耳にした。イェンダー + の 魔除けとかいうものがあり、手に入れることができたなら、すばらし + い財産をもたらすと言うのだ。あなたが聞いたとある伝説では、魔除 け + を 見つけたものは神から不死の体を授かるとさえ言われているらしい。 + 魔除けは恐怖の迷宮の奥深く、ゲヘナの谷を越えたどこかにあるとい う + 噂 である。伝説を聞いた瞬間、あなたは自分には洞窟に入って彼らの話 + している魔除けを捜し求めるべき深遠で未知のなんらかの理由がある と + 確 信した。あなたはたとえ魔除けの力が真実でなくても、少なくとも冒 + 険談を地元のの吟遊詩人にかなりの金額で売り込めるだろうと考え た。 + 夢 の中で出てきた恐ろしく、不思議な怪物に出会うことができればなお + さらである。あなたは地元の安宿で最後の宿を取り対策を練った。安 宿 + の 壁に掲げられた成功率のオッズが下がれば下がるほど、あなたは意気 + 消沈した。 + + + 朝起きると、あなたは所持品をかき集め、あなたは洞窟に向けて旅 + 立っ た。無事何日かの旅を続けて恐怖の迷宮への入口を示す古代の遺跡 + へとたどり着いた。夜も更けていたので入口でキャンプをする こ と に + し、 その夜は広々とした空の下で眠りに就いた。翌朝あなたは道具をか + き集め、もしかすると地上での最後になるかもしれない食事を済ま せ、 + 洞窟へと入っていった。 + + + + NetHack Guidebook 1 + + + + + + NetHack Guidebook 2 + + + + 2. あなたを取り巻く状況 + + こ うしてあなたは NetHack というゲームを始めることになった。 + あなたの目的は持てる限りの宝を集め、イェンダーの魔除けを見つけ 出 + し、さらにはこの恐怖の迷宮から生きて脱出することである。 + + 冒険におけるいろいろな困難に対応するための各種の能力や力は、 + あなたの生い立ちと修行によって変化する。 + + 考古学者(Archeologist) は洞窟について多くの知識を 持っ て い + る。 このため素早く動いたり洞窟での不快な事態を切り抜けることがで + きる。彼らは学術的調査のための探検旅行に適した道具を持って出発 す + る。 + + 野 蛮人(Barbarian) は奥地からやってきた戦士であり、戦闘のた + めに鍛えられている。彼らは類まれな力の強さを持ち、丈夫な鎖かた び + らと大きな両手持ちの剣のみを持って探求に出発する。 + + 洞 窟 人(Caveman と Cavewoman)はとりわけ強い力を持っている + が、新石器時代に使われた武器を持って出発する。 + + 医者(Healer)は医術や薬物について精通している。生気を回復させ + た り、苦痛を和らげたり、麻酔をかけたり、毒を中和させたりする香草 + や薬草について詳しい。そして器具を使って生物の健康状態を見抜く こ + と ができる。彼らは開業医としてかなりよい報酬を得て、それを持って + 洞窟に入っていく。 + + 騎士(Knight) は騎士道に忠実であることと防具が驚くほど優れ て + いることという点で、普通の戦士とは区別される。 + + モ ンク(Monk) は修道者であり、厳格な肉体的習慣と精神的訓練 + によって、武器なしでも武器を使うのと同じように戦うことが出来 る。 + モ ンクは防具をつけないが、機動性を向上させることで埋め合わせてい + る。 + + 僧侶と尼僧(Priest と Priestess) は聖職の戦士であり、武器と防 + 具 を持ち魔法の業を駆使して正義を広めんとする聖戦士である。祈りを + 通じて神と語る能力により、彼らはしばしば危難から逃れることがで き + る…が、祈りは危難をもたらすこともある。 + + レンジャー(Ranger) はほとんど森を住みかとし、洞窟は少々場違 + いかもしれない。しかし、彼らは追跡術や隠密行動と共に、弓術の達 人 + である。 + + 盗 賊(Rogue) は敏捷で身を隠す業に長けた泥棒であり、錠や罠や + 毒に詳しい。彼らの長所は奇襲であり、これは非常な長所となる。 + + 侍(Samurai) は封建時代の日本の精鋭の武人である。防具は軽 装 + で身のこなしに秀でており、この上なく研ぎ澄まされた 大小 2本の刀 + を帯びている。 + + 観光客(Tourist) は多額の金(買物に最適である)とク レ ジッ ト + カー ド、大量の食料、地図、そして高価なカメラを持って出発する。ほ + とんどの怪物は写真に撮られるのを嫌うものである。 + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 3 + + + + ワルキューレ(Valkyrie) は勇敢な女戦士である。過酷なスカンジ + ナ ビアの国々で育った彼女らは頑強で、厳しい寒さにも耐え、身を隠す + 業と巧妙さを身につけている。 + + 魔法使い(Wizard)は魔術の知識とに選び抜かれた魔法の道具を 準 + 備 しており、いにしえの魔法学に対して特に造詣が深い。見かけは弱そ + うで簡単に打ち倒せるように思えるが、経験を積んだ魔法使いは恐る べ + き敵である。 + + また、キャラクターの種族も選ぶことができる。 + + ドワーフ(Dwarf) は人間やエルフよりも小さいが、がっしりした + 体つきで丈夫である。ドワーフの注目すべき特性は採掘と金属工作の 専 + 門 的技術である。ドワーフの防具はエルフのミスリル防具と同じとまで + はいかないまでも、それに次ぐ品質である。 + + エルフ(Elf) は機敏さと迅速さ、そして鋭敏な感覚を持っ て い + る。 周 囲 で起きるどんな些細なことも彼らの目を逃れることはできな + い。職人気質の彼らの持つ武器と防具は優秀なものである。 + + ノーム(Gnome) はドワーフよりもさらに小さいが、ドワーフと似 + て いる。ノームは熟練した採掘師として知られ、富と危険で満ちている + 秘密の地下坑道を恐怖の迷宮に作っていることで知られる。 + + 人間(Human) は地上で最も一般的な種族で、ゆえに他の種族と比 + 較 される時の基準となっている。特別な能力は持っていないが、あらゆ + る職業で成功することができる。 + + オーク(Orc) は残酷で野蛮な種族で、(他のオークを含む)あらゆ + る 生物を嫌っている。特に、オークはエルフを感性の違いゆえに嫌い、 + わざわざあらゆる機会を見つけて殺そうとする。オークによって作ら れ + た防具と武器は一般的に品質が劣る。 + + 3. 画面に表示されるものの意味 + + 画面上にはあなたが現在いる洞窟の階ですでに探索を終えた部分の + 地図と、そこで目にした物が示されている。さらに深く探検を進める に + 連れて洞窟はその姿を次第にあなたの前の画面に明らかにしていく。 + + NetHack の祖先である rogue が最初に現れたとき、そのスクリー + ン指向はコンピュータファンタジーゲームの中でも全く独特の も の で + あっ た。それ以来スクリーン指向は例外的なものというよりむしろ標準 + となった。NetHack はこのすばらしい伝統を受け継いでいる。疑似的 な + 英 語 で コマンドを入力し、結果が文章で表示されるテキストアドベン + チャーゲームとは異なり、NetHack のコマンドはすべて 1 文字か 2 文 + 字 のキー入力で与えられ、その結果は画面上にグラフィカルに表示され + る。画面は最低 80 桁および 24 行の大きさが推奨される。それ以上 の + 大きさがあっても 80 × 21 の領域だけが地図の表示に使われる。 + + NetHack は点字や音声合成の助けを借りて、目の不自由な人でもプ + レイできる。目の不自由な人のためのNetHackの設定方法については、こ + のドキュメントで後述する。 + + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 4 + + + + NetHack はプレイするたびに新しい洞窟を作成する。このため何回 + かゲームに勝利したことのある作者たちにも、いまだこのゲームは楽 し + く興奮に満ちたものと感じられる。 + + NetHack はさまざまな表示のオプションを提供する。オプションは + あなたのハードウェアやソフトウェアの能力に依存し、プラット フォー + ム 毎 に さまざまである。さまざまなコンパイル時のオプションは実行 + ファイルが作られたときにのみ可能となる。モノクロキャラクタイン タ + フェー ス、カラーキャラクタインタフェース、タイルと呼ばれる小さな + 絵を用いたグラフィカルインタフェースの 3 つの表示方法があ る。 2 + つ のキャラクタインタフェースはフォントを他の文字に置き換えること + もできるが、標準設定では 標準の ASCII キャラクタを用いて全てを 表 + 現 す る。 さまざまな表示のオプションはゲーム内容には影響を与えな + い。タイルや色はガイドブックで表記できないし、それは全てのプ ラッ + ト フォームに共通ではないので、ゲーム中に表示されるものの説明とし + てはモノクロキャラクタディスプレイで表示される標準の ASCII キャラ + クタを用いる。 + + NetHack で何が起きているのかを理解するには、まず NetHack で + は画面がどうなっているのかを理解しなくてはならない。NetHack の 画 + 面 は、テキストアドベンチャーゲームにおける「あなたは…を見た」の + ような文章の代わりである。図 1 は NetHack では画面に何が表示さ れ + る かの一例である。画面がどのように表示されるかはプラットホームに + 依存する。 + + -------------------------------------------------------------------- + The bat bites! + + ------ + |....| ---------- + |.<..|####...@...$.| + |....-# |...B....+ + |....| |.d......| + ------ -------|-- + + + + Player the Rambler St:12 Dx:7 Co:18 In:11 Wi:9 Ch:15 Neutral + Dlvl:1 $:0 HP:9(12) Pw:3(3) AC:10 Exp:1/19 T:257 Weak + + -------------------------------------------------------------------- + Figure 1 + + + 3.1. ステータス行(画面の下部) + + 画面の下 2 行には、あなたの現在の状態を表す暗号のような情 報 + の 断片が含まれている。どちらかの行が画面の幅よりも長くなるとその + 全部を見ることはできないかもしれない。以下に状態を示すいろいろ な + 項 目が何を意味するのかを述べる (コンフィグレーションによっては、 + 以下に一覧されている状態を示す項目のすべてが表示されるとは限ら な + い)。 + + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 5 + + + + 名前とランク(Rank) + あ な たのキャラクタ名と(後述の経験レベルに基づく)職業別の等 + 級。 + + 強さ(Strength) + あなたのキャラクタの力の強さの値であり、6 つの基本的な属性の + 1 つである。人間のキャラクターの場合,力の強さは 3 から 18 + の間の値をとる。その他の場合,この制限を越えることもある (時 + 折 18/xx のような特別な力を得ることもあり、魔法の力も普通の + 制限を越える能力を与えることがある)。力の強さの値が大きい ほ + ど、あなたの力は強い。力の強さは力仕事をどれだけうまくやれる + か、戦いでどれだけのダメージを与えるか、どれくらい荷物を運べ + るかに影響する。 + + 素早さ(Dexterity) + 素早さは戦いにおける命中率、罠を逃れる可能性、そしてその他の + 敏捷さを必要とする仕事や物をいかに器用に扱えるかなどのことが + らに影響を与える。 + + 耐 久力(Constitution) 耐久力は怪我やその他の圧迫によるスタミ + ナの消耗から回復する能力に影響する。 + + 知力(Intelligence) + 知力は呪文を唱える能力や魔法書を読む能力に影響を与える。 + + 賢さ(Wisdom) + 賢さは(特に魔法を扱う)実戦的な経験により得られる。魔法のエネ + ルギーに影響する。 + + 魅力(Charisma) + 魅力はある種の生物があなたに対してとる態度に影響を与える。特 + に店主が示す価格に影響する。 + + 属性(Alignment) + 属性には 秩序 (Lawful), 中立 (Neutral), + 混沌(Chaotic) がある。しばしば、秩序は善、混沌は悪である と + されるが、法と道徳が常に一致するとは限らない。あなたの属性は + 他の怪物のあなたに対する反応に影響を与える。属性が似ている怪 + 物は好戦的ではなく、反対の属性に対してはあなたの存在に対して + 極めて好戦的であるらしい。 + + 階数(Dungeon Level) + どれだけ洞窟の奥深くまで行ったかを示す。初期値は 1 で、洞 窟 + を奥深く行くほど大きな値になる。いくつかの階は特別で、数字で + はなく名前で識別される。イェンダーの魔除けは地下 20 階より深 + くのどこかにあると考えられている。 + + 金(Gold) + 大っぴらに所持している金貨の数である。箱などに隠したお金は勘 + 定に入っていない。 + + 体力(Hit Points) + 体力の現在値と最大値である。体力はあとどれだけのダメージを受 + けると死ぬかを示す。戦いで傷つくほど値は減少する。体力は休息 + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 6 + + + + や魔法のアイテムや呪文により回復できる。括弧の中の数字は体力 + のとり得る最大値である。 + + 魔力(Power) + 呪 文 に使う魔力である。これは呪文を唱えるのに必要な神秘の力 + (mana: マナ ) がどれほどあるかを示す。魔力もまた休息すること + により回復する。 + + 防御値(Armor Class) + 非友好的な生物からの攻撃を防具がどれほど食い止められるかを示 + す値である。数字が小さいほど防具は有効であり、防御値が負の値 + になることさえ十分あり得る。 + + 経験値(Experience) + 現在の経験レベルと経験値である。冒険が進むと経験値を得ること + ができる。経験値の合計がある一定値まで達すると、経験レベルが + 上がる。経験を積むにつれ、戦い方が上達し魔法の攻撃にも耐えら + れるようになる。多くのバージョンでは経験レベルだけが表示され + る。 + + 時間(Time) + 経過したターン数である。 time オプションがオンのときに表示さ + れる。 + + 腹具合(Hunger status) + 現在の腹具合である。腹具合は 満腹(Satiated) から + ふらふら(Fainting) P までの値をとる。腹具合が普通なら表示さ + れない。 + + この他にも状態を示す表示が腹具合の後ろに表示されることがある + かもしれない。混乱しているときには Conf、病気のときには FoodPois + または Ill、目が見えないときには Blind、眩暈がしたときは Stun、幻 + 覚を見ているときは Hallu と表示される。 + + 3.2. メッセージ行(画面の上部) + + 画面の最上行は視覚的に表現できないことを説明するメッセージの + た めに使われる。最上行に``--More--''が表示されたときは、このあと + にさらにメッセージが続いているけれども現在のメッセージをまず確 実 + に 読むよう促しているということである。次のメッセージを読むために + は単にスペースキーを押せばよい。 + + 3.3. 地図(画面のその他の部分) + + 画面のその他の部分は、あなたが現在いる階でそれまでに探索し終 + わっ た部分の地図である。画面上のシンボルはそれぞれ何かを表してい + る。表示されるシンボルのうちいくつかは、さまざまなグラフィック オ + プ ションを設定することによって変えることができる。そうでなければ + 標準設定のシンボルが用いられる。次に標準設定のシンボルの意味の 一 + 覧を示す。 + + - と | + 部屋の壁、または開いた扉、または墓 (|)。 + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 7 + + + + . 部屋の床、氷、または扉のない出入口。 + + # 通路、鉄の棒、木、あるいは台所の流し台(流し台がインプリメン + トされているとき) または跳ね橋 + + > 上り階段:上の階への通路。 + + < 下り階段:下の階への通路。 + + + 閉じた扉、または学習できるかもしれない呪文の書かれた魔法書。 + + @ あなたのキャラクター、または人間。 + + $ 金貨の山。 + + ^ 罠(ひとたび発見すれば表示される)。 + + ) 武器。 + + [ 服またはなんらかの防具。 + + % 食料(衛生的であるとは限らない)。 + + ? 巻物。 + + / 杖。 + + = 指輪。 + + ! 水薬。 + + ( 便利なアイテム(つるはし、鍵、ランプ…)。 + + " + + * 宝石または岩(貴重なものかもしれないし、価値のないものかもし + れない)。 + + ` 岩、または彫像。 + + 0 鉄球。 + + _ 祭壇、または鉄の鎖。 + + { 泉 + + } 水たまり、または堀、または溶岩の海。 + + \ 豪華な王座 + + a-zA-Z およびその他のシンボル + これらの文字とその他のいくつかのシンボルは恐怖の迷宮のいろい + ろな住人たちを表す。彼らは不機嫌で悪意に満ちているかも知れな + いので警戒しなければならない。が、ときには何かの手助けになる + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 8 + + + + こともある。 + + I このマークは透明、あるいはその他の見えない怪物が最後にいたら + しい場所に表示される。怪物はすでに移動しているかもしれないこ + とに注意すること。ここでは'F'と'm'のコマンドが便利だろう。 + + これらのシンボルをすべて記憶する必要はない。`/' コマンドでど + のシンボルが何を表すか知ることができる(詳細は次の項を 参 照 の こ + と)。 + + + 4. コマンド + + コマンドは 1 文字か 2 文字のキー入力を行うことで実行される。 + いくつかのコマンド、例えば``search''はそれ以上 NetHack に情報を与 + え る必要がない。他のコマンドは例えば方向や使用する物などの情報を + さらに与える必要がある。これらさらなる情報を必要とするコマンド に + 対しては、 NetHack は選択メニューもしくはコマンドラインプロンプト + のいずれかを表示する。どちらが表示されるかは主として menustyle オ + プションをどのように設定したかによる。 + + 例えば ``What do you want to use? [a-zA-Z ?*]'' という形式の + 質問がよくあるが、これはあなたに持っている物のうちどれを選ぶか を + 尋 ねるものである。この質問において「a-zA-Z」はあなたが選べる持物 + の目録記号である。 `?' を入力するとこれらの物の目録一覧が得られ、 + 個 々 の記号が何を表しているのか知ることができる。この例では、`*' + もある。これは一覧には表示されておらず、通常そのコマンドでの使 用 + を 想定していない物でも、使おうと思えばそれを選ぶことができること + を示している。`*' を入力するとすべての持物の目録が表示され、個 々 + の 持物すべてについての目録記号を知ることができる。考え直して結局 + このコマンドを使わないことにしたときには ESC キーを押せばコマンド + を終了することができる。 + + コマンドの中には、その前に数字を入力することで何回も繰り返す + ことができるものもある。例えば「10s」は 10 回の探索を表している。 + もし number_pad オプションがオンのときには数字の前に `n' を入力し + なければならない。つまり上の例では代わりに「n 10s」と入力しなけれ + ば ならない。複数回実行することが無意味なコマンドではこれは無視さ + れる。さらに、移動コマンドの前に特定の文字(プレフィックス)を付 け + る ことによってさまざまな移動方法をとることができる(後述)。繰り返 + し回数やプレフィックスを取り消すためには ESC キーを押せばよい。 + + コマンドの一覧はかなり長いが、ゲーム中に `?' コマンドを使 用 + し てヘルプメニューを見ることにより、いつでもコマンドの一覧を見る + ことができる。以下はコマンドの一覧である。 + + ? ヘルプメニュー: 表示可能なヘルプ画面のうちの 1 つを 表 示 す + る。 + + / シンボルが何を意味するかを示す。指定するには場所を示すか、ま + たはシンボル(あるいは単語全体)を入力するかを選択することがで + きる。 + + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 9 + + + + 場 所 の 指 定 は、 適 切 な 位 置までカーソルを移動させてか + ら`.'、`,'、`;'、`:'のどれかを押すことによって行なう。 `.'を押 す + と、選んだ場所で表示されているシンボルの説明が表示され、もし help + オプションがオンなら場合によっては``More info?''(詳細を見る?)と質 + 問 され、それからさらに他の場所を指定することができる。 `,'を押す + と、シンボルの説明が表示されるが、詳細情報は表示されない。 `;' を + 押 す と、 詳細情報は表示されず、さらに他の場所の指定もできない。 + `:'を押すと、(もしあるなら)確認なしで詳細情報が表示される。場所を + 選ぶ時に ESC キーを押すことによってこのコマンドを中断でき、 `?'を + 押すとどのように動作するかの簡単な説明が表示される。場所でなく 名 + 前を指定した場合は、常にその名前に対する追加情報が表示される。 + + & コマンドの動作を示す。 + + < 上の階へ行く(階段やはしごにいるとき)。 + + > 下の階へ行く(階段やはしごにいるとき)。 + + [yuhjklbn] + 指 定した方向へ一歩進む(図 2 参照)。その方向に怪物がいると感 + じているか覚えているときは、移動するのではなく怪物と戦うこと + になる。怪物と戦うことになるのはこの一歩移動のコマンドだけで + ある。その他のコマンド(後述)は「安全」である。 + + y k u 7 8 9 + \ | / \ | / + h- . -l 4- . -6 + / | \ / | \ + b j n 1 2 3 + (number_pad がオンのとき) + + Figure 2 + + + [YUHJKLBN] + 壁に突き当たるか何かに衝突するまで指定した方向に進む。 + + m[yuhjklbn] + プレフィックス: 物を拾ったり、 (たとえそこに怪物がいると思っ + ていても)戦ったりせずに移動する。 + + F[yuhjklbn] + プレフィックス: (そこに怪物がいると予想しているだけでも)怪物 + と戦う + + M[yuhjklbn] + プレフィックス: 物を拾わずに遠くへ移動する。 + + g[yuhjklbn] + プレフィックス: 何かが見つかるまで移動する。 + + G[yuhjklbn] or [yuhjklbn] + プレフィックス: 'g' と同じ。ただし通路の分岐点では止ま ら な + い。 + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 10 + + + + _ 指定された位置まで、最短距離アルゴリズムを用いて移動する。最 + 短距離は、あなたが知っている(見た、または以前に通った)地図配 + 置を基に計算される。知っている道がない場合、代わりに推測が行 + われる。 `G'コマンドとほぼ同じ条件で停止するが、 `M'コマンド + と同様に物を拾わないで移動する。 + + . 休憩する。1 ターン何もしない。 + + a 道具(つるはし、鍵、ランプ…)を用いる(使う)。 + + A 1 つまたは複数の身につけているもの(防具など)をはずす。防具 + を1 つだけはずすときには 'T'(take off: 防具をはずす)を、アク + セ サ リを 1 つだけはずすときは 'R'(remove: アクセサリをはず + す)を使用せよ。 + + ^A 1 つ前のコマンドを繰り返す。 + + c 扉を閉じる。 + + C 個々の怪物に名前を付ける。 + + ^C パニックボタン。ゲームを放棄する。 + + d 何かを下に置く。例:「d7a」は a という物を 7 個下に置くことを + 意味する。 + + D い くつかの物を下に置く。``What kinds of things do you want + to drop?[!%= BUCXaium]'' (どの種類のものを置きますか?) の質 + 問に対して、0 個以上の物のシンボルを入力することで答える。さ + らに`a', `i', `m', `u' をその後に入力することもできる。加 え + て、 祝福された(B)/呪われていない(U)/呪われた(C)アイテムを指 + 定することもできる。 + + DB - 祝福されていると判明している物全てを下に置く。 + DU - 呪われていないと判明している物全てを下に置く。 + DC - 呪われていると判明している物全てを下に置く。 + DX - 祝福/呪いが判明していない物全てを下に置く。 + Da - 確認なしにすべての物を下に置く。 + Di - 物を置く前に持ち物を確認する。 + Du - (店にいるとき)代金未払の物だけを下に置く。 + Dm - 置く物を選ぶのにメニューを用いる。 + D%u - 代金未払の食料だけを下に置く。 + + ^D 何か(普通は扉)を蹴る。 + + e 食料を食べる。 + + E 床にメッセージを刻み込む。``Elbereth'' という語を刻 み 込 む + と、たいていの怪物はあなたに白兵戦を挑んで来なくなる (しかし + あなたが攻撃をすると文字は消えてしまう)。これは、一息いれ た + いときになかなか便利である。 (この機能はコンパイル時に削除さ + れているかも知れないので、あなたのバージョンで必ずしも機能す + るとは限らない。) + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 11 + + + + E- - ほこりの中に指で書く。 + + f 矢筒に入れてあるものを発射する。発射するものは予め`Q'コマン + ドで選択することも出来るし、 autoquiver オプションが設定され + ている場合は、コンピューターに自動的に適当なものを設定させる + こともできる。 + + i 持物の目録(持っている物すべて)を表示する。 + + I 持物の目録のうち指定した一部を表示する。 + + I* - 持物のうち宝石をすべて表示する。 + Iu - 代金未払いの物をすべて表示する。 + Ix - 代金未払いだが使ってしまった物をすべて表示する。 + I$ - お金を数える。 + + o 扉を開ける。 + + O オプションを設定する。現在のオプションの値の一覧が表示 さ れ + る。 (見出し文字をタイプするかクリックすることによって)変更 + したいオプションを選んで、ほとんどの値を変更することが で き + る。 ブー ル値でないオプションの場合は、さらにメニューが出る + か、プロンプトが出る。設定可能なオプションはこのガイドブック + の 後ほどに一覧がある。オプションは通常は `O' コマンドではな + く、ゲームを始める前に設定する。後述のオプションの項を参照の + こと。 + + p 代金を払う。 + + P 指輪、あるいはその他の装飾品(魔除け、目隠し)を身につける。 + + ^P 1 つ前のメッセージをもう一度表示する。続けて ^P を入力すると + さ ら に 前 の メッ セー ジ が順に表示される。この振る舞いは + msg_windows オプションによって変化する。 + + q 何か(水薬,水など)を飲む。 + + Q 矢筒に入れるものを選択する。ここで選択したものは`f'コマン ド + で 発射することができる。 (バージョン 3.3 以前ではこのコマン + ドはゲームを放棄するものだったが、その機能は`#quit'に移動 し + た) + + r 巻物や魔法書を読む。 + + R 装飾品(指輪、魔除けなど)をはずす。 + + ^R 画面を描き直す。 + + s 周囲の隠し扉や罠を探す。何かを見つけるには普通何回も探す必要 + がある。 + + S ゲームをセーブして、中断する。ゲームは次回プレイ時に自動的に + 復旧される。 + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 12 + + + + t 物を投げる。または矢などを発射する。 + + T 防具をはずす。 + + ^T テレポート能力があればテレポートする。 + + v バージョン番号を表示する。 + + V このゲームの履歴を表示する。 + + w 武器を持つ。 + + w- - 武器として何も持たず素手になる。 + + W + + x 装備している武器を予備の武器と交換する。予備の武器は二刀流攻 + 撃で用いられる。予備の武器がなくても交換は実行される(今 持っ + ているものを予備にして、素手になる)ことに注意。 + + X 後述する探検(発見)モードに入る。 + + ^X あなたの名前、職業、種族、性別、属性および、今回のゲームにお + けるさまざまな神の名前を表示する。 + + z 杖を振る。自分に振る場合は、方向に`.'を使う。 + + Z 呪文を唱える。自分に呪文を唱えたいときは、方向として`.'を 使 + う。 + + ^Z ゲー ム を一時中止する(ジョブコントロール機能のある UNIX(R) + バージョンのみ)。 + + : 足元に何があるか見る。 + + ; 見えているシンボルが何を示すかを表示する。 + + , 何かを拾う。`m'の後に押すことによって、設定に関わらず選択 メ + ニューを表示する。 + + @ autopickup オプションのオン・オフを切り替える。 + + ^ 今までに発見した罠の種類を調べる。 + + ) 持っている武器を表示する。 + + [ 付けている防具を表示する。 + + = はめている指輪を表示する。 + + + + __________ + (R)UNIX is a registered trademark of AT&T. + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 13 + + + + " 付けている魔除けを表示する。 + + ( 使っている道具を表示する。 + + * 装備しているものを表示する。上の 5 つのコマンドを一つにした + もの。 + + $ 持っている金貨を数える。 + + + 知っている呪文の一覧を表示する。このコマンドによって、呪文の + 表示される順番を変えることもできる。呪文をメニュー形式で表示 + させ、まず一つ目の呪文を選択し、さらに入れ替えたい呪文を選択 + することによって順番が入れ替わる。さらに入れ替えたい場合はこ + の操作を繰り返す。 + + \ 今までにどんな種類の物を見つけたかを表示する。 + + ! シェルに抜ける。 + + # 拡張コマンドを実行する。以上から分かるように NetHack の作 者 + たちはすべての文字を使い果たしてしまったので、あまり頻繁に使 + われないコマンドはこのようにして導入された。どの拡張コマンド + が使用可能かは、ゲームのコンパイル時にどの機能が有効にされた + かによる。 + + #adjust + 持物の目録記号を変更する( fixinv オプションが「オン」の時 に + 非常に便利である)。 + + #chat + 誰かと話をする。 + + #conduct + どの挑戦がまだ守られているかを表示する。詳しくは後述する「制 + 限プレイ」の章を参照すること。 + + #dip 物を何かに浸す。 + + #enhance + 武器の技量を高めたり、調べたりする。 + + #force + 錠をこじ開ける。 + + #invoke + 物が持つ特別な能力を発動する。 + + #jump + 別の場所へジャンプする。 + + #loot + あなたのそばにある床に置いてある箱や鞄、またはあなたの 隣 に + 立っている馬の鞍の中身を調べる。 + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 14 + + + + #monster + (怪物の姿に変化している時に)怪物の特殊能力を使う。 + + #name + 物や物の種類に名前を付ける。 + + #offer + 神にいけにえを捧げる。 + + #pray + 神に祈って助けを求める。 + + #quit + ゲームをセーブせずにプログラムを終了する。 + + #ride + 怪物に乗る(あるいは乗るのをやめる)。 + + #rub ランプや石をこする。 + + #sit 座る。 + + #turn + 不死の怪物を追い払う。 + + #twoweapon + 二刀流戦闘のオン・オフを切り替える。二刀流に適切な武器を使う + こと。さもなければ自動的にオフになる。 + + #untrap + 何か(罠、扉、宝箱)の罠をはずす。 + + #version + このバージョンの NetHack をコンパイルしたときのオプション を + 表示する。 + + #wipe + 顔を拭う。 + + #? ヘルプメニュー: 利用可能な拡張コマンドの一覧を表示する。 + + もしあなたのキーボードにメタキー (別のキーと一緒に押すことに + よってそのキーの`メタ'[第 8、または`上位']ビットをセットする)があ + れ ば、コマンドの頭文字をメタキーと一緒に押すことによって多くの拡 + 張コマンドを起動することができる。 NT, OS/2, PC NetHack で は + 'Alt' キーがこの目的に使われる. + + M-? #? (対応していないプラットホームもある) + + M-2 #twoweapon (number_pad がオフの場合) + + M-a #adjust + + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 15 + + + + M-c #chat + + M-d #dip + + M-e #enhance + + M-f #force + + M-i #invoke + + M-j #jump + + M-l #loot + + M-m #monster + + M-n #name + + M-o #offer + + M-p #pray + + M-q #quit + + M-r #rub + + M-s #sit + + M-t #turn + + M-u #untrap + + M-v #version + + M-w #wipe + + number_pad オプションがオンのときは、これらに加えいくつかの + 文字コマンドが有効になる。 + + h ヘルプメニュー: ``?'' と同様にヘルプメニューを表示する。 + + j 別の場所へジャンプする。「#jump」や「M-j」と同じ。 + + k 何か(通常は扉)を蹴る。'^D' と同じ。 + + l あなたのそばにある床に置いてある箱や鞄、またはあなたの 隣 に + 立っている馬の鞍の中身を調べる。「#loot」や「M-l」と同じ。 + + N 物や物の種類に名前を付ける。「#name」や「M-n」と同じ。 + + u 罠、 扉、 宝 箱 などの仕掛けられた罠をはずす。「#untrap」や + 「M-u」と同じ。 + + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 16 + + + + 5. 部屋と通路 + + 洞窟内の部屋や通路は明りがついていることもあるし、ついていな + い こともある。明りのついている部分で自分の視野に入る部分は画面に + 表示される。暗いところでは周囲 1 つ分の空間だけが見える。壁や通路 + は画面に表示されたままになる。 + + 隠 し通路は表示されない。これらは `s'(search: 探す) コマンド + で発見することができる。 + + 5.1. 出入口 + + 出入口は部屋と通路を接続するものである。出入口の中には扉のな + い ものがある。このときにはそのまま通り抜けることができる。その他 + の出入口には扉があるが、その扉は開いているか、閉じているか、錠 が + か かっ て い る か の い ず れかである。閉じている扉を開けるには + `o'(open: 扉を開ける) コマンドを用いる。再び 扉 を 閉 じ る に は + `c'(close: 扉を閉じる) コマンドを用いる。 + + 扉に錠がかかっているときは `a'(apply: 道具を用いる) コマンド + で錠をはずす道具を使うか、`^D'(kick: 蹴る) コマンドで扉を蹴破るこ + とで通ることができる。 + + 開いた扉に斜めから入ることはできない。水平あるいは垂直方向か + ら真っ直ぐに近付かなければならない。扉のない出入口にはこのよう な + 制限はない。 + + 扉は怪物を締め出すのに役に立つ。たいていの怪物は扉を開けるこ + とができない。けれどもいくつかの怪物にとっては扉を開ける必要な ど + ない(例: 亡霊は扉を通り抜けることができる)。 + + 隠 し扉は表示されない。これらは `s'(search: 探す) コマンドで + 発見することができる。一度発見すると普通の扉と同様になる。 + + 5.2. 罠 (`^') + + そそっかしい冒険者を陥れようとする罠が洞窟のあちこちにある。 + 例 えば落し穴に落ちると上り出るのに数ターンの間その場から動けなく + なるであろう。そこに誰かが足を踏み入れて引っかかるか、`s'(search: + 探 す) コマンドで見つけるかして初めて罠は表示される。怪物も罠の餌 + 食になることがある。これは非常に有効な防御戦術である。古典的コ ン + ピュー タゲームである「倉庫番」を基にした特別なダンジョンへの分か + れ道も存在する。このダンジョンでの目的は大岩を落し穴に入れるこ と + で ある。慎重に先読みすれば、全ての階は倉庫番の伝統のルールでクリ + アできる。行き詰まってしまった冒険者のためにいくつかの助け舟が 用 + 意されているが、これらは運を低下させてしまう。 + + 5.3. 階段 (`<', `>') + + 一 般的に洞窟の各階には、前の階への上り階段('<')と、次の階へ + の下り階段('>')がひとつずつある。しかし、例外もある。例えば、洞窟 + の 比較的浅い階であなたは二つの下り階段がある階を発見するだろう。 + ひとつは洞窟の続きであり、もうひとつはノームの坑道として知られ る + 地 帯に続いている。この坑道は最後には行き止まりになっていて、ここ + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 17 + + + + を探検した(あなたがそうすることを選択した場合)後、元の洞窟にま で + 戻って来る必要がある。 + + 階段を使うか、あるいは他の階に移動する罠に引っ掛かった場合、 + いままでいた階は非活性化されて、ディスク上のファイルに貯 え ら れ + る。 昔訪れた階に再び訪れた場合、ディスク上のファイルが読み込まれ + て再活性化される。初めて訪れる階に移動した場合、その階は(ほとんど + の 階は一から、「特別な」階はテンプレートから、「骨の」階(後述)の + 場合はファイルから読み込んで) 新たに作成される。怪物は現在の階 に + いるものだけが行動する。他の階にいるものは止まっている。 + + 普通、あなたが階段を使うと、あなたは目的地で対応する階段の上 + に現れる。しかし、ペット(後述)といくつかの怪物はあなたが階段を 上 + り 降りした時についてきて、時々それらの一体があなたと入れ替わるこ + とがある。こうなった場合、ペットやその他の怪物が階段の上に現 れ、 + あなたはそのそばに現れる。 + + 5.4. はしご (`<', `>') + + はしごは階段と同じ役目であり、階を繋ぐこの二つの種類はゲーム + 中ほとんど区別ができない。 + + 5.5. 店と買い物 + + 時々ドアのそばに店主がいて、床にたくさんの物が置いてある部屋 + に行き当たることがある.物を拾って、`p'コマンドを使うことで物を買 + うことができる.物を拾う前に、物の上に立って``#chat''コマンドを使 + う ことで値段を確認できる.支払いをする前に物を使うと借金になり、 + 店主は債務を支払うまでは店の外に出してくれなくなる. + + 店の中にいるときに物を落すことで物を店主に売ることができる. + 売 却価格を提示され、売るかどうかを確認されるか、単に店主が興味が + ないことを知らされる(一般的に、店で売っている物と同じ種類の物が買 + い取り対象である)。 + + 偶然で物を店の中に落してしまうと、店主は普通代償なしに所有権 + を主張する.物を取り戻すためには買い戻す必要がある. + + 店主は資金不足になることがある。こうなった場合、何かを売ろう + と すると現金の代わりに信用貸しを提案される。信用貸しは物を買うと + きに使えるが、同じ店でだけ有効である。他の店主は引き受けない。 ( + 迷 宮で「クレジットカード」を手に入れることがあるが、これを店で使 + おうとしてはいけない。店主は受け入れない。) + + `$'コマンドを使うと、今持ち運んでいる金貨の数(かばんや 箱 に + 入っているものは除く)とともに、負債や信用貸しがあれば表示される。 + `Iu'コマンドは未払いの物(まだ店が所有する物)の一覧(あれば)を表 示 + する。 `Ix'コマンドは使ってしまった物の代金の一覧(あれば)が表示さ + れる。 + + 5.5.1. 店の特殊な性質 + + 店のいくつかの性質は意外なものかもしれない。 + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 18 + + + + * アイテムの値段は色々な要素によって様々に変化する。 + + * 店主はドアの一つ内側の場所は店の外として扱う。 + + * 店主はあなたを鷹のように注意深く見張っているが、一般的にその 他 + の消費者については無視する。 + + * 店が"closed for inventory"(「棚卸のため閉店」)の場合、待ってい + ても開店はしない。 + + * 店は例え品物が枯渇しても新しいアイテムが入荷することはない。 + + + 6. 怪物 + + 画面上にはあなたから見える怪物しか表示されないが、ひょっとす + る と闇の中で怪物とばったり出くわすことになるかもしれないので注意 + が必要である。魔法のアイテムの中には、怪物があなたを発見するよ り + も前にあなたが怪物を発見するのに役立つ物もある(しかしこの能力に大 + 変優れている怪物もいる。) + + `/' コマンドと `;' コマンドが画面上に表示されている怪物に 関 + する情報を得るのに用いられる。 `C' コマンドは怪物に名前をつけるの + に用いられ、複数の怪物がいる時に、ある怪物を他のものと見分けた い + と きに便利である。名前としてスペースを指定すると、以前につけた名 + 前を消すことになる。 + + 拡張コマンド「#chat」によって、隣接する怪物と交流できる。 実 + 際の台詞は選択できない(言い換えると、あなたが何をしゃべるかは選べ + ない)が、店主や Oracle of Delphi(デルファイの神殿)といった相手 と + 話をすることは、有益な結果をもたらす。 + + + 6.1. 戦闘 + + 発見した怪物と戦いたいときには、単にその怪物に向かって移動す + るようにすればよい。多くの怪物はあなたが戦いを挑まない限り、他 の + こ とを気にすることはない。腹を立てると大変危険な怪物もいる。「三 + 十六計逃げるにしかず」ということわざを忘れずに。 + + 怪物が見えない(怪物が透明、またはあなたが目が見えない)場合、 + 怪物がいるとあなたが思った位置に`I'の文字が表示される。その区画に + 歩こうとすると、見えている時と同じようにあなたは怪物に攻撃しよ う + と する。もちろん、もし怪物が移動してしまっていたら、あなたの攻撃 + は空を切ることになる。もし怪物がすでに移動してしまってい る と 考 + え、 戦いたくない場合は、 `m'コマンドを使うことで戦うことなく移動 + できる。逆に、そこに怪物がいるかどうかわからないけれどもとにか く + 戦って見たい場合は、 `F'コマンドが使える。 + + 6.2. ペット + + あ なたは仔犬(`d')、子猫(`f')、ポニー(`u')のいずれかとともに + ゲームを始める。あなたのペットはあなたとともに洞窟をさまよい、 怪 + 物 と 戦 う。ペットはあなたと同様に生きのびるための食料を必要とす + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 19 + + + + る。ペットは新鮮な死肉やその他の肉をえさにしている。もしもペッ ト + の ことが気がかりであったり、ペットを飼い慣らしておきたいと思うな + ら、あなたが直接えさを与えることもできる。そのためには食料を ペッ + ト に向かって投げてやればよい。きちんと訓練されたペットはある種の + 状況のもとで極めて利用価値が高い。 + + ペットも怪物を倒していくにつれて経験を積んでいく。また時間と + と もに成長もし、体力や相手に与えるダメージも増加する。初めのうち + はあなたよりもペットの方が強いだろうから、レベルの低いキャラク タ + にとっては役に立つだろう。 + + あなたが他の階へ移動するとき、隣にペットを連れていればペット + もあなたについて移動する。置き去りにすると野生化してしまうかも し + れ ない。同様に、もしあなたが自分の位置が変わるような罠にかかった + 場合 (例えば、トラップドアで下の階に落ちた場合)、隣にいたペットは + つ いていき、隣にいなかったペットは取り残される。ペットが自分でそ + のような罠にかかることもある。あなたはたとえその時にペットの隣 に + いても一緒に移動することはない。 + + 6.3. 軍馬 + + ダ ン ジョンにいるある種の生物は、あなたが正しい装備と能力を + 持っていれば、乗ることができる。野生の生物にあなたが乗ることを 納 + 得 させるのは困難である。多くの洞窟の主は協力関係をでっち上げるの + に魔法の力に頼らなければならない。しかし、一旦動物をあなたの支 配 + 下 に置いたなら、 `#ride'コマンドで乗り降りすることができる。動物 + に乗って洞窟を移動する方法は、自分自身が移動するのと同じであ る。 + 地図に表示されるのはあなたが乗っている動物である。 + + 乗馬技術は`#enhance'コマンドで管理することができる。詳しくは + 後述する武器の技術の章を参照すること。 + + 6.4. 骸骨の階 + + 冒険者の幽霊とその死体(あるいはそれは生まれ変わる前のあな た + 自身であることさえある)や、その所持品に出くわすかもしれない。幽霊 + を殺すことは難しいが、動きがのろくほとんどダメージを受けないの で + 簡 単に逃げることができる。あなたは死んだ冒険者の所持品を奪うこと + もできる。しかしそれらは呪われていることが多い。以前の冒険者を 死 + に 到らしめたものにはすべて注意を払わねばならない。それはあたりを + 徘徊し、その直前の勝利に酔いしれているからだ。 + + + 7. 物 + + 洞窟の中で何かを見つけた場合、それを拾いたいと思うのはよくあ + ることである。 NetHack ではその物の上を通ることによって自動的に拾 + うことができ( autopickup オプション(後述)がオフになっているときや + `m' プ レ フィックス (前述)を用いて移動するときはこの限りではな + い)、または `,' コマンドを使って手動で拾うことができる。 + + 持物が多すぎるときには、NetHack はあなたにそのように告げ、そ + れ以上拾うことはできなくなる。そうでなければ NetHack はその物をあ + なたの荷物に加え、何を拾ったかが表示される。 + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 20 + + + + 持ち物が増えるに連れて、荷物の重さが重くなる。どれだけの重さ + の 物を運べるかは筋力と耐久力による。力が強いほど、荷物の重さの影 + 響は小さくなる。しかしそれでも、洞窟の中を持ち歩いている荷物の 重 + さ があなたに負担になるときがくる。反応は鈍くなり、カロリー消費が + 早くなってより多くの食料が必要となる。そして最終的には荷物が重 す + ぎて何かを捨てないと動けなくなってしまう。 + + NetHack では荷物の重さがどれくらい悪影響を与えるかを教えてく + れる。最下行に表 示 さ れ る`Burdened', `Stressed', `Strained', + `Overtaxed',`Overloaded' の表示があなたの状態を示している。 + + 物を拾ったとき、その物には目録記号が割り当てられる。物に関す + る多くのコマンドはあなたがどの物を使いたいのかを尋ねてくる。持 物 + のうち特定の物を選ぶように NetHack が尋ねてきたときは、普通目録記 + 号の一覧が表示されてその中から選ぶ(前述のコマンドの項を参照 の こ + と)。 + + いくつかの物、例えば武器類のような物は、どんなものか簡単に区 + 別が付けられる。この他の物、例えば巻物や水薬はその種類に応じて い + ろいろな名前が付けられている。 1 回のゲームの間は同じ名前を持った + 物は同じ種類の物である。しかし物に付けられる名前はゲームごとに 違 + うものになる。 + + このような物を使った時、もしその効果が明らかな場合は NetHack + がそれが何であるかを憶えていてくれる。その効果があまり明らかで な + い 場合はその物の種類を何と名付けるか尋ねてくる。このため後になっ + てそれを思い出すことができる。またいつでも``#name''コマンドを使っ + て 同様のことができ、ある種類の物すべてに名前を付けたり個々の物に + 名前を付けたりできる。すでに名前をつけているものに``#name''を使う + 場 合、新しい名前としてスペースを指定することによって、以前つけて + いた名前を消すことができる。 + + 7.1. 呪いと祝福 + + あなたが発見したいろいろな物は、たとえそれが役に立つも の で + あっ たとしても呪いがかけられているかも知れない。呪いがかけられて + いる物を使うとそれが張り付いてしまうことは最もよく見られる結果 で + あ る。呪いがかけられている武器を持つとそれは手に張り付いてしまっ + て取れなくなる。呪いがかけられている物を身につけると普通の方法 で + は はずすことができない。さらに、呪いがかけられている武器や防具に + は必ずと言うわけではないがたいていの場合負の魔力が与えら れ て い + て、 そうでない物よりも戦闘時の効力が劣る。その他の呪いがかけられ + ている物は、あまり役に立たなかったりまたはその他の点で害を及ぼ し + たりするだろう。 + + また祝福されている物もある。祝福されている物は呪いがかけられ + ていない普通の物に比べて具合良く働き役に立つ。例えば祝福された 武 + 器は悪魔たちに一層のダメージを与えることができるだろう。 + + 魔 法 を使うと物に呪いをかけたり呪いを解いたりすることができ + る。このためたとえ物が張り付いてしまっても、呪いを解いてはずす こ + と ができる。僧侶は生来呪いや祝福に敏感なので、他の職業の冒険者よ + りも容易に呪われているものを避けることができる。 + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 21 + + + + あなたの持物の目録の中で呪いがかけられているかどうか分からな + い 物は目録のなかで特に何の説明もない。どんな状態にあるか知ってい + る物は目録一覧で「cursed(呪われた)」「uncursed(呪われていな い)」 + 「blessed(祝福された)」などの言葉が物の説明に与えられる。 + + 7.2. 武器 (`)') + + 恐怖の迷宮に住むほとんどすべての怪物は、チャンスと見れば見境 + なくあなたを殺そうとするだろう。自分の身を守る(先に怪物を殺してし + まう)ためにあなたは武器を必要とする。武器なしではポイントにして 1 + 〜 2 のダメージ (いくらかの加算があるかも知れないが)を与えるこ と + し かできない。但し、モンクは例外である。モンクは武器を使って攻撃 + するよりも素手で攻撃した方が遥かに大きなダメージを与えることが で + きる。 + + 武器には鎚矛や剣のような振り回すためのものと、矢や槍のような + 投げつけるためのものがある。武器で怪物に打撃を与えるためには、 武 + 器 を手にもって怪物を攻撃するか武器を怪物に投げなければならない。 + 投げるには、単純に槍を投げるように選択するだけでよい。弓から矢 を + 発 射するには、まず弓を手に持ってから矢を投げればよい。クロスボウ + は crossbow bolt(クロスボウ用の太矢)を発射するためのものであ る。 + 投石器は岩や(宝石のような)その他の石を投げつけるために用いる。 + + 魔 力のある武器には「追加能力」(攻撃能力と言うことで正と負の + 両方を取り得る)が付けられており、攻撃が怪物に当たる可能性と与える + ダ メージに追加される。武器の魔力を測定するには、なんらかの方法で + 魔法を使って鑑定するしかない。多くの武器は錆のようなある 種 の ダ + メージを受けやすい。このような「腐食」ダメージは修復可能である。 + + 攻 撃 がうまく怪物に命中するかと、命中した時にどれくらいのダ + メージを与えるかは、多くの要素によって決定される。それらには以 下 + の ものがある: 武器の種類、武器の品質(魔力や腐食)、経験レベル、筋 + 力、敏捷性、荷物の重さ、技量(後述)。怪物の防御値(一般的な防御率。 + 防具を着ることによるとは限らない)も要素の一つである。また、ある種 + の武器に対して特に耐性を持つ怪物もいる。 + + 多くの武器は片手持ちであるが、両手が必要な武器もある。両手持 + ち の武器と盾を同時に持つことはできない。片手持ちの武器を持ってい + る場合、もうひとつの武器を予備として準備しておいて、 `x'コマン ド + で 今使っている武器と交換することができる。さらに「二刀流戦闘」技 + 能の技量がある場合、二つの武器を同時 に 使 う こ と が で き る。 + `#twoweapon' 拡張コマンドで二刀流戦闘をするかどうかを切り替えられ + る。一部のキャラクター(例えば野蛮人)だけがこの技能を持ってい る。 + た とえこの技能を持っていても、一度に二つの武器を使うとひとつしか + 使わない時に比べて敵に命中する確率にペナルティを受ける。 + + 全く何の武器も装備したくない時もあるかもしれない。そうするた + め には、装備するものを選ぶ時に`-'を選ぶか、あるいは`A'コマンドで + その他の身につけているものを外すのと同時に現在使っている武器を 外 + すことができる。 + + AD&D をプレイしたことのある読者はお気付きだろうが、AD&D に登 + 場した武器は NetHack においても怪物にだいたい同じダメージを 与 え + る。あまり良く知られていない武器( aklys(アキリス), lucern hammer( + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 22 + + + + ルッツェンハンマー), bec-de-corbin(ベッグ・デ・コルビン) など) の + い くつかは AD&D の追加ルールである Unearthed Arcana の付録で詳し + く説明されている。 + + 武器を使うコマンドは `w'(wield: 武器を持つ)、 `t'(throw: 投 + げ る)、 `f' (fire: 武器を発射するもうひとつの方法), `Q'(quiver: + 矢筒)、 `x' (exchange: 武器を交換する)、`#twoweapon'、`#enhance'( + 後述) である。 + + 7.2.1. ものを投げることと発射すること + + `t' コマンドを使うことによって、どんな物でも投げることができ + る。このコマンドを指定すると、投げる物を尋ねてくる。 `?' を 押 す + と、 持ち物の中で投げるのに向いていそうな物の一覧が表示され、 `*' + を押すと、全ての持ち物の一覧が表示される。何を投げるかを指定し た + 後、( どの目標に投げるかではなく)どの方向に投げるかを尋ねられる。 + 投げることができる距離は、主に物の種類と筋力による。矢は手で投 げ + る こともできるが、弓を持って投げた方が遥かに遠くまで飛び、目標に + も当たりやすい。 + + `Q'コマンドで予め好みの「発射物」を選択しておき、 `f'コマ ン + ド で投げることによって、投げる操作を簡単にすることが出来る。先程 + と同様に投げる方向は尋ねられるが、 `f'コマンドを使うたびに何を 投 + げ る か を指定する必要はない。 autoquiver オプションをオンにする + と、 `Q'コマンドで設定した物がなくなった時に、 NetHack が自動的に + 矢筒に他の物を入れてくれる。 + + --- --- 一度に複数の物を投げることができるキャラクターもい + る。一度に複数の矢を装填し(あるいは一度に複数の物を持ち)、それ を + 目 標に当てることはたやすい仕事ではない。レンジャーはこの技能に優 + れているし、適切な武器の技能 (弓を持って矢を射るなら弓の技能、 ク + ロ スボゥを使うならクロスボゥの技能、スリングを持って石を投げるな + らスリングの技能) において高いレベルの技量があれば他の職業でも 可 + 能 である。あなたがいくつのアイテムを同時に投げることができるかは + 毎ターン変化する。 `t'コマンドや`f'コマンドの前に数字を指定するこ + と に よっ て、 発 射 す る数を明示的に制限することもできる。例え + ば、``2f''( number_pad オプションがオンの時には``n2f'')と指定する + と、 たとえ 3 本発射可能でも最大 2 本しか発射されない。もし、実際 + に発射できる数よりも大きい数を指定した場合 (この例 で は ``4f'') + は、特に数字を指定しなかった場合と同様、実際に発射可能な数(ここで + は 3 本)しか発射されない。一旦動作を開始したなら、全てのアイテ ム + は同じ方向に飛ぶ。もし 1 本目で怪物を倒したなら、残りはその先まで + 飛んでいくことになる。 + + 7.2.2. 武器の技量 + + 利用できる武器の技能はさまざまに異なっている。武器の技量( 技 + 能)はある種の武器をどれくらいうまく扱えるかに影響する。技能はゲー + ムを通じて向上させることが出来るが、それは職業や経験レベルや武 器 + の使用回数による。 + + 技 量を示すために、武器は daggers 、 broadswords 、 polearms + といった風にいくつかのグループに分けられている。それぞれのグ ルー + プ で技量レベルをどこまで高めることが出来るかは職業毎に決まってい + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 23 + + + + る。例えば魔法使いは daggers や staves に対しては高いレベルに達す + ることが出来るが、 swords や bows に対してはそうではない。 + + `#enhance'拡張コマンドで現在の武器(と呪文)の技量を見ることが + できる。さらに、ひとつまたは複数の技能を向上させることができる 状 + 態 なら、どの技能を向上させるかを選択することができる。技能のラン + クは"none" (技能を向上させること が で き な い と い う 意 味 で + "restricted"(制限された) と呼ばれることもある)、 "unskilled"(初心 + 者), "basic"(入門者), "skilled"(熟練者), "expert"(エキスパート)で + あ る。 制 限された技能は単に`#enhance'コマンドで一覧に表示されな + い。 (神の介入によりある種の技能の制限が解除されることもある。 そ + の 時には技能は"unskilled"となり、限界は"basic"までとなる) キャラ + クターによっては、素手での戦闘や マー シャ ル アー ツ の 技 能 を + ``master''( マスター)や``grand master''(グランドマスター)にまで向 + 上させることができる。 + + 技能レベルが"restricted"や"unskilled"の武器を使うと、怪物 へ + の 命中率や命中した時に与えるダメージにペナルティがある。 "basic" + ではペナルティもボーナスもない。 "skilled"では命中率と与 え る ダ + メージにささやかなボーナスがある。 "expert"ではボーナスは大きくな + る。攻撃が命中すると、使っている武器に関する技能を(もし最大に達し + て いないなら) 向上させるための訓練度を増やすチャンスがある。この + 訓練度が次のレベルに必要な値に達すると、自分の技能により自信を 持 + て るように感じたことが告げられる。この時点で`#enhance'コマンドを + 使うことによってひとつまたは複数の技能を向上させることができ る。 + 技 能は自動的には向上しない。なぜなら全ての技能レベルの合計には制 + 限があるので、どの技能を向上させて、どれを無視するかを決める必 要 + があるからである。 + + 7.3. 防具 (`[') + + 多くの非友好的なものが洞窟には潜んでいる。そういったものから + の攻撃から我が身を守るには防具が必要である。防具の中には他の種 類 + の 防具よりも防御効果に優れた物がある。 Armor class(AC)(防御値)は + この防御効果の尺度である。防御値 (AC)は AD&D での場合と同じように + 評 価される。 10 が防具なしの状態と等しく、数値が小さいほど優れた + 防具であることを示す。 AD&D に存在する鎧はいずれも NetHack におい + ても同じ防御効果を示す。以下に(不完全ではあるが) 各種の鎧ごとに規 + 定される防御値の一覧を示す。 + + dragon scale mail(ドラゴンの鱗鎧) 1 + plate mail(鋼鉄の鎧) 3 + crystal plate mail(水晶の鎧) 3 + bronze plate mail(青銅の鎧) 4 + splint mail(鉄片の鎧) 4 + banded mail(帯金の鎧) 4 + dwarvish mithril-coat(ドワーフのミスリル服) 4 + elven mithril-coat(エルフのミスリル服) 5 + chain mail(鎖かたびら) 5 + orcish chain mail(オークの鎖かたびら) 6 + scale mail(鱗の鎧) 6 + studded leather armor(鋲付き皮鎧) 7 + ring mail(鉄環の鎧) 7 + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 24 + + + + orcish ring mail(オークの鉄環の鎧) 8 + leather armor(皮鎧) 8 + leather jacket(皮ジャケット) 9 + no armor(鎧なし) 10 + + さらに他の防具(例: 兜、靴、楯、クローク) を身につけ、防御 値 + の値を小さくすることもできる。ただし同じ範疇に入る物は 1 つしか身 + につけることはできない (鎧は一式、クロークは 1 着、兜は 1 個、 楯 + は 1 枚など)。 + + 防 具に魔力があればその防具の防御効果は通常の物よりも良く(も + しくは悪く)なっており、それに付いている「+記号」(あるいは−記号) + の 分だけ防御値の値が小さくなる。例えば +1 鎖かたびらは、通常の鎖 + かたびらよりも防御効果が高く、防御値は 1 単位分小さくなって 4 に + な る。防具を身につけると直ちに防御値と「+記号」の値が分かる。呪 + いがかけられた防具は通常負の魔力(−記号)を持っており、取りはず す + ことはできない。 + + 多くの鎧は錆のようなある種のダメージを受けやすい。このような + ダメージは修復可能である。魔法を唱えるのを妨げる防具もある。 + + 鎧を使うためのコマンドは `W'(wear: 防具を付ける) と `T'(take + off: 防具をはずす) である。 `A'(remove all: 全てをはずす)もまた他 + の身につけるもの同様、防具をはずすのに使用できる。 + + 7.4. 食料 (`%') + + 生きのびるには食料が不可欠である.長い間食料を口にしないまま + で いるとやがて昏倒し、徐々に餓死への道をたどることになる。保存の + 処置を取ってないと傷んでしまい、食べるには不衛生になる食 料 も あ + る。 アイスボックスや缶に入っている食料は通常はいつまでも傷まない + が、アイスボックスは重く、缶は開けるのに少しばかり時間が必要で あ + る。 + + 怪物を殺すと通常はその死体が残るが、これは「食料」にもなる。 + すべてと言うわけではないが多くは食べられるし、中には食べると特 別 + な 力がつくものもある。大ざっぱに言えば「食べたものになる」という + ことである。 + + 菜食主義の職業や怪物もいる。菜食主義の怪物は決して動物の死体 + を 食べない。一方菜食主義のプレイヤーは動物の死体を食べることがで + きるが、なんらかのありがたくない副作用がある。 + + furit オプションによってあなたの好物の食料にちなんでその名前 + を 1 つ設定することができる。 + + + 食料を食べるためのコマンドは `e' である。 + + 7.5. 巻物 (`?') + + 巻物にはいろいろな表題が付けられているが、これはおそらくいに + しえの魔術師たちが暇潰しとして選んだのであろう (例:``READ ME'' と + か ``THANX MAUD'' の逆さ読みとか)。巻物は読むと消滅する(ただし魔 + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 25 + + + + 法の呪文の書かれていない白紙は消滅しない)。 + + これらの中で最も利用価値の高いものはscroll of identify(識 別 + の巻物)である。これは他の物についてそれが何であるか、呪いがかけら + れているか祝福されているか、あと何回効力を発揮できるかを確定で き + る。 得体の知れない魔力を持つ物の中にはこの巻物なしでは何であるか + 鑑定し難いものもある。 + + メイルデーモンが走ってきてあなたにscroll of mail(手紙の巻物) + を 渡してくれることもある (この機能を有効にしてコンパイルされてい + るバージョンの場合)。 NetHack のメール配達機能はシステムのメー ル + ボッ クスに電子メールがやってきた場合に起動される。この機能を使用 + するには環境変数``MAIL''にあなたのメールボックスのファイル名を 設 + 定して NetHack に新しいメールを探す場所を知らせる必要がある。また + 望むならば環境変数``MAILREADER''に使いたいメール受信プログラム の + ファイル名を設定することもできる。このとき NetHack からそのプログ + ラムを起動してその巻物を読むことができる。メールがゲーム内にお い + てランダムに生成されるバージョンの NetHack ではこれらの環境変数は + 無視される。メイルデーモンは mail オプションでオフにできる。 + + 巻物を読むためのコマンドは `r' である。 + + 7.6. 水薬 (`!') + + 水薬は小びんに入っている液体の色によって区別される。水薬は飲 + むと消滅してしまう。 + + 透明な水薬は水である。これらはしばしば祝福されていたり呪いが + かけられていたりして、聖水や不浄な水になったりする。不死の怪物 に + とって聖水は有害なので、聖水を不死の怪物に投げつける(`t')と有効で + ある。聖水に他の物を浸す(``#dip'')のもたいへん有益である。 + + 水薬を飲むためのコマンドは `q'(quaff: 飲む) である。 + + 7.7. 杖 (`/') + + 魔法の杖は通常何回も魔力を発揮する.杖の中には方向性のあるも + の があり、この場合杖を振る方向を指示しなくてはならない。杖を自分 + に向けて振ることもできる(方向として `.' か `s' を入力する)が、 こ + れ はしばしば愚かな行為となる。その他の杖には方向性がなく、杖を振 + る方向を尋ねてこない。杖が効力を発揮する回数は杖ごとに不定で、 杖 + を使う度にその回数は 1 ずつ減る。 + + 杖の魔法の量がなくなると、通常は杖を使用しても何も起きない。 + しかしながら時折、最後の一握りの魔力を使いきった杖から搾り取る こ + と が可能である。しかしこれをすると杖は壊れてしまう。杖は適切な魔 + 法によって再充填することができるが、そうすると杖が爆発してしま う + 可 能性がある。爆発する可能性は最初は非常に小さく、同じ杖に何度も + 再充填するごとに大きくなる。 + + 自暴自虐なな行為ではあるが、どうにもならなくなったときには杖 + を 壊すという手もある。これは弱気な行為ではない。それを行うことに + より、破壊的な魔法のエネルギーが解放されるからである。 + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 26 + + + + ある杖を完全に鑑定した場合、持ち物の一覧では括弧の中に追加の + 情 報が表示される。それは再充填された回数、コロン、現在の使用可能 + な回数である。杖が無効化された場合には使用可能な回数は -1 に な + る。 + + 杖を使うためのコマンドは `z'(zap: 杖を振る) である。壊すには + `a' (apply: 道具を使う)である。 + + 7.8. 指輪 (`=') + + 指輪は大変役に立つ物である。というのも水薬や巻物や杖のように + 魔 力が一過性にしか働かないものと違い、指輪の魔力は比較的恒久的で + あるからだ。 + + 指輪をはめることによってその魔力は発揮される。指輪は両手の薬 + 指に 1 つずつ、計 2 つしかはめることはできない。 + + またたいていの指輪は身につけると腹の減り方が速くなる。減り方 + は指輪の種類によって異なる。 + + 指輪を使うためのコマンドは `P'(put on: 指輪を は め る) と + `R'(remove: 指輪をはずす) である。 + + 7.9. 魔法書 (`+') + + 魔法書は強力な魔法を記した大きな本である。`r'(read: 読む) コ + マンドで学ぶと呪文の知識が読み手に転送される(したがって最後には読 + めなくなる)か、さもなくばその試みは不測の結果に終る。呪いがかけら + れた魔法書や知識の及ばない神秘の古代文字で記された魔法書を読む と + 健康状態に害が及ぶ可能性がある! + + 呪 文 を唱えたとき(学んでいる時も)にも魔力が逆流することもあ + る。あなたの経験レベルでは遠く及ばない高度な呪文を唱えようと試 み + た り、対応する呪文タイプに関する技能が低かったり、ひどくついてな + いときに呪文を唱えたりすると、呪文を唱えるのに必要なエネルギー と + 時間を浪費しただけに終わってしまうこともある。 + + 呪文を唱えることは、魔法のエネルギーを呼び起こしてそれを精神 + そのものに集中させることである。あなた自身の内部から出る魔法の エ + ネ ルギーが開放され、連続して呪文を唱えると疲れてしまう。呪文を唱 + えるには練習が必要である。練習していれば、それぞれの呪文領域の 技 + 能 は向上していく。しかしながら、時間が経つにつれてそれぞれの呪文 + に関する記憶は薄れ、もう一度呪文を学ぶ必要がでてくるだろう。 + + 指向性のある呪文の場合、呪文を唱える方向を指定する必要 が あ + る。 方向として`.'または`s'を指定することで自分自身に対して呪文を + 唱えることもできる。しかし、これはしばしば愚かな行為である。指 向 + 性のない呪文の場合、方向を指定する必要はない。 + + 武 器 が習熟度の面でグループ分けされているのと同様、呪文もグ + ループ分けされている。呪文を唱えるのに成功すると、そのグループ を + 訓 練したことになる。十分な技能があれば呪文の効果を高め、失敗の可 + 能性を低めることができる。技能スロットは武器スキルと共有する。(`` + 武器の技量''の項も参照のこと) + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 27 + + + + 魔法を唱えるには自由に移動できなければならない。また、いくつ + かの種類の鎧を着ていると魔法を唱えるのを妨げるだろう。 + + 魔法書を読むためのコマンドは巻物を読むときと同じく `r'(read: + 読む) である。 `+' コマンドにより、知っている呪文とそのレベル,分 + 野,成功率が一覧表示される。 `Z'(cast: 呪文を唱える) コマンドによ + り呪文を唱える。 + + 7.10. 道具 (`(') + + 道具はいろいろな目的に使う種々雑多な物である。杖などと同じよ + うに使用回数に制限のある物もある。例えばランプはしばらくたつと 燃 + え 尽きてしまう。その他の道具の中には容器も含まれており、物を出し + 入れすることができる。 + + 道具を使うためのコマンドは `a'(apply: 道具を用いる) である。 + + 7.10.1. 箱 + + 冒険の途中で鞄や箱やひつに出くわすこともあるであろう。これら + は置いてある場所に立っている場合には拡張コマンド「#loot」 に よっ + て、 また持っているときには `a'(apply: 道具を用いる) コマンドで開 + けることができる。しかしながらひつにはしばしば錠がかかってお り、 + 大 抵は重くて運びにくい物体である。ひつは手に持つことはできない物 + なので、錠をはずす(`a'(apply: 道具を用いる) コマンドで鍵や錠を は + ず す 道 具 を 使っ たり、 `^D'コマンドで蹴とばしたり、拡張コマン + ド``#force''により武器を使ってこじ開けるなどの方法による)には床に + 置かなくてはならない。 + + ひつには罠が仕掛けられているものもあり、錠をはずしたりふたを + 開けたりしたときに不快な出来事が起きる。拡張コマンド``#untrap''に + よってチェックをして罠が無効になるよう試みることができる。 + + 7.11. 魔除け (`"') + + 魔 除 けは指輪と大変よく似ており、しばしばもっと大きな効力を + 持っている。指輪と同じように魔除けにはいろいろな魔法の特 性 が あ + り、 有益なものも有害なものもあって、身につけることにより効力を発 + 揮する。 + + 魔除けは一つだけしか首にかけることができない。 + + 魔除けを使うためのコマンドは指輪の場合と同じく `P'(put on: + 指輪をはめる) と `R'(remove: 指輪をはずす) である。 + + 7.12. 宝石 (`*') + + 宝石の中には価値のあるものもあり、高値で売れる。宝石は財産を + 持ち歩く方法としてとして極めて効果的なやり方である。価値のある 宝 + 石を脱出時に所持していれば得点に加算される。 + + 他の小さな石も宝石に分類されるが、その価値はほとんどない。し + かし、全ての石は(もしスリングを持っているなら)弾として有 効 で あ + る。窮余に陥いったら手で投げることも可能である。 + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 28 + + + + 7.13. 大きな岩 (``') + + 彫像や巨石は特に有用ではないし、一般的に重いものである。見か + けとは異なった彫像もあるという噂である。 + + 巨大なヒューマノイド(巨人やその仲間)は巨石を武器として用いる + ことができる。 + + 7.14. 金 (`$') + + 金は得点に加算され、また店では金で物を買うことができる。迷宮 + にはあなたの持つお金に影響されるかもしれない数多くの怪物がいる(店 + 主は別として)。 + + + 8. 制限プレイ + + 単 に NetHack に勝利するだけでは満足できない一部のプレイヤー + は、プレイに制限を設けることに挑戦している。これらの挑戦の一部 は + ゲー ムによって自動的に記録され、ゲーム中いつでも #conduct コマン + ドで確認できる。またゲーム終了時にも表示される。挑戦に反するよ う + な 行動を取ると、もはやその挑戦は表示されない。l これらの挑戦に勝 + 利することによって、プレイヤーは追加の``自慢する権利''を 得 ら れ + る。 なお、これらの制限に従うことなくゲームに勝利することも完全に + 有効であり、最初にゲームに勝利するときは普通これらの挑戦は関係 な + い。 + + 挑戦のいくつかは食べ物に関するものである。最も困難な挑戦は食 + 料なしの挑戦である。生物は食料なしでも長い間生存できるが、水は 必 + 要 で あ る。従って、飲み物に対しては何の制限もない。例え栄養分が + あってもである。神に祈って飢えをしのぐことはいかなる食べ物に関 す + る挑戦にも違反しない。 + + 厳密な菜食主義者は動物から作られた食べ物を食べない。基本的な + 栄養源は果物と野菜である。ブロッブ(`b')、ゼリー(`j')、細菌(`F')も + 野 菜とみなされる。人間の食料にも動物を使っていないものがある。レ + ンバス、クラム、「食料」(丸薬)、Kレーション、Cレーションがそ う + で ある。他の生物に変化しているときは、金属などの普通消化できない + 物質も厳密な菜食主義者用の食料として扱われる。しかし、これらの 物 + も食料なしの挑戦には反することに注意すること。 + + 菜食主義者は動物を食べない。しかし、動物からの副生産物を食べ + ることは厳密な菜食主義者ほどは厳しくない。上記の厳密な菜食主義 者 + が食べられるものに追加して、ブラックプリン以外のプリン(`P')、卵、 + 卵から作られた食べ物 (占いクッキーとパンケーキ)、牛乳から造られた + 食べ物 (クリームパイとキャンディーバー)、ロイヤルゼリーを食べるこ + とができる。モンクは菜食主義者とみなされる。 + + 肉を食べることは厳密な菜食主義者、菜食主義者、食料なしの挑戦 + に 反する。これにはほし肉、上記以外の怪物の死体や缶詰、迷宮で見つ + かるその他の肉のかたまりを含む。変化中に「飲み込んで消化」攻撃 を + か けるのはその怪物の死体を食べたものとみなす。皮、竜鱗、骨ででき + た物体を、これらを消化できる怪物に変化して食べたり、マインドフ レ + イ ヤーに変化して脳を食べることは動物を食べたとみなす。ただし、蜜 + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 29 + + + + 蝋は動物の副生成物とみなす。 + + 挑戦に関わらず、消化不可能な物もあり、食べると危険なものもあ + る。 怪物に対して「飲み込んで消化」攻撃をかけることは、その怪物の + 死体を食べたものとみなす。「厳格な菜食主義者(``vegan'')」という言 + 葉 は食べ物に関する文脈でのみ用いられることに注意してほしい。動物 + から作られた物(皮、竜の鱗、骨、角、さんご)を使ったり身につけた り + す ることは制限に違反しない。また、「ミルク色の」水薬は不透明な白 + 色ではあるが、牛乳を含んでいるわけではないので、厳密な菜食主義 者 + の 制 限 に 違 反 し な い。 ス ラ イムモルドやプレイヤーが定義し + た``fruits''は、例え「さくらんぼ」であろうが「ポークチョップ」 で + あろうが、厳密な菜食主義者の制限に違反しない。 + + 無神論者は宗教を否定する。つまり、#pray(祈る), #offer(いけに + えを捧げる), #turn (不死のものを戻す), 僧侶に対する #chat(話す)こ + と はできない。一部の読者はモンクや僧侶でプレイするのもこの制限に + 反していると主張するかもしれないが、ここではプレイヤーの選択の 余 + 地 を残してある。イェンダーの魔除けを神に捧げるのはゲームに勝利す + るために必要なので制限には反しないものとする。また、怒った神や 僧 + 侶 やその他の宗教的存在が話す言葉を聞いても制限には反しない。真の + 無神論者は言葉は聞くが,そこになんら特別な意味を見出さない。 + + ほとんどのプレイヤーは武器(あるいは武器として装備すること を + 考慮している道具)を手に戦う。挑戦の一つはこのような武器を手にして + 使わずにゲームに勝利することである。武器を投げたり、発射した り、 + 蹴っ たりするのは許される。また、杖、呪文、あるいはその他のアイテ + ムを使ったり、素手や脚で戦うことも許される。 + + NetHack において、平和主義者は他の怪物を殺してはならない( 言 + い換えると、怪物の死によって経験値を得てはならない)。これは特に難 + しい挑戦であるが、他の手段によって経験値を得ることは可能である。 + + 文盲者は読み書きができない。これには以下の行為が含まれる。巻 + き物を読む、魔法書を読む、占いクッキーのメッセージを読む、Tシャツ + の文字を読む、巻き物を書く、``x''一文字(文盲者の伝統的なサイン)以 + 外 の文字を刻む。刻んである文字を読むことと、ゲームに勝利するため + に絶対に必要なアイテムを読むことは制限には反しないもの と す る。 + ゲー ム開始時に持っている巻き物と魔法書の内容を知っていることおよ + び呪文の知識は、ゲーム開始以前に教師から教わったものとみなし、 制 + 限には反しないものとする。 + + その他にいくつかの細かいゲームとして記録される挑戦がある。怪 + 物は虐殺することが可能である。これをせずにプレイするのも挑戦と み + な す。 怪 物を虐殺する機会が与えられたとき、 ``none''(または``な + し'')と答えると、虐殺しないままにすることができる。あなたはアイテ + ムを同じグループの他のアイテムに変化させたり (``polypiling'')、変 + 化の杖・呪文・薬で自分の体を他の生物に変えたり(``polyself'')で き + る。 これらの効果を用いないことはそれぞれ挑戦とみなす。最後に、あ + なたはときどき願いをかなえてもらうことがある。なんのアイテムも 願 + わずにプレイするのは一つの挑戦であり、聖器を願わない(たとえ直ちに + 消滅したとしても)でプレイするのも一つの挑戦である。アイテムを願う + 機 会を与えられたとき、 ``nothing''または``なし''と答えると、願わ + ないままにすることができる。 + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 30 + + + + 9. オプション + + 人にはそれぞれいろいろな好みがあり NetHack の遊び方もそれ ぞ + れ 異なっているので、NetHack の振る舞いを変更するため設定できるオ + プションがある。 + + 9.1. オプションの設定 + + オプションを設定する方法にはいくつかある。ゲーム中に `O' コ + マ ンドを使うことによって全てのオプションを見ることができ、そのほ + とんどを変更できる。また、環境変数``NETHACKOPTIONS''や設定ファ イ + ル で自動的に設定することもできる。NetHack のバージョンによっては + ゲーム開始前にオプションを設定することができるプログラムがつい て + いることもある。 + + 9.2. 環境変数 NETHACKOPTIONS を使う + + 環境変数 NETHACKOPTIONS にはいろいろなオプションの初期値をカ + ンマで区切って列挙し設定する。オプションのうちのいくつかのもの は + 単 にオンかオフの選択ができるだけである。そのオプション名をリスト + に入れるとオンになり、オプション名の前に `!' か``no''をつけるとオ + フ になる。その他のオプションでは設定値として文字列が必要である。 + これらのオプションを設定するにはオプション名、コロンまたはイ コー + ル 記号、設定値の順で入力すればよい。設定値は次のカンマもしくは文 + 字列の最後までとなる。 + + 例えば``autoquiver''をオ ン、``autopickup'' を オ フ、 名 前 + が``Blue Meanie'' に、フルーツが``papaya''になるように環境変数を + 設定するには csh では次のコマンドを入力すればよい。 (!は特殊文 字 + なのでエスケープしてやる必要があることに注意) + + % setenv NETHACKOPTIONS "autoquiver,\!autopickup,name:Blue Meanie,fruit:papaya" + + sh または ksh では + + $ NETHACKOPTIONS="autoquiver,!autopickup,name:Blue Meanie,fruit:papaya" + $ export NETHACKOPTIONS + + とすればよい。 + + 9.3. 設定ファイルを使う + + 設 定ファイルの中の`#'で始まる行はコメントとして扱われる。設 + 定ファイルの中の``OPTION=''で始まる行は環境変数``NETHACKOPTIONS'' + と 同 じ 文 法 で オ プ ショ ン が 記 述 されているものと見なす。 + ``DUNGEON=''、``EFFECTS=''、``MONSTERS=''、``OBJECTS=''、``TRAPS=''、``BOULDER='' + で始まる行はそれぞれ dungeon 、 effects 、 monsters 、 objects 、 + traps 、 boulder + オプションとして扱われるが、その指定方法は、現在使われているフォ + ン トのかわりに使われるキャラクタコードを示す 10 進数の列である。 + この列に 0 を指定すると、その項目は変更されない。この機能は オ プ + ションの文法では利用できない。この列は各行の最後に`\'をつけること + によって複数行に渡ることができる。 + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 31 + + + + コンパイル時に AUTOPICKUP_EXCEPTIONS オプションが設定され て + い ると、 ``AUTOPICKUP_EXCEPTION=''で始まる行によって pickup_type + オプションの例外を定義できる。 + + 標準設定の設定ファイル名は OS によって異 な る が、 環 境 変 + 数``NETHACKOPTIONS'' で (先頭に`@'を付けることで)使用したい設定 + ファイル名を指定することができる。 + + 9.4. カスタマイズオプション + + 以下にいろいろなオプションの役割を説明する。あまりに長すぎる + 文 字列の部分は無視される。以下のオプションのうち実装によっては無 + 効となっているオプションもある。 + + align + スタート時の属性(align:lawful, align:neutral, align:chaotic)。 + 最 初の一文字で指定することもできる。標準設定ではランダムに選択 + される。 `O' コマンドで設定することはできない。 + + autodig + 掘るための道具を手にしていて、掘ることができる地形に移動しよ う + としたとき、自動的に掘る(標準設定はオフ)。 + + autopickup + 移 動先にあるものを自動的に拾う(標準設定はオン)。この振る舞い + をカスタマイズするためには pickup_types を参照すること。 + + autoquiver + このオプションは矢筒が空の時に`f'(fire:矢筒の中にあるものを発射 + す る) コマンドを実行した時にどうするかを決める。オンなら、コン + ピューターは適当な武器を矢筒に入れる。この時、呪い、 祝 福、 魔 + 法、 劣 化、 武器の数などは考慮されないので注意すること。代わり + に`Q'コマンドを使って自分の好きな物を矢筒に入れる。入れる武器が + ないか、このオプションがオフの時は代わりに`t'(throw:物を投げる) + コマンドが実行される。 (標準設定はオフ) + + boulder + 巨岩を表示するのに用いるキャラクタ(標準設定は岩を表すキャラ ク + タ)。 + + catname + スタート時の猫の名前(例: catname:Morris)。 `O' コマンドで設定す + ることはできない。 + + character + キャラクターのタ イ プ を 設 定 す る( 例:``character:Monk'')。 + ``role'' オプションと同じである。職業を設定するその他の方法につ + いては``name''オプションを参照のこと。 ``random''以外の文字列は + 最初の 1 文字だけで判別される。 + + checkpoint + プ ログラムがクラッシュした時に復旧できるように階を移動する毎に + 状態をセーブする(標準設定はオン)。 + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 32 + + + + color + 色々な怪物や物や洞窟の地形をカラーで表示する (マ イ ク ロ コ ン + ピュータでは標準設定はオン)。 + + checkspace + ファイルを書き込む前にディスクの空き容量をチェックする(標準設定 + はオン)。セーブファイルやレベルファイルのために使うパーティショ + ンに2GB以上の空き容量がある場合、このオプションをオフをしなけれ + ばならないかもしれない。このオプションはコンパイル時にMFLOPPYが + 定義されているときのみ適用される。 + + cmdassist + あ りがちなミスを検出したときに新規プレイヤーのために追加のコマ + ンド補助メッセージを表示する(標準設定はオン)。 + + confirm + ペット、店主、その他の攻撃してこない生物を攻撃しようとしたと き + に確認をする(標準設定はオン)。 + + DECgraphics + 洞 窟 の 表示に用いる文字をあなた自身ですべて定義する代わりに、 + DEC VT-xxx/DEC Rainbow/ANSI 罫線文字セットからあらかじめ用意 さ + れ た設定を使用する(標準設定はオフ)。このオプションはまたターミ + ナルが適切なグラフィックキャラクターを扱えるよう設定する。す な + わ ち、あなたが自分でグラフィック文字を上書き設定するときにも明 + 示しなくてはいけない。 + + disclose + ゲーム終了時に表示する情報を制御する(標準設定は、全てを表 示 す + る)。設定できるものは以下の通り。 + + i - 持ち物の鑑定 + a - 属性の公開 + v - 退治した怪物の一覧 + g - 抹殺した怪物種 + c - 挑戦 + + そ れぞれの表示に対して、その前にどのように振舞うかを指示する文 + 字をつけることができる。文字の意味は以下のとおり。 + + y - 確認するが、標準設定はイエスにする。 + n - 確認するが、標準設定はノーにする。 + + - 確認なしに表示する。 + - - 確認なしで非表示とする。 + + (例: ``disclose:yi na +v -g -c'') このように設定した場合、 持ち + 物 は 確 認 す る(標準設定はイエス)。 属性は確認する(標準設定は + ノー)。 退治した怪物は確認なしに表示する。 抹殺した怪物は確認せ + ずに非表示とする。 挑戦は確認せずに非表示とする。退治した怪物の + 一覧は罠や同士討ちによって死んだ怪物も含むことに注意。 + + dogname + スタート時の犬の名前(例: dogname:Fang)。 `O' コマンドで設定する + ことはできない。 + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 33 + + + + dungeon + 迷 宮 表 示 の ためのグラフィックシンボルを設定する (標準設定は + `` |--------||.-|++##.##<><>_|\\#{}.}..## #}'') dungeon オ プ + ショ ン は標準設定の文字の代わりに地図を描くのに使用する 1 から + 41 文字の文字列を書く。標準設定の文字の代わりにここで設定した文 + 字 を使って洞窟の地図が表示され、標準設定の文字は使われない。も + しあなたのシェルが特別扱いする文字を使うなら、それらのキャラ ク + タをエスケープする必要があるかもしれないことに注意。 + + このオプションで設定される文字列は、現在では通常の C 言語で使わ + れる方式でエスケープ処理されることに注意しなくてはな ら な い。 + `\' の 後の文字はその文字そのものとして取り扱われ、特別なプレ + フィックスとしては扱われないということである。従っ て、`\' は + `\\' とする必要がある。特殊なエスケープ形式である `\m' は後ろの + 文字のメタビットをオンにし、 + + シンボルは以下の順序である:堅い岩、壁(縦)、壁(横)、左上の 角、 + 右上の角、左下の角、右下の角, 壁の交差、T 字状の壁、逆 T 字状の + 壁、左向きの T字状の壁, 右向きの T 字状の壁、扉のない出入口、開 + い た扉(縦)、開いた扉(横), 閉じた扉(縦)、閉じた扉(横)、鉄の棒、 + 木、部屋の床、暗い通路、明るい通路, 上への階段、下への階段、 上 + へ のはしご、下へのはしご、祭壇、墓, 玉座、流し台、泉、水たまり + または堀、氷、溶岩、降りている跳ね橋(縦)、降りてい る 跳 ね 橋( + 横)、上がっている跳ね橋(縦)、上がっている跳ね橋(横)、空気、雲、 + 水中 + + より美しく四角の表示を得るためには角と T 字状の壁に '+' を 使っ + た 方がよいかも知れない。次のリリースでは新しいシンボルが加わっ + たり、現在のものが再構成される可能性があるので注意。 + + `O' コマンドで設定することはできない。 + + effects + 効果表示のためのグラフィックシンボルを設定 す る ( 標 準 設 定 + は``|-\\/*!)(0#@*/-\\||\\-//-\\| |\\-/''). effects オプション + は標準設定の文字の代わりに地図を描くのに使用する 1-29 文字の 文 + 字列を書く。この文字列は dungeon オプションと同様に処理される。 + + シンボルは以下の順序である:光線(縦)、光線(横)、光線(左上から右 + 下)、光線(右上から左下)、掘削光線、カメラのフラッシュ、ブーメラ + ン(左)、ブーメラン(右)、魔法防御に用いる 4 つの記号、飲み込まれ + た ときに使われる 8 つの記号、爆発に用いる 9 つの記号。爆発は 3 + キャラクタ 3 列からなり、爆発の中心はこの 3 × 3 の配列の中心に + なる。 + + 次 のリリースでは新しいシンボルが加わったり、現在のものが再構成 + される可能性があるので注意。 + + `O' コマンドで設定することはできない。 + + extmenu + 拡張コマンドインターフェースを、有効なコマンドの一覧メニュー が + 出るように変更する。キー入力は、最後に Enter を押す必要がないこ + と以外は伝統的なインターフェースと互換性がある。 tty イ ン ター + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 34 + + + + フェースにだけ実装されている。(標準設定はオフ) + + female + ``gender:female'' の古い別名。 `O' コマンドで設定することはでき + ない。 + + fixinv + 持物の目録記号と物との対応はその物を下に置いても変化しない(標準 + 設定はオン)。オフにしたときは物を下に置くとその物の目録記号以降 + の記号と物との対応が 1 つずつずれる。 + + fruit + あなたの好物の果物にちなんでその名前を設定する( 例:fruit:mango) + (標準設定は「slime mold」)。元来 NetHack で時々使われる懐古趣味 + 的な妙な言葉である。 slime mold(ネバネバかび)よりももっと食欲の + わ く 食べ物にするべきであろう。 apples(リンゴ)、oranges(オレン + ジ)、 pears(洋なし)、 bananas(バナナ)、 melons ( メ ロ ン) は + NetHack にはもう存在しているので、設定してはならない。 + + gender + 開始時の性別(gender:male または gender:female). 最初の一文字で + 指定することもできる。 ``male'' と ``female'' オプションを指 定 + し ていても、 ``gender'' オプションが優先される。標準設定では適 + 切な性別がランダムに選択される。 `O' コマンドで設定することはで + きない。 + + help + `/' コ マンドを使って調べている物について何らかの情報がある場 + 合、それを見るかどうかを尋ねる(標準設定はオン)。ヘルプが出な い + よ うにすれば ``More info?'' というプロンプトに煩わされなくなる + ので、素早く物を調べることができる。しかしそれは興味深く重要 な + 情報を見逃してしまうかも知れないことを意味する。 + + hilite_pet + ペッ トを同種の動物から視覚的に区別する(標準設定はオフ)。テキス + トウィンドウ表示では color がオフのときに強調表示する。 Xのタイ + ルを使用するときは、ハートの記号をペットにつける。 + + horsename + 開 始時の馬の名前をつける (例:``horsename:Trigger''). `O' コマ + ンドで設定することはできない。 + + IBMgraphics + 洞窟、効果、罠の表示に用いる文字をあなた自身ですべて定義する 代 + わ りに、 IBM 拡張 ASCII 文字セットからあらかじめ用意された設定 + を使用する (標準設定はオフ)。このオプションはまたターミナルが適 + 切 なグラフィックキャラクターを扱えるよう設定する。すなわち、あ + なたが自分のグラフィック文字で上書き設定するときにも明示しな く + てはいけない。 + + ignintr + ブレークを含む割り込み信号を無視する(標準設定はオフ)。 + + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 35 + + + + legacy + ゲーム開始時に説明メッセージを表示する(標準設定はオン)。 + + lit_corridor + 夜 目やあなたのキャラクタが持っている光源によって見える通路を表 + 示する (標準設定はオフ)。 + + lootabc + 箱を開けるときに`o', `i', `b'ではなく`a', `b', `c'のキーを使 う + (標準設定はオフ)。 + + mail + ゲーム中にメールを配達するようにする(標準設定はオン)。 + + male + ``gender:male'' の古くなった別名。 `O' コマンドで設定することは + できない。 + + menustyle + いろいろなオブジェクトを指定するとき(たとえば Dropコマンド)に用 + いるインタフェースの制御。値は tradional, combination, partial, + full の 4 つのタイプの最初の一文字を指定する。 ``tradional'' は + 古 い バー ジョンで唯一利用できたもので、物の種類を示す文字の入 + 力、次に選んだ種類に当てはまる全ての物を一つず つ 確 認 す る。 + ``combination''は選択したい物の種類を示す文字を入力するが、次に + 当てはまる物を一つずつ確認で選択するのではなく、メニュー形式 で + 選 択する。 ``partial''は物の種類を選ぶことをせず、直ちに全ての + 物が表示されたメニューを表示する。 ``full''は物の種類の文字入力 + の かわりに、最初に物の種類のメニューを表示し、それから選択した + 種類に当てはまる物のメニューを表示する。 + + menu_deselect_all + メニューの全ての項目を非選択にするキー。 Amiga, Gem, X11, ttyで + 実装されている。(標準設定は `-') + + menu_deselect_page + メ ニュー の う ち、 現在表示されている全ての項目を非選択にする + キー。 Amiga, Gem, tty で実装されている。(標準設定は `\') + + menu_first_page + メニューの最初のページへ移動するキー。 Amiga, Gem, tty で実装さ + れている。(標準設定は `^') + + menu_headings + メ ニュー の うち注目している部分をどのように表示するかを指定す + る。値は 'bold'(太字), 'inverse'(反転), 'underline'(下線)のいず + れかである。. 全てのポートで実際に三つ全てのタイプを表示できる + わけではない。 + + menu_invert_all + メニューの全ての項目の選択状態を反転するキー。 Amiga, Gem, X11, + tty で実装されている。(標準設定は `@') + + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 36 + + + + menu_invert_page + メ ニュー の 現在のページの全ての項目の選択状態を反転するキー。 + Amiga, Gem, tty で実装されている。(標準設定は `~') + + menu_last_page + メニューの最後のページへ移動するキー。 Amiga, Gem, tty で実装さ + れている。(標準設定は '|') + + menu_next_page + メニューの次のページへ移動するキー。 Amiga, Gem, tty で実装され + ている。(標準設定は `>') + + menu_previous_page + メニューの前のページへ移動するキー。 Amiga, Gem, tty で実装され + ている。(標準設定は `<') + + menu_search + メ ニューで検索を行うキー。 Amiga, Gem, X11 で実装されている。( + 標準設定は `:') + + menu_select_all + メニューの全ての項目を選択にするキー。 Amiga, Gem, X11, tty で + 実装されている。(標準設定は `.') + + menu_select_page + メ ニューのうち、現在表示されている全ての項目を選択にするキー。 + Amiga, Gem, tty で実装されている。(標準設定は `,') + + monsters + 怪物の種類を表示するのに使用するキャラクタを指定する。 (標準 設 + 定 は ``abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU- + VWXYZ@ '&;:~]''). この文字列は dungeon オプションと同様に処 理 + される。シンボルの順序は、 ant or other insect(蟻あるいはその他 + の昆虫), blob(ブロッブ), cockatrice(コカトリス), dog or other + canine( 犬またはその他のイヌ科の動物), eye or sphere(目または球 + 体), feline(猫), gremlin(グレムリン), humanoid(人 間), imp or + minor demon(インプまたは低級悪魔), jelly(ゼリー), kobold(コボル + ド), leprechaun(レプラコーン), mimic(ミミック), nymph(ニン フ), + orc( オー ク), piercer( 突 き刺すもの), quadruped(四つ足動物), + rodent(鼠), arachnid or centipede(くもまたはムカデ), trapper or + lurker above(トラッパーまたは天井に潜むもの), horse or unicorn( + 馬またはユニコーン), vortex(渦巻き), worm(ワーム), xan or other + mythical/fantastic insect( ザ ン ま たはその他の不思議な昆虫), + light(ライト), zruty(ズルティ), angelic being(天使のよ う な 存 + 在), bat or bird( コ ウモリまたは鳥), centaur(ケンタウルス), + dragon(龍), elemental(エレメンタル), fungus or mold(カ ビ や コ + ケ), gnome( ノー ム), giant humanoid( 大 型 人類), invisible + monster(見えない怪物), jabberwock(ジャバーウォッ ク), Keystone + Kop(キーストーンコップ), lich(リッチ), mummy(ミイラ), naga(ナー + ガ), ogre(オーガ), pudding or ooze(スライム), quantum mechanic( + 量 子力学), rust monster(錆の怪物), snake(蛇), troll(トロール), + umber hulk(アンバーハルク), vampire(バンパイア), wraith( レ イ + ス), xorn(ゾーン), apelike creature(猿のような生き物), zombie( + ゾンビ), human(人間), ghost(幽霊), golem(ゴーレ ム), demon( 悪 + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 37 + + + + 魔), sea monster(海の怪物), lizard(トカゲ), long worm tail(ロン + グワームの尻尾), mimic(ミミック) `O' コマンドで設定することはで + きない。 + + msghistory + 後で ^P で呼び出すために保存しておく最上行のメッセージの数(標準 + 設定は 20)。 `O' コマンドで設定することはできない。 + + msg_window + 過去のメッセージの表示方法を変更する(現時点では tty にのみ実 装 + されている)。指定できる値は以下のとおり。 + + s - `single': 1 メッセージだけ (標準設定。これは 3.4.0 以前での振る舞いである) + c - `conbination': 最初の 2 メッセージは `single'、その後は `full'。 + f - `full': 全画面。古いメッセージが先。 + r - 全画面。新しいメッセージが先。 + + 過 去との互換性のために、値なしにもできる(`full'とみなす)し、否 + 定もできる(`single'とみなす)。 + + name + あなたのキャラクタの名前を設定する(標準設定はあなたの ユー ザー + 名)。 -記号とキャラクタの職業の頭文字を付け加える(つまり -A -B + -C -H -K -M -P -Ra -Ro -S -T -V -W のどれかを後に付ける)こと に + よっ て職業を設定することもできる。職業として -@ を使用すると、 + ランダムなひとつが自動的に選択される。 `O' コマンドで設定するこ + とはできない。 + + news + NetHack のニュースファイルがあればそれを読む(標準設定はオン)。 + ニュースはゲームの最初に表示されるので、 `O' コマンドでこれを設 + 定するのは無意味である。 + + null + 端末にパディングのためのナルキャラクタを送る(標準設定はオフ)。 + + number_pad + 移動のために[yuhjklbn]のかわりに数字キーを使用する(標準設定は 0 + またはオフ)。 (number_pad:2 は昔の DOS 版の振る舞いにする。 `5' + は`g'、meta-`5'は`G'、meta-`0'は`I'となる。) + + objects + 物 の 種 類 を 表 示 す る 時 に 使う文字を設定する (標準設定は + ``])[="(%!?+/$*`0_.'') この文字列は dungeon オプションと同様に + 処 理される。シンボルの順番は(見たこともないような)おかしな物 + 体、武器、防具、指輪、魔除け、工具、食料、水薬、巻物、魔法 書、 + 杖、金貨、宝石または石、巨石または彫像、鉄球、鎖、毒液。 `O' コ + マンドで設定することはできない。 + + packorder + 物の種類を表示すると き の 順 番 を 指 定 す る( 標 準 設 定 は + ``")[%?+!=/(*`0_''). このオプションにはいろいろな物の種類を表 + す文字の列を設定する。設定されなかった種類は以前の順序で最後 に + 表示される。 + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 38 + + + + perm_invent + も し オ ンならば、現在の持ち物一覧を常にウィンドウに表示してお + く。この機能が実装されているウィンドウシステムでのみ有効。 + + pettype + プレイするキャラクタクラスが複数のタイプのペットを使用できる 時 + に 初期のペットを指定する、または初期のペットを全く指定しない。 + 指定出来るのは``cat'', ``dog'', ``none'' である。 `O' コマン ド + で設定することはできない。 + + pickup_burden + 物 を拾った時にここで指定した荷物の重さレベル (Unburdened, Bur- + dened, streSsed, straiNed, overTaxed, overLoaded) 以上 に な る + と、続行するかどうかを確認する。 (標準設定は `S'). + + pickup_types + autopickup オプションが設定されている時に拾う物の種類を指定す + る(標準設定は全ての種類)。実験的コンパイル時オプション で あ る + AUTOPICKUP_EXCEPTIONS が指定されていると、 autopickup_exception + 行を使うことで autopickup の振る舞いをより細かく制御できる。 + + prayconfirm + 神に祈る前に確認する(標準設定はオン)。 + + preload_tiles + MSDOSのプロテクトモードで、タイルをゲームの始めにあらかじめ RAM + に 読 み 込んでおくかどうかを制御する。オンにすると、タイルグラ + フィックのパフォーマンスが高まるが、より多くのメモリを使用する( + 標準設定はオン)。 `O' コマンドで設定することはできない。 + + pushweapon + 既に武器を持っている時に `w' (wield: 武器を持つ) コマンドを使っ + たとき、既に持っていた武器を予備の武器に設定する(標準設定 は オ + フ)。 + + race + 種 族を選択する(例: ``race:human'')。標準設定はランダムである。 + `O' コマンドで設定することはできない。 + + rest_on_space + スペースキーを `.'(rest: 休憩する) コマンドとして使用する (標準 + 設定はオフ)。 + + role + キャ ラ ク ター の タ イ プ を 設定する (例:``role:Samurai'')。 + ``character''オプションと同じである。職業を設定するその他の方法 + については``name''オプションを参照のこと。普通は先頭の 1 文字だ + け で 判 別 さ れ る が、 `r' は 例 外 で あ + る。``Rogue''、``Ranger''、``random''があるからである。 + + runmode + 「まとめて移動」する(shift+方向やcontrol+方向で移動するか、旅行 + コマンドやマウスのクリックを使った場合) ときにどれくらいの頻 度 + で地図を更新するかを制御する。設定可能な値は以下の通り。 + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 39 + + + + teleport - 移動が完了してから地図を更新する。 + run - 7 歩ぐらい毎に地図を更新する。 + walk - 1 歩毎に地図を更新する。 + crawl - ``walk'' と同様だが、一歩毎にしばらく停止する。 + + こ のオプションは画面表示にのみ影響し、実際の移動結果には影響し + ない。標準設定は `run' である。バージョン 3.4.1 以前 は `tele- + port' のみであった。効果が確認できるかどうかは使っている版や端 + 末の種類に依存する。 + + safe_pet + ペットを(ペットと知りつつ)攻撃してしまうのを防ぐ(標準設定 は オ + ン)。 + + scores + 最 後にスコアリストのどの部分を見るかを制御する (例:``scores:5 + top scores/4 around my score/own scores'')。それぞれの分野の 最 + 初の文字 (`t', `a', `o')のみが必要である。 + + showexp + 最下行に現在の経験点を表示する(標準設定はオフ)。 + + showrace + あ なたを表示するときに、職業に対応するマークではなく、種族に対 + 応するマークで表示する(標準設定はオフ)。この設定は表示にだけ 用 + いられ、ゲームとしては何も変わらないことに注意。 + + showscore + 最下行に現在のスコアを表示する(標準設定はオフ)。 + + silent + 端末のビープ音を鳴らさない(標準設定はオン)。 + + sortpack + 持 物の目録を表示するとき種類毎に荷物の内容を並べ替える (標準設 + 定はオン)。 + + sound + あなたのキャラクターが聞いたものに関するメッセージを表示する(標 + 準設定はオン)。これはコンピューターの音声出力機能とは何の関係も + ないことに注意すること。このオプションは部分的にだけプレイ ヤー + の 制御下にある。例えば、眠っている間はこのオプションは自動的に + オフにされ、目覚めるとオンになる。 + + sparkle + 怪物(やあなた)が攻撃を受け、それに抵抗した場合に画面効果を表 示 + する (標準設定はオン)。 + + standout + 怪物と``--More--''を太字で表示する(標準設定はオフ)。 + + suppress_alert + 前 のバージョンから変更された機能に対して注意を促すメッセージを + 表示しないようにする NetHack のバージョンを設 定 す る。 ( 例: + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 40 + + + + ``suppress_alert:3.3.1'') 例のように指定すると 3.3.1 以前に変更 + された機能に対する注意メッセージは表示されない。 + + time + 最下行にゲームで経過した時間をターン数で表示する(標準設定 は オ + フ)。 + + timed_delay + 爆 発や物体の移動など、効果を表示するためにちょっと時間待ちする + とき、特殊なキャラクタを画面に送るかわりにタイマーを使用す る。 + (tty インタフェースにのみ適用される。 X11 インタフェースは常に + タイマーを使用する。標準設定はタイマーによる時間待ちが組み込 ま + れているならばオン) + + tombstone + 死んだとき墓石を表示する(標準設定はオン)。 + + toptenwin + ゲーム終了時の表示を標準出力のかわりにNetHackのウィンドウに表示 + する (標準設定はオフ)。このオプションを設定するとウィンドウを使 + うバージョンの NetHack では起動した親ウィンドウとは別のウィンド + ウにスコアリストが表示される。しかし、スコアリストはゲームが 終 + 了したあとターミナルやウィンドウには残らない。 + + traps + 罠の種類を表示するのに使用するキャラクタを指定する。(標準設定は + ``^^^^^^^^^^^^^^^^^"^^^^''). traps オプションは標準設定の文 字 + の代わりに罠を描くのに使用する 1 から 22 文字の文字列を書く。こ + の文字列は dungeon オプションと同じ処理をする。この 文 字 列 は + dungeon オプションと同様に処理される。 + + シ ン ボルの順序は、 arrow trap(矢の罠), dart trap(投げ矢の罠), + falling rock trap(岩落しの罠), squeaky board(きし む 板), bear + trap( 熊の罠), land mine(地雷), rolling boulder trap(落岩の罠), + sleeping gas trap(睡眠ガスの罠), rust trap( 腐 食 の 罠), fire + trap( 火 の 罠), pit( 落し穴), spiked pit(トゲだらけの落し穴), + hole(穴), trap door(落し扉), teleportation trap(瞬間移動の 罠), + level teleporter(別の階への瞬間移動の罠), magic portal(魔法の入 + 口), web(くもの巣), statue trap(彫像の罠), magic trap( 魔 法 の + 罠), anti-magic field( 反魔法空間の罠), polymorph trap(変化の + 罠)。 + + `O' コマンドで設定することはできない。 + + travel + トラベルコマンドを有効にする(標準設定はオン)。このオプション を + オ フにすることによって、うっかり地図ウィンドウをクリックするこ + とによって、望まない移動をしようとすることを防ぐことができる。 + + verbose + ゲーム中のコメントを詳細に表示する(標準設定はオン)。 + + windowtype + ウインドウシステムを使用するかどうかを「tty」または「X11」で 選 + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 41 + + + + 択する(標準設定はバージョンによる)。 `O' コマンドで設定するこ + とはできない。 + + 9.5. ウインドウシステム版専用カスタマイズオプション + + 以下はあなたが選択したウィンドゥタイプの特性をカスタマイズし + て 変更するために用いる様々なオプションの説明である。長すぎる文字 + 列は適当に切り詰められる。全てのウィンドゥタイプに対してこれら 全 + て のオプションが有効というわけではない。これらのオプションが設定 + されたとき、もしウィンドゥタイプがその設定を受け付けるなら、そ う + さ れ る。 もし受け付けられないなら、単に無視される。現在のウィン + ドゥタイプで対応しているオプションは、オプション一覧表示 (`O') で + 表示される。一部のオプションは`O'コマンドで動的に変更できる。 + + align_message + メッセージウィンドウをどこに置くか(top, bottom, left, right) + + align_status + ステータスウィンドウをどこに置くか(top, bottom, left, right) + + ascii_map + 可能ならASCIIキャラクタマップを表示する + + color + 怪物、物体、洞窟の構成要素をカラーで表示する + + eight_bit_tty + 8 ビットキャラクタ(例えば traps オプションで指定したもの)をその + ままターミナルに表示する(標準設定はオフ)。 + + font_map + マップウィンドウを表示するフォント名 + + font_menu + メニューを表示するフォント名 + + font_message + メッセージを表示するフォント名 + + font_status + ステータスを表示するフォント名 + + font_text + テキストを表示するフォント名 + + font_size_map + マップウィンドウを表示するフォントサイズ + + font_size_menu + メニューウィンドウを表示するフォントサイズ + + font_size_message + メッセージウィンドウを表示するフォントサイズ + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 42 + + + + font_size_status + ステータスウィンドウを表示するフォントサイズ + + font_size_text + テキストウィンドウを表示するフォントサイズ + + fullscreen + ウィンドウでなく画面全体で表示しようと試みる + + hilite_pet + ペットを目立つように表示する(標準設定はオフ)。このオプション の + 振 る舞いは使っているウィンドウシステムに依存する。テキストウィ + ンドウの場合、高輝度か反転が主に用いられる。タイルの場合、一 般 + 的にはペットの近くにハートマークが表示される。 + + large_font + 大きいフォントを使う。 + + map_mode + 指定された方法でマップを表示する。 + + mouse_support + 入力と移動にマウスを使えるようにする。 + + player_selection + キャラクター選択時にダイアログボックスや確認画面を用いる + + popup_dialog + 入力時にポップアップダイアログボックスを用いる + + preload_tiles + タ イ ル を メ モリに予め読み込んでおく。例えば、プロテクトモー + ドMSDOS版の場合、ゲーム開始時にタイルを RAM に予め読み込むか ど + う かを制御する。予め読み込むとタイルグラフィックの性能は向上す + るが、より多くのメモリを消費する (標準設定はオン)。 `O' コマ ン + ドで設定することはできない。 + + scroll_amount + scroll_margin オプションで指定された位置に来たときに、どれだけ + の数スクロールさせるかを指定する。 + + scroll_margin + ウィンドウの端からここで指定されたマス数にあなたまたはカーソ ル + が移動したときに、画面をスクロールさせる。 + + softkeyboard + + splash_screen + 起動時にスプラッシュスクリーンを表示する(標準設定はオン) + + tiled_map + 可能ならタイルマップを表示する + + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 43 + + + + tile_file + 標準設定を上書きする別のタイルファイルの名前 + + tile_height + タイルが表示できる環境でのタイルの高さ + + tile_width + タイルが表示できる環境でのタイルの幅 + + use_inverse + ゲームが指定したときに画面を反転する + + vary_msgcount + メッセージウィンドウに一度に表示するメッセージの数 + + windowcolors + 可能ならウィンドウを指定した前景色/背景色で表示する + + wraptext + + 9.6. プラットフォーム固有の設定オプション + + 以下は特定のプラットフォームでカスタマイズや振る舞いの変更を + するために用いられるオプションの説明である。 + + altkeyhandler + キー入力を扱う DLL を選択する(Win32 tty NetHack のみ)。 DLL の + 名 前は、.dll の拡張子やパス抜きで指定する。 `O' コマンドで設定 + することはできない。 + + altmeta + (標準設定はオン。 AMIGA NetHack のみ)。 + + BIOS + 高速に画面を書き換え、移動にカーソルキーを使えるようにキー ボー + ド を読むために、 IBM-PC 互換の BIOS ROM を使用しているマシンで + BIOS コールを使用する。 (標準設定はオフ。OS/2 , PC, およ び ST + NetHack のみ) + + flush + (標準設定はオフ。 AMIGA NetHack のみ)。 + + MACgraphics + (標準設定はオン。 Mac NetHack のみ)。 + + page_wait + (標準設定はオン。 Mac NetHack のみ)。 + + rawio + raw(cbreak でない) モードを使用して、より高速な出力と問題の起こ + らない入力を実現する (MS-DOS ではプリンタがないにも 関 わ ら ず + `^P' をプリンタ出力のトグルとみなしてしまうことがある) (標準設 + 定はオフ)。注意: DEC Rainbow ではこれがオンのときはハングアップ + してしまう。 `O' コマンドで設定することはできない。 + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 44 + + + + soundcard + (標準設定はオン。 PC NetHack のみ)。 `O' コマンドで設定すること + はできない。 + + subkeyvalue + (Win32 tty NetHack のみ)。国際キーボードの問題を補正するのを 助 + けるために、 OS が NetHack に返すキー入力の値を変更するために使 + 用する。 OPTIONS=subkeyvalue:171/92 とすると、もともと 171 が返 + されようとしていた場合、 NetHack に 92 を返す。必要なら、複数の + subkeyvalue 行を設定ファイルに書いてもよい。 `O' コマンドで設定 + することはできない。 + + video + 使 用するビデオモードを設定する(PC NetHack のみ)。値は `autode- + tect', `default', `vga' のいずれかである。 `vga' (ま た は VGA + ハードウェアがあるときに`autodetect')に設定すると、表示にタイル + を用いる。 `O' コマンドで設定することはできない。 + + videocolors + NO_TERMを使用しているPCシステムのカラーパレットをセットする (標 + 準設定は「4-2-6-1-5-3-15-12-10-14-9-13-11」)(PC NetHack のみ)。 + シンボルの順番は、赤・緑・茶色・青・マゼンタ・シアン・輝く 白・ + 輝く赤・輝く緑・黄色・輝く青・輝くマゼンタ・輝くシアン。 `O' コ + マンドで設定することはできない。 + + videoshades + 3 段階の利用可能なグレイスケールを設定する (標準設定 は ``dark + normal light'' PC Nethackのみ)。もしゲーム画面が見にくい場合 + は、3つのスケールを調整してみること。もしこれでうまく い か な + かったら、!colorを試してみること。 `O' コマンドで設定することは + できない。 + + 9.7. 自動拾い例外の設定 + + 実験的コンパイル時オプションとして AUTOPICKUP_EXCEPTIONS が + あ る。 こ のオプションを定義してコンパイルされたバイナリの場合、 + autopickup オプションの振る舞いを pickup_types オプションを使って + より洗練させることができる。 + + autopickup_exception 行を設定ファイルに書くことで、何かを拾 + おうとするときにチェックするべきパターンを定義できる。 + + autopickup_exception + pickup_types オプションの例外を設定する。 autopickup_exception + オ プ ショ ンはあなたの位置にある物体の説明の単数形に一致するパ + ターンを指定する。これは 1-80 文字の文字列であるべきである。 + + パターンでは以下の特殊文字が使える。 + + *--- 0 以上の文字にマッチする。 + ?--- 任意の 1 文字にマッチする。 + + さらに、文字列パターンの先頭に置いた場合に特別扱いされる文字 + もある。 + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 45 + + + + < - 以下のパターンに一致する物体は常に拾う。 + > - 以下のパターンに一致する物体は決して拾わない。 + + `O' オプションで設定することもできるが、設定はセーブ・ロード + したときには保存されない。 + + 以下は autopickup_exceptions の例である。 + + + 上記の例の最初のものは、全ての矢を自動的に拾う。二番目の例は、 死 + 体 は自動拾いの例外とする。最後の例は、呪われているとわかっている + ものは自動拾いの例外とする。 `決して拾わない'ルールは`常に 拾 う' + ルールに優先する。 + + 9.8. 音声の設定 + + メッセージウィンドウに表示されたメッセージがユーザー定義のパ + ターンと一致したときに特定の音声ファイルを鳴らすことがで き る プ + ラットフォームもある。現在のところ、Qt, win32tty, win32gui がユー + ザー音声に対応している。 + + ユーザー音声とメッセージの関連付けに関する設定ファイル項目は + 以下のとおりである。 + + SOUNDDIR + 音声ファイルのあるディレクトリ + + SOUND + 音 声ファイルとユーザーが指定するメッセージパターンを関連付ける + 項目。各 SOUND 項目は以下の項目に分解される。 + + MESG - メッセージウィンドウ指定 (3.4 ではただ一つだけに対応している) + pattern - マッチするパターン + sound file - 鳴らす音声ファイル + volume - 音声ファイルを鳴らすときの音量 + + パターンの正確な書式はプラットフォームが ``正規表現'' を用い + る か NetHack の内蔵パターンマッチング機能を用いるかによって変わ + る。 ``正規表現'' マッチングは NetHack 内蔵パターンマッチングより + 洗 練されているが、サードパーティライブラリが必要なプラットフォー + ムもある。 ``正規表現'' に関する説明はどこか他のところを参照の こ + と。 どちらのパターンマッチングが用いられているかは #version コマ + ンドで確認できる。 + + NetHack の内蔵パターンマッチングルーチンは以下の特殊文字を用 + いる。 + + *--- 0 個以上の文字にマッチする。 + ?--- 任意の 1 文字にマッチする。 + + 以下は NetHack 内蔵パターンマッチング機能を用いた例である。 + + SOUND=MESG "*chime of a cash register*" "gong.wav" 50 + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 46 + + + + こ こ で は "chime of a cash register" を含むメッセージに反応して + "gong.wav" を鳴らす。設定ファイルには複数の SOUND 設定を書くこ と + ができる。 + + 9.9. 視覚障害者がNetHackをプレイするための設定 + + NetHack は洞窟の地図を作るのに標準の ASCII キャラクターだけ + を使うように設定することもできる。これ に よ り、 MS-DOS 版 の + NetHack は音声合成または点字技術を用いれば目の不自由な人でも完全 + にプレイ可能である。プレイヤーはこれらの画面読み取りシステムに 関 + す る十分な知識が必要で、上下左右に一文字ずつ移動する方法を知らな + ければならないだろう。画面読み取りシステムの検索能力を知ること も + か なり価値がある。プレイする前にこのガイドブックを十分に読めば、 + 画面のレイアウトがどんな感じかがわかるだろう。また、 PC カーソ ル + の 位 置 を突き止めることができる必要がある。これは自分のキャラク + ターの位置を示している。 `@'は他のヒューマノイドを表わすのにも 用 + いられるので、自分の位置を探すのに`@'を検索するだけでは不十分であ + る。さらに、あなたが見ている位置と PC カーソルの位置の物理的な 行 + と 桁を知らせる機能が必要だろう。この機能はスクリーン全体にどのよ + うなアイテムがあるかを判別するのに便利である。 + + 慣れたユーザーなら defaults.nhを修正することは難しくないだろ + うが、初心者は少しひるんでしまう仕事かもしれない。 NetHack の全て + の公式配布には NHAccess.nhというファ イ ル が 含 ま れ て い る。 + default.nh ファイルをこのファイルと入れ替えることにより、目の不自 + 由な人がプレイできるような設定になる。ファイルを修正する こ と や + ゲー ムそのものに慣れたなら、より好みに合うように設定を変更したい + と思うことだろう。そのための説明は NHAccess.nh そのものに含まれて + い る。ゲームのアクセシビリティに最も影響を与える設定は以下のもの + である: + + IBMgraphics + このオプションをコメントアウトすることによって IBM グラフィック + を無効にする。 + + menustyle:traditional + これは音声合成システムを利用する助けになる。 + + number_pad + 多 くの発声プログラムは number-pad を画面の確認に用いる。この場 + 合、 number_pad オプションをオフにして、伝統的な Rogue 風コマン + ドを使うこと。 + + Character graphics + defaults.nh ファイルの下の方にある全てのキャラクターグラフィッ + ク設定をコメントアウトする。これらのほとんどは NetHack の標準で + あ る、 標準 ASCII キャラクターを用いた洞窟の表現を拡張キャラク + ターセットのより凝ったキャラクターで置き換える。これらのキャ ラ + クターは画面読み取りシステムを煩わせるだろう。 + + 10. 得点 + + NetHack は設定によって、あなたの機械における高得点の一覧また + は高得点者の一覧を作成する。後者の設定になっている場合、ゲーム を + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 47 + + + + 最 後まで終えた場合を除きそのマシンの 1 つのアカウントにつき 1 つ + だけしかこの一覧には載らない。あなたがこの一覧に載っている他の 誰 + か より高い得点を取ったとき、もしくはあなたの前の得点より高い得点 + を取ったときにのみ、その一覧のしかるべき位置にあなたの名 前 が 載 + る。得点が何個まで載るかもコンパイル時に設定できる。 + + 得点は主に経験値、戦利品、到達した階とゲームの終わり方に基づ + いている。ゲームを放棄した場合には持っている金を全額手にして脱 出 + で きる。しかし恐怖の迷宮の中で殺された場合には、亡骸が発見される + と持っている金の 90% だけがギルドに伝えられる(冒険者は亡骸を発 見 + した場合には手数料を取ることが知られている)。従って怪物にさらに一 + 撃を加えて運あらば生き残らんとするか、放棄してその時点で持って い + る 物で終了するかはあなたが決めることである。放棄した場合はすべて + の金を手にすることができる。しかし戦って生き残ればさらに多くを 得 + ることができるかも知れない。 + + 単に現時点での高得点者・高得点の一覧を見たい場合にはほとんど + のバージョンでは nethack -s all と入力すればよい。 + + + 11. 探検モード + + NetHack は複雑で難しいゲームである。初心者は生き残るすべを知 + ら ないことに気づき、恐怖におじけづいてしまうかもしれない。しかし + 恐れることはない。冒険する洞窟に「探検」もしくは「発見」モード が + あ る場合には、高得点の一覧に載らないというとるに足らないデメリッ + トと引き替えに前のセーブファイルを残しておけたり不死身となれた り + するのである。 + + 探 検モードに入るには 2 通りの方法がある。1 つはゲームの開始 + 時に -X スイッチを付けることである。もう 1 つはゲームのプレイ中に + `X' コマンドを入力することである。探検モードで得られる他の利点は + 大胆な読者諸君自ら確かめて欲しい。 + + + 12. クレジット + + 最初の hack というゲームは、バークレイ版 UNIX のゲーム rogue + を モデルとしている。このドキュメントの大部分は Michael C. Toy と + Kenneth C. R. C. Arnold の手になる A Guide to the Dungeons of + Doom(運命の洞窟への招待) を図々しくも盗用したものである。また一部 + は Ken Arromdee による Further Exploration of the Dungeons of + Doom(運命の洞窟の深部への探検) から採っている。 + + NetHack は文字どおり何十人もの人々の手によって完成された。以 + 下はゲームの開発の過程での主な出来事である。 + + + Jay Fenlason は Kenny Woodland, Mike Thome, Jon Payne らの助 + けを得て、最初の Hack を書いた。 + + Andries Brouwer はプログラムを大幅に書き換えて Hack を元とは + かなり異なったゲームに仕立て上げ、 UNIX マシン用の(少なく と も)3 + バージョン(1.0.1、1.0.2、1.0.3)を Usenet で発表した。 + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 48 + + + + Don G. Kneller は Hack 1.0.3 を Microsoft C を使用して MS- + DOS へ移植し PC HACK 1.01e を作成した。バージョン 1.03g では DEC + Rainbow のグラフィックをサポートし、続いて少なくともあと 4 つの + バージョン(3.0、3.2、 3.51、3.6)を作成した。 + + R. Black は PC HACK 3.51 を Lattice C を 使 用 し て Atari + 520/1040ST へ移植し ST Hack 1.03 を作成した。 + + Mike Stephenson はこれらのいろいろなバージョンを再び 1 つに + 統合し、多くの追加要素と合わせて NetHack バージョン 1.4 を作成 し + た。さらに彼は何千人もの人々に作業を分担して NetHack 1.4 の拡張と + デバッグを行い、 NetHack バージョン 2.2 と 2.3 を発表した。 + + さらにその後、Mike は Ken Arromdee, Jean-Christophe Collet, + Steve Creps, Eric Hendrickson、Izchak Miller、John Rupley、 Mike + Threepoint、Janet Walz を含むチームを率いてゲームの大幅な書き直し + を行ない、 NetHack 3.0c を作成した。 + + NetHack 3.0 は Eric R. Smith によって Atari へ、 Timo Haku- + linen によって OS/2 へ、 David Gentzel によって VMS へ移 植 さ れ + た。 この 3 人と Kevin Darcy はその後主力開発チームに加わり、 3.0 + のその後のいくつかの改訂版を作成した。 + + Olaf Seibert は NetHack 2.3 と 3.0 を Amiga へ 移 植 し た。 + Norm Meluch、Stephen Spackman、Pierre Martineau は PC NetHack 3.0 + のためのオーバーレイルーチンを設計した。 Johnny Lee は NetHack + 3.0 を Macintosh へ移植した。彼らは他のさまざまな洞窟の主たちとと + もに PC、Macintosh、Amiga の移植版の拡張を続け、 3.0 のその後のい + くつかの改訂版を作成した。 + + Mike Stephensonをリーダーとし、Izchak MillerとJanet Walzの助 + けによって Ken Arromdee, David Cohrs, Jean-Christophe Collet, + Kevin Darcy, Matt Day, Timo Hakulinen, Steve Linhart, Dean Luick, + Pat Rankin, Eric Raymond, Eric Smith を含む制作チームが 3.0の徹底 + 的 な見直しを行なった。彼らはゲームデザインを再構築し、コードの大 + 部分を書き直した。複合ダンジョン、新しいディスプレイ、それぞれ の + キャ ラクター毎の特別のクエスト、新しいエンドゲームとその他の多く + の新しい要素を追加し、 NetHack 3.1を制作した。 + + Ken Lorber, Gregg Wonderly, Greg Olson は Richard Addison, + Mike Passaretti, Olaf Seibert の助けを借りて Amiga 用 NetHack 3.1 + を作成した。 + + Norm Meluch と Kevin Smolkowski は Carl Schelin, Stephen + Spackman, Steve VanDevender, Paul Winner の助けを借りて NetHack + 3.1 を PC に移植した。 + + Jon Watte と Hao-yang Wang は Ross Brown, Mike Engber, David + Hairston, Michael Hamel, Jonathan Handler, Johnny Lee, Tim + Lennan, Rob Menke, Andy Swanson の助けを借りて MPW 用の Macintosh + 用 NetHack 3.1 を作成した。その作成中に、Barton House は Think C + 用を加えた。 + + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 49 + + + + Timo Hakulinen は NetHack 3.1 を OS/2 に 移 植 し た。 Eric + Smith は NetHack 3.1 を Atari に移植した。 Pat Rankin は Joshua + Delahunty の助けを借りて VMS 版 NetHack 3.1 を作成した。 Michael + Allison は NetHack 3.1 を Windows NT に移植した。 + + Dean Luick は David Cohrs の助けを借りて X11 用 NetHack3.1 + を作成した。 Warwick Allison は Atari 用に NetHack のタイ ル バー + ジョ ン を 作成した。彼は後にタイルを開発チームに寄贈し、タイルサ + ポートは他のプラットフォームにも追加された。 + + Michael Allison, Ken Arromdee, David Cohrs, Jessie Collet, + Steve Creps, Kevin Darcy, Timo Hakulinen, Steve Linhart, Dean + Luick, Pat Rankin, Eric Smith, Mike Stephenson, Janet Walz, and + Paul Winner からなる 3.2の開発チームは バージョン 3.2 を 1996 年 + 4 月にリリースした。 + + バージョン 3.2 は開発チームが結成されてから 10 周年のもの で + あった。彼らのゲームへの貢献について記すと、13 人の初期の開発チー + ム全員はこのリリースの開始時の最初の時点までチームに残ってい た。 + が、 3.1.3 から 3.2 の間に、開発チームの創始者の一人である Izchak + Miller博士が癌と診断され、亡くなった。このリリースは開発チーム お + よび移植チームから彼に捧げられた。 + + NetHack 3.1 と 3.2 の時代に、ゲームに熱狂した何人かがゲーム + に自分自身の変更を加えた「亜種」を公に発表した。 + + Tom Proudfoot と Yuval Oren は NetHack++ を作成し、これは す + ぐ に NetHack-- に改名された。これとは独立に、Stephen White は + NetHack Plus を作成した。 Tom Proudfoot は後に NetHack Plus と + NetHack-- を 統合し、 SLASH を作成した。 Larry Stewart-Zerba と + Warwick Allison は呪文詠唱システムを改良した Wizard Patch を作 成 + し た。 Warwick Allison は NetHack を Qt インターフェースを使うよ + うに変更した。 + + Warren Cheung は SLASH と Wizard Patch を統合し て Slash'em + を 作成し、 Kevin Hugo の力を借りて、多くの要素を追加した。 Kevin + は後に開発チームに加わり、これらのアイデアを NetHack 3.3 に統合し + た。 + + 3.2 の最終バージョンはバグ修正版である 3.2.3 である。これは + 2000 年問題対策のために 3.3.0 と同時に 1999 年 12 月に発 表 さ れ + た。 + + Michael Allison, Ken Arromdee, David Cohrs, Jessie Collet, + Steve Creps, Kevin Darcy, Timo Hakulinen, Kevin Hugo, Steve Lin- + hart, Ken Lorber, Dean Luick, Pat Rankin, Eric Smith, Mike + Stephenson, Janet Walz, Paul Winner からなる 3.3 の開発チー ム は + 1999 年 12 月に 3.3.0を、 2000 年 8 月に 3.3.1 をリリースした。 + + バー ジョン 3.3 は多くの新要素を提供した。まず、種族と職業を + 分離した最初のバージョンである。職業としてのエルフは削除され、 種 + 族 の一つとなった。また、ドワーフ、ノーム、オークが種族として追加 + された。モンクとレンジャーの二つが職業として追加された。さら に、 + 動 物に乗ることが出来る最初のバージョンでもあり、発見された全ての + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 50 + + + + バグをウェブサイトで公表した最初のバージョンでもある。バグリス ト + が 順調に伸びていったにも関わらず、 3.3 は 1 年半続いたことで十分 + 安定していたことを証明した。 + + 3.4 開発チームは Michael Allison, Ken Arromdee, David Cohrs, + Jessie Collet, Kevin Hugo, Ken Lorber, Dean Luick, Pat Rankin, + Mike Stephenson, Janet Walz, and Paul Winner で開始され、 NetHack + 3.4.0 リリース直前の 2002 年 3 月に Warwick Allison が加わった。 + + バージョン 3.3 と同様に、様々な人々が NetHack の色々なプラッ + トフォームへの移植を行なってくれた。 + + Pat Rankin は 3.4 の VMS への移植を担当した。 + + Michael Allison は MS-DOS 版の NetHack 3.4 を管理している。 + Paul Winner と Yitzhak Sapir が手伝っている。 + + Dean Luick, Mark Modrall, Kevin Hugo は 3.4 の Macintosh へ + の移植と拡張を担当した。 + + Michael Allison, David Cohrs, Alex Kompel, Dion Nicolaas, + Yitzhak Sapir は 3.4 の Microsoft Windows プラットフォームへの 移 + 植 と 拡 張 を 担当した。 Alex Kompel は Windows 版への新しいグラ + フィックインターフェースを提供した。 Alex Kompel はまた、3.4.1 の + Windows CE 版を提供した。 + + Ron Van Iwaarden は 3.4 の OS/2 版を管理している。 + + 3.3.1 で復活した Amiga への移植と拡張は Janne Salmijarvi と + Teemu Suikki が行っている。 + + 3.3.1 で復活した Atari 版は Christian ``Marvin'' Bressler が + 管理している。 + + Ken Lorber によって管理されている NetHack のウェブサイトが + http://www.nethack.org/ にある。 + + - - - - - - - - - - + + 時々ネットワークの世界のどうしようもない連中が、ゲームの改良 + の 手助けをしようとしてとりわけ興味をそそるような修正を送ってよこ + す。洞窟の神々は、ときにはこういった悪党のうちでも最も邪悪な連 中 + の名前を洞窟の主たちの一覧としてここに記すのだ。 + + + + + + + + + + + + + + NetHack 3.4 December 2, 2003 + + + + + + NetHack Guidebook 51 + + + + Adam Aronow Izchak Miller Mike Stephenson + Alex Kompel J. Ali Harlow Norm Meluch + Andreas Dorn Janet Walz Olaf Seibert + Andy Church Janne Salmijarvi Pasi Kallinen + Andy Swanson Jean-Christophe Collet Pat Rankin + Ari Huttunen Jochen Erwied Paul Winner + Barton House John Kallen Pierre Martineau + Benson I. Margulies John Rupley Ralf Brown + Bill Dyer John S. Bien Ray Chason + Boudewijn Waijers Johnny Lee Richard Addison + Bruce Cox Jon W{tte Richard Beigel + Bruce Holloway Jonathan Handler Richard P. Hughey + Bruce Mewborne Joshua Delahunty Rob Menke + Carl Schelin Keizo Yamamoto Robin Johnson + Chris Russo Ken Arnold Roderick Schertler + David Cohrs Ken Arromdee Roland McGrath + David Damerell Ken Lorber Ron Van Iwaarden + David Gentzel Ken Washikita Ronnen Miller + David Hairston Kevin Darcy Ross Brown + Dean Luick Kevin Hugo Sascha Wostmann + Del Lamb Kevin Sitze Scott Bigham + Deron Meranda Kevin Smolkowski Scott R. Turner + Dion Nicolaas Kevin Sweet Stephen Spackman + Dylan O'Donnell Lars Huttar Stephen White + Eric Backus Malcolm Ryan Steve Creps + Eric Hendrickson Mark Gooderum Steve Linhart + Eric R. Smith Mark Modrall Steve VanDevender + Eric S. Raymond Marvin Bressler Teemu Suikki + Erik Andersen Matthew Day Tim Lennan + Frederick Roeber Merlyn LeRoy Timo Hakulinen + Gil Neiger Michael Allison Tom Almy + Greg Laskin Michael Feir Tom West + Greg Olson Michael Hamel Warren Cheung + Gregg Wonderly Michael Sokolov Warwick Allison + Hao-yang Wang Mike Engber Yitzhak Sapir + Helge Hafting Mike Gallop + Irina Rempt-Drijfhout Mike Passaretti + + ブランドと製品名は各社の商標または登録商標である。 + + + + + + + + + + + + + + + + + + NetHack 3.4 December 2, 2003 + + + diff -aurbN -xCVS -xXTAGS nethack/include/config.h jnethack/include/config.h --- nethack/include/config.h 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/include/config.h 2004-06-09 08:48:32.000000000 +0900 @@ -14,6 +14,7 @@ * provide it (no need to change sec#1, vmsconf.h handles it). */ +#define JNETHACK #define UNIX /* delete if no fork(), exec() available */ /* #define MSDOS */ /* in case it's not auto-detected */ @@ -114,6 +115,12 @@ #endif #ifndef DEFAULT_WINDOW_SYS +# ifdef X11_GRAPHICS +# define DEFAULT_WINDOW_SYS "x11" +# endif +#endif + +#ifndef DEFAULT_WINDOW_SYS # define DEFAULT_WINDOW_SYS "tty" #endif @@ -126,9 +133,10 @@ * would allow: * xpmtoppm x11tiles_big.xpm */ -/* # define USE_XPM */ /* Disable if you do not have the XPM library */ +/*# define USE_XPM*/ /* Disable if you do not have the XPM library */ # ifdef USE_XPM # define GRAPHIC_TOMBSTONE /* Use graphical tombstone (rip.xpm) */ +# define X11LARGETILE /* Large tile for X11 */ # endif #endif @@ -141,6 +149,12 @@ * playground. */ +#ifdef JNETHACK +/*#define NH_EXTENSION*/ /* Some extension for game */ +# define XI18N +# define INSTALLCOLORMAP +#endif + #ifndef WIZARD /* allow for compile-time or Makefile changes */ # ifndef KR1ED # define WIZARD "wizard" /* the person allowed to use the -D option */ @@ -169,11 +183,12 @@ #ifdef UNIX /* path and file name extension for compression program */ -#define COMPRESS "/usr/bin/compress" /* Lempel-Ziv compression */ -#define COMPRESS_EXTENSION ".Z" /* compress's extension */ +/*JP: gzip is common enough */ +/* #define COMPRESS "/usr/bin/compress" */ /* Lempel-Ziv compression */ +/* #define COMPRESS_EXTENSION ".Z" */ /* compress's extension */ /* An example of one alternative you might want to use: */ -/* #define COMPRESS "/usr/local/bin/gzip" */ /* FSF gzip compression */ -/* #define COMPRESS_EXTENSION ".gz" */ /* normal gzip extension */ +#define COMPRESS "/usr/bin/gzip" /* FSF gzip compression */ +#define COMPRESS_EXTENSION ".gz" /* normal gzip extension */ #endif #ifndef COMPRESS @@ -204,7 +219,7 @@ * otherwise it will be the current directory. */ # ifndef HACKDIR -# define HACKDIR "/usr/games/lib/nethackdir" +# define HACKDIR "/usr/games/lib/jnethackdir" # endif /* @@ -340,6 +355,10 @@ #define EXP_ON_BOTL /* Show experience on bottom line */ /* #define SCORE_ON_BOTL */ /* added by Gary Erickson (erickson@ucivax) */ +#ifdef JNETHACK +/*# define USE_MAKESINGULAR */ /* Enable singularize */ +#endif + /* * Section 5: EXPERIMENTAL STUFF * diff -aurbN -xCVS -xXTAGS nethack/include/decl.h jnethack/include/decl.h --- nethack/include/decl.h 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/include/decl.h 2005-05-01 07:10:06.000000000 +0900 @@ -177,6 +177,9 @@ #define KILLED_BY_AN 0 #define KILLED_BY 1 #define NO_KILLER_PREFIX 2 +#if 1 /*JP*/ +#define KILLED_SUFFIX 3 +#endif E NEARDATA int killer_format; E const char *killer; E const char *delayed_killer; @@ -385,6 +388,15 @@ }; #endif /* AUTOPICKUP_EXCEPTIONS */ +#if 1 /*JP*/ +struct trans_verb { + const char *en; + const char *what; + const char *particle; + const char *jp; +}; +#endif + #undef E #endif /* DECL_H */ diff -aurbN -xCVS -xXTAGS nethack/include/extern.h jnethack/include/extern.h --- nethack/include/extern.h 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/include/extern.h 2005-06-11 04:50:28.000000000 +0900 @@ -779,6 +779,9 @@ E boolean FDECL(is_worn, (struct obj *)); E struct obj *FDECL(g_at, (int,int)); E struct obj *FDECL(mkgoldobj, (long)); +#if 1 /*JP*/ +E struct trans_verb *FDECL(trans_verb, (const char *)); +#endif E struct obj *FDECL(getobj, (const char *,const char *)); E int FDECL(ggetobj, (const char *,int (*)(OBJ_P),int,BOOLEAN_P,unsigned *)); E void FDECL(fully_identify_obj, (struct obj *)); @@ -1184,6 +1187,9 @@ E const char *FDECL(locomotion, (const struct permonst *,const char *)); E const char *FDECL(stagger, (const struct permonst *,const char *)); E const char *FDECL(on_fire, (struct permonst *,struct attack *)); +#if 1 /*JP*/ +E const char *FDECL(jumpedthrough, (const struct permonst *,const char *)); +#endif E const struct permonst *FDECL(raceptr, (struct monst *)); /* ### monmove.c ### */ @@ -1367,9 +1373,11 @@ E char *FDECL(The, (const char *)); E char *FDECL(the, (const char *)); E char *FDECL(aobjnam, (struct obj *,const char *)); +#if 0 /*JP*//*日本語には三単現のsはない*/ E char *FDECL(Tobjnam, (struct obj *,const char *)); E char *FDECL(otense, (struct obj *,const char *)); E char *FDECL(vtense, (const char *,const char *)); +#endif E char *FDECL(Doname2, (struct obj *)); E char *FDECL(yname, (struct obj *)); E char *FDECL(Yname2, (struct obj *)); @@ -1548,6 +1556,9 @@ E void FDECL(make_blinded, (long,BOOLEAN_P)); E void FDECL(make_sick, (long, const char *, BOOLEAN_P,int)); E void FDECL(make_vomiting, (long,BOOLEAN_P)); +#ifdef JPEXTENSION +E void FDECL(make_totter, (long, BOOLEAN_P)); +#endif E boolean FDECL(make_hallucinated, (long,BOOLEAN_P,long)); E int NDECL(dodrink); E int FDECL(dopotion, (struct obj *)); @@ -1730,8 +1741,13 @@ E void NDECL(role_init); E void NDECL(rigid_role_checks); E void NDECL(plnamesuffix); +#if 0 /*JP*/ E const char *FDECL(Hello, (struct monst *)); E const char *NDECL(Goodbye); +#else +E const char *FDECL(Hello, (struct monst *, int)); +E const char *FDECL(Goodbye, (int)); +#endif E char *FDECL(build_plselection_prompt, (char *, int, int, int, int, int)); E char *FDECL(root_plselection_prompt, (char *, int, int, int, int, int)); @@ -2382,6 +2398,59 @@ #endif /* !MAKEDEFS_C && !LEV_LEX_C */ +#if 1 /*JP*/ + +/* ### jlib.c ### */ + +E int FDECL(is_kanji, (unsigned int)); +E void FDECL(setkcode,(int)); +E unsigned char *FDECL(e2sj, (unsigned char *)); +E unsigned char *FDECL(sj2e, (unsigned char *)); +E const char *FDECL(str2ic, (const char *)); +#ifdef SJIS_FILESYSTEM +E const char *FDECL(ic2str, (const char *)); +#endif +E int FDECL(jbuffer, (unsigned int, unsigned int *, void (*)(), void (*)(unsigned int), void (*)(unsigned int, unsigned int))); +E int FDECL(cbuffer, (unsigned int, unsigned int *, void (*)(), void (*)(unsigned int), void (*)(unsigned int, unsigned int))); +E void FDECL(cputchar,(int)); +E void FDECL(jputchar,(int)); +E void FDECL(jputs,(const char *)); +E int FDECL(is_kanji2, (const char *,int)); +E int FDECL(is_kanji1, (const char *,int)); +E int FDECL(isspace_8, (int)); +E void FDECL(split_japanese, (char *,char *,char *,int)); +E void FDECL(jrndm_replace, (char *)); +E const char *FDECL(joffmsg, (struct obj *, const char **)); +E const char *FDECL(jonmsg, (struct obj *, const char **)); +E const char *FDECL(numeral, (struct obj *)); + +/* ### jconj.c ### */ + +E const char *FDECL(jconj, (const char *,const char *)); +E const char *FDECL(jcan, (const char *)); +E const char *FDECL(jcannot, (const char *)); +E const char *FDECL(jpast, (const char *)); +E const char *FDECL(jpolite, (const char *)); +E const char *FDECL(jconj_adj, (const char *)); + +/* ### jtrns.c ### */ + +E void NDECL(init_jtrns); +E int NDECL(dotogglelang); +E int NDECL(query_lang_mode); +E void FDECL(set_trns_mode, (int)); +E const char *FDECL(jtrns_mon_gen, (const char *, int)); +E const char *FDECL(jtrns_mon, (const char *)); +E const char *FDECL(jtrns_obj, (const int, const char *)); +E const char *FDECL(etrns_mon, (const char *)); +E const char *FDECL(etrns_obj, (const int, const char *)); +E char FDECL(objclass_to_sym, (const int)); + +/*E void FDECL(zen2han, (char *));*/ + +#endif + #undef E #endif /* EXTERN_H */ + diff -aurbN -xCVS -xXTAGS nethack/include/global.h jnethack/include/global.h --- nethack/include/global.h 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/include/global.h 2004-01-09 17:04:57.000000000 +0900 @@ -15,6 +15,7 @@ */ #define RECORD "record" /* file containing list of topscorers */ +#if 0 /*JP*/ #define HELP "help" /* file containing command descriptions */ #define SHELP "hh" /* abbreviated form of the same */ #define DEBUGHELP "wizhelp" /* file containing debug mode cmds */ @@ -25,8 +26,21 @@ #define HISTORY "history" /* file giving nethack's history */ #define LICENSE "license" /* file with license information */ #define OPTIONFILE "opthelp" /* file explaining runtime options */ +#else +#define DATAFILE "data" /* file giving the meaning of symbols used */ +#define LICENSE "license" /* file with license information */ #define OPTIONS_USED "options" /* compile-time options, for #version */ +#define HELP "jhelp" /* a file containing command descriptions */ +#define RUMORFILE "jrumors" /* Japanese version */ +#define ORACLEFILE "joracles" /* Japanese version */ +#define SHELP "jhh" /* Japanese version */ +#define DEBUGHELP "jwizhelp" /* Japanese version */ +#define CMDHELPFILE "jcmdhelp" /* file telling what commands do */ +#define HISTORY "jhistory" /* a file giving nethack's history */ +#define OPTIONFILE "jopthelp" /* a file explaining runtime options */ +#endif + #define LEV_EXT ".lev" /* extension for special level files */ @@ -196,7 +210,7 @@ # else # define PORT_ID "PC" # endif -# ifdef DJGPP +# ifdef __DJGPP__ # define PORT_SUB_ID "djgpp" # else # ifdef OVERLAY @@ -236,6 +250,10 @@ #endif #endif +#if defined(MSDOS) || defined(CYGWIN32) +# define SJIS_FILESYSTEM /* filename encoding is sjis */ +#endif + #ifdef VMS /* vms_exit() (sys/vms/vmsmisc.c) expects the non-VMS EXIT_xxx values below. * these definitions allow all systems to be treated uniformly, provided diff -aurbN -xCVS -xXTAGS nethack/include/patchlevel.h jnethack/include/patchlevel.h --- nethack/include/patchlevel.h 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/include/patchlevel.h 2005-01-26 04:33:22.000000000 +0900 @@ -24,6 +24,20 @@ #define COPYRIGHT_BANNER_C \ " See license for details." +#if 1 /*JP*/ +#define JA_COPYRIGHT_BANNER_A \ +"NetHack[日本語版], Copyright 1993 - 1996" + +#define JA_COPYRIGHT_BANNER_B \ +" By I. Numata , S. Miyashita and N. Hamada." + +#define JA_COPYRIGHT_BANNER_C \ +" for 3.4, Copyright 2002 - 2005" + +#define JA_COPYRIGHT_BANNER_D \ +" By K.Shirakata." +#endif + /* * If two or more successive releases have compatible data files, define * this with the version number of the oldest such release so that the diff -aurbN -xCVS -xXTAGS nethack/include/system.h jnethack/include/system.h --- nethack/include/system.h 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/include/system.h 2003-12-10 00:54:08.000000000 +0900 @@ -133,7 +133,9 @@ int(*)(const genericptr,const genericptr))); #else # if defined(BSD) || defined(ULTRIX) +#if 0 /*JP*/ E int qsort(); +#endif # else # if !defined(LATTICE) && !defined(AZTEC_50) E void FDECL(qsort, (genericptr_t,size_t,size_t, @@ -300,9 +302,11 @@ # if defined(NHSTDC) || (defined(VMS) && !defined(ANCIENT_VAXC)) # if !defined(_AIX32) && !(defined(SUNOS4) && defined(__STDC__)) /* Solaris unbundled cc (acc) */ +/*JP E int FDECL(memcmp, (const void *,const void *,size_t)); E void *FDECL(memcpy, (void *, const void *, size_t)); E void *FDECL(memset, (void *, int, size_t)); +*/ # endif # else # ifndef memcmp /* some systems seem to macro these back to b*() */ @@ -371,7 +375,9 @@ # endif # else /*!POSIX_TYPES*/ # ifndef getpid /* Borland C defines getpid() as a macro */ +#if 0 /*JP*/ E int NDECL(getpid); +#endif # endif # ifdef VMS E int NDECL(getppid); diff -aurbN -xCVS -xXTAGS nethack/include/unixconf.h jnethack/include/unixconf.h --- nethack/include/unixconf.h 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/include/unixconf.h 2003-12-10 00:54:08.000000000 +0900 @@ -25,7 +25,7 @@ /* #define ULTRIX */ /* define for Ultrix v3.0 or higher (but not lower) */ /* Use BSD for < v3.0 */ /* "ULTRIX" not to be confused with "ultrix" */ -#define SYSV /* define for System V, Solaris 2.x, newer versions */ +/* #define SYSV */ /* define for System V, Solaris 2.x, newer versions */ /* of Linux */ /* #define HPUX */ /* Hewlett-Packard's Unix, version 6.5 or higher */ /* use SYSV for < v6.5 */ @@ -47,7 +47,7 @@ * job control (note that AIX is SYSV otherwise) * Also define this for AIX 3.2 */ -#define TERMINFO /* uses terminfo rather than termcap */ +/* #define TERMINFO */ /* uses terminfo rather than termcap */ /* Should be defined for most SYSV, SVR4 (including * Solaris 2+), HPUX, and Linux systems. In * particular, it should NOT be defined for the UNIXPC diff -aurbN -xCVS -xXTAGS nethack/include/winX.h jnethack/include/winX.h --- nethack/include/winX.h 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/include/winX.h 2003-12-10 00:54:08.000000000 +0900 @@ -9,6 +9,16 @@ #ifndef WINX_H #define WINX_H +/*JP +** for i18n by issei 1994/1/8 +*/ +#ifdef XI18N +#include +#endif +#ifdef XAW_I18N +#include +#endif + #ifndef E #define E extern #endif @@ -56,6 +66,7 @@ unsigned short glyphs[ROWNO][COLNO]; /* Saved glyph numbers. */ GC white_gc; GC black_gc; + GC clip_gc; unsigned long image_width; /* dimensions of tile image */ unsigned long image_height; }; @@ -89,6 +100,10 @@ struct mesg_info_t { XFontStruct *fs; /* Font for the window. */ +/*JP*/ +#ifdef XI18N + XFontSet fontset; +#endif int num_lines; /* line count */ struct line_element *head; /* head of circular line queue */ struct line_element *line_here;/* current drawn line position */ @@ -145,6 +160,10 @@ struct menu new_menu; /* New menu being built. */ XFontStruct *fs; /* Font for the window. */ +/*JP*/ +#ifdef XI18N + XFontSet fontset; +#endif long menu_count; /* number entered by user */ Dimension line_height; /* Total height of a line of text. */ Dimension internal_height; /* Internal height between widget & border */ @@ -164,6 +183,10 @@ struct text_info_t { struct text_buffer text; XFontStruct *fs; /* Font for the text window. */ +/*JP*/ +#ifdef XI18N + XFontSet fontset; +#endif int max_width; /* Width of widest line so far. */ int extra_width, /* Sum of left and right border widths. */ extra_height; /* Sum of top and bottom border widths. */ @@ -243,6 +266,10 @@ Boolean message_line; Boolean double_tile_size; /* double tile size */ String tile_file; /* name of file to open for tiles */ +#ifdef X11LARGETILE + int tile_width; + int tile_height; +#endif String icon; /* name of desired icon */ int message_lines; /* number of lines to attempt to show */ String pet_mark_bitmap; /* X11 bitmap file used to mark pets */ @@ -344,7 +371,11 @@ E void FDECL(clear_text_buffer,(struct text_buffer*)); E void FDECL(free_text_buffer,(struct text_buffer*)); #ifdef GRAPHIC_TOMBSTONE +#ifndef XI18N E void FDECL(calculate_rip_text, (int)); +#else +E void FDECL(calculate_rip_text, (int, XFontSet)); +#endif #endif diff -aurbN -xCVS -xXTAGS nethack/include/wintty.h jnethack/include/wintty.h --- nethack/include/wintty.h 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/include/wintty.h 2004-01-08 00:04:05.000000000 +0900 @@ -108,6 +108,7 @@ E void FDECL(xputc, (int)); #else E void FDECL(xputc, (CHAR_P)); +E void FDECL(xputc2, (int, int)); #endif E void FDECL(xputs, (const char *)); #if defined(SCREEN_VGA) || defined(SCREEN_8514) @@ -154,6 +155,10 @@ E void NDECL(more); E void FDECL(update_topl, (const char *)); E void FDECL(putsyms, (const char*)); +/*JP +Sat Aug 27 00:42:03 JST 1994 by issei +*/ +E void FDECL(raw_putsyms, (const char*)); /* ### wintty.c ### */ #ifdef CLIPPING diff -aurbN -xCVS -xXTAGS nethack/include/xwindowp.h jnethack/include/xwindowp.h --- nethack/include/xwindowp.h 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/include/xwindowp.h 2003-12-10 00:54:08.000000000 +0900 @@ -57,6 +57,10 @@ Pixel bright_cyan; Pixel white; XFontStruct *font; +/* this cannot work because winX11/Window.c does not include config.h */ +/* #ifdef XI18N*/ + XFontSet fontset; +/* #endif */ XtCallbackList expose_callback; XtCallbackList input_callback; XtCallbackList resize_callback; diff -aurbN -xCVS -xXTAGS nethack/include/you.h jnethack/include/you.h --- nethack/include/you.h 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/include/you.h 2003-12-10 00:54:08.000000000 +0900 @@ -76,6 +76,7 @@ struct Role { /*** Strings that name various things ***/ struct RoleName name; /* the role's name (from u_init.c) */ + struct RoleName jname; /* the role's name (from u_init.c) */ struct RoleName rank[9]; /* names for experience levels (from botl.c) */ const char *lgod, *ngod, *cgod; /* god names (from pray.c) */ const char *filecode; /* abbreviation for use in file names */ @@ -152,6 +153,7 @@ struct Race { /*** Strings that name various things ***/ const char *noun; /* noun ("human", "elf") */ +/*JP*/ const char *j; /* japanese */ const char *adj; /* adjective ("human", "elven") */ const char *coll; /* collective ("humanity", "elvenkind") */ const char *filecode; /* code for filenames */ @@ -197,6 +199,7 @@ /*** Unified structure specifying gender information ***/ struct Gender { const char *adj; /* male/female/neuter */ +/*JP*/ const char *j; /* japanese */ const char *he; /* he/she/it */ const char *him; /* him/her/it */ const char *his; /* his/her/its */ @@ -218,6 +221,7 @@ /*** Unified structure specifying alignment information ***/ struct Align { const char *noun; /* law/balance/chaos */ +/*JP*/ const char *j; /* japanese */ const char *adj; /* lawful/neutral/chaotic */ const char *filecode; /* file code */ short allow; /* equivalent ROLE_ mask */ diff -aurbN -xCVS -xXTAGS nethack/include/youprop.h jnethack/include/youprop.h --- nethack/include/youprop.h 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/include/youprop.h 2003-12-10 00:54:08.000000000 +0900 @@ -126,6 +126,10 @@ #define HSleeping u.uprops[SLEEPING].intrinsic #define ESleeping u.uprops[SLEEPING].extrinsic +#ifdef JPEXTENSION +#define Totter u.uprops[TOTTER].p_flgs +#endif + #define Sleeping (HSleeping || ESleeping) #define HHunger u.uprops[HUNGER].intrinsic diff -aurbN -xCVS -xXTAGS nethack/japanese/Install.dos jnethack/japanese/Install.dos --- nethack/japanese/Install.dos 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/japanese/Install.dos 2004-02-19 07:28:20.000000000 +0900 @@ -0,0 +1,26 @@ + DJGPP 版 jnethack のコンパイル方法 + Kentaro Shirakata + +0.必要環境 + + 最近の DJGPP V2 なら多分問題ないはずです。私がインストールしたのは + 以下のものです。 + +bnu2112b.zip +djdev203.zip +fil40b.zip +gcc304b.zip +mak3791b.zip + + 以下、トップディレクトリ(README.j があるディレクトリ)を基準とします。 + ソースの漢字コードは EUC のままにしてください。 + +1.コンパイル + +・sys/msdos/setup.bat gcc を実行。 +・src/makefile の "YACC_LEX = Y" を "YACC_LEX = N"に変更。(yacc と lex を + インストールすれば Y のままでも構いません) +・make install を実行。 +・3.4.3 では makefile が壊れていて途中でエラーが出るので、もう一度 + make install を実行。 +・binary/ ディレクトリに必要ファイルが作成されます。 diff -aurbN -xCVS -xXTAGS nethack/japanese/Install.lnx jnethack/japanese/Install.lnx --- nethack/japanese/Install.lnx 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/japanese/Install.lnx 2003-12-31 21:25:15.000000000 +0900 @@ -0,0 +1,171 @@ + + Linux 用 jnethack 3.4.3 のコンパイル例 + + +0) はじめに + +Plamo Linux 3.2 で tty / X11 版をコンパイルした例です。 +この文書は sys/unix/README.linux から設定を抜き出して書かれています。 + + +1) アーカイブの展開・パッチ当て + +$ tar zxvf nethack-343.tgz +$ cd nethack-3.4.3 +$ zcat jnethack-3.4.3-x.x.diff.gz | patch -p1 +$ sh sys/unix/setup.sh + + +2) ファイルの編集 + +2-1) Makefile の該当行を編集 + +GAMEGRP = games +GAMEPERM = 02755 +FILEPERM = 0644 +EXEPERM = 755 +DIRPERM = 775 + +X11 版もコンパイルする場合は以下の設定も必要。 + +VARDATND = x11tiles pet_mark.xbm rip.xpm + + +2-2) src/Makefile の該当行を編集 + +CFLAGS = -O2 -fomit-frame-pointer -I../include +LFLAGS = + +X11 版もコンパイルする場合は以下の設定も必要。 + +LFLAGS = -L/usr/X11R6/lib +WINSRC = $(WINTTYSRC) $(WINX11SRC) +WINOBJ = $(WINTTYOBJ) $(WINX11OBJ) +WINX11LIB = -lXaw -lXmu -lXext -lXt -lXpm -lX11 +WINLIB = $(WINTTYLIB) $(WINX11LIB) + + +2-3) util/Makefile の該当行を編集 + +CFLAGS = -O2 -fomit-frame-pointer -I../include +LFLAGS = + + +2-4) include/unixconf.h の該当行を編集 + +コメントアウトされている Linux の定義を有効にします。 + +#define SYSV +#define LINUX +#define TERMINFO +#define TIMED_DELAY + + +2-5) include/config.h の該当行を編集 + +#define DLB + +X11 版もコンパイルする場合は以下の設定も必要。 + +#define X11_GRAPHICS +#define USE_XPM +#define AUTOPICKUP_EXCEPTIONS + + +2-6) win/X11/JNetHack.ad の該当行を編集(X11 版のみ) + +JNetHack*font: -misc-fixed-medium-r-*--12-* +JNetHack*display_file*font: -misc-fixed-medium-r-*--12-* +JNetHack*tombstone*font: -misc-fixed-medium-r-*--12-* +JNetHack*rip*font: -misc-fixed-medium-r-*--12-* +JNetHack*menu*font: -misc-fixed-medium-r-*--12-* +JNetHack*text*font: -misc-fixed-medium-r-*--12-* +JNetHack*map*font: -misc-fixed-medium-r-*--14-* +JNetHack*fontSet: -misc-fixed-medium-r-*--12-* + +タイル表示する場合は以下の設定をします。 + +JNetHack.tile_file: x11tiles +JNetHack.tile_width: 16 +JNetHack.tile_height: 16 + +タイルを使用しない場合はタイル設定の行頭に "!" をつけます。 + + +3) コンパイル + +$ make all + + +4) インストール + +4-1) はじめてインストールする場合 + +# make install + +X11 版の場合はリソースファイルもコピーします。 + +# cp win/X11/JNetHack.ad /usr/X11R6/lib/X11/app-defaults/JNetHack + + +4-2) 上書きする場合(セーブデータが保護されます) + +# make update + + +5) エラーメッセージ + +5-1) インストール時に chgrp: invalid group name `games' + +システムに games グループが登録されていません。 +新しく games グループを作るか Makefile の GAMEGRP を変更してインストールしてください。 + + +5-2) 起動時に Warning: cannot write scoreboard file record + +record ファイルのパーミッションが設定されていない場合表示されます。 + +# chmod g+w /usr/games/lib/jnethackdir/record + +上記のように書き込み権限を有効にします。 + + +5-3) 終了時に Cannot open log file! + +logfile ファイルのパーミッションが設定されていない場合表示されます。 + +# chmod g+w /usr/games/lib/jnethackdir/logfile + +上記のように書き込み権限を有効にします。 + + +5-4) セーブ時に No such file or directory Exec to compress save/[キャラクター名] failed. + +compress もしくは gzip が存在しないか設定が間違っています。 +include/config.h の COMPRESS の設定が正しいかどうか確認してください。 + +#define COMPRESS "/usr/bin/gzip" /* FSF gzip compression */ + + +6) 環境設定 + +6-1) 設定ファイル + +ホームディレクトリに ~/.jnethackrc ファイルを作成してプレイヤー名などの設定を +することができます。 +設定ファイルの書き方は doc/jGuidebook.txt を参照してください。 + +tty 版と X11 版の切り替えは以下の通りです。 + +OPTIONS=windowtype:tty # tty 版の場合 +OPTIONS=windowtype:x11 # X11 版の場合 + +JNetHack 1.x 系で追加されたスコア送信機能や Radar パッチは 3.4.x 系では +分離されているので report や radar オプションを設定しても有効にはなりません。 + + +6-2) X11 版のウインドウサイズ + +起動時に -g オプションをつけるとメインウインドウの大きさを設定できます。 + +$ jnethack -g 640x480 diff -aurbN -xCVS -xXTAGS nethack/japanese/Install.nt jnethack/japanese/Install.nt --- nethack/japanese/Install.nt 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/japanese/Install.nt 2003-12-10 00:54:08.000000000 +0900 @@ -0,0 +1,33 @@ + MS Windows 用 jnethack のコンパイル方法 + Kentaro Shirakata + +0.必要環境 + + 私がテストしたのは Visual C++ 6 SP5 と Boland C++ 5.5 です。 + 以下、トップディレクトリ(README.j があるディレクトリ)を基準とします。 + (基本的に sys/winnt/Install.nt と同じです) + +1. VC/GUI 版 + +・sys/winnt/nhsetup.bat を実行。 +・nethack.dsw をダブルクリック(Visual Studio 起動)。 +・[ビルド]→[アクティブな構成の設定...] で "nethackw - Win32 Release" を選択。 +・[ビルド]→[ビルド] でコンパイル・インストール。 +・binary/ ディレクトリに必要ファイルが作成されます。 + +2. VC/CUI 版(コマンドラインから) + +・(Visual Studio の)VCVARS32.BAT を実行。 +・sys/winnt/nhsetup.bat を実行。 +・src/ ディレクトリに移動。 +・nmake all でコンパイル・インストール。 +・binary/ ディレクトリに必要ファイルが作成されます。 + +3. BCC 版(コマンドラインから) + +・sys/winnt/nhsetup.bat を実行。 +・src/ ディレクトリに移動。 +・デフォルトでは CUI 版になっているので、GUI 版を作成する場合は + Makefile.bcc の 51 行目を「GRAPHICAL = Y」に変更。 +・make /f Makefile.bcc install でコンパイル・インストール。 +・binary/ ディレクトリに必要ファイルが作成されます。 diff -aurbN -xCVS -xXTAGS nethack/japanese/Install.unx jnethack/japanese/Install.unx --- nethack/japanese/Install.unx 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/japanese/Install.unx 2003-12-10 00:54:08.000000000 +0900 @@ -0,0 +1,118 @@ +(このドキュメントは古いもので、3.4.0ベースでは当てはまらないものもあります) + + JNetHack + + Copyright 1993-1999 I.Numata, S.Miyashita, N.Hamada + + + INSTALL GUIDE FOR UNIX + +0) はじめに + +日本語 NetHackをインストールするには、8ビットスルーな lexが必要です。 +lexに -8 オプション(あるいはそれと同等のもの)があるかどうかをインストー +ルの前に確認します。なければ、8ビットスルーな lexをインストールしなけ +ればなりません。幸い GNUの flexが8ビットスルーですので、これをインストー +ルするのがよいでしょう。また、gzipや patchも GNUの最新バージョンをインス +トールしておくことをおすすめします。 + +またバージョン 1.0.6からは X11 および XPMがデフォルトで必須となっています。 +インストールされてない方はこれを機会に是非追加してください。 + +1) JNetHackのインストール方法 + +JNetHack-currentを展開します。 + + % gzip -dc jnethack-current.tar.gz | tar xvf - + +漢字コードは EUCで記述されています。 + +OSやコンパイル環境が不幸にしてSJISしかサポートしていない環境の方は + + % gzip -dc nethack-3.3.0.tar.gz | tar xvf - + +とNetHack-3.3.0を展開して、 + + % gzip -dc jnethack-current-nethack-3.3.0.patch.gz | nkf -s | patch -p1 + +等とすればよいでしょう。次に Makefileを作ります。 + + % cd sys/unix + % sh setup.sh + +src/Makefile のコメントを参考にして、いくつかのフラグをマシンの設定に +合せて自分で編集します。重要なのはWINTTYLIBと WINX11LIBです。デフォル +トではFreeBSDになっているので、Linuxでは + +WINTTYLIB = -ltermcap +WINX11LIB = -lXaw -lXmu -lXext -lXt -lXpm -lX11 -lm + +としてください。次に include/config.hや include/unixconf.h を編集します。 +オジナル版Nethackがインストールされている場合を考慮し、HACKDIRは別のディ +レクトリになっています。 HACKDIRを変更した場合はトップ階層にある +Makefileも変更します。さもないと make installが正しく動作しません。 + +次に、lexを使うか、flexを使うかによって、util/Makefileの対応する部分を +書き替えます。 + + % make + +エラーなくコンパイルできたならば、次のコマンドを実行します。(多くの場 +合rootになる必要があるはずです) + + # make install + +インストール仕直すときは + + # make update + +とすればよいでしょう。これを行わないとセーブファイル等が全て初期化されて +しまいます。但しバージョンやコンパイルオプションを大きく変更したときは +初期化インストールすることをオススメします。 + +その他不明なことは + +http://www.jnethack.org + +を御覧ください。 + +(付録) + +JNetHackに追加されたオプション + +kcode(デフォルト:無変換) + + OPTIONS=kcode:jis + + のように指定してください。このオプションは ttyおよび設定ファイ + ルの漢字コードに影響を与えます。XはXの国際化部分に依存します。 + また、.nethackrcより先に .jnethackrc を読みに行くので、英語版 + との共存が可能です。 + + kterm-5.2.0(以上)がインストールされているならば、X11版をインス + トールしなくても -decオプションをつけることにより、そこそこの + グラフィックを堪能できます。この場合 kcode:jisとする必要があり + ます。 + +homeurl(デフォルト:"") + + OPTIONS=homeurl:http://www.guru.gr.jp/ + + のように指定してください。このオプションでURLを指定している + とスコアサーバにスコアを送るときにHome PageのURLをも送ります。 + +proxy(デフォルト:"") + + OPTIONS=proxy:proxy.guru.gr.jp:1234 + + のように指定してください。 + +report(デフォルト:TRUE) + + このオプションを指定するとゲーム終了時にスコアをスコアサーバ + に報告します。デフォルトはオフになっています。 + +radar(デフォルト:TRUE) + + レーダーのオンオフをします。win版でタイルを使用しているとき + のみ有効です。 diff -aurbN -xCVS -xXTAGS nethack/japanese/emalloc.c jnethack/japanese/emalloc.c --- nethack/japanese/emalloc.c 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/japanese/emalloc.c 2003-12-10 00:54:08.000000000 +0900 @@ -0,0 +1,204 @@ + +/* EMS handler routine + Copyright (c) Kouji Takada 1994-2000 */ +/* JNetHack may be freely redistributed. See license for details. */ + +#include "hack.h" +#include +#include +#include "emalloc.h" + +#define EMS_VECT 0x67 +#define EMS_STR "EMMXXXX0" +static int isems = 0; +static unsigned int ems_frame = 0; +static unsigned long emalloc_ptr = 0; +static unsigned int ems_handle = 0; + +#ifdef MOVERLAY +/* MOVERLAY API */ +#define MOVE_PAUSE_CACHE 4 +extern unsigned short _movefpause; +extern void _movepause(void); +extern void _moveresume(void); +#endif + +/* 正規化されたポインタを作成する */ +static void *mk_fp(unsigned int seg, unsigned int off) +{ + unsigned long temp; + + temp = (((unsigned long)seg) << 4) + ((unsigned long)off); + return (void *)(((temp & 0xffff0L) << 12) + (temp & 0x0000fL)); +} + +/* プログラム終了時に呼ばれ、EMS を開放する */ +void done_ems(void) +{ + union REGS inregs, outregs; + struct SREGS segregs; + int i; + + if (isems == 0) return; + inregs.h.ah = 0x44; + inregs.x.dx = ems_handle; + inregs.x.bx = 0xffff; + for (i = 0; i < 4; i++) + { + /* ページをアンマップする */ + inregs.h.al = i; + int86(EMS_VECT, &inregs, &outregs); + if (outregs.h.ah != 0) fprintf(stderr, + "警告: EMS をアンマップ出来ません (%04x)。\n", + outregs.h.ah & (i << 8)); + } + + /* ページを開放する */ + inregs.h.ah = 0x45; + inregs.x.dx = ems_handle; + int86(EMS_VECT, &inregs, &outregs); + if (outregs.h.ah != 0) + { + fprintf(stderr, "警告: EMS を開放出来ません (%04x)。\n", + outregs.h.ah); + return; + } +/* fprintf(stderr, "EMS は %ud バイト使用されました。\n", emalloc_ptr); */ + isems = 0; +} + +/* EMS を初期化する */ +int detect_ems(void) +{ + union REGS inregs, outregs; + char *vect; + int i; + + /* EMS ドライバを探す */ + vect = (char *)_dos_getvect(EMS_VECT); + vect = mk_fp(FP_SEG(vect), 0x000a); + if (memcmp(vect, EMS_STR, 8) != 0) + { + fprintf(stderr, "EMS が存在しません。\n"); + return 0; + } + +#ifdef MOVERLAY + /* MOVERLAY が取得している EMS を開放させる */ + _movefpause |= MOVE_PAUSE_CACHE; + _movepause(); +#endif + /* ハードウェアが正常かどうか確認する */ + inregs.h.ah = 0x40; + int86(EMS_VECT, &inregs, &outregs); + if (outregs.h.ah != 0) + { + fprintf(stderr, "EMS が異常です (%04x)。\n", outregs.h.ah); +#ifdef MOVERLAY + _moveresume(); +#endif + return 0; + } + + /* 4ページの空きがあるか確認する */ + inregs.h.ah = 0x42; + int86(EMS_VECT, &inregs, &outregs); + if (outregs.x.bx < 4) + { + fprintf(stderr, "EMS のフレームが足りません (%04x)。\n", + outregs.x.cx); +#ifdef MOVERLAY + _moveresume(); +#endif + return 0; + } + + /* ページフレームが4つ以上あるかどうか確認する */ + inregs.x.ax = 0x5801; + int86(EMS_VECT, &inregs, &outregs); + if (outregs.x.cx < 4) + { + fprintf("stderr, EMS のフレームが足りません (%04x)。\n", outregs.x.cx); + _moveresume(); + return 0; + } + + /* ページフレームの先頭アドレスを得る */ + inregs.h.ah = 0x41; + int86(EMS_VECT, &inregs, &outregs); + ems_frame = outregs.x.bx; + + /* 4ページのメモリを確保する */ + inregs.h.ah = 0x43; + inregs.x.bx = 4; + int86(EMS_VECT, &inregs, &outregs); + if (outregs.h.ah != 0) + { + fprintf(stderr, "EMS が取得出来ません (%04x)。\n", + outregs.h.ah); +#ifdef MOVERLAY + _moveresume(); +#endif + _moveresume(); + return 0; + } + ems_handle = outregs.x.dx; + + /* ページをマップする */ + inregs.h.ah = 0x44; + inregs.x.dx = ems_handle; + for (i = 0; i < 4; i++) + { + inregs.h.al = i; + inregs.x.bx = i; + int86(EMS_VECT, &inregs, &outregs); + if (outregs.h.ah != 0) + { + fprintf(stderr, "EMS をマップ出来ません (%04x)。\n", + outregs.h.ah & (i << 8)); + inregs.h.ah = 0x45; + inregs.x.dx = ems_handle; + int86(EMS_VECT, &inregs, &outregs); +#ifdef MOVERLAY + _moveresume(); +#endif + return 0; + } + } + +#ifdef MOVERLAY + /* MOVERLAY のキャッシュを再び有効にする */ + _moveresume(); +#endif + /* プログラム終了時に自動的に呼び出す */ + atexit(done_ems); + + fprintf(stderr, "\nEMS をデータ領域として使用します。\n"); + isems = 1; + return 1; +} + +/* EMS 領域から優先してメモリを確保する */ +void *emalloc(unsigned int size) +{ + void *ptr; + + /* EMS が使用可能なら */ + if (isems != 0) + { + /* EMS に空きがあれば */ + if ((emalloc_ptr + ((unsigned long)size)) <= 0xffffL) + { + /* ポインタを作って返す */ + ptr = mk_fp(ems_frame, emalloc_ptr); + emalloc_ptr += size; + memset(ptr, 0, size); + return ptr; + } + } + /* EMS からメモリが取得出来なければ、ヒープを使う */ + ptr = alloc(size); + memset(ptr, 0, size); + return ptr; +} + diff -aurbN -xCVS -xXTAGS nethack/japanese/emalloc.h jnethack/japanese/emalloc.h --- nethack/japanese/emalloc.h 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/japanese/emalloc.h 2003-12-10 00:54:08.000000000 +0900 @@ -0,0 +1,9 @@ + +/* EMS handler routine + Copyright (c) Kouji Takada 1994 */ +/* JNetHack may be freely redistributed. See license for details. */ + +int detect_ems(void); +void done_ems(void); +void *emalloc(unsigned int); + diff -aurbN -xCVS -xXTAGS nethack/japanese/hash.c jnethack/japanese/hash.c --- nethack/japanese/hash.c 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/japanese/hash.c 2005-01-19 21:42:03.000000000 +0900 @@ -0,0 +1,23 @@ +/* +** +** $Id$ +** +*/ + +/* Copyright (c) Issei Numata 1994-2000 */ +/* For 3.4, 2003-2004 by Kentaro Shirakata */ +/* JNetHack may be freely redistributed. See license for details. */ + +#define HASHSIZE 2047 + +static int +hash_val(key) + unsigned char *key; +{ + int v=0; + + ++key;/* skip first char */ + while(*key) + v = (v * 3 + *(key++)) % HASHSIZE; + return v; +} diff -aurbN -xCVS -xXTAGS nethack/japanese/jconj.c jnethack/japanese/jconj.c --- nethack/japanese/jconj.c 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/japanese/jconj.c 2005-06-11 04:49:54.000000000 +0900 @@ -0,0 +1,462 @@ +/* +** +** $Id: jconj.c,v 1.1.3.1 1999/11/17 06:35:05 issei Exp issei $ +** +*/ + +/* Copyright (c) Issei Numata 1994-2000 */ +/* JNetHack may be freely redistributed. See license for details. */ + +#include +#include +#include + +#define EUC 0 +#define SJIS 1 +#define JIS 2 + +/* internal kcode */ +/* IC=0 EUC */ +/* IC=1 SJIS */ +#define IC ((unsigned char)("漢"[0])==0x8a) + +#define J_A 0 +#define J_KA (1*5) +#define J_SA (2*5) +#define J_TA (3*5) +#define J_NA (4*5) +#define J_HA (5*5) +#define J_MA (6*5) +#define J_YA (7*5) +#define J_RA (8*5) +#define J_WA (9*5) + +#define J_GA (10*5) +#define J_ZA (11*5) +#define J_DA (12*5) +#define J_BA (13*5) +#define J_PA (14*5) + +static unsigned char hira_tab[][2]={ + {0xa4, 0xa2}, {0xa4, 0xa4}, {0xa4, 0xa6}, {0xa4, 0xa8}, {0xa4, 0xaa}, + {0xa4, 0xab}, {0xa4, 0xad}, {0xa4, 0xaf}, {0xa4, 0xb1}, {0xa4, 0xb3}, + {0xa4, 0xb5}, {0xa4, 0xb7}, {0xa4, 0xb9}, {0xa4, 0xbb}, {0xa4, 0xbd}, + {0xa4, 0xbf}, {0xa4, 0xc1}, {0xa4, 0xc4}, {0xa4, 0xc6}, {0xa4, 0xc8}, + {0xa4, 0xca}, {0xa4, 0xcb}, {0xa4, 0xcc}, {0xa4, 0xcd}, {0xa4, 0xce}, + {0xa4, 0xcf}, {0xa4, 0xd2}, {0xa4, 0xd5}, {0xa4, 0xd8}, {0xa4, 0xdb}, + {0xa4, 0xde}, {0xa4, 0xdf}, {0xa4, 0xe0}, {0xa4, 0xe1}, {0xa4, 0xe2}, + {0xa4, 0xe4}, {0xa4, 0xa4}, {0xa4, 0xe6}, {0xa4, 0xa8}, {0xa4, 0xe8}, + {0xa4, 0xe9}, {0xa4, 0xea}, {0xa4, 0xeb}, {0xa4, 0xec}, {0xa4, 0xed}, + {0xa4, 0xef}, {0xa4, 0xa4}, {0xa4, 0xa6}, {0xa4, 0xa8}, {0xa4, 0xaa}, + {0xa4, 0xac}, {0xa4, 0xae}, {0xa4, 0xb0}, {0xa4, 0xb2}, {0xa4, 0xb4}, + {0xa4, 0xb6}, {0xa4, 0xb8}, {0xa4, 0xba}, {0xa4, 0xbc}, {0xa4, 0xbe}, + {0xa4, 0xc0}, {0xa4, 0xc2}, {0xa4, 0xc5}, {0xa4, 0xc7}, {0xa4, 0xc9}, + {0xa4, 0xd0}, {0xa4, 0xd3}, {0xa4, 0xd6}, {0xa4, 0xd9}, {0xa4, 0xdc}, + {0xa4, 0xd1}, {0xa4, 0xd4}, {0xa4, 0xd7}, {0xa4, 0xda}, {0xa4, 0xdd}, +}; + +#define FIFTH 0 /* 五段 */ +#define UPPER 1 /* 上一段 */ +#define LOWER 2 /* 下一段 */ +#define SAHEN 3 /* サ変 */ +#define KAHEN 4 /* カ変 */ + +#define NORMAL 0 /* あける→〜た */ +#define SOKUON 1 /* 刻む→〜んだ */ +#define HATSUON 2 /* 打つ→〜った */ +#define ION 3 /* 浮く→〜いた */ + +struct _jconj_tab { + const char *main; + int column; +/* 0: fifth conj. 1:upper conj. 2:lower conj. 3:SAHEN 4:KAHEN */ + int katsuyo_type; +/* 0: normal 1: sokuon 2: hatson 3: ion */ + int onbin_type; +} jconj_tab[] = { +/* あ */ + {"あける", J_KA, LOWER, NORMAL}, + {"開ける", J_KA, LOWER, NORMAL}, + {"いれる", J_RA, LOWER, NORMAL}, + {"入れる", J_RA, LOWER, NORMAL}, + {"浮く", J_KA, FIFTH, ION}, + {"打つ", J_TA, FIFTH, HATSUON}, + {"置く", J_KA, FIFTH, ION}, + {"納める", J_MA, LOWER, NORMAL}, + {"落ちる", J_TA, UPPER, NORMAL}, + {"落す", J_SA, FIFTH, NORMAL}, +/* か */ + {"書く", J_KA, FIFTH, ION}, + {"かける", J_KA, UPPER, NORMAL}, + {"かぶる", J_RA, FIFTH, HATSUON}, + {"構える", J_A, LOWER, NORMAL}, + {"噛みつく", J_KA, FIFTH, ION}, + {"刻む", J_MA, FIFTH, SOKUON}, + {"着る", J_KA, UPPER, NORMAL}, + {"来る", J_KA, KAHEN, NORMAL}, + {"砕く", J_KA, FIFTH, ION}, + {"加える", J_A, LOWER, NORMAL}, + {"こする", J_RA, FIFTH, HATSUON}, + {"こます", J_SA, FIFTH, NORMAL}, + {"込む", J_MA, FIFTH, SOKUON}, + {"殺す", J_SA, FIFTH, NORMAL}, + {"壊す", J_SA, FIFTH, NORMAL}, +/* さ */ + {"捧げる", J_KA, LOWER, NORMAL}, + {"錆びる", J_BA, UPPER, NORMAL}, + {"死ぬ", J_NA, FIFTH, SOKUON}, + {"滑る", J_RA, FIFTH, HATSUON}, + {"する", J_SA, SAHEN, NORMAL}, +/* た */ + {"出す", J_SA, FIFTH, NORMAL}, + {"食べる", J_HA, LOWER, NORMAL}, + {"使う", J_WA, FIFTH, HATSUON}, + {"つける", J_KA, LOWER, NORMAL}, + {"つまずく", J_KA, FIFTH, ION}, + {"出る", J_NA, LOWER, NORMAL}, + {"解く", J_KA, FIFTH, ION}, + {"溶ける", J_KA, LOWER, NORMAL}, + {"とばす", J_SA, FIFTH, NORMAL}, + {"飛ぶ", J_BA, FIFTH, SOKUON}, + {"取る", J_RA, FIFTH, HATSUON}, +/* な */ + {"投げる", J_GA, LOWER, NORMAL}, + {"名づける", J_KA, LOWER, NORMAL}, + {"握る", J_RA, FIFTH, HATSUON}, + {"脱ぐ", J_GA, FIFTH, ION}, + {"濡らす", J_SA, FIFTH, NORMAL}, + {"塗る", J_RA, FIFTH, HATSUON}, + {"飲む", J_MA, FIFTH, SOKUON}, +/* は */ + {"はいずる", J_RA, FIFTH, HATSUON}, + {"履く", J_KA, FIFTH, ION}, + {"はさむ", J_MA, FIFTH, SOKUON}, + {"はずす", J_SA, FIFTH, NORMAL}, + {"外す", J_SA, FIFTH, NORMAL}, + {"はめる", J_MA, UPPER, NORMAL}, + {"浸す", J_SA, FIFTH, NORMAL}, + {"ひっかける", J_KA, LOWER, NORMAL}, + {"拾う", J_WA, FIFTH, HATSUON}, + {"踏む", J_MA, FIFTH, SOKUON}, + {"振りかざす", J_SA, FIFTH, NORMAL}, + {"掘る", J_RA, FIFTH, HATSUON}, +/* ま */ + {"巻く", J_KA, FIFTH, ION}, + {"守る", J_RA, FIFTH, HATSUON}, + {"回す", J_SA, FIFTH, NORMAL}, + {"身につける", J_KA, LOWER, NORMAL}, + {"持つ", J_TA, FIFTH, HATSUON}, +/* や */ + {"焼く", J_KA, FIFTH, ION}, + {"呼ぶ", J_BA, FIFTH, SOKUON}, + {"読む", J_MA, FIFTH, SOKUON}, +/* ら */ +/* わ */ + {(void*)0, 0, 0, 0}, +}; + +extern unsigned char *e2sj(unsigned char *s); +extern unsigned char *sj2e(unsigned char *s); + +/* +** conjection verb word +** +** Example +** arg1 arg2 result +** 脱ぐ ない 脱がない +** 脱ぐ た 脱いだ +** +*/ +static char * +jconjsub( tab, jverb, sfx ) + struct _jconj_tab *tab; + char *jverb; + char *sfx; +{ + int len; + unsigned char *p; + static unsigned char tmp[1024]; + + len = strlen(jverb); + strcpy((char *)tmp, jverb ); + + if(!strncmp(sfx, "と", 2)){ + strcat((char *)tmp, sfx); + return (char *)tmp; + } + + switch( tab->katsuyo_type ){ + case FIFTH: + p = tmp + (len - 2); + if(!strncmp(sfx, "な", 2)){ + if(!IC){ + p[0] = 0xa4; + p[1] = hira_tab[tab->column][1]; + } else { + memcpy(p, e2sj(hira_tab[tab->column]), 2); + } + + strcpy((char *)p + 2, sfx); + break; + } + else if(!strncmp(sfx, "た", 2) || !strncmp(sfx, "て", 2)){ + switch( tab->onbin_type ){ + case NORMAL: + if(!IC){ + p[1] = hira_tab[tab->column + 1][1]; + } else { + memcpy(p, e2sj(hira_tab[tab->column + 1]), 2); + } + break; + case SOKUON: + if(!IC){ + p[1] = 0xf3; + } else { + memcpy(p, "ん", 2); + } + break; + case HATSUON: + if(!IC){ + p[1] = 0xc3; + } else { + memcpy(p, "っ", 2); + } + break; + case ION: + if(!IC){ + p[1] = 0xa4; + } else { + memcpy(p, "い", 2); + } + break; + } + strcpy((char *)p + 2, sfx); + if(tab->onbin_type == SOKUON || + (tab->onbin_type == ION && tab->column >= J_GA)){ + if(!IC){ + ++p[3]; + } else { + ++p[3]; + } +/* memcpy(p+2, e2sj(sj2e(p+2)+1), 2);*//* sj2e() returns ptr to char* */ + } + break; + } + else if(!strncmp(sfx, "ば", 2)){ + if(!IC){ + p[1] = hira_tab[tab->column + 3][1]; + } else { + memcpy(p, e2sj(hira_tab[tab->column + 3]), 2); + } + strcpy((char *)p + 2, sfx); + } + else if(!strncmp(sfx, "れ", 2)){ + if(!IC){ + p[1]=hira_tab[tab->column + 3][1]; + } else { + memcpy(p, e2sj(hira_tab[tab->column + 3]), 2); + } + strcpy((char *)p + 2, sfx + 2); + } + else if(!strncmp(sfx, "ま", 2)) { + if(!IC){ + p[1] = hira_tab[tab->column + 1][1]; + } else { + memcpy(p, e2sj(hira_tab[tab->column + 1]), 2); + } + strcpy((char *)p + 2, sfx); + break; + } + else if(!strncmp(sfx, "よ", 2)) { + if(!IC){ + p[1] = hira_tab[tab->column + 4][1]; + } else { + memcpy(p, e2sj(hira_tab[tab->column + 4]), 2); + } + strcpy((char *)p + 2, sfx + 2); + break; + } + break; + case LOWER: + case UPPER: + case KAHEN: + p = tmp + (len - 2); + if(!strncmp(sfx, "ば", 2)){ + strcpy((char *)p, "れ"); + strcpy((char *)p + 2, sfx); + } + else if(!strncmp(sfx, "れ", 2) && tab->katsuyo_type == LOWER){ + strcpy((char *)p, "ら"); + strcpy((char *)p + 2, sfx); + } + else + strcpy((char *)p, sfx); + break; + case SAHEN: + p = tmp + (len - 4); + if(!strncmp(sfx, "な", 2) || + !strncmp(sfx, "ま", 2) || + !strncmp(sfx, "た", 2) || + !strncmp(sfx, "て", 2) || + !strncmp(sfx, "よ", 2)){ + strcpy((char *)p, "し"); + strcpy((char *)p + 2, sfx); + } + else if(!strncmp(sfx, "ば", 2) || !strncmp(sfx, "れば", 4)){ + strcpy((char *)p, "すれば"); + } + break; + } + return (char *)tmp; +} + +/* 動詞の変化 */ +const char * +jconj( jverb, sfx ) + const char *jverb; + const char *sfx; +{ + struct _jconj_tab *tab; + int len; + + len = strlen(jverb); + for( tab = jconj_tab; tab->main != (void*)0; ++tab){ + if(!strcmp(jverb, tab->main)){ + return jconjsub(tab, jverb, sfx); + } + } + + for( tab = jconj_tab; tab->main != (void*)0; ++tab){ + if(len - strlen(tab->main) > 0 && + !strcmp(jverb + (len - strlen(tab->main)), tab->main)){ + return jconjsub(tab, jverb, sfx); + } + } + +#ifdef JAPANESETEST + fprintf( stderr, "I don't know such word \"%s\"\n"); +#endif + return jverb; +} + +/* 可能 */ +const char * +jcan(jverb) + const char *jverb; +{ + const char *ret; + static unsigned char tmp[1024]; + + int len = strlen(jverb); + if(!strcmp(jverb + len - 4, "する")){ + strncpy(tmp, jverb, len - 4); + strcpy(tmp + len - 4, "できる"); + return tmp; + } else { + ret = jconj(jverb, "れる"); + return ret; + } +} + +/* 不可能 */ +const char * +jcannot(jverb) + const char *jverb; +{ + static unsigned char tmp[1024]; + + int len = strlen(jverb); + if(!strcmp(jverb + len - 4, "する")){ + strncpy(tmp, jverb, len-4); + strcpy(tmp +len-4, "できない"); + return tmp; + } else { + return jconj(jverb, "れない"); + } +} + +/* 過去 */ +const char * +jpast(jverb) + const char *jverb; +{ + return jconj(jverb, "た"); +} + +/* 敬体 */ +const char * +jpolite(jverb) + const char *jverb; +{ + return jconj(jverb, "ます"); +} + + +/* +** conjection of adjective word +** +** Example: +** +** 形容詞的用法 副詞的用法 +** +** 赤い -> 赤く (形容詞) +** 綺麗な -> 綺麗に (形容動詞) +** 綺麗だ -> 綺麗に (形容動詞) +*/ +const char * +jconj_adj( jadj ) + const char *jadj; +{ + int len; + static unsigned char tmp[1024]; + + strcpy((char *)tmp, jadj); + len = strlen((char *)tmp); + + if(!strcmp((char *)tmp + len - 2, "い")){ + strcpy((char *)tmp + len - 2, "く"); + } else if(!strcmp((char *)tmp + len - 2, "だ") || + !strcmp((char *)tmp + len - 2, "な") || + !strcmp((char *)tmp + len - 2, "の")){ + strcpy((char *)tmp + len - 2, "に"); + } + + return (char *)tmp; +} + + +#ifdef JAPANESETEST +unsigned char +*e2sj(unsigned char *s) +{ + return *s; +} + +unsigned char +*sj2e(unsigned char *s) +{ + return *s; +} + +void +main() +{ + struct _jconj_tab *tab; + + for(tab = jconj_tab; tab->main != (void*)0; ++tab){ + printf("%-10s ない %s\n", tab->main, jconj(tab->main, "ない")); + printf("%-10s ます %s\n", tab->main, jconj(tab->main, "ます")); + printf("%-10s た %s\n", tab->main, jconj(tab->main, "た")); + printf("%-10s れば %s\n", tab->main, jconj(tab->main, "れば")); + printf("%-10s とき %s\n", tab->main, jconj(tab->main, "とき")); + printf("%-10s よう %s\n", tab->main, jconj(tab->main, "よう")); + printf("%-10s %s\n", tab->main, jcan(tab->main)); + printf("%-10s %s\n", tab->main, jcannot(tab->main)); + } + printf("%s\n", jconj("徹夜でnethackの翻訳をする", "ない")); + printf("%s\n", jconj("徹夜でnethackの翻訳をする", "ます")); + printf("%s\n", jconj("徹夜でnethackの翻訳をする", "た")); + printf("%s\n", jconj("徹夜でnethackの翻訳をする", "れば")); + printf("%s\n", jconj("徹夜でnethackの翻訳をする", "とき")); +} +#endif diff -aurbN -xCVS -xXTAGS nethack/japanese/jlib.c jnethack/japanese/jlib.c --- nethack/japanese/jlib.c 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/japanese/jlib.c 2005-07-31 03:04:31.000000000 +0900 @@ -0,0 +1,835 @@ +/* +** +** $Id: jlib.c,v 1.1.3.1 1999/11/17 06:35:05 issei Exp issei $ +** +*/ + +/* Copyright (c) Issei Numata 1994-2000 */ +/* JNetHack may be freely redistributed. See license for details. */ + +#include +#include +#include "hack.h" + +int xputc(CHAR_P); +int xputc2(int, int); + + +#define EUC 0 +#define SJIS 1 +#define JIS 2 + +/* internal kcode */ +/* IC=0 EUC */ +/* IC=1 SJIS */ +#define IC ((unsigned char)("漢"[0])==0x8a) + +/* default input kcode */ +#ifndef INPUT_KCODE +# ifdef MSDOS +# define INPUT_KCODE SJIS +# else +# define INPUT_KCODE EUC +# endif +#endif + +/* default output kcode */ +#ifndef OUTPUT_KCODE +# ifdef MSDOS +# define OUTPUT_KCODE SJIS +# else +# define OUTPUT_KCODE EUC +# endif +#endif + +static int output_kcode = OUTPUT_KCODE; +static int input_kcode = INPUT_KCODE; + +/* +** Kanji code library.... +*/ + +/* + * 引数が漢字(の1文字目)かどうかを調べる + */ +int +is_kanji(c) + unsigned c; +{ + if(IC == EUC) + return (c & 0x80); + else + return ((unsigned int)c>=0x81 && (unsigned int)c<=0x9f) + || ((unsigned int)c>=0xe0 && (unsigned int)c<=0xfc); +} + +void +setkcode(c) + int c; +{ + if(c == 'E' || c == 'e' ) + output_kcode = EUC; + else if(c == 'J' || c == 'j') + output_kcode = JIS; + else if(c == 'S' || c == 's') + output_kcode = SJIS; + else if(c == 'I' || c == 'i') +#ifdef MSDOS + output_kcode = SJIS; +#else + output_kcode = IC; +#endif + else{ + output_kcode = IC; + } + input_kcode = output_kcode; +} +/* +** EUC->SJIS +*/ + +unsigned char * +e2sj(s) + unsigned char *s; +{ + unsigned char h,l; + static unsigned char sw[2]; + + h = s[0] & 0x7f; + l = s[1] & 0x7f; + + sw[0] = ((h - 1) >> 1)+ ((h <= 0x5e) ? 0x71 : 0xb1); + sw[1] = l + ((h & 1) ? ((l < 0x60) ? 0x1f : 0x20) : 0x7e); + + return sw; +} +/* +** SJIS->EUC +*/ +unsigned char * +sj2e(s) + unsigned char *s; +{ + unsigned int h,l; + static unsigned char sw[2]; + + h = s[0]; + l = s[1]; + + h = h + h - ((h <=0x9f) ? 0x00e1 : 0x0161); + if( l<0x9f ) + l = l - ((l > 0x7f) ? 0x20 : 0x1f); + else{ + l = l-0x7e; + ++h; + } + sw[0] = h | 0x80; + sw[1] = l | 0x80; + return sw; +} +/* +** translate string to internal kcode +*/ +const char * +str2ic(s) + const char *s; +{ + static unsigned char buf[1024]; + const unsigned char *up; + unsigned char *p, *pp; + int kin; + + if(!s) + return s; + + buf[0] = '\0'; + + if( IC==input_kcode ){ + strcpy((char *)buf, s); + return (char *)buf; + } + + p = buf; + if( IC==EUC && input_kcode == SJIS ){ + while(*s){ + up = s; + if(is_kanji(*up)){ + pp = sj2e((unsigned char *)s); + *(p++) = pp[0]; + *(p++) = pp[1]; + s += 2; + } + else + *(p++) = (unsigned char)*(s++); + } + } + else if( IC==EUC && input_kcode == JIS ){ + kin = 0; + while(*s){ + if(s[0] == 033 && s[1] == '$' && (s[2] == 'B' || s[3] == '@')){ + kin = 1; + s += 3; + } + else if(s[0] == 033 && s[1] == '(' && (s[2] == 'B' || s[3] == 'J')){ + kin = 0; + s += 3; + } + else if( kin ) + *(p++) = (*(s++) | 0x80); + else + *(p++) = *(s++); + } + } + else{ + strcpy((char *)buf, s); + return (char *)buf; + } + + *(p++) = '\0'; + return (char *)buf; +} + +#ifdef SJIS_FILESYSTEM +/* +** translate string to output kcode +*/ +const char * +ic2str(s) + const char *s; +{ + static unsigned char buf[1024]; + const unsigned char *up; + unsigned char *p, *pp; + int kin; + + if(!s) + return s; + + buf[0] = '\0'; + + p = buf; + if( IC==EUC && output_kcode == SJIS ){ + while(*s){ + up = s; + if( *up & 0x80 ){ + pp = e2sj((unsigned char *)s); + *(p++) = pp[0]; + *(p++) = pp[1]; + s += 2; + } + else + *(p++) = (unsigned char)*(s++); + } + } + else{ + strcpy((char *)buf, s); + return (char *)buf; + } + + *(p++) = '\0'; + return (char *)buf; +} +#endif /* MSDOS */ + +/* +** primitive function +*/ + +static int kmode; /* 0: Kanji out */ + /* 1: Kanji in */ + +static void +tty_reset() +{ + if(kmode && output_kcode==JIS ){ + putchar(033); + putchar('('); + putchar('B'); +/* + if (flags.DECgraphics){ + putchar(033); + putchar('$'); + putchar(')'); + putchar('B'); + } +*/ + } + kmode = 0; +} + +/* print out 1 byte character to tty (no conversion) */ +static void +tty_cputc(unsigned int c) +{ + if(kmode && output_kcode==JIS ){ + putchar(033); + putchar('('); + putchar('B'); + } + kmode = 0; + +#if defined(NO_TERMS) && (defined(MSDOS) || defined(WIN32CON)) + xputc(c); +#else + putchar(c); +#endif +} + +/* print out 2 bytes character to tty (no conversion) */ +static void +tty_cputc2(unsigned int c, unsigned int c2) +{ + kmode = 1; + +#if defined(NO_TERMS) && (defined(MSDOS) || defined(WIN32CON)) + xputc2(c, c2); +#else + putchar(c); + putchar(c2); +#endif +} + +/* print out 1 byte character to tty (IC->output_kcode) */ +static void +tty_jputc(unsigned int c) +{ + if(kmode && output_kcode==JIS ){ + putchar(033); + putchar('('); + putchar('B'); + } + kmode = 0; + +#if defined(NO_TERMS) && (defined(MSDOS) || defined(WIN32CON)) + xputc(c); +#else + putchar(c); +#endif +} + +/* print out 2 bytes character to tty (IC->output_kcode) */ +static void +tty_jputc2(unsigned int c, unsigned int c2) +{ + if(!kmode && output_kcode==JIS ){ + putchar(033); + putchar('$'); + putchar('B'); + } + kmode = 1; + +#if defined(NO_TERMS) && (defined(MSDOS) || defined(WIN32CON)) + xputc2(c, c2); +#else + putchar(c); + putchar(c2); +#endif +} + +/* + * 2バイト文字をバッファリングしながら出力する + * 漢字コード変換も行う + */ +int +jbuffer( + unsigned int c, + unsigned int *buf, + void (*reset)(), + void (*f1)(unsigned int), + void (*f2)(unsigned int, unsigned int)) +{ + static unsigned int ibuf[2]; + unsigned int c1, c2; + unsigned char uc[2]; + unsigned char *p; + + if(!buf) buf = ibuf; + if(!reset) reset = tty_reset; + if(!f1) f1 = tty_jputc; + if(!f2) f2 = tty_jputc2; + + c = c & 0xff; + + if(!(buf[0]) && (is_kanji(c))){ + buf[1] = c; + ++buf[0]; + return 0; + } + else if(buf[0]){ + c1 = buf[1]; + c2 = c; + + if(IC == output_kcode) + ; + else if(IC == EUC){ + switch(output_kcode){ + case JIS: + c1 &= 0x7f; + c2 &= 0x7f; + break; + case SJIS: + uc[0] = c1; + uc[1] = c2; + p = e2sj(uc); + c1 = p[0]; + c2 = p[1]; + break; + default: + impossible("Unknown kcode!"); + break; + } + } + else if(IC == SJIS){ + uc[0] = c1; + uc[1] = c2; + p = sj2e(uc); + switch(output_kcode){ + case JIS: + c1 &= 0x7f; + c2 &= 0x7f; + break; + case EUC: + break; + default: + impossible("Unknown kcode!"); + break; + } + } + f2(c1, c2); + buf[0] = 0; + return 2; + } + else if(c){ + f1(c); + return 1; + } + reset(); + return -1; +} + +/* + * 2バイト文字をバッファリングしながら出力する + * 漢字コード変換は行わない + */ +int +cbuffer( + unsigned int c, + unsigned int *buf, + void (*reset)(), + void (*f1)(unsigned int), + void (*f2)(unsigned int, unsigned int)) +{ + static unsigned int ibuf[2]; + + if(!buf) buf = ibuf; + if(!reset) reset = tty_reset; + if(!f1) f1 = tty_cputc; + if(!f2) f2 = tty_cputc2; + + if(!(buf[0]) && is_kanji(c)){ + buf[1] = c; + ++buf[0]; + return 0; + } + else if(buf[0]){ + f2(buf[1], c); + buf[0] = 0; + return 2; + } + else if(c){ + f1(c); + return 1; + } + reset(); + return -1; +} + +void +jputchar(int c) +{ + static unsigned int buf[2]; + jbuffer((unsigned int)(c & 0xff), buf, NULL, NULL, NULL); +} +void +cputchar(int c) +{ + static unsigned int buf[2]; + cbuffer((unsigned int)(c & 0xff), buf, NULL, NULL, NULL); +} + +void +jputs(s) + const char *s; +{ + while(*s) + jputchar((unsigned char)*s++); + jputchar('\n'); +} + +int +is_kanji2(s, pos) + const char *s; + int pos; +{ + unsigned char *str; + + str = (unsigned char *)s; + while(*str && pos>0){ + if(is_kanji(*str)){ + str+=2; + pos-=2; + } + else{ + ++str; + --pos; + } + } + if(pos<0) + return 1; + else + return 0; +} + +int +is_kanji1(s, pos) + const char *s; + int pos; +{ + unsigned char *str; + + str = (unsigned char *)s; + while(*str && pos>0){ + if(is_kanji(*str)){ + str+=2; + pos-=2; + } + else{ + ++str; + --pos; + } + } + if(!pos && is_kanji(*str)) + return 1; + else + return 0; +} + +/* +** 8ビットスルーなisspace() +*/ +int +isspace_8(c) + int c; +{ + unsigned int *up; + + up = (unsigned int *)&c; + return *up<0x80 ? isspace(*up) : 0; +} +/* +** split string(str) including japanese before pos and return to +** str1, str2. +*/ +void +split_japanese( str, str1, str2, pos ) + char *str; + char *str1; + char *str2; + int pos; +{ + int len, i, j, k, mlen; + char *pstr; + char *pnstr; + int sq_brac; + +retry: + len = strlen((char *)str); + + if( len < pos ){ + strcpy(str1,str); + *str2 = '\0'; + return; + } + + if(pos > 20) + mlen = 20; + else + mlen = pos; + + i = pos; + if(is_kanji2(str, i)) + --i; + +/* 1: +** search space character +*/ + j = 0; + while( j 2){ + pos -= 2; + goto retry; + } +found: + + if(pos > 2){ + if((str[i-j] == ']' || + str[i-j] == ')' || + str[i-j] == '}')){ + pos -= 2; + goto retry; + } + else if(!strncmp(str+i-j, "]", 2) || + !strncmp(str+i-j, ")", 2) || + !strncmp(str+i-j, "}", 2)){ + pos -= 2; + goto retry; + } + else if(!strncmp(str+i-j,"?",2) || + !strncmp(str+i-j,"、",2) || + !strncmp(str+i-j,"。",2) || + !strncmp(str+i-j,",",2) || + !strncmp(str+i-j,".",2)){ + pos -= 2; + goto retry; + } + } + + pstr = str; + + pnstr = str1; + for( k=0 ; k= 0x30 && cc[1] <= 0x74) + cc[1] = rn2(94) + 0x21; + break; + } + + cc[0] |= 0x80; + cc[1] |= 0x80; + + if(IC==SJIS) + memcpy(c, (char *)e2sj(cc), 2); + else + memcpy(c, cc, 2); +} + +/* + * "put off"を対象によって適切に和訳する + */ +const char * +joffmsg(otmp, joshi) +register struct obj *otmp; +const char **joshi; +{ + static char buf[BUFSZ]; + + *joshi = "を"; + + if(otmp->oclass == RING_CLASS){ + Sprintf(buf, "%sからはずす", body_part(FINGER)); + return buf; + } + if( otmp->oclass == AMULET_CLASS){ + return "はずす"; + } + else if(is_helmet(otmp)) + return "取る"; + else if(is_gloves(otmp)) + return "はずす"; + else if(otmp->oclass == WEAPON_CLASS||is_shield(otmp)){ + *joshi = "の"; + return "装備を解く"; + } + else if(is_suit(otmp)) + return "脱ぐ"; + else + return "はずす"; +} + +/* + * "put on"を対象によって適切に和訳する + */ +const char * +jonmsg(otmp, joshi) +register struct obj *otmp; +const char **joshi; +{ + static char buf[BUFSZ]; + + *joshi = "を"; + + if(otmp->oclass == RING_CLASS){ + Sprintf(buf, "%sにはめる", body_part(FINGER)); + return buf; + } + else if(otmp->oclass == AMULET_CLASS) + return "身につける"; + else if(is_gloves(otmp)) + return "身につける"; + else if(is_shield(otmp)){ + *joshi = "で"; + return "身を守る"; + } + else if(is_helmet(otmp)) + return "かぶる"; + else if(otmp->oclass == WEAPON_CLASS){ + Sprintf(buf, "%sにする", body_part(HAND)); + return buf; + } + else if(is_boots(otmp)) + return "履く"; + else if(is_suit(otmp)) + return "着る"; + else + return "身につける"; +} + +/* + * 数詞を返す + */ +const char * +numeral(obj) +register struct obj *obj; +{ + switch(obj->oclass){ + case WEAPON_CLASS: + case WAND_CLASS: + if(obj->otyp==SHURIKEN) + return "枚"; + else + return "本"; + case ARMOR_CLASS: + return "着"; + case GEM_CLASS: + case ROCK_CLASS: + case BALL_CLASS: + return "個"; + case SCROLL_CLASS: + return "枚"; + case SPBOOK_CLASS: + return "冊"; + case POTION_CLASS: + case RING_CLASS: + case AMULET_CLASS: + case FOOD_CLASS: + if(obj->quan < 10L) + return "つ"; + else + return ""; + case COIN_CLASS: + return "枚"; + default: + switch(obj->otyp){ + case CREDIT_CARD: + case TOWEL: + case BLINDFOLD: + return "枚"; + case SKELETON_KEY: + case TALLOW_CANDLE: + case WAX_CANDLE: + case PICK_AXE: + case UNICORN_HORN: + case LEASH: + case STETHOSCOPE: + case MAGIC_MARKER: + return "本"; + case CRYSTAL_BALL: + return "個"; + break; + default: + if(obj->quan < 10L) + return "つ"; + else + return ""; + } + } +} diff -aurbN -xCVS -xXTAGS nethack/japanese/jpatchlevel.h jnethack/japanese/jpatchlevel.h --- nethack/japanese/jpatchlevel.h 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/japanese/jpatchlevel.h 2005-07-31 03:37:49.000000000 +0900 @@ -0,0 +1,13 @@ +/* +** +** $Id: jpatchlevel.h,v 1.1.3.1 1999/11/17 06:35:05 issei Exp issei $ +** +*/ + +/* Copyright (c) Issei Numata 1994-2000 */ +/* JNetHack may be freely redistributed. See license for details. */ + +#define JVERSION_MAJOR 0 +#define JVERSION_MINOR 7 +#define JPATCHLEVEL 0 +#define JEDITLEVEL 0 diff -aurbN -xCVS -xXTAGS nethack/japanese/jtrns.c jnethack/japanese/jtrns.c --- nethack/japanese/jtrns.c 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/japanese/jtrns.c 2005-07-31 03:05:46.000000000 +0900 @@ -0,0 +1,271 @@ +/* +** +** $Id: jtrns.c,v 1.1.3.1 1999/11/17 06:35:05 issei Exp issei $ +** +*/ + +/* Copyright (c) Issei Numata 1994-2000 */ +/* For 3.4, 2003 by Kentaro Shirakata */ +/* JNetHack may be freely redistributed. See license for details. */ + +#include "hack.h" + +#include +#ifdef NULL +#undef NULL +#define NULL ((void *)0) +#endif + +#include "jdata.h" + +/* mode +** +** 0 - English(Original) +** 1 - Japanese +*/ +static int lang_mode = 1; +static int trns_flg = 1; + +#include "hash.c" + +/* +** English -> Japanese +*/ +static const unsigned char * + get(key, type) +unsigned char *key; +int type; +{ + int i = hash_tab[hash_val(key)]; + + while ( 0 <= i ){ + const struct _jtrns_tab *p = &jtrns_tab[i]; + if ((type == ' ' || p->type == type) && + !strcmp((char *)p->key, (char *)key)) + return p->val; + i = p->next; + } + + return NULL; +} + +/* +** Japanese -> English +*/ +static const unsigned char * + rev_get(val, type) +unsigned char *val; +int type; +{ + int i = rhash_tab[hash_val(val)]; + + while ( 0 <= i ){ + const struct _jtrns_tab *p = &jtrns_tab[i]; + if ((type == ' ' || p->type == type) && + !strcmp((char *)p->val, (char *)val)) + return p->key; + i = p->rev_next; + } + + return NULL; +} + +void +init_jtrns() +{ + ; +} + +int +dotogglelang() +{ + lang_mode = (!lang_mode); + + switch(lang_mode){ + case 0: + pline("オリジナルモード"); + break; + case 1: + pline("日本語モード"); + break; + } + return 0; +} + +int +query_lang_mode() +{ + return lang_mode; +} +#if 0 +static void +set_lang_mode(ln) + int ln; +{ + lang_mode = ln; +} +#endif +void +set_trns_mode(flg) + int flg; +{ + trns_flg = flg; +} + +/* + モンスター名変換(性別つき) +*/ +const char * +jtrns_mon_gen(name, female) + const char *name; + int female; +{ + if(name == NULL) return NULL; + if(!trns_flg) return name; + + if(female){ + if(!strcmp(name, "werejackal") || !strcmp(name, "Werejackal")) + return "ジャッカル女"; + else if(!strcmp(name, "werewolf") || !strcmp(name, "Werewolf")) + return "狼女"; + else if(!strcmp(name, "wererat") || !strcmp(name, "Wererat")) + return "ねずみ女"; + } else { + if(!strcmp(name, "werejackal") || !strcmp(name, "Werejackal")) + return "ジャッカル男"; + else if(!strcmp(name, "werewolf") || !strcmp(name, "Werewolf")) + return "狼男"; + else if(!strcmp(name, "wererat") || !strcmp(name, "Wererat")) + return "ねずみ男"; + } + return jtrns_mon(name); +} + +/* + モンスター名変換(無性別) +*/ +const char * +jtrns_mon(name) + const char *name; +{ + const char *ret; + + if(name == NULL) return NULL; + if(!trns_flg) return name; + + ret = get(name, '@'); + + if(ret == NULL) return name; + + return ret; +} + +/* + * アイテム、罠などの変換 + */ +const char * +jtrns_obj(type, name) + const int type; + const char *name; +{ + const char *ret; + + if(name==NULL) + return NULL; + + if(!trns_flg) + return name; + + ret = (const char *)get(name, type); + if( ret==NULL ) + return name; + else + return ret; +} +#if 0 +/* +** this 2 functions does not transform +** if mode is original. +*/ +static const char * +jtrns_mon2(name) + const char *name; +{ + const char *ret; + + if(!lang_mode || !trns_flg) /* original mode */ + return name; + + if(name==NULL) + return NULL; + + ret = (const char *)get(name, '@'); + if( ret==NULL ) + return name; + return ret; +} +static const char * +jtrns_obj2(type,name) + const int type; + const char *name; +{ + const char *ret; + + if(!lang_mode || !trns_flg) /* original mode */ + return name; + + if(name==NULL) + return NULL; + + ret = (const char *)get(name, type); + if( ret==NULL ) + return name; + else + return ret; +} +#endif +/* +** +*/ +const char * +etrns_mon(name) + const char *name; +{ + const char *ret; + + if(name==NULL) + return NULL; + + ret = (const char *)rev_get(name, '@'); + if( ret==NULL ) + return name; + else + return ret; +} + +const char * +etrns_obj(type, name) + const int type; + const char *name; +{ + const char *ret; + + if(name==NULL) + return NULL; + + ret = (const char *)rev_get(name, type); + if( ret==NULL ) + return name; + else + return ret; +} +char +objclass_to_sym(oc) + const int oc; +{ + if(oc <= 0 || MAXOCLASSES <= oc) + return ' '; /* 'S'? */ + if(oc == ARMOR_CLASS) + return ']'; + return def_oc_syms[oc]; +} diff -aurbN -xCVS -xXTAGS nethack/src/allmain.c jnethack/src/allmain.c --- nethack/src/allmain.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/allmain.c 2003-12-10 03:31:09.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + /* various code that was replicated in *main.c */ #include "hack.h" @@ -28,14 +35,23 @@ flags.moonphase = phase_of_the_moon(); if(flags.moonphase == FULL_MOON) { +/*JP You("are lucky! Full moon tonight."); +*/ + pline("ラッキー!今晩は満月だ."); change_luck(1); } else if(flags.moonphase == NEW_MOON) { +/*JP pline("Be careful! New moon tonight."); +*/ + pline("注意しろ!今晩は新月だ."); } flags.friday13 = friday_13th(); if (flags.friday13) { +/*JP pline("Watch out! Bad things can happen on Friday the 13th."); +*/ + pline("用心しろ!13日の金曜日にはよくないことがある.") ; change_luck(-1); } @@ -199,7 +215,10 @@ } else if (!Upolyd && u.uhp > 1) { u.uhp--; } else { +/*JP You("pass out from exertion!"); +*/ + pline("疲労で意識を失った!"); exercise(A_CON, FALSE); fall_asleep(-10, FALSE); } @@ -363,11 +382,20 @@ u.utrap -= 1<<8; if(u.utrap < 1<<8) { killer_format = KILLED_BY; +/*JP killer = "molten lava"; +*/ + killer = "どろどろの溶岩で"; +/*JP You("sink below the surface and die."); +*/ + You("溶岩に深く沈み,溶けた."); done(DISSOLVED); } else if(didmove && !u.umoved) { +/*JP Norep("You sink deeper into the lava."); +*/ + Norep("溶岩に深く沈んだ."); u.utrap += rnd(4); } } @@ -431,7 +459,10 @@ { if(occupation) { if (!maybe_finished_meal(TRUE)) +/*JP You("stop %s.", occtxt); +*/ + You("%sのを中断した.", occtxt); occupation = 0; flags.botl = 1; /* in case u.uhs changed */ /* fainting stops your occupation, there's no reason to sync. @@ -560,16 +591,35 @@ */ *buf = '\0'; if (new_game || u.ualignbase[A_ORIGINAL] != u.ualignbase[A_CURRENT]) +/*JP Sprintf(eos(buf), " %s", align_str(u.ualignbase[A_ORIGINAL])); +*/ + Sprintf(eos(buf), "%s", align_str(u.ualignbase[A_ORIGINAL])); if (!urole.name.f && (new_game ? (urole.allow & ROLE_GENDMASK) == (ROLE_MALE|ROLE_FEMALE) : currentgend != flags.initgend)) +/*JP Sprintf(eos(buf), " %s", genders[currentgend].adj); +*/ + Sprintf(eos(buf), "の%s", genders[currentgend].j); +#if 0 /*JP*/ pline(new_game ? "%s %s, welcome to NetHack! You are a%s %s %s." : "%s %s, the%s %s %s, welcome back to NetHack!", Hello((struct monst *) 0), plname, buf, urace.adj, (currentgend && urole.name.f) ? urole.name.f : urole.name.m); +#else + if(new_game){ + pline("%s,NetHackの世界へ!このゲームではあなたは%sの%s(%s)だ.", + Hello((struct monst *) 0, TRUE), urace.j, + (currentgend && urole.jname.f) ? urole.jname.f : urole.jname.m, + buf); + } else { + pline("%s,NetHackの世界へ!あなたは%sの%sだ!", + Hello((struct monst *) 0, TRUE), urace.j, + (currentgend && urole.jname.f) ? urole.jname.f : urole.jname.m); + } +#endif } #ifdef POSITIONBAR diff -aurbN -xCVS -xXTAGS nethack/src/apply.c jnethack/src/apply.c --- nethack/src/apply.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/apply.c 2005-07-16 04:11:55.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "edog.h" @@ -46,7 +53,10 @@ void FDECL( amii_speaker, ( struct obj *, char *, int ) ); #endif +/*JP static const char no_elbow_room[] = "don't have enough elbow-room to maneuver."; +*/ +static const char no_elbow_room[] = "それをするだけのゆとりがない."; #ifdef TOURIST STATIC_OVL int @@ -56,7 +66,10 @@ register struct monst *mtmp; if(Underwater) { +/*JP pline("Using your camera underwater would void the warranty."); +*/ + pline("そんなことをしたら保証が効かなくなる."); return(0); } if(!getdir((char *)0)) return(0); @@ -70,10 +83,18 @@ if (obj->cursed && !rn2(2)) { (void) zapyourself(obj, TRUE); } else if (u.uswallow) { +#if 0 /*JP*/ You("take a picture of %s %s.", s_suffix(mon_nam(u.ustuck)), mbodypart(u.ustuck, STOMACH)); +#else + You("%sの%sの写真を撮った.", mon_nam(u.ustuck), + mbodypart(u.ustuck, STOMACH)); +#endif } else if (u.dz) { +/*JP You("take a picture of the %s.", +*/ + You("%sの写真を撮った.", (u.dz > 0) ? surface(u.ux,u.uy) : ceiling(u.ux,u.uy)); } else if (!u.dx && !u.dy) { (void) zapyourself(obj, TRUE); @@ -93,10 +114,16 @@ struct obj *obj; { if(!freehand()) { +/*JP You("have no free %s!", body_part(HAND)); +*/ + You("%sの自由が効かない!", body_part(HAND)); return 0; } else if (obj->owornmask) { +/*JP You("cannot use it while you're wearing it!"); +*/ + You("それを身につけているので使用できない!"); return 0; } else if (obj->cursed) { long old; @@ -104,25 +131,45 @@ case 2: old = Glib; Glib += rn1(10, 3); +#if 0 /*JP*/ Your("%s %s!", makeplural(body_part(HAND)), (old ? "are filthier than ever" : "get slimy")); +#else + Your("%sは%s!", makeplural(body_part(HAND)), + (old ? "ますます汚なくなった" : "ぬるぬるになった")); +#endif return 1; case 1: if (!ublindf) { old = u.ucreamed; u.ucreamed += rn1(10, 3); +#if 0 /*JP*/ pline("Yecch! Your %s %s gunk on it!", body_part(FACE), (old ? "has more" : "now has")); +#else + pline("ゲェー!あなたの%sは%sべとべとになった!", body_part(FACE), + (old ? "もっと" : "")); +#endif make_blinded(Blinded + (long)u.ucreamed - old, TRUE); } else { const char *what = (ublindf->otyp == LENSES) ? +/*JP "lenses" : "blindfold"; +*/ + "レンズ" : "目隠し"; if (ublindf->cursed) { +#if 0 /*JP*/ You("push your %s %s.", what, rn2(2) ? "cock-eyed" : "crooked"); +#else + pline("%sがずれた.", what); +#endif } else { struct obj *saved_ublindf = ublindf; +/*JP You("push your %s off.", what); +*/ + pline("%sがずり落ちた.", what); Blindf_off(ublindf); dropx(saved_ublindf); } @@ -135,23 +182,35 @@ if (Glib) { Glib = 0; +/*JP You("wipe off your %s.", makeplural(body_part(HAND))); +*/ + You("%sを拭いた.", makeplural(body_part(HAND))); return 1; } else if(u.ucreamed) { Blinded -= u.ucreamed; u.ucreamed = 0; if (!Blinded) { +/*JP pline("You've got the glop off."); +*/ + You("さっぱりした."); Blinded = 1; make_blinded(0L,TRUE); } else { +/*JP Your("%s feels clean now.", body_part(FACE)); +*/ + pline("%sの汚れを拭きとった.", body_part(FACE)); } return 1; } +/*JP Your("%s and %s are already clean.", +*/ + Your("%sや%sは汚れていない.", body_part(FACE), makeplural(body_part(HAND))); return 0; @@ -171,7 +230,10 @@ if (Hallucination && sobj_at(CORPSE, rx, ry)) { /* (a corpse doesn't retain the monster's sex, so we're forced to use generic pronoun here) */ +/*JP You_hear("a voice say, \"It's dead, Jim.\""); +*/ + You_hear("「それは死んでるぜ,ジム」という声が聞こえた."); *resp = 1; return TRUE; } else if (Role_if(PM_HEALER) && ((otmp = sobj_at(CORPSE, rx, ry)) != 0 || @@ -180,21 +242,36 @@ if both types are present, but it's not worth the effort */ if (vobj_at(rx, ry)->otyp == STATUE) otmp = vobj_at(rx, ry); if (otmp->otyp == CORPSE) { +#if 0 /*JP*/ You("determine that %s unfortunate being is dead.", (rx == u.ux && ry == u.uy) ? "this" : "that"); +#else + You("%s不幸な生き物は死んでいると結論した.", + (rx == u.ux && ry == u.uy) ? "この" : "その"); +#endif } else { ttmp = t_at(rx, ry); +#if 0 /*JP*/ pline("%s appears to be in %s health for a statue.", The(mons[otmp->corpsenm].mname), (ttmp && ttmp->ttyp == STATUE_TRAP) ? "extraordinary" : "excellent"); +#else + pline("彫像としての%sは%s作品だ.", + jtrns_mon(The(mons[otmp->corpsenm].mname)), + (ttmp && ttmp->ttyp == STATUE_TRAP) ? + "健康的な" : "躍動的な"); +#endif } return TRUE; } return FALSE; } +/*JP static const char hollow_str[] = "a hollow sound. This must be a secret %s!"; +*/ +static const char hollow_str[] = "うつろな音を聞いた.秘密の%sに違いない!"; /* Strictly speaking it makes no sense for usage of a stethoscope to not take any time; however, unless it did, the stethoscope would be @@ -213,10 +290,17 @@ !rn2(Role_if(PM_HEALER) ? 10 : 3)); if (nohands(youmonst.data)) { /* should also check for no ears and/or deaf */ +#if 0 /*JP*/ You("have no hands!"); /* not `body_part(HAND)' */ +#else + pline("あなたには手がない!"); +#endif return 0; } else if (!freehand()) { +/*JP You("have no free %s.", body_part(HAND)); +*/ + You("%sの自由が効かない.", body_part(HAND)); return 0; } if (!getdir((char *)0)) return 0; @@ -229,7 +313,10 @@ #ifdef STEED if (u.usteed && u.dz > 0) { if (interference) { +/*JP pline("%s interferes.", Monnam(u.ustuck)); +*/ + pline("%sがじゃまをした.", Monnam(u.ustuck)); mstatusline(u.ustuck); } else mstatusline(u.usteed); @@ -240,24 +327,44 @@ mstatusline(u.ustuck); return res; } else if (u.uswallow && interference) { +/*JP pline("%s interferes.", Monnam(u.ustuck)); +*/ + pline("%sがじゃまをした.", Monnam(u.ustuck)); mstatusline(u.ustuck); return res; } else if (u.dz) { if (Underwater) +/*JP You_hear("faint splashing."); +*/ + You_hear("かすかにバシャバシャという音を聞いた."); else if (u.dz < 0 || !can_reach_floor()) +#if 0 /*JP*/ You_cant("reach the %s.", (u.dz > 0) ? surface(u.ux,u.uy) : ceiling(u.ux,u.uy)); +#else + You("%sに届かない.", + (u.dz > 0) ? surface(u.ux,u.uy) : ceiling(u.ux,u.uy)); +#endif else if (its_dead(u.ux, u.uy, &res)) ; /* message already given */ else if (Is_stronghold(&u.uz)) +/*JP You_hear("the crackling of hellfire."); +*/ + You_hear("地獄の炎がパチパチ燃えている音を聞いた."); else +/*JP pline_The("%s seems healthy enough.", surface(u.ux,u.uy)); +*/ + pline("%sは充分健康のようだ.", surface(u.ux,u.uy)); return res; } else if (obj->cursed && !rn2(2)) { +/*JP You_hear("your heart beat."); +*/ + You_hear("自分の心臓の鼓動を聞いた."); return res; } if (Stunned || (Confusion && !rn2(5))) confdir(); @@ -267,7 +374,10 @@ } rx = u.ux + u.dx; ry = u.uy + u.dy; if (!isok(rx,ry)) { +/*JP You_hear("a faint typing noise."); +*/ + You_hear("かすかにだれかがタイピングしている音を聞いた."); return 0; } if ((mtmp = m_at(rx,ry)) != 0) { @@ -283,18 +393,27 @@ if (glyph_is_invisible(levl[rx][ry].glyph)) { unmap_object(rx, ry); newsym(rx, ry); +/*JP pline_The("invisible monster must have moved."); +*/ + pline_The("見えない怪物は移動してしまったようだ."); } lev = &levl[rx][ry]; switch(lev->typ) { case SDOOR: +/*JP You_hear(hollow_str, "door"); +*/ + You_hear(hollow_str, "扉"); cvt_sdoor_to_door(lev); /* ->typ = DOOR */ if (Blind) feel_location(rx,ry); else newsym(rx,ry); return res; case SCORR: +/*JP You_hear(hollow_str, "passage"); +*/ + You_hear(hollow_str, "通路"); lev->typ = CORR; unblock_point(rx,ry); if (Blind) feel_location(rx,ry); @@ -303,17 +422,27 @@ } if (!its_dead(rx, ry, &res)) +#if 0 /*JP*/ You("hear nothing special."); /* not You_hear() */ +#else + pline("別に何も聞こえない."); +#endif return res; } +/*JP static const char whistle_str[] = "produce a %s whistling sound."; +*/ +static char whistle_str[] = "笛を吹いて%s音をたてた."; STATIC_OVL void use_whistle(obj) struct obj *obj; { +/*JP You(whistle_str, obj->cursed ? "shrill" : "high"); +*/ + You(whistle_str, obj->cursed ? "不気味な" : "かん高い"); wake_nearby(); } @@ -324,11 +453,17 @@ register struct monst *mtmp, *nextmon; if(obj->cursed && !rn2(2)) { +/*JP You("produce a high-pitched humming noise."); +*/ + You("調子の高いうなるような音をたてた."); wake_nearby(); } else { int pet_cnt = 0; +/*JP You(whistle_str, Hallucination ? "normal" : "strange"); +*/ + You(whistle_str, Hallucination ? "笛のような" : "奇妙な"); for(mtmp = fmon; mtmp; mtmp = nextmon) { nextmon = mtmp->nmon; /* trap might kill mon */ if (DEADMONSTER(mtmp)) continue; @@ -386,9 +521,15 @@ if (feedback) { if (canseemon(mtmp)) +/*JP pline("%s pulls free of %s leash!", Monnam(mtmp), mhis(mtmp)); +*/ + pline("%sは紐を引っぱって逃れた!", Monnam(mtmp)); else +/*JP Your("leash falls slack."); +*/ + Your("紐がたるんで落ちた."); } for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp->otyp == LEASH && @@ -421,7 +562,10 @@ int spotmon; if(!obj->leashmon && number_leashed() >= MAXLEASHED) { +/*JP You("cannot leash any more pets."); +*/ + You("これ以上ペットに紐をかけられない."); return; } @@ -435,12 +579,18 @@ goto got_target; } #endif +/*JP pline("Leash yourself? Very funny..."); +*/ + pline("自分を縛る?変なの..."); return; } if(!(mtmp = m_at(cc.x, cc.y))) { +/*JP There("is no creature there."); +*/ + pline("そこには生き物はいない."); return; } @@ -451,38 +601,67 @@ if(!mtmp->mtame) { if(!spotmon) +/*JP There("is no creature there."); +*/ + pline("そこには生き物はいない."); else +#if 0 /*JP*/ pline("%s %s leashed!", Monnam(mtmp), (!obj->leashmon) ? "cannot be" : "is not"); +#else + pline("%sは紐で%s!", Monnam(mtmp), (!obj->leashmon) ? + "結べない" : "結ばれていない"); +#endif return; } if(!obj->leashmon) { if(mtmp->mleashed) { +#if 0 /*JP*/ pline("This %s is already leashed.", spotmon ? l_monnam(mtmp) : "monster"); +#else + pline("%sはすでに結びつけられている.", + spotmon ? l_monnam(mtmp) : "怪物"); +#endif return; } +#if 0 /*JP*/ You("slip the leash around %s%s.", spotmon ? "your " : "", l_monnam(mtmp)); +#else + You("%sを紐で結びつけた.", + l_monnam(mtmp)); +#endif mtmp->mleashed = 1; obj->leashmon = (int)mtmp->m_id; mtmp->msleeping = 0; return; } if(obj->leashmon != (int)mtmp->m_id) { +/*JP pline("This leash is not attached to that creature."); +*/ + pline("この紐はそれには結ばれていない."); return; } else { if(obj->cursed) { +/*JP pline_The("leash would not come off!"); +*/ + pline("紐がはずれない!"); obj->bknown = TRUE; return; } mtmp->mleashed = 0; obj->leashmon = 0; +#if 0 /*JP*/ You("remove the leash from %s%s.", spotmon ? "your " : "", l_monnam(mtmp)); +#else + You("%sから紐をはずした.", + l_monnam(mtmp)); +#endif } return; } @@ -520,8 +699,12 @@ if(otmp->otyp == LEASH && otmp->leashmon == (int)mtmp->m_id) { if(otmp->cursed) return(FALSE); +#if 0 /*JP*/ You_feel("%s leash go slack.", (number_leashed() > 1) ? "a" : "the"); +#else + You("紐がたるんだような気がした."); +#endif mtmp->mleashed = 0; otmp->leashmon = 0; } @@ -565,7 +748,10 @@ (mtmp->mhp -= rnd(2)) <= 0) { long save_pacifism = u.uconduct.killer; +/*JP Your("leash chokes %s to death!", mon_nam(mtmp)); +*/ + pline("%sは絞め殺された!",mon_nam(mtmp)); /* hero might not have intended to kill pet, but that's the result of his actions; gain experience, lose pacifism, take alignment and luck hit, make @@ -574,16 +760,25 @@ /* life-saving doesn't ordinarily reset this */ if (mtmp->mhp > 0) u.uconduct.killer = save_pacifism; } else { +/*JP pline("%s chokes on the leash!", Monnam(mtmp)); +*/ + pline("%sは紐で首を絞められた!", Monnam(mtmp)); /* tameness eventually drops to 1 here (never 0) */ if (mtmp->mtame && rn2(mtmp->mtame)) mtmp->mtame--; } } else { if (um_dist(mtmp->mx, mtmp->my, 5)) { +/*JP pline("%s leash snaps loose!", s_suffix(Monnam(mtmp))); +*/ + pline("%sの紐はパチンと外れた!", Monnam(mtmp)); m_unleash(mtmp, FALSE); } else { +/*JP You("pull on the leash."); +*/ + You("紐を引っぱった."); if (mtmp->data->msound != MS_SILENT) switch (rn2(3)) { case 0: growl(mtmp); break; @@ -601,7 +796,10 @@ #define WEAK 3 /* from eat.c */ +/*JP static const char look_str[] = "look %s."; +*/ +static const char look_str[] = "%s見える."; STATIC_OVL int use_mirror(obj) @@ -614,56 +812,111 @@ if(!getdir((char *)0)) return 0; if(obj->cursed && !rn2(2)) { if (!Blind) +/*JP pline_The("mirror fogs up and doesn't reflect!"); +*/ + pline("鏡は曇り,映らなくなった!"); return 1; } if(!u.dx && !u.dy && !u.dz) { if(!Blind && !Invisible) { if (u.umonnum == PM_FLOATING_EYE) { if (!Free_action) { +#if 0 /*JP*/ pline(Hallucination ? "Yow! The mirror stares back!" : "Yikes! You've frozen yourself!"); +#else + pline(Hallucination ? + "おゎ!鏡があなたをにらみ返した!" : + "おゎ!あなたは動けなくなった!"); +#endif nomul(-rnd((MAXULEV+6) - u.ulevel)); +/*JP } else You("stiffen momentarily under your gaze."); +*/ + } else pline("一瞬あなたのにらみで硬直した."); } else if (youmonst.data->mlet == S_VAMPIRE) +/*JP You("don't have a reflection."); +*/ + You("鏡に映らなかった."); else if (u.umonnum == PM_UMBER_HULK) { +/*JP pline("Huh? That doesn't look like you!"); +*/ + pline("ほえ?写ってるのはあなたじゃないみたいだ!"); make_confused(HConfusion + d(3,4),FALSE); } else if (Hallucination) +#if 0 /*JP*/ You(look_str, hcolor((char *)0)); +#else + You(look_str, jconj_adj(hcolor((char *)0))); +#endif else if (Sick) +/*JP You(look_str, "peaked"); +*/ + You(look_str, "顔色が悪く"); else if (u.uhs >= WEAK) +/*JP You(look_str, "undernourished"); +*/ + You(look_str, "栄養失調のように"); +#if 0 /*JP*/ else You("look as %s as ever.", ACURR(A_CHA) > 14 ? (poly_gender()==1 ? "beautiful" : "handsome") : "ugly"); +#else + else You("あいかわらず%s見える.", + ACURR(A_CHA) > 14 ? + (poly_gender()==1 ? "美しく" : "りりしく") : + "醜く"); +#endif } else { +#if 0 /*JP*/ You_cant("see your %s %s.", ACURR(A_CHA) > 14 ? (poly_gender()==1 ? "beautiful" : "handsome") : "ugly", body_part(FACE)); +#else + You("自分の%s%sを見ることができない.", + ACURR(A_CHA) > 14 ? + (poly_gender()==1 ? "美しい" : "りりしい") : + "醜い", + body_part(FACE)); +#endif } return 1; } if(u.uswallow) { +/*JP if (!Blind) You("reflect %s %s.", s_suffix(mon_nam(u.ustuck)), +*/ + if (!Blind) You("%sの%sを映した.", mon_nam(u.ustuck), mbodypart(u.ustuck, STOMACH)); return 1; } if(Underwater) { +#if 0 /*JP*/ You(Hallucination ? "give the fish a chance to fix their makeup." : "reflect the murky water."); +#else + pline(Hallucination ? + "魚がやってきて化粧直しをした.": + "あなたは陰気な水を映した."); +#endif return 1; } if(u.dz) { if (!Blind) +/*JP You("reflect the %s.", +*/ + You("%sを映した.", (u.dz > 0) ? surface(u.ux,u.uy) : ceiling(u.ux,u.uy)); return 1; } @@ -678,21 +931,36 @@ mlet = mtmp->data->mlet; if (mtmp->msleeping) { if (vis) +/*JP pline ("%s is too tired to look at your mirror.", +*/ + pline ("%sはとても疲れていて鏡を見ることができない.", Monnam(mtmp)); } else if (!mtmp->mcansee) { if (vis) +/*JP pline("%s can't see anything right now.", Monnam(mtmp)); +*/ + pline("%sは幻覚に襲われていて,ちゃんと見ることができない.", Monnam(mtmp)); /* some monsters do special things */ } else if (mlet == S_VAMPIRE || mlet == S_GHOST) { if (vis) +/*JP pline ("%s doesn't have a reflection.", Monnam(mtmp)); +*/ + pline ("%sは鏡に写らない.", Monnam(mtmp)); } else if(!mtmp->mcan && !mtmp->minvis && mtmp->data == &mons[PM_MEDUSA]) { +/*JP if (mon_reflects(mtmp, "The gaze is reflected away by %s %s!")) +*/ + if (mon_reflects(mtmp, "にらみは%sの%sで反射した!")) return 1; if (vis) +/*JP pline("%s is turned to stone!", Monnam(mtmp)); +*/ + pline("%sは石になった!", Monnam(mtmp)); stoned = TRUE; killed(mtmp); } else if(!mtmp->mcan && !mtmp->minvis && @@ -700,8 +968,14 @@ int tmp = d((int)mtmp->m_lev, (int)mtmp->data->mattk[0].damd); if (!rn2(4)) tmp = 120; if (vis) +/*JP pline("%s is frozen by its reflection.", Monnam(mtmp)); +*/ + pline("%sは自分の姿を見て動けなくなった.", Monnam(mtmp)); +/*JP else You_hear("%s stop moving.",something); +*/ + else You_hear("何かが動きをとめた音を聞いた."); mtmp->mcanmove = 0; if ( (int) mtmp->mfrozen + tmp > 127) mtmp->mfrozen = 127; @@ -709,14 +983,26 @@ } else if(!mtmp->mcan && !mtmp->minvis && mtmp->data == &mons[PM_UMBER_HULK]) { if (vis) +/*JP pline ("%s confuses itself!", Monnam(mtmp)); +*/ + pline ("%sは混乱した!", Monnam(mtmp)); mtmp->mconf = 1; } else if(!mtmp->mcan && !mtmp->minvis && (mlet == S_NYMPH || mtmp->data==&mons[PM_SUCCUBUS])) { if (vis) { +/*JP pline ("%s admires herself in your mirror.", Monnam(mtmp)); +*/ + pline ("%sは自分の姿にうっとりした.", Monnam(mtmp)); +/*JP pline ("She takes it!"); +*/ + pline ("彼女はそれを奪った!"); +/*JP } else pline ("It steals your mirror!"); +*/ + } else pline ("何者かがあなたの鏡を盗んだ!"); setnotworn(obj); /* in case mirror was wielded */ freeinv(obj); (void) mpickobj(mtmp,obj); @@ -724,18 +1010,29 @@ } else if (!is_unicorn(mtmp->data) && !humanoid(mtmp->data) && (!mtmp->minvis || perceives(mtmp->data)) && rn2(5)) { if (vis) +/*JP pline("%s is frightened by its reflection.", Monnam(mtmp)); +*/ + pline ("%sは自分の姿を見て怖がった.", Monnam(mtmp)); monflee(mtmp, d(2,4), FALSE, FALSE); } else if (!Blind) { if (mtmp->minvis && !See_invisible) ; else if ((mtmp->minvis && !perceives(mtmp->data)) || !haseyes(mtmp->data)) +/*JP pline("%s doesn't seem to notice its reflection.", +*/ + pline("%sは自分の姿に気がついてないようだ.", Monnam(mtmp)); else +#if 0 /*JP*/ pline("%s ignores %s reflection.", Monnam(mtmp), mhis(mtmp)); +#else + pline("%sは自分の姿を無視した.", + Monnam(mtmp)); +#endif } return 1; } @@ -751,17 +1048,26 @@ invoking = (obj->otyp == BELL_OF_OPENING && invocation_pos(u.ux, u.uy) && !On_stairs(u.ux, u.uy)); +/*JP You("ring %s.", the(xname(obj))); +*/ + You("%sを鳴らした.", the(xname(obj))); if (Underwater || (u.uswallow && ordinary)) { #ifdef AMIGA amii_speaker( obj, "AhDhGqEqDhEhAqDqFhGw", AMII_MUFFLED_VOLUME ); #endif +/*JP pline("But the sound is muffled."); +*/ + pline("しかし音はかき消された."); } else if (invoking && ordinary) { /* needs to be recharged... */ +/*JP pline("But it makes no sound."); +*/ + pline("しかし,音は鳴らなかった."); learno = TRUE; /* help player figure out why */ } else if (ordinary) { @@ -775,9 +1081,15 @@ !(mvitals[PM_MOUNTAIN_NYMPH].mvflags & G_GONE) && (mtmp = makemon(mkclass(S_NYMPH, 0), u.ux, u.uy, NO_MINVENT)) != 0) { +/*JP You("summon %s!", a_monnam(mtmp)); +*/ + You("%sを召喚した!", a_monnam(mtmp)); if (!obj_resists(obj, 93, 100)) { +/*JP pline("%s shattered!", Tobjnam(obj, "have")); +*/ + pline("%sは粉々になった!", xname(obj)); useup(obj); *optr = 0; } else switch (rn2(3)) { @@ -813,8 +1125,13 @@ wakem = TRUE; } else if (invoking) { +#if 0 /*JP*/ pline("%s an unsettling shrill sound...", Tobjnam(obj, "issue")); +#else + pline("%sは不気味な鋭い音を出した...", + xname(obj)); +#endif #ifdef AMIGA amii_speaker( obj, "aefeaefeaefeaefeaefe", AMII_LOUDER_VOLUME ); #endif @@ -835,9 +1152,15 @@ res += openit(); switch (res) { case 0: pline(nothing_happens); break; +/*JP case 1: pline("%s opens...", Something); +*/ + case 1: pline("何かが開いた..."); learno = TRUE; break; +/*JP default: pline("Things open around you..."); +*/ + default: pline("まわりの物が開いた..."); learno = TRUE; break; } @@ -862,47 +1185,86 @@ use_candelabrum(obj) register struct obj *obj; { +#if 0 /*JP*/ const char *s = (obj->spe != 1) ? "candles" : "candle"; +#endif if(Underwater) { +/*JP You("cannot make fire under water."); +*/ + You("水中で火はおこせない."); return; } if(obj->lamplit) { +/*JP You("snuff the %s.", s); +*/ + You("ろうそくを吹き消した."); end_burn(obj, TRUE); return; } if(obj->spe <= 0) { +/*JP pline("This %s has no %s.", xname(obj), s); +*/ + pline("この%sにはろうそくがない.", xname(obj)); return; } if(u.uswallow || obj->cursed) { if (!Blind) +#if 0 /*JP*/ pline_The("%s %s for a moment, then %s.", s, vtense(s, "flicker"), vtense(s, "die")); +#else + pline("ろうそくの炎はしばらく点滅し,消えた."); +#endif return; } if(obj->spe < 7) { +#if 0 /*JP*/ There("%s only %d %s in %s.", vtense(s, "are"), obj->spe, s, the(xname(obj))); +#else + pline("%sにはたった%d本のろうそくしかない.", + xname(obj), obj->spe); +#endif if (!Blind) +#if 0 /*JP*/ pline("%s lit. %s dimly.", obj->spe == 1 ? "It is" : "They are", Tobjnam(obj, "shine")); +#else + pline("%sに火をつけた.%sはほのかに輝いた.", + xname(obj), xname(obj)); +#endif } else { +#if 0 /*JP*/ pline("%s's %s burn%s", The(xname(obj)), s, (Blind ? "." : " brightly!")); +#else + pline("%sのろうそくは%s燃えあがった!", The(xname(obj)), + (Blind ? "" : "明るく")); +#endif } if (!invocation_pos(u.ux, u.uy)) { +/*JP pline_The("%s %s being rapidly consumed!", s, vtense(s, "are")); +*/ + pline("ろうそくはすごい速さで燃え始めた!"); obj->age /= 2; } else { if(obj->spe == 7) { if (Blind) +/*JP pline("%s a strange warmth!", Tobjnam(obj, "radiate")); +*/ + pline("奇妙な暖かさを%sに感じた!", xname(obj)); else +/*JP pline("%s with a strange light!", Tobjnam(obj, "glow")); +*/ + pline("%sは奇妙な光を発している!", xname(obj)); } obj->known = 1; } @@ -915,7 +1277,9 @@ { register struct obj *obj = *optr; register struct obj *otmp; +#if 0 /*JP*/ const char *s = (obj->quan != 1) ? "candles" : "candle"; +#endif char qbuf[QBUFSZ]; if(u.uswallow) { @@ -923,7 +1287,10 @@ return; } if(Underwater) { +/*JP pline("Sorry, fire and water don't mix."); +*/ + pline("残念ながら,火と水はまざらない."); return; } @@ -933,37 +1300,68 @@ return; } +#if 0 /*JP*/ Sprintf(qbuf, "Attach %s", the(xname(obj))); Sprintf(eos(qbuf), " to %s?", safe_qbuf(qbuf, sizeof(" to ?"), the(xname(otmp)), the(simple_typename(otmp->otyp)), "it")); +#else + Sprintf(qbuf, "%sを", the(xname(obj))); + Sprintf(eos(qbuf), "%sに取りつけますか?", + safe_qbuf(qbuf, sizeof("に取りつけますか?"), the(xname(otmp)), + the(simple_typename(otmp->otyp)), "それ")); +#endif if(yn(qbuf) == 'n') { if (!obj->lamplit) +/*JP You("try to light %s...", the(xname(obj))); +*/ + You("%sに火をつけようとした...", the(xname(obj))); use_lamp(obj); return; } else { if ((long)otmp->spe + obj->quan > 7L) obj = splitobj(obj, 7L - (long)otmp->spe); else *optr = 0; +#if 0 /*JP*/ You("attach %ld%s %s to %s.", obj->quan, !otmp->spe ? "" : " more", s, the(xname(otmp))); +#else + You("%ld本のろうそくを%s%sへ取りつけた.", + obj->quan, !otmp->spe ? "" : "さらに", + xname(otmp)); +#endif if (!otmp->spe || otmp->age > obj->age) otmp->age = obj->age; otmp->spe += (int)obj->quan; if (otmp->lamplit && !obj->lamplit) +/*JP pline_The("new %s magically %s!", s, vtense(s, "ignite")); +*/ + pline("新しいろうそくは不思議な炎をあげた!"); else if (!otmp->lamplit && obj->lamplit) +/*JP pline("%s out.", (obj->quan > 1L) ? "They go" : "It goes"); +*/ + pline("炎は消えた."); if (obj->unpaid) +#if 0 /*JP*/ verbalize("You %s %s, you bought %s!", otmp->lamplit ? "burn" : "use", (obj->quan > 1L) ? "them" : "it", (obj->quan > 1L) ? "them" : "it"); +#else + verbalize("火をつけたなら,買ってもらおう!"); +#endif if (obj->quan < 7L && otmp->spe == 7) +#if 0 /*JP*/ pline("%s now has seven%s candles attached.", The(xname(otmp)), otmp->lamplit ? " lit" : ""); +#else + pline("%sにはすでに7本の%sろうそくが取りつけられている.", + The(xname(otmp)), otmp->lamplit ? "火のついた" : ""); +#endif /* candelabrum's light range might increase */ if (otmp->lamplit) obj_merge_light_sources(otmp, otmp); /* candles are no longer a separate light source */ @@ -983,14 +1381,22 @@ otmp->lamplit) { char buf[BUFSZ]; xchar x, y; +#if 0 /*JP*/ register boolean many = candle ? otmp->quan > 1L : otmp->spe > 1; +#endif (void) get_obj_location(otmp, &x, &y, 0); if (otmp->where == OBJ_MINVENT ? cansee(x,y) : !Blind) +#if 0 /*JP*/ pline("%s %scandle%s flame%s extinguished.", Shk_Your(buf, otmp), (candle ? "" : "candelabrum's "), (many ? "s'" : "'s"), (many ? "s are" : " is")); +#else + pline("%s%sろうそくの炎は消えた.", + Shk_Your(buf, otmp), + candle ? "" : "燭台の"); +#endif end_burn(otmp, TRUE); return(TRUE); } @@ -1011,7 +1417,10 @@ obj->otyp == BRASS_LANTERN || obj->otyp == POT_OIL) { (void) get_obj_location(obj, &x, &y, 0); if (obj->where == OBJ_MINVENT ? cansee(x,y) : !Blind) +/*JP pline("%s %s out!", Yname2(obj), otense(obj, "go")); +*/ + pline("%sは消えた!", Yname2(obj)); end_burn(obj, TRUE); return TRUE; } @@ -1043,13 +1452,20 @@ obj->otyp == BRASS_LANTERN) && obj->cursed && !rn2(2)) return FALSE; if (obj->where == OBJ_MINVENT ? cansee(x,y) : !Blind) +/*JP pline("%s %s light!", Yname2(obj), otense(obj, "catch")); +*/ + pline("%sの明かりがついた!", Yname2(obj)); if (obj->otyp == POT_OIL) makeknown(obj->otyp); if (obj->unpaid && costly_spot(u.ux, u.uy) && (obj->where == OBJ_INVENT)) { /* if it catches while you have it, then it's your tough luck */ check_unpaid(obj); +#if 0 /*JP:T*/ verbalize("That's in addition to the cost of %s %s, of course.", Yname2(obj), obj->quan == 1 ? "itself" : "themselves"); +#else + verbalize("これはもちろん%sの値段とは別だよ.", Yname2(obj)); +#endif bill_dummy_object(obj); } begin_burn(obj, FALSE); @@ -1065,15 +1481,24 @@ char buf[BUFSZ]; if(Underwater) { +/*JP pline("This is not a diving lamp."); +*/ + pline("これは潜水用のランプじゃない."); return; } if(obj->lamplit) { if(obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP || obj->otyp == BRASS_LANTERN) +/*JP pline("%s lamp is now off.", Shk_Your(buf, obj)); +*/ + pline("%sランプの灯は消えた.", Shk_Your(buf, obj)); else +/*JP You("snuff out %s.", yname(obj)); +*/ + pline("%sを吹き消した.", yname(obj)); end_burn(obj, TRUE); return; } @@ -1081,27 +1506,50 @@ if ((!Is_candle(obj) && obj->age == 0) || (obj->otyp == MAGIC_LAMP && obj->spe == 0)) { if (obj->otyp == BRASS_LANTERN) +/*JP Your("lamp has run out of power."); +*/ + Your("ランプの電力を使い切ってしまった!"); +/*JP else pline("This %s has no oil.", xname(obj)); +*/ + else pline("この%sにはもうオイルがない.", xname(obj)); return; } if (obj->cursed && !rn2(2)) { +#if 0 /*JP*/ pline("%s for a moment, then %s.", Tobjnam(obj, "flicker"), otense(obj, "die")); +#else + pline("%sはしばらくの間点滅し,消えた.", + xname(obj)); +#endif } else { if(obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP || obj->otyp == BRASS_LANTERN) { check_unpaid(obj); +/*JP pline("%s lamp is now on.", Shk_Your(buf, obj)); +*/ + pline("%sランプに灯が灯った.", Shk_Your(buf, obj)); } else { /* candle(s) */ +#if 0 /*JP*/ pline("%s flame%s %s%s", s_suffix(Yname2(obj)), plur(obj->quan), otense(obj, "burn"), Blind ? "." : " brightly!"); +#else + pline("%sは%s燃えあがった!", + Yname2(obj), Blind ? "" : "明るく"); +#endif if (obj->unpaid && costly_spot(u.ux, u.uy) && obj->age == 20L * (long)objects[obj->otyp].oc_cost) { +#if 0 /*JP*/ const char *ithem = obj->quan > 1L ? "them" : "it"; verbalize("You burn %s, you bought %s!", ithem, ithem); +#else + verbalize("灯をつけたなら,買ってもらおう!"); +#endif bill_dummy_object(obj); } } @@ -1121,7 +1569,10 @@ } if (obj->lamplit) { +/*JP You("snuff the lit potion."); +*/ + You("油瓶の火を吹き消した."); end_burn(obj, TRUE); /* * Free & add to re-merge potion. This will average the @@ -1132,18 +1583,29 @@ (void) addinv(obj); return; } else if (Underwater) { +/*JP There("is not enough oxygen to sustain a fire."); +*/ + pline("火をつけるのに十分な酸素がない."); return; } +#if 0 /*JP*/ You("light %s potion.%s", shk_your(buf, obj), Blind ? "" : " It gives off a dim light."); +#else + You("%s油瓶に火をつけた.%s", shk_your(buf, obj), + Blind ? "" : "油瓶は暗い光をはなった."); +#endif if (obj->unpaid && costly_spot(u.ux, u.uy)) { /* Normally, we shouldn't both partially and fully charge * for an item, but (Yendorian Fuel) Taxes are inevitable... */ check_unpaid(obj); +/*JP verbalize("That's in addition to the cost of the potion, of course."); +*/ + verbalize("これはもちろん油瓶の値段とは別だよ."); bill_dummy_object(obj); } makeknown(obj->otyp); @@ -1154,7 +1616,10 @@ obj_extract_self(obj); /* free from inv */ /* shouldn't merge */ +/*JP obj = hold_another_object(obj, "You drop %s!", +*/ + obj = hold_another_object(obj, "あなたは%sを落した!", doname(obj), (const char *)0); } else begin_burn(obj, FALSE); @@ -1172,7 +1637,10 @@ use_stone(obj); return 1; } else { +/*JP pline("Sorry, I don't know how to use that."); +*/ + pline("残念.使い方がわからない."); return 0; } } @@ -1191,12 +1659,21 @@ if (uwep->lamplit) begin_burn(uwep, TRUE); update_inventory(); } else if (rn2(2) && !Blind) +/*JP You("see a puff of smoke."); +*/ + pline("けむりが舞いあがった."); else pline(nothing_happens); } else if (obj->otyp == BRASS_LANTERN) { /* message from Adventure */ +/*JP pline("Rubbing the electric lamp is not particularly rewarding."); +*/ + pline("電気ランプをこすっても意味はないと思うが..."); +/*JP pline("Anyway, nothing exciting happens."); +*/ + pline("やっぱり,何も起きなかった."); } else pline(nothing_happens); return 1; } @@ -1217,49 +1694,88 @@ if (!magic && (nolimbs(youmonst.data) || slithy(youmonst.data))) { /* normally (nolimbs || slithy) implies !Jumping, but that isn't necessarily the case for knights */ +/*JP You_cant("jump; you have no legs!"); +*/ + pline("足が無くては跳べない!"); return 0; } else if (!magic && !Jumping) { +/*JP You_cant("jump very far."); +*/ + You_cant("そんな遠くまで跳べない."); return 0; } else if (u.uswallow) { if (magic) { +/*JP You("bounce around a little."); +*/ + pline("反動をつけた."); return 1; } +/*JP pline("You've got to be kidding!"); +*/ + pline("冗談はよしこさん!"); return 0; } else if (u.uinwater) { if (magic) { +/*JP You("swish around a little."); +*/ + pline("スイスイと泳いだ."); return 1; } +/*JP pline("This calls for swimming, not jumping!"); +*/ + pline("それは『泳ぐ』であって,『跳ぶ』じゃない!"); return 0; } else if (u.ustuck) { if (u.ustuck->mtame && !Conflict && !u.ustuck->mconf) { +/*JP You("pull free from %s.", mon_nam(u.ustuck)); +*/ + You("%sから離れた.", mon_nam(u.ustuck)); u.ustuck = 0; return 1; } if (magic) { +/*JP You("writhe a little in the grasp of %s!", mon_nam(u.ustuck)); +*/ + You("%sから逃れようとジタバタした!", mon_nam(u.ustuck)); return 1; } +/*JP You("cannot escape from %s!", mon_nam(u.ustuck)); +*/ + You("%sから逃れられない!", mon_nam(u.ustuck)); return 0; } else if (Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) { if (magic) { +/*JP You("flail around a little."); +*/ + You("バタバタ跳んだ."); return 1; } +/*JP You("don't have enough traction to jump."); +*/ + You("跳ぶための反動がつけられない."); return 0; } else if (!magic && near_capacity() > UNENCUMBERED) { +/*JP You("are carrying too much to jump!"); +*/ + You("たくさん物を持ちすぎて跳べない!"); return 0; } else if (!magic && (u.uhunger <= 100 || ACURR(A_STR) < 6)) { +/*JP You("lack the strength to jump!"); +*/ + You("跳ぶだけの力がない!"); return 0; } else if (Wounded_legs) { long wl = (Wounded_legs & BOTH_SIDES); @@ -1268,42 +1784,72 @@ if (wl == BOTH_SIDES) bp = makeplural(bp); #ifdef STEED if (u.usteed) +/*JP pline("%s is in no shape for jumping.", Monnam(u.usteed)); +*/ + pline("%sは跳べる状態ではない.", Monnam(u.usteed)); else #endif +#if 0 /*JP*/ Your("%s%s %s in no shape for jumping.", (wl == LEFT_SIDE) ? "left " : (wl == RIGHT_SIDE) ? "right " : "", bp, (wl == BOTH_SIDES) ? "are" : "is"); +#else + Your("%s%sは跳べる状態ではない.", + (wl == LEFT_SIDE) ? "左" : + (wl == RIGHT_SIDE) ? "右" : "", bp); +#endif return 0; } #ifdef STEED else if (u.usteed && u.utrap) { +/*JP pline("%s is stuck in a trap.", Monnam(u.usteed)); +*/ + pline("%sは罠にひっかかっている.", Monnam(u.usteed)); return (0); } #endif +/*JP pline("Where do you want to jump?"); +*/ + pline("どこに跳びますか?"); cc.x = u.ux; cc.y = u.uy; +/*JP if (getpos(&cc, TRUE, "the desired position") < 0) +*/ + if (getpos(&cc, TRUE, "跳びたい場所") < 0) return 0; /* user pressed ESC */ if (!magic && !(HJumping & ~INTRINSIC) && !EJumping && distu(cc.x, cc.y) != 5) { /* The Knight jumping restriction still applies when riding a * horse. After all, what shape is the knight piece in chess? */ +/*JP pline("Illegal move!"); +*/ + pline("その移動は桂馬跳びじゃない!"); return 0; } else if (distu(cc.x, cc.y) > (magic ? 6+magic*3 : 9)) { +/*JP pline("Too far!"); +*/ + pline("遠すぎる!"); return 0; } else if (!cansee(cc.x, cc.y)) { +/*JP You("cannot see where to land!"); +*/ + You("着地点が見えない!"); return 0; } else if (!isok(cc.x, cc.y)) { +/*JP You("cannot jump there!"); +*/ + You("そこには飛べない!"); return 0; } else { coord uc; @@ -1313,24 +1859,42 @@ switch(u.utraptype) { case TT_BEARTRAP: { register long side = rn2(3) ? LEFT_SIDE : RIGHT_SIDE; +/*JP You("rip yourself free of the bear trap! Ouch!"); +*/ + You("自分を熊の罠からひきはがした,いてっ!"); +/*JP losehp(rnd(10), "jumping out of a bear trap", KILLED_BY); +*/ + losehp(rnd(10), "熊の罠から飛び出ようとして", KILLED_BY); set_wounded_legs(side, rn1(1000,500)); break; } case TT_PIT: +/*JP You("leap from the pit!"); +*/ + You("落し穴から飛び出た!"); break; case TT_WEB: +/*JP You("tear the web apart as you pull yourself free!"); +*/ + You("くもの巣を引き裂き,自由になった!"); deltrap(t_at(u.ux,u.uy)); break; case TT_LAVA: +/*JP You("pull yourself above the lava!"); +*/ + You("溶岩から飛び出た!"); u.utrap = 0; return 1; case TT_INFLOOR: +/*JP You("strain your %s, but you're still stuck in the floor.", +*/ + You("%sを引っぱった,しかし,あなたはまだ床にうまっている.", makeplural(body_part(LEG))); set_wounded_legs(LEFT_SIDE, rn1(10, 11)); set_wounded_legs(RIGHT_SIDE, rn1(10, 11)); @@ -1384,12 +1948,18 @@ * moves, we've got to deal with decaying corpses... */ if (obj->spe <= 0) { +/*JP You("seem to be out of tins."); +*/ + pline("缶詰を作るための缶が切れたようだ."); return; } if (!(corpse = floorfood("tin", 2))) return; if (corpse->oeaten) { +/*JP You("cannot tin %s which is partly eaten.",something); +*/ + You("食べかけのものを缶詰にすることはできない."); return; } if (touch_petrifies(&mons[corpse->corpsenm]) @@ -1397,29 +1967,53 @@ char kbuf[BUFSZ]; if (poly_when_stoned(youmonst.data)) +#if 0 /*JP*/ You("tin %s without wearing gloves.", an(mons[corpse->corpsenm].mname)); +#else + You("小手なしで%sを缶詰にしようとした.", + jtrns_mon(mons[corpse->corpsenm].mname)); +#endif else { +#if 0 /*JP*/ pline("Tinning %s without wearing gloves is a fatal mistake...", an(mons[corpse->corpsenm].mname)); +#else + pline("%sを小手なしで缶詰にするのは致命的な間違いだ...", + jtrns_mon(mons[corpse->corpsenm].mname)); +#endif +#if 0 /*JP*/ Sprintf(kbuf, "trying to tin %s without gloves", an(mons[corpse->corpsenm].mname)); +#else + Sprintf(kbuf, "小手をつけずに%sを缶詰にしようとして", + jtrns_mon(mons[corpse->corpsenm].mname)); +#endif } instapetrify(kbuf); } if (is_rider(&mons[corpse->corpsenm])) { (void) revive_corpse(corpse); +/*JP verbalize("Yes... But War does not preserve its enemies..."); +*/ + verbalize("そうだ...しかし「戦争」は敵に安らぎを与えぬ..."); return; } if (mons[corpse->corpsenm].cnutrit == 0) { +/*JP pline("That's too insubstantial to tin."); +*/ + pline("実体がないので缶詰にできない."); return; } consume_obj_charge(obj, TRUE); if ((can = mksobj(TIN, FALSE, FALSE)) != 0) { +/*JP static const char you_buy_it[] = "You tin it, you bought it!"; +*/ + static const char you_buy_it[] = "缶詰にしたのなら買ってもらうよ!"; can->corpsenm = corpse->corpsenm; can->cursed = obj->cursed; @@ -1436,7 +2030,10 @@ verbalize(you_buy_it); useupf(corpse, 1L); } +/*JP can = hold_another_object(can, "You make, but cannot pick up, %s.", +*/ + can = hold_another_object(can, "缶詰にできたが,%sを持つことができない.", doname(can), (const char *)0); } else impossible("Tinning failed."); } @@ -1461,8 +2058,13 @@ case 1: make_blinded(Blinded + lcount, TRUE); break; case 2: if (!Confusion) +#if 0 /*JP*/ You("suddenly feel %s.", Hallucination ? "trippy" : "confused"); +#else + You("突然%s.", + Hallucination ? "へろへろになった" : "混乱した"); +#endif make_confused(HConfusion + lcount, TRUE); break; case 3: make_stunned(HStun + lcount, TRUE); @@ -1572,11 +2174,20 @@ } if (did_attr) +#if 0 /*JP*/ pline("This makes you feel %s!", (did_prop + did_attr) == (trouble_count + unfixable_trbl) ? "great" : "better"); +#else + pline("気分が%sよくなった!", + (did_prop + did_attr) == (trouble_count + unfixable_trbl) ? + "とても" : "より"); +#endif else if (!did_prop) +/*JP pline("Nothing seems to happen."); +*/ + pline("何も起きなかったようだ."); flags.botl = (did_attr || did_prop); #undef PROP_COUNT @@ -1629,17 +2240,31 @@ switch (figurine->where) { case OBJ_INVENT: if (Blind) +#if 0 /*JP*/ You_feel("%s %s from your pack!", something, locomotion(mtmp->data,"drop")); +#else + You_feel("%sがあなたの鞄から%s!", something, + jpast(locomotion(mtmp->data,"落ちる"))); +#endif else +#if 0 /*JP*/ You("see %s %s out of your pack!", monnambuf, locomotion(mtmp->data,"drop")); +#else + You("%sがあなたの鞄から%s!", + monnambuf, + jpast(locomotion(mtmp->data,"落ちる"))); +#endif break; case OBJ_FLOOR: if (cansee_spot && !silent) { +/*JP You("suddenly see a figurine transform into %s!", +*/ + You("突然人形は%sになった!", monnambuf); redraw = TRUE; /* update figurine's map location */ } @@ -1651,15 +2276,29 @@ mon = figurine->ocarry; /* figurine carring monster might be invisible */ if (canseemon(figurine->ocarry)) { +/*JP Sprintf(carriedby, "%s pack", +*/ + Sprintf(carriedby, "%sの鞄", s_suffix(a_monnam(mon))); } else if (is_pool(mon->mx, mon->my)) +/*JP Strcpy(carriedby, "empty water"); +*/ + Strcpy(carriedby, "何もない水中"); else +/*JP Strcpy(carriedby, "thin air"); +*/ + Strcpy(carriedby, "何もない空中"); +#if 0 /*JP*/ You("see %s %s out of %s!", monnambuf, locomotion(mtmp->data, "drop"), carriedby); +#else + You("%sが%sから%sのを見た!", monnambuf, + carriedby, locomotion(mtmp->data, "落ちる")); +#endif } break; #if 0 @@ -1689,26 +2328,40 @@ if (carried(obj) && u.uswallow) { if (!quietly) +/*JP You("don't have enough room in here."); +*/ + pline("ここには十分な場所がない."); return FALSE; } x = cc->x; y = cc->y; if (!isok(x,y)) { if (!quietly) +/*JP You("cannot put the figurine there."); +*/ + You("ここには人形を置けない."); return FALSE; } if (IS_ROCK(levl[x][y].typ) && !(passes_walls(&mons[obj->corpsenm]) && may_passwall(x,y))) { if (!quietly) +#if 0 /*JP*/ You("cannot place a figurine in %s!", IS_TREE(levl[x][y].typ) ? "a tree" : "solid rock"); +#else + You("%sの中には人形を置けない!", + IS_TREE(levl[x][y].typ) ? "木" : "固い石"); +#endif return FALSE; } if (sobj_at(BOULDER,x,y) && !passes_walls(&mons[obj->corpsenm]) && !throws_rocks(&mons[obj->corpsenm])) { if (!quietly) +/*JP You("cannot fit the figurine on the boulder."); +*/ + You("岩の上には人形を置けない."); return FALSE; } return TRUE; @@ -1735,6 +2388,7 @@ cc.x = x; cc.y = y; /* Passing FALSE arg here will result in messages displayed */ if (!figurine_location_checks(obj, &cc, FALSE)) return; +#if 0 /*JP*/ You("%s and it transforms.", (u.dx||u.dy) ? "set the figurine beside you" : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz) || @@ -1743,6 +2397,15 @@ (u.dz < 0 ? "toss the figurine into the air" : "set the figurine on the ground")); +#else + You("%s.するとそれは変形した.", + (u.dx||u.dy) ? "そばに人形を置いた" : + (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) ? + "人形を放った" : + (u.dz < 0 ? + "人形を空中に投げた" : + "人形を地面に置いた")); +#endif (void) make_familiar(obj, cc.x, cc.y, FALSE); (void) stop_timer(FIG_TRANSFORM, (genericptr_t)obj); useup(obj); @@ -1751,7 +2414,10 @@ static NEARDATA const char lubricables[] = { ALL_CLASSES, ALLOW_NONE, 0 }; static NEARDATA const char need_to_remove_outer_armor[] = +/*JP "need to remove your %s to grease your %s."; +*/ + "%sに油を塗るには%sをはずす必要がある."; STATIC_OVL void use_grease(obj) @@ -1761,8 +2427,13 @@ char buf[BUFSZ]; if (Glib) { +#if 0 /*JP*/ pline("%s from your %s.", Tobjnam(obj, "slip"), makeplural(body_part(FINGER))); +#else + pline("%sはあなたの%sから滑り落ちた.", xname(obj), + body_part(FINGER)); +#endif dropx(obj); return; } @@ -1771,8 +2442,13 @@ if ((obj->cursed || Fumbling) && !rn2(2)) { consume_obj_charge(obj, TRUE); +#if 0 /*JP*/ pline("%s from your %s.", Tobjnam(obj, "slip"), makeplural(body_part(FINGER))); +#else + pline("%sはあなたの%sから滑り落ちた.", xname(obj), + body_part(FINGER)); +#endif dropx(obj); return; } @@ -1780,39 +2456,64 @@ if (!otmp) return; if ((otmp->owornmask & WORN_ARMOR) && uarmc) { Strcpy(buf, xname(uarmc)); +/*JP You(need_to_remove_outer_armor, buf, xname(otmp)); +*/ + You(need_to_remove_outer_armor, xname(otmp), buf); return; } #ifdef TOURIST if ((otmp->owornmask & WORN_SHIRT) && (uarmc || uarm)) { +#if 0 /*JP*/ Strcpy(buf, uarmc ? xname(uarmc) : ""); if (uarmc && uarm) Strcat(buf, " and "); Strcat(buf, uarm ? xname(uarm) : ""); You(need_to_remove_outer_armor, buf, xname(otmp)); +#else + Strcpy(buf, uarmc ? xname(uarmc) : ""); + if (uarmc && uarm) Strcat(buf, "と"); + Strcat(buf, uarm ? xname(uarm) : ""); + You(need_to_remove_outer_armor, xname(otmp), buf); +#endif return; } #endif consume_obj_charge(obj, TRUE); if (otmp != &zeroobj) { +/*JP You("cover %s with a thick layer of grease.", +*/ + You("%sに脂を丹念に塗った.", yname(otmp)); otmp->greased = 1; if (obj->cursed && !nohands(youmonst.data)) { incr_itimeout(&Glib, rnd(15)); +/*JP pline("Some of the grease gets all over your %s.", +*/ + pline("脂が少し%sについた.", makeplural(body_part(HAND))); } } else { Glib += rnd(15); +/*JP You("coat your %s with grease.", +*/ + You("%sに脂を塗った.", makeplural(body_part(FINGER))); } } else { if (obj->known) +/*JP pline("%s empty.", Tobjnam(obj, "are")); +*/ + pline("%sは空っぽだ.", xname(obj)); else +/*JP pline("%s to be empty.", Tobjnam(obj, "seem")); +*/ + pline("%sは空っぽのようだ.", xname(obj)); } update_inventory(); } @@ -1840,7 +2541,10 @@ boolean do_scratch; const char *streak_color, *choices; char stonebuf[QBUFSZ]; +/*JP static const char scritch[] = "\"scritch, scritch\""; +*/ + static const char scritch[] = "「ゴシ,ゴシ」"; static const char allowall[3] = { COIN_CLASS, ALL_CLASSES, 0 }; static const char justgems[3] = { ALLOW_NONE, GEM_CLASS, 0 }; #ifndef GOLDOBJ @@ -1853,7 +2557,10 @@ junk as likely candidates for rubbing */ choices = (tstone->otyp == TOUCHSTONE && tstone->dknown && objects[TOUCHSTONE].oc_name_known) ? justgems : allowall; +/*JP Sprintf(stonebuf, "rub on the stone%s", plur(tstone->quan)); +*/ + Sprintf(stonebuf, "rub on the stone"); if ((obj = getobj(choices, stonebuf)) == 0) return; #ifndef GOLDOBJ @@ -1866,7 +2573,11 @@ #endif if (obj == tstone && obj->quan == 1) { +#if 0 /*JP*/ You_cant("rub %s on itself.", the(xname(obj))); +#else + You("%sをそれ自体でこすることはできない.", the(xname(obj))); +#endif return; } @@ -1874,12 +2585,25 @@ obj->oclass == GEM_CLASS && !is_graystone(obj) && !obj_resists(obj, 80, 100)) { if (Blind) +#if 0 /*JP*/ pline("You feel something shatter."); +#else + You("何かが粉々になるのを感じた."); +#endif else if (Hallucination) +#if 0 /*JP*/ pline("Oh, wow, look at the pretty shards."); +#else + pline("ワーォ!なんてきれいな破片なんだ."); +#endif else +#if 0 /*JP*/ pline("A sharp crack shatters %s%s.", (obj->quan > 1) ? "one of " : "", the(xname(obj))); +#else + pline("強くこすりすぎて%s%sは粉々になってしまった.", + the(xname(obj)), (obj->quan > 1) ? "のひとつ" : ""); +#endif #ifndef GOLDOBJ /* assert(obj != &goldobj); */ #endif @@ -1891,7 +2615,11 @@ pline(scritch); return; } else if (Hallucination) { +#if 0 /*JP*/ pline("Oh wow, man: Fractals!"); +#else + pline("ワーォ!フラクタル模様だ!"); +#endif return; } @@ -1923,27 +2651,55 @@ default: switch (objects[obj->otyp].oc_material) { case CLOTH: +#if 0 /*JP*/ pline("%s a little more polished now.", Tobjnam(tstone, "look")); +#else + pline("%sはさらにつやが出たように見える.", xname(tstone)); +#endif return; case LIQUID: if (!obj->known) /* note: not "whetstone" */ +#if 0 /*JP*/ You("must think this is a wetstone, do you?"); +#else + You("これは砥石だと思った?"); +#endif else +#if 0 /*JP*/ pline("%s a little wetter now.", Tobjnam(tstone, "are")); +#else + pline("%sは少しぬれた.", xname(tstone)); +#endif return; case WAX: +#if 0 /*JP*/ streak_color = "waxy"; +#else + streak_color = "脂っぽい"; +#endif break; /* okay even if not touchstone */ case WOOD: +#if 0 /*JP*/ streak_color = "wooden"; +#else + streak_color = "おがくずのような"; +#endif break; /* okay even if not touchstone */ case GOLD: do_scratch = TRUE; /* scratching and streaks */ +#if 0 /*JP*/ streak_color = "golden"; +#else + streak_color = "金色の"; +#endif break; case SILVER: do_scratch = TRUE; /* scratching and streaks */ +#if 0 /*JP*/ streak_color = "silvery"; +#else + streak_color = "銀色の"; +#endif break; default: /* Objects passing the is_flimsy() test will not @@ -1958,13 +2714,24 @@ break; /* default oclass */ } +#if 0 /*JP*/ Sprintf(stonebuf, "stone%s", plur(tstone->quan)); +#endif if (do_scratch) +#if 0 /*JP*/ pline("You make %s%sscratch marks on the %s.", streak_color ? streak_color : (const char *)"", streak_color ? " " : "", stonebuf); +#else + You("%sこすり跡を石につけた.", + streak_color ? streak_color : (const char *)""); +#endif else if (streak_color) +#if 0 /*JP*/ pline("You see %s streaks on the %s.", streak_color, stonebuf); +#else + pline("石に%s筋がついた.", streak_color); +#endif else pline(scritch); return; @@ -1978,41 +2745,82 @@ int ttyp, tmp; const char *what = (char *)0; char buf[BUFSZ]; +#if 0 /*JP*/ const char *occutext = "setting the trap"; +#else + const char *occutext = "罠を仕掛けている"; +#endif if (nohands(youmonst.data)) +/*JP what = "without hands"; +*/ + what = "手がないので"; else if (Stunned) +/*JP what = "while stunned"; +*/ + what = "くらくらしているので"; else if (u.uswallow) +#if 0 /*JP*/ what = is_animal(u.ustuck->data) ? "while swallowed" : "while engulfed"; +#else + what = is_animal(u.ustuck->data) ? "飲み込まれている間は" : + "巻き込まれている間は"; +#endif else if (Underwater) +/*JP what = "underwater"; +*/ + what = "水面下では"; else if (Levitation) +/*JP what = "while levitating"; +*/ + what = "浮いている間は"; else if (is_pool(u.ux, u.uy)) +/*JP what = "in water"; +*/ + what = "水中では"; else if (is_lava(u.ux, u.uy)) +/*JP what = "in lava"; +*/ + what = "溶岩の中では"; else if (On_stairs(u.ux, u.uy)) what = (u.ux == xdnladder || u.ux == xupladder) ? +/*JP "on the ladder" : "on the stairs"; +*/ + "はしごの上では" : "階段の上では"; else if (IS_FURNITURE(levl[u.ux][u.uy].typ) || IS_ROCK(levl[u.ux][u.uy].typ) || closed_door(u.ux, u.uy) || t_at(u.ux, u.uy)) +/*JP what = "here"; +*/ + what = "ここでは"; if (what) { +/*JP You_cant("set a trap %s!",what); +*/ + pline("%s罠を仕掛けられない!",what); reset_trapset(); return; } ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP; if (otmp == trapinfo.tobj && u.ux == trapinfo.tx && u.uy == trapinfo.ty) { +#if 0 /*JP*/ You("resume setting %s %s.", shk_your(buf, otmp), defsyms[trap_to_defsym(what_trap(ttyp))].explanation); +#else + You("%sを仕掛けるのを再開した.", + jtrns_obj('^', defsyms[trap_to_defsym(what_trap(ttyp))].explanation)); +#endif set_occupation(set_trap, occutext, 0); return; } @@ -2033,11 +2841,20 @@ if (Fumbling || otmp->cursed) chance = (rnl(10) > 3); else chance = (rnl(10) > 5); +#if 0 /*JP:T*/ You("aren't very skilled at reaching from %s.", mon_nam(u.usteed)); +#else + pline("%sの上からではうまく仕掛けられないかもしれない.", + mon_nam(u.usteed)); +#endif +#if 0 /*JP*/ Sprintf(buf, "Continue your attempt to set %s?", the(defsyms[trap_to_defsym(what_trap(ttyp))].explanation)); if(yn(buf) == 'y') { +#else + if(yn("それでも続ける?") == 'y') { +#endif if (chance) { switch(ttyp) { case LANDMINE: /* set it off */ @@ -2046,9 +2863,15 @@ break; case BEAR_TRAP: /* drop it without arming it */ reset_trapset(); +#if 0 /*JP*/ You("drop %s!", the(defsyms[trap_to_defsym(what_trap(ttyp))].explanation)); dropx(otmp); +#else + You("%sを落した!", + jtrns_obj('^', defsyms[trap_to_defsym(what_trap(ttyp))].explanation)); + dropx(otmp); +#endif return; } } @@ -2058,9 +2881,14 @@ } } #endif +#if 0 /*JP*/ You("begin setting %s %s.", shk_your(buf, otmp), defsyms[trap_to_defsym(what_trap(ttyp))].explanation); +#else + You("%s%sを仕掛けはじめた.", shk_your(buf, otmp), + jtrns_obj('^', defsyms[trap_to_defsym(what_trap(ttyp))].explanation)); +#endif set_occupation(set_trap, occutext, 0); return; } @@ -2092,14 +2920,22 @@ add_damage(u.ux, u.uy, 0L); /* schedule removal */ } if (!trapinfo.force_bungle) +#if 0 /*JP*/ You("finish arming %s.", the(defsyms[trap_to_defsym(what_trap(ttyp))].explanation)); +#else + You("%sを仕掛け終えた.", + jtrns_obj('^', defsyms[trap_to_defsym(what_trap(ttyp))].explanation)); +#endif if (((otmp->cursed || Fumbling) && (rnl(10) > 5)) || trapinfo.force_bungle) dotrap(ttmp, (unsigned)(trapinfo.force_bungle ? FORCEBUNGLE : 0)); } else { /* this shouldn't happen */ +/*JP Your("trap setting attempt fails."); +*/ + You("罠を仕掛けるのに失敗した."); } useup(otmp); reset_trapset(); @@ -2114,8 +2950,13 @@ struct monst *mtmp; struct obj *otmp; int rx, ry, proficient, res = 0; +#if 0 /*JP*/ const char *msg_slipsfree = "The bullwhip slips free."; const char *msg_snap = "Snap!"; +#else + const char *msg_slipsfree = "鞭はほどけた."; + const char *msg_snap = "ピシッ!"; +#endif if (obj != uwep) { if (!wield_tool(obj, "lash")) return 0; @@ -2138,13 +2979,22 @@ if (proficient < 0) proficient = 0; if (u.uswallow && attack(u.ustuck)) { +/*JP There("is not enough room to flick your bullwhip."); +*/ + pline("鞭を打つほど広くない."); } else if (Underwater) { +/*JP There("is too much resistance to flick your bullwhip."); +*/ + pline("水の抵抗がありすぎて鞭を打つことができない."); } else if (u.dz < 0) { +/*JP You("flick a bug off of the %s.",ceiling(u.ux,u.uy)); +*/ + You("%sの虫を打ち落した.",ceiling(u.ux,u.uy)); } else if ((!u.dx && !u.dy) || (u.dz > 0)) { int dam; @@ -2152,7 +3002,10 @@ #ifdef STEED /* Sometimes you hit your steed by mistake */ if (u.usteed && !rn2(proficient + 2)) { +/*JP You("whip %s!", mon_nam(u.usteed)); +*/ + You("%sを鞭打った!", mon_nam(u.usteed)); kick_steed(); return 1; } @@ -2165,12 +3018,20 @@ /* Have a shot at snaring something on the floor */ otmp = level.objects[u.ux][u.uy]; if (otmp && otmp->otyp == CORPSE && otmp->corpsenm == PM_HORSE) { +/*JP pline("Why beat a dead horse?"); +*/ + pline("どうして死んだ馬を鞭打つようなことをするの?"); return 1; } if (otmp && proficient) { +#if 0 /*JP*/ You("wrap your bullwhip around %s on the %s.", an(singular(otmp, xname)), surface(u.ux, u.uy)); +#else + You("鞭を%sの上の%sにからませた.", + surface(u.ux, u.uy), an(singular(otmp, xname))); +#endif if (rnl(6) || pickup_object(otmp, 1L, TRUE) < 1) pline(msg_slipsfree); return 1; @@ -2178,14 +3039,25 @@ } dam = rnd(2) + dbon() + obj->spe; if (dam <= 0) dam = 1; +/*JP You("hit your %s with your bullwhip.", body_part(FOOT)); +*/ + You("自分の%sを自分で打ちつけた.", body_part(FOOT)); +#if 0 /*JP:T*/ Sprintf(buf, "killed %sself with %s bullwhip", uhim(), uhis()); losehp(dam, buf, NO_KILLER_PREFIX); +#else + Strcpy(buf, "自分自身を鞭打って"); + losehp(dam, buf, KILLED_BY); +#endif flags.botl = 1; return 1; } else if ((Fumbling || Glib) && !rn2(5)) { +/*JP pline_The("bullwhip slips out of your %s.", body_part(HAND)); +*/ + pline("鞭が%sからすべり落ちた.", body_part(HAND)); dropx(obj); } else if (u.utrap && u.utraptype == TT_PIT) { @@ -2220,16 +3092,25 @@ if (IS_FURNITURE(levl[rx][ry].typ)) wrapped_what = something; else if (sobj_at(BOULDER, rx, ry)) +/*JP wrapped_what = "a boulder"; +*/ + wrapped_what = "岩"; } if (wrapped_what) { coord cc; cc.x = rx; cc.y = ry; +/*JP You("wrap your bullwhip around %s.", wrapped_what); +*/ + You("鞭を%sにからませた.", wrapped_what); if (proficient && rn2(proficient + 2)) { if (!mtmp || enexto(&cc, rx, ry, youmonst.data)) { +/*JP You("yank yourself out of the pit!"); +*/ + You("ぐいと引っぱって穴から抜け出した!"); teleds(cc.x, cc.y, TRUE); u.utrap = 0; vision_full_recalc = 1; @@ -2243,7 +3124,10 @@ } else if (mtmp) { if (!canspotmon(mtmp) && !glyph_is_invisible(levl[rx][ry].glyph)) { +/*JP pline("A monster is there that you couldn't see."); +*/ + pline("見えない怪物がいる."); map_invisible(rx, ry); } otmp = MON_WEP(mtmp); /* can be null */ @@ -2259,13 +3143,23 @@ } else mon_hand = 0; /* lint suppression */ +/*JP You("wrap your bullwhip around %s %s.", +*/ + You("鞭を%sの%sにからませた.", s_suffix(mon_nam(mtmp)), onambuf); if (gotit && otmp->cursed) { +#if 0 /*JP*/ pline("%s welded to %s %s%c", (otmp->quan == 1L) ? "It is" : "They are", mhis(mtmp), mon_hand, !otmp->bknown ? '!' : '.'); +#else + pline("%sは%sの%sにくっついてしまっている%s", + onambuf, + mon_nam(mtmp), mon_hand, + !otmp->bknown ? "!" : "."); +#endif otmp->bknown = 1; gotit = FALSE; /* can't pull it free */ } @@ -2277,7 +3171,10 @@ switch (rn2(proficient + 1)) { case 2: /* to floor near you */ +/*JP You("yank %s %s to the %s!", s_suffix(mon_nam(mtmp)), +*/ + You("%sの%sを%sに引き落した!", mon_nam(mtmp), onambuf, surface(u.ux, u.uy)); place_object(otmp, u.ux, u.uy); stackobj(otmp); @@ -2295,7 +3192,10 @@ dmgval(otmp, &youmonst), otmp, (char *)0); if (hitu) { +/*JP pline_The("%s hits you as you try to snatch it!", +*/ + pline_The("%sを奪おうとしたらあなたに当たった!", the(onambuf)); } place_object(otmp, u.ux, u.uy); @@ -2304,7 +3204,10 @@ } #endif /* 0 */ /* right into your inventory */ +/*JP You("snatch %s %s!", s_suffix(mon_nam(mtmp)), onambuf); +*/ + You("%sの%sを奪った!", mon_nam(mtmp), onambuf); if (otmp->otyp == CORPSE && touch_petrifies(&mons[otmp->corpsenm]) && !uarmg && !Stone_resistance && @@ -2312,17 +3215,30 @@ polymon(PM_STONE_GOLEM))) { char kbuf[BUFSZ]; +#if 0 /*JP*/ Sprintf(kbuf, "%s corpse", an(mons[otmp->corpsenm].mname)); pline("Snatching %s is a fatal mistake.", kbuf); +#else + pline("%sの死体を奪ったのは致命的なミスだ.", + jtrns_mon(mons[otmp->corpsenm].mname)); + Sprintf(kbuf, "%sの死体に触れて", + jtrns_mon(mons[otmp->corpsenm].mname)); +#endif instapetrify(kbuf); } +/*JP otmp = hold_another_object(otmp, "You drop %s!", +*/ + otmp = hold_another_object(otmp, "%sを落した!", doname(otmp), (const char *)0); break; default: /* to floor beneath mon */ +/*JP You("yank %s from %s %s!", the(onambuf), +*/ + You("%sを%sの%sからひっぱった!", the(xname(otmp)), s_suffix(mon_nam(mtmp)), mon_hand); obj_no_longer_held(otmp); place_object(otmp, mtmp->mx, mtmp->my); @@ -2337,7 +3253,10 @@ if (mtmp->m_ap_type && !Protection_from_shape_changers && !sensemon(mtmp)) stumble_onto_mimic(mtmp); +/*JP else You("flick your bullwhip towards %s.", mon_nam(mtmp)); +*/ + else You("%sに向って鞭を打った.", mon_nam(mtmp)); if (proficient) { if (attack(mtmp)) return 1; else pline(msg_snap); @@ -2346,7 +3265,10 @@ } else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) { /* it must be air -- water checked above */ +/*JP You("snap your whip through thin air."); +*/ + You("何もないところで鞭を打った."); } else { pline(msg_snap); @@ -2357,10 +3279,17 @@ static const char +#if 0 /*JP*/ not_enough_room[] = "There's not enough room here to use that.", where_to_hit[] = "Where do you want to hit?", cant_see_spot[] = "won't hit anything if you can't see that spot.", cant_reach[] = "can't reach that spot from here."; +#else + not_enough_room[] = "それを使うだけの広さがない.", + where_to_hit[] = "どれを狙う?", + cant_see_spot[] = "場所が見えなければ狙えない.", + cant_reach[] = "ここからそこへは届かない."; +#endif /* Distance attacks by pole-weapons */ STATIC_OVL int @@ -2387,7 +3316,10 @@ pline(where_to_hit); cc.x = u.ux; cc.y = u.uy; +/*JP if (getpos(&cc, TRUE, "the spot to hit") < 0) +*/ + if (getpos(&cc, TRUE, "狙う場所") < 0) return 0; /* user pressed ESC */ /* Calculate range */ @@ -2396,10 +3328,16 @@ else if (P_SKILL(typ) == P_SKILLED) max_range = 5; else max_range = 8; if (distu(cc.x, cc.y) > max_range) { +/*JP pline("Too far!"); +*/ + pline("遠すぎる!"); return (res); } else if (distu(cc.x, cc.y) < min_range) { +/*JP pline("Too close!"); +*/ + pline("近すぎる!"); return (res); } else if (!cansee(cc.x, cc.y) && ((mtmp = m_at(cc.x, cc.y)) == (struct monst *)0 || @@ -2443,25 +3381,47 @@ obj = splitobj(obj, 1L); } if (Hallucination) +/*JP You("give yourself a facial."); +*/ + You("自分の顔にクリームパックをした."); else +#if 0 /*JP*/ pline("You immerse your %s in %s%s.", body_part(FACE), several ? "one of " : "", several ? makeplural(the(xname(obj))) : the(xname(obj))); +#else + pline("%s%sに%sを沈めた.", + xname(obj), + several ? "のひとつ" : "", body_part(FACE)); +#endif if(can_blnd((struct monst*)0, &youmonst, AT_WEAP, obj)) { int blindinc = rnd(25); u.ucreamed += blindinc; make_blinded(Blinded + (long)blindinc, FALSE); if (!Blind || (Blind && wasblind)) +#if 0 /*JP*/ pline("There's %ssticky goop all over your %s.", wascreamed ? "more " : "", body_part(FACE)); +#else + pline("やっかいなねばねばが%s全体に%sついた.", + body_part(FACE), wascreamed ? "さらに" : ""); +#endif else /* Blind && !wasblind */ +#if 0 /*JP*/ You_cant("see through all the sticky goop on your %s.", body_part(FACE)); +#else + pline("やっかいなねばねばが%s全体について何も見えなくなった.", + body_part(FACE)); +#endif } if (obj->unpaid) { +/*JP verbalize("You used it, you bought it!"); +*/ + verbalize("使ったのなら買ってもらうよ!"); bill_dummy_object(obj); } obj_extract_self(obj); @@ -2493,7 +3453,10 @@ pline(where_to_hit); cc.x = u.ux; cc.y = u.uy; +/*JP if (getpos(&cc, TRUE, "the spot to hit") < 0) +*/ + if (getpos(&cc, TRUE, "狙う場所") < 0) return 0; /* user pressed ESC */ /* Calculate range */ @@ -2502,7 +3465,10 @@ else if (P_SKILL(typ) == P_SKILLED) max_range = 5; else max_range = 8; if (distu(cc.x, cc.y) > max_range) { +/*JP pline("Too far!"); +*/ + pline("遠すぎる!"); return (res); } else if (!cansee(cc.x, cc.y)) { You(cant_see_spot); @@ -2524,17 +3490,32 @@ any.a_int = 1; /* use index+1 (cant use 0) as identifier */ start_menu(tmpwin); any.a_int++; +/*JP Sprintf(buf, "an object on the %s", surface(cc.x, cc.y)); +*/ + Sprintf(buf, "%sにある物体", surface(cc.x, cc.y)); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); any.a_int++; +#if 0 /*JP:T*/ add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "a monster", MENU_UNSELECTED); +#else + add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, + "怪物", MENU_UNSELECTED); +#endif any.a_int++; +#if 0 /*JP*/ Sprintf(buf, "the %s", surface(cc.x, cc.y)); +#else + Sprintf(buf, "%s", surface(cc.x, cc.y)); +#endif add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); +/*JP end_menu(tmpwin, "Aim for what?"); +*/ + end_menu(tmpwin, "何を狙う?"); tohit = rn2(4); if (select_menu(tmpwin, PICK_ONE, &selected) > 0 && rn2(P_SKILL(typ) > P_SKILLED ? 20 : 2)) @@ -2550,7 +3531,10 @@ break; case 1: /* Object */ if ((otmp = level.objects[cc.x][cc.y]) != 0) { +/*JP You("snag an object from the %s!", surface(cc.x, cc.y)); +*/ + You("%sのものを引っ掛けた!", surface(cc.x, cc.y)); (void) pickup_object(otmp, 1L, FALSE); /* If pickup fails, leave it alone */ newsym(cc.x, cc.y); @@ -2561,7 +3545,10 @@ if ((mtmp = m_at(cc.x, cc.y)) == (struct monst *)0) break; if (verysmall(mtmp->data) && !rn2(4) && enexto(&cc, u.ux, u.uy, (struct permonst *)0)) { +/*JP You("pull in %s!", mon_nam(mtmp)); +*/ + You("%sを引っ張った!", mon_nam(mtmp)); mtmp->mundetected = 0; rloc_to(mtmp, cc.x, cc.y); return (1); @@ -2573,17 +3560,29 @@ /* FALL THROUGH */ case 3: /* Surface */ if (IS_AIR(levl[cc.x][cc.y].typ) || is_pool(cc.x, cc.y)) +/*JP pline_The("hook slices through the %s.", surface(cc.x, cc.y)); +*/ + pline("フックは%sをさっと切った.", surface(cc.x, cc.y)); else { +/*JP You("are yanked toward the %s!", surface(cc.x, cc.y)); +*/ + You("%sへ引っぱられた!", surface(cc.x, cc.y)); hurtle(sgn(cc.x-u.ux), sgn(cc.y-u.uy), 1, FALSE); spoteffects(TRUE); } return (1); default: /* Yourself (oops!) */ if (P_SKILL(typ) <= P_BASIC) { +/*JP You("hook yourself!"); +*/ + You("自分自身を引っ掛けた!"); +/*JP losehp(rn1(10,10), "a grappling hook", KILLED_BY); +*/ + losehp(rn1(10,10), "自分自身を引っ掛けて", KILLED_BY); return (1); } break; @@ -2600,7 +3599,10 @@ do_break_wand(obj) struct obj *obj; { +/*JP static const char nothing_else_happens[] = "But nothing else happens..."; +*/ + static const char nothing_else_happens[] = "しかし,何も起きなかった..."; register int i, x, y; register struct monst *mon; int dmg, damage; @@ -2610,20 +3612,37 @@ char confirm[QBUFSZ], the_wand[BUFSZ], buf[BUFSZ]; Strcpy(the_wand, yname(obj)); +#if 0 /*JP*/ Sprintf(confirm, "Are you really sure you want to break %s?", safe_qbuf("", sizeof("Are you really sure you want to break ?"), the_wand, ysimple_name(obj), "the wand")); +#else + Sprintf(confirm, "本当に%sを壊すの?", + safe_qbuf("", sizeof("本当にを壊すの?"), + the_wand, ysimple_name(obj), "杖")); +#endif if (yn(confirm) == 'n' ) return 0; if (nohands(youmonst.data)) { +/*JP You_cant("break %s without hands!", the_wand); +*/ + You("手が無いので%sを壊せない!", the_wand); return 0; } else if (ACURR(A_STR) < 10) { +/*JP You("don't have the strength to break %s!", the_wand); +*/ + You("%sを壊すだけの力がない!", the_wand); return 0; } +#if 0 /*JP*/ pline("Raising %s high above your %s, you break it in two!", the_wand, body_part(HEAD)); +#else + pline("%sを%sの上にあげ二つにへし折った!", + the_wand, body_part(HEAD)); +#endif /* [ALI] Do this first so that wand is removed from bill. Otherwise, * the freeinv() below also hides it from setpaid() which causes problems. @@ -2673,7 +3692,10 @@ goto discard_broken_wand; case WAN_STRIKING: /* we want this before the explosion instead of at the very end */ +/*JP pline("A wall of force smashes down around you!"); +*/ + pline("あなたは魔力の壁につつまれた!"); dmg = d(1 + obj->spe,6); /* normally 2d12 */ case WAN_CANCELLATION: case WAN_POLYMORPH: @@ -2723,8 +3745,13 @@ } damage = zapyourself(obj, FALSE); if (damage) { +#if 0 /*JP:T*/ Sprintf(buf, "killed %sself by breaking a wand", uhim()); losehp(damage, buf, NO_KILLER_PREFIX); +#else + Strcpy(buf, "自分自身で杖を壊してダメージを受け"); + losehp(damage, buf, KILLED_BY); +#endif } if (flags.botl) bot(); /* blindness */ } else if ((mon = m_at(x, y)) != 0) { @@ -2740,7 +3767,10 @@ /* Note: if player fell thru, this call is a no-op. Damage is handled in digactualhole in that case */ +/*JP if (shop_damage) pay_for_damage("dig into", FALSE); +*/ + if (shop_damage) pay_for_damage("穴をあける", FALSE); if (obj->otyp == WAN_LIGHT) litroom(TRUE, obj); /* only needs to be done once */ @@ -2809,10 +3839,17 @@ if (!cursed(obj)) Blindf_off(obj); } else if (!ublindf) Blindf_on(obj); +#if 0 /*JP*/ else You("are already %s.", ublindf->otyp == TOWEL ? "covered by a towel" : ublindf->otyp == BLINDFOLD ? "wearing a blindfold" : "wearing lenses"); +#else + else You("もう%sている.", + ublindf->otyp == TOWEL ? "タオルを巻い" : + ublindf->otyp == BLINDFOLD ? "目隠しをつけ" : + "レンズをつけ"); +#endif break; case CREAM_PIE: res = use_cream_pie(obj); @@ -2876,8 +3913,13 @@ if (!Blind) { char buf[BUFSZ]; +#if 0 /*JP*/ pline("%s %s %s.", Shk_Your(buf, obj), aobjnam(obj, "glow"), hcolor("brown")); +#else + pline("%s%sは%s輝いた.", Shk_Your(buf, obj), xname(obj), + jconj_adj(hcolor("茶色の"))); +#endif obj->bknown = 1; } unbless(obj); @@ -2927,14 +3969,26 @@ break; case TIN_OPENER: if(!carrying(TIN)) { +/*JP You("have no tin to open."); +*/ + You("缶を持っていない."); goto xit; } +/*JP You("cannot open a tin without eating or discarding its contents."); +*/ + pline("中身を食べるか,捨てるかしないと缶を空にできない."); if(flags.verbose) +/*JP pline("In order to eat, use the 'e' command."); +*/ + pline("食べるには,'e'コマンドを使えばよい."); if(obj != uwep) +/*JP pline("Opening the tin will be much easier if you wield the tin opener."); +*/ + pline("缶切りを装備していれば,ずっと簡単に開けることができる."); goto xit; case FIGURINE: @@ -2966,17 +4020,27 @@ if (objects[otmp->otyp].oc_magic) do { otmp->otyp = rnd_class(POT_BOOZE, POT_WATER); } while (otmp->otyp == POT_SICKNESS); +/*JP what = "A potion"; +*/ + what = "薬"; } else { otmp = mkobj(FOOD_CLASS, FALSE); if (otmp->otyp == FOOD_RATION && !rn2(7)) otmp->otyp = LUMP_OF_ROYAL_JELLY; +/*JP what = "Some food"; +*/ + what = "食べ物"; } +/*JP pline("%s spills out.", what); +*/ + pline("%sが飛び出てきた.", what); otmp->blessed = obj->blessed; otmp->cursed = obj->cursed; otmp->owt = weight(otmp); +#if 0 /*JP*/ otmp = hold_another_object(otmp, u.uswallow ? "Oops! %s out of your reach!" : (Is_airlevel(&u.uz) || @@ -2987,6 +4051,18 @@ "Oops! %s to the floor!", The(aobjnam(otmp, "slip")), (const char *)0); +#else + otmp = hold_another_object(otmp, u.uswallow ? + "おっと!%sは届かない!" : + (Is_airlevel(&u.uz) || + Is_waterlevel(&u.uz) || + levl[u.ux][u.uy].typ < IRONBARS || + levl[u.ux][u.uy].typ >= ICE) ? + "おっと!%sはあなたの手から滑り落ちた!" : + "おっと!%sは床に滑り落ちた!", + The(xname(otmp)), + (const char *)0); +#endif makeknown(HORN_OF_PLENTY); } else pline(nothing_happens); @@ -3010,7 +4086,10 @@ res = use_pick_axe(obj); break; } +/*JP pline("Sorry, I don't know how to use that."); +*/ + pline("それをどうやって使うんだい?"); xit: nomul(0); return 0; diff -aurbN -xCVS -xXTAGS nethack/src/artifact.c jnethack/src/artifact.c --- nethack/src/artifact.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/artifact.c 2005-04-26 18:35:40.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "artifact.h" #ifdef OVLB @@ -538,16 +545,25 @@ char buf[BUFSZ]; if (!yours) return 0; +/*JP You("are blasted by %s power!", s_suffix(the(xname(obj)))); +*/ + You("%sの力を浴びた!", xname(obj)); dmg = d((Antimagic ? 2 : 4), (self_willed ? 10 : 4)); +/*JP Sprintf(buf, "touching %s", oart->name); +*/ + Sprintf(buf, "%sに触れて", jtrns_obj('A', oart->name)); losehp(dmg, buf, KILLED_BY); exercise(A_WIS, FALSE); } /* can pick it up unless you're totally non-synch'd with the artifact */ if (badclass && badalign && self_willed) { +/*JP if (yours) pline("%s your grasp!", Tobjnam(obj, "evade")); +*/ + if (yours) pline("%sは握ろうとするとするりと抜けた!", xname(obj)); return 0; } @@ -707,11 +723,19 @@ for (i = 0; i < NROFARTIFACTS; i++) { if (artidisco[i] == 0) break; /* empty slot implies end of list */ +/*JP if (i == 0) putstr(tmpwin, iflags.menu_headings, "Artifacts"); +*/ + if (i == 0) putstr(tmpwin, iflags.menu_headings, "聖器"); m = artidisco[i]; otyp = artilist[m].otyp; +#if 0 /*JP*/ Sprintf(buf, " %s [%s %s]", artiname(m), align_str(artilist[m].alignment), simple_typename(otyp)); +#else + Sprintf(buf, " %s [%s %s]", jtrns_obj('A', artiname(m)), + align_str(artilist[m].alignment), simple_typename(otyp)); +#endif putstr(tmpwin, 0, buf); } return i; @@ -744,8 +768,14 @@ */ #define MB_MAX_DIEROLL 8 /* rolls above this aren't magical */ static const char * const mb_verb[2][4] = { +#if 0 /*JP*/ { "probe", "stun", "scare", "cancel" }, { "prod", "amaze", "tickle", "purge" }, +#else + /* Mb_hit() で "%sた"の形で利用 */ + {"調べ", "くらくらさせ", "怯えさせ", "浄化し"}, + { "励まし", "驚かせ", "くすぐっ", "清め" }, +#endif }; #define MB_INDEX_PROBE 0 #define MB_INDEX_STUN 1 @@ -809,8 +839,13 @@ verb = mb_verb[!!Hallucination][attack_indx]; if (youattack || youdefend || vis) { result = TRUE; +#if 0 /*JP*/ pline_The("magic-absorbing blade %s %s!", vtense((const char *)0, verb), hittee); +#else + pline("魔力を吸いとる刃が%sを%sた!", + hittee, verb); +#endif /* assume probing has some sort of noticeable feedback even if it is being done by one monster to another */ if (attack_indx == MB_INDEX_PROBE && !canspotmon(mdef)) @@ -833,7 +868,10 @@ if (youmonst.data != old_uasmon) *dmgptr = 0; /* rehumanized, so no more damage */ if (u.uenmax > 0) { +/*JP You("lose magical energy!"); +*/ + You("魔法のエネルギーを失った!"); u.uenmax--; if (u.uen > 0) u.uen--; flags.botl = 1; @@ -842,7 +880,10 @@ if (mdef->data == &mons[PM_CLAY_GOLEM]) mdef->mhp = 1; /* cancelled clay golems will die */ if (youattack && attacktype(mdef->data, AT_MAGC)) { +/*JP You("absorb magical energy!"); +*/ + You("魔法のエネルギーを吸いとった!"); u.uenmax++; u.uen++; flags.botl = 1; @@ -860,7 +901,10 @@ nomovemsg = ""; if (magr && magr == u.ustuck && sticks(youmonst.data)) { u.ustuck = (struct monst *)0; +/*JP You("release %s!", mon_nam(magr)); +*/ + You("%sを解放した!", mon_nam(magr)); } } } else { @@ -878,7 +922,10 @@ case MB_INDEX_PROBE: if (youattack && (mb->spe == 0 || !rn2(3 * abs(mb->spe)))) { +/*JP pline_The("%s is insightful.", verb); +*/ + pline("識別できた."); /* pre-damage status */ probe_monster(mdef); } @@ -905,7 +952,10 @@ if (youattack || youdefend || vis) { (void) upstart(hittee); /* capitalize */ if (resisted) { +/*JP pline("%s %s!", hittee, vtense(hittee, "resist")); +*/ + pline("%sは防いだ!", hittee); shieldeff(youdefend ? u.ux : mdef->mx, youdefend ? u.uy : mdef->my); } @@ -913,11 +963,19 @@ char buf[BUFSZ]; buf[0] = '\0'; +#if 0 /*JP:T*/ if (do_stun) Strcat(buf, "stunned"); if (do_stun && do_confuse) Strcat(buf, " and "); if (do_confuse) Strcat(buf, "confused"); pline("%s %s %s%c", hittee, vtense(hittee, "are"), buf, (do_stun && do_confuse) ? '!' : '.'); +#else + if (do_stun && do_confuse) Strcat(buf, "よろめいて"); + else if (do_stun) Strcat(buf, "よろめいた"); + if (do_confuse) Strcat(buf, "混乱した"); + pline("%sは%s%s", hittee, + buf, (do_stun && do_confuse) ? "!" : "."); +#endif } } @@ -946,7 +1004,10 @@ || (youattack && u.uswallow && mdef == u.ustuck && !Blind); boolean realizes_damage; const char *wepdesc; +/*JP static const char you[] = "you"; +*/ + static const char you[] = "あなた"; char hittee[BUFSZ]; Strcpy(hittee, youdefend ? you : mon_nam(mdef)); @@ -969,11 +1030,19 @@ /* the four basic attacks: fire, cold, shock and missiles */ if (attacks(AD_FIRE, otmp)) { if (realizes_damage) +#if 0 /*JP*/ pline_The("fiery blade %s %s%c", !spec_dbon_applies ? "hits" : (mdef->data == &mons[PM_WATER_ELEMENTAL]) ? "vaporizes part of" : "burns", hittee, !spec_dbon_applies ? '.' : '!'); +#else + pline_The("猛火が%s%s", + hittee, + !spec_dbon_applies ? "に命中した." : + (mdef->data == &mons[PM_WATER_ELEMENTAL]) ? + "の一部を消滅させた!" : "を焼いた!"); +#endif if (!rn2(4)) (void) destroy_mitem(mdef, POTION_CLASS, AD_FIRE); if (!rn2(4)) (void) destroy_mitem(mdef, SCROLL_CLASS, AD_FIRE); if (!rn2(7)) (void) destroy_mitem(mdef, SPBOOK_CLASS, AD_FIRE); @@ -982,27 +1051,45 @@ } if (attacks(AD_COLD, otmp)) { if (realizes_damage) +#if 0 /*JP*/ pline_The("ice-cold blade %s %s%c", !spec_dbon_applies ? "hits" : "freezes", hittee, !spec_dbon_applies ? '.' : '!'); +#else + pline_The("猛吹雪が%s%s", + hittee, + !spec_dbon_applies ? "に命中した." : "を襲った!"); +#endif if (!rn2(4)) (void) destroy_mitem(mdef, POTION_CLASS, AD_COLD); return realizes_damage; } if (attacks(AD_ELEC, otmp)) { if (realizes_damage) +#if 0 /*JP*/ pline_The("massive hammer hits%s %s%c", !spec_dbon_applies ? "" : "! Lightning strikes", hittee, !spec_dbon_applies ? '.' : '!'); +#else + pline("巨大なハンマーは%sに命中した%s", hittee, + !spec_dbon_applies ? "." : "!電撃が襲った!"); +#endif if (!rn2(5)) (void) destroy_mitem(mdef, RING_CLASS, AD_ELEC); if (!rn2(5)) (void) destroy_mitem(mdef, WAND_CLASS, AD_ELEC); return realizes_damage; } if (attacks(AD_MAGM, otmp)) { if (realizes_damage) +#if 0 /*JP*/ pline_The("imaginary widget hits%s %s%c", !spec_dbon_applies ? "" : "! A hail of magic missiles strikes", hittee, !spec_dbon_applies ? '.' : '!'); +#else + pline("実体を持たない物体が%sを攻撃した%s", + hittee, + !spec_dbon_applies ? "." : + "!魔法の矢が雨あられと命中した!"); +#endif return realizes_damage; } @@ -1021,10 +1108,16 @@ /* reverse from AD&D. */ if (spec_ability(otmp, SPFX_BEHEAD)) { if (otmp->oartifact == ART_TSURUGI_OF_MURAMASA && dieroll == 1) { +/*JP wepdesc = "The razor-sharp blade"; +*/ + wepdesc = "斬鉄剣"; /* not really beheading, but so close, why add another SPFX */ if (youattack && u.uswallow && mdef == u.ustuck) { +/*JP You("slice %s wide open!", mon_nam(mdef)); +*/ + You("%sを輪切りにした!", mon_nam(mdef)); *dmgptr = 2 * mdef->mhp + FATAL_DAMAGE_MODIFIER; return TRUE; } @@ -1035,21 +1128,33 @@ if (bigmonst(mdef->data)) { if (youattack) +/*JP You("slice deeply into %s!", +*/ + You("%sに深く斬りつけた!", mon_nam(mdef)); else if (vis) +/*JP pline("%s cuts deeply into %s!", +*/ + pline("%sは%sに深く斬りつけた!", Monnam(magr), hittee); *dmgptr *= 2; return TRUE; } *dmgptr = 2 * mdef->mhp + FATAL_DAMAGE_MODIFIER; +/*JP pline("%s cuts %s in half!", wepdesc, mon_nam(mdef)); +*/ + pline("%sが%sを真っ二つにした!", wepdesc, mon_nam(mdef)); otmp->dknown = TRUE; return TRUE; } else { if (bigmonst(youmonst.data)) { +/*JP pline("%s cuts deeply into you!", +*/ + pline("%sはあなたに深く斬りつけた!", magr ? Monnam(magr) : wepdesc); *dmgptr *= 2; return TRUE; @@ -1061,33 +1166,53 @@ * damage does not prevent death. */ *dmgptr = 2 * (Upolyd ? u.mh : u.uhp) + FATAL_DAMAGE_MODIFIER; +/*JP pline("%s cuts you in half!", wepdesc); +*/ + pline("%sがあなたを真っ二つにした!", wepdesc); otmp->dknown = TRUE; return TRUE; } } else if (otmp->oartifact == ART_VORPAL_BLADE && (dieroll == 1 || mdef->data == &mons[PM_JABBERWOCK])) { static const char * const behead_msg[2] = { +#if 0 /*JP*/ "%s beheads %s!", "%s decapitates %s!" +#else + "%sは%sの首を切った!", + "%sは%sの首を切り落した!" +#endif }; if (youattack && u.uswallow && mdef == u.ustuck) return FALSE; +/*JP wepdesc = artilist[ART_VORPAL_BLADE].name; +*/ + wepdesc = jtrns_obj('A', artilist[ART_VORPAL_BLADE].name); if (!youdefend) { if (!has_head(mdef->data) || notonhead || u.uswallow) { if (youattack) +/*JP pline("Somehow, you miss %s wildly.", +*/ + pline("なぜか,%sへの攻撃は大きくはずれた.", mon_nam(mdef)); else if (vis) +/*JP pline("Somehow, %s misses wildly.", +*/ + pline("なぜか,%sの攻撃は大きくはずれた.", mon_nam(magr)); *dmgptr = 0; return ((boolean)(youattack || vis)); } if (noncorporeal(mdef->data) || amorphous(mdef->data)) { +/*JP pline("%s slices through %s %s.", wepdesc, +*/ + pline("%sは%sの%sを切り落した.", wepdesc, s_suffix(mon_nam(mdef)), mbodypart(mdef,NECK)); return TRUE; @@ -1099,20 +1224,29 @@ return TRUE; } else { if (!has_head(youmonst.data)) { +/*JP pline("Somehow, %s misses you wildly.", +*/ + pline("なぜか,%sの攻撃は大きくはずれた.", magr ? mon_nam(magr) : wepdesc); *dmgptr = 0; return TRUE; } if (noncorporeal(youmonst.data) || amorphous(youmonst.data)) { +/*JP pline("%s slices through your %s.", +*/ + pline("%sはあなたの%sを切り落した.", wepdesc, body_part(NECK)); return TRUE; } *dmgptr = 2 * (Upolyd ? u.mh : u.uhp) + FATAL_DAMAGE_MODIFIER; pline(behead_msg[rn2(SIZE(behead_msg))], +/*JP wepdesc, "you"); +*/ + wepdesc, "あなた"); otmp->dknown = TRUE; /* Should amulets fall off? */ return TRUE; @@ -1123,11 +1257,17 @@ if (!youdefend) { if (vis) { if(otmp->oartifact == ART_STORMBRINGER) +/*JP pline_The("%s blade draws the life from %s!", +*/ + pline("%s刃が%sの生命力を奪った!", hcolor(NH_BLACK), mon_nam(mdef)); else +/*JP pline("%s draws the life from %s!", +*/ + pline("%sは%sの生命力を奪った!", The(distant_name(otmp, xname)), mon_nam(mdef)); } @@ -1146,16 +1286,31 @@ int oldhpmax = u.uhpmax; if (Blind) +/*JP You_feel("an %s drain your life!", +*/ + pline("%sに生命力を奪われたような気がした!", otmp->oartifact == ART_STORMBRINGER ? +/*JP "unholy blade" : "object"); +*/ + "不浄な刃" : "何か"); else if (otmp->oartifact == ART_STORMBRINGER) +/*JP pline_The("%s blade drains your life!", +*/ + pline("%s刃があなたの生命力を奪った!", hcolor(NH_BLACK)); else +/*JP pline("%s drains your life!", +*/ + pline("%sがあなたの生命力を奪った!", The(distant_name(otmp, xname))); +/*JP losexp("life drainage"); +*/ + losexp("生命力を吸収されて"); if (magr && magr->mhp < magr->mhpmax) { magr->mhp += (oldhpmax - u.uhpmax)/2; if (magr->mhp > magr->mhpmax) magr->mhp = magr->mhpmax; @@ -1199,8 +1354,12 @@ /* It's a special power, not "just" a property */ if(obj->age > monstermoves) { /* the artifact is tired :-) */ +#if 0 /*JP:T*/ You_feel("that %s %s ignoring you.", the(xname(obj)), otense(obj, "are")); +#else + You_feel("%sが無視しているように感じた.", xname(obj)); +#endif /* and just got more so; patience is essential... */ obj->age += (long) d(3,10); return 1; @@ -1222,7 +1381,10 @@ if (Upolyd) healamt = (u.mhmax + 1 - u.mh) / 2; if (healamt || Sick || Slimed || Blinded > creamed) +/*JP You_feel("better."); +*/ + You_feel("気分がよくなった."); else goto nothing_special; if (healamt > 0) { @@ -1240,7 +1402,10 @@ if (epboost > 120) epboost = 120; /* arbitrary */ else if (epboost < 12) epboost = u.uenmax - u.uen; if(epboost) { +/*JP You_feel("re-energized."); +*/ + You("エネルギーが満たされた."); u.uen += epboost; flags.botl = 1; } else @@ -1285,11 +1450,17 @@ if (!dungeons[i].dunlev_ureached) continue; any.a_int = i+1; add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, +/*JP dungeons[i].dname, MENU_UNSELECTED); +*/ + jtrns_obj('d', dungeons[i].dname), MENU_UNSELECTED); num_ok_dungeons++; last_ok_dungeon = i; } +/*JP end_menu(tmpwin, "Open a portal to which dungeon?"); +*/ + end_menu(tmpwin, "どの迷宮への魔法の入口を開きますか?"); if (num_ok_dungeons > 1) { /* more than one entry; display menu for choices */ menu_item *selected; @@ -1319,10 +1490,19 @@ newlev.dlevel = dungeons[i].dunlev_ureached; if(u.uhave.amulet || In_endgame(&u.uz) || In_endgame(&newlev) || newlev.dnum == u.uz.dnum) { +/*JP You_feel("very disoriented for a moment."); +*/ + You("一瞬方向感覚を失った."); } else { +/*JP if(!Blind) You("are surrounded by a shimmering sphere!"); +*/ + if(!Blind) You("チカチカ光る球体に覆われた!"); +/*JP else You_feel("weightless for a moment."); +*/ + else You_feel("一瞬,無重力感を感じた!"); goto_level(&newlev, FALSE, FALSE, FALSE); } break; @@ -1345,8 +1525,13 @@ } else otmp->quan += rnd(5); otmp->owt = weight(otmp); +#if 0 /*JP*/ otmp = hold_another_object(otmp, "Suddenly %s out.", aobjnam(otmp, "fall"), (const char *)0); +#else + otmp = hold_another_object(otmp, "突然%sが落ちた.", + xname(otmp), 0); +#endif break; } } @@ -1358,8 +1543,12 @@ if(on && obj->age > monstermoves) { /* the artifact is tired :-) */ u.uprops[oart->inv_prop].extrinsic ^= W_ARTI; +#if 0 /*JP:T*/ You_feel("that %s %s ignoring you.", the(xname(obj)), otense(obj, "are")); +#else + You_feel("%sが無視しているように感じた.", xname(obj)); +#endif /* can't just keep repeatedly trying */ obj->age += (long) d(3,10); return 1; @@ -1373,13 +1562,22 @@ nothing_special: /* you had the property from some other source too */ if (carried(obj)) +/*JP You_feel("a surge of power, but nothing seems to happen."); +*/ + You("力が渦巻いたような気がした,しかし何も起きなかった."); return 1; } switch(oart->inv_prop) { case CONFLICT: +/*JP if(on) You_feel("like a rabble-rouser."); +*/ + if(on) You("民衆扇動家のような気がした."); +/*JP else You_feel("the tension decrease around you."); +*/ + else pline("まわりの緊張感がなくなったような気がした."); break; case LEVITATION: if(on) { @@ -1391,10 +1589,18 @@ if (BInvis || Blind) goto nothing_special; newsym(u.ux, u.uy); if (on) +#if 0 /*JP*/ Your("body takes on a %s transparency...", Hallucination ? "normal" : "strange"); +#else + pline("%s,体は透過性をもった...", + Hallucination ? "あたりまえのことだが" : "奇妙なことに"); +#endif else +/*JP Your("body seems to unfade..."); +*/ + Your("体は次第に見えるようになってきた..."); break; } } @@ -1427,8 +1633,14 @@ line = getrumor(bcsign(obj), buf, TRUE); if (!*line) +/*JP line = "NetHack rumors file closed for renovation."; +*/ + line = "噂の真相は新装のため一時閉店."; +/*JP pline("%s:", Tobjnam(obj, "whisper")); +*/ + pline("%sはささやいた:", xname(obj)); verbalize("%s", line); return; } diff -aurbN -xCVS -xXTAGS nethack/src/attrib.c jnethack/src/attrib.c --- nethack/src/attrib.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/attrib.c 2003-12-10 03:31:15.000000000 +0900 @@ -2,6 +2,14 @@ /* Copyright 1988, 1989, 1990, 1992, M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + + /* attribute modification routines. */ #include "hack.h" @@ -13,10 +21,16 @@ /* part of the output on gain or loss of attribute */ static const char * const plusattr[] = { +/*JP "strong", "smart", "wise", "agile", "tough", "charismatic" +*/ + "強い","賢明だ","賢い","機敏だ","頑丈だ","魅力的だ" }, * const minusattr[] = { +/*JP "weak", "stupid", "foolish", "clumsy", "fragile", "repulsive" +*/ + "弱い","愚かだ","間抜けだ","不器用だ","ひ弱だ","醜い" }; @@ -27,70 +41,148 @@ const char *gainstr, *losestr; } arc_abil[] = { { 1, &(HStealth), "", "" }, { 1, &(HFast), "", "" }, +/*JP { 10, &(HSearching), "perceptive", "" }, +*/ + { 10, &(HSearching), "知覚力を得た", "知覚力を失った" }, { 0, 0, 0, 0 } }, bar_abil[] = { { 1, &(HPoison_resistance), "", "" }, +/*JP { 7, &(HFast), "quick", "slow" }, +*/ + { 7, &(HFast), "素早さを得た", "遅くなった" }, +/*JP { 15, &(HStealth), "stealthy", "" }, +*/ + { 15, &(HStealth), "人目を盗む力を得た", "人目を盗む力を失った" }, { 0, 0, 0, 0 } }, +/*JP cav_abil[] = { { 7, &(HFast), "quick", "slow" }, +*/ + cav_abil[] = { { 7, &(HFast), "素早さを得た", "遅くなった" }, +/*JP { 15, &(HWarning), "sensitive", "" }, +*/ + { 15, &(HWarning), "敏感になった", "鈍感になった" }, { 0, 0, 0, 0 } }, hea_abil[] = { { 1, &(HPoison_resistance), "", "" }, +/*JP { 15, &(HWarning), "sensitive", "" }, +*/ + { 15, &(HWarning), "敏感になった", "鈍感になった" }, { 0, 0, 0, 0 } }, +/*JP kni_abil[] = { { 7, &(HFast), "quick", "slow" }, +*/ + kni_abil[] = { { 7, &(HFast), "素早さを得た", "遅くなった" }, { 0, 0, 0, 0 } }, mon_abil[] = { { 1, &(HFast), "", "" }, { 1, &(HSleep_resistance), "", "" }, { 1, &(HSee_invisible), "", "" }, +/*JP { 3, &(HPoison_resistance), "healthy", "" }, +*/ + { 3, &(HPoison_resistance), "健康になった", "不健康になった" }, +/*JP { 5, &(HStealth), "stealthy", "" }, +*/ + { 5, &(HStealth), "人目を盗む力を得た", "人目を盗む力を失った" }, +/*JP { 7, &(HWarning), "sensitive", "" }, +*/ + { 7, &(HWarning), "敏感になった", "鈍感になった" }, +/*JP { 9, &(HSearching), "perceptive", "unaware" }, +*/ + { 9, &(HSearching), "知覚力を得た", "知覚力を失った" }, +/*JP { 11, &(HFire_resistance), "cool", "warmer" }, +*/ + { 11, &(HFire_resistance), "冷たくなった", "暖かくなった" }, +/*JP { 13, &(HCold_resistance), "warm", "cooler" }, +*/ + { 13, &(HCold_resistance), "暖かくなった", "冷たくなった"}, +/*JP { 15, &(HShock_resistance), "insulated", "conductive" }, +*/ + { 15, &(HShock_resistance), "絶縁された", "導電された" }, +/*JP { 17, &(HTeleport_control), "controlled","uncontrolled" }, +*/ + { 17, &(HTeleport_control), "制御力を得た","制御力を失った" }, { 0, 0, 0, 0 } }, +/*JP pri_abil[] = { { 15, &(HWarning), "sensitive", "" }, +*/ + pri_abil[] = { { 15, &(HWarning), "敏感になった", "鈍感になった" }, +/*JP { 20, &(HFire_resistance), "cool", "warmer" }, +*/ + { 20, &(HFire_resistance), "冷たくなった", "暖かくなった" }, { 0, 0, 0, 0 } }, ran_abil[] = { { 1, &(HSearching), "", "" }, +/*JP { 7, &(HStealth), "stealthy", "" }, +*/ + { 7, &(HStealth), "人目を盗む力を得た", "人目を盗む力を失った" }, { 15, &(HSee_invisible), "", "" }, { 0, 0, 0, 0 } }, rog_abil[] = { { 1, &(HStealth), "", "" }, +/*JP { 10, &(HSearching), "perceptive", "" }, +*/ + { 10, &(HSearching), "知覚力を得た", "知覚力を失った" }, { 0, 0, 0, 0 } }, sam_abil[] = { { 1, &(HFast), "", "" }, +/*JP { 15, &(HStealth), "stealthy", "" }, +*/ + { 15, &(HStealth), "人目を盗む力を得た", "人目を盗む力を失った" }, { 0, 0, 0, 0 } }, +/*JP tou_abil[] = { { 10, &(HSearching), "perceptive", "" }, +*/ + tou_abil[] = { { 10, &(HSearching), "知覚力を得た", "知覚力を失った" }, +/*JP { 20, &(HPoison_resistance), "hardy", "" }, +*/ + { 20, &(HPoison_resistance), "免疫力を得た", "免疫力を失った" }, { 0, 0, 0, 0 } }, val_abil[] = { { 1, &(HCold_resistance), "", "" }, { 1, &(HStealth), "", "" }, +/*JP { 7, &(HFast), "quick", "slow" }, +*/ + { 7, &(HFast), "素早さを得た", "遅くなった" }, { 0, 0, 0, 0 } }, +/*JP wiz_abil[] = { { 15, &(HWarning), "sensitive", "" }, +*/ + wiz_abil[] = { { 15, &(HWarning), "敏感になった", "鈍感になった" }, +/*JP { 17, &(HTeleport_control), "controlled","uncontrolled" }, +*/ + { 17, &(HTeleport_control), "制御力を得た","制御力を失った" }, { 0, 0, 0, 0 } }, /* Intrinsics conferred by race */ +/*JP elf_abil[] = { { 4, &(HSleep_resistance), "awake", "tired" }, +*/ + elf_abil[] = { { 4, &(HSleep_resistance), "目が覚めた", "眠くなった" }, { 0, 0, 0, 0 } }, orc_abil[] = { { 1, &(HPoison_resistance), "", "" }, @@ -111,14 +203,20 @@ if ((ndx == A_INT || ndx == A_WIS) && uarmh && uarmh->otyp == DUNCE_CAP) { if (msgflg == 0) +/*JP Your("cap constricts briefly, then relaxes again."); +*/ + Your("帽子がしばらくの間キュっと締めつけ,そしてゆるんだ."); return FALSE; } if (incr > 0) { if ((AMAX(ndx) >= ATTRMAX(ndx)) && (ACURR(ndx) >= AMAX(ndx))) { if (msgflg == 0 && flags.verbose) +/*JP pline("You're already as %s as you can get.", +*/ + You("もう十分に%s.", plusattr[ndx]); ABASE(ndx) = AMAX(ndx) = ATTRMAX(ndx); /* just in case */ return FALSE; @@ -135,7 +233,10 @@ } else { if (ABASE(ndx) <= ATTRMIN(ndx)) { if (msgflg == 0 && flags.verbose) +/*JP pline("You're already as %s as you can get.", +*/ + You("もう十分%s.", minusattr[ndx]); ABASE(ndx) = ATTRMIN(ndx); /* just in case */ return FALSE; @@ -151,9 +252,15 @@ } } if (msgflg <= 0) +#if 0 /*JP*/ You_feel("%s%s!", (incr > 1 || incr < -1) ? "very ": "", (incr > 0) ? plusattr[ndx] : minusattr[ndx]); +#else + You("%s%sなったような気がした!", + (incr > 1 || incr < -1) ? "とても ": "", + jconj_adj((incr > 0) ? plusattr[ndx] : minusattr[ndx])); +#endif flags.botl = 1; if (moves > 1 && (ndx == A_STR || ndx == A_CON)) (void)encumber_msg(); @@ -420,20 +527,40 @@ /* then print an explanation */ switch(i) { case A_STR: You((mod_val >0) ? +#if 0 /*JP*/ "must have been exercising." : "must have been abusing your body."); +#else + "運動したに違いない." : + "体を酷使したに違いない."); +#endif break; case A_WIS: You((mod_val >0) ? +#if 0 /*JP*/ "must have been very observant." : "haven't been paying attention."); +#else + "慎重に行動してたに違いない." : + "注意不足だったに違いない."); +#endif break; case A_DEX: You((mod_val >0) ? +#if 0 /*JP*/ "must have been working on your reflexes." : "haven't been working on reflexes lately."); +#else + "反射神経を使ったに違いない." : + "最近反射神経を使ってなかったに違いない."); +#endif break; case A_CON: You((mod_val >0) ? +#if 0 /*JP*/ "must be leading a healthy life-style." : "haven't been watching your health."); +#else + "健康的な生活をしていたに違いない." : + "健康管理を怠っていたに違いない."); +#endif break; } } @@ -592,13 +719,22 @@ *(abil->ability) |= mask; if(!(*(abil->ability) & INTRINSIC & ~mask)) { if(*(abil->gainstr)) +/*JP You_feel("%s!", abil->gainstr); +*/ + You("%sような気がした!", abil->gainstr); } } else if (oldlevel >= abil->ulevel && newlevel < abil->ulevel) { *(abil->ability) &= ~mask; if(!(*(abil->ability) & INTRINSIC)) { if(*(abil->losestr)) +/*JP You_feel("%s!", abil->losestr); +*/ + You("%sような気がした!", abil->losestr); +/*JP +** この条件は満さないはず. +*/ else if(*(abil->gainstr)) You_feel("less %s!", abil->gainstr); } diff -aurbN -xCVS -xXTAGS nethack/src/ball.c jnethack/src/ball.c --- nethack/src/ball.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/ball.c 2003-12-10 03:31:15.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + /* Ball & Chain =============================================================*/ #include "hack.h" @@ -17,7 +24,10 @@ gets_hit = (((uball->ox != u.ux) || (uball->oy != u.uy)) && ((uwep == uball)? FALSE : (boolean)rn2(5))); if (carried(uball)) { +/*JP pline("Startled, you drop the iron ball."); +*/ + pline("驚いてあなたは鉄球を落した."); if (uwep == uball) setuwep((struct obj *)0); if (uswapwep == uball) @@ -29,17 +39,31 @@ } if(gets_hit){ int dmg = rn1(7,25); +/*JP pline_The("iron ball falls on your %s.", +*/ + pline("鉄球はあなたの%sの上に落ちた.", body_part(HEAD)); if (uarmh) { if(is_metallic(uarmh)) { +/*JP pline("Fortunately, you are wearing a hard helmet."); +*/ + pline("幸運にも,あなたは固い兜を身につけていた."); dmg = 3; } else if (flags.verbose) +/*JP Your("%s does not protect you.", xname(uarmh)); +*/ + Your("%sでは守れない.", xname(uarmh)); } +#if 0 /*JP*/ losehp(dmg, "crunched in the head by an iron ball", NO_KILLER_PREFIX); +#else + losehp(dmg, "鉄球で頭を打って", + KILLED_BY); +#endif } } @@ -555,8 +579,13 @@ drag: if (near_capacity() > SLT_ENCUMBER && dist2(x, y, u.ux, u.uy) <= 2) { +#if 0 /*JP*/ You("cannot %sdrag the heavy iron ball.", invent ? "carry all that and also " : ""); +#else + You("%s重い鉄球をひきずることができない.", + invent ? "それだけの荷物を持ったまま" : ""); +#endif nomul(0); return FALSE; } @@ -573,12 +602,18 @@ t->ttyp == TRAPDOOR)) ) { if (Levitation) { +/*JP You_feel("a tug from the iron ball."); +*/ + You("鉄球に引っぱられた."); if (t) t->tseen = 1; } else { struct monst *victim; +/*JP You("are jerked back by the iron ball!"); +*/ + You("鉄球にぐいと引っぱられた!"); if ((victim = m_at(uchain->ox, uchain->oy)) != 0) { int tmp; @@ -651,33 +686,60 @@ if (x != u.ux || y != u.uy) { struct trap *t; +/*JP const char *pullmsg = "The ball pulls you out of the %s!"; +*/ + const char *pullmsg = "鉄球は%sからあなたを引っぱり出した!"; if (u.utrap && u.utraptype != TT_INFLOOR) { switch(u.utraptype) { case TT_PIT: +/*JP pline(pullmsg, "pit"); +*/ + pline(pullmsg, "落し穴"); break; case TT_WEB: +/*JP pline(pullmsg, "web"); +*/ + pline(pullmsg, "くもの巣"); +/*JP pline_The("web is destroyed!"); +*/ + pline("くもの巣はこわれた!"); deltrap(t_at(u.ux,u.uy)); break; case TT_LAVA: +/*JP pline(pullmsg, "lava"); +*/ + pline(pullmsg, "溶岩"); break; case TT_BEARTRAP: { register long side = rn2(3) ? LEFT_SIDE : RIGHT_SIDE; +/*JP pline(pullmsg, "bear trap"); +*/ + pline(pullmsg, "熊の罠"); set_wounded_legs(side, rn1(1000, 500)); #ifdef STEED if (!u.usteed) #endif { +#if 0 /*JP*/ Your("%s %s is severely damaged.", (side == LEFT_SIDE) ? "left" : "right", body_part(LEG)); +#else + Your("%s%sはひどい傷を負った.", + (side == LEFT_SIDE) ? "左" : "右", + body_part(LEG)); +#endif +/*JP losehp(2, "leg damage from being pulled out of a bear trap", +*/ + losehp(2, "熊の罠から抜けようと足を引っぱって", KILLED_BY); } break; @@ -734,8 +796,13 @@ nextobj = otmp->nobj; if ((otmp != uball) && (rnd(capacity) <= (int)otmp->owt)) { if (canletgo(otmp, "")) { +#if 0 /*JP*/ Your("%s you down the stairs.", aobjnam(otmp, "follow")); +#else + You("%sと一緒に階段を降りた.", + xname(otmp)); +#endif dropx(otmp); } } @@ -761,26 +828,51 @@ forward = carried(uball) && (uwep == uball || !uwep || !rn2(3)); if (carried(uball)) +/*JP You("lose your grip on the iron ball."); +*/ + You("鉄球を手から落してしまった."); if (forward) { if(rn2(6)) { +/*JP pline_The("iron ball drags you downstairs!"); +*/ + You("鉄球によって階段をころがり落ちた!"); +#if 0 /*JP*/ losehp(rnd(6), "dragged downstairs by an iron ball", NO_KILLER_PREFIX); +#else + losehp(rnd(6), "鉄球により階段をころがり落ちて", + KILLED_BY); +#endif litter(); } } else { if(rn2(2)) { +/*JP pline_The("iron ball smacks into you!"); +*/ + pline("鉄球はあなたにゴツンとぶつかった!"); +/*JP losehp(rnd(20), "iron ball collision", KILLED_BY_AN); +*/ + losehp(rnd(20), "鉄球の衝突で", KILLED_BY_AN); exercise(A_STR, FALSE); dragchance -= 2; } if( (int) dragchance >= rnd(6)) { +/*JP pline_The("iron ball drags you downstairs!"); +*/ + You("鉄球によって階段をころがり落ちた!"); +#if 0 /*JP*/ losehp(rnd(3), "dragged downstairs by an iron ball", NO_KILLER_PREFIX); +#else + losehp(rnd(3), "鉄球により階段をころがり落ちて", + KILLED_BY); +#endif exercise(A_STR, FALSE); litter(); } diff -aurbN -xCVS -xXTAGS nethack/src/bones.c jnethack/src/bones.c --- nethack/src/bones.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/bones.c 2003-12-10 03:31:15.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985,1993. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "lev.h" @@ -280,8 +287,13 @@ } mtmp = christen_monst(mtmp, plname); newsym(u.ux, u.uy); +#if 0 /*JP*/ Your("body rises from the dead as %s...", an(mons[u.ugrave_arise].mname)); +#else + Your("体は%sとして死体から蘇った...", + jtrns_mon_gen(mons[u.ugrave_arise].mname, mtmp->female)); +#endif display_nhwindow(WIN_MESSAGE, FALSE); drop_upon_death(mtmp, (struct obj *)0); m_dowear(mtmp, TRUE); @@ -395,7 +407,10 @@ #ifdef WIZARD if (!wizard) #endif +/*JP pline("Discarding unuseable bones; no need to panic..."); +*/ + pline("使えない骨を捨てた.慌てる必要はない..."); } else { #ifdef WIZARD if(wizard) { diff -aurbN -xCVS -xXTAGS nethack/src/botl.c jnethack/src/botl.c --- nethack/src/botl.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/botl.c 2003-12-17 00:50:43.000000000 +0900 @@ -2,18 +2,34 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #ifdef OVL0 extern const char *hu_stat[]; /* defined in eat.c */ const char * const enc_stat[] = { +#if 0 /*JP*/ "", "Burdened", "Stressed", "Strained", "Overtaxed", "Overloaded" +#else + "", + "よろめき", + "圧迫", + "限界", + "荷重", + "超過" +#endif }; STATIC_DCL void NDECL(bot1); @@ -174,14 +190,24 @@ Strcpy(newbot1, plname); if('a' <= newbot1[0] && newbot1[0] <= 'z') newbot1[0] += 'A'-'a'; +#if 1 /*JP*/ + if(is_kanji1(newbot1, 9)) + newbot1[9] = '_'; +#endif newbot1[10] = 0; +/*JP Sprintf(nb = eos(newbot1)," the "); +*/ + Sprintf(nb = eos(newbot1)," "); if (Upolyd) { char mbot[BUFSZ]; int k = 0; +/*JP Strcpy(mbot, mons[u.umonnum].mname); +*/ + Strcpy(mbot, jtrns_mon_gen(mons[u.umonnum].mname, flags.female)); while(mbot[k] != 0) { if ((k == 0 || (k > 0 && mbot[k-1] == ' ')) && 'a' <= mbot[k] && mbot[k] <= 'z') @@ -199,21 +225,45 @@ Sprintf(nb = eos(nb),"%*s", i-j, " "); /* pad with spaces */ if (ACURR(A_STR) > 18) { if (ACURR(A_STR) > STR18(100)) +/*JP Sprintf(nb = eos(nb),"St:%2d ",ACURR(A_STR)-100); +*/ + Sprintf(nb = eos(nb),"強:%2d ",ACURR(A_STR)-100); else if (ACURR(A_STR) < STR18(100)) +/*JP Sprintf(nb = eos(nb), "St:18/%02d ",ACURR(A_STR)-18); +*/ + Sprintf(nb = eos(nb), "強:18/%02d ",ACURR(A_STR)-18); else +#if 0 /*JP*/ Sprintf(nb = eos(nb),"St:18/** "); +#else + Sprintf(nb = eos(nb),"強:18/** "); +#endif } else +/*JP Sprintf(nb = eos(nb), "St:%-1d ",ACURR(A_STR)); +*/ + Sprintf(nb = eos(nb), "強:%-1d ",ACURR(A_STR)); Sprintf(nb = eos(nb), +/*JP "Dx:%-1d Co:%-1d In:%-1d Wi:%-1d Ch:%-1d", +*/ + "早:%-1d 耐:%-1d 知:%-1d 賢:%-1d 魅:%-1d ", ACURR(A_DEX), ACURR(A_CON), ACURR(A_INT), ACURR(A_WIS), ACURR(A_CHA)); +#if 0 /*JP*/ Sprintf(nb = eos(nb), (u.ualign.type == A_CHAOTIC) ? " Chaotic" : (u.ualign.type == A_NEUTRAL) ? " Neutral" : " Lawful"); +#else + Sprintf(nb = eos(nb), (u.ualign.type == A_CHAOTIC) ? "混沌" : + (u.ualign.type == A_NEUTRAL) ? "中立" : "秩序"); +#endif #ifdef SCORE_ON_BOTL if (flags.showscore) +/*JP Sprintf(nb = eos(nb), " S:%ld", botl_score()); +*/ + Sprintf(nb = eos(nb), "%ld点", botl_score()); #endif curs(WIN_STATUS, 1, 0); putstr(WIN_STATUS, 0, newbot1); @@ -228,15 +278,27 @@ /* TODO: Add in dungeon name */ if (Is_knox(&u.uz)) +/*JP Sprintf(buf, "%s ", dungeons[u.uz.dnum].dname); +*/ + Sprintf(buf, "%s ", jtrns_obj('d', dungeons[u.uz.dnum].dname)); else if (In_quest(&u.uz)) +/*JP Sprintf(buf, "Home %d ", dunlev(&u.uz)); +*/ + Sprintf(buf, "故郷 %d ", dunlev(&u.uz)); else if (In_endgame(&u.uz)) Sprintf(buf, +/*JP Is_astralevel(&u.uz) ? "Astral Plane " : "End Game "); +*/ + Is_astralevel(&u.uz) ? "精霊界 " : "最終試練 "); else { /* ports with more room may expand this one */ +/*JP Sprintf(buf, "Dlvl:%-2d ", depth(&u.uz)); +*/ + Sprintf(buf, "地下:%-2d ", depth(&u.uz)); ret = 0; } return ret; @@ -256,7 +318,10 @@ if(hp < 0) hp = 0; (void) describe_level(newbot2); Sprintf(nb = eos(newbot2), +/*JP "%c:%-2ld HP:%d(%d) Pw:%d(%d) AC:%-2d", oc_syms[COIN_CLASS], +*/ + "%c:%-2ld 体:%d(%d) 魔:%d(%d) 鎧:%-2d", oc_syms[COIN_CLASS], #ifndef GOLDOBJ u.ugold, #else @@ -268,28 +333,58 @@ Sprintf(nb = eos(nb), " HD:%d", mons[u.umonnum].mlevel); #ifdef EXP_ON_BOTL else if(flags.showexp) +/*JP Sprintf(nb = eos(nb), " Xp:%u/%-1ld", u.ulevel,u.uexp); +*/ + Sprintf(nb = eos(nb), " 経験:%u/%-1ld", u.ulevel,u.uexp); #endif else +/*JP Sprintf(nb = eos(nb), " Exp:%u", u.ulevel); +*/ + Sprintf(nb = eos(nb), " 経験:%u", u.ulevel); if(flags.time) +/*JP Sprintf(nb = eos(nb), " T:%ld", moves); +*/ + Sprintf(nb = eos(nb), " 歩:%ld", moves); if(strcmp(hu_stat[u.uhs], " ")) { Sprintf(nb = eos(nb), " "); Strcat(newbot2, hu_stat[u.uhs]); } +/*JP if(Confusion) Sprintf(nb = eos(nb), " Conf"); +*/ + if(Confusion) Sprintf(nb = eos(nb), " 混乱"); if(Sick) { if (u.usick_type & SICK_VOMITABLE) +/*JP Sprintf(nb = eos(nb), " FoodPois"); +*/ + Sprintf(nb = eos(nb), " 食毒"); if (u.usick_type & SICK_NONVOMITABLE) +/*JP Sprintf(nb = eos(nb), " Ill"); +*/ + Sprintf(nb = eos(nb), " 病気"); } +/*JP if(Blind) Sprintf(nb = eos(nb), " Blind"); +*/ + if(Blind) Sprintf(nb = eos(nb), " 盲目"); +/*JP if(Stunned) Sprintf(nb = eos(nb), " Stun"); +*/ + if(Stunned) Sprintf(nb = eos(nb), " 眩暈"); +/*JP if(Hallucination) Sprintf(nb = eos(nb), " Hallu"); +*/ + if(Hallucination) Sprintf(nb = eos(nb), " 幻覚"); +/*JP if(Slimed) Sprintf(nb = eos(nb), " Slime"); +*/ + if(Slimed) Sprintf(nb = eos(nb), " どろどろ"); if(cap > UNENCUMBERED) Sprintf(nb = eos(nb), " %s", enc_stat[cap]); curs(WIN_STATUS, 1, 1); diff -aurbN -xCVS -xXTAGS nethack/src/cmd.c jnethack/src/cmd.c --- nethack/src/cmd.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/cmd.c 2004-07-29 01:04:23.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "func_tab.h" /* #define DEBUG */ /* uncomment for debugging */ @@ -308,9 +315,15 @@ datawin = create_nhwindow(NHW_TEXT); putstr(datawin, 0, ""); +/*JP putstr(datawin, 0, " Extended Commands List"); +*/ + putstr(datawin, 0, " 拡張コマンド一覧"); putstr(datawin, 0, ""); +/*JP putstr(datawin, 0, " Press '#', then type:"); +*/ + putstr(datawin, 0, " '#'を押したあとタイプせよ:"); putstr(datawin, 0, ""); for(efp = extcmdlist; efp->ef_txt; efp++) { @@ -401,10 +414,16 @@ Sprintf(prompt, "%s [%s]", choices[i]->ef_txt, choices[i]->ef_desc); } else if (acount == 1) { +/*JP Sprintf(prompt, "%s or %s", choices[i-1]->ef_txt, +*/ + Sprintf(prompt, "%s または %s", choices[i-1]->ef_txt, choices[i]->ef_txt); } else { +/*JP Strcat(prompt," or "); +*/ + Strcat(prompt," または "); Strcat(prompt, choices[i]->ef_txt); } ++acount; @@ -415,7 +434,10 @@ any.a_char = prevaccelerator; add_menu(win, NO_GLYPH, &any, any.a_char, 0, ATR_NONE, buf, FALSE); } +/*JP Sprintf(prompt, "Extended Command: %s", cbuf); +*/ + Sprintf(prompt, "拡張コマンド: %s", cbuf); end_menu(win, prompt); n = select_menu(win, PICK_ONE, &pick_list); destroy_nhwindow(win); @@ -460,18 +482,33 @@ if(IS_FOUNTAIN(levl[u.ux][u.uy].typ)) { if (split_mon(&youmonst, (struct monst *)0)) dryup(u.ux, u.uy, TRUE); +/*JP } else There("is no fountain here."); +*/ + } else pline("ここには泉はない."); } else if (is_unicorn(youmonst.data)) { use_unicorn_horn((struct obj *)0); return 1; } else if (youmonst.data->msound == MS_SHRIEK) { +/*JP You("shriek."); +*/ + You("金切り声をあげた."); if(u.uburied) +/*JP pline("Unfortunately sound does not carry well through rock."); +*/ + pline("残念ながら音は岩をうまく伝わらない."); else aggravate(); } else if (Upolyd) +/*JP pline("Any special ability you may have is purely reflexive."); +*/ + pline("あなたの持っている特殊能力はどれも受動的だ."); +/*JP else You("don't have a special ability in your normal form!"); +*/ + else You("特殊能力を持っていない!"); return 0; } @@ -479,15 +516,27 @@ enter_explore_mode() { if(!discover && !wizard) { +/*JP pline("Beware! From explore mode there will be no return to normal game."); +*/ + pline("警告!発見モードに入ったら通常モードには戻れない."); +/*JP if (yn("Do you want to enter explore mode?") == 'y') { +*/ + if (yn("発見モードに移りますか?") == 'y') { clear_nhwindow(WIN_MESSAGE); +/*JP You("are now in non-scoring explore mode."); +*/ + You("スコアがのらない発見モードに移行した."); discover = TRUE; } else { clear_nhwindow(WIN_MESSAGE); +/*JP pline("Resuming normal game."); +*/ + pline("通常モードを続ける."); } } return 0; @@ -507,7 +556,10 @@ flags.verbose = save_verbose; (void) encumber_msg(); } else +/*JP pline("Unavailable command '^W'."); +*/ + pline("'^W'コマンドは使えない."); return 0; } @@ -516,7 +568,10 @@ wiz_identify() { if (wizard) identify_pack(0); +/*JP else pline("Unavailable command '^I'."); +*/ + else pline("'^I'コマンドは使えない."); return 0; } @@ -538,7 +593,10 @@ HConfusion = save_Hconf; HHallucination = save_Hhallu; } else +/*JP pline("Unavailable command '^F'."); +*/ + pline("'^F'コマンドは使えない."); return 0; } @@ -547,7 +605,10 @@ wiz_genesis() { if (wizard) (void) create_particular(); +/*JP else pline("Unavailable command '^G'."); +*/ + else pline("'^G'コマンドは使えない."); return 0; } @@ -556,7 +617,10 @@ wiz_where() { if (wizard) (void) print_dungeon(FALSE, (schar *)0, (xchar *)0); +/*JP else pline("Unavailable command '^O'."); +*/ + else pline("'^O'コマンドは使えない."); return 0; } @@ -565,7 +629,10 @@ wiz_detect() { if(wizard) (void) findit(); +/*JP else pline("Unavailable command '^E'."); +*/ + else pline("'^E'コマンドは使えない."); return 0; } @@ -574,7 +641,10 @@ wiz_level_tele() { if (wizard) level_tele(); +/*JP else pline("Unavailable command '^V'."); +*/ + else pline("'^V'コマンドは使えない."); return 0; } @@ -583,8 +653,13 @@ wiz_mon_polycontrol() { iflags.mon_polycontrol = !iflags.mon_polycontrol; +#if 0 /*JP*/ pline("Monster polymorph control is %s.", iflags.mon_polycontrol ? "on" : "off"); +#else + pline("怪物の変化制御: %s", + iflags.mon_polycontrol ? "オン" : "オフ"); +#endif return 0; } @@ -762,22 +837,41 @@ /* -enlightenment and conduct- */ static winid en_win; static const char +#if 0 /*JP*/ You_[] = "You ", are[] = "are ", were[] = "were ", have[] = "have ", had[] = "had ", can[] = "can ", could[] = "could "; +#else + You_[] = "あなたは", + are[] = "である", were[] = "であった", + have[] = "をもっている", had[] = "をもっていた", + can[] = "できる", could[] = "できた", + iru[] = "いる", ita[] = "いた"; +#endif +#if 0 /*JP*/ static const char have_been[] = "have been ", have_never[] = "have never ", never[] = "never "; +#endif +#if 0 /*JP*/ #define enl_msg(prefix,present,past,suffix) \ enlght_line(prefix, final ? past : present, suffix) +#else +#define enl_msg(prefix,present,past,suffix) \ + enlght_line(prefix, suffix, final ? past : present) +#endif #define you_are(attr) enl_msg(You_,are,were,attr) #define you_have(attr) enl_msg(You_,have,had,attr) #define you_can(attr) enl_msg(You_,can,could,attr) +#if 0 /*JP*/ #define you_have_been(goodthing) enl_msg(You_,have_been,were,goodthing) #define you_have_never(badthing) enl_msg(You_,have_never,never,badthing) #define you_have_X(something) enl_msg(You_,have,(const char *)"",something) +#else +#define you_are_ing(goodthing) enl_msg(You_,iru,ita,goodthing) +#endif static void enlght_line(start, middle, end) @@ -785,7 +879,11 @@ { char buf[BUFSZ]; +#if 0 /*JP*/ Sprintf(buf, "%s%s%s.", start, middle, end); +#else + Sprintf(buf, "%s%s%s.", start, middle, end); +#endif putstr(en_win, 0, buf); } @@ -810,19 +908,34 @@ } else { int absamt = abs(incamt); +#if 0 /*JP*/ if (absamt <= 3) modif = "small"; else if (absamt <= 6) modif = "moderate"; else if (absamt <= 12) modif = "large"; else modif = "huge"; +#else + if (absamt <= 3) modif = "僅かな"; + else if (absamt <= 6) modif = "中程度の"; + else if (absamt <= 12) modif = "大きな"; + else modif = "強大な"; +#endif } +#if 0 /*JP*/ bonus = (incamt > 0) ? "bonus" : "penalty"; +#else + bonus = (incamt > 0) ? "ボーナス" : "ペナルティ"; +#endif /* "bonus to hit" vs "damage bonus" */ if (!strcmp(inctyp, "damage")) { const char *ctmp = inctyp; inctyp = bonus; bonus = ctmp; } +#if 0 /*JP*/ Sprintf(outbuf, "%s %s %s", an(modif), bonus, inctyp); +#else + Sprintf(outbuf, "%sに%s%s", inctyp, modif, bonus); +#endif return outbuf; } @@ -834,39 +947,84 @@ char buf[BUFSZ]; en_win = create_nhwindow(NHW_MENU); +/*JP putstr(en_win, 0, final ? "Final Attributes:" : "Current Attributes:"); +*/ + putstr(en_win, 0, final ? "最終属性:" : "現在の属性:"); putstr(en_win, 0, ""); #ifdef ELBERETH if (u.uevent.uhand_of_elbereth) { static const char * const hofe_titles[3] = { +#if 0 /*JP*/ "the Hand of Elbereth", "the Envoy of Balance", "the Glory of Arioch" +#else + "エルベレスの御手", + "調和の使者", + "アリオッチの名誉" +#endif }; you_are(hofe_titles[u.uevent.uhand_of_elbereth - 1]); } #endif /* note: piousness 20 matches MIN_QUEST_ALIGN (quest.h) */ +/*JP if (u.ualign.record >= 20) you_are("piously aligned"); +*/ + if (u.ualign.record >= 20) you_have("敬虔な信仰心"); +/*JP else if (u.ualign.record > 13) you_are("devoutly aligned"); +*/ + else if (u.ualign.record > 13) you_have("心からの信仰心"); +/*JP else if (u.ualign.record > 8) you_are("fervently aligned"); +*/ + else if (u.ualign.record > 8) you_have("熱心な信仰心"); +/*JP else if (u.ualign.record > 3) you_are("stridently aligned"); +*/ + else if (u.ualign.record > 3) you_have("おおげさな信仰心"); +/*JP else if (u.ualign.record == 3) you_are("aligned"); +*/ + else if (u.ualign.record == 3) you_have("普通の信仰心"); +/*JP else if (u.ualign.record > 0) you_are("haltingly aligned"); +*/ + else if (u.ualign.record > 0) you_have("躊躇しながらも信仰心"); +/*JP else if (u.ualign.record == 0) you_are("nominally aligned"); +*/ + else if (u.ualign.record == 0) you_have("形だけの信仰心"); +/*JP else if (u.ualign.record >= -3) you_have("strayed"); +*/ + else if (u.ualign.record >= -3) you_are_ing("信仰に迷いをもって"); +/*JP else if (u.ualign.record >= -8) you_have("sinned"); +*/ + else if (u.ualign.record >= -8) you_are_ing("罪を負って"); +/*JP else you_have("transgressed"); +*/ + else you_are_ing("信仰から逸脱して"); #ifdef WIZARD if (wizard) { +#if 0 /*JP*/ Sprintf(buf, " %d", u.ualign.record); enl_msg("Your alignment ", "is", "was", buf); +#else + Sprintf(buf, "あなたの属性値は%d", u.ualign.record); + you_are(buf); +#endif } #endif /*** Resistances to troubles ***/ +#if 0 /*JP:T*/ if (Fire_resistance) you_are("fire resistant"); if (Cold_resistance) you_are("cold resistant"); if (Sleep_resistance) you_are("sleep resistant"); @@ -881,37 +1039,96 @@ you_are("petrification resistant"); if (Invulnerable) you_are("invulnerable"); if (u.uedibility) you_can("recognize detrimental food"); +#else + if (Fire_resistance) you_have("火への耐性"); + if (Cold_resistance) you_have("寒さへの耐性"); + if (Disint_resistance) you_have("粉砕への耐性"); + if (Shock_resistance) you_have("電撃への耐性"); + if (Sleep_resistance) you_have("眠りへの耐性"); + if (Poison_resistance) you_have("毒への耐性"); + if (Drain_resistance) you_have("レベルダウンへの耐性"); + if (Sick_resistance) you_have("病気に対する免疫"); + if (Antimagic) you_have("魔法防御能力"); + if (Acid_resistance) you_have("酸への耐性"); + if (Stone_resistance) + you_have("石化への耐性"); + if (Invulnerable) you_are("不死身"); + if (u.uedibility) you_can("有害な食料を識別"); +#endif /*** Troubles ***/ if (Halluc_resistance) +/*JP enl_msg("You resist", "", "ed", " hallucinations"); +*/ + you_have("幻覚への耐性"); if (final) { +/*JP if (Hallucination) you_are("hallucinating"); +*/ + if (Hallucination) you_are("幻覚状態"); +/*JP if (Stunned) you_are("stunned"); +*/ + if (Stunned) you_are("くらくら状態"); +/*JP if (Confusion) you_are("confused"); +*/ + if (Confusion) you_are("混乱状態"); +/*JP if (Blinded) you_are("blinded"); +*/ + if (Blinded) you_are("盲目"); if (Sick) { if (u.usick_type & SICK_VOMITABLE) +/*JP you_are("sick from food poisoning"); +*/ + enl_msg("あなたは食中毒で気分が悪", "い", "かった", ""); if (u.usick_type & SICK_NONVOMITABLE) +/*JP you_are("sick from illness"); +*/ + enl_msg("あなたは病気で気分が悪", "い", "かった", ""); } } +/*JP if (Stoned) you_are("turning to stone"); +*/ + if (Stoned) enl_msg("あなたは石になっ", "た", "ている", ""); +/*JP if (Slimed) you_are("turning into slime"); +*/ + if (Slimed) you_are_ing("スライム状になって"); +/*JP if (Strangled) you_are((u.uburied) ? "buried" : "being strangled"); +*/ + if (Strangled) you_are_ing((u.uburied) ? "窒息して" : "首を絞められて"); if (Glib) { +#if 0 /*JP:T*/ Sprintf(buf, "slippery %s", makeplural(body_part(FINGER))); you_have(buf); +#else + Sprintf(buf, "%sがぬるぬるして", body_part(FINGER)); + enl_msg(buf, iru, ita, ""); +#endif } +/*JP if (Fumbling) enl_msg("You fumble", "", "d", ""); +*/ + if (Fumbling) you_are_ing("不器用になって"); if (Wounded_legs #ifdef STEED && !u.usteed #endif ) { +#if 0 /*JP:T*/ Sprintf(buf, "wounded %s", makeplural(body_part(LEG))); you_have(buf); +#else + Sprintf(buf, "%sを怪我して", makeplural(body_part(LEG))); + you_are_ing(buf); +#endif } #if defined(WIZARD) && defined(STEED) if (Wounded_legs && u.usteed && wizard) { @@ -921,26 +1138,59 @@ enl_msg(buf, " has", " had", " wounded legs"); } #endif +/*JP if (Sleeping) enl_msg("You ", "fall", "fell", " asleep"); +*/ + if (Sleeping) you_are_ing("眠って"); +/*JP if (Hunger) enl_msg("You hunger", "", "ed", " rapidly"); +*/ + if (Hunger) enl_msg("あなたはすぐに腹が減る状態", "である", "だった", ""); /*** Vision and senses ***/ +/*JP if (See_invisible) enl_msg(You_, "see", "saw", " invisible"); +*/ + if (See_invisible) enl_msg("あなたは透明なものを見られ", "る", "た", ""); +/*JP if (Blind_telepat) you_are("telepathic"); +*/ + if (Blind_telepat) you_have("テレパシー"); +/*JP if (Warning) you_are("warned"); +*/ + if (Warning) you_have("警戒能力"); if (Warn_of_mon && flags.warntype) { +#if 0 /*JP*/ Sprintf(buf, "aware of the presence of %s", (flags.warntype & M2_ORC) ? "orcs" : (flags.warntype & M2_DEMON) ? "demons" : something); you_are(buf); +#else + Sprintf(buf, "%sの存在を感じる能力", + (flags.warntype & M2_ORC) ? "オーク" : + (flags.warntype & M2_DEMON) ? "悪魔" : + something); + you_have(buf); +#endif } + +#if 0 /*JP*/ if (Undead_warning) you_are("warned of undead"); if (Searching) you_have("automatic searching"); if (Clairvoyant) you_are("clairvoyant"); if (Infravision) you_have("infravision"); if (Detect_monsters) you_are("sensing the presence of monsters"); if (u.umconf) you_are("going to confuse monsters"); +#else + if (Undead_warning) you_have("不死の生物への警戒能力"); + if (Searching) you_have("探査能力"); + if (Clairvoyant) you_have("千里眼能力"); + if (Infravision) you_have("暗闇で物を見る能力"); + if (Detect_monsters) you_have("怪物を探す能力"); + if (u.umconf) you_have("怪物を混乱させる能力"); +#endif /*** Appearance and behavior ***/ if (Adornment) { @@ -949,10 +1199,17 @@ if(uleft && uleft->otyp == RIN_ADORNMENT) adorn += uleft->spe; if(uright && uright->otyp == RIN_ADORNMENT) adorn += uright->spe; if (adorn < 0) +/*JP you_are("poorly adorned"); +*/ + you_are_ing("みずほらしく着飾って"); else +/*JP you_are("adorned"); +*/ + you_are_ing("着飾って"); } +#if 0 /*JP*/ if (Invisible) you_are("invisible"); else if (Invis) you_are("invisible to others"); /* ordinarily "visible" is redundant; this is a special case for @@ -963,8 +1220,21 @@ if (Stealth) you_are("stealthy"); if (Aggravate_monster) enl_msg("You aggravate", "", "d", " monsters"); if (Conflict) enl_msg("You cause", "", "d", " conflict"); +#else + if (Invisible) you_are("透明"); + else if (Invis) you_are("他人に対して透明"); + /* ordinarily "visible" is redundant; this is a special case for + the situation when invisibility would be an expected attribute */ + else if ((HInvis || EInvis || pm_invisible(youmonst.data)) && BInvis) + you_are("不透明"); + if (Displaced) you_have("幻影能力"); + if (Stealth) you_have("人目を盗む能力"); + if (Aggravate_monster) you_are_ing("反感をかって"); + if (Conflict) you_are_ing("闘争を引き起こして"); +#endif /*** Transportation ***/ +#if 0 /*JP*/ if (Jumping) you_can("jump"); if (Teleportation) you_can("teleport"); if (Teleport_control) you_have("teleport control"); @@ -976,35 +1246,80 @@ if (Breathless) you_can("survive without air"); else if (Amphibious) you_can("breathe water"); if (Passes_walls) you_can("walk through walls"); +#else + if (Jumping) you_can("跳躍することが"); + if (Teleportation) you_can("瞬間移動が"); + if (Teleport_control) you_have("瞬間移動の制御能力"); + if (Lev_at_will) you_have("上手く浮遊する能力"); + else if (Levitation) you_are("浮遊状態"); /* without control */ + else if (Flying) you_can("飛ぶことが"); + if (Wwalking) you_can("水の上を歩くことが"); + if (Swimming) you_can("泳ぐことが"); + if (Breathless) you_can("空気なしで生き延びることが"); + else if (Amphibious) you_can("水中で呼吸が"); + if (Passes_walls) you_can("壁を通り抜けることが"); +#endif #ifdef STEED /* If you die while dismounting, u.usteed is still set. Since several * places in the done() sequence depend on u.usteed, just detect this * special case. */ if (u.usteed && (final < 2 || strcmp(killer, "riding accident"))) { +#if 0 /*JP*/ Sprintf(buf, "riding %s", y_monnam(u.usteed)); you_are(buf); +#else + Sprintf(buf, "%sに乗って", y_monnam(u.usteed)); + you_are_ing(buf); +#endif } #endif if (u.uswallow) { +#if 0 /*JP*/ Sprintf(buf, "swallowed by %s", a_monnam(u.ustuck)); #ifdef WIZARD if (wizard) Sprintf(eos(buf), " (%u)", u.uswldtim); #endif you_are(buf); +#else + Sprintf(buf, "%sに飲み込まれて", a_monnam(u.ustuck)); +#ifdef WIZARD + if (wizard) Sprintf(eos(buf), " (%u)", u.uswldtim); +#endif + you_are_ing(buf); +#endif } else if (u.ustuck) { +#if 0 /*JP*/ Sprintf(buf, "%s %s", (Upolyd && sticks(youmonst.data)) ? "holding" : "held by", a_monnam(u.ustuck)); you_are(buf); +#else + Sprintf(buf, "%s%s", + a_monnam(u.ustuck), + (Upolyd && sticks(youmonst.data)) ? "を捕まえて" : "に捕まって"); + you_are_ing(buf); +#endif } /*** Physical attributes ***/ if (u.uhitinc) +/*JP you_have(enlght_combatinc("to hit", u.uhitinc, final, buf)); +*/ + you_have(enlght_combatinc("命中率", u.uhitinc, final, buf)); if (u.udaminc) +/*JP you_have(enlght_combatinc("damage", u.udaminc, final, buf)); +*/ + you_have(enlght_combatinc("ダメージ", u.udaminc, final, buf)); +/*JP if (Slow_digestion) you_have("slower digestion"); +*/ + if (Slow_digestion) enl_msg("食物の消化が遅", "い", "かった", ""); +/*JP if (Regeneration) enl_msg("You regenerate", "", "d", ""); +*/ + if (Regeneration) you_have("再生能力"); if (u.uspellprot || Protection) { int prot = 0; @@ -1014,26 +1329,52 @@ prot += u.uspellprot; if (prot < 0) +/*JP you_are("ineffectively protected"); +*/ + you_are_ing("不十分に守られて"); else +/*JP you_are("protected"); +*/ + you_are_ing("守られて"); } +#if 0 /*JP*/ if (Protection_from_shape_changers) you_are("protected from shape changers"); if (Polymorph) you_are("polymorphing"); if (Polymorph_control) you_have("polymorph control"); +#else + if (Protection_from_shape_changers) + you_have("変化怪物への耐性"); + if (Polymorph) you_are_ing("変化して"); + if (Polymorph_control) you_have("変化の制御能力"); +#endif if (u.ulycn >= LOW_PM) { +/*JP Strcpy(buf, an(mons[u.ulycn].mname)); +*/ + Strcpy(buf, jtrns_mon_gen(mons[u.ulycn].mname, flags.female)); you_are(buf); } if (Upolyd) { +#if 0 /*JP*/ if (u.umonnum == u.ulycn) Strcpy(buf, "in beast form"); else Sprintf(buf, "polymorphed into %s", an(youmonst.data->mname)); +#else + if (u.ulycn >= LOW_PM) Strcpy(buf, "獣の姿を"); + else Sprintf(buf, "%sに変化", a_monnam(&youmonst)); +#endif #ifdef WIZARD if (wizard) Sprintf(eos(buf), " (%d)", u.mtimedone); #endif +#if 0 /*JP*/ you_are(buf); +#else + enl_msg(buf, "している", "していた", ""); +#endif } +#if 0 /*JP*/ if (Unchanging) you_can("not change from your current form"); if (Fast) you_are(Very_fast ? "very fast" : "fast"); if (Reflecting) you_have("reflection"); @@ -1042,8 +1383,21 @@ if (Lifesaved) enl_msg("Your life ", "will be", "would have been", " saved"); if (u.twoweap) you_are("wielding two weapons at once"); +#else + if (Unchanging) enl_msg("今の姿から変化することができな", + "い", "かった", ""); + if (Fast) you_have(Very_fast ? "とても素早く行動する能力" : + "素早く行動する能力"); + if (Reflecting) you_have("反射能力"); + if (Free_action) you_have("拘束されない能力"); + if (Fixed_abil) enl_msg("能力が変化しな", "い", "かった", ""); + if (Lifesaved) + enl_msg("あなたの生命は保存されて", iru, ita,""); + if (u.twoweap) you_are("二刀流"); +#endif /*** Miscellany ***/ +#if 0 /*JP*/ if (Luck) { ltmp = abs((int)Luck); Sprintf(buf, "%s%slucky", @@ -1054,19 +1408,46 @@ #endif you_are(buf); } +#else + if (Luck) { + ltmp = abs((int)Luck); + Sprintf(buf, "%s%s", + ltmp >= 10 ? "猛烈に" : ltmp >= 5 ? "とても" : "", + Luck < 0 ? "不幸" : "幸福"); #ifdef WIZARD + if (wizard) Sprintf(eos(buf), "(%d)", Luck); +#endif + you_are(buf); + } +#endif +#ifdef WIZARD +/*JP else if (wizard) enl_msg("Your luck ", "is", "was", " zero"); +*/ + else if (wizard) enl_msg("あなたの運はゼロ", "である", "だった", ""); #endif +#if 0 /*JP*/ if (u.moreluck > 0) you_have("extra luck"); else if (u.moreluck < 0) you_have("reduced luck"); +#else + if (u.moreluck > 0) you_have("さらなる幸運"); + else if (u.moreluck < 0) you_have("さらなる悪運"); +#endif if (carrying(LUCKSTONE) || stone_luck(TRUE)) { ltmp = stone_luck(FALSE); if (ltmp <= 0) +/*JP enl_msg("Bad luck ", "does", "did", " not time out for you"); +*/ + enl_msg("悪運は時間切れにならな", "い", "かった", ""); if (ltmp >= 0) +/*JP enl_msg("Good luck ", "does", "did", " not time out for you"); +*/ + enl_msg("幸運は時間切れにならな", "い", "かった", ""); } +#if 0 /*JP*/ if (u.ugangr) { Sprintf(buf, " %sangry with you", u.ugangr > 6 ? "extremely " : u.ugangr > 3 ? "very " : ""); @@ -1075,12 +1456,23 @@ #endif enl_msg(u_gname(), " is", " was", buf); } else +#else + if (u.ugangr) { + Sprintf(buf, "%sは%s怒って", u_gname(), + u.ugangr > 6 ? "猛烈に" : u.ugangr > 3 ? "とても" : ""); +#ifdef WIZARD + if (wizard) Sprintf(eos(buf), "(%d)", u.ugangr); +#endif + enl_msg(buf, iru, ita, ""); + } else +#endif /* * We need to suppress this when the game is over, because death * can change the value calculated by can_pray(), potentially * resulting in a false claim that you could have prayed safely. */ if (!final) { +#if 0 /*JP*/ #if 0 /* "can [not] safely pray" vs "could [not] have safely prayed" */ Sprintf(buf, "%s%ssafely pray%s", can_pray(FALSE) ? "" : "not ", @@ -1092,6 +1484,13 @@ if (wizard) Sprintf(eos(buf), " (%d)", u.ublesscnt); #endif you_can(buf); +#else /*JP*/ + Strcpy(buf, "あなたは安全に祈ることが"); + if(can_pray(FALSE)) + enl_msg(buf, "できる", "できた", ""); + else + enl_msg(buf, "できない", "できなかった", ""); +#endif } { @@ -1099,6 +1498,7 @@ buf[0] = '\0'; if (final < 2) { /* still in progress, or quit/escaped/ascended */ +#if 0 /*JP*/ p = "survived after being killed "; switch (u.umortality) { case 0: p = !final ? (char *)0 : "survived"; break; @@ -1107,8 +1507,19 @@ case 3: Strcpy(buf, "thrice"); break; default: Sprintf(buf, "%d times", u.umortality); break; +#else + p = "死んだ後復活していた"; + switch (u.umortality) { + case 0: p = !final ? (char *)0 : "生き延びた"; break; + case 1: Strcpy(buf, "一度"); break; + case 2: Strcpy(buf, "二度"); break; + case 3: Strcpy(buf, "三度"); break; + default: Sprintf(buf, "%d回", u.umortality); + break; +#endif } } else { /* game ended in character's death */ +#if 0 /*JP*/ p = "are dead"; switch (u.umortality) { case 0: impossible("dead without dying?"); @@ -1117,8 +1528,20 @@ ordin(u.umortality)); break; } +#else + p = "死んでいる"; + switch (u.umortality) { + case 0: impossible("dead without dying?"); + case 1: break; /* just "are dead" */ + default: Sprintf(buf, "(%d回!)", u.umortality); + break; + } +#endif } +/*JP if (p) enl_msg(You_, "have been killed ", p, buf); +*/ + if (p) enl_msg(You_, "死んでいる", p, buf); } display_nhwindow(en_win, TRUE); @@ -1153,78 +1576,158 @@ buf[0] = buf2[0] = '\0'; tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); +/*JP add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, "Starting", FALSE); +*/ + add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, "開始", FALSE); /* Starting name, race, role, gender */ +/*JP Sprintf(buf, fmtstr, "name", plname); +*/ + Sprintf(buf, fmtstr, "名前", plname); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); +/*JP Sprintf(buf, fmtstr, "race", urace.noun); +*/ + Sprintf(buf, fmtstr, "種族", urace.j); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); +#if 0 /*JP*/ Sprintf(buf, fmtstr, "role", (flags.initgend && urole.name.f) ? urole.name.f : urole.name.m); +#else + Sprintf(buf, fmtstr, "職業", + (flags.initgend && urole.jname.f) ? urole.jname.f : urole.jname.m); +#endif add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); +/*JP Sprintf(buf, fmtstr, "gender", genders[flags.initgend].adj); +*/ + Sprintf(buf, fmtstr, "性別", genders[flags.initgend].j); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); /* Starting alignment */ +/*JP Sprintf(buf, fmtstr, "alignment", align_str(u.ualignbase[A_ORIGINAL])); +*/ + Sprintf(buf, fmtstr, "属性", align_str(u.ualignbase[A_ORIGINAL])); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); /* Current name, race, role, gender */ add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", FALSE); +#if 0 /*JP*/ add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, "Current", FALSE); Sprintf(buf, fmtstr, "race", Upolyd ? youmonst.data->mname : urace.noun); +#else + add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, "現在", FALSE); + Sprintf(buf, fmtstr, "種族", Upolyd ? jtrns_mon_gen(youmonst.data->mname, flags.female) : urace.j); +#endif add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); if (Upolyd) { +#if 0 /*JP*/ Sprintf(buf, fmtstr, "role (base)", (u.mfemale && urole.name.f) ? urole.name.f : urole.name.m); +#else + Sprintf(buf, fmtstr, "職業(基本)", + (u.mfemale && urole.jname.f) ? urole.jname.f : urole.jname.m); +#endif add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); } else { +#if 0 /*JP*/ Sprintf(buf, fmtstr, "role", (flags.female && urole.name.f) ? urole.name.f : urole.name.m); +#else + Sprintf(buf, fmtstr, "職業", + (flags.female && urole.jname.f) ? urole.jname.f : urole.jname.m); +#endif add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); } /* don't want poly_gender() here; it forces `2' for non-humanoids */ genidx = is_neuter(youmonst.data) ? 2 : flags.female; +/*JP Sprintf(buf, fmtstr, "gender", genders[genidx].adj); +*/ + Sprintf(buf, fmtstr, "性別", genders[genidx].j); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); if (Upolyd && (int)u.mfemale != genidx) { +/*JP Sprintf(buf, fmtstr, "gender (base)", genders[u.mfemale].adj); +*/ + Sprintf(buf, fmtstr, "性別(基本)", genders[u.mfemale].j); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); } /* Current alignment */ +/*JP Sprintf(buf, fmtstr, "alignment", align_str(u.ualign.type)); +*/ + Sprintf(buf, fmtstr, "属性", align_str(u.ualign.type)); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); /* Deity list */ add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", FALSE); +/*JP add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, "Deities", FALSE); +*/ + add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, "神", FALSE); Sprintf(buf2, deity_fmtstr, align_gname(A_CHAOTIC), +#if 0 /*JP*/ (u.ualignbase[A_ORIGINAL] == u.ualign.type && u.ualign.type == A_CHAOTIC) ? " (s,c)" : (u.ualignbase[A_ORIGINAL] == A_CHAOTIC) ? " (s)" : (u.ualign.type == A_CHAOTIC) ? " (c)" : ""); +#else + (u.ualignbase[A_ORIGINAL] == u.ualign.type + && u.ualign.type == A_CHAOTIC) ? " (初,現)" : + (u.ualignbase[A_ORIGINAL] == A_CHAOTIC) ? " (初)" : + (u.ualign.type == A_CHAOTIC) ? " (現)" : ""); +#endif +/*JP Sprintf(buf, fmtstr, "Chaotic", buf2); +*/ + Sprintf(buf, fmtstr, "混沌", buf2); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); Sprintf(buf2, deity_fmtstr, align_gname(A_NEUTRAL), +#if 0 /*JP*/ (u.ualignbase[A_ORIGINAL] == u.ualign.type && u.ualign.type == A_NEUTRAL) ? " (s,c)" : (u.ualignbase[A_ORIGINAL] == A_NEUTRAL) ? " (s)" : (u.ualign.type == A_NEUTRAL) ? " (c)" : ""); +#else + (u.ualignbase[A_ORIGINAL] == u.ualign.type + && u.ualign.type == A_NEUTRAL) ? " (初,現)" : + (u.ualignbase[A_ORIGINAL] == A_NEUTRAL) ? " (初)" : + (u.ualign.type == A_NEUTRAL) ? " (現)" : ""); +#endif +/*JP Sprintf(buf, fmtstr, "Neutral", buf2); +*/ + Sprintf(buf, fmtstr, "中立", buf2); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); Sprintf(buf2, deity_fmtstr, align_gname(A_LAWFUL), +#if 0 /*JP*/ (u.ualignbase[A_ORIGINAL] == u.ualign.type && u.ualign.type == A_LAWFUL) ? " (s,c)" : (u.ualignbase[A_ORIGINAL] == A_LAWFUL) ? " (s)" : (u.ualign.type == A_LAWFUL) ? " (c)" : ""); +#else + (u.ualignbase[A_ORIGINAL] == u.ualign.type && + u.ualign.type == A_LAWFUL) ? " (初,現)" : + (u.ualignbase[A_ORIGINAL] == A_LAWFUL) ? " (初)" : + (u.ualign.type == A_LAWFUL) ? " (現)" : ""); +#endif +/*JP Sprintf(buf, fmtstr, "Lawful", buf2); +*/ + Sprintf(buf, fmtstr, "秩序", buf2); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); +/*JP end_menu(tmpwin, "Base Attributes"); +*/ + end_menu(tmpwin, "基本属性"); n = select_menu(tmpwin, PICK_NONE, &selected); destroy_nhwindow(tmpwin); return (n != -1); @@ -1259,81 +1762,157 @@ /* Create the conduct window */ en_win = create_nhwindow(NHW_MENU); +/*JP putstr(en_win, 0, "Voluntary challenges:"); +*/ + putstr(en_win, 0, "自発的挑戦:"); putstr(en_win, 0, ""); if (!u.uconduct.food) +/*JP enl_msg(You_, "have gone", "went", " without food"); +*/ + enl_msg("あなたは食事をし", "ていない", "なかった", ""); /* But beverages are okay */ else if (!u.uconduct.unvegan) +/*JP you_have_X("followed a strict vegan diet"); +*/ + you_are("厳格な菜食主義者"); else if (!u.uconduct.unvegetarian) +/*JP you_have_been("vegetarian"); +*/ + you_are("菜食主義者"); if (!u.uconduct.gnostic) +/*JP you_have_been("an atheist"); +*/ + you_are("無神論者"); if (!u.uconduct.weaphit) +/*JP you_have_never("hit with a wielded weapon"); +*/ + enl_msg("あなたは装備している武器で攻撃し", "ていない", "なかった", ""); #ifdef WIZARD else if (wizard) { +#if 0 /*JP*/ Sprintf(buf, "used a wielded weapon %ld time%s", u.uconduct.weaphit, plur(u.uconduct.weaphit)); you_have_X(buf); +#else + Sprintf(buf, "あなたは%ld回装備した武器を使用し", + u.uconduct.weaphit); + enl_msg(buf, "ている", "た", ""); +#endif } #endif if (!u.uconduct.killer) +/*JP you_have_been("a pacifist"); +*/ + you_are("平和主義者"); if (!u.uconduct.literate) +/*JP you_have_been("illiterate"); +*/ + enl_msg("あなたは読み書きし", "ていない", "なかった", ""); #ifdef WIZARD else if (wizard) { +#if 0 /*JP*/ Sprintf(buf, "read items or engraved %ld time%s", u.uconduct.literate, plur(u.uconduct.literate)); you_have_X(buf); +#else + Sprintf(buf, "%ld回読んだり書いたりし", + u.uconduct.literate); + enl_msg(buf, "ている", "た", ""); +#endif } #endif ngenocided = num_genocides(); if (ngenocided == 0) { +/*JP you_have_never("genocided any monsters"); +*/ + enl_msg("あなたは怪物を虐殺し", "ていない", "なかった", ""); } else { +#if 0 /*JP*/ Sprintf(buf, "genocided %d type%s of monster%s", ngenocided, plur(ngenocided), plur(ngenocided)); you_have_X(buf); +#else + Sprintf(buf, "%d種の怪物を虐殺し", + ngenocided); + enl_msg(buf, "ている", "た", ""); +#endif } if (!u.uconduct.polypiles) +/*JP you_have_never("polymorphed an object"); +*/ + enl_msg("あなたは物体を変化させ", "ていない", "なかった", ""); #ifdef WIZARD else if (wizard) { +#if 0 /*JP*/ Sprintf(buf, "polymorphed %ld item%s", u.uconduct.polypiles, plur(u.uconduct.polypiles)); you_have_X(buf); +#else + Sprintf(buf, "%ld個の道具を変化させ", + u.uconduct.polypiles); + enl_msg(buf, "ている", "た", ""); +#endif } #endif if (!u.uconduct.polyselfs) +/*JP you_have_never("changed form"); +*/ + enl_msg("あなたは変化し", "ていない", "なかった", ""); #ifdef WIZARD else if (wizard) { +#if 0 /*JP*/ Sprintf(buf, "changed form %ld time%s", u.uconduct.polyselfs, plur(u.uconduct.polyselfs)); you_have_X(buf); +#else + Sprintf(buf, "%ld回姿を変え", + u.uconduct.polyselfs); + enl_msg(buf, "ている", "た", ""); +#endif } #endif if (!u.uconduct.wishes) +/*JP you_have_X("used no wishes"); +*/ + enl_msg("あなたは願い事をし", "ていない", "なかった", ""); else { +#if 0 /*JP*/ Sprintf(buf, "used %ld wish%s", u.uconduct.wishes, (u.uconduct.wishes > 1L) ? "es" : ""); you_have_X(buf); +#else + Sprintf(buf, "%ld回願い事をし", + u.uconduct.wishes); + enl_msg(buf, "ている", "た", ""); +#endif if (!u.uconduct.wisharti) +#if 0 /*JP*/ enl_msg(You_, "have not wished", "did not wish", " for any artifacts"); +#else + enl_msg("あなたは聖器を願", "っていない", "わなかった", ""); +#endif } /* Pop up the window and wait for a key */ @@ -1423,7 +2002,10 @@ {'r', FALSE, doread}, {'R', FALSE, doremring}, {M('r'), FALSE, dorub}, +/*JP {'s', TRUE, dosearch, "searching"}, +*/ + {'s', TRUE, dosearch, "捜す"}, {'S', TRUE, dosave}, {M('s'), FALSE, dosit}, {'t', FALSE, dothrow}, @@ -1452,14 +2034,22 @@ #ifdef SHELL {'!', TRUE, dosh}, #endif +#if 0 /*JP*/ {'.', TRUE, donull, "waiting"}, {' ', TRUE, donull, "waiting"}, +#else + {'.', TRUE, donull, "休憩する"}, + {' ', TRUE, donull, "休憩する"}, +#endif {',', FALSE, dopickup}, {':', TRUE, dolook}, {';', TRUE, doquickwhatis}, {'^', TRUE, doidtrap}, {'\\', TRUE, dodiscovered}, /* Robert Viduya */ {'@', TRUE, dotogglepickup}, +#if 1 /*JP*/ + {'`', TRUE, dotogglelang}, +#endif {M('2'), FALSE, dotwoweapon}, {WEAPON_SYM, TRUE, doprwep}, {ARMOR_SYM, TRUE, doprarm}, @@ -1475,6 +2065,7 @@ }; struct ext_func_tab extcmdlist[] = { +#if 0 /*JP*/ {"adjust", "adjust inventory letters", doorganize, TRUE}, {"chat", "talk to someone", dotalk, TRUE}, /* converse? */ {"conduct", "list which challenges you have adhered to", doconduct, TRUE}, @@ -1502,6 +2093,34 @@ doextversion, TRUE}, {"wipe", "wipe off your face", dowipe, FALSE}, {"?", "get this list of extended commands", doextlist, TRUE}, +#else /*JP*/ + {"adjust", "持ち物一覧の調整", doorganize, TRUE}, + {"chat", "誰かと話す", dotalk, TRUE}, /* converse? */ + {"conduct", "どういう行動をとったか見る", doconduct, TRUE}, + {"dip", "何かに物を浸す", dodip, FALSE}, + {"enhance", "武器熟練度を高める", enhance_weapon_skill, TRUE}, + {"force", "鍵をこじあける", doforce, FALSE}, + {"invoke", "物の特別な力を使う", doinvoke, TRUE}, + {"jump", "他の位置に飛びうつる", dojump, FALSE}, + {"loot", "床の上の箱を開ける", doloot, TRUE}, + {"monster", "怪物の特別能力を使う", domonability, TRUE}, + {"name", "アイテムや物に名前をつける", ddocall, TRUE}, + {"offer", "神に供物を捧げる", dosacrifice, FALSE}, + {"pray", "神に祈る", dopray, TRUE}, + {"quit", "セーブしないで終了", done2, TRUE}, +#ifdef STEED + {"ride", "怪物に乗る(または降りる)", doride, FALSE}, +#endif + {"rub", "ランプをこする", dorub, FALSE}, + {"sit", "座る", dosit, FALSE}, + {"turn", "アンデットを土に返す", doturn, TRUE}, + {"twoweapon", "両手持ちの切り替え", dotwoweapon, FALSE}, + {"untrap", "罠をはずす", dountrap, FALSE}, + {"version", "コンパイル時のオプションを表示する", + doextversion, TRUE}, + {"wipe", "顔を拭う", dowipe, FALSE}, + {"?", "この拡張コマンド一覧を表示する", doextlist, TRUE}, +#endif #if defined(WIZARD) /* * There must be a blank entry here for every entry in the table @@ -1532,6 +2151,7 @@ #if defined(WIZARD) static const struct ext_func_tab debug_extcmdlist[] = { +#if 0 /*JP*/ {"levelchange", "change experience level", wiz_level_change, TRUE}, {"lightsources", "show mobile light sources", wiz_light_sources, TRUE}, #ifdef DEBUG_MIGRATING_MONS @@ -1551,6 +2171,24 @@ {"wizdebug", "wizard debug command", wiz_debug_cmd, TRUE}, #endif {"wmode", "show wall modes", wiz_show_wmodes, TRUE}, +#else /*JP*/ + {"levelchange", "経験レベルを変える", wiz_level_change, TRUE}, + {"light sources", "移動光源を見る", wiz_light_sources, TRUE}, + {"monpoly_control", "怪物への変化を制御する", wiz_mon_polycontrol, TRUE}, + {"panic", "パニックルーチンをテストする(致命的)", wiz_panic, TRUE}, + {"poly", "変化する", wiz_polyself, TRUE}, +#ifdef PORT_DEBUG + {"portdebug", "wizard port debug command", wiz_port_debug, TRUE}, +#endif + {"seenv", "視線ベクトルを見る", wiz_show_seenv, TRUE}, + {"stats", "メモリ状態を見る", wiz_show_stats, TRUE}, + {"timeout", "時間切れキューを見る", wiz_timeout_queue, TRUE}, + {"vision", "視界配列を見る", wiz_show_vision, TRUE}, +#ifdef DEBUG + {"wizdebug", "ウィザードデバッグモード", wiz_debug_cmd, TRUE}, +#endif + {"wmode", "壁モードを見る", wiz_show_wmodes, TRUE}, +#endif {(char *)0, (char *)0, donull, TRUE} }; @@ -1954,7 +2592,10 @@ if ((*cmd & 0xff) != (tlist->f_char & 0xff)) continue; if (u.uburied && !tlist->can_if_buried) { +/*JP You_cant("do that while you are buried!"); +*/ + You("埋まっている時にそんなことはできない!"); res = 0; } else { /* we discard 'const' because some compilers seem to have @@ -1992,8 +2633,15 @@ } *cp = '\0'; if (!prefix_seen || !iflags.cmdassist || +#if 0 /*JP*/ !help_dir(0, "Invalid direction key!")) +#else + !help_dir(0, "無効な方向指定です.")) +#endif +/*JP Norep("Unknown command '%s'.", expcmd); +*/ + Norep("'%s'コマンド?", expcmd); } /* didn't move */ flags.move = FALSE; @@ -2036,6 +2684,11 @@ u.dx = xdir[dp-sdp]; u.dy = ydir[dp-sdp]; u.dz = zdir[dp-sdp]; +#ifdef JPEXTENSION + if(Totter){ /* mirror move */ + u.dx = -u.dx; + } +#endif if (u.dx && u.dy && u.umonnum == PM_GRID_BUG) { u.dx = u.dy = 0; return 0; @@ -2086,8 +2739,13 @@ dirsym = readchar(); else #endif +#if 0 /*JP*/ dirsym = yn_function ((s && *s != '^') ? s : "In what direction?", (char *)0, '\0'); +#else + dirsym = yn_function ((s && *s != '^') ? s : "どの方向?", + (char *)0, '\0'); +#endif #ifdef REDO savech(dirsym); #endif @@ -2098,9 +2756,16 @@ if(!index(quitchars, dirsym)) { if (iflags.cmdassist) { did_help = help_dir((s && *s == '^') ? dirsym : 0, +#if 0 /*JP*/ "Invalid direction key!"); +#else + "無効な方向指定です."); +#endif } +/*JP if (!did_help) pline("What a strange direction!"); +*/ + if (!did_help) pline("ずいぶんと奇妙な方向だ!"); } return 0; } @@ -2149,28 +2814,44 @@ } } if (iflags.num_pad && u.umonnum == PM_GRID_BUG) { +#if 0 /*JP*/ putstr(win, 0, "Valid direction keys in your current form (with number_pad on) are:"); +#else + putstr(win, 0, "有効な方向キー(number_pad オプション設定時):"); +#endif putstr(win, 0, " 8 "); putstr(win, 0, " | "); putstr(win, 0, " 4- . -6"); putstr(win, 0, " | "); putstr(win, 0, " 2 "); } else if (u.umonnum == PM_GRID_BUG) { +#if 0 /*JP*/ putstr(win, 0, "Valid direction keys in your current form are:"); +#else + putstr(win, 0, "有効な方向キー:"); +#endif putstr(win, 0, " k "); putstr(win, 0, " | "); putstr(win, 0, " h- . -l"); putstr(win, 0, " | "); putstr(win, 0, " j "); } else if (iflags.num_pad) { +#if 0 /*JP*/ putstr(win, 0, "Valid direction keys (with number_pad on) are:"); +#else + putstr(win, 0, "有効な方向キー(number_pad オプション設定時):"); +#endif putstr(win, 0, " 7 8 9"); putstr(win, 0, " \\ | / "); putstr(win, 0, " 4- . -6"); putstr(win, 0, " / | \\ "); putstr(win, 0, " 1 2 3"); } else { +#if 0 /*JP*/ putstr(win, 0, "Valid direction keys are:"); +#else + putstr(win, 0, "有効な方向キー:"); +#endif putstr(win, 0, " y k u"); putstr(win, 0, " \\ | / "); putstr(win, 0, " h- . -l"); @@ -2182,7 +2863,11 @@ putstr(win, 0, " > down"); putstr(win, 0, " . direct at yourself"); putstr(win, 0, ""); +#if 0 /*JP*/ putstr(win, 0, "(Suppress this message with !cmdassist in config file.)"); +#else + putstr(win, 0, "(このメッセージを表示したくない場合は設定ファイルに !cmdassist を設定してください.)"); +#endif display_nhwindow(win, FALSE); destroy_nhwindow(win); return TRUE; @@ -2339,7 +3024,10 @@ if (multi < 0 || multi >= LARGEST_INT) multi = LARGEST_INT; if (multi > 9) { clear_nhwindow(WIN_MESSAGE); +/*JP Sprintf(in_line, "Count: %d", multi); +*/ + Sprintf(in_line, "数: %d", multi); pline(in_line); mark_synch(); } @@ -2462,8 +3150,14 @@ cc.x = u.ux; cc.y = u.uy; } +/*JP pline("Where do you want to travel to?"); +*/ + pline("どこに移動する?"); +/*JP if (getpos(&cc, TRUE, "the desired destination") < 0) { +*/ + if (getpos(&cc, TRUE, "移動先") < 0) { /* user pressed ESC */ return 0; } diff -aurbN -xCVS -xXTAGS nethack/src/dbridge.c jnethack/src/dbridge.c --- nethack/src/dbridge.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/dbridge.c 2004-10-09 02:21:01.000000000 +0900 @@ -10,6 +10,14 @@ * deal with players as well. - 11/89 */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** changing point is marked `JP' (94/6/7) +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #ifdef OVLB @@ -309,7 +317,10 @@ e_nam(etmp) struct entity *etmp; { +/*JP return(is_u(etmp)? "you" : mon_nam(etmp->emon)); +*/ + return(is_u(etmp)? "あなた" : mon_nam(etmp->emon)); } #ifdef D_DEBUG @@ -321,7 +332,10 @@ Enam(etmp) struct entity *etmp; { +/*JP return(is_u(etmp)? "You" : Monnam(etmp->emon)); +*/ + return(is_u(etmp)? "あなた" : Monnam(etmp->emon)); } #endif /* D_DEBUG */ @@ -337,6 +351,10 @@ { static char wholebuf[80]; +#if 1 /*JP*/ + Strcpy(wholebuf, is_u(etmp) ? "あなた" : Monnam(etmp->emon)); + return wholebuf; +#else Strcpy(wholebuf, is_u(etmp) ? "You" : Monnam(etmp->emon)); if (!*verb) return(wholebuf); Strcat(wholebuf, " "); @@ -345,6 +363,7 @@ else Strcat(wholebuf, vtense((char *)0, verb)); return(wholebuf); +#endif } /* @@ -392,14 +411,22 @@ /* use more specific killer if specified */ if (!killer) { killer_format = KILLED_BY_AN; +/*JP killer = "falling drawbridge"; +*/ + killer = "降りてきた跳ね橋で"; } done(how); /* So, you didn't die */ if (!e_survives_at(etmp, etmp->ex, etmp->ey)) { if (enexto(&xy, etmp->ex, etmp->ey, etmp->edata)) { +#if 0 /*JP*/ pline("A %s force teleports you away...", Hallucination ? "normal" : "strange"); +#else + pline("%s力があなたを遠くに運んだ...", + Hallucination ? "普通の" : "奇妙な"); +#endif teleds(xy.x, xy.y, FALSE); } /* otherwise on top of the drawbridge is the @@ -537,15 +564,24 @@ if (automiss(etmp) && e_survives_at(etmp, oldx, oldy)) { if (e_inview && (at_portcullis || IS_DRAWBRIDGE(crm->typ))) +#if 0 /*JP*/ pline_The("%s passes through %s!", at_portcullis ? "portcullis" : "drawbridge", e_nam(etmp)); +#else + pline_The("%sは%sを通り抜けた!", + at_portcullis ? "落し格子" : "跳ね橋", + e_nam(etmp)); +#endif if (is_u(etmp)) spoteffects(FALSE); return; } if (e_missed(etmp, FALSE)) { if (at_portcullis) +/*JP pline_The("portcullis misses %s!", +*/ + pline("落し格子は%sに命中しなかった!", e_nam(etmp)); #ifdef D_DEBUG else @@ -565,7 +601,10 @@ } } else { if (crm->typ == DRAWBRIDGE_DOWN) { +/*JP pline("%s crushed underneath the drawbridge.", +*/ + pline("%sは跳ね橋の下敷になった.", E_phrase(etmp, "are")); /* no jump */ e_died(etmp, e_inview? 3 : 2, CRUSHING);/* no corpse */ return; /* Note: Beyond this point, we know we're */ @@ -581,10 +620,16 @@ #endif } else { if (e_inview) +/*JP pline("%s crushed by the falling portcullis!", +*/ + pline("%s落ちてきた落し格子に潰された!", E_phrase(etmp, "are")); else if (flags.soundok) +/*JP You_hear("a crushing sound."); +*/ + You_hear("何かが潰れる音を聞いた."); e_died(etmp, e_inview? 3 : 2, CRUSHING); /* no corpse */ return; @@ -681,18 +726,33 @@ #endif if (e_inview) { if (is_u(etmp)) { +/*JP You("tumble towards the closed portcullis!"); +*/ + You("閉まりかけの落し格子をころぶようにすりぬけた!"); if (automiss(etmp)) +/*JP You("pass through it!"); +*/ + You("通りぬけた!"); else +/*JP pline_The("drawbridge closes in..."); +*/ + pline_The("跳ね橋は閉じた..."); } else +/*JP pline("%s behind the drawbridge.", +*/ + pline("%sは跳ね橋の裏に移動した.", E_phrase(etmp, "disappear")); } if (!e_survives_at(etmp, etmp->ex, etmp->ey)) { killer_format = KILLED_BY_AN; +/*JP killer = "closing drawbridge"; +*/ + killer = "閉じていく跳ね橋に狭まれて"; e_died(etmp, 0, CRUSHING); /* no message */ return; } @@ -705,11 +765,17 @@ #endif if (is_pool(etmp->ex, etmp->ey) && !e_inview) if (flags.soundok) +/*JP You_hear("a splash."); +*/ + You_hear("パシャパシャという音を聞いた."); if (e_survives_at(etmp, etmp->ex, etmp->ey)) { if (e_inview && !is_flyer(etmp->edata) && !is_floater(etmp->edata)) +/*JP pline("%s from the bridge.", +*/ + pline("%sは橋から落ちた.", E_phrase(etmp, "fall")); return; } @@ -722,16 +788,33 @@ boolean lava = is_lava(etmp->ex, etmp->ey); if (Hallucination) +#if 0 /*JP*/ pline("%s the %s and disappears.", E_phrase(etmp, "drink"), lava ? "lava" : "moat"); +#else + pline("%sは%sを飲み,消えた.", + E_phrase(etmp, "drink"), + lava ? "溶岩" : "堀"); +#endif else +#if 0 /*JP*/ pline("%s into the %s.", E_phrase(etmp, "fall"), lava ? "lava" : "moat"); +#else + pline("%sは%sの中に落ちた.", + E_phrase(etmp, "fall"), + lava ? "溶岩" : "堀"); +#endif } +#if 0 /*JP:T*/ killer_format = NO_KILLER_PREFIX; killer = "fell from a drawbridge"; +#else + killer_format = KILLED_BY; + killer = "跳ね橋から落ちて"; +#endif e_died(etmp, e_inview ? 3 : 2, /* CRUSHING is arbitrary */ (is_pool(etmp->ex, etmp->ey)) ? DROWNING : (is_lava(etmp->ex, etmp->ey)) ? BURNING : @@ -757,9 +840,13 @@ x2 = x; y2 = y; get_wall_for_db(&x2,&y2); if (cansee(x,y) || cansee(x2,y2)) +#if 0 /*JP*/ You("see a drawbridge %s up!", (((u.ux == x || u.uy == y) && !Underwater) || distu(x2,y2) < distu(x,y)) ? "coming" : "going"); +#else + pline("跳ね橋が閉じていくのが見えた!"); +#endif lev1->typ = DRAWBRIDGE_UP; lev2 = &levl[x2][y2]; lev2->typ = DBWALL; @@ -780,7 +867,10 @@ set_entity(x2, y2, &(occupants[1])); /* do_entity for worm tail */ do_entity(&(occupants[1])); if(OBJ_AT(x,y) && flags.soundok) +/*JP You_hear("smashing and crushing."); +*/ + You_hear("ガシャン,ガランという音を聞いた."); (void) revive_nasty(x,y,(char *)0); (void) revive_nasty(x2,y2,(char *)0); delallobj(x, y); @@ -809,8 +899,12 @@ x2 = x; y2 = y; get_wall_for_db(&x2,&y2); if (cansee(x,y) || cansee(x2,y2)) +#if 0 /*JP*/ You("see a drawbridge %s down!", (distu(x2,y2) < distu(x,y)) ? "going" : "coming"); +#else + pline("跳ね橋が開くのが見えた!"); +#endif lev1->typ = DRAWBRIDGE_DOWN; lev2 = &levl[x2][y2]; lev2->typ = DOOR; @@ -856,28 +950,55 @@ boolean lava = (lev1->drawbridgemask & DB_UNDER) == DB_LAVA; if (lev1->typ == DRAWBRIDGE_UP) { if (cansee(x2,y2)) +#if 0 /*JP*/ pline_The("portcullis of the drawbridge falls into the %s!", lava ? "lava" : "moat"); +#else + pline("跳ね橋の落し格子が%sに落ちた!", + lava ? "溶岩" : "堀"); +#endif else if (flags.soundok) +#if 0 /*JP*/ You_hear("a loud *SPLASH*!"); +#else + You_hear("大きなバッシャーンという音を聞いた!"); +#endif } else { if (cansee(x,y)) +#if 0 /*JP*/ pline_The("drawbridge collapses into the %s!", lava ? "lava" : "moat"); +#else + pline("跳ね橋は%sにくずれ落ちた!", + lava ? "溶岩" : "堀"); +#endif else if (flags.soundok) +#if 0 /*JP*/ You_hear("a loud *SPLASH*!"); +#else + You_hear("大きなバッシャーンという音を聞いた!"); +#endif } lev1->typ = lava ? LAVAPOOL : MOAT; lev1->drawbridgemask = 0; if ((otmp = sobj_at(BOULDER,x,y)) != 0) { obj_extract_self(otmp); +/*JP (void) flooreffects(otmp,x,y,"fall"); +*/ + (void) flooreffects(otmp,x,y,"落ちる"); } } else { if (cansee(x,y)) +/*JP pline_The("drawbridge disintegrates!"); +*/ + pline("跳ね橋はこなごなになった!"); else +/*JP You_hear("a loud *CRASH*!"); +*/ + You_hear("大きなガシャーンという音を聞いた!"); lev1->typ = ((lev1->drawbridgemask & DB_ICE) ? ICE : ROOM); lev1->icedpool = @@ -898,10 +1019,16 @@ e_inview = e_canseemon(etmp2); if (!automiss(etmp2)) { if (e_inview) +/*JP pline("%s blown apart by flying debris.", +*/ + pline("%sは飛び散った瓦礫の破片を浴びた.", E_phrase(etmp2, "are")); killer_format = KILLED_BY_AN; +/*JP killer = "exploding drawbridge"; +*/ + killer = "跳ね橋の爆発で"; e_died(etmp2, e_inview? 3 : 2, CRUSHING); /*no corpse*/ } /* nothing which is vulnerable can survive this */ } @@ -915,14 +1042,23 @@ } else { if (e_inview) { if (!is_u(etmp1) && Hallucination) +/*JP pline("%s into some heavy metal!", +*/ + pline("%sは重金属に埋もれた!", E_phrase(etmp1, "get")); else +/*JP pline("%s hit by a huge chunk of metal!", +*/ + pline("大きな鉄の塊が%sに命中した!", E_phrase(etmp1, "are")); } else { if (flags.soundok && !is_u(etmp1) && !is_pool(x,y)) +/*JP You_hear("a crushing sound."); +*/ + You_hear("ガランという音を聞いた."); #ifdef D_DEBUG else pline("%s from shrapnel", @@ -930,7 +1066,10 @@ #endif } killer_format = KILLED_BY_AN; +/*JP killer = "collapsing drawbridge"; +*/ + killer = "バラバラになった跳ね橋で"; e_died(etmp1, e_inview? 3 : 2, CRUSHING); /*no corpse*/ if(lev1->typ == MOAT) do_entity(etmp1); } diff -aurbN -xCVS -xXTAGS nethack/src/decl.c jnethack/src/decl.c --- nethack/src/decl.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/decl.c 2004-01-06 01:09:03.000000000 +0900 @@ -2,6 +2,14 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** changing point is marked `JP' (94/6/7) +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" int NDECL((*afternmv)); @@ -210,13 +218,21 @@ NEARDATA struct mvitals mvitals[NUMMONS]; NEARDATA struct c_color_names c_color_names = { +#if 0 /*JP*/ "black", "amber", "golden", "light blue", "red", "green", "silver", "blue", "purple", "white" +#else + "黒い", "琥珀色の", "金色の", + "水色の", "赤い", "緑色の", + "銀色の", "青い", "紫色の", + "白い" +#endif }; const char *c_obj_colors[] = { +#if 0 /*JP*/ "black", /* CLR_BLACK */ "red", /* CLR_RED */ "green", /* CLR_GREEN */ @@ -233,22 +249,54 @@ "bright magenta", /* CLR_BRIGHT_MAGENTA */ "bright cyan", /* CLR_BRIGHT_CYAN */ "white", /* CLR_WHITE */ +#else + "黒い", /* CLR_BLACK */ + "赤い", /* CLR_RED */ + "緑色の", /* CLR_GREEN */ + "茶色の", /* CLR_BROWN */ + "青い", /* CLR_BLUE */ + "マゼンダ色の", /* CLR_MAGENTA */ + "シアン色の", /* CLR_CYAN */ + "灰色の", /* CLR_GRAY */ + "透明な", /* no_color */ + "橙色の", /* CLR_ORANGE */ + "明るい緑色の", /* CLR_BRIGHT_GREEN */ + "黄色の", /* CLR_YELLOW */ + "明るい青色の", /* CLR_BRIGHT_BLUE */ + "明るいマゼンダ色の", /* CLR_BRIGHT_MAGENTA */ + "明るいシアン色の", /* CLR_BRIGHT_CYAN */ + "白い", /* CLR_WHITE */ +#endif }; struct c_common_strings c_common_strings = { +#if 0 /*JP*/ "Nothing happens.", "That's enough tries!", "That is a silly thing to %s.", "shudder for a moment.", "something", "Something", "You can move again.", "Never mind.", "vision quickly clears.", {"the", "your"} +#else + "何も起きなかった.", "いい加減にしろ!", + "%s?そりゃばかげている.", "一瞬震えた.", + "何か", "何か", "また動けるようになった.", "え?", + "視界がはっきりした.", {"", ""} +#endif }; /* NOTE: the order of these words exactly corresponds to the order of oc_material values #define'd in objclass.h. */ const char *materialnm[] = { +#if 0 /*JP*/ "mysterious", "liquid", "wax", "organic", "flesh", "paper", "cloth", "leather", "wooden", "bone", "dragonhide", "iron", "metal", "copper", "silver", "gold", "platinum", "mithril", "plastic", "glass", "gemstone", "stone" +#else + "神秘", "液状", "蝋", "有機", "肉", + "紙", "布", "革", "木", "骨", "竜皮", + "鉄", "金属", "銅", "白銀", "金", "プラチナ", "ミスリル", + "プラスチック", "ガラス", "宝石", "石" +#endif }; /* Vision */ diff -aurbN -xCVS -xXTAGS nethack/src/detect.c jnethack/src/detect.c --- nethack/src/detect.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/detect.c 2004-07-29 01:04:23.000000000 +0900 @@ -7,6 +7,14 @@ * command. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1996-2000 +** changing point is marked `JP' (96/7/21) +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "artifact.h" @@ -209,8 +217,12 @@ if (sobj) { char buf[BUFSZ]; if (youmonst.data == &mons[PM_GOLD_GOLEM]) { +#if 0 /*JP*/ Sprintf(buf, "You feel like a million %s!", currency(2L)); +#else + Strcpy(buf, "あなたは金持ちになったように感じた!"); +#endif } else if (hidden_gold() || #ifndef GOLDOBJ u.ugold) @@ -218,16 +230,25 @@ money_cnt(invent)) #endif Strcpy(buf, +/*JP "You feel worried about your future financial situation."); +*/ + "あなたは将来の経済状況が心配になった."); else +/*JP Strcpy(buf, "You feel materially poor."); +*/ + Strcpy(buf, "あなたはひもじさを感じた."); strange_feeling(sobj, buf); } return(1); } /* only under me - no separate display required */ if (stale) docrt(); +/*JP You("notice some gold between your %s.", makeplural(body_part(FOOT))); +*/ + You("%sの間に金貨が落ちていることに気がついた.", body_part(FOOT)); return(0); outgoldmap: @@ -278,7 +299,10 @@ } newsym(u.ux,u.uy); +/*JP You_feel("very greedy, and sense gold!"); +*/ + You("どん欲になったような気がした,そして金貨の位置を感知した!"); exercise(A_WIS, TRUE); display_nhwindow(WIN_MAP, TRUE); docrt(); @@ -299,7 +323,10 @@ register int ct = 0, ctu = 0; boolean confused = (Confusion || (sobj && sobj->cursed)), stale; char oclass = confused ? POTION_CLASS : FOOD_CLASS; +/*JP const char *what = confused ? something : "food"; +*/ + const char *what = confused ? "ハラヘリ" : "食べ物"; int uw = u.uinwater; stale = clear_stale_map(oclass, 0); @@ -322,15 +349,26 @@ known = stale && !confused; if (stale) { docrt(); +/*JP You("sense a lack of %s nearby.", what); +*/ + You("%sが減っているのに気がついた.",what); if (sobj && sobj->blessed) { +/*JP if (!u.uedibility) Your("%s starts to tingle.", body_part(NOSE)); +*/ + if (!u.uedibility) Your("%sがぴくっと動いた.", body_part(NOSE)); u.uedibility = 1; } } else if (sobj) { char buf[BUFSZ]; +#if 0 /*JP*/ Sprintf(buf, "Your %s twitches%s.", body_part(NOSE), (sobj->blessed && !u.uedibility) ? " then starts to tingle" : ""); +#else + Sprintf(buf, "あなたの%sがひくひくと動い%s.", body_part(NOSE), + (sobj->blessed && !u.uedibility) ? "て,うずうずしだした" : "た"); +#endif if (sobj->blessed && !u.uedibility) { boolean savebeginner = flags.beginner; /* prevent non-delivery of */ flags.beginner = FALSE; /* message */ @@ -343,9 +381,15 @@ return !stale; } else if (!ct) { known = TRUE; +/*JP You("%s %s nearby.", sobj ? "smell" : "sense", what); +*/ + You("近くの%sを%s.", what, sobj ? "嗅ぎつけた" : "感知した"); if (sobj && sobj->blessed) { +/*JP if (!u.uedibility) pline("Your %s starts to tingle.", body_part(NOSE)); +*/ + if (!u.uedibility) pline("あなたの%sはうずうずしだした.", body_part(NOSE)); u.uedibility = 1; } } else { @@ -373,13 +417,24 @@ newsym(u.ux,u.uy); if (sobj) { if (sobj->blessed) { +#if 0 /*JP*/ Your("%s %s to tingle and you smell %s.", body_part(NOSE), u.uedibility ? "continues" : "starts", what); +#else + Your("%sはうずうずし%s,%sの匂いを嗅ぎとった.", body_part(NOSE), + u.uedibility ? "続け" : "始め", what); +#endif u.uedibility = 1; } else +/*JP Your("%s tingles and you smell %s.", body_part(NOSE), what); +*/ + Your("%sはうずうずし,%sの匂いを嗅ぎとった.", body_part(NOSE), what); } +/*JP else You("sense %s.", what); +*/ + else You("%sを感知した.", what); display_nhwindow(WIN_MAP, TRUE); exercise(A_WIS, TRUE); docrt(); @@ -431,8 +486,14 @@ if (Hallucination || (Confusion && class == SCROLL_CLASS)) Strcpy(stuff, something); else +/*JP Strcpy(stuff, class ? oclass_names[class] : "objects"); +*/ + Strcpy(stuff, class ? oclass_names[class] : "物体"); +/*JP if (boulder && class != ROCK_CLASS) Strcat(stuff, " and/or large stones"); +*/ + if (boulder && class != ROCK_CLASS) Strcat(stuff, "と巨岩"); if (do_dknown) for(obj = invent; obj; obj = obj->nobj) do_dknown_of(obj); @@ -473,11 +534,17 @@ if (!clear_stale_map(!class ? ALL_CLASSES : class, 0) && !ct) { if (!ctu) { if (detector) +/*JP strange_feeling(detector, "You feel a lack of something."); +*/ + strange_feeling(detector, "あなたは何かが欠乏しているような気がした."); return 1; } +/*JP You("sense %s nearby.", stuff); +*/ + You("近くの%sを感知した.", stuff); return 0; } @@ -559,7 +626,10 @@ } newsym(u.ux,u.uy); +/*JP You("detect the %s of %s.", ct ? "presence" : "absence", stuff); +*/ + You("%s%s.", stuff, ct ? "を発見した" : "は何もないことがわかった" ); display_nhwindow(WIN_MAP, TRUE); /* * What are we going to do when the hero does an object detect while blind @@ -602,8 +672,13 @@ if (!mcnt) { if (otmp) strange_feeling(otmp, Hallucination ? +#if 0 /*JP*/ "You get the heebie jeebies." : "You feel threatened."); +#else + "あなたは金鳥の夏でキンチョーした." : + "あなたは恐怖でぞくぞくした."); +#endif return 1; } else { boolean woken = FALSE; @@ -630,9 +705,15 @@ } } display_self(); +/*JP You("sense the presence of monsters."); +*/ + You("怪物の存在を嗅ぎつけた."); if (woken) +/*JP pline("Monsters sense the presence of you."); +*/ + pline("怪物はあなたの存在を嗅ぎつけた."); display_nhwindow(WIN_MAP, TRUE); docrt(); if (Underwater) under_water(2); @@ -710,12 +791,18 @@ } if (!found) { char buf[42]; +/*JP Sprintf(buf, "Your %s stop itching.", makeplural(body_part(TOE))); +*/ + Sprintf(buf, "あなたの%sのむずむずはおさまった.", makeplural(body_part(TOE))); strange_feeling(sobj,buf); return(1); } /* traps exist, but only under me - no separate display required */ +/*JP Your("%s itch.", makeplural(body_part(TOE))); +*/ + Your("%sはむずむずした.", makeplural(body_part(TOE))); return(0); outtrapmap: cls(); @@ -735,7 +822,10 @@ } newsym(u.ux,u.uy); +/*JP You_feel("%s.", sobj && sobj->cursed ? "very greedy" : "entrapped"); +*/ + You("%s気持になった.", sobj && sobj->cursed ? "とてもどん欲な" : "だまされているような"); display_nhwindow(WIN_MAP, TRUE); docrt(); u.uinwater = uw; @@ -753,37 +843,91 @@ if (ll < 0) { if (ll < (-8 - rn2(3))) +/*JP if (!indun) return "far away"; +*/ + if (!indun) return "はるか彼方に"; +/*JP else return "far below"; +*/ + else return "はるか下方に"; else if (ll < -1) +/*JP if (!indun) return "away below you"; +*/ + if (!indun) return "ずっと下方に"; +/*JP else return "below you"; +*/ + else return "下方に"; else +/*JP if (!indun) return "in the distance"; +*/ + if (!indun) return "遠くに"; +/*JP else return "just below"; +*/ + else return "真下に"; } else if (ll > 0) { if (ll > (8 + rn2(3))) +/*JP if (!indun) return "far away"; +*/ + if (!indun) return "はるか彼方に"; +/*JP else return "far above"; +*/ + else return "はるか上方に"; else if (ll > 1) +/*JP if (!indun) return "away above you"; +*/ + if (!indun) return "ずっと上方に"; +/*JP else return "above you"; +*/ + else return "上方に"; else +/*JP if (!indun) return "in the distance"; +*/ + if (!indun) return "遠くに"; +/*JP else return "just above"; +*/ + else return "真上に"; } else +/*JP if (!indun) return "in the distance"; +*/ + if (!indun) return "遠くに"; +/*JP else return "near you"; +*/ + else return "近くに"; } static const struct { const char *what; d_level *where; } level_detects[] = { +/*JP { "Delphi", &oracle_level }, +*/ + { "デルファイ", &oracle_level }, +/*JP { "Medusa's lair", &medusa_level }, +*/ + { "メデューサの住みか", &medusa_level }, +/*JP { "a castle", &stronghold_level }, +*/ + { "城", &stronghold_level }, +/*JP { "the Wizard of Yendor's tower", &wiz1_level }, +*/ + { "イェンダーの魔法使いの塔", &wiz1_level }, }; void @@ -794,33 +938,60 @@ int oops; if (Blind) { +/*JP pline("Too bad you can't see %s.", the(xname(obj))); +*/ + pline("なんてことだ.%sを見ることができない.", the(xname(obj))); return; } oops = (rnd(20) > ACURR(A_INT) || obj->cursed); if (oops && (obj->spe > 0)) { switch (rnd(obj->oartifact ? 4 : 5)) { +/*JP case 1 : pline("%s too much to comprehend!", Tobjnam(obj, "are")); +*/ + case 1 : pline("%sを覗いたが何のことだかさっぱりわからなかった!", xname(obj)); break; +/*JP case 2 : pline("%s you!", Tobjnam(obj, "confuse")); +*/ + case 2 : pline("%sを覗いてるとふらついてきた!", xname(obj)); make_confused(HConfusion + rnd(100),FALSE); break; case 3 : if (!resists_blnd(&youmonst)) { +/*JP pline("%s your vision!", Tobjnam(obj, "damage")); +*/ + pline("%sを覗いていると視覚がおかしくなってきた!", xname(obj)); make_blinded(Blinded + rnd(100),FALSE); if (!Blind) Your(vision_clears); } else { +/*JP pline("%s your vision.", Tobjnam(obj, "assault")); +*/ + pline("%sがあなたの視界に迫ってきた.", xname(obj)); +/*JP You("are unaffected!"); +*/ + pline("しかし,あなたは影響を受けなかった!"); } break; +/*JP case 4 : pline("%s your mind!", Tobjnam(obj, "zap")); +*/ + case 4 : pline("%sを覗いていると五感がおかしくなってきた!", xname(obj)); (void) make_hallucinated(HHallucination + rnd(100),FALSE,0L); break; +/*JP case 5 : pline("%s!", Tobjnam(obj, "explode")); +*/ + case 5 : pline("%sは爆発した!", xname(obj)); useup(obj); obj = 0; /* it's gone */ +/*JP losehp(rnd(30), "exploding crystal ball", KILLED_BY_AN); +*/ + losehp(rnd(30), "水晶玉の爆発で", KILLED_BY_AN); break; } if (obj) consume_obj_charge(obj, TRUE); @@ -829,22 +1000,46 @@ if (Hallucination) { if (!obj->spe) { +/*JP pline("All you see is funky %s haze.", hcolor((char *)0)); +*/ + pline("おお!ファンキーモンキーな%sもやが見える.", hcolor((char *)0)); } else { switch(rnd(6)) { +/*JP case 1 : You("grok some groovy globs of incandescent lava."); +*/ + case 1 : You("水門の鍵をもった水戸黄門が壁の影に隠れているのが見えた."); break; +/*JP case 2 : pline("Whoa! Psychedelic colors, %s!", +*/ + case 2 : pline("ワーオ!ラリってるかい?%s!", +/*JP poly_gender() == 1 ? "babe" : "dude"); +*/ + poly_gender() == 1 ? "ベイビー" : "ユー"); break; +/*JP case 3 : pline_The("crystal pulses with sinister %s light!", +*/ + case 3 : pline("水晶は不吉な%sパルスを発した!", hcolor((char *)0)); break; +/*JP case 4 : You("see goldfish swimming above fluorescent rocks."); +*/ + case 4 : You("蛍光岩の上を金魚が泳いでいるのが見えた."); break; +/*JP case 5 : You("see tiny snowflakes spinning around a miniature farmhouse."); +*/ + case 5 : You("小さい雪片がミニチュアの農家の家のまわりを舞ってるのが見えた."); break; +/*JP default: pline("Oh wow... like a kaleidoscope!"); +*/ + default: pline("ワーオ.万華鏡のようだ!"); break; } consume_obj_charge(obj, TRUE); @@ -853,18 +1048,30 @@ } /* read a single character */ +/*JP if (flags.verbose) You("may look for an object or monster symbol."); +*/ + if (flags.verbose) You("物体や怪物の記号を探せる."); +/*JP ch = yn_function("What do you look for?", (char *)0, '\0'); +*/ + ch = yn_function("何を探しますか?", (char *)0, '\0'); /* Don't filter out ' ' here; it has a use */ if ((ch != def_monsyms[S_GHOST]) && index(quitchars,ch)) { if (flags.verbose) pline(Never_mind); return; } +/*JP You("peer into %s...", the(xname(obj))); +*/ + You("%sを覗きこんだ...", the(xname(obj))); nomul(-rnd(10)); nomovemsg = ""; if (obj->spe <= 0) +/*JP pline_The("vision is unclear."); +*/ + pline("映像は不鮮明だった."); else { int class; int ret = 0; @@ -890,7 +1097,10 @@ default: { int i = rn2(SIZE(level_detects)); +/*JP You("see %s, %s.", +*/ + You("%sを%s見た.", level_detects[i].what, level_distance(level_detects[i].where)); } @@ -900,8 +1110,14 @@ if (ret) { if (!rn2(100)) /* make them nervous */ +/*JP You("see the Wizard of Yendor gazing out at you."); +*/ + You("イェンダーの魔法使いがあなたをにらんでいるのが見えた."); +/*JP else pline_The("vision is unclear."); +*/ + else pline("映像は不鮮明になった."); } } return; @@ -1067,11 +1283,21 @@ if(levl[zx][zy].typ == SDOOR) cvt_sdoor_to_door(&levl[zx][zy]); /* .typ = DOOR */ if(levl[zx][zy].doormask & D_TRAPPED) { +/*JP if(distu(zx, zy) < 3) b_trapped("door", 0); +*/ + if(distu(zx, zy) < 3) b_trapped("扉", 0); +#if 0 /*JP*/ else Norep("You %s an explosion!", cansee(zx, zy) ? "see" : (flags.soundok ? "hear" : "feel the shock of")); +#else + else Norep("あなたは爆発%s!", + cansee(zx, zy) ? "を見た" : + (flags.soundok ? "音を聞いた" : + "の衝撃を感じた")); +#endif wake_nearto(zx, zy, 11*11); levl[zx][zy].doormask = D_NODOOR; } else @@ -1114,8 +1340,14 @@ if(u.uswallow) { if (is_animal(u.ustuck->data)) { +/*JP if (Blind) pline("Its mouth opens!"); +*/ + if (Blind) pline("何者かの口が開いた!"); +/*JP else pline("%s opens its mouth!", Monnam(u.ustuck)); +*/ + else pline("%sは口を開いた!", Monnam(u.ustuck)); } expels(u.ustuck, u.ustuck->data, TRUE); return(-1); @@ -1147,7 +1379,10 @@ cleared = TRUE; } +/*JP You("find %s.", an(defsyms[trap_to_defsym(tt)].explanation)); +*/ + You("%sを見つけた.", jtrns_obj('^', defsyms[trap_to_defsym(tt)].explanation)); if (cleared) { display_nhwindow(WIN_MAP, TRUE); /* wait */ @@ -1174,7 +1409,10 @@ if(u.uswallow) { if (!aflag) +/*JP pline("What are you looking for? The exit?"); +*/ + pline("何を探すんだい?非常口?"); } else { int fund = (uwep && uwep->oartifact && spec_ability(uwep, SPFX_SEARCH)) ? @@ -1220,11 +1458,17 @@ */ continue; } else { +/*JP You_feel("an unseen monster!"); +*/ + You("見えない怪物の気配を感じた!"); map_invisible(x, y); } } else if (!sensemon(mtmp)) +/*JP You("find %s.", a_monnam(mtmp)); +*/ + You("%sを見つけた.", a_monnam(mtmp)); return(1); } if(!canspotmon(mtmp)) { diff -aurbN -xCVS -xXTAGS nethack/src/dig.c jnethack/src/dig.c --- nethack/src/dig.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/dig.c 2005-06-11 05:10:04.000000000 +0900 @@ -2,6 +2,14 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1996-2000 +** changing point is marked `JP' (94/7/16) +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "edog.h" /* #define DEBUG */ /* turn on for diagnostics */ @@ -93,9 +101,17 @@ register xchar i; register boolean waslit = rm_waslit(); +/*JP if(rockit) pline("Crash! The ceiling collapses around you!"); +*/ + if(rockit) pline("げげん!あなたのまわりの天井が崩れた!"); +#if 0 /*JP:T*/ else pline("A mysterious force %s cave around you!", (levl[u.ux][u.uy].typ == CORR) ? "creates a" : "extends the"); +#else + else pline("神秘的な力によりあなたのまわり%sた!", + (levl[u.ux][u.uy].typ == CORR) ? "に洞窟ができ" : "の洞窟が広がっ"); +#endif display_nhwindow(WIN_MESSAGE, TRUE); for(dist = 1; dist <= 2; dist++) { @@ -166,35 +182,64 @@ int x, y; { struct trap *ttmp = t_at(x, y); +/*JP const char *verb = (madeby == BY_YOU && uwep && is_axe(uwep)) ? "chop" : "dig in"; +*/ + const char *verb = (madeby == BY_YOU && uwep && is_axe(uwep)) ? "砕けない" : "掘れない"; if (On_stairs(x, y)) { if (x == xdnladder || x == xupladder) { +/*JP if(verbose) pline_The("ladder resists your effort."); +*/ + if(verbose) pline("はしごが邪魔をした."); +/*JP } else if(verbose) pline_The("stairs are too hard to %s.", verb); +*/ + } else if(verbose) pline("階段はとても固くて%s.", verb); return(FALSE); } else if (IS_THRONE(levl[x][y].typ) && madeby != BY_OBJECT) { +/*JP if(verbose) pline_The("throne is too hard to break apart."); +*/ + if(verbose) pline("玉座はとても固くて砕けない."); return(FALSE); } else if (IS_ALTAR(levl[x][y].typ) && (madeby != BY_OBJECT || Is_astralevel(&u.uz) || Is_sanctum(&u.uz))) { +/*JP if(verbose) pline_The("altar is too hard to break apart."); +*/ + if(verbose) pline_The("祭壇はとても固くて砕けない."); return(FALSE); } else if (Is_airlevel(&u.uz)) { +/*JP if(verbose) You("cannot %s thin air.", verb); +*/ + if(verbose) You("何もない空間は%s.", verb); return(FALSE); } else if (Is_waterlevel(&u.uz)) { +/*JP if(verbose) pline_The("water splashes and subsides."); +*/ + if(verbose) pline("水がピシャッと跳ねた."); return(FALSE); } else if ((IS_ROCK(levl[x][y].typ) && levl[x][y].typ != SDOOR && (levl[x][y].wall_info & W_NONDIGGABLE) != 0) || (ttmp && (ttmp->ttyp == MAGIC_PORTAL || !Can_dig_down(&u.uz)))) { +#if 0 /*JP:T*/ if(verbose) pline_The("%s here is too hard to %s.", surface(x,y), verb); +#else + if(verbose) pline_The("%sはとても固くて%s.", + surface(x,y), verb); +#endif return(FALSE); } else if (sobj_at(BOULDER, x, y)) { +/*JP if(verbose) There("isn't enough room to %s here.", verb); +*/ + if(verbose) pline("十分な場所がないので%s.", verb); return(FALSE); } else if (madeby == BY_OBJECT && /* the block against existing traps is mainly to @@ -212,8 +257,13 @@ register struct rm *lev; register xchar dpx = digging.pos.x, dpy = digging.pos.y; register boolean ispick = uwep && is_pick(uwep); +#if 0 /*JP:T*/ const char *verb = (!uwep || is_pick(uwep)) ? "dig into" : "chop through"; +#else + const char *verb = + (!uwep || is_pick(uwep)) ? "掘れない" : "砕けない"; +#endif lev = &levl[dpx][dpy]; /* perhaps a nymph stole your pick-axe while you were busy digging */ @@ -229,12 +279,18 @@ } else { /* !digging.down */ if (IS_TREE(lev->typ) && !may_dig(dpx,dpy) && dig_typ(uwep, dpx, dpy) == DIGTYP_TREE) { +/*JP pline("This tree seems to be petrified."); +*/ + pline("この木は石化しているようだ."); return(0); } if (IS_ROCK(lev->typ) && !may_dig(dpx,dpy) && dig_typ(uwep, dpx, dpy) == DIGTYP_ROCK) { +/*JP pline("This wall is too hard to %s.", verb); +*/ + pline("この壁はとても固くて%s.", verb); return(0); } } @@ -242,28 +298,47 @@ switch(rn2(3)) { case 0: if(!welded(uwep)) { +/*JP You("fumble and drop your %s.", xname(uwep)); +*/ + You("手が滑り%sを落した.", xname(uwep)); dropx(uwep); } else { #ifdef STEED if (u.usteed) +#if 0 /*JP:T*/ Your("%s %s and %s %s!", xname(uwep), otense(uwep, "bounce"), otense(uwep, "hit"), mon_nam(u.usteed)); +#else + pline("%sは跳ねかえり%sに命中した!", + xname(uwep), mon_nam(u.usteed)); +#endif else #endif +#if 0 /*JP:T*/ pline("Ouch! Your %s %s and %s you!", xname(uwep), otense(uwep, "bounce"), otense(uwep, "hit")); +#else + pline("いてっ!%sは跳ねかえりあなたに命中した!", + xname(uwep)); +#endif set_wounded_legs(RIGHT_SIDE, 5 + rnd(5)); } break; case 1: +/*JP pline("Bang! You hit with the broad side of %s!", +*/ + pline("バン!%sの柄で打ってしまった!", the(xname(uwep))); break; +/*JP default: Your("swing misses its mark."); +*/ + default: You("狙いを定めて振りおろしたがはずした."); break; } return(0); @@ -307,7 +382,10 @@ if ((obj = sobj_at(STATUE, dpx, dpy)) != 0) { if (break_statue(obj)) +/*JP digtxt = "The statue shatters."; +*/ + digtxt = "彫像はこなごなになった."; else /* it was a statue trap; break_statue() * printed a message and updated the screen @@ -322,7 +400,10 @@ obj_extract_self(bobj); place_object(bobj, dpx, dpy); } +/*JP digtxt = "The boulder falls apart."; +*/ + digtxt = "岩はこなごなになった."; } else if (lev->typ == STONE || lev->typ == SCORR || IS_TREE(lev->typ)) { if(Is_earthlevel(&u.uz)) { @@ -336,17 +417,26 @@ } } if (IS_TREE(lev->typ)) { +/*JP digtxt = "You cut down the tree."; +*/ + digtxt = "木を切り倒した."; lev->typ = ROOM; if (!rn2(5)) (void) rnd_treefruit_at(dpx, dpy); } else { +/*JP digtxt = "You succeed in cutting away some rock."; +*/ + digtxt = "岩を少し切りとった."; lev->typ = CORR; } } else if(IS_WALL(lev->typ)) { if(shopedge) { add_damage(dpx, dpy, 10L * ACURRSTR); +/*JP dmgtxt = "damage"; +*/ + dmgtxt = "傷つける"; } if (level.flags.is_maze_lev) { lev->typ = ROOM; @@ -357,17 +447,29 @@ lev->typ = DOOR; lev->doormask = D_NODOOR; } +/*JP digtxt = "You make an opening in the wall."; +*/ + digtxt = "壁に穴を空けた."; } else if(lev->typ == SDOOR) { cvt_sdoor_to_door(lev); /* ->typ = DOOR */ +/*JP digtxt = "You break through a secret door!"; +*/ + digtxt = "秘密の扉を通り抜けた!"; if(!(lev->doormask & D_TRAPPED)) lev->doormask = D_BROKEN; } else if(closed_door(dpx, dpy)) { +/*JP digtxt = "You break through the door."; +*/ + digtxt = "扉を通り抜けた."; if(shopedge) { add_damage(dpx, dpy, 400L); +/*JP dmgtxt = "break"; +*/ + dmgtxt = "壊す"; } if(!(lev->doormask & D_TRAPPED)) lev->doormask = D_BROKEN; @@ -396,11 +498,17 @@ dpx, dpy, NO_MM_FLAGS); break; } +/*JP if(mtmp) pline_The("debris from your digging comes to life!"); +*/ + if(mtmp) pline("岩の破片が生命を帯びた!"); } if(IS_DOOR(lev->typ) && (lev->doormask & D_TRAPPED)) { lev->doormask = D_NODOOR; +/*JP b_trapped("door", 0); +*/ + b_trapped("扉", 0); newsym(dpx, dpy); } cleanup: @@ -411,21 +519,34 @@ return(0); } else { /* not enough effort has been spent yet */ static const char *const d_target[6] = { +/*JP "", "rock", "statue", "boulder", "door", "tree" +*/ + "", "石", "彫像", "岩", "扉", "木" }; int dig_target = dig_typ(uwep, dpx, dpy); if (IS_WALL(lev->typ) || dig_target == DIGTYP_DOOR) { if(*in_rooms(dpx, dpy, SHOPBASE)) { +#if 0 /*JP*/ pline("This %s seems too hard to %s.", IS_DOOR(lev->typ) ? "door" : "wall", verb); +#else + pline("この%sはとても固くて掘れない.", + IS_DOOR(lev->typ) ? "扉" : "壁"); +#endif return(0); } } else if (!IS_ROCK(lev->typ) && dig_target == DIGTYP_ROCK) return(0); /* statue or boulder got taken */ if(!did_dig_msg) { +#if 0 /*JP:T*/ You("hit the %s with all your might.", d_target[dig_target]); +#else + You("%sを力一杯打ちつけた.", + d_target[dig_target]); +#endif did_dig_msg = TRUE; } } @@ -524,7 +645,10 @@ /* maketrap() might change it, also, in this situation, surface() returns an inappropriate string for a grave */ if (IS_GRAVE(lev->typ)) +/*JP Strcpy(surface_type, "grave"); +*/ + Strcpy(surface_type, "墓"); else Strcpy(surface_type, surface(x,y)); shopdoor = IS_DOOR(lev->typ) && *in_rooms(x, y, SHOPBASE); @@ -539,12 +663,24 @@ if (ttyp == PIT) { if(madeby_u) { +/*JP You("dig a pit in the %s.", surface_type); +*/ + You("%sに落し穴を掘った.", surface_type); +/*JP if (shopdoor) pay_for_damage("ruin", FALSE); +*/ + if (shopdoor) pay_for_damage("壊す", FALSE); } else if (!madeby_obj && canseemon(madeby)) +/*JP pline("%s digs a pit in the %s.", Monnam(madeby), surface_type); +*/ + pline("%sは%sに落し穴を掘った.", Monnam(madeby), surface_type); else if (cansee(x, y) && flags.verbose) +/*JP pline("A pit appears in the %s.", surface_type); +*/ + pline("落し穴が%sに現われた.", surface_type); if(at_u) { if (!wont_fall) { @@ -559,25 +695,43 @@ } else if(mtmp) { if(is_flyer(mtmp->data) || is_floater(mtmp->data)) { if(canseemon(mtmp)) +#if 0 /*JP:T*/ pline("%s %s over the pit.", Monnam(mtmp), (is_flyer(mtmp->data)) ? "flies" : "floats"); +#else + pline("%sは%s落し穴を越えた.", Monnam(mtmp), + (is_flyer(mtmp->data)) ? + "飛んで" : "浮いて"); +#endif } else if(mtmp != madeby) (void) mintrap(mtmp); } } else { /* was TRAPDOOR now a HOLE*/ if(madeby_u) +/*JP You("dig a hole through the %s.", surface_type); +*/ + You("%sに穴を開けた.", surface_type); else if(!madeby_obj && canseemon(madeby)) +/*JP pline("%s digs a hole through the %s.", +*/ + pline("%sは%sに穴を開けた.", Monnam(madeby), surface_type); else if(cansee(x, y) && flags.verbose) +/*JP pline("A hole appears in the %s.", surface_type); +*/ + pline("%sに穴が現われた.", surface_type); if (at_u) { if (!u.ustuck && !wont_fall && !next_to_u()) { +/*JP You("are jerked back by your pet!"); +*/ + You("ペットによって引き戻された!"); wont_fall = TRUE; } @@ -590,7 +744,10 @@ impact_drop((struct obj *)0, x, y, 0); if (oldobjs != newobjs) (void) pickup(1); +/*JP if (shopdoor && madeby_u) pay_for_damage("ruin", FALSE); +*/ + if (shopdoor && madeby_u) pay_for_damage("めちゃめちゃにする", FALSE); } else { d_level newlevel; @@ -598,9 +755,15 @@ if (*u.ushops && madeby_u) shopdig(1); /* shk might snatch pack */ /* handle earlier damage, eg breaking wand of digging */ +/*JP else if (!madeby_u) pay_for_damage("dig into", TRUE); +*/ + else if (!madeby_u) pay_for_damage("穴をあける", TRUE); +/*JP You("fall through..."); +*/ + You("落ちた..."); /* Earlier checks must ensure that the destination * level exists and is in the present dungeon. */ @@ -611,7 +774,10 @@ spoteffects(FALSE); } } else { +/*JP if (shopdoor && madeby_u) pay_for_damage("ruin", FALSE); +*/ + if (shopdoor && madeby_u) pay_for_damage("めちゃめちゃにする", FALSE); if (newobjs) impact_drop((struct obj *)0, x, y, 0); if (mtmp) { @@ -630,7 +796,10 @@ assign_level(&tolevel, &valley_level); } else if (Is_botlevel(&u.uz)) { if (canseemon(mtmp)) +/*JP pline("%s avoids the trap.", Monnam(mtmp)); +*/ + pline("%sは罠を避けた.", Monnam(mtmp)); return; } else { get_level(&tolevel, depth(&u.uz) + 1); @@ -658,11 +827,19 @@ if ((ttmp && (ttmp->ttyp == MAGIC_PORTAL || nohole)) || (IS_ROCK(lev->typ) && lev->typ != SDOOR && (lev->wall_info & W_NONDIGGABLE) != 0)) { +/*JP pline_The("%s here is too hard to dig in.", surface(u.ux,u.uy)); +*/ + pline("%sはとても固くて掘れない.", surface(u.ux,u.uy)); } else if (is_pool(u.ux, u.uy) || is_lava(u.ux, u.uy)) { +#if 0 /*JP:T*/ pline_The("%s sloshes furiously for a moment, then subsides.", is_lava(u.ux, u.uy) ? "lava" : "water"); +#else + pline("%sは激しく波うった.", + is_lava(u.ux, u.uy) ? "溶岩" : "水"); +#endif wake_nearby(); /* splashing */ } else if (lev->typ == DRAWBRIDGE_DOWN || @@ -671,7 +848,10 @@ bridge is extended; drawbridge_wall is the open "doorway" or closed "door" where the portcullis/mechanism is located */ if (pit_only) { +/*JP pline_The("drawbridge seems too hard to dig through."); +*/ + pline("跳ね橋はとても固くて掘れそうにない."); return FALSE; } else { int x = u.ux, y = u.uy; @@ -684,14 +864,20 @@ } else if ((boulder_here = sobj_at(BOULDER, u.ux, u.uy)) != 0) { if (ttmp && (ttmp->ttyp == PIT || ttmp->ttyp == SPIKED_PIT) && rn2(2)) { +/*JP pline_The("boulder settles into the pit."); +*/ + pline("岩は落し穴を埋めた."); ttmp->ttyp = PIT; /* crush spikes */ } else { /* * digging makes a hole, but the boulder immediately * fills it. Final outcome: no hole, no boulder. */ +/*JP pline("KADOOM! The boulder falls in!"); +*/ + pline("どどーん!岩は落ちた!"); (void) delfloortrap(ttmp); } delobj(boulder_here); @@ -711,7 +897,10 @@ * We can't dig a hole here since that will destroy * the drawbridge. The following is a cop-out. --dlc */ +/*JP pline_The("%s here is too hard to dig in.", +*/ + pline("%sはとても固くて掘れない.", surface(u.ux, u.uy)); return FALSE; } @@ -724,8 +913,13 @@ /* if any objects were frozen here, they're released now */ unearth_objs(u.ux, u.uy); +#if 0 /*JP:T*/ pline("As you dig, the hole fills with %s!", typ == LAVAPOOL ? "lava" : "water"); +#else + pline("あなたが掘ると,%sが湧いてきた!", + typ == LAVAPOOL ? "溶岩" : "水"); +#endif if (!Levitation && !Flying) { if (typ == LAVAPOOL) (void) lava_effects(); @@ -736,10 +930,16 @@ /* the following two are here for the wand of digging */ } else if (IS_THRONE(lev->typ)) { +/*JP pline_The("throne is too hard to break apart."); +*/ + pline("玉座はとても固くて砕けない."); } else if (IS_ALTAR(lev->typ)) { +/*JP pline_The("altar is too hard to break apart."); +*/ + pline("祭壇はとても固くて砕けない."); } else { typ = fillholetyp(u.ux,u.uy); @@ -770,35 +970,60 @@ exercise(A_WIS, FALSE); if (Role_if(PM_ARCHEOLOGIST)) { adjalign(-sgn(u.ualign.type)*3); +/*JP You_feel("like a despicable grave-robber!"); +*/ + pline("これではまるで墓泥棒だ!"); } else if (Role_if(PM_SAMURAI)) { adjalign(-sgn(u.ualign.type)); +/*JP You("disturb the honorable dead!"); +*/ + You("名誉ある死者の眠りを妨げだ!"); } else if ((u.ualign.type == A_LAWFUL) && (u.ualign.record > -10)) { adjalign(-sgn(u.ualign.type)); +/*JP You("have violated the sanctity of this grave!"); +*/ + You("聖なる墓地を犯した!"); } switch (rn2(5)) { case 0: case 1: +/*JP You("unearth a corpse."); +*/ + You("死体を掘り起した."); if (!!(otmp = mk_tt_object(CORPSE, u.ux, u.uy))) otmp->age -= 100; /* this is an *OLD* corpse */; break; case 2: +#if 0 /*JP:T*/ if (!Blind) pline(Hallucination ? "Dude! The living dead!" : "The grave's owner is very upset!"); +#else + if (!Blind) pline(Hallucination ? "ゾンビがくるりと輪を描いた!" : + "墓の所有者はとても驚いた!"); +#endif (void) makemon(mkclass(S_ZOMBIE,0), u.ux, u.uy, NO_MM_FLAGS); break; case 3: +#if 0 /*JP:T*/ if (!Blind) pline(Hallucination ? "I want my mummy!" : "You've disturbed a tomb!"); +#else + if (!Blind) pline(Hallucination ? "マミーが必要だ!" : + "墓を荒してしまった!"); +#endif (void) makemon(mkclass(S_MUMMY,0), u.ux, u.uy, NO_MM_FLAGS); break; default: /* No corpse */ +/*JP pline_The("grave seems unused. Strange...."); +*/ + pline("この墓は未使用のようだ.奇妙だ..."); break; } levl[u.ux][u.uy].typ = ROOM; @@ -827,13 +1052,21 @@ else res = 1; } ispick = is_pick(obj); +/*JP verb = ispick ? "dig" : "chop"; +*/ + verb = ispick ? "掘る" : "砕く"; if (u.utrap && u.utraptype == TT_WEB) { +#if 0 /*JP:T*/ pline("%s you can't %s while entangled in a web.", /* res==0 => no prior message; res==1 => just got "You now wield a pick-axe." message */ !res ? "Unfortunately," : "But", verb); +#else + pline("%sくもの巣にひっかかっている間は%s.", + !res ? "残念ながら" : "しかし", jconj(verb, "ない")); +#endif return res; } @@ -849,7 +1082,10 @@ sdp++; } *dsp = 0; +/*JP Sprintf(qbuf, "In what direction do you want to %s? [%s]", verb, dirsyms); +*/ + Sprintf(qbuf, "どの方向を%s?[%s]", verb, dirsyms); if(!getdir(qbuf)) return(res); @@ -868,26 +1104,44 @@ register struct rm *lev; int dig_target; boolean ispick = is_pick(obj); +#if 0 /*JP*/ const char *verbing = ispick ? "digging" : "chopping"; +#else + const char *verbing = ispick ? "掘る" : "砕く"; +#endif if (u.uswallow && attack(u.ustuck)) { ; /* return(1) */ } else if (Underwater) { +/*JP pline("Turbulence torpedoes your %s attempts.", verbing); +*/ + pline("%sとすると乱水流が起きた.", jconj(verbing, "よう")); } else if(u.dz < 0) { if(Levitation) +/*JP You("don't have enough leverage."); +*/ + You("浮いているのでふんばりがきかない."); else +/*JP You_cant("reach the %s.",ceiling(u.ux,u.uy)); +*/ + You("%sに届かない.", ceiling(u.ux,u.uy)); } else if(!u.dx && !u.dy && !u.dz) { char buf[BUFSZ]; int dam; dam = rnd(2) + dbon() + obj->spe; if (dam <= 0) dam = 1; +#if 0 /*JP*/ You("hit yourself with %s.", yname(uwep)); Sprintf(buf, "%s own %s", uhis(), OBJ_NAME(objects[obj->otyp])); +#else + You("自分自身を%sで叩いた.", yname(uwep)); + Sprintf(buf, "自分自身を%sで叩いて", yname(uwep)); +#endif losehp(dam, buf, KILLED_BY); flags.botl=1; return(1); @@ -896,7 +1150,10 @@ rx = u.ux + u.dx; ry = u.uy + u.dy; if(!isok(rx, ry)) { +/*JP pline("Clash!"); +*/ + pline("ガラガラ!"); return(1); } lev = &levl[rx][ry]; @@ -910,33 +1167,68 @@ if (trap && trap->ttyp == WEB) { if (!trap->tseen) { seetrap(trap); +/*JP There("is a spider web there!"); +*/ + pline("そこにはくもの巣がある!"); } +#if 0 /*JP*/ Your("%s entangled in the web.", aobjnam(obj, "become")); +#else + Your("%sはくもの巣にからまった.", + xname(obj)); +#endif /* you ought to be able to let go; tough luck */ /* (maybe `move_into_trap()' would be better) */ nomul(-d(2,2)); +/*JP nomovemsg = "You pull free."; +*/ + nomovemsg = "ひきはなした."; } else if (lev->typ == IRONBARS) { +/*JP pline("Clang!"); +*/ + pline("ガツン!"); wake_nearby(); } else if (IS_TREE(lev->typ)) +/*JP You("need an axe to cut down a tree."); +*/ + You("木を切るには斧が必要だ."); else if (IS_ROCK(lev->typ)) +/*JP You("need a pick to dig rock."); +*/ + You("掘るにはつるはしが必要だ."); else if (!ispick && (sobj_at(STATUE, rx, ry) || sobj_at(BOULDER, rx, ry))) { boolean vibrate = !rn2(3); +#if 0 /*JP:T*/ pline("Sparks fly as you whack the %s.%s", sobj_at(STATUE, rx, ry) ? "statue" : "boulder", vibrate ? " The axe-handle vibrates violently!" : ""); +#else + pline("%sを切ろうとしたら火花が散った!%s", + sobj_at(STATUE, rx, ry) ? "彫像" : "岩", + vibrate ? "斧は激しく振動した!" : ""); +#endif +/*JP if (vibrate) losehp(2, "axing a hard object", KILLED_BY); +*/ + if (vibrate) losehp(2, "固いものに斧を使おうとして", KILLED_BY); } else +#if 0 /*JP:T*/ You("swing your %s through thin air.", aobjnam(obj, (char *)0)); +#else + You("何もない空間で%sを振りまわした.", + xname(obj)); +#endif } else { +#if 0 /*JP*/ static const char * const d_action[6] = { "swinging", "digging", @@ -945,6 +1237,24 @@ "chopping at the door", "cutting the tree" }; +#else + static const char * const d_action1[6] = { + "振り", + "掘り", + "彫像を削り", + "岩を打ちつけ", + "扉を削り", + "木を切り" + }; + static const char * const d_action2[6] = { + "振る", + "掘る", + "彫像を削る", + "岩を打ちつける", + "扉を削る", + "木を切る" + }; +#endif did_dig_msg = FALSE; digging.quiet = FALSE; if (digging.pos.x != rx || digging.pos.y != ry || @@ -966,26 +1276,50 @@ assign_level(&digging.level, &u.uz); digging.effort = 0; if (!digging.quiet) +/*JP You("start %s.", d_action[dig_target]); +*/ + You("%sはじめた.", d_action1[dig_target]); } else { +#if 0 /*JP*/ You("%s %s.", digging.chew ? "begin" : "continue", d_action[dig_target]); +#else + You("%sのを%sした.", d_action2[dig_target], + digging.chew ? "開始" : "再開"); +#endif digging.chew = FALSE; } set_occupation(dig, verbing, 0); } } else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) { /* it must be air -- water checked above */ +/*JP You("swing your %s through thin air.", aobjnam(obj, (char *)0)); +*/ + You("%sを何もない空間で振りまわした.", xname(obj)); } else if (!can_reach_floor()) { +/*JP You_cant("reach the %s.", surface(u.ux,u.uy)); +*/ + You("%sに届かない.", surface(u.ux,u.uy)); } else if (is_pool(u.ux, u.uy) || is_lava(u.ux, u.uy)) { /* Monsters which swim also happen not to be able to dig */ +#if 0 /*JP:T*/ You("cannot stay under%s long enough.", is_pool(u.ux, u.uy) ? "water" : " the lava"); +#else + You("%sには長時間いられない.", + is_pool(u.ux, u.uy) ? "水面下" : "溶岩の中"); +#endif } else if (!ispick) { +#if 0 /*JP:T*/ Your("%s merely scratches the %s.", aobjnam(obj, (char *)0), surface(u.ux,u.uy)); +#else + Your("%sは%sにかすり傷をつけただけだった.", + aobjnam(obj, (char *)0), surface(u.ux,u.uy)); +#endif u_wipe_engr(3); } else { if (digging.pos.x != u.ux || digging.pos.y != u.uy || @@ -997,10 +1331,16 @@ digging.pos.y = u.uy; assign_level(&digging.level, &u.uz); digging.effort = 0; +/*JP You("start %s downward.", verbing); +*/ + You("下向きに掘りはじめた."); if (*u.ushops) shopdig(0); } else +/*JP You("continue %s downward.", verbing); +*/ + You("下向きに掘るのを再開した."); did_dig_msg = FALSE; set_occupation(dig, verbing, 0); } @@ -1037,20 +1377,38 @@ if (mtmp) { if(zap || digging.warned) { +/*JP verbalize("Halt, vandal! You're under arrest!"); +*/ + verbalize("止まれ野蛮人!おまえを逮捕する!"); (void) angry_guards(!(flags.soundok)); } else { const char *str; if (IS_DOOR(lev->typ)) +/*JP str = "door"; +*/ + str = "扉"; else if (IS_TREE(lev->typ)) +/*JP str = "tree"; +*/ + str = "木"; else if (IS_ROCK(lev->typ)) +/*JP str = "wall"; +*/ + str = "壁"; else +/*JP str = "fountain"; +*/ + str = "泉"; +/*JP verbalize("Hey, stop damaging that %s!", str); +*/ + verbalize("おい,%sを破壊するのをやめろ!", str); digging.warned = TRUE; } if (is_digging()) @@ -1087,7 +1445,10 @@ } } else { if (!rn2(3) && flags.verbose) /* not too often.. */ +/*JP You_feel("an unexpected draft."); +*/ + You("思いもよらず,すきま風を感じた."); here->doormask = D_BROKEN; } newsym(mtmp->mx, mtmp->my); @@ -1106,7 +1467,10 @@ if (IS_WALL(here->typ)) { /* KMH -- Okay on arboreal levels (room walls are still stone) */ if (flags.soundok && flags.verbose && !rn2(5)) +/*JP You_hear("crashing rock."); +*/ + You_hear("岩のくだける音を聞いた."); if (*in_rooms(mtmp->mx, mtmp->my, SHOPBASE)) add_damage(mtmp->mx, mtmp->my, 0L); if (level.flags.is_maze_lev) { @@ -1161,7 +1525,10 @@ if (!is_whirly(mtmp->data)) { if (is_animal(mtmp->data)) +/*JP You("pierce %s %s wall!", +*/ + You("%sの%sの壁に穴を開けた!", s_suffix(mon_nam(mtmp)), mbodypart(mtmp, STOMACH)); mtmp->mhp = 1; /* almost dead */ expels(mtmp, mtmp->data, !is_animal(mtmp->data)); @@ -1173,13 +1540,30 @@ if (!Is_airlevel(&u.uz) && !Is_waterlevel(&u.uz) && !Underwater) { if (u.dz < 0 || On_stairs(u.ux, u.uy)) { if (On_stairs(u.ux, u.uy)) +#if 0 /*JP:T*/ pline_The("beam bounces off the %s and hits the %s.", (u.ux == xdnladder || u.ux == xupladder) ? "ladder" : "stairs", ceiling(u.ux, u.uy)); +#else + pline("光線は%sで反射し%sに命中した.", + (u.ux == xdnladder || u.ux == xupladder) ? + "はしご" : "階段", ceiling(u.ux, u.uy)); +#endif +/*JP You("loosen a rock from the %s.", ceiling(u.ux, u.uy)); +*/ + pline("%sの岩がガタガタしはじめた.", ceiling(u.ux, u.uy)); +/*JP pline("It falls on your %s!", body_part(HEAD)); +*/ + pline("それはあなたの%sに落ちてきた!", body_part(HEAD)); +#if 0 /*JP:T*/ losehp(rnd((uarmh && is_metallic(uarmh)) ? 2 : 6), "falling rock", KILLED_BY_AN); +#else + losehp(rnd((uarmh && is_metallic(uarmh)) ? 2 : 6), + "落岩で", KILLED_BY_AN); +#endif otmp = mksobj_at(ROCK, u.ux, u.uy, FALSE, FALSE); if (otmp) { (void)xname(otmp); /* set dknown, maybe bknown */ @@ -1214,7 +1598,10 @@ if (room->typ == SDOOR) room->typ = DOOR; else if (cansee(zx, zy)) +/*JP pline_The("door is razed!"); +*/ + pline("扉は崩れ落ちた!"); watch_dig((struct monst *)0, zx, zy, TRUE); room->doormask = D_NODOOR; unblock_point(zx,zy); /* vision */ @@ -1230,21 +1617,30 @@ room->typ = ROOM; unblock_point(zx,zy); /* vision */ } else if (!Blind) +/*JP pline_The("wall glows then fades."); +*/ + pline("壁は一瞬輝いた."); break; } else if (IS_TREE(room->typ)) { /* check trees before stone */ if (!(room->wall_info & W_NONDIGGABLE)) { room->typ = ROOM; unblock_point(zx,zy); /* vision */ } else if (!Blind) +/*JP pline_The("tree shudders but is unharmed."); +*/ + pline("木はゆれたが傷つかなかった."); break; } else if (room->typ == STONE || room->typ == SCORR) { if (!(room->wall_info & W_NONDIGGABLE)) { room->typ = CORR; unblock_point(zx,zy); /* vision */ } else if (!Blind) +/*JP pline_The("rock glows then fades."); +*/ + pline("石は一瞬輝いた."); break; } } else if (IS_ROCK(room->typ)) { @@ -1276,7 +1672,10 @@ } /* while */ tmp_at(DISP_END,0); /* closing call */ if (shopdoor || shopwall) +/*JP pay_for_damage(shopdoor ? "destroy" : "dig into", FALSE); +*/ + pay_for_damage(shopdoor ? "破壊する" : "穴をあける", FALSE); return; } @@ -1427,9 +1826,15 @@ } else if (in_invent) { if (flags.verbose) { char *cname = corpse_xname(obj, FALSE); +#if 0 /*JP:T*/ Your("%s%s %s away%c", obj == uwep ? "wielded " : nul, cname, otense(obj, "rot"), obj == uwep ? '!' : '.'); +#else + pline("あなたの%s%sは腐ってしまった%s", + obj == uwep ? "手にしている" : "", cname, + obj == uwep ? "!" : "."); +#endif } if (obj == uwep) { uwepgone(); /* now bare handed */ @@ -1483,9 +1888,15 @@ #endif if (!Levitation && !Flying) { if(u.uswallow) +/*JP You_feel("a sensation like falling into a trap!"); +*/ + You("罠に落ちるような感覚におそわれた!"); else +/*JP pline_The("%s opens beneath you and you fall in!", +*/ + pline("%sが下方に開き,あなたは落ちた!", surface(u.ux, u.uy)); u.uburied = TRUE; @@ -1515,7 +1926,10 @@ #endif if ((Teleportation || can_teleport(youmonst.data)) && (Teleport_control || rn2(3) < Luck+2)) { +/*JP You("attempt a teleport spell."); +*/ + You("瞬間移動を試みた."); (void) dotele(); /* calls unearth_you() */ } else if(u.uburied) { /* still buried after 'port attempt */ boolean good; @@ -1524,10 +1938,17 @@ noncorporeal(youmonst.data) || unsolid(youmonst.data) || (tunnels(youmonst.data) && !needspick(youmonst.data))) { +#if 0 /*JP:T*/ You("%s up through the %s.", (tunnels(youmonst.data) && !needspick(youmonst.data)) ? "try to tunnel" : (amorphous(youmonst.data)) ? "ooze" : "phase", surface(u.ux, u.uy)); +#else + You("床に%sろうとした.", + (tunnels(youmonst.data) && !needspick(youmonst.data)) ? + "トンネルを掘" : (amorphous(youmonst.data)) ? + "にじみのぼ" : "徐々にはいあが"); +#endif if(tunnels(youmonst.data) && !needspick(youmonst.data)) good = dighole(TRUE); @@ -1546,7 +1967,10 @@ pline("bury_obj"); #endif if(cansee(otmp->ox, otmp->oy)) +/*JP pline_The("objects on the %s tumble into a hole!", +*/ + pline_The("%sの物体は穴に転がった!", surface(otmp->ox, otmp->oy)); bury_objs(otmp->ox, otmp->oy); diff -aurbN -xCVS -xXTAGS nethack/src/do.c jnethack/src/do.c --- nethack/src/do.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/do.c 2005-05-01 07:21:05.000000000 +0900 @@ -4,6 +4,14 @@ /* Contains code for 'd', 'D' (drop), '>', '<' (up, down) */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** changing point is marked `JP' (94/6/7) +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "lev.h" @@ -85,20 +93,35 @@ newsym(rx,ry); if (pushing) { +/*JP You("push %s into the %s.", the(xname(otmp)), what); +*/ + You("%sを%sの中へ押しこんだ.", the(xname(otmp)), what); if (flags.verbose && !Blind) +/*JP pline("Now you can cross it!"); +*/ + pline("さぁ渡れるぞ!"); /* no splashing in this case */ } } if (!fills_up || !pushing) { /* splashing occurs */ if (!u.uinwater) { if (pushing ? !Blind : cansee(rx,ry)) { +#if 0 /*JP*/ There("is a large splash as %s %s the %s.", the(xname(otmp)), fills_up? "fills":"falls into", what); +#else + pline("%sを%sに%sと大きなしぶきがあがった.", + xname(otmp), what, + fills_up? "埋め込む" : "落す" ); +#endif } else if (flags.soundok) +/*JP You_hear("a%s splash.", lava ? " sizzling" : ""); +*/ + You_hear("%sと言う音を聞いた.",lava ? "シューッ" : "パシャッ"); wake_nearto(rx, ry, 40); } @@ -106,16 +129,31 @@ u.uinwater = 0; docrt(); vision_full_recalc = 1; +/*JP You("find yourself on dry land again!"); +*/ + You("いつのまにか乾いた場所にいた!"); } else if (lava && distu(rx,ry) <= 2) { +#if 0 /*JP*/ You("are hit by molten lava%c", Fire_resistance ? '.' : '!'); burn_away_slime(); +#else + You("どろどろの溶岩でダメージを受けた%s", + Fire_resistance ? "." : "!"); + burn_away_slime(); +#endif losehp(d((Fire_resistance ? 1 : 3), 6), +/*JP "molten lava", KILLED_BY); +*/ + "どろどろの溶岩で", KILLED_BY); } else if (!fills_up && flags.verbose && (pushing ? !Blind : cansee(rx,ry))) +/*JP pline("It sinks without a trace!"); +*/ + pline("それはあとかたもなく沈んだ!"); } /* boulder is now gone */ @@ -136,6 +174,9 @@ int x,y; const char *verb; { +#if 1 /*JP*//* trap.c */ + extern const char *set_you[2]; +#endif struct trap *t; struct monst *mtmp; @@ -153,9 +194,15 @@ if (((mtmp = m_at(x, y)) && mtmp->mtrapped) || (u.utrap && u.ux == x && u.uy == y)) { if (*verb) +#if 0 /*JP*/ pline_The("boulder %s into the pit%s.", vtense((const char *)0, verb), (mtmp) ? "" : " with you"); +#else + pline("岩は%s落し穴へ%s.", + (mtmp) ? "" : "あなたといっしょに", + jpast(verb)); +#endif if (mtmp) { if (!passes_walls(mtmp->data) && !throws_rocks(mtmp->data)) { @@ -165,8 +212,13 @@ mtmp->mtrapped = 0; } else { if (!Passes_walls && !throws_rocks(youmonst.data)) { +#if 0 /*JP:T*/ losehp(rnd(15), "squished under a boulder", NO_KILLER_PREFIX); +#else + losehp(rnd(15), "岩の下で潰されて", + KILLED_BY); +#endif return FALSE; /* player remains trapped */ } else u.utrap = 0; } @@ -174,15 +226,28 @@ if (*verb) { if (Blind) { if ((x == u.ux) && (y == u.uy)) +/*JP You_hear("a CRASH! beneath you."); +*/ + You_hear("足元で何かが砕ける音を聞いた."); else +/*JP You_hear("the boulder %s.", verb); +*/ + You_hear("岩が%s音を聞いた.", verb); } else if (cansee(x, y)) { +#if 0 /*JP*/ pline_The("boulder %s%s.", t->tseen ? "" : "triggers and ", t->ttyp == TRAPDOOR ? "plugs a trap door" : t->ttyp == HOLE ? "plugs a hole" : "fills a pit"); +#else + pline_The("岩は%s.", + t->ttyp == TRAPDOOR ? "落し扉を埋めた" : + t->ttyp == HOLE ? "穴を埋めた" : + "落し穴を埋めた"); +#endif } } deltrap(t); @@ -200,9 +265,15 @@ ((x == u.ux) && (y == u.uy))) { if (!Underwater) { if (weight(obj) > 9) { +/*JP pline("Splash!"); +*/ + pline("バシャッ!"); } else if (Levitation || Flying) { +/*JP pline("Plop!"); +*/ + pline("ポチャン!"); } } map_background(x, y, 0); @@ -215,12 +286,22 @@ (t->ttyp==PIT || t->ttyp==SPIKED_PIT)) { /* you escaped a pit and are standing on the precipice */ if (Blind && flags.soundok) +#if 0 /*JP:T*/ You_hear("%s %s downwards.", The(xname(obj)), otense(obj, "tumble")); +#else + You_hear("%sが下の方へ転がっていく音を聞いた.", + xname(obj)); +#endif else +#if 0 /*JP:T*/ pline("%s %s into %s pit.", The(xname(obj)), otense(obj, "tumble"), the_your[t->madeby_u]); +#else + pline("%sは%s落とし穴に転がりおちた.", + xname(obj), set_you[t->madeby_u]); +#endif } return FALSE; } @@ -239,13 +320,23 @@ u.uconduct.gnostic++; if ((obj->blessed || obj->cursed) && obj->oclass != COIN_CLASS) { +#if 0 /*JP*/ There("is %s flash as %s %s the altar.", an(hcolor(obj->blessed ? NH_AMBER : NH_BLACK)), doname(obj), otense(obj, "hit")); +#else + pline("%sが祭壇に触れると%s光った.", + doname(obj), + an(jconj_adj(hcolor(obj->blessed ? NH_AMBER : NH_BLACK)))); +#endif if (!Hallucination) obj->bknown = 1; } else { +#if 0 /*JP*/ pline("%s %s on the altar.", Doname2(obj), otense(obj, "land")); +#else + pline("%sを祭壇の上に置いた.", Doname2(obj)); +#endif obj->bknown = 1; } } @@ -269,53 +360,100 @@ register struct obj *otmp,*otmp2; register boolean ideed = TRUE; +/*JP You("drop %s down the drain.", doname(obj)); +*/ + You("%sを排水口に落した.", doname(obj)); obj->in_use = TRUE; /* block free identification via interrupt */ switch(obj->otyp) { /* effects that can be noticed without eyes */ case RIN_SEARCHING: +/*JP You("thought your %s got lost in the sink, but there it is!", +*/ + You("%sを失った気がしたが,気のせいだった!", xname(obj)); goto giveback; case RIN_SLOW_DIGESTION: +/*JP pline_The("ring is regurgitated!"); +*/ + pline("指輪は逆流した!"); giveback: obj->in_use = FALSE; dropx(obj); trycall(obj); return; case RIN_LEVITATION: +/*JP pline_The("sink quivers upward for a moment."); +*/ + pline("流し台は一瞬,上下に震えた."); break; case RIN_POISON_RESISTANCE: +/*JP You("smell rotten %s.", makeplural(fruitname(FALSE))); +*/ + pline("腐った%sのような匂いがした.", fruitname(FALSE)); break; case RIN_AGGRAVATE_MONSTER: +/*JP pline("Several flies buzz angrily around the sink."); +*/ + pline("数匹のハエがブンブン流し台の回りを飛びまわった."); break; case RIN_SHOCK_RESISTANCE: +/*JP pline("Static electricity surrounds the sink."); +*/ + pline("流し台がピリピリしはじめた."); break; case RIN_CONFLICT: +/*JP You_hear("loud noises coming from the drain."); +*/ + pline("排水口から大きな音が聞こえてきた."); break; case RIN_SUSTAIN_ABILITY: /* KMH */ +/*JP pline_The("water flow seems fixed."); +*/ + pline("水の流れが一定になった."); break; case RIN_GAIN_STRENGTH: +#if 0 /*JP*/ pline_The("water flow seems %ser now.", (obj->spe<0) ? "weak" : "strong"); +#else + pline("水の流れが%sなったように見えた.", + (obj->spe<0) ? "弱く" : "強く"); +#endif break; case RIN_GAIN_CONSTITUTION: +#if 0 /*JP*/ pline_The("water flow seems %ser now.", (obj->spe<0) ? "less" : "great"); +#else + pline("水の力が%sなったように見えた.", + (obj->spe<0) ? "弱く" : "強く"); +#endif break; case RIN_INCREASE_ACCURACY: /* KMH */ +#if 0 /*JP*/ pline_The("water flow %s the drain.", (obj->spe<0) ? "misses" : "hits"); +#else + pline_The("水が排水口%sようになった.", + (obj->spe<0) ? "から反れる" : "めがけて流れる"); +#endif break; case RIN_INCREASE_DAMAGE: +#if 0 /*JP*/ pline_The("water's force seems %ser now.", (obj->spe<0) ? "small" : "great"); +#else + pline_The("水の勢いが%sなった.", + (obj->spe<0) ? "弱く" : "強く"); +#endif break; case RIN_HUNGER: ideed = FALSE; @@ -324,8 +462,13 @@ if (otmp != uball && otmp != uchain && !obj_resists(otmp, 1, 99)) { if (!Blind) { +#if 0 /*JP*/ pline("Suddenly, %s %s from the sink!", doname(otmp), otense(otmp, "vanish")); +#else + pline("突然,%sは流し台から消えた!", + doname(otmp)); +#endif ideed = TRUE; } delobj(otmp); @@ -334,7 +477,10 @@ break; case MEAT_RING: /* Not the same as aggravate monster; besides, it's obvious. */ +/*JP pline("Several flies buzz around the sink."); +*/ + pline("数匹のハエがブンブン流し台の回りを飛びまわった."); break; default: ideed = FALSE; @@ -344,59 +490,113 @@ ideed = TRUE; switch(obj->otyp) { /* effects that need eyes */ case RIN_ADORNMENT: +/*JP pline_The("faucets flash brightly for a moment."); +*/ + pline("蛇口は一瞬明るく輝いた."); break; case RIN_REGENERATION: +/*JP pline_The("sink looks as good as new."); +*/ + pline("流し台が新品のように見えた."); break; case RIN_INVISIBILITY: +/*JP You("don't see anything happen to the sink."); +*/ + pline("流し台に何が起きたのか見えなかった."); break; case RIN_FREE_ACTION: +/*JP You("see the ring slide right down the drain!"); +*/ + pline("指輪が排水口をするりと避けるのを見た!"); break; case RIN_SEE_INVISIBLE: +/*JP You("see some air in the sink."); +*/ + You("流し台の上に何らかの気体が見えた."); break; case RIN_STEALTH: +/*JP pline_The("sink seems to blend into the floor for a moment."); +*/ + pline("一瞬,流し台が床に溶けこんだように見えた."); break; case RIN_FIRE_RESISTANCE: +/*JP pline_The("hot water faucet flashes brightly for a moment."); +*/ + pline("一瞬,熱湯の蛇口が明るく輝いた."); break; case RIN_COLD_RESISTANCE: +/*JP pline_The("cold water faucet flashes brightly for a moment."); +*/ + pline("一瞬,冷水の蛇口が明るく輝いた."); break; case RIN_PROTECTION_FROM_SHAPE_CHAN: +/*JP pline_The("sink looks nothing like a fountain."); +*/ + pline("流し台は泉とはまったく違うもののように見えた."); break; case RIN_PROTECTION: +#if 0 /*JP*/ pline_The("sink glows %s for a moment.", hcolor((obj->spe<0) ? NH_BLACK : NH_SILVER)); +#else + pline("流し台は一瞬%s輝いた.", + jconj_adj(hcolor((obj->spe<0) ? NH_BLACK : NH_SILVER))); +#endif break; case RIN_WARNING: +/*JP pline_The("sink glows %s for a moment.", hcolor(NH_WHITE)); +*/ + pline("流し台は一瞬%s輝いた.", jconj_adj(hcolor(NH_WHITE))); break; case RIN_TELEPORTATION: +/*JP pline_The("sink momentarily vanishes."); +*/ + pline("流し台は一瞬消えた."); break; case RIN_TELEPORT_CONTROL: +/*JP "beam aboard" はスタートレックの「転送」*/ +/*JP pline_The("sink looks like it is being beamed aboard somewhere."); +*/ + pline("流し台はどこかに転送されようとしているように見えた."); break; case RIN_POLYMORPH: +/*JP pline_The("sink momentarily looks like a fountain."); +*/ + pline("流し台は一瞬泉のように見えた."); break; case RIN_POLYMORPH_CONTROL: +/*JP pline_The("sink momentarily looks like a regularly erupting geyser."); +*/ + pline("流し台は一瞬規則正しく噴出する間欠泉のように見えた."); break; } } if(ideed) trycall(obj); else +/*JP You_hear("the ring bouncing down the drainpipe."); +*/ + You("指輪が排水口に当りながら落る音を聞いた."); if (!rn2(20)) { +/*JP pline_The("sink backs up, leaving %s.", doname(obj)); +*/ + pline("しかし,流し台に%sは流れてない.", doname(obj)); obj->in_use = FALSE; dropx(obj); } else @@ -415,8 +615,13 @@ { if(obj->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL)){ if (*word) +#if 0 /*JP:T*/ Norep("You cannot %s %s you are wearing.",word, something); +#else + Norep("あなたが身につけているものを%sことはできない.", + word); +#endif return(FALSE); } if (obj->otyp == LOADSTONE && obj->cursed) { @@ -427,9 +632,14 @@ implicitly forced to be 1; replicate its kludge... */ if (!strcmp(word, "throw") && obj->quan > 1L) obj->corpsenm = 1; +#if 0 /*JP*/ pline("For some reason, you cannot %s%s the stone%s!", word, obj->corpsenm ? " any of" : "", plur(obj->quan)); +#else + pline("どういうわけか,あなたは石を%sことはできない!", + word); +#endif } obj->corpsenm = 0; /* reset */ obj->bknown = 1; @@ -437,15 +647,23 @@ } if (obj->otyp == LEASH && obj->leashmon != 0) { if (*word) +/*JP pline_The("leash is tied around your %s.", +*/ + pline("紐があなたの%sに結びつけられている.", body_part(HAND)); return(FALSE); } #ifdef STEED if (obj->owornmask & W_SADDLE) { if (*word) +#if 0 /*JP*/ You("cannot %s %s you are sitting on.", word, something); +#else + You("乗っている間は%sを%sことはできない.", + something, word); +#endif return (FALSE); } #endif @@ -458,7 +676,10 @@ register struct obj *obj; { if(!obj) return(0); +/*JP if(!canletgo(obj,"drop")) +*/ + if(!canletgo(obj,"置く")) return(0); if(obj == uwep) { if(welded(uwep)) { @@ -482,8 +703,13 @@ /* doname can call s_suffix, reusing its buffer */ Strcpy(buf, s_suffix(mon_nam(u.ustuck))); +#if 0 /*JP*/ You("drop %s into %s %s.", doname(obj), buf, mbodypart(u.ustuck, STOMACH)); +#else + You("%sを%sの%sに置いた.", doname(obj), buf, + mbodypart(u.ustuck, STOMACH)); +#endif } } else { #ifdef SINKS @@ -494,7 +720,10 @@ } #endif if (!can_reach_floor()) { +/*JP if(flags.verbose) You("drop %s.", doname(obj)); +*/ + if(flags.verbose) You("%sを置いた.", doname(obj)); #ifndef GOLDOBJ if (obj->oclass != COIN_CLASS || obj == invent) freeinv(obj); #else @@ -506,7 +735,10 @@ return(1); } if (!IS_ALTAR(levl[u.ux][u.uy].typ) && flags.verbose) +/*JP You("drop %s.", doname(obj)); +*/ + You("%sを置いた.", doname(obj)); } dropx(obj); return(1); @@ -541,7 +773,10 @@ if (obj == uquiver) setuqwep((struct obj *)0); if (obj == uswapwep) setuswapwep((struct obj *)0); +/*JP if (!u.uswallow && flooreffects(obj,u.ux,u.uy,"drop")) return; +*/ + if (!u.uswallow && flooreffects(obj,u.ux,u.uy,"落ちる")) return; /* uswallow check done by GAN 01/29/87 */ if(u.uswallow) { boolean could_petrify = FALSE; @@ -665,7 +900,10 @@ all_categories = (retry == -2); } else if (flags.menu_style == MENU_FULL) { all_categories = FALSE; +/*JP n = query_category("Drop what type of items?", +*/ + n = query_category("どの種類の道具を置きますか?", invent, UNPAID_TYPES | ALL_TYPES | CHOOSE_ALL | BUC_BLESSED | BUC_CURSED | BUC_UNCURSED | BUC_UNKNOWN, @@ -699,7 +937,10 @@ } } else { /* should coordinate with perm invent, maybe not show worn items */ +/*JP n = query_objlist("What would you like to drop?", invent, +*/ + n = query_objlist("どれを置きますか?", invent, USE_INVLET|INVORDER_SORT, &pick_list, PICK_ANY, all_categories ? allow_all : allow_category); if (n > 0) { @@ -757,10 +998,16 @@ #ifdef STEED if (u.usteed && !u.usteed->mcanmove) { +/*JP pline("%s won't move!", Monnam(u.usteed)); +*/ + pline("%sは動けない!", Monnam(u.usteed)); return(0); } else if (u.usteed && u.usteed->meating) { +/*JP pline("%s is still eating.", Monnam(u.usteed)); +*/ + pline("%sはまだ食べている.", Monnam(u.usteed)); return(0); } else #endif @@ -783,8 +1030,13 @@ if (float_down(I_SPECIAL|TIMEOUT, W_ARTI)) return (1); /* came down, so moved */ } +#if 0 /*JP*/ floating_above(stairs_down ? "stairs" : ladder_down ? "ladder" : surface(u.ux, u.uy)); +#else + floating_above(stairs_down ? "階段" : ladder_down ? + "はしご" : surface(u.ux, u.uy)); +#endif return (0); /* didn't move */ } if (!stairs_down && !ladder_down) { @@ -796,34 +1048,63 @@ uwep && is_pick(uwep)) { return use_pick_axe2(uwep); } else { +/*JP You_cant("go down here."); +*/ + pline("ここでは降りることができない."); return(0); } } } if(u.ustuck) { +#if 0 /*JP*/ You("are %s, and cannot go down.", !u.uswallow ? "being held" : is_animal(u.ustuck->data) ? "swallowed" : "engulfed"); +#else + You("%s降りることができない.", + !u.uswallow ? "つかまえられていて" : is_animal(u.ustuck->data) ? + "飲み込まれていて" : "巻き込まれていて"); +#endif return(1); } if (on_level(&valley_level, &u.uz) && !u.uevent.gehennom_entered) { +/*JP You("are standing at the gate to Gehennom."); +*/ + You("ゲヘナの門の前に立っている."); +/*JP pline("Unspeakable cruelty and harm lurk down there."); +*/ + pline("言葉にすらできない残虐と惨事がこの下に潜んでいる."); +/*JP if (yn("Are you sure you want to enter?") != 'y') +*/ + if (yn("本当に入りますか?") != 'y') return(0); +/*JP else pline("So be it."); +*/ + else pline("運命は決まった."); u.uevent.gehennom_entered = 1; /* don't ask again */ } if(!next_to_u()) { +/*JP You("are held back by your pet!"); +*/ + You("ペットに呼びもどされた!"); return(0); } if (trap) +#if 0 /*JP*/ You("%s %s.", locomotion(youmonst.data, "jump"), trap->ttyp == HOLE ? "down the hole" : "through the trap door"); +#else + You("%s%s.", locomotion(youmonst.data, "跳ぶ"), + trap->ttyp == HOLE ? "穴に落ちた" : "落し扉に入った"); +#endif if (trap && Is_stronghold(&u.uz)) { goto_hell(FALSE, TRUE); @@ -843,36 +1124,62 @@ && (!sstairs.sx || u.ux != sstairs.sx || u.uy != sstairs.sy || !sstairs.up) ) { +/*JP You_cant("go up here."); +*/ + You("ここでは上ることができない."); return(0); } #ifdef STEED if (u.usteed && !u.usteed->mcanmove) { +/*JP pline("%s won't move!", Monnam(u.usteed)); +*/ + pline("%sは動けない!", Monnam(u.usteed)); return(0); } else if (u.usteed && u.usteed->meating) { +/*JP pline("%s is still eating.", Monnam(u.usteed)); +*/ + pline("%sはまだ食べている.", Monnam(u.usteed)); return(0); } else #endif if(u.ustuck) { +#if 0 /*JP*/ You("are %s, and cannot go up.", !u.uswallow ? "being held" : is_animal(u.ustuck->data) ? "swallowed" : "engulfed"); +#else + You("%s降りることができない.", + !u.uswallow ? "つかまえられていて" : is_animal(u.ustuck->data) ? + "飲み込まれていて" : "巻き込まれていて"); +#endif return(1); } if(near_capacity() > SLT_ENCUMBER) { /* No levitation check; inv_weight() already allows for it */ +#if 0 /*JP*/ Your("load is too heavy to climb the %s.", levl[u.ux][u.uy].typ == STAIRS ? "stairs" : "ladder"); +#else + You("物を持ちすぎて%sを上ることができない.", + levl[u.ux][u.uy].typ == STAIRS ? "階段" : "はしご"); +#endif return(1); } if(ledger_no(&u.uz) == 1) { +/*JP if (yn("Beware, there will be no return! Still climb?") != 'y') +*/ + if (yn("気をつけろ,多分戻れないぞ!それでも上る?") != 'y') return(0); } if(!next_to_u()) { +/*JP You("are held back by your pet!"); +*/ + You("ペットに呼びもどされた!"); return(0); } at_ladder = (boolean) (levl[u.ux][u.uy].typ == LADDER); @@ -911,8 +1218,14 @@ if (!savelev(fd, ledger_no(&u.uz), COUNT_SAVE)) { (void) close(fd); delete_levelfile(ledger_no(&u.uz)); +/*JP pline("NetHack is out of disk space for making levels!"); +*/ + pline("新しいレベルを作るためのディスク容量が足りない!"); +/*JP You("can save, quit, or continue playing."); +*/ + You("セーブするか終了するか,あるいはプレイを続行できる."); return -1; } #endif @@ -1005,7 +1318,10 @@ new_ledger = ledger_no(newlevel); +/*JP pline("A mysterious force momentarily surrounds you..."); +*/ + pline("一瞬奇妙な力があなたを包んだ..."); if (on_level(newlevel, &u.uz)) { (void) safe_teleds(FALSE); (void) next_to_u(); @@ -1019,7 +1335,10 @@ * (s)he has been given the go-ahead by the leader. */ if (on_level(&u.uz, &qstart_level) && !newdungeon && !ok_to_quest()) { +/*JP pline("A mysterious force prevents you from descending."); +*/ + pline("奇妙な力があなたが降りるのを妨げた."); return; } @@ -1102,7 +1421,10 @@ fd = open_levelfile(new_ledger, whynot); if (fd < 0) { pline("%s", whynot); +/*JP pline("Probably someone removed it."); +*/ + pline("おそらく誰かが削除したのだろう."); killer = whynot; done(TRICKED); /* we'll reach here if running in wizard mode */ @@ -1147,10 +1469,18 @@ } /* Remove bug which crashes with levitation/punishment KAA */ if (Punished && !Levitation) { +#if 0 /*JP*/ pline("With great effort you climb the %s.", at_ladder ? "ladder" : "stairs"); +#else + pline("やっとこさ%sを上った.", + at_ladder ? "はしご" : "階段"); +#endif } else if (at_ladder) +/*JP You("climb up the ladder."); +*/ + You("はしごを上った."); } else { /* down */ if (at_ladder) { u_on_newpos(xupladder, yupladder); @@ -1159,11 +1489,19 @@ else u_on_upstairs(); } if (u.dz && Flying) +#if 0 /*JP*/ You("fly down along the %s.", at_ladder ? "ladder" : "stairs"); +#else + You("%sに沿って跳び降りた.", + at_ladder ? "はしご" : "階段"); +#endif else if (u.dz && (near_capacity() > UNENCUMBERED || Punished || Fumbling)) { +/*JP You("fall down the %s.", at_ladder ? "ladder" : "stairs"); +*/ + You("%sを転げ落ちた.", at_ladder ? "はしご" : "階段"); if (Punished) { drag_down(); if (carried(uball)) { @@ -1182,10 +1520,19 @@ dismount_steed(DISMOUNT_FELL); else #endif +/*JP losehp(rnd(3), "falling downstairs", KILLED_BY); +*/ + losehp(rnd(3), "階段を転げ落ちて", KILLED_BY); +/*JP selftouch("Falling, you"); +*/ + selftouch("落ちながら,あなたは"); } else if (u.dz && at_ladder) +/*JP You("climb down the ladder."); +*/ + You("はしごを降りた."); } } else { /* trap door or level_tele or In_endgame */ if (was_in_W_tower && On_W_tower_level(&u.uz)) @@ -1208,7 +1555,10 @@ LR_DOWNTELE, (d_level *) 0); if (falling) { if (Punished) ballfall(); +/*JP selftouch("Falling, you"); +*/ + selftouch("落ちながら,あなたは"); } } @@ -1276,52 +1626,86 @@ /* Check whether we just entered Gehennom. */ if (!In_hell(&u.uz0) && Inhell) { if (Is_valley(&u.uz)) { +/*JP You("arrive at the Valley of the Dead..."); +*/ + You("死の谷に到達した..."); +/*JP pline_The("odor of burnt flesh and decay pervades the air."); +*/ + pline("死肉や腐肉の燃える悪臭がただよっている."); #ifdef MICRO display_nhwindow(WIN_MESSAGE, FALSE); #endif +/*JP You_hear("groans and moans everywhere."); +*/ + pline("うめき声やうなり声があちこちから聞こえる."); +/*JP } else pline("It is hot here. You smell smoke..."); +*/ + } else pline("ここは暑い.煙りの匂いがする..."); } if (familiar) { static const char * const fam_msgs[4] = { +#if 0 /*JP*/ "You have a sense of deja vu.", "You feel like you've been here before.", "This place %s familiar...", +#else + "既視感におそわれた.", + "前にここに来たことがあるような気がした.", + "この場所は懐かしい...", +#endif 0 /* no message */ }; static const char * const halu_fam_msgs[4] = { +#if 0 /*JP*/ "Whoa! Everything %s different.", "You are surrounded by twisty little passages, all alike.", "Gee, this %s like uncle Conan's place...", +#else + "オワッ!まったく変わっちまってる.", + "あなたはまがりくねった通路にかこまれていた...", + "ゲー!コナンおじさんの場所に似ている...", +#endif 0 /* no message */ }; const char *mesg; +#if 0 /*JP*/ char buf[BUFSZ]; +#endif int which = rn2(4); if (Hallucination) mesg = halu_fam_msgs[which]; else mesg = fam_msgs[which]; +#if 0 /*JP*/ if (mesg && index(mesg, '%')) { Sprintf(buf, mesg, !Blind ? "looks" : "seems"); mesg = buf; } +#endif if (mesg) pline(mesg); } #ifdef REINCARNATION if (new && Is_rogue_level(&u.uz)) +/*JP You("enter what seems to be an older, more primitive world."); +*/ + You("とても古くさく見える部屋に入った,ずいぶん単純な世界だ."); #endif /* Final confrontation */ if (In_endgame(&u.uz) && newdungeon && u.uhave.amulet) resurrect(); if (newdungeon && In_V_tower(&u.uz) && In_hell(&u.uz0)) +/*JP pline_The("heat and smoke are gone."); +*/ + pline("熱と煙りは消えさった."); /* the message from your quest leader */ if (!In_quest(&u.uz0) && at_dgn_entrance("The Quest") && @@ -1337,8 +1721,14 @@ /* once Croesus is dead, his alarm doesn't work any more */ if (Is_knox(&u.uz) && (new || !mvitals[PM_CROESUS].died)) { +/*JP You("penetrated a high security area!"); +*/ + You("最高機密の場所へ踏み込んだ!"); +/*JP pline("An alarm sounds!"); +*/ + pline("警報がなった!"); for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if (!DEADMONSTER(mtmp) && mtmp->msleeping) mtmp->msleeping = 0; } @@ -1375,8 +1765,12 @@ /* create a guardian angel next to player, if worthy */ if (Conflict) { +#if 0 /*JP*/ pline( "A voice booms: \"Thy desire for conflict shall be fulfilled!\""); +#else + pline("声が響いた:「汝の闘争への望み,かなえられるべし!」"); +#endif for (i = rnd(4); i > 0; --i) { mm.x = u.ux; mm.y = u.uy; @@ -1386,16 +1780,25 @@ } } else if (u.ualign.record > 8) { /* fervent */ +/*JP pline("A voice whispers: \"Thou hast been worthy of me!\""); +*/ + pline("ささやき声が聞こえた:「汝,我が評価を得たり!」"); mm.x = u.ux; mm.y = u.uy; if (enexto(&mm, mm.x, mm.y, &mons[PM_ANGEL])) { if ((mtmp = mk_roamer(&mons[PM_ANGEL], u.ualign.type, mm.x, mm.y, TRUE)) != 0) { if (!Blind) +/*JP pline("An angel appears near you."); +*/ + pline("天使があなたのそばに現われた."); else +/*JP You_feel("the presence of a friendly angel near you."); +*/ + You("近くに友好的な天使の存在を感じた."); /* guardian angel -- the one case mtame doesn't * imply an edog structure, so we don't want to * call tamedog(). @@ -1498,7 +1901,10 @@ where = corpse->where; is_uwep = corpse == uwep; +/*JP cname = eos(strcpy(cname_buf, "bite-covered ")); +*/ + cname = eos(strcpy(cname_buf, "歯型のついた")); Strcpy(cname, corpse_xname(corpse, TRUE)); mcarry = (where == OBJ_MINVENT) ? corpse->ocarry : 0; @@ -1517,46 +1923,82 @@ switch (where) { case OBJ_INVENT: if (is_uwep) +/*JP pline_The("%s writhes out of your grasp!", cname); +*/ + pline_The("%sはもがいた!", cname); else +/*JP You_feel("squirming in your backpack!"); +*/ + pline("背負い袋で何かがもがいているような気がした!"); break; case OBJ_FLOOR: if (cansee(mtmp->mx, mtmp->my)) +#if 0 /*JP:T*/ pline("%s rises from the dead!", chewed ? Adjmonnam(mtmp, "bite-covered") : Monnam(mtmp)); +#else + pline("%sが蘇った!", chewed ? + Adjmonnam(mtmp, "歯型のついた") : Monnam(mtmp)); +#endif break; case OBJ_MINVENT: /* probably a nymph's */ if (cansee(mtmp->mx, mtmp->my)) { if (canseemon(mcarry)) +#if 0 /*JP*/ pline("Startled, %s drops %s as it revives!", mon_nam(mcarry), an(cname)); +#else + pline("%sが生きかえったのにびっくりして,%sは%sを落した!", + cname, mon_nam(mcarry), an(cname)); +#endif else +#if 0 /*JP*/ pline("%s suddenly appears!", chewed ? Adjmonnam(mtmp, "bite-covered") : Monnam(mtmp)); +#else + pline("%sが突然現われた!", chewed ? + Adjmonnam(mtmp, "歯型のついた") : Monnam(mtmp)); +#endif } break; case OBJ_CONTAINED: if (container_where == OBJ_MINVENT && cansee(mtmp->mx, mtmp->my) && mcarry && canseemon(mcarry) && container) { char sackname[BUFSZ]; +/*JP Sprintf(sackname, "%s %s", s_suffix(mon_nam(mcarry)), +*/ + Sprintf(sackname, "%sの%s", mon_nam(mcarry), xname(container)); +/*JP pline("%s writhes out of %s!", Amonnam(mtmp), sackname); +*/ + pline("%sは%sから逃れようともがいた!", Amonnam(mtmp), sackname); } else if (container_where == OBJ_INVENT && container) { char sackname[BUFSZ]; Strcpy(sackname, an(xname(container))); +#if 0 /*JP*/ pline("%s %s out of %s in your pack!", Blind ? Something : Amonnam(mtmp), locomotion(mtmp->data,"writhes"), sackname); +#else + pline("%sは袋の中で%sから逃れようともがいた!", + Blind ? Something : Amonnam(mtmp), + sackname); +#endif } else if (container_where == OBJ_FLOOR && container && cansee(mtmp->mx, mtmp->my)) { char sackname[BUFSZ]; Strcpy(sackname, an(xname(container))); +/*JP pline("%s escapes from %s!", Amonnam(mtmp), sackname); +*/ + pline("%sは%sから逃れた!", Amonnam(mtmp), sackname); } break; default: @@ -1581,7 +2023,10 @@ /* if we succeed, the corpse is gone, otherwise, rot it away */ if (!revive_corpse(body)) { if (is_rider(&mons[body->corpsenm])) +/*JP You_feel("less hassled."); +*/ + You("悩み事が減った気がした."); (void) start_timer(250L - (monstermoves-body->age), TIMER_OBJECT, ROT_CORPSE, arg); } @@ -1604,13 +2049,19 @@ if (Blinded < 4) Blinded = 0; else Blinded -= 4; if (!Blinded) { +/*JP pline("You've got the glop off."); +*/ + You("%sからネバネバがとれた.", body_part(FACE)); u.ucreamed = 0; Blinded = 1; make_blinded(0L,TRUE); return(0); } else if (!u.ucreamed) { +/*JP Your("%s feels clean now.", body_part(FACE)); +*/ + Your("%sはきれいになった.", body_part(FACE)); return(0); } return(1); /* still busy */ @@ -1622,14 +2073,20 @@ if(u.ucreamed) { static NEARDATA char buf[39]; +/*JP Sprintf(buf, "wiping off your %s", body_part(FACE)); +*/ + Sprintf(buf, "%sを拭いている", body_part(FACE)); set_occupation(wipeoff, buf, 0); /* Not totally correct; what if they change back after now * but before they're finished wiping? */ return(1); } +/*JP Your("%s is already clean.", body_part(FACE)); +*/ + Your("%sは汚れていない.", body_part(FACE)); return(1); } @@ -1670,10 +2127,16 @@ { /* KMH, intrinsics patch */ if((EWounded_legs & BOTH_SIDES) == BOTH_SIDES) { +/*JP Your("%s feel somewhat better.", +*/ + Your("両%sは回復した.", makeplural(body_part(LEG))); } else { +/*JP Your("%s feels somewhat better.", +*/ + Your("%sは回復した.", body_part(LEG)); } } diff -aurbN -xCVS -xXTAGS nethack/src/do_name.c jnethack/src/do_name.c --- nethack/src/do_name.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/do_name.c 2005-04-26 18:35:40.000000000 +0900 @@ -2,6 +2,14 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** changing point is marked `JP' (94/6/7) +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #ifdef OVLB @@ -21,19 +29,36 @@ boolean doing_what_is; winid tmpwin = create_nhwindow(NHW_MENU); +/*JP Sprintf(sbuf, "Use [%s] to move the cursor to %s.", +*/ + Sprintf(sbuf, "[%s]で%sへ移動できる.", iflags.num_pad ? "2468" : "hjkl", goal); putstr(tmpwin, 0, sbuf); +/*JP putstr(tmpwin, 0, "Use [HJKL] to move the cursor 8 units at a time."); +*/ + putstr(tmpwin, 0, "[HJKL]で一度に8歩移動できる."); +/*JP putstr(tmpwin, 0, "Or enter a background symbol (ex. <)."); +*/ + putstr(tmpwin, 0, "背景のシンボルを入力するとその位置に移動する(例:<)."); /* disgusting hack; the alternate selection characters work for any getpos call, but they only matter for dowhatis (and doquickwhatis) */ doing_what_is = (goal == what_is_an_unknown_object); +#if 0 /*JP*/ Sprintf(sbuf, "Type a .%s when you are at the right place.", doing_what_is ? " or , or ; or :" : ""); +#else + Sprintf(sbuf, "[.]%sで決定.", + doing_what_is ? "[,][;][:]" : ""); +#endif putstr(tmpwin, 0, sbuf); if (!force) +/*JP putstr(tmpwin, 0, "Type Space or Escape when you're done."); +*/ + putstr(tmpwin, 0, "スペースまたはエスケープで終了."); putstr(tmpwin, 0, ""); display_nhwindow(tmpwin, TRUE); destroy_nhwindow(tmpwin); @@ -55,7 +80,10 @@ if(iflags.num_pad) sdp = ndir; else sdp = sdir; /* DICE workaround */ if (flags.verbose) { +/*JP pline("(For instructions type a ?)"); +*/ + pline("(?でヘルプ)"); msg_given = TRUE; } cx = cc->x; @@ -155,19 +183,34 @@ } /* column */ } /* row */ } /* pass */ +/*JP pline("Can't find dungeon feature '%c'.", c); +*/ + pline("'%c'?", c); msg_given = TRUE; goto nxtc; } else { +#if 0 /*JP*/ pline("Unknown direction: '%s' (%s).", visctrl((char)c), !force ? "aborted" : iflags.num_pad ? "use 2468 or ." : "use hjkl or ."); +#else + pline("その方向はない:'%s' (%s)", + visctrl((char)c), + force ? + iflags.num_pad ? "[2468]で移動,[.]で終了" : + "[hjkl]で移動,[.]で終了" : + "中断した"); +#endif msg_given = TRUE; } /* k => matching */ } /* !quitchars */ if (force) goto nxtc; +/*JP pline("Done."); +*/ + pline("以上."); msg_given = FALSE; /* suppress clear */ cx = -1; cy = 0; @@ -211,6 +254,11 @@ if (lth) Strcpy(NAME(mtmp), name); return mtmp; } +#if 1 /*JP*/ + if(is_kanji2(name,lth-1)) + --lth; +#endif + mtmp2 = newmonst(mtmp->mxlth + lth); *mtmp2 = *mtmp; (void) memcpy((genericptr_t)mtmp2->mextra, @@ -231,12 +279,18 @@ char qbuf[QBUFSZ]; if (Hallucination) { +/*JP You("would never recognize it anyway."); +*/ + You("それを認識できない."); return 0; } cc.x = u.ux; cc.y = u.uy; +/*JP if (getpos(&cc, FALSE, "the monster you want to name") < 0 || +*/ + if (getpos(&cc, FALSE, "あなたが名づけたい怪物") < 0 || (cx = cc.x) < 0) return 0; cy = cc.y; @@ -247,11 +301,19 @@ mtmp = u.usteed; else { #endif +#if 0 /*JP*/ pline("This %s creature is called %s and cannot be renamed.", ACURR(A_CHA) > 14 ? (flags.female ? "beautiful" : "handsome") : "ugly", plname); +#else + pline("この%s生き物は%sと呼ばれていて,名前は変更できない.", + ACURR(A_CHA) > 14 ? + (flags.female ? "美人の" : "かっこいい") : + "醜い", + plname); +#endif return(0); #ifdef STEED } @@ -264,19 +326,28 @@ || mtmp->m_ap_type == M_AP_FURNITURE || mtmp->m_ap_type == M_AP_OBJECT || (mtmp->minvis && !See_invisible)))) { +/*JP pline("I see no monster there."); +*/ + pline("そこに怪物はいない."); return(0); } /* special case similar to the one in lookat() */ (void) distant_monnam(mtmp, ARTICLE_THE, buf); +/*JP Sprintf(qbuf, "What do you want to call %s?", buf); +*/ + Sprintf(qbuf, "%sを何と呼びますか?", buf); getlin(qbuf,buf); if(!*buf || *buf == '\033') return(0); /* strip leading and trailing spaces; unnames monster if all spaces */ (void)mungspaces(buf); if (mtmp->data->geno & G_UNIQ) +/*JP pline("%s doesn't like being called names!", Monnam(mtmp)); +*/ + pline("%sはあだ名で呼ばれるのが嫌いなようだ!", Monnam(mtmp)); else (void) christen_monst(mtmp, buf); return(0); @@ -296,8 +367,12 @@ const char *aname; short objtyp; +#if 0 /*JP*/ Sprintf(qbuf, "What do you want to name %s %s?", is_plural(obj) ? "these" : "this", xname(obj)); +#else + Sprintf(qbuf, "%sを何と名づけますか?", xname(obj)); +#endif getlin(qbuf, buf); if(!*buf || *buf == '\033') return; /* strip leading and trailing spaces; unnames item if all spaces */ @@ -308,7 +383,10 @@ Strcpy(buf, aname); if (obj->oartifact) { +/*JP pline_The("artifact seems to resist the attempt."); +*/ + pline("聖器は名づけを拒否しているようだ."); return; } else if (restrict_name(obj, buf) || exist_artifact(obj->otyp, buf)) { int n = rn2((int)strlen(buf)); @@ -317,9 +395,15 @@ c1 = lowc(buf[n]); do c2 = 'a' + rn2('z'-'a'); while (c1 == c2); buf[n] = (buf[n] == c1) ? c2 : highc(c2); /* keep same case */ +/*JP pline("While engraving your %s slips.", body_part(HAND)); +*/ + pline("刻んでいる間に%sが滑ってしまった.", body_part(HAND)); display_nhwindow(WIN_MESSAGE, FALSE); +/*JP You("engrave: \"%s\".",buf); +*/ + You("刻んだ: 「%s」.",buf); } obj = oname(obj, buf); } @@ -407,6 +491,10 @@ lth = *name ? (int)(strlen(name) + 1) : 0; if (lth > PL_PSIZ) { +#if 1 /*JP*/ + if(is_kanji2(buf,lth-1)) + --lth; +#endif lth = PL_PSIZ; name = strncpy(buf, name, PL_PSIZ - 1); buf[PL_PSIZ - 1] = '\0'; @@ -453,7 +541,10 @@ #ifdef REDO ch = #endif +/*JP ynq("Name an individual object?")) { +*/ + ynq("持ち物に個別の名前をつけますか?")) { case 'q': break; case 'y': @@ -476,7 +567,10 @@ (void) xname(obj); if (!obj->dknown) { +/*JP You("would never recognize another one."); +*/ + You("他に認識できない."); return 0; } docall(obj); @@ -501,10 +595,18 @@ otemp.oxlth = 0; if (objects[otemp.otyp].oc_class == POTION_CLASS && otemp.fromsink) /* kludge, meaning it's sink water */ +#if 0 /*JP*/ Sprintf(qbuf,"Call a stream of %s fluid:", OBJ_DESCR(objects[otemp.otyp])); +#else + Sprintf(qbuf,"%s液体:", + jtrns_obj('!', OBJ_DESCR(objects[otemp.otyp]))); +#endif else +/*JP Sprintf(qbuf, "Call %s:", an(xname(&otemp))); +*/ + Sprintf(qbuf, "%sに何と名前をつける?", an(xname(&otemp))); getlin(qbuf, buf); if(!*buf || *buf == '\033') return; @@ -591,8 +693,10 @@ #endif struct permonst *mdat = mtmp->data; boolean do_hallu, do_invis, do_it, do_saddle; +#if 0 /*JP*/ boolean name_at_start, has_adjectives; char *bp; +#endif if (program_state.gameover) suppress |= SUPPRESS_HALLUCINATION; @@ -615,7 +719,10 @@ /* unseen monsters, etc. Use "it" */ if (do_it) { +/*JP Strcpy(buf, "it"); +*/ + Strcpy(buf, "何者か"); return buf; } @@ -632,8 +739,10 @@ name = priestname(mtmp, priestnambuf); EHalluc_resistance = save_prop; mtmp->minvis = save_invis; +#if 0 /*JP*/ if (article == ARTICLE_NONE && !strncmp(name, "the ", 4)) name += 4; +#endif return strcpy(buf, name); } @@ -643,6 +752,7 @@ * none of this applies. */ if (mtmp->isshk && !do_hallu) { +#if 0 /*JP*/ if (adjective && article == ARTICLE_THE) { /* pathological case: "the angry Asidonhopo the blue dragon" sounds silly */ @@ -659,37 +769,67 @@ Strcat(buf, "invisible "); Strcat(buf, mdat->mname); return buf; +#else + if (mdat == &mons[PM_SHOPKEEPER] && !do_invis){ + Strcpy(buf, shkname(mtmp)); + } else { + Sprintf(buf, "%sという名の%s%s", + shkname(mtmp), do_invis ? "姿の見えない" : "", + jtrns_mon(mdat->mname)); + } + return buf; +#endif } /* Put the adjectives in the buffer */ if (adjective) Strcat(strcat(buf, adjective), " "); if (do_invis) +/*JP Strcat(buf, "invisible "); +*/ + Strcat(buf, "姿の見えない"); #ifdef STEED if (do_saddle && (mtmp->misc_worn_check & W_SADDLE) && !Blind && !Hallucination) +/*JP Strcat(buf, "saddled "); +*/ + Strcat(buf, "鞍のついている"); #endif +#if 0 /*JP*/ if (buf[0] != 0) has_adjectives = TRUE; else has_adjectives = FALSE; +#endif /* Put the actual monster name or type into the buffer now */ /* Be sure to remember whether the buffer starts with a name */ if (do_hallu) { Strcat(buf, rndmonnam()); +#if 0 /*JP*/ name_at_start = FALSE; +#endif } else if (mtmp->mnamelth) { char *name = NAME(mtmp); if (mdat == &mons[PM_GHOST]) { +#if 0 /*JP*/ Sprintf(eos(buf), "%s ghost", s_suffix(name)); name_at_start = TRUE; +#else + Sprintf(buf, "%sの幽霊", name); +#endif } else if (called) { +#if 0 /*JP*/ Sprintf(eos(buf), "%s called %s", mdat->mname, name); name_at_start = (boolean)type_is_pname(mdat); +#else + Sprintf(eos(buf), "%sという名の%s", name, + jtrns_mon_gen(mdat->mname, mtmp->female)); +#endif +#if 0 /*JP*/ } else if (is_mplayer(mdat) && (bp = strstri(name, " the ")) != 0) { /* the */ char pbuf[BUFSZ]; @@ -702,22 +842,37 @@ Strcpy(buf, pbuf); article = ARTICLE_NONE; name_at_start = TRUE; +#endif } else { Strcat(buf, name); +#if 0 /*JP*/ name_at_start = TRUE; +#endif } } else if (is_mplayer(mdat) && !In_endgame(&u.uz)) { char pbuf[BUFSZ]; Strcpy(pbuf, rank_of((int)mtmp->m_lev, monsndx(mdat), (boolean)mtmp->female)); +/*JP Strcat(buf, lcase(pbuf)); +*/ + Strcat(buf, pbuf); +#if 0 /*JP*/ name_at_start = FALSE; +#endif } else { +#if 0 /*JP*/ Strcat(buf, mdat->mname); name_at_start = (boolean)type_is_pname(mdat); +#else + Strcat(buf, jtrns_mon_gen(mdat->mname, mtmp->female)); +#endif } +#if 1 /*JP*//* 日本語に冠詞はない */ + return buf; +#else if (name_at_start && (article == ARTICLE_YOUR || !has_adjectives)) { if (mdat == &mons[PM_WIZARD_OF_YENDOR]) article = ARTICLE_THE; @@ -748,6 +903,7 @@ return buf; } } +#endif } #endif /* OVL0 */ @@ -877,8 +1033,12 @@ its own obfuscation) */ if (mon->data == &mons[PM_HIGH_PRIEST] && !Hallucination && Is_astralevel(&u.uz) && distu(mon->mx, mon->my) > 2) { +#if 0 /*JP*/ Strcpy(outbuf, article == ARTICLE_THE ? "the " : ""); Strcat(outbuf, mon->female ? "high priestess" : "high priest"); +#else + Strcpy(outbuf, "法王"); +#endif } else { Strcpy(outbuf, x_monnam(mon, article, (char *)0, 0, TRUE)); } @@ -955,8 +1115,13 @@ } while (name < SPECIAL_PM && (type_is_pname(&mons[name]) || (mons[name].geno & G_NOGEN))); +#if 0 /*JP*/ if (name >= SPECIAL_PM) return bogusmons[name - SPECIAL_PM]; return mons[name].mname; +#else + if (name >= SPECIAL_PM) return jtrns_mon(bogusmons[name - SPECIAL_PM]); + return jtrns_mon_gen(mons[name].mname, rn2(2)); +#endif } #ifdef REINCARNATION @@ -983,6 +1148,7 @@ #ifdef OVL2 static NEARDATA const char * const hcolors[] = { +#if 0 /*JP*/ "ultraviolet", "infrared", "bluish-orange", "reddish-green", "dark white", "light black", "sky blue-pink", "salty", "sweet", "sour", "bitter", @@ -992,6 +1158,17 @@ "cabernet", "sangria", "fuchsia", "wisteria", "lemon-lime", "strawberry-banana", "peppermint", "romantic", "incandescent" +#else + "紫外色の", "赤外色の", "青色がかったオレンジ色の", + "赤みがかった緑色の", "暗い白色の", "明るい黒の", "水色がかったピンク色の", + "塩辛い", "甘い", "すっぱい", "苦い", + "しま模様の", "らせん状の", "波状の", "格子模様状の", "チェック状の", "放射状の", + "ペーズリー模様の", "しみ状の", "青色の斑点状の", "点状の", + "四角形状の", "丸状の", "三角状の", + "日本酒色の", "ぶどう酒色の", "桜色の", "藤色の", + "レモンライム色の", "苺バナナ色の", "ペパーミント色の", + "ロマンチックな色の", "まぶしい" +#endif }; const char * @@ -1007,13 +1184,19 @@ rndcolor() { int k = rn2(CLR_MAX); +#if 0 /*JP:T*/ return Hallucination ? hcolor((char *)0) : (k == NO_COLOR) ? "colorless" : c_obj_colors[k]; +#else + return Hallucination ? hcolor((char *)0) : (k == NO_COLOR) ? + "無色の" : c_obj_colors[k]; +#endif } /* Aliases for road-runner nemesis */ static const char * const coynames[] = { +#if 0 /*JP*/ "Carnivorous Vulgaris","Road-Runnerus Digestus", "Eatibus Anythingus" ,"Famishus-Famishus", "Eatibus Almost Anythingus","Eatius Birdius", @@ -1025,6 +1208,33 @@ "Hungrii Flea-Bagius","Overconfidentii Vulgaris", "Caninus Nervous Rex","Grotesques Appetitus", "Nemesis Riduclii","Canis latrans" +#else + /* http://www.daneel.org/r_gakume.htm 参考 */ + "肉食犬科卑劣属","路走鳥食科消化属", + "食欲強科何物食属","飢餓科飢餓属", + "食欲強科凡何物食属","食欲科鳥食属", + "餓死科凄絶属","永久科餓鬼属", + "飢餓科野卑属","餓死科卑劣利口属", + "食欲科垂涎属","石頭科恋母王属", + "肉食狼科垂涎属","石頭科貪欲属", + "常準備科食欲強属","欲望科巨大属", + "腹減科蚤沢山属","過信科卑劣属", + "神経質犬科大王属","奇怪科嗜好属", + "復讐科揶揄属","犬科犬属" + /* + "何としてもつかまえ食べたいーの","オッタマゲーションおっかけ科", + "いざとなったら何でも食べちゃう狼科" ,"お腹と背中がくっつく寸前狼科", + "食いたがり狼科","鳥食いたがり狼科", + "ハングリー狼科","永久性腹ぺこ科", + "腹ペコで食べたいーの","あの手この手狼科", + "腹へりひれはれ科","Hardheadipus Oedipus", + "アイディア狼科","Hard-Headipus Ravenus", + "なんとしてもつかまえ食べたいーの","腹ペコ狼科", + "なんとしてもつかまえ食べたいーの","なんとしてもつかまえ食べたいーの", + "なんとしてもつかまえ食べたいーの","腹へりポンポコリン狼科", + "24時間戦える腹ぺこ狼科","普通のコヨーテ" + */ +#endif }; char * diff -aurbN -xCVS -xXTAGS nethack/src/do_wear.c jnethack/src/do_wear.c --- nethack/src/do_wear.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/do_wear.c 2005-05-01 07:22:31.000000000 +0900 @@ -2,6 +2,14 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** changing point is marked `JP' (94/6/7) +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #ifndef OVLB @@ -16,8 +24,11 @@ static NEARDATA int todelay; static boolean cancelled_don = FALSE; +#if 0 /*JP*/ static NEARDATA const char see_yourself[] = "see yourself"; +#endif static NEARDATA const char unknown_type[] = "Unknown type of %s (%d)"; +#if 0 /*JP*/ static NEARDATA const char c_armor[] = "armor", c_suit[] = "suit", #ifdef TOURIST @@ -32,6 +43,22 @@ c_sword[] = "sword", c_axe[] = "axe", c_that_[] = "that"; +#else /*JP*/ +static NEARDATA const char c_armor[] = "鎧", + c_suit[] = "服", +#ifdef TOURIST + c_shirt[] = "シャツ", +#endif + c_cloak[] = "クローク", + c_gloves[] = "小手", + c_boots[] = "靴", + c_helmet[] = "兜", + c_shield[] = "盾", + c_weapon[] = "武器", + c_sword[] = "剣", + c_axe[] = "斧", + c_that_[] = "それ"; +#endif /*JP*/ static NEARDATA const long takeoff_order[] = { WORN_BLINDF, W_WEP, WORN_SHIELD, WORN_GLOVES, LEFT_RING, RIGHT_RING, WORN_CLOAK, @@ -57,15 +84,27 @@ STATIC_DCL struct obj *NDECL(do_takeoff); STATIC_PTR int NDECL(take_off); STATIC_DCL int FDECL(menu_remarm, (int)); +#if 0 /*JP*/ STATIC_DCL void FDECL(already_wearing, (const char*)); +#else +STATIC_DCL void FDECL(already_wearing, (const char*, struct obj *)); +#endif STATIC_DCL void FDECL(already_wearing2, (const char*, const char*)); void off_msg(otmp) register struct obj *otmp; { +#if 0 /*JP*/ if(flags.verbose) You("were wearing %s.", doname(otmp)); +#else + const char *j; + const char *m; + m = joffmsg(otmp, &j); + if(flags.verbose) + You("%s%s%s.", doname(otmp), j, jpast(m)); +#endif } /* for items that involve no delay */ @@ -73,6 +112,7 @@ on_msg(otmp) register struct obj *otmp; { +#if 0 /*JP*/ if (flags.verbose) { char how[BUFSZ]; @@ -83,6 +123,14 @@ obj_is_pname(otmp) ? the(xname(otmp)) : an(xname(otmp)), how); } +#else + const char *j; + const char *m; + m = jonmsg(otmp, &j); + + if(flags.verbose) + You("%s%s%s.", xname(otmp), j, jpast(m)); +#endif } /* @@ -112,14 +160,22 @@ /* though not better than potion speed */ if (!oldprop && !(HFast & TIMEOUT)) { makeknown(uarmf->otyp); +#if 0 /*JP*/ You_feel("yourself speed up%s.", (oldprop || HFast) ? " a bit more" : ""); +#else + You("%s素早くなったような気がした.", + (oldprop || HFast) ? "さらに" : ""); +#endif } break; case ELVEN_BOOTS: if (!oldprop && !HStealth && !BStealth) { makeknown(uarmf->otyp); +/*JP You("walk very quietly."); +*/ + Your("足音は小さくなった."); } break; case FUMBLE_BOOTS: @@ -153,8 +209,13 @@ case SPEED_BOOTS: if (!Very_fast && !cancelled_don) { makeknown(otyp); +#if 0 /*JP*/ You_feel("yourself slow down%s.", Fast ? " a bit" : ""); +#else + You("%sのろくなったような気がした.", + oldprop ? "ちょっと" : ""); +#endif } break; case WATER_WALKING_BOOTS: @@ -168,7 +229,10 @@ case ELVEN_BOOTS: if (!oldprop && !HStealth && !BStealth && !cancelled_don) { makeknown(otyp); +/*JP You("sure are noisy."); +*/ + Your("足音は大きくなった."); } break; case FUMBLE_BOOTS: @@ -215,9 +279,15 @@ /* Note: it's already being worn, so we have to cheat here. */ if ((HInvis || EInvis || pm_invisible(youmonst.data)) && !Blind) { newsym(u.ux,u.uy); +#if 0 /*JP*/ You("can %s!", See_invisible ? "no longer see through yourself" : see_yourself); +#else + pline("%s!", + See_invisible ? "あなたは透明でなくなった" : + "自分自身が見えるようになった"); +#endif } break; case CLOAK_OF_INVISIBILITY: @@ -226,12 +296,20 @@ if (!oldprop && !HInvis && !Blind) { makeknown(uarmc->otyp); newsym(u.ux,u.uy); +#if 0 /*JP*/ pline("Suddenly you can%s yourself.", See_invisible ? " see through" : "not see"); +#else + pline("突然,%s.", + See_invisible ? "あなたは透明になった" : "自分自身が見えなくなった"); +#endif } break; case OILSKIN_CLOAK: +/*JP pline("%s very tightly.", Tobjnam(uarmc, "fit")); +*/ + pline("%sはとてもぴっちり合う.",xname(uarmc)); break; /* Alchemy smock gives poison _and_ acid resistance */ case ALCHEMY_SMOCK: @@ -265,18 +343,29 @@ case MUMMY_WRAPPING: if (Invis && !Blind) { newsym(u.ux,u.uy); +#if 0 /*JP*/ You("can %s.", See_invisible ? "see through yourself" : "no longer see yourself"); +#else + pline("%s.", + See_invisible ? "あなたは透明になった" : "自分自身が見えなくなった"); +#endif } break; case CLOAK_OF_INVISIBILITY: if (!oldprop && !HInvis && !Blind) { makeknown(CLOAK_OF_INVISIBILITY); newsym(u.ux,u.uy); +#if 0 /*JP*/ pline("Suddenly you can %s.", See_invisible ? "no longer see through yourself" : see_yourself); +#else + pline("突然,%s.", + See_invisible ? "あなたは透明でなくなった" : + "自分自身が見えるようになった"); +#endif } break; /* Alchemy smock gives poison _and_ acid resistance */ @@ -323,21 +412,42 @@ case DUNCE_CAP: if (!uarmh->cursed) { if (Blind) +/*JP pline("%s for a moment.", Tobjnam(uarmh, "vibrate")); +*/ + pline("%sは一瞬震えた.", xname(uarmh)); else +#if 0 /*JP*/ pline("%s %s for a moment.", Tobjnam(uarmh, "glow"), hcolor(NH_BLACK)); +#else + pline("%sは一瞬%s輝いた.", + xname(uarmh), jconj_adj(hcolor(NH_BLACK))); +#endif curse(uarmh); } flags.botl = 1; /* reveal new alignment or INT & WIS */ if (Hallucination) { +#if 0 /*JP*/ pline("My brain hurts!"); /* Monty Python's Flying Circus */ +#else + pline("のーみそバーン!"); /*モンティパイソンとはちょっと違うけど*/ +#endif } else if (uarmh->otyp == DUNCE_CAP) { +#if 0 /*JP*/ You_feel("%s.", /* track INT change; ignore WIS */ ACURR(A_INT) <= (ABASE(A_INT) + ABON(A_INT) + ATEMP(A_INT)) ? "like sitting in a corner" : "giddy"); +#else + You("%sような気がした.", + ACURR(A_INT) <= (ABASE(A_INT) + ABON(A_INT) + ATEMP(A_INT)) ? + "街角に座っている" : "目がまわった"); +#endif } else { +/*JP Your("mind oscillates briefly."); +*/ + You("少しも迷わず寝返った."); makeknown(HELM_OF_OPPOSITE_ALIGNMENT); } break; @@ -447,9 +557,17 @@ touch_petrifies(&mons[uwep->corpsenm])) { char kbuf[BUFSZ]; +#if 0 /*JP*/ You("wield the %s in your bare %s.", corpse_xname(uwep, TRUE), makeplural(body_part(HAND))); +#else + You("%sを素%sで持った.", + corpse_xname(uwep, TRUE), body_part(HAND)); +#endif +/*JP Strcpy(kbuf, an(corpse_xname(uwep, TRUE))); +*/ + Sprintf(kbuf, "%sに触れて", corpse_xname(uwep, TRUE)); instapetrify(kbuf); uwepgone(); /* life-saved still doesn't allow touching cockatrice */ } @@ -459,10 +577,17 @@ touch_petrifies(&mons[uswapwep->corpsenm])) { char kbuf[BUFSZ]; +#if 0 /*JP*/ You("wield the %s in your bare %s.", +#else + You("%sを素%sで持った.", +#endif corpse_xname(uswapwep, TRUE), body_part(HAND)); +/*JP Strcpy(kbuf, an(corpse_xname(uswapwep, TRUE))); +*/ + Sprintf(kbuf, "%sに触れて", corpse_xname(uswapwep, TRUE)); instapetrify(kbuf); uswapwepgone(); /* lifesaved still doesn't allow touching cockatrice */ } @@ -600,14 +725,25 @@ /* Don't use same message as polymorph */ if (orig_sex != poly_gender()) { makeknown(AMULET_OF_CHANGE); +#if 0 /*JP*/ You("are suddenly very %s!", flags.female ? "feminine" : "masculine"); +#else + You("突然%s!", flags.female ? "女っぽくなった" + : "男っぽくなった"); +#endif flags.botl = 1; } else /* already polymorphed into single-gender monster; only changed the character's base sex */ +/*JP You("don't feel like yourself."); +*/ + You("自分自身じゃなくなった気がした."); +/*JP pline_The("amulet disintegrates!"); +*/ + pline("魔除けはこなごなになった!"); if (orig_sex == poly_gender() && uamul->dknown && !objects[AMULET_OF_CHANGE].oc_name_known && !objects[AMULET_OF_CHANGE].oc_uname) @@ -617,7 +753,10 @@ } case AMULET_OF_STRANGULATION: makeknown(AMULET_OF_STRANGULATION); +/*JP pline("It constricts your throat!"); +*/ + pline("魔除けはあなたの喉を絞めつけた!"); Strangled = 6; break; case AMULET_OF_RESTFUL_SLEEP: @@ -653,7 +792,10 @@ setworn((struct obj *)0, W_AMUL); if (!breathless(youmonst.data) && !amphibious(youmonst.data) && !Swimming) { +/*JP You("suddenly inhale an unhealthy amount of water!"); +*/ + You("突然,大量の水を飲み込んだ!"); (void) drown(); } return; @@ -661,7 +803,10 @@ break; case AMULET_OF_STRANGULATION: if (Strangled) { +/*JP You("can breathe more easily!"); +*/ + You("楽に呼吸できるようになった!"); Strangled = 0; } break; @@ -726,7 +871,10 @@ if (Invis && !oldprop && !HSee_invisible && !perceives(youmonst.data) && !Blind) { newsym(u.ux,u.uy); +/*JP pline("Suddenly you are transparent, but there!"); +*/ + pline("突然透明になった.しかし存在はしている!"); makeknown(RIN_SEE_INVISIBLE); } break; @@ -833,15 +981,24 @@ if (Invisible && !Blind) { newsym(u.ux,u.uy); +/*JP pline("Suddenly you cannot see yourself."); +*/ + pline("突然,自分自身が見えなくなった."); makeknown(RIN_SEE_INVISIBLE); } break; case RIN_INVISIBILITY: if (!Invis && !BInvis && !Blind) { newsym(u.ux,u.uy); +#if 0 /*JP*/ Your("body seems to unfade%s.", See_invisible ? " completely" : ".."); +#else + Your("体が%s現われ%s.", + See_invisible ? "完全に" : "次第に", + See_invisible ? "た" : "てきた"); +#endif makeknown(RIN_INVISIBILITY); } break; @@ -921,13 +1078,19 @@ if (Blind && !already_blind) { changed = TRUE; +/*JP if (flags.verbose) You_cant("see any more."); +*/ + if (flags.verbose) You("何も見えなくなった."); /* set ball&chain variables before the hero goes blind */ if (Punished) set_bc(0); } else if (already_blind && !Blind) { changed = TRUE; /* "You are now wearing the Eyes of the Overworld." */ +/*JP You("can see!"); +*/ + You("目が見えるようになった!"); } if (changed) { /* blindness has just been toggled */ @@ -952,17 +1115,26 @@ /* "still cannot see" makes no sense when removing lenses since they can't have been the cause of your blindness */ if (otmp->otyp != LENSES) +/*JP You("still cannot see."); +*/ + You("まだ目が見えない."); } else { changed = TRUE; /* !was_blind */ /* "You were wearing the Eyes of the Overworld." */ +/*JP You_cant("see anything now!"); +*/ + You("今は何も見ることができない!"); /* set ball&chain variables before the hero goes blind */ if (Punished) set_bc(0); } } else if (was_blind) { changed = TRUE; /* !Blind */ +/*JP You("can see again."); +*/ + You("ふたたび目が見えるようになった."); } if (changed) { /* blindness has just been toggled */ @@ -1048,6 +1220,8 @@ { register struct obj *otmp = (struct obj *)0; int armorpieces = 0; + const char *j; + const char *m; #define MOREARM(x) if (x) { armorpieces++; otmp = x; } MOREARM(uarmh); @@ -1069,20 +1243,35 @@ if (!armorpieces) { /* assert( GRAY_DRAGON_SCALES > YELLOW_DRAGON_SCALE_MAIL ); */ if (uskin) +#if 0 /*JP*/ pline_The("%s merged with your skin!", uskin->otyp >= GRAY_DRAGON_SCALES ? "dragon scales are" : "dragon scale mail is"); +#else + pline("ドラゴンの鱗%sはあなたの肌と融合してしまっている!", + uskin->otyp >= GRAY_DRAGON_SCALES ? + "" : "鎧"); +#endif else +#if 0 /*JP*/ pline("Not wearing any armor.%s", (iflags.cmdassist && (uleft || uright || uamul || ublindf)) ? " Use 'R' command to remove accessories." : ""); +#else + pline("鎧の類を装備していない.%s", (iflags.cmdassist && + (uleft || uright || uamul || ublindf)) ? + "'R'コマンドで装飾品を外すことができる." : ""); +#endif return 0; } if (armorpieces > 1) otmp = getobj(clothes, "take off"); if (otmp == 0) return(0); if (!(otmp->owornmask & W_ARMOR)) { +/*JP You("are not wearing that."); +*/ + You("それは装備していない."); return(0); } /* note: the `uskin' case shouldn't be able to happen here; dragons @@ -1092,7 +1281,12 @@ || ((otmp == uarmu) && (uarmc || uarm)) #endif ) { +#if 0 /*JP*/ You_cant("take that off."); +#else + m = joffmsg(otmp, &j); + You("それ%s%sことはできない.", j, m); +#endif return 0; } @@ -1119,19 +1313,30 @@ MOREACC(ublindf); if(!Accessories) { +#if 0 /*JP*/ pline("Not wearing any accessories.%s", (iflags.cmdassist && +#else + pline("装飾品は身につけていない.%s", (iflags.cmdassist && +#endif (uarm || uarmc || #ifdef TOURIST uarmu || #endif uarms || uarmh || uarmg || uarmf)) ? +#if 0 /*JP*/ " Use 'T' command to take off armor." : ""); +#else + "'T'コマンドで鎧を外すことができる." : ""); +#endif return(0); } if (Accessories != 1) otmp = getobj(accessories, "remove"); if(!otmp) return(0); if(!(otmp->owornmask & (W_RING | W_AMUL | W_TOOL))) { +/*JP You("are not wearing that."); +*/ + You("それは身につけていない."); return(0); } @@ -1167,9 +1372,13 @@ { /* Curses, like chickens, come home to roost. */ if((otmp == uwep) ? welded(otmp) : (int)otmp->cursed) { +#if 0 /*JP*/ You("can't. %s cursed.", (is_boots(otmp) || is_gloves(otmp) || otmp->quan > 1L) ? "They are" : "It is"); +#else + pline("無理だ.それは呪われている."); +#endif otmp->bknown = TRUE; return(1); } @@ -1186,19 +1395,31 @@ if(delay) { nomul(delay); if (is_helmet(otmp)) { +/*JP nomovemsg = "You finish taking off your helmet."; +*/ + nomovemsg = "あなたは兜を脱ぎおえた."; afternmv = Helmet_off; } else if (is_gloves(otmp)) { +/*JP nomovemsg = "You finish taking off your gloves."; +*/ + nomovemsg = "あなたは小手を脱ぎおえた."; afternmv = Gloves_off; } else if (is_boots(otmp)) { +/*JP nomovemsg = "You finish taking off your boots."; +*/ + nomovemsg = "あなたは靴を脱ぎおえた."; afternmv = Boots_off; } else { +/*JP nomovemsg = "You finish taking off your suit."; +*/ + nomovemsg = "あなたは着ている物を脱ぎおえた."; afternmv = Armor_off; } } else { @@ -1228,18 +1449,38 @@ return(1); } +/*JP +** 物によって動詞が変化するので otmpを追加 +*/ STATIC_OVL void +#if 0 /*JP*/ already_wearing(cc) const char *cc; +#else +already_wearing(cc, otmp) +const char *cc; +struct obj *otmp; +#endif { +#if 1 /*JP*/ + const char *j; + const char *m; + m = jconj(jonmsg(otmp, &j), "ている"); +#endif +/*JP You("are already wearing %s%c", cc, (cc == c_that_) ? '!' : '.'); +*/ + You("もう%s%s%s%s", cc, j, m, (cc == c_that_) ? "!" : "."); } STATIC_OVL void already_wearing2(cc1, cc2) const char *cc1, *cc2; { +/*JP You_cant("wear %s because you're wearing %s there already.", cc1, cc2); +*/ + You_cant("%sを身に付けているので%sを身につけられない.", cc2, cc1); } /* @@ -1257,6 +1498,10 @@ { int err = 0; const char *which; +#if 1 /*JP*/ + const char *m; + const char *j; +#endif which = is_cloak(otmp) ? c_cloak : #ifdef TOURIST @@ -1267,10 +1512,16 @@ /* same exception for cloaks as used in m_dowear() */ (which != c_cloak || youmonst.data->msize != MZ_SMALL) && (racial_exception(&youmonst, otmp) < 1)) { +/*JP if (noisy) pline_The("%s will not fit on your body.", which); +*/ + if (noisy) pline("%sはあなたの体に合わない.", which); return 0; } else if (otmp->owornmask & W_ARMOR) { +/*JP if (noisy) already_wearing(c_that_); +*/ + if (noisy) already_wearing(c_that_, otmp); return 0; } @@ -1281,59 +1532,104 @@ #endif )) { if (noisy) +/*JP You("cannot do that while holding your %s.", +*/ + pline("%sを持ったままではそれは出来ない.", is_sword(uwep) ? c_sword : c_weapon); return 0; } if (is_helmet(otmp)) { if (uarmh) { +/*JP if (noisy) already_wearing(an(c_helmet)); +*/ + if (noisy) already_wearing(an(c_helmet), uarmh); err++; } else if (Upolyd && has_horns(youmonst.data) && !is_flimsy(otmp)) { /* (flimsy exception matches polyself handling) */ if (noisy) +#if 0 /*JP:T*/ pline_The("%s won't fit over your horn%s.", c_helmet, plur(num_horns(youmonst.data))); +#else + pline("角がじゃまで%sを身につけられない.", c_helmet); +#endif err++; } else *mask = W_ARMH; } else if (is_shield(otmp)) { if (uarms) { +/*JP if (noisy) already_wearing(an(c_shield)); +*/ + if (noisy) already_wearing(an(c_shield), uarms); err++; } else if (uwep && bimanual(uwep)) { if (noisy) +#if 0 /*JP*/ You("cannot wear a shield while wielding a two-handed %s.", is_sword(uwep) ? c_sword : (uwep->otyp == BATTLE_AXE) ? c_axe : c_weapon); +#else + { + m = jconj(jonmsg(otmp, &j), "ている"); + You("両手持ちの%s%s%sので盾で身を守れない.", + is_sword(uwep) ? c_sword : + uwep->otyp == BATTLE_AXE ? c_axe : c_weapon, + j, m); + } +#endif err++; } else if (u.twoweap) { if (noisy) +/*JP You("cannot wear a shield while wielding two weapons."); +*/ + You("両手持ちをしている間は盾で身を守れない."); err++; } else *mask = W_ARMS; } else if (is_boots(otmp)) { if (uarmf) { +/*JP if (noisy) already_wearing(c_boots); +*/ + if (noisy) already_wearing(c_boots, uarmf); err++; } else if (Upolyd && slithy(youmonst.data)) { +#if 0 /*JP*/ if (noisy) You("have no feet..."); /* not body_part(FOOT) */ +#else + if (noisy) You("足がない..."); /* not body_part(FOOT) */ +#endif err++; } else if (Upolyd && youmonst.data->mlet == S_CENTAUR) { /* break_armor() pushes boots off for centaurs, so don't let dowear() put them back on... */ +#if 0 /*JP*/ if (noisy) pline("You have too many hooves to wear %s.", c_boots); /* makeplural(body_part(FOOT)) yields "rear hooves" which sounds odd */ +#else + if (noisy) pline("%sを履くには足が多すぎる.", + c_boots); /* makeplural(body_part(FOOT)) yields + "rear hooves" which sounds odd */ +#endif err++; } else if (u.utrap && (u.utraptype == TT_BEARTRAP || u.utraptype == TT_INFLOOR)) { if (u.utraptype == TT_BEARTRAP) { +/*JP if (noisy) Your("%s is trapped!", body_part(FOOT)); +*/ + if (noisy) Your("%sは罠にかかっている!", body_part(FOOT)); } else { +/*JP if (noisy) Your("%s are stuck in the %s!", +*/ + if (noisy) Your("%sは%sにはまっている!", makeplural(body_part(FOOT)), surface(u.ux, u.uy)); } @@ -1342,10 +1638,17 @@ *mask = W_ARMF; } else if (is_gloves(otmp)) { if (uarmg) { +#if 0 /*JP*/ if (noisy) already_wearing(c_gloves); +#else + if (noisy) already_wearing(c_gloves, uarmg); +#endif err++; } else if (welded(uwep)) { +/*JP if (noisy) You("cannot wear gloves over your %s.", +*/ + if (noisy) You("%sの上から小手を装備できない.", is_sword(uwep) ? c_sword : c_weapon); err++; } else @@ -1354,9 +1657,16 @@ } else if (is_shirt(otmp)) { if (uarm || uarmc || uarmu) { if (uarmu) { +#if 0 /*JP*/ if (noisy) already_wearing(an(c_shirt)); +#else + if (noisy) already_wearing(an(c_shirt), uarmc); +#endif } else { +/*JP if (noisy) You_cant("wear that over your %s.", +*/ + if (noisy) You("%sの上から着ることはできない.", (uarm && !uarmc) ? c_armor : cloak_simple_name(uarmc)); } err++; @@ -1365,16 +1675,25 @@ #endif } else if (is_cloak(otmp)) { if (uarmc) { +/*JP if (noisy) already_wearing(an(cloak_simple_name(uarmc))); +*/ + if (noisy) already_wearing(an(cloak_simple_name(uarmc)), uarmc); err++; } else *mask = W_ARMC; } else if (is_suit(otmp)) { if (uarmc) { +/*JP if (noisy) You("cannot wear armor over a %s.", cloak_simple_name(uarmc)); +*/ + if (noisy) You("%sの上から着ることはできない.", cloak_simple_name(uarmc)); err++; } else if (uarm) { +/*JP if (noisy) already_wearing("some armor"); +*/ + if (noisy) already_wearing("鎧", uarm); err++; } else *mask = W_ARM; @@ -1382,7 +1701,10 @@ /* getobj can't do this after setting its allow_all flag; that happens if you have armor for slots that are covered up or extra armor for slots that are filled */ +/*JP if (noisy) silly_thing("wear", otmp); +*/ + if (noisy) silly_thing("身につける", otmp); err++; } /* Unnecessary since now only weapons and special items like pick-axes get @@ -1403,11 +1725,18 @@ struct obj *otmp; int delay; long mask = 0; +#if 0 /*JP*/ + const char *j; + const char *m; +#endif /* cantweararm checks for suits of armor */ /* verysmall or nohands checks for shields, gloves, etc... */ if ((verysmall(youmonst.data) || nohands(youmonst.data))) { +/*JP pline("Don't even bother."); +*/ + pline("そんなつまらないことにこだわるな."); return(0); } @@ -1422,9 +1751,15 @@ if (otmp->otyp == HELM_OF_OPPOSITE_ALIGNMENT && qstart_level.dnum == u.uz.dnum) { /* in quest */ if (u.ualignbase[A_CURRENT] == u.ualignbase[A_ORIGINAL]) +/*JP You("narrowly avoid losing all chance at your goal."); +*/ + You("目的を達成する可能性を失うことをなんとか回避した."); else /* converted */ +/*JP You("are suddenly overcome with shame and change your mind."); +*/ + You("突然恥ずかしくなって考えを変えた."); u.ublessed = 0; /* lose your god's protection */ makeknown(otmp->otyp); flags.botl = 1; @@ -1446,7 +1781,10 @@ if(is_helmet(otmp)) afternmv = Helmet_on; if(is_gloves(otmp)) afternmv = Gloves_on; if(otmp == uarm) afternmv = Armor_on; +/*JP nomovemsg = "You finish your dressing maneuver."; +*/ + nomovemsg = "あなたは装備し終った."; } else { if(is_cloak(otmp)) (void) Cloak_on(); if (is_shield(otmp)) (void) Shield_on(); @@ -1466,16 +1804,27 @@ long mask = 0L; if(uleft && uright && uamul && ublindf) { +#if 0 /*JP*/ Your("%s%s are full, and you're already wearing an amulet and %s.", humanoid(youmonst.data) ? "ring-" : "", makeplural(body_part(FINGER)), ublindf->otyp==LENSES ? "some lenses" : "a blindfold"); +#else + Your("%s%sはふさがってるし,すでに魔除けと%sも身につけている.", + humanoid(youmonst.data) ? "薬" : "", + makeplural(body_part(FINGER)), + ublindf->otyp==LENSES ? "レンズ" : "目隠し"); + return(0); +#endif return(0); } otmp = getobj(accessories, "put on"); if(!otmp) return(0); if(otmp->owornmask & (W_RING | W_AMUL | W_TOOL)) { +/*JP already_wearing(c_that_); +*/ + already_wearing(c_that_, otmp); return(0); } if(welded(otmp)) { @@ -1490,13 +1839,22 @@ setuqwep((struct obj *) 0); if(otmp->oclass == RING_CLASS || otmp->otyp == MEAT_RING) { if(nolimbs(youmonst.data)) { +/*JP You("cannot make the ring stick to your body."); +*/ + You("指輪をはめれない体だ."); return(0); } if(uleft && uright){ +#if 0 /*JP*/ There("are no more %s%s to fill.", humanoid(youmonst.data) ? "ring-" : "", makeplural(body_part(FINGER))); +#else + pline("はめることのできる%s%sがない.", + humanoid(youmonst.data) ? "薬" : "", + makeplural(body_part(FINGER))); +#endif return(0); } if(uleft) mask = RIGHT_RING; @@ -1505,9 +1863,15 @@ char qbuf[QBUFSZ]; char answer; +#if 0 /*JP*/ Sprintf(qbuf, "Which %s%s, Right or Left?", humanoid(youmonst.data) ? "ring-" : "", body_part(FINGER)); +#else + Sprintf(qbuf, "どちらの%s%s,右(r)それとも左(l)?", + humanoid(youmonst.data) ? "薬" : "", + body_part(FINGER)); +#endif if(!(answer = yn_function(qbuf, "rl", '\0'))) return(0); switch(answer){ @@ -1523,17 +1887,26 @@ } while(!mask); if (uarmg && uarmg->cursed) { uarmg->bknown = TRUE; +/*JP You("cannot remove your gloves to put on the ring."); +*/ + You("指輪をはめようとしたが小手が脱げない."); return(0); } if (welded(uwep) && bimanual(uwep)) { /* welded will set bknown */ +/*JP You("cannot free your weapon hands to put on the ring."); +*/ + You("指輪をはめようとしたが利腕の自由がきかない."); return(0); } if (welded(uwep) && mask==RIGHT_RING) { /* welded will set bknown */ +/*JP You("cannot free your weapon hand to put on the ring."); +*/ + You("指輪をはめようとしたが利腕の自由がきかない."); return(0); } if (otmp->oartifact && !touch_artifact(otmp, &youmonst)) @@ -1542,7 +1915,10 @@ Ring_on(otmp); } else if (otmp->oclass == AMULET_CLASS) { if(uamul) { +/*JP already_wearing("an amulet"); +*/ + already_wearing("魔除け", uamul); return(0); } if (otmp->oartifact && !touch_artifact(otmp, &youmonst)) @@ -1557,24 +1933,47 @@ } else { /* it's a blindfold, towel, or lenses */ if (ublindf) { if (ublindf->otyp == TOWEL) +#if 0 /*JP*/ Your("%s is already covered by a towel.", body_part(FACE)); +#else + You("既にタオルを身につけている."); +#endif else if (ublindf->otyp == BLINDFOLD) { if (otmp->otyp == LENSES) +/*JP already_wearing2("lenses", "a blindfold"); +*/ + already_wearing2("レンズ", "目隠し"); else +/*JP already_wearing("a blindfold"); +*/ + already_wearing("目隠し", ublindf); } else if (ublindf->otyp == LENSES) { if (otmp->otyp == BLINDFOLD) +/*JP already_wearing2("a blindfold", "some lenses"); +*/ + already_wearing2("目隠し", "レンズ"); else +/*JP already_wearing("some lenses"); +*/ + already_wearing("レンズ", ublindf); } else +#if 0 /*JP*/ already_wearing(something); /* ??? */ +#else + already_wearing("何か", ublindf); /* ??? */ +#endif return(0); } if (otmp->otyp != BLINDFOLD && otmp->otyp != TOWEL && otmp->otyp != LENSES) { +/*JP You_cant("wear that!"); +*/ + You_cant("それを身につけることはできない!"); return(0); } if (otmp->oartifact && !touch_artifact(otmp, &youmonst)) @@ -1632,10 +2031,14 @@ rightfall = (uright && !uright->cursed && (!welded(uwep))); if (!uarmg && (leftfall || rightfall) && !nolimbs(youmonst.data)) { /* changed so cursed rings don't fall off, GAN 10/30/86 */ +#if 0 /*JP*/ Your("%s off your %s.", (leftfall && rightfall) ? "rings slip" : "ring slips", (leftfall && rightfall) ? makeplural(body_part(FINGER)) : body_part(FINGER)); +#else + Your("指輪は%sから滑り落ちた.", body_part(FINGER)); +#endif xfl++; if (leftfall) { otmp = uleft; @@ -1651,12 +2054,21 @@ otmp = uswapwep; if (u.twoweap && otmp) { +#if 0 /*JP*/ otherwep = is_sword(otmp) ? c_sword : makesingular(oclass_names[(int)otmp->oclass]); Your("%s %sslips from your %s.", otherwep, xfl ? "also " : "", makeplural(body_part(HAND))); +#else + otherwep = is_sword(otmp) ? c_sword : + jtrns_obj('S',oclass_names[(int)otmp->oclass]); + You("%s%s%sから滑り落とした.", + otherwep, + xfl ? "もまた" : "を", + body_part(HAND)); +#endif setuswapwep((struct obj *)0); xfl++; if (otmp->otyp != LOADSTONE || !otmp->cursed) @@ -1667,15 +2079,27 @@ const char *thiswep; /* nice wording if both weapons are the same type */ +#if 0 /*JP*/ thiswep = is_sword(otmp) ? c_sword : makesingular(oclass_names[(int)otmp->oclass]); +#else + thiswep = is_sword(otmp) ? c_sword : + jtrns_obj('S',oclass_names[(int)otmp->oclass]); +#endif if (otherwep && strcmp(thiswep, otherwep)) otherwep = 0; /* changed so cursed weapons don't fall, GAN 10/30/86 */ +#if 0 /*JP*/ Your("%s%s %sslips from your %s.", otherwep ? "other " : "", thiswep, xfl ? "also " : "", makeplural(body_part(HAND))); +#else + You("%s%s%s%sから滑り落とした.", + otherwep ? "もうひとつの" : "", thiswep, + xfl ? "もまた" : "を", + body_part(HAND)); +#endif setuwep((struct obj *)0); if (otmp->otyp != LOADSTONE || !otmp->cursed) dropx(otmp); @@ -1769,19 +2193,32 @@ /* special ring checks */ if (otmp == uright || otmp == uleft) { if (nolimbs(youmonst.data)) { +#if 0 /*JP*/ pline_The("ring is stuck."); +#else + pline("指輪は体に埋まってしまっている."); +#endif return 0; } why = 0; /* the item which prevents ring removal */ if (welded(uwep) && (otmp == uright || bimanual(uwep))) { +/*JP Sprintf(buf, "free a weapon %s", body_part(HAND)); +*/ + Sprintf(buf, "利腕の自由がきかない"); why = uwep; } else if (uarmg && uarmg->cursed) { +/*JP Sprintf(buf, "take off your %s", c_gloves); +*/ + Sprintf(buf, "%sが脱げない", c_gloves); why = uarmg; } if (why) { +/*JP You("cannot %s to remove the ring.", buf); +*/ + You("指輪をはずそうとしたが%s.", buf); why->bknown = TRUE; return 0; } @@ -1789,24 +2226,40 @@ /* special glove checks */ if (otmp == uarmg) { if (welded(uwep)) { +#if 0 /*JP*/ You("are unable to take off your %s while wielding that %s.", c_gloves, is_sword(uwep) ? c_sword : c_weapon); +#else + You("%sを持ったまま%sをはずすことはできない.", + is_sword(uwep) ? c_sword : c_weapon, c_gloves); +#endif uwep->bknown = TRUE; return 0; } else if (Glib) { +#if 0 /*JP*/ You_cant("take off the slippery %s with your slippery %s.", c_gloves, makeplural(body_part(FINGER))); +#else + You_cant("滑りやすい%sを滑りやすい%sではずせない.", + c_gloves, body_part(FINGER)); +#endif return 0; } } /* special boot checks */ if (otmp == uarmf) { if (u.utrap && u.utraptype == TT_BEARTRAP) { +/*JP pline_The("bear trap prevents you from pulling your %s out.", +*/ + pline("%sが熊の罠につかまっているので脱ぐことができない.", body_part(FOOT)); return 0; } else if (u.utrap && u.utraptype == TT_INFLOOR) { +/*JP You("are stuck in the %s, and cannot pull your %s out.", +*/ + You("%sが%sにはまっているので脱ぐことができない.", surface(u.ux, u.uy), makeplural(body_part(FOOT))); return 0; } @@ -1819,21 +2272,36 @@ ) { why = 0; /* the item which prevents disrobing */ if (uarmc && uarmc->cursed) { +/*JP Sprintf(buf, "remove your %s", cloak_simple_name(uarmc)); +*/ + Sprintf(buf, "%sが脱げない", cloak_simple_name(uarmc)); why = uarmc; #ifdef TOURIST } else if (otmp == uarmu && uarm && uarm->cursed) { +/*JP Sprintf(buf, "remove your %s", c_suit); +*/ + Sprintf(buf, "%sが脱げない", c_suit); why = uarm; #endif } else if (welded(uwep) && bimanual(uwep)) { +#if 0 /*JP*/ Sprintf(buf, "release your %s", is_sword(uwep) ? c_sword : (uwep->otyp == BATTLE_AXE) ? c_axe : c_weapon); +#else + Sprintf(buf, "%sが手放せない", + is_sword(uwep) ? c_sword : + (uwep->otyp == BATTLE_AXE) ? c_axe : c_weapon); +#endif why = uwep; } if (why) { +/*JP You("cannot %s to take off %s.", buf, the(xname(otmp))); +*/ + You("%sをはずそうとしたが%s.", xname(otmp), buf); why->bknown = TRUE; return 0; } @@ -1876,16 +2344,25 @@ if (taking_off == W_WEP) { if(!cursed(uwep)) { setuwep((struct obj *) 0); +/*JP You("are empty %s.", body_part(HANDED)); +*/ + You("何も%sにしていない.", body_part(HAND)); u.twoweap = FALSE; } } else if (taking_off == W_SWAPWEP) { setuswapwep((struct obj *) 0); +/*JP You("no longer have a second weapon readied."); +*/ + You("予備の武器をおさめた."); u.twoweap = FALSE; } else if (taking_off == W_QUIVER) { setuqwep((struct obj *) 0); +/*JP You("no longer have ammunition readied."); +*/ + You("装填した矢(など)をおさめた."); } else if (taking_off == WORN_ARMOR) { otmp = uarm; if(!cursed(otmp)) (void) Armor_off(); @@ -1925,7 +2402,9 @@ return(otmp); } +#if 0 /*JP*/ static const char *disrobing = ""; +#endif STATIC_PTR int @@ -1955,7 +2434,10 @@ todelay = 0; if (taking_off == 0L) { +/*JP You("finish %s.", disrobing); +*/ + You("装備を解きおえた."); return 0; } else if (taking_off == W_WEP) { todelay = 1; @@ -2008,7 +2490,11 @@ */ if (todelay > 0) todelay--; +#if 0 /*JP*/ set_occupation(take_off, disrobing, 0); +#else + set_occupation(take_off, "装備を解く", 0); +#endif return(1); /* get busy */ } @@ -2017,7 +2503,9 @@ reset_remarm() { taking_off = takeoff_mask = 0L; +#if 0 /*JP*/ disrobing = nul; +#endif } /* the 'A' command -- remove multiple worn items */ @@ -2027,12 +2515,21 @@ int result = 0; if (taking_off || takeoff_mask) { +/*JP You("continue %s.", disrobing); +*/ + You("装備を解くのを再開した."); +/*JP set_occupation(take_off, disrobing, 0); +*/ + set_occupation(take_off, "装備を解く", 0); return 0; } else if (!uwep && !uswapwep && !uquiver && !uamul && !ublindf && !uleft && !uright && !wearing_armor()) { +/*JP You("are not wearing anything."); +*/ + You("何も装備していない."); return 0; } @@ -2044,10 +2541,12 @@ if (takeoff_mask) { /* default activity for armor and/or accessories, possibly combined with weapons */ +#if 0 /*JP*/ disrobing = "disrobing"; /* specific activity when handling weapons only */ if (!(takeoff_mask & ~(W_WEP|W_SWAPWEP|W_QUIVER))) disrobing = "disarming"; +#endif (void) take_off(); } /* The time to perform the command is already completely accounted for @@ -2069,7 +2568,10 @@ all_worn_categories = (retry == -2); } else if (flags.menu_style == MENU_FULL) { all_worn_categories = FALSE; +/*JP n = query_category("What type of things do you want to take off?", +*/ + n = query_category("どのタイプの物の装備を解きますか?", invent, WORN_TYPES|ALL_TYPES, &pick_list, PICK_ANY); if (!n) return 0; for (i = 0; i < n; i++) { @@ -2085,7 +2587,10 @@ all_worn_categories = TRUE; } +/*JP n = query_objlist("What do you want to take off?", invent, +*/ + n = query_objlist("どの装備を解きますか?", invent, SIGNAL_NOMENU|USE_INVLET|INVORDER_SORT, &pick_list, PICK_ANY, all_worn_categories ? is_worn : is_worn_by_type); @@ -2094,7 +2599,10 @@ (void) select_off(pick_list[i].item.a_obj); free((genericptr_t) pick_list); } else if (n < 0 && flags.menu_style != MENU_COMBINATION) { +/*JP There("is nothing else you can remove or unwield."); +*/ + pline("装備を解けるものは何もない."); } return 0; } @@ -2111,42 +2619,68 @@ if (DESTROY_ARM(uarmc)) { if (donning(otmp)) cancel_don(); +#if 0 /*JP:T*/ Your("%s crumbles and turns to dust!", cloak_simple_name(uarmc)); +#else + Your("%sは粉々になった!", + cloak_simple_name(uarmc)); +#endif (void) Cloak_off(); useup(otmp); } else if (DESTROY_ARM(uarm)) { if (donning(otmp)) cancel_don(); +/*JP Your("armor turns to dust and falls to the %s!", +*/ + Your("鎧は塵となり%sに落ちた!", surface(u.ux,u.uy)); (void) Armor_gone(); useup(otmp); #ifdef TOURIST } else if (DESTROY_ARM(uarmu)) { if (donning(otmp)) cancel_don(); +/*JP Your("shirt crumbles into tiny threads and falls apart!"); +*/ + Your("シャツはズタズタに裂け,小さな糸屑となり落ちた!"); (void) Shirt_off(); useup(otmp); #endif } else if (DESTROY_ARM(uarmh)) { if (donning(otmp)) cancel_don(); +/*JP Your("helmet turns to dust and is blown away!"); +*/ + Your("兜は塵となり吹きとんだ!"); (void) Helmet_off(); useup(otmp); } else if (DESTROY_ARM(uarmg)) { if (donning(otmp)) cancel_don(); +/*JP Your("gloves vanish!"); +*/ + Your("小手は消えた!"); (void) Gloves_off(); useup(otmp); +/*JP selftouch("You"); +*/ + selftouch("そのときあなたは"); } else if (DESTROY_ARM(uarmf)) { if (donning(otmp)) cancel_don(); +/*JP Your("boots disintegrate!"); +*/ + Your("靴は粉々に砕けた!"); (void) Boots_off(); useup(otmp); } else if (DESTROY_ARM(uarms)) { if (donning(otmp)) cancel_don(); +/*JP Your("shield crumbles away!"); +*/ + Your("盾は砕け散った!"); (void) Shield_off(); useup(otmp); } else { diff -aurbN -xCVS -xXTAGS nethack/src/dog.c jnethack/src/dog.c --- nethack/src/dog.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/dog.c 2003-12-10 03:31:23.000000000 +0900 @@ -2,6 +2,14 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** changing point is marked `JP' (94/6/7) +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "edog.h" @@ -67,7 +75,10 @@ if (!quietly) /* have just been given "You the figurine and it transforms." message */ +/*JP pline("... into a pile of dust."); +*/ + pline("...そしてちりの山になった."); break; /* mtmp is null */ } } else if (!rn2(3)) { @@ -76,7 +87,10 @@ pm = rndmonst(); if (!pm) { if (!quietly) +/*JP There("seems to be nothing available for a familiar."); +*/ + pline("下僕は現れなかった."); break; } } @@ -84,7 +98,10 @@ mtmp = makemon(pm, x, y, MM_EDOG|MM_IGNOREWATER); if (otmp && !mtmp) { /* monster was genocided or square occupied */ if (!quietly) +/*JP pline_The("figurine writhes and then shatters into pieces!"); +*/ + pline("人形はもがき,くだけ散った!"); break; } } while (!mtmp && --trycnt > 0); @@ -104,7 +121,10 @@ mtmp->mtame = 0; /* not tame after all */ if (chance == 2) { /* hostile (cursed figurine) */ if (!quietly) +/*JP You("get a bad feeling about this."); +*/ + You("嫌な予感がした."); mtmp->mpeaceful = 0; set_malign(mtmp); } @@ -148,10 +168,17 @@ /* default pet names */ if (!*petname && pettype == PM_LITTLE_DOG) { /* All of these names were for dogs. */ +#if 0 /*JP*/ if(Role_if(PM_CAVEMAN)) petname = "Slasher"; /* The Warrior */ if(Role_if(PM_SAMURAI)) petname = "Hachi"; /* Shibuya Station */ if(Role_if(PM_BARBARIAN)) petname = "Idefix"; /* Obelix */ if(Role_if(PM_RANGER)) petname = "Sirius"; /* Orion's dog */ +#else + if(Role_if(PM_CAVEMAN)) petname = "スラッシャー"; + if(Role_if(PM_SAMURAI)) petname = "ハチ公"; + if(Role_if(PM_BARBARIAN)) petname = "イデフィクス"; + if(Role_if(PM_RANGER)) petname = "シリウス"; +#endif /*JP*/ } mtmp = makemon(&mons[pettype], u.ux, u.uy, MM_EDOG); @@ -513,16 +540,25 @@ stay_behind = FALSE; if (mtmp->mtame && mtmp->meating) { if (canseemon(mtmp)) +/*JP pline("%s is still eating.", Monnam(mtmp)); +*/ + pline("%sはまだ食べている.", Monnam(mtmp)); stay_behind = TRUE; } else if (mon_has_amulet(mtmp)) { if (canseemon(mtmp)) +/*JP pline("%s seems very disoriented for a moment.", +*/ + pline("%sは一瞬方向感覚を失ったようだ.", Monnam(mtmp)); stay_behind = TRUE; } else if (mtmp->mtame && mtmp->mtrapped) { if (canseemon(mtmp)) +/*JP pline("%s is still trapped.", Monnam(mtmp)); +*/ + pline("%sはまだ罠にかかったままだ.", Monnam(mtmp)); stay_behind = TRUE; } #ifdef STEED @@ -530,10 +566,17 @@ #endif if (stay_behind) { if (mtmp->mleashed) { +#if 0 /*JP*/ pline("%s leash suddenly comes loose.", humanoid(mtmp->data) ? (mtmp->female ? "Her" : "His") : "Its"); +#else + pline("%sに結ばれた紐は突然ゆるんだ.", + humanoid(mtmp->data) + ? (mtmp->female ? "彼女" : "彼") + : "その生物"); +#endif m_unleash(mtmp, FALSE); } continue; @@ -572,7 +615,10 @@ } else if (mtmp->mleashed) { /* this can happen if your quest leader ejects you from the "home" level while a leashed pet isn't next to you */ +/*JP pline("%s leash goes slack.", s_suffix(Monnam(mtmp))); +*/ + pline("%sに結ばれた紐はたるんだ.", Monnam(mtmp)); m_unleash(mtmp, FALSE); } } @@ -784,11 +830,20 @@ boolean big_corpse = (obj->otyp == CORPSE && obj->corpsenm >= LOW_PM && mons[obj->corpsenm].msize > mtmp->data->msize); +#if 0 /*JP*/ pline("%s catches %s%s", Monnam(mtmp), the(xname(obj)), !big_corpse ? "." : ", or vice versa!"); +#else + pline("%sは%sをつかまえた%s", + Monnam(mtmp), the(xname(obj)), + !big_corpse ? "." : ",と言うよりその逆か!"); +#endif } else if (cansee(mtmp->mx,mtmp->my)) +/*JP pline("%s.", Tobjnam(obj, "stop")); +*/ + pline("%sは止まった.", xname(obj)); /* dog_eat expects a floor object */ place_object(obj, mtmp->mx, mtmp->my); (void) dog_eat(mtmp, obj, mtmp->mx, mtmp->my, FALSE); @@ -869,13 +924,24 @@ if(!quietly && cansee(mtmp->mx, mtmp->my)) { if (haseyes(youmonst.data)) { if (haseyes(mtmp->data)) +#if 0 /*JP*/ pline("%s %s to look you in the %s.", Monnam(mtmp), mtmp->mpeaceful ? "seems unable" : "refuses", body_part(EYE)); +#else + pline("%sはあなたの%s%s.", + Monnam(mtmp), + body_part(EYE), + mtmp->mpeaceful ? "を見ることができないようだ" : + "から目をそらした"); +#endif else +/*JP pline("%s avoids your gaze.", +*/ + pline("%sはあなたのにらみを回避した.", Monnam(mtmp)); } } diff -aurbN -xCVS -xXTAGS nethack/src/dogmove.c jnethack/src/dogmove.c --- nethack/src/dogmove.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/dogmove.c 2004-06-25 02:26:14.000000000 +0900 @@ -2,6 +2,14 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** changing point is marked `JP' (94/6/7) +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "mfndpos.h" @@ -161,10 +169,17 @@ /* However, invisible monsters should still be "it" even though out of sight locations should not. */ if (cansee(x, y) || cansee(mtmp->mx, mtmp->my)) +#if 0 /*JP*/ pline("%s %s %s.", mon_visible(mtmp) ? noit_Monnam(mtmp) : "It", devour ? "devours" : "eats", (obj->oclass == FOOD_CLASS) ? singular(obj, doname) : doname(obj)); +#else + pline("%sは%sを%s.", mon_visible(mtmp) ? noit_Monnam(mtmp) : "何か", + (obj->oclass == FOOD_CLASS) ? + singular(obj, doname) : doname(obj), + devour ? "飲み込んでいる" : "食べている"); +#endif /* It's a reward if it's DOGFOOD and the player dropped/threw it. */ /* We know the player had it if invlet is set -dlc */ if(dogfood(mtmp,obj) == DOGFOOD && obj->invlet) @@ -179,7 +194,10 @@ obj->oerodeproof = 0; mtmp->mstun = 1; if (canseemon(mtmp) && flags.verbose) { +/*JP pline("%s spits %s out in disgust!", +*/ + pline("%sは%sをペッと吐き出した!", Monnam(mtmp), distant_name(obj,doname)); } } else if (obj == uball) { @@ -228,11 +246,17 @@ mtmp->mhp = mtmp->mhpmax; if (mtmp->mhp < 1) goto dog_died; if (cansee(mtmp->mx, mtmp->my)) +/*JP pline("%s is confused from hunger.", Monnam(mtmp)); +*/ + pline("%sは空腹のため混乱している.", Monnam(mtmp)); else if (couldsee(mtmp->mx, mtmp->my)) beg(mtmp); else +/*JP You_feel("worried about %s.", y_monnam(mtmp)); +*/ + You("%sが心配になった.", y_monnam(mtmp)); stop_occupation(); } else if (monstermoves > edog->hungrytime + 750 || mtmp->mhp < 1) { dog_died: @@ -241,12 +265,23 @@ && mtmp != u.usteed #endif ) +/*JP Your("leash goes slack."); +*/ + Your("紐はたるんだ."); else if (cansee(mtmp->mx, mtmp->my)) +/*JP pline("%s starves.", Monnam(mtmp)); +*/ + pline("%sは飢えで死んだ.", Monnam(mtmp)); else +#if 0 /*JP*/ You_feel("%s for a moment.", Hallucination ? "bummed" : "sad"); +#else + You("%s気分におそわれた.", + Hallucination ? "がっかりした" : "悲しい"); +#endif mondied(mtmp); return(TRUE); } @@ -305,7 +340,10 @@ if(rn2(20) < edog->apport+3) { if (rn2(udist) || !rn2(edog->apport)) { if (cansee(omx, omy) && flags.verbose) +/*JP pline("%s picks up %s.", Monnam(mtmp), +*/ + pline("%sは%sを拾った.", Monnam(mtmp), distant_name(obj, doname)); obj_extract_self(obj); newsym(omx,omy); @@ -552,8 +590,14 @@ * it disappears, angrily, and sends in some nasties */ if (canspotmon(mtmp)) { +/*JP pline("%s rebukes you, saying:", Monnam(mtmp)); +*/ + pline("%sはあなたを非難した:", Monnam(mtmp)); +/*JP verbalize("Since you desire conflict, have some more!"); +*/ + verbalize("闘争を望んでいるようだから,もっと与えてやろう!"); } mongone(mtmp); i = rnd(4); @@ -571,7 +615,10 @@ if (!Conflict && !mtmp->mconf && mtmp == u.ustuck && !sticks(youmonst.data)) { unstuck(mtmp); /* swallowed case handled above */ +/*JP You("get released!"); +*/ + You("動けるようになった!"); } if (!nohands(mtmp->data) && !verysmall(mtmp->data)) { allowflags |= OPENDOOR; @@ -715,7 +762,10 @@ if (info[chi] & ALLOW_U) { if (mtmp->mleashed) { /* play it safe */ +/*JP pline("%s breaks loose of %s leash!", +*/ + pline("%sは%sの紐で自由を奪われた!", Monnam(mtmp), mhis(mtmp)); m_unleash(mtmp, FALSE); } @@ -746,7 +796,10 @@ remove_monster(omx, omy); place_monster(mtmp, nix, niy); if (cursemsg[chi] && (cansee(omx,omy) || cansee(nix,niy))) +/*JP pline("%s moves only reluctantly.", Monnam(mtmp)); +*/ + pline("%sはいやいや動いた.", Monnam(mtmp)); for (j=MTSZ-1; j>0; j--) mtmp->mtrack[j] = mtmp->mtrack[j-1]; mtmp->mtrack[0].x = omx; mtmp->mtrack[0].y = omy; diff -aurbN -xCVS -xXTAGS nethack/src/dokick.c jnethack/src/dokick.c --- nethack/src/dokick.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/dokick.c 2005-03-04 00:59:01.000000000 +0900 @@ -2,6 +2,14 @@ /* Copyright (c) Izchak Miller, Mike Stephenson, Steve Linhart, 1989. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** changing point is marked `JP' (94/6/7) +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "eshk.h" @@ -23,7 +31,10 @@ static NEARDATA struct obj *kickobj; +/*JP static const char kick_passes_thru[] = "kick passes harmlessly through"; +*/ +static const char kick_passes_thru[] = "蹴りはダメージを与えずにすり抜けた"; STATIC_OVL void kickdmg(mon, clumsy) @@ -54,7 +65,10 @@ blessed_foot_damage = 1; if (mon->data == &mons[PM_SHADE] && !blessed_foot_damage) { +/*JP pline_The("%s.", kick_passes_thru); +*/ + pline_The("%s.", kick_passes_thru); /* doesn't exercise skill or abuse alignment or frighten pet, and shades have no passive counterattack */ return; @@ -94,7 +108,10 @@ mdx = mon->mx + u.dx; mdy = mon->my + u.dy; if(goodpos(mdx, mdy, mon, 0)) { +/*JP pline("%s reels from the blow.", Monnam(mon)); +*/ + pline("%sは強打されよろめいた.", Monnam(mon)); if (m_in_out_region(mon, mdx, mdy)) { remove_monster(mon->mx, mon->my); newsym(mon->mx, mon->my); @@ -151,10 +168,16 @@ (!uarmf || !uarmf->blessed)) { /* doesn't matter whether it would have hit or missed, and shades have no passive counterattack */ +/*JP Your("%s %s.", kick_passes_thru, mon_nam(mon)); +*/ + You("%sを蹴ったが,%s.", mon_nam(mon), kick_passes_thru); break; /* skip any additional kicks */ } else if (tmp > rnd(20)) { +/*JP You("kick %s.", mon_nam(mon)); +*/ + You("%sを蹴った.", mon_nam(mon)); sum = damageum(mon, uattk); (void)passive(mon, (boolean)(sum > 0), (sum != 2), AT_KICK); if (sum == 2) @@ -169,7 +192,10 @@ if(Levitation && !rn2(3) && verysmall(mon->data) && !is_flyer(mon->data)) { +/*JP pline("Floating in the air, you miss wildly!"); +*/ + pline("空中に浮いているので,大きく外した!"); exercise(A_DEX, FALSE); (void) passive(mon, FALSE, 1, AT_KICK); return; @@ -181,7 +207,10 @@ if(i < (j*3)/10) { if(!rn2((i < j/10) ? 2 : (i < j/5) ? 3 : 4)) { if(martial() && !rn2(2)) goto doit; +/*JP Your("clumsy kick does no damage."); +*/ + Your("不器用な蹴りでダメージを与えられなかった."); (void) passive(mon, FALSE, 1, AT_KICK); return; } @@ -194,15 +223,23 @@ else if(uarm && objects[uarm->otyp].oc_bulky && ACURR(A_DEX) < rnd(25)) clumsy = TRUE; doit: +/*JP You("kick %s.", mon_nam(mon)); +*/ + You("%sを蹴った.", mon_nam(mon)); if(!rn2(clumsy ? 3 : 4) && (clumsy || !bigmonst(mon->data)) && mon->mcansee && !mon->mtrapped && !thick_skinned(mon->data) && mon->data->mlet != S_EEL && haseyes(mon->data) && mon->mcanmove && !mon->mstun && !mon->mconf && !mon->msleeping && mon->data->mmove >= 12) { if(!nohands(mon->data) && !rn2(martial() ? 5 : 3)) { +#if 0 /*JP*/ pline("%s blocks your %skick.", Monnam(mon), clumsy ? "clumsy " : ""); +#else + pline("%sはあなたの%s蹴りを防いだ.", Monnam(mon), + clumsy ? "不器用な" : ""); +#endif (void) passive(mon, FALSE, 1, AT_KICK); return; } else { @@ -212,6 +249,7 @@ unmap_object(x, y); newsym(x, y); } +#if 0 /*JP*/ pline("%s %s, %s evading your %skick.", Monnam(mon), (can_teleport(mon->data) ? "teleports" : is_floater(mon->data) ? "floats" : @@ -220,6 +258,16 @@ "slides" : "jumps"), clumsy ? "easily" : "nimbly", clumsy ? "clumsy " : ""); +#else + pline("%sは%s,%sあなたの%s蹴りをたくみに避けた.", Monnam(mon), + (can_teleport(mon->data) ? "瞬間移動し" : + is_floater(mon->data) ? "浮き" : + is_flyer(mon->data) ? "はばたき" : + (nolimbs(mon->data) || slithy(mon->data)) + ? "横に滑り" : "跳ね"), + clumsy ? "楽々と" : "素早く", + clumsy ? "不器用な" : ""); +#endif (void) passive(mon, FALSE, 1, AT_KICK); return; } @@ -245,8 +293,13 @@ } else if (!mtmp->mcanmove) { /* too light to do real damage */ if (canseemon(mtmp)) { +#if 0 /*JP:T*/ pline_The("%s harmlessly %s %s.", xname(gold), otense(gold, "hit"), mon_nam(mtmp)); +#else + pline("%sは%sに命中した.", xname(gold), + mon_nam(mtmp)); +#endif msg_given = TRUE; } } else { @@ -259,7 +312,10 @@ /* greedy monsters catch gold */ if (cansee(mtmp->mx, mtmp->my)) +/*JP pline("%s catches the gold.", Monnam(mtmp)); +*/ + pline("%sは金貨をキャッチした.", Monnam(mtmp)); #ifndef GOLDOBJ mtmp->mgold += gold->quan; #endif @@ -273,9 +329,15 @@ robbed -= value; #endif if (robbed < 0) robbed = 0; +#if 0 /*JP*/ pline_The("amount %scovers %s recent losses.", !robbed ? "" : "partially ", mhis(mtmp)); +#else + pline("%s%sの損失を補填するのに使われた.", + !robbed ? "" : "金の一部は", + mhis(mtmp)); +#endif ESHK(mtmp)->robbed = robbed; if(!robbed) make_happy_shk(mtmp, FALSE); @@ -286,15 +348,28 @@ #else ESHK(mtmp)->credit += value; #endif +#if 0 /*JP*/ You("have %ld %s in credit.", +#else + You("%ld%sを貸しにした.", +#endif ESHK(mtmp)->credit, currency(ESHK(mtmp)->credit)); +/*JP } else verbalize("Thanks, scum!"); +*/ + } else verbalize("ありがとよ!くそったれ!"); } } else if (mtmp->ispriest) { if (mtmp->mpeaceful) +/*JP verbalize("Thank you for your contribution."); +*/ + verbalize("寄付に感謝します."); +/*JP else verbalize("Thanks, scum!"); +*/ + else verbalize("ありがとよ!くそったれ!"); } else if (is_mercenary(mtmp->data)) { long goldreqd = 0L; @@ -320,8 +395,14 @@ } } if (mtmp->mpeaceful) +/*JP verbalize("That should do. Now beat it!"); +*/ + verbalize("なんだい?これは?"); +/*JP else verbalize("That's not enough, coward!"); +*/ + else verbalize("そんなもので済むか,卑怯者!"); } #ifndef GOLDOBJ @@ -362,9 +443,15 @@ otmp2 = otmp->nobj; if (objects[otmp->otyp].oc_material == GLASS && otmp->oclass != GEM_CLASS && !obj_resists(otmp, 33, 100)) { +/*JP result = "shatter"; +*/ + result = "ガチャン"; } else if (otmp->otyp == EGG && !rn2(3)) { +/*JP result = "cracking"; +*/ + result = "グシャッ"; } if (result) { if (otmp->otyp == MIRROR) change_luck(-2); @@ -373,7 +460,10 @@ * but it's always exactly 1 that breaks */ if (otmp->otyp == EGG && otmp->spe && otmp->corpsenm >= LOW_PM) change_luck(-1); +/*JP You_hear("a muffled %s.", result); +*/ + You_hear("こもった%sという音を聞いた.", result); if (costly) loss += stolen_value(otmp, x, y, (boolean)shkp->mpeaceful, TRUE); @@ -387,10 +477,17 @@ } if (costly && loss) { if (!insider) { +/*JP You("caused %ld %s worth of damage!", loss, currency(loss)); +*/ + You("%ld%s分のダメージを与えた!", loss, currency(loss)); make_angry_shk(shkp, x, y); } else { +#if 0 /*JP*/ You("owe %s %ld %s for objects destroyed.", +#else + You("器物破損で%sに%ld%sの借りをつくった.", +#endif mon_nam(shkp), loss, currency(loss)); } } @@ -419,14 +516,24 @@ trap->ttyp == SPIKED_PIT) && !Passes_walls) || trap->ttyp == WEB)) { if (!trap->tseen) find_trap(trap); +#if 0 /*JP*/ You_cant("kick %s that's in a %s!", something, Hallucination ? "tizzy" : (trap->ttyp == WEB) ? "web" : "pit"); +#else + You("%sでは%sを蹴ることができない!", + Hallucination ? "混乱した状態" : + trap->ttyp == WEB ? "くもの巣の中" : "落し穴の中", + something); +#endif return 1; } if(Fumbling && !rn2(3)) { +/*JP Your("clumsy kick missed."); +*/ + Your("不器用な蹴りは外れた."); return(1); } @@ -434,13 +541,24 @@ && !Stone_resistance && !uarmf) { char kbuf[BUFSZ]; +#if 0 /*JP*/ You("kick the %s with your bare %s.", corpse_xname(kickobj, TRUE), makeplural(body_part(FOOT))); +#else + You("素%sで%sを蹴った.", + makeplural(body_part(FOOT)), corpse_xname(kickobj, TRUE)); +#endif if (!(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))) { +/*JP You("turn to stone..."); +*/ + You("石になりました..."); killer_format = KILLED_BY; /* KMH -- otmp should be kickobj */ +/*JP Sprintf(kbuf, "kicking %s without boots", +*/ + Sprintf(kbuf, "靴無しで%sを蹴って", an(corpse_xname(kickobj, TRUE))); killer = kbuf; done(STONING); @@ -476,25 +594,43 @@ if ((!martial() && rn2(20) > ACURR(A_DEX)) || IS_ROCK(levl[u.ux][u.uy].typ) || closed_door(u.ux, u.uy)) { if (Blind) +/*JP pline("It doesn't come loose."); +*/ + pline("びくともしない."); else +#if 0 /*JP*/ pline("%s %sn't come loose.", The(distant_name(kickobj, xname)), otense(kickobj, "do")); +#else + pline("%sはびくともしない.", + distant_name(kickobj, xname)); +#endif return (!rn2(3) || martial()); } if (Blind) +/*JP pline("It comes loose."); +*/ + pline("何かが緩んでとれた."); else +#if 0 /*JP*/ pline("%s %s loose.", The(distant_name(kickobj, xname)), otense(kickobj, "come")); +#else + pline("%sは緩んでとれた.", distant_name(kickobj, xname)); +#endif obj_extract_self(kickobj); newsym(x, y); if (costly && (!costly_spot(u.ux, u.uy) || !index(u.urooms, *in_rooms(x, y, SHOPBASE)))) addtobill(kickobj, FALSE, FALSE, FALSE); +/*JP if (!flooreffects(kickobj, u.ux, u.uy, "fall")) { +*/ + if (!flooreffects(kickobj, u.ux, u.uy, "落ちる")) { place_object(kickobj, u.ux, u.uy); stackobj(kickobj); newsym(u.ux, u.uy); @@ -506,13 +642,19 @@ if(Is_box(kickobj)) { boolean otrp = kickobj->otrapped; +/*JP if(range < 2) pline("THUD!"); +*/ + if(range < 2) pline("ガン!"); container_impact_dmg(kickobj); if (kickobj->olocked) { if (!rn2(5) || (martial() && !rn2(2))) { +/*JP You("break open the lock!"); +*/ + You("鍵を壊し開けた!"); kickobj->olocked = 0; kickobj->obroken = 1; if (otrp) (void) chest_trap(kickobj, LEG, FALSE); @@ -520,7 +662,10 @@ } } else { if (!rn2(3) || (martial() && !rn2(2))) { +/*JP pline_The("lid slams open, then falls shut."); +*/ + pline("蓋がばたんと開き,閉じた."); if (otrp) (void) chest_trap(kickobj, LEG, FALSE); return(1); } @@ -537,15 +682,23 @@ * from its current position */ if(range < 2 || (isgold && kickobj->quan > 300L)) { +/*JP if(!Is_box(kickobj)) pline("Thump!"); +*/ + if(!Is_box(kickobj)) pline("ゴツン!"); return(!rn2(3) || martial()); } if (kickobj->quan > 1L && !isgold) kickobj = splitobj(kickobj, 1L); if (slide && !Blind) +#if 0 /*JP*/ pline("Whee! %s %s across the %s.", Doname2(kickobj), otense(kickobj, "slide"), surface(x,y)); +#else + pline("ズルッ!%sは%sの上を滑った.", Doname2(kickobj), + surface(x,y)); +#endif obj_extract_self(kickobj); (void) snuff_candle(kickobj); @@ -585,7 +738,10 @@ (boolean)shkp->mpeaceful, FALSE); } +/*JP if(flooreffects(kickobj,bhitpos.x,bhitpos.y,"fall")) return(1); +*/ + if(flooreffects(kickobj,bhitpos.x,bhitpos.y,"落ちる")) return(1); place_object(kickobj, bhitpos.x, bhitpos.y); stackobj(kickobj); newsym(kickobj->ox, kickobj->oy); @@ -599,23 +755,70 @@ const char *what; if (kickobj) what = distant_name(kickobj,doname); +/*JP else if (IS_DOOR(maploc->typ)) what = "a door"; +*/ + else if (IS_DOOR(maploc->typ)) what = "扉"; +/*JP else if (IS_TREE(maploc->typ)) what = "a tree"; +*/ + else if (IS_TREE(maploc->typ)) what = "木"; +/*JP else if (IS_STWALL(maploc->typ)) what = "a wall"; +*/ + else if (IS_STWALL(maploc->typ)) what = "壁"; +/*JP else if (IS_ROCK(maploc->typ)) what = "a rock"; +*/ + else if (IS_ROCK(maploc->typ)) what = "岩"; +/*JP else if (IS_THRONE(maploc->typ)) what = "a throne"; +*/ + else if (IS_THRONE(maploc->typ)) what = "玉座"; +/*JP else if (IS_FOUNTAIN(maploc->typ)) what = "a fountain"; +*/ + else if (IS_FOUNTAIN(maploc->typ)) what = "泉"; +/*JP else if (IS_GRAVE(maploc->typ)) what = "a headstone"; +*/ + else if (IS_GRAVE(maploc->typ)) what = "墓石"; #ifdef SINKS +/*JP else if (IS_SINK(maploc->typ)) what = "a sink"; +*/ + else if (IS_SINK(maploc->typ)) what = "流し台"; #endif +/*JP else if (IS_ALTAR(maploc->typ)) what = "an altar"; +*/ + else if (IS_ALTAR(maploc->typ)) what = "祭壇"; +/*JP else if (IS_DRAWBRIDGE(maploc->typ)) what = "a drawbridge"; +*/ + else if (IS_DRAWBRIDGE(maploc->typ)) what = "跳ね橋"; +/*JP else if (maploc->typ == STAIRS) what = "the stairs"; +*/ + else if (maploc->typ == STAIRS) what = "階段"; +/*JP else if (maploc->typ == LADDER) what = "a ladder"; +*/ + else if (maploc->typ == LADDER) what = "はしご"; +/*JP else if (maploc->typ == IRONBARS) what = "an iron bar"; +*/ + else if (maploc->typ == IRONBARS) what = "鉄棒"; +/*JP else what = "something weird"; +*/ + else what = "何か妙なもの"; +#if 0 /*JP:T*/ return strcat(strcpy(buf, "kicking "), what); +#else + Sprintf(buf, "%sを蹴って", what); + return buf; +#endif } int @@ -628,15 +831,27 @@ char buf[BUFSZ]; if (nolimbs(youmonst.data) || slithy(youmonst.data)) { +/*JP You("have no legs to kick with."); +*/ + You("何かを蹴ろうにも足がない."); no_kick = TRUE; } else if (verysmall(youmonst.data)) { +/*JP You("are too small to do any kicking."); +*/ + You("何かを蹴るには小さすぎる."); no_kick = TRUE; #ifdef STEED } else if (u.usteed) { +/*JP if (yn_function("Kick your steed?", ynchars, 'y') == 'y') { +*/ + if (yn_function("馬を蹴る?", ynchars, 'y') == 'y') { +/*JP You("kick %s.", mon_nam(u.usteed)); +*/ + You("%sを蹴った.", mon_nam(u.usteed)); kick_steed(); return 1; } else { @@ -649,28 +864,50 @@ const char *bp = body_part(LEG); if (wl == BOTH_SIDES) bp = makeplural(bp); +#if 0 /*JP*/ Your("%s%s %s in no shape for kicking.", (wl == LEFT_SIDE) ? "left " : (wl == RIGHT_SIDE) ? "right " : "", bp, (wl == BOTH_SIDES) ? "are" : "is"); +#else + You("%s%sを怪我をしており蹴れない.", + (wl == LEFT_SIDE) ? "左" : + (wl == RIGHT_SIDE) ? "右" : "", + bp); +#endif no_kick = TRUE; } else if (near_capacity() > SLT_ENCUMBER) { +/*JP Your("load is too heavy to balance yourself for a kick."); +*/ + You("たくさんものを持ちすぎて蹴りのためのバランスがとれない."); no_kick = TRUE; } else if (youmonst.data->mlet == S_LIZARD) { +/*JP Your("legs cannot kick effectively."); +*/ + Your("足ではうまく蹴れない."); no_kick = TRUE; } else if (u.uinwater && !rn2(2)) { +/*JP Your("slow motion kick doesn't hit anything."); +*/ + Your("遅い動きの蹴りでは命中しようがない."); no_kick = TRUE; } else if (u.utrap) { switch (u.utraptype) { case TT_PIT: +/*JP pline("There's not enough room to kick down here."); +*/ + pline("落し穴にはまっているので,蹴れない."); break; case TT_WEB: case TT_BEARTRAP: +/*JP You_cant("move your %s!", body_part(LEG)); +*/ + You("%sを動かすことができない!", body_part(LEG)); break; default: break; @@ -698,13 +935,22 @@ if(u.uswallow) { switch(rn2(3)) { +/*JP case 0: You_cant("move your %s!", body_part(LEG)); +*/ + case 0: You("%sを動かすことができない!", body_part(LEG)); break; case 1: if (is_animal(u.ustuck->data)) { +/*JP pline("%s burps loudly.", Monnam(u.ustuck)); +*/ + pline("%sは大きなゲップをした.", Monnam(u.ustuck)); break; } +/*JP default: Your("feeble kick has no effect."); break; +*/ + default: Your("弱々しい蹴りは効果がない."); break; } return(1); } @@ -720,7 +966,10 @@ if (isok(xx,yy) && !IS_ROCK(levl[xx][yy].typ) && !IS_DOOR(levl[xx][yy].typ) && (!Is_airlevel(&u.uz) || !OBJ_AT(xx,yy))) { +/*JP You("have nothing to brace yourself against."); +*/ + pline("支えにできるようなものが無い."); return(0); } } @@ -770,7 +1019,10 @@ } if (is_pool(x, y) ^ !!u.uinwater) { /* objects normally can't be removed from water by kicking */ +/*JP You("splash some water around."); +*/ + You("水を回りにまきちらした."); return 1; } @@ -790,15 +1042,24 @@ if(maploc->typ == SDOOR) { if(!Levitation && rn2(30) < avrg_attrib) { cvt_sdoor_to_door(maploc); /* ->typ = DOOR */ +/*JP pline("Crash! %s a secret door!", +*/ + pline("ガシャン!あなたは秘密の扉を%s!", /* don't "kick open" when it's locked unless it also happens to be trapped */ (maploc->doormask & (D_LOCKED|D_TRAPPED)) == D_LOCKED ? +/*JP "Your kick uncovers" : "You kick open"); +*/ + "発見した" : "蹴り開けた"); exercise(A_DEX, TRUE); if(maploc->doormask & D_TRAPPED) { maploc->doormask = D_NODOOR; +/*JP b_trapped("door", FOOT); +*/ + b_trapped("扉", FOOT); } else if (maploc->doormask != D_NODOOR && !(maploc->doormask & D_LOCKED)) maploc->doormask = D_ISOPEN; @@ -814,7 +1075,10 @@ } if(maploc->typ == SCORR) { if(!Levitation && rn2(30) < avrg_attrib) { +/*JP pline("Crash! You kick open a secret passage!"); +*/ + pline("ガシャン!あなたは秘密の通路を蹴りやぶった!"); exercise(A_DEX, TRUE); maploc->typ = CORR; if (Blind) @@ -833,9 +1097,15 @@ maploc->doormask = 0; /* don't leave loose ends.. */ (void) mkgold((long)rnd(200), x, y); if (Blind) +/*JP pline("CRASH! You destroy it."); +*/ + pline("ガシャン!あなたは何かを破壊した."); else { +/*JP pline("CRASH! You destroy the throne."); +*/ + pline("ガシャン!あなたは玉座を破壊した."); newsym(x, y); } exercise(A_DEX, TRUE); @@ -848,9 +1118,15 @@ (void) mksobj_at(rnd_class(DILITHIUM_CRYSTAL, LUCKSTONE-1), x, y, FALSE, TRUE); if (Blind) +/*JP You("kick %s loose!", something); +*/ + You("なにかを蹴り散らした!"); else { +/*JP You("kick loose some ornamental coins and gems!"); +*/ + You("装飾用の金貨や宝石を蹴り散らした!"); newsym(x, y); } /* prevent endless milking */ @@ -866,7 +1142,10 @@ } if(IS_ALTAR(maploc->typ)) { if(Levitation) goto dumb; +/*JP You("kick %s.",(Blind ? something : "the altar")); +*/ + You("%sを蹴った.",(Blind ? "何か" : "祭壇")); if(!rn2(3)) goto ouch; altar_wrath(x, y); exercise(A_DEX, TRUE); @@ -874,12 +1153,21 @@ } if(IS_FOUNTAIN(maploc->typ)) { if(Levitation) goto dumb; +/*JP You("kick %s.",(Blind ? something : "the fountain")); +*/ + You("%sを蹴った.",(Blind ? "何か" : "泉")); if(!rn2(3)) goto ouch; /* make metal boots rust */ if(uarmf && rn2(3)) +/*JP if (!rust_dmg(uarmf, "metal boots", 1, FALSE, &youmonst)) { +*/ + if (!rust_dmg(uarmf, "金属の靴", 1, FALSE, &youmonst)) { +/*JP Your("boots get wet."); +*/ + Your("靴は濡れた."); /* could cause short-lived fumbling here */ } exercise(A_DEX, TRUE); @@ -892,7 +1180,11 @@ /* nothing, fruit or trouble? 75:23.5:1.5% */ if (rn2(3)) { if ( !rn2(6) && !(mvitals[PM_KILLER_BEE].mvflags & G_GONE) ) +#if 0 /*JP*/ You_hear("a low buzzing."); /* a warning */ +#else + You_hear("ぶーんという音を聞いた."); /* a warning */ +#endif goto ouch; } if (rn2(15) && !(maploc->looted & TREE_LOOTED) && @@ -901,17 +1193,28 @@ short frtype = treefruit->otyp; treefruit->quan = nfruit; if (is_plural(treefruit)) +/*JP pline("Some %s fall from the tree!", xname(treefruit)); +*/ + pline("%sが何個か木から落ちてきた!", xname(treefruit)); else +/*JP pline("%s falls from the tree!", An(xname(treefruit))); +*/ + pline("%sが木から落ちてきた!", An(xname(treefruit))); nfall = scatter(x,y,2,MAY_HIT,treefruit); if (nfall != nfruit) { /* scatter left some in the tree, but treefruit * may not refer to the correct object */ treefruit = mksobj(frtype, TRUE, FALSE); treefruit->quan = nfruit-nfall; +#if 0 /*JP*/ pline("%ld %s got caught in the branches.", nfruit-nfall, xname(treefruit)); +#else + pline("%ld個の%sが枝にひっかかった.", + nfruit-nfall, xname(treefruit)); +#endif dealloc_obj(treefruit); } exercise(A_DEX, TRUE); @@ -931,9 +1234,15 @@ made++; } if ( made ) +/*JP pline("You've attracted the tree's former occupants!"); +*/ + pline("木の先住民を起こしてしまった!"); else +/*JP You("smell stale honey."); +*/ + pline("古いはちみつのにおいがした."); maploc->looted |= TREE_SWARM; return(1); } @@ -948,16 +1257,28 @@ if(Levitation) goto dumb; if(rn2(5)) { if(flags.soundok) +/*JP pline("Klunk! The pipes vibrate noisily."); +*/ + pline("ガラン!パイプはうるさく振動した."); +/*JP else pline("Klunk!"); +*/ + else pline("ガラン!"); exercise(A_DEX, TRUE); return(1); } else if(!(maploc->looted & S_LPUDDING) && !rn2(3) && !(mvitals[PM_BLACK_PUDDING].mvflags & G_GONE)) { if (Blind) +/*JP You_hear("a gushing sound."); +*/ + You_hear("なにかが噴出する音を聞いた."); else +/*JP pline("A %s ooze gushes up from the drain!", +*/ + pline("%s液体が排水口からにじみ出た!", hcolor(NH_BLACK)); (void) makemon(&mons[PM_BLACK_PUDDING], x, y, NO_MM_FLAGS); @@ -968,20 +1289,34 @@ } else if(!(maploc->looted & S_LDWASHER) && !rn2(3) && !(mvitals[washerndx].mvflags & G_GONE)) { /* can't resist... */ +#if 0 /*JP*/ pline("%s returns!", (Blind ? Something : "The dish washer")); +#else + pline("%sが戻ってきた!", (Blind ? "何か" : + "皿洗い")); +#endif if (makemon(&mons[washerndx], x, y, NO_MM_FLAGS)) newsym(x,y); maploc->looted |= S_LDWASHER; exercise(A_DEX, TRUE); return(1); } else if(!rn2(3)) { +#if 0 /*JP*/ pline("Flupp! %s.", (Blind ? "You hear a sloshing sound" : "Muddy waste pops up from the drain")); +#else + pline("うわ!%s.", (Blind ? + "あなたは,バチャバチャする音を聞いた" : + "排水口からどろどろの廃棄物が出てくる")); +#endif if(!(maploc->looted & S_LRING)) { /* once per sink */ if (!Blind) +/*JP You("see a ring shining in its midst."); +*/ + You("その中に光る指輪を見つけた."); (void) mkobj_at(RING_CLASS, x, y, TRUE); newsym(x, y); exercise(A_DEX, TRUE); @@ -998,12 +1333,18 @@ if(!IS_STWALL(maploc->typ) && maploc->ladder == LA_DOWN) goto dumb; ouch: +/*JP pline("Ouch! That hurts!"); +*/ + pline("いてっ!怪我した!"); exercise(A_DEX, FALSE); exercise(A_STR, FALSE); if (Blind) feel_location(x,y); /* we know we hit it */ if (is_drawbridge_wall(x,y) >= 0) { +/*JP pline_The("drawbridge is unaffected."); +*/ + pline("跳ね橋はびくともしない."); /* update maploc to refer to the drawbridge */ (void) find_drawbridge(&x,&y); maploc = &levl[x][y]; @@ -1024,10 +1365,16 @@ dumb: exercise(A_DEX, FALSE); if (martial() || ACURR(A_DEX) >= 16 || rn2(3)) { +/*JP You("kick at empty space."); +*/ + You("何もない空間を蹴った."); if (Blind) feel_location(x,y); } else { +/*JP pline("Dumb move! You strain a muscle."); +*/ + pline("ばかげた動きだ!筋肉を痛めた."); exercise(A_STR, FALSE); set_wounded_legs(RIGHT_SIDE, 5 + rnd(5)); } @@ -1047,16 +1394,28 @@ boolean shopdoor = *in_rooms(x, y, SHOPBASE) ? TRUE : FALSE; /* break the door */ if(maploc->doormask & D_TRAPPED) { +/*JP if (flags.verbose) You("kick the door."); +*/ + if (flags.verbose) You("扉を蹴った."); exercise(A_STR, FALSE); maploc->doormask = D_NODOOR; +/*JP b_trapped("door", FOOT); +*/ + b_trapped("扉", FOOT); } else if(ACURR(A_STR) > 18 && !rn2(5) && !shopdoor) { +/*JP pline("As you kick the door, it shatters to pieces!"); +*/ + pline("扉を蹴ると,こなごなにくだけた!"); exercise(A_STR, TRUE); maploc->doormask = D_NODOOR; } else { +/*JP pline("As you kick the door, it crashes open!"); +*/ + pline("扉を蹴ると,壊れて開いた!"); exercise(A_STR, TRUE); maploc->doormask = D_BROKEN; } @@ -1067,7 +1426,10 @@ unblock_point(x,y); /* vision */ if (shopdoor) { add_damage(x, y, 400L); +/*JP pay_for_damage("break", FALSE); +*/ + pay_for_damage("破壊する", FALSE); } if (in_town(x, y)) for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { @@ -1077,10 +1439,19 @@ couldsee(mtmp->mx, mtmp->my) && mtmp->mpeaceful) { if (canspotmon(mtmp)) +/*JP pline("%s yells:", Amonnam(mtmp)); +*/ + pline("%sは叫んだ:", Amonnam(mtmp)); else +/*JP You_hear("someone yell:"); +*/ + You_hear("誰かが叫んでいるのを聞いた:"); +/*JP verbalize("Halt, thief! You're under arrest!"); +*/ + verbalize("止まれ泥棒!おまえを逮捕する!"); (void) angry_guards(FALSE); break; } @@ -1088,7 +1459,10 @@ } else { if (Blind) feel_location(x,y); /* we know we hit it */ exercise(A_STR, TRUE); +/*JP pline("WHAMMM!!!"); +*/ + pline("ぐぁぁぁん!"); if (in_town(x, y)) for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; @@ -1096,14 +1470,26 @@ mtmp->data == &mons[PM_WATCH_CAPTAIN]) && mtmp->mpeaceful && couldsee(mtmp->mx, mtmp->my)) { if (canspotmon(mtmp)) +/*JP pline("%s yells:", Amonnam(mtmp)); +*/ + pline("%sは叫んだ:", Amonnam(mtmp)); else +/*JP You_hear("someone yell:"); +*/ + You_hear("誰かが叫んでいるのを聞いた:"); if(levl[x][y].looted & D_WARNED) { +/*JP verbalize("Halt, vandal! You're under arrest!"); +*/ + verbalize("止まれ野蛮人!おまえを逮捕する!"); (void) angry_guards(FALSE); } else { +/*JP verbalize("Hey, stop damaging that door!"); +*/ + verbalize("おい,扉を破壊するのをやめろ!"); levl[x][y].looted |= D_WARNED; } break; @@ -1225,38 +1611,73 @@ } if (dct && cansee(x,y)) { /* at least one object fell */ +/*JP const char *what = (dct == 1L ? "object falls" : "objects fall"); +*/ + const char *what = "物"; if (missile) +#if 0 /*JP*/ pline("From the impact, %sother %s.", dct == oct ? "the " : dct == 1L ? "an" : "", what); +#else + pline("衝撃で,他の%sが落ちた.",what); +#endif else if (oct == dct) +#if 0 /*JP*/ pline("%s adjacent %s %s.", dct == 1L ? "The" : "All the", what, gate_str); +#else + pline("近くにあった%sが%s落ちた.", + what, gate_str); +#endif else +#if 0 /*JP*/ pline("%s adjacent %s %s.", dct == 1L ? "One of the" : "Some of the", dct == 1L ? "objects falls" : what, gate_str); +#else + pline("近くにあった%s%s%s落ちた.", + what, + dct == 1L ? "が" : "のいくつかが", + gate_str); +#endif } if(costly && shkp && price) { if(ESHK(shkp)->robbed > robbed) { +/*JP You("removed %ld %s worth of goods!", price, currency(price)); +*/ + You("%ld%s分の品物を取りさった!", price, currency(price)); if(cansee(shkp->mx, shkp->my)) { if(ESHK(shkp)->customer[0] == 0) (void) strncpy(ESHK(shkp)->customer, plname, PL_NSIZ); if(angry) +/*JP pline("%s is infuriated!", Monnam(shkp)); +*/ + pline("%sは激怒した!", Monnam(shkp)); +/*JP else pline("\"%s, you are a thief!\"", plname); +*/ + else pline("「%sめ,おまえは泥棒だな!」", plname); +/*JP } else You_hear("a scream, \"Thief!\""); +*/ + } else You_hear("金切り声を聞いた「泥棒!」"); hot_pursuit(shkp); (void) angry_guards(FALSE); return; } if(ESHK(shkp)->debit > debit) { long amt = (ESHK(shkp)->debit - debit); +#if 0 /*JP*/ You("owe %s %ld %s for goods lost.", +#else + You("品物消失のため%sに%ld%sの借りをつくった.", +#endif Monnam(shkp), amt, currency(amt)); } @@ -1351,14 +1772,23 @@ ) { if (otmp->otyp == MIRROR) change_luck(-2); +/*JP result = "crash"; +*/ + result = "グシャッ"; } else { /* penalty for breaking eggs laid by you */ if (otmp->otyp == EGG && otmp->spe && otmp->corpsenm >= LOW_PM) change_luck((schar) -min(otmp->quan, 5L)); +/*JP result = "splat"; +*/ + result = "ベチャッ"; } +/*JP You_hear("a muffled %s.",result); +*/ + You_hear("こもった%sという音を聞いた.", result); obj_extract_self(otmp); obfree(otmp, (struct obj *) 0); return TRUE; @@ -1436,24 +1866,42 @@ { char obuf[BUFSZ]; +#if 0 /*JP*/ Sprintf(obuf, "%s%s", (otmp->otyp == CORPSE && type_is_pname(&mons[otmp->corpsenm])) ? "" : "The ", xname(otmp)); +#else + Sprintf(obuf, "%sは", xname(otmp)); +#endif if(num) { /* means: other objects are impacted */ +#if 0 /*JP*/ Sprintf(eos(obuf), " %s %s object%s", otense(otmp, "hit"), num == 1L ? "another" : "other", num > 1L ? "s" : ""); +#else + Sprintf(eos(obuf), "他の物体に命中して"); +#endif if(nodrop) +/*JP Sprintf(eos(obuf), "."); +*/ + Sprintf(eos(obuf), "止まった."); else +#if 0 /*JP*/ Sprintf(eos(obuf), " and %s %s.", otense(otmp, "fall"), gate_str); +#else + Sprintf(eos(obuf), "%s落ちた.", gate_str); +#endif pline("%s", obuf); } else if(!nodrop) +/*JP pline("%s %s %s.", obuf, otense(otmp, "fall"), gate_str); +*/ + pline("%s%s落ちた.", obuf, gate_str); } /* migration destination for objects which fall down to next level */ @@ -1470,19 +1918,28 @@ if ((xdnstair == x && ydnstair == y) || (sstairs.sx == x && sstairs.sy == y && !sstairs.up)) { +/*JP gate_str = "down the stairs"; +*/ + gate_str = "階段から"; return (xdnstair == x && ydnstair == y) ? MIGR_STAIRS_UP : MIGR_SSTAIRS; } if (xdnladder == x && ydnladder == y) { +/*JP gate_str = "down the ladder"; +*/ + gate_str = "はしごから"; return MIGR_LADDER_UP; } if (((ttmp = t_at(x, y)) != 0 && ttmp->tseen) && (ttmp->ttyp == TRAPDOOR || ttmp->ttyp == HOLE)) { gate_str = (ttmp->ttyp == TRAPDOOR) ? +/*JP "through the trap door" : "through the hole"; +*/ + "落し扉に" : "穴に"; return MIGR_RANDOM; } return MIGR_NOWHERE; diff -aurbN -xCVS -xXTAGS nethack/src/dothrow.c jnethack/src/dothrow.c --- nethack/src/dothrow.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/dothrow.c 2005-06-05 07:14:17.000000000 +0900 @@ -4,6 +4,14 @@ /* Contains code for 't' (throw) */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** changing point is marked `JP' (94/6/7) +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "edog.h" @@ -75,28 +83,47 @@ if(obj->oclass == COIN_CLASS && obj != uquiver) return(throw_gold(obj)); #endif +/*JP if(!canletgo(obj,"throw")) +*/ + if(!canletgo(obj,"投げる")) return(0); if (obj->oartifact == ART_MJOLLNIR && obj != uwep) { +/*JP pline("%s must be wielded before it can be thrown.", +*/ + pline("投げる前に%sを装備しなくてはならない.", The(xname(obj))); return(0); } if ((obj->oartifact == ART_MJOLLNIR && ACURR(A_STR) < STR19(25)) || (obj->otyp == BOULDER && !throws_rocks(youmonst.data))) { +/*JP pline("It's too heavy."); +*/ + pline("重すぎて投げられない."); return(1); } if(!u.dx && !u.dy && !u.dz) { +/*JP You("cannot throw an object at yourself."); +*/ + pline("自分に向かっては投げられない."); return(0); } u_wipe_engr(2); if (!uarmg && !Stone_resistance && (obj->otyp == CORPSE && touch_petrifies(&mons[obj->corpsenm]))) { +#if 0 /*JP*/ You("throw the %s corpse with your bare %s.", mons[obj->corpsenm].mname, body_part(HAND)); Sprintf(killer_buf, "%s corpse", an(mons[obj->corpsenm].mname)); +#else + You("素%sで%sの死体を投げた.", + body_part(HAND), jtrns_mon(mons[obj->corpsenm].mname)); + Sprintf(killer_buf, "%sの死体を素手で投げて", + jtrns_mon(mons[obj->corpsenm].mname)); +#endif instapetrify(killer_buf); } if (welded(obj)) { @@ -154,10 +181,17 @@ attempted to specify a count */ if (multishot > 1 || shotlimit > 0) { /* "You shoot N arrows." or "You throw N daggers." */ +#if 0 /*JP*/ You("%s %d %s.", m_shot.s ? "shoot" : "throw", multishot, /* (might be 1 if player gave shotlimit) */ (multishot == 1) ? singular(obj, xname) : xname(obj)); +#else + You("%d%sの%sを%s.", + multishot, /* (might be 1 if player gave shotlimit) */ + numeral(obj), xname(obj), + m_shot.s ? "撃った" : "投げた"); +#endif } wep_mask = obj->owornmask; @@ -204,7 +238,10 @@ multi = 0; /* reset; it's been used up */ if (notake(youmonst.data)) { +/*JP You("are physically incapable of throwing anything."); +*/ + You("何かを投げるのは物理的に無理だ."); return 0; } @@ -291,7 +328,10 @@ int shotlimit; if (notake(youmonst.data)) { +/*JP You("are physically incapable of doing that."); +*/ + pline("それは物理的に無理だ."); return 0; } @@ -299,15 +339,24 @@ if (!uquiver) { if (!flags.autoquiver) { /* Don't automatically fill the quiver */ +/*JP You("have no ammunition readied!"); +*/ + You("発射準備が整っていない!"); return(dothrow()); } autoquiver(); if (!uquiver) { +/*JP You("have nothing appropriate for your quiver!"); +*/ + You("発射するものがない!"); return(dothrow()); } else { +/*JP You("fill your quiver:"); +*/ + You("装填した:"); prinv((char *)0, uquiver, 0L); } } @@ -344,8 +393,13 @@ if (IS_ALTAR(levl[u.ux][u.uy].typ)) doaltarobj(obj); else +#if 0 /*JP*/ pline("%s hit%s the %s.", Doname2(obj), (obj->quan == 1L) ? "s" : "", surface(u.ux,u.uy)); +#else + pline("%sは%sに命中した.", Doname2(obj), + surface(u.ux,u.uy)); +#endif if (hero_breaks(obj, u.ux, u.uy, TRUE)) return; if (ship_object(obj, u.ux, u.uy, FALSE)) return; @@ -455,7 +509,10 @@ struct trap *ttmp; if (!isok(x,y)) { +/*JP You_feel("the spirits holding you back."); +*/ + You_feel("あなたを捕まえていた魂が戻った気がした."); return FALSE; } else if (!in_out_region(x, y)) { return FALSE; @@ -467,30 +524,60 @@ if (IS_ROCK(levl[x][y].typ) || closed_door(x,y)) { const char *s; +/*JP pline("Ouch!"); +*/ + pline("いてっ!"); if (IS_TREE(levl[x][y].typ)) +/*JP s = "bumping into a tree"; +*/ + s = "木にぶちあたって"; else if (IS_ROCK(levl[x][y].typ)) +/*JP s = "bumping into a wall"; +*/ + s = "壁にぶちあたって"; else +/*JP s = "bumping into a door"; +*/ + s = "扉にぶちあたって"; losehp(rnd(2+*range), s, KILLED_BY); return FALSE; } if (levl[x][y].typ == IRONBARS) { +/*JP You("crash into some iron bars. Ouch!"); +*/ + You("鉄の棒にぶちあたった.いてっ!"); +/*JP losehp(rnd(2+*range), "crashing into iron bars", KILLED_BY); +*/ + losehp(rnd(2+*range), "鉄の棒にぶちあたって", KILLED_BY); return FALSE; } if ((obj = sobj_at(BOULDER,x,y)) != 0) { +/*JP You("bump into a %s. Ouch!", xname(obj)); +*/ + You("%sにぶちあたった.いてっ!", xname(obj)); +/*JP losehp(rnd(2+*range), "bumping into a boulder", KILLED_BY); +*/ + losehp(rnd(2+*range), "岩にぶちあたって", KILLED_BY); return FALSE; } if (!may_pass) { /* did we hit a no-dig non-wall position? */ +/*JP You("smack into something!"); +*/ + You("何かにぶちあたった!"); +/*JP losehp(rnd(2+*range), "touching the edge of the universe", KILLED_BY); +*/ + losehp(rnd(2+*range), "世界の果てに触れて", KILLED_BY); return FALSE; } if ((u.ux - x) && (u.uy - y) && @@ -498,16 +585,27 @@ boolean too_much = (invent && (inv_weight() + weight_cap() > 600)); /* Move at a diagonal. */ if (bigmonst(youmonst.data) || too_much) { +#if 0 /*JP*/ You("%sget forcefully wedged into a crevice.", too_much ? "and all your belongings " : ""); +#else + You("%sはむりやりすき間に押し込められた.", + too_much ? "と全部の荷物" : ""); +#endif +/*JP losehp(rnd(2+*range), "wedging into a narrow crevice", KILLED_BY); +*/ + losehp(rnd(2+*range), "狭いすき間に押し込められて", KILLED_BY); return FALSE; } } } if ((mon = m_at(x, y)) != 0) { +/*JP You("bump into %s.", a_monnam(mon)); +*/ + You("%sにぶちあたった.", a_monnam(mon)); wakeup(mon); return FALSE; } @@ -515,7 +613,10 @@ bad_rock(youmonst.data,u.ux,y) && bad_rock(youmonst.data,x,u.uy)) { /* Move at a diagonal. */ if (In_sokoban(&u.uz)) { +/*JP You("come to an abrupt halt!"); +*/ + You("とつぜん停止した!"); return FALSE; } } @@ -550,9 +651,14 @@ return TRUE; } else { if (ttmp->tseen) +#if 0 /*JP*/ You("pass right over %s %s.", (ttmp->ttyp == ARROW_TRAP) ? "an" : "a", defsyms[trap_to_defsym(ttmp->ttyp)].explanation); +#else + You("%sの真上を通過した.", + jtrns_obj('^', defsyms[trap_to_defsym(ttmp->ttyp)].explanation)); +#endif } } if (--*range < 0) /* make sure our range never goes negative */ @@ -607,13 +713,22 @@ * for diagonal movement, give the player a message and return. */ if(Punished && !carried(uball)) { +/*JP You_feel("a tug from the iron ball."); +*/ + You_feel("鉄球にひっぱられているような気がした."); nomul(0); return; } else if (u.utrap) { +#if 0 /*JP*/ You("are anchored by the %s.", u.utraptype == TT_WEB ? "web" : u.utraptype == TT_LAVA ? "lava" : u.utraptype == TT_INFLOOR ? surface(u.ux,u.uy) : "trap"); +#else + You("%sに据えつけられている.", + u.utraptype == TT_WEB ? "くもの巣" : u.utraptype == TT_LAVA ? "溶岩" : + u.utraptype == TT_INFLOOR ? surface(u.ux,u.uy) : "罠"); +#endif nomul(0); return; } @@ -626,12 +741,20 @@ nomul(-range); if (verbose) +/*JP You("%s in the opposite direction.", range > 1 ? "hurtle" : "float"); +*/ + You("逆方向に飛ばされた."); /* if we're in the midst of shooting multiple projectiles, stop */ if (m_shot.i < m_shot.n) { /* last message before hurtling was "you shoot N arrows" */ +#if 0 /*JP*/ You("stop %sing after the first %s.", m_shot.s ? "shoot" : "throw", m_shot.s ? "shot" : "toss"); +#else + You("ひとつ目を%sところで残りを%sのをやめた.", + m_shot.s ? "撃った" : "投げた", m_shot.s ? "撃つ" : "投げる"); +#endif m_shot.n = m_shot.i; /* make current shot be the last */ } if (In_sokoban(&u.uz)) @@ -728,16 +851,25 @@ if (hitsroof) { if (breaktest(obj)) { +/*JP pline("%s hits the %s.", Doname2(obj), ceiling(u.ux, u.uy)); +*/ + pline("%sは%sに命中した.", Doname2(obj), ceiling(u.ux, u.uy)); breakmsg(obj, !Blind); breakobj(obj, u.ux, u.uy, TRUE, TRUE); return FALSE; } almost = ""; } else { +/*JP almost = " almost"; +*/ + almost = "もう少しで"; } +/*JP pline("%s%s hits the %s, then falls back on top of your %s.", +*/ + pline("%sは%s%sに命中した,そして%sの上に落ちてきた.", Doname2(obj), almost, ceiling(u.ux,u.uy), body_part(HEAD)); /* object now hits you */ @@ -764,10 +896,16 @@ goto petrify; case CREAM_PIE: case BLINDING_VENOM: +/*JP pline("You've got it all over your %s!", body_part(FACE)); +*/ + pline("それは%sをべっとりと覆った!", body_part(FACE)); if (blindinc) { if (otyp == BLINDING_VENOM && !Blind) +/*JP pline("It blinds you!"); +*/ + pline("目が見えなくなった!"); u.ucreamed += blindinc; make_blinded(Blinded + (long)blindinc, FALSE); if (!Blind) Your(vision_clears); @@ -802,24 +940,41 @@ if (uarmh) { if (less_damage && dmg < (Upolyd ? u.mh : u.uhp)) { if (!artimsg) +/*JP pline("Fortunately, you are wearing a hard helmet."); +*/ + pline("幸運にも,あなたは固い兜を身につけていた."); } else if (flags.verbose && !(obj->otyp == CORPSE && touch_petrifies(&mons[obj->corpsenm]))) +/*JP Your("%s does not protect you.", xname(uarmh)); +*/ + Your("%sでは防ぎきれなかった.", xname(uarmh)); } else if (obj->otyp == CORPSE && touch_petrifies(&mons[obj->corpsenm])) { if (!Stone_resistance && !(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))) { petrify: killer_format = KILLED_BY; +#if 0 /*JP*/ killer = "elementary physics"; /* "what goes up..." */ +#else + killer = "初等物理により"; /* "what goes up..." */ +#endif +/*JP You("turn to stone."); +*/ + You("石になった."); if (obj) dropy(obj); /* bypass most of hitfloor() */ done(STONING); return obj ? TRUE : FALSE; } } hitfloor(obj); +#if 0 /*JP*/ losehp(dmg, "falling object", KILLED_BY_AN); +#else + losehp(dmg, "落下物で", KILLED_BY_AN); +#endif } return TRUE; } @@ -870,13 +1025,19 @@ if ((obj->cursed || obj->greased) && (u.dx || u.dy) && !rn2(7)) { boolean slipok = TRUE; if (ammo_and_launcher(obj, uwep)) +/*JP pline("%s!", Tobjnam(obj, "misfire")); +*/ + pline("%sははずれた!", xname(obj)); else { /* only slip if it's greased or meant to be thrown */ if (obj->greased || throwing_weapon(obj)) /* BUG: this message is grammatically incorrect if obj has a plural name; greased gloves or boots for instance. */ +/*JP pline("%s as you throw it!", Tobjnam(obj, "slip")); +*/ + pline("%sを投げようとしたが,ずり落ちてしまった!", xname(obj)); else slipok = FALSE; } if (slipok) { @@ -893,7 +1054,10 @@ : (u.uhp < 10 && u.uhp != u.uhpmax)) && obj->owt > (unsigned)((Upolyd ? u.mh : u.uhp) * 2) && !Is_airlevel(&u.uz)) { +/*JP You("have so little stamina, %s drops from your grasp.", +*/ + You("握力がなくなっていたので,%sを握りそこねて落とした.", the(xname(obj))); exercise(A_CON, FALSE); u.dx = u.dy = 0; @@ -909,8 +1073,13 @@ } else if(u.dz) { if (u.dz < 0 && Role_if(PM_VALKYRIE) && obj->oartifact == ART_MJOLLNIR && !impaired) { +#if 0 /*JP*/ pline("%s the %s and returns to your hand!", Tobjnam(obj, "hit"), ceiling(u.ux,u.uy)); +#else + pline("%sは%sに命中しあなたの手に戻ってきた!", + xname(obj), ceiling(u.ux,u.uy)); +#endif obj = addinv(obj); (void) encumber_msg(); setuwep(obj); @@ -1024,7 +1193,10 @@ sho_obj_return_to_u(obj); /* display its flight */ if (!impaired && rn2(100)) { +/*JP pline("%s to your hand!", Tobjnam(obj, "return")); +*/ + pline("%sはあなたの手に戻ってきた!", xname(obj)); obj = addinv(obj); (void) encumber_msg(); setuwep(obj); @@ -1034,21 +1206,44 @@ } else { int dmg = rn2(2); if (!dmg) { +#if 0 /*JP*/ pline(Blind ? "%s lands %s your %s." : "%s back to you, landing %s your %s.", Blind ? Something : Tobjnam(obj, "return"), Levitation ? "beneath" : "at", makeplural(body_part(FOOT))); +#else + pline("%sは%sあなたの%sの%sに落ちた.", + xname(obj), + Blind ? "" : "戻ってきて,", + body_part(FOOT), + Levitation ? "下" : "そば"); +#endif } else { dmg += rnd(3); +#if 0 /*JP*/ pline(Blind ? "%s your %s!" : "%s back toward you, hitting your %s!", Tobjnam(obj, Blind ? "hit" : "fly"), body_part(ARM)); +#else + pline("%sは%sあなたの%sに命中した!", + xname(obj), + Blind ? "" : "戻ってきて,", + body_part(ARM)); +#endif (void) artifact_hit((struct monst *)0, &youmonst, obj, &dmg, 0); +#if 0 /*JP*/ losehp(dmg, xname(obj), obj_is_pname(obj) ? KILLED_BY : KILLED_BY_AN); +#else + { + char jbuf[BUFSZ]; + Sprintf(jbuf, "%sで", xname(obj)); + losehp(dmg, jbuf, KILLED_BY); + } +#endif } if (ship_object(obj, u.ux, u.uy, FALSE)) { thrownobj = (struct obj*)0; @@ -1070,12 +1265,20 @@ breakobj(obj, bhitpos.x, bhitpos.y, TRUE, TRUE); return; } +/*JP if(flooreffects(obj,bhitpos.x,bhitpos.y,"fall")) return; +*/ + if(flooreffects(obj,bhitpos.x,bhitpos.y,"落ちる")) return; obj_no_longer_held(obj); if (mon && mon->isshk && is_pick(obj)) { if (cansee(bhitpos.x, bhitpos.y)) +#if 0 /*JP*/ pline("%s snatches up %s.", Monnam(mon), the(xname(obj))); +#else + pline("%sは%sを奪いとった.", + Monnam(mon), the(xname(obj))); +#endif if(*u.ushops) check_shop_obj(obj, bhitpos.x, bhitpos.y, FALSE); (void) mpickobj(mon, obj); /* may merge and free obj */ @@ -1159,7 +1362,10 @@ an arrow just landing short of any target (no message in that case), so will realize that there is a valid target here anyway. */ if (!canseemon(mon) || (mon->m_ap_type && mon->m_ap_type != M_AP_MONSTER)) +/*JP pline("%s %s.", The(missile), otense(obj, "miss")); +*/ + pline("%sははずれた.", The(missile)); else miss(missile, mon); if (!rn2(3)) wakeup(mon); @@ -1238,10 +1444,16 @@ if (obj->oclass == GEM_CLASS && is_unicorn(mon->data)) { if (mon->mtame) { +/*JP pline("%s catches and drops %s.", Monnam(mon), the(xname(obj))); +*/ + pline("%sは%sをくわえて置いた.", Monnam(mon), the(xname(obj))); return 0; } else { +/*JP pline("%s catches %s.", Monnam(mon), the(xname(obj))); +*/ + pline("%sは%sをくわえた.", Monnam(mon), the(xname(obj))); return gem_accept(mon, obj); } } @@ -1254,13 +1466,21 @@ mon->mstrategy &= ~STRAT_WAITMASK; if (mon->mcanmove) { +/*JP pline("%s catches %s.", Monnam(mon), the(xname(obj))); +*/ + pline("%sは%sを掴んだ.", Monnam(mon), the(xname(obj))); if (mon->mpeaceful) { boolean next2u = monnear(mon, u.ux, u.uy); finish_quest(obj); /* acknowledge quest completion */ +#if 0 /*JP*/ pline("%s %s %s back to you.", Monnam(mon), (next2u ? "hands" : "tosses"), the(xname(obj))); +#else + pline("%sは%sをあなたに返した.", Monnam(mon), + the(xname(obj))); +#endif if (!next2u) sho_obj_return_to_u(obj); obj = addinv(obj); /* back into your inventory */ (void) encumber_msg(); @@ -1401,9 +1621,15 @@ } } } +#if 0 /*JP*/ pline("%s into %s %s.", Tobjnam(obj, "vanish"), s_suffix(mon_nam(mon)), is_animal(u.ustuck->data) ? "entrails" : "currents"); +#else + pline("%sは%sの%sへ消えた.", + xname(obj), mon_nam(mon), + is_animal(u.ustuck->data) ? "内臓の中" : "流れ"); +#endif } else { tmiss(obj, mon); } @@ -1420,13 +1646,24 @@ boolean is_buddy = sgn(mon->data->maligntyp) == sgn(u.ualign.type); boolean is_gem = objects[obj->otyp].oc_material == GEMSTONE; int ret = 0; +#if 0 /*JP*/ static NEARDATA const char nogood[] = " is not interested in your junk."; static NEARDATA const char acceptgift[] = " accepts your gift."; static NEARDATA const char maybeluck[] = " hesitatingly"; static NEARDATA const char noluck[] = " graciously"; static NEARDATA const char addluck[] = " gratefully"; +#else + static NEARDATA const char nogood[] = "あなたのガラクタに興味を示さない."; + static NEARDATA const char acceptgift[] = "あなたの贈り物を受けとった."; + static NEARDATA const char maybeluck[] = "ためらいながら"; + static NEARDATA const char noluck[] = "丁重に"; + static NEARDATA const char addluck[] = "喜んで"; +#endif Strcpy(buf,Monnam(mon)); +#if 1 /*JP*/ + Strcat(buf,"は"); +#endif mon->mpeaceful = 1; mon->mavenge = 0; @@ -1570,13 +1807,20 @@ if (obj->otyp != POT_WATER) { if (!breathless(youmonst.data)) /* [what about "familiar odor" when known?] */ +/*JP You("smell a peculiar odor..."); +*/ + You("薬っぽい匂いがした..."); else { +#if 0 /*JP*/ int numeyes = eyecount(youmonst.data); Your("%s water%s.", (numeyes == 1) ? body_part(EYE) : makeplural(body_part(EYE)), (numeyes == 1) ? "s" : ""); +#else + You("涙%sになった.", body_part(EYE)); +#endif } } potionbreathe(obj); @@ -1653,7 +1897,13 @@ { const char *to_pieces; +#if 0 /*JP*/ to_pieces = ""; +#else + /* "shatter" → "こなごなになった" + "shatter into a thousand pieces" → "くだけてばらばらになった" */ + to_pieces = "こなごな"; +#endif switch (obj->oclass == POTION_CLASS ? POT_WATER : obj->otyp) { default: /* glass or crystal wand */ if (obj->oclass != WAND_CLASS) @@ -1665,25 +1915,44 @@ #ifdef TOURIST case EXPENSIVE_CAMERA: #endif +/*JP to_pieces = " into a thousand pieces"; +*/ + to_pieces = "くだけてばらばら"; /*FALLTHRU*/ case POT_WATER: /* really, all potions */ if (!in_view) +/*JP You_hear("%s shatter!", something); +*/ + You_hear("%sが壊れる音を聞いた!", something); else +#if 0 /*JP*/ pline("%s shatter%s%s!", Doname2(obj), (obj->quan==1) ? "s" : "", to_pieces); +#else + pline("%sは%sになった!", Doname2(obj), to_pieces); +#endif break; case EGG: case MELON: +/*JP pline("Splat!"); +*/ + pline("ビチャ!"); break; case CREAM_PIE: +/*JP if (in_view) pline("What a mess!"); +*/ + if (in_view) pline("こりゃひどい!"); break; case ACID_VENOM: case BLINDING_VENOM: +/*JP pline("Splash!"); +*/ + pline("ビチャ!"); break; } } @@ -1704,7 +1973,10 @@ flags.botl = 1; dealloc_obj(obj); #endif +/*JP You("cannot throw gold at yourself."); +*/ + pline("自分に金貨を投げることはできない."); return(0); } #ifdef GOLDOBJ @@ -1712,13 +1984,25 @@ #endif if(u.uswallow) { pline(is_animal(u.ustuck->data) ? +#if 0 /*JP*/ "%s in the %s's entrails." : "%s into %s.", +#else + "%sは%sの腹の中へ消えていった." : "%sは%sの中へ消えていった.", +#endif #ifndef GOLDOBJ +#if 0 /*JP*/ "The gold disappears", mon_nam(u.ustuck)); +#else + "金貨", mon_nam(u.ustuck)); +#endif u.ustuck->mgold += zorks; dealloc_obj(obj); #else +#if 0 /*JP*/ "The money disappears", mon_nam(u.ustuck)); +#else + "お金", mon_nam(u.ustuck)); +#endif add_to_minv(u.ustuck, obj); #endif return(1); @@ -1727,10 +2011,16 @@ if(u.dz) { if (u.dz < 0 && !Is_airlevel(&u.uz) && !Underwater && !Is_waterlevel(&u.uz)) { +/*JP pline_The("gold hits the %s, then falls back on top of your %s.", +*/ + pline("金貨は%sに命中し,あなたの%sの真上に落ちてきた.", ceiling(u.ux,u.uy), body_part(HEAD)); /* some self damage? */ +/*JP if(uarmh) pline("Fortunately, you are wearing a helmet!"); +*/ + if(uarmh) pline("幸運なことに,あなたは兜を身につけている!"); } bhitpos.x = u.ux; bhitpos.y = u.uy; @@ -1759,9 +2049,15 @@ } } +/*JP if(flooreffects(obj,bhitpos.x,bhitpos.y,"fall")) return(1); +*/ + if(flooreffects(obj,bhitpos.x,bhitpos.y,"落ちる")) return(1); if(u.dz > 0) +/*JP pline_The("gold hits the %s.", surface(bhitpos.x,bhitpos.y)); +*/ + pline("金貨は%sに命中した.", surface(bhitpos.x,bhitpos.y)); place_object(obj,bhitpos.x,bhitpos.y); if(*u.ushops) sellobj(obj, bhitpos.x, bhitpos.y); stackobj(obj); diff -aurbN -xCVS -xXTAGS nethack/src/drawing.c jnethack/src/drawing.c --- nethack/src/drawing.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/drawing.c 2003-12-10 03:31:25.000000000 +0900 @@ -2,6 +2,12 @@ /* Copyright (c) NetHack Development Team 1992. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "tcap.h" @@ -189,6 +195,7 @@ }; const struct symdef def_warnsyms[WARNCOUNT] = { +#if 0 /*JP*/ {'0', "unknown creature causing you worry", C(CLR_WHITE)}, /* white warning */ {'1', "unknown creature causing you concern", C(CLR_RED)}, /* pink warning */ {'2', "unknown creature causing you anxiety", C(CLR_RED)}, /* red warning */ @@ -197,6 +204,15 @@ C(CLR_MAGENTA)}, /* purple warning */ {'5', "unknown creature causing you dread", C(CLR_BRIGHT_MAGENTA)} /* black warning */ +#else + {'0', "あなたが気にしている謎の怪物", C(CLR_WHITE)}, /* white warning */ + {'1', "あなたが心配している謎の怪物", C(CLR_RED)}, /* pink warning */ + {'2', "あなたが懸念している謎の怪物", C(CLR_RED)}, /* red warning */ + {'3', "あなたが気をもんでいる謎の怪物", C(CLR_RED)}, /* ruby warning */ + {'4', "あなたが恐れている謎の怪物", C(CLR_MAGENTA)}, /* purple warning */ + {'5', "あなたが非常に恐れている謎の怪物", + C(CLR_BRIGHT_MAGENTA)} /* black warning */ +#endif }; /* @@ -314,6 +330,7 @@ void NDECL((*ibmgraphics_mode_callback)) = 0; /* set in tty_start_screen() */ #endif /* PC9800 */ +#if 0/*JP*/ static uchar ibm_graphics[MAXPCHARS] = { /* 0*/ g_FILLER(S_stone), 0xb3, /* S_vwall: meta-3, vertical rule */ @@ -408,6 +425,7 @@ /*90*/ g_FILLER(S_explode8), g_FILLER(S_explode9) }; +#endif #endif /* ASCIIGRAPH */ #ifdef TERMLIB @@ -663,6 +681,7 @@ if (ascgraphics_mode_callback) (*ascgraphics_mode_callback)(); #endif break; +#if 0 /*JP*/ #ifdef ASCIIGRAPH case IBM_GRAPHICS: /* @@ -680,6 +699,7 @@ #endif break; #endif /* ASCIIGRAPH */ +#endif /*JP*/ #ifdef TERMLIB case DEC_GRAPHICS: /* @@ -731,6 +751,7 @@ VENOM_SYM }; +#if 0 /*JP*/ # ifdef ASCIIGRAPH /* Rogue level graphics. Under IBM graphics mode, use the symbols that were * used for Rogue on the IBM PC. Unfortunately, this can't be completely @@ -774,6 +795,7 @@ VENOM_SYM }; # endif /* ASCIIGRAPH */ +#endif /*JP*/ void assign_rogue_graphics(is_rlevel) @@ -794,6 +816,7 @@ /* Use a loop: char != uchar on some machines. */ for (i = 0; i < MAXMCLASSES; i++) monsyms[i] = def_monsyms[i]; +#if 0 /*JP*/ # if defined(ASCIIGRAPH) && !defined(MSWIN_GRAPHICS) if (iflags.IBMgraphics # if defined(USE_TILES) && defined(MSDOS) @@ -802,6 +825,7 @@ ) monsyms[S_HUMAN] = 0x01; /* smiley face */ # endif +#endif for (i = 0; i < MAXPCHARS; i++) showsyms[i] = defsyms[i].sym; @@ -811,6 +835,7 @@ * all of this info and to simply initialize it via a for() loop like r_oc_syms. */ +#if 0 /*JP*/ # ifdef ASCIIGRAPH if (!iflags.IBMgraphics # if defined(USE_TILES) && defined(MSDOS) @@ -818,8 +843,10 @@ # endif ) { # endif +#endif /*JP*/ showsyms[S_vodoor] = showsyms[S_hodoor] = showsyms[S_ndoor] = '+'; showsyms[S_upstair] = showsyms[S_dnstair] = '%'; +#if 0 /*JP*/ # ifdef ASCIIGRAPH } else { /* a la EPYX Rogue */ @@ -868,8 +895,10 @@ #endif } #endif /* ASCIIGRAPH */ +#endif /* JP */ for (i = 0; i < MAXOCLASSES; i++) { +#if 0 /* JP */ #ifdef ASCIIGRAPH if (iflags.IBMgraphics # if defined(USE_TILES) && defined(MSDOS) @@ -879,6 +908,7 @@ oc_syms[i] = IBM_r_oc_syms[i]; else #endif /* ASCIIGRAPH */ +#endif /* JP */ oc_syms[i] = r_oc_syms[i]; } #if defined(MSDOS) && defined(USE_TILES) diff -aurbN -xCVS -xXTAGS nethack/src/dungeon.c jnethack/src/dungeon.c --- nethack/src/dungeon.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/dungeon.c 2003-12-10 03:31:25.000000000 +0900 @@ -6,6 +6,11 @@ #include "dgn_file.h" #include "dlb.h" +#if defined(_MSC_VER) && !defined(WIN32) +#include "../japanese/emalloc.h" +#define alloc(s) emalloc(s) +#endif + #ifdef OVL1 #define DUNGEON_FILE "dungeon" diff -aurbN -xCVS -xXTAGS nethack/src/eat.c jnethack/src/eat.c --- nethack/src/eat.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/eat.c 2005-06-21 19:17:12.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" /* #define DEBUG */ /* uncomment to enable new eat code debugging */ @@ -79,6 +86,7 @@ STATIC_OVL boolean force_save_hs = FALSE; const char *hu_stat[] = { +#if 0 /*JP*/ "Satiated", " ", "Hungry ", @@ -86,6 +94,15 @@ "Fainting", "Fainted ", "Starved " +#else + "満腹 ", + " ", + "ぺこぺこ", + "衰弱 ", + "ふらふら", + "卒倒 ", + "餓死 " +#endif }; #endif /* OVLB */ @@ -130,6 +147,7 @@ } static const struct { const char *txt; int nut; } tintxts[] = { +#if 0 /*JP*/ {"deep fried", 60}, {"pickled", 40}, {"soup made from", 20}, @@ -149,6 +167,27 @@ {"broiled", 80}, {"smoked", 50}, {"", 0} +#else + {"の揚げ物", 60}, + {"の漬物", 40}, + {"のスープ", 20}, + {"のピューレ", 500}, +#define ROTTEN_TIN 4 + {"腐った", -50}, +#define HOMEMADE_TIN 5 + {"自家製の", 50}, + {"かき揚げ", 80}, + {"砂糖漬け", 100}, + {"ゆで", 50}, + {"乾燥", 55}, + {"四川風", 70}, +#define FRENCH_FRIED_TIN 11 + {"フレンチ風", 40}, + {"のソテー", 95}, + {"のテリヤキ", 80}, + {"の燻製", 50}, + {"", 0} +#endif }; #define TTSZ SIZE(tintxts) @@ -200,20 +239,28 @@ boolean the_pfx; { const char *result; +#if 0 /*JP*/ int mnum = food->corpsenm; if (food->otyp == CORPSE && (mons[mnum].geno & G_UNIQ)) { /* grab xname()'s modifiable return buffer for our own use */ char *bufp = xname(food); +#if 0 /*JP*/ Sprintf(bufp, "%s%s corpse", (the_pfx && !type_is_pname(&mons[mnum])) ? "the " : "", s_suffix(mons[mnum].mname)); +#else + Sprintf(bufp, "%sの死体", mons[mnum].mname); +#endif result = bufp; } else { +#endif /*JP*/ /* the ordinary case */ result = singular(food, xname); if (the_pfx) result = the(result); +#if 0 /*JP*/ } +#endif return result; } @@ -232,7 +279,10 @@ return; } else if (Role_if(PM_KNIGHT) && u.ualign.type == A_LAWFUL) { adjalign(-1); /* gluttony is unchivalrous */ +/*JP You_feel("like a glutton!"); +*/ + You("大食漢のような気がした!"); } exercise(A_CON, FALSE); @@ -240,10 +290,16 @@ if (Breathless || (!Strangled && !rn2(20))) { /* choking by eating AoS doesn't involve stuffing yourself */ if (food && food->otyp == AMULET_OF_STRANGULATION) { +/*JP You("choke, but recover your composure."); +*/ + You("首を絞められた.しかしなんともなかった."); return; } +/*JP You("stuff yourself and then vomit voluminously."); +*/ + pline("がつがつと口に詰め込んだが,ドバっと吐き出してしまった."); morehungry(1000); /* you just got *very* sick! */ nomovemsg = 0; vomit(); @@ -254,9 +310,15 @@ * high score list & tombstone. So plan accordingly. */ if(food) { +/*JP You("choke over your %s.", foodword(food)); +*/ + You("%sを喉に詰まらせてしまった.", foodword(food)); if (food->oclass == COIN_CLASS) { +/*JP killer = "a very rich meal"; +*/ + killer = "とても高価な料理"; } else { killer = food_xname(food, FALSE); if (food->otyp == CORPSE && @@ -267,10 +329,19 @@ } } } else { +/*JP You("choke over it."); +*/ + pline("喉に詰まらせてしまった."); +/*JP killer = "quick snack"; +*/ + killer = "早食い"; } +/*JP You("die..."); +*/ + pline("あなたは死にました..."); done(CHOKING); } } @@ -326,7 +397,10 @@ !otmp->no_charge) || otmp->unpaid)) { /* create a dummy duplicate to put on bill */ +/*JP verbalize("You bit it, you bought it!"); +*/ + verbalize("食べたのなら買ってもらうよ!"); bill_dummy_object(otmp); } otmp->oeaten = (otmp->otyp == CORPSE ? @@ -425,7 +499,10 @@ if (message) pline(nomovemsg); nomovemsg = 0; } else if (message) +/*JP You("finish eating %s.", food_xname(victual.piece, TRUE)); +*/ + You("%sを食べ終えた.", food_xname(victual.piece, TRUE)); if(victual.piece->otyp == CORPSE) cpostfx(victual.piece->corpsenm); @@ -446,8 +523,14 @@ if (!CANNIBAL_ALLOWED() && your_race(&mons[pm])) { if (allowmsg) { if (Upolyd) +/*JP You("have a bad feeling deep inside."); +*/ + You("嫌悪感におそわれた."); +/*JP You("cannibal! You will regret this!"); +*/ + pline("共喰いだ!後悔するぞ!"); } HAggravate_monster |= FROMOUTSIDE; change_luck(-rn1(4,2)); /* -5..-2 */ @@ -464,10 +547,16 @@ if (touch_petrifies(&mons[pm]) || pm == PM_MEDUSA) { if (!Stone_resistance && !(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))) { +/*JP Sprintf(killer_buf, "tasting %s meat", mons[pm].mname); +*/ + Sprintf(killer_buf, "%sの肉を食べ", jtrns_mon(mons[pm].mname)); killer_format = KILLED_BY; killer = killer_buf; +/*JP You("turn to stone."); +*/ + You("石になった."); done(STONING); if (victual.piece) victual.eating = FALSE; @@ -483,7 +572,10 @@ case PM_HOUSECAT: case PM_LARGE_CAT: if (!CANNIBAL_ALLOWED()) { +/*JP You_feel("that eating the %s was a bad idea.", mons[pm].mname); +*/ + pline("%sを食べるのはよくない気がした.", jtrns_mon(mons[pm].mname)); HAggravate_monster |= FROMOUTSIDE; } break; @@ -494,11 +586,22 @@ case PM_PESTILENCE: case PM_FAMINE: { char buf[BUFSZ]; +/*JP pline("Eating that is instantly fatal."); +*/ + pline("食べたらすぐに死んでしまった."); +#if 0 /*JP*/ Sprintf(buf, "unwisely ate the body of %s", mons[pm].mname); +#else + Sprintf(buf, "愚かにも%sを食べて", + jtrns_mon(mons[pm].mname)); +#endif killer = buf; +/*JP killer_format = NO_KILLER_PREFIX; +*/ + killer_format = KILLED_BY; done(DIED); /* It so happens that since we know these monsters */ /* cannot appear in tins, victual.piece will always */ @@ -510,7 +613,10 @@ case PM_GREEN_SLIME: if (!Slimed && !Unchanging && !flaming(youmonst.data) && youmonst.data != &mons[PM_GREEN_SLIME]) { +/*JP You("don't feel very well."); +*/ + You("すごく気分が悪い."); Slimed = 10L; flags.botl = 1; } @@ -528,10 +634,18 @@ Stoned = 0; delayed_killer = 0; if (Hallucination) +#if 0 /*JP*/ pline("What a pity - you just ruined a future piece of %sart!", ACURR(A_CHA) > 15 ? "fine " : ""); +#else + pline("なんてことだ!%s芸術作品になれたかもしれないのに!", + ACURR(A_CHA) > 15 ? "貴重な" : ""); +#endif else +/*JP You_feel("limber!"); +*/ + You("体が軟らかくなったような気がした!"); } /* @@ -682,8 +796,13 @@ debugpline("Trying to give fire resistance"); #endif if(!(HFire_resistance & FROMOUTSIDE)) { +#if 0 /*JP*/ You(Hallucination ? "be chillin'." : "feel a momentary chill."); +#else + You(Hallucination ? "「クール宅配便」されているようだ." : + "一瞬寒けがした."); +#endif HFire_resistance |= FROMOUTSIDE; } break; @@ -692,7 +811,10 @@ debugpline("Trying to give sleep resistance"); #endif if(!(HSleep_resistance & FROMOUTSIDE)) { +/*JP You_feel("wide awake."); +*/ + You("ぱっちり目がさめた."); HSleep_resistance |= FROMOUTSIDE; } break; @@ -701,7 +823,10 @@ debugpline("Trying to give cold resistance"); #endif if(!(HCold_resistance & FROMOUTSIDE)) { +/*JP You_feel("full of hot air."); +*/ + You("熱風を全身に感じた."); HCold_resistance |= FROMOUTSIDE; } break; @@ -711,8 +836,13 @@ #endif if(!(HDisint_resistance & FROMOUTSIDE)) { You_feel(Hallucination ? +#if 0 /*JP*/ "totally together, man." : "very firm."); +#else + "世界人類と兄弟になったような気がした." : + "とても頑丈になったような気がした."); +#endif HDisint_resistance |= FROMOUTSIDE; } break; @@ -722,9 +852,15 @@ #endif if(!(HShock_resistance & FROMOUTSIDE)) { if (Hallucination) +/*JP You_feel("grounded in reality."); +*/ + You("実はアースされているような気がした."); else +/*JP Your("health currently feels amplified!"); +*/ + pline("健康が増幅されたような気がした!"); HShock_resistance |= FROMOUTSIDE; } break; @@ -734,7 +870,10 @@ #endif if(!(HPoison_resistance & FROMOUTSIDE)) { You_feel(Poison_resistance ? +/*JP "especially healthy." : "healthy."); +*/ + "特に健康になった気がした." : "健康になった気がした."); HPoison_resistance |= FROMOUTSIDE; } break; @@ -743,8 +882,13 @@ debugpline("Trying to give teleport"); #endif if(!(HTeleportation & FROMOUTSIDE)) { +#if 0 /*JP*/ You_feel(Hallucination ? "diffuse." : "very jumpy."); +#else + pline(Hallucination ? "体が飛び散ったような気がした." : + "跳躍力が高まったような気がした."); +#endif HTeleportation |= FROMOUTSIDE; } break; @@ -754,8 +898,13 @@ #endif if(!(HTeleport_control & FROMOUTSIDE)) { You_feel(Hallucination ? +#if 0 /*JP*/ "centered in your personal space." : "in control of yourself."); +#else + "自己中心的になったような気がした." : + "自分自身を制御できるような気がした."); +#endif HTeleport_control |= FROMOUTSIDE; } break; @@ -765,8 +914,13 @@ #endif if(!(HTelepat & FROMOUTSIDE)) { You_feel(Hallucination ? +#if 0 /*JP*/ "in touch with the cosmos." : "a strange mental acuity."); +#else + "宇宙の神秘に触れたような気がした." : + "奇妙な精神的鋭さを感じた."); +#endif HTelepat |= FROMOUTSIDE; /* If blind, make sure monsters show up. */ if (Blind) see_monsters(); @@ -802,7 +956,10 @@ u.uen = u.uenmax; } if (old_uen != u.uen) { +/*JP You_feel("a mild buzz."); +*/ + You("すこしふらふらした."); flags.botl = 1; } } @@ -832,7 +989,10 @@ set_itimeout(&HInvis, (long)rn1(100, 50)); if (!Blind && !BInvis) self_invis_message(); } else { +/*JP if (!(HInvis & INTRINSIC)) You_feel("hidden!"); +*/ + if (!(HInvis & INTRINSIC)) Your("姿は隠された!"); HInvis |= FROMOUTSIDE; HSee_invisible |= FROMOUTSIDE; } @@ -856,17 +1016,29 @@ tmp += 20; if (youmonst.data->mlet != S_MIMIC && !Unchanging) { char buf[BUFSZ]; +#if 0 /*JP*/ You_cant("resist the temptation to mimic %s.", Hallucination ? "an orange" : "a pile of gold"); +#else + You("%sを真似したい誘惑にかられた.", + Hallucination ? "オレンジ" : "金貨の山"); +#endif #ifdef STEED /* A pile of gold can't ride. */ if (u.usteed) dismount_steed(DISMOUNT_FELL); #endif nomul(-tmp); +#if 0 /*JP*/ Sprintf(buf, Hallucination ? "You suddenly dread being peeled and mimic %s again!" : "You now prefer mimicking %s again.", an(Upolyd ? youmonst.data->mname : urace.noun)); +#else + Sprintf(buf, Hallucination ? + "突然丸裸にされるのが恐ろしくなってまた%sの真似をした!" : + "こんどはまた%sの真似がしたくなった.", + jtrns_mon(Upolyd ? youmonst.data->mname : urace.noun)); +#endif eatmbuf = strcpy((char *) alloc(strlen(buf) + 1), buf); nomovemsg = eatmbuf; afternmv = eatmdone; @@ -880,13 +1052,22 @@ } break; case PM_QUANTUM_MECHANIC: +/*JP Your("velocity suddenly seems very uncertain!"); +*/ + Your("速度が突然,不確定になった!"); if (HFast & INTRINSIC) { HFast &= ~INTRINSIC; +/*JP You("seem slower."); +*/ + You("遅くなったようだ."); } else { HFast |= FROMOUTSIDE; +/*JP You("seem faster."); +*/ + You("速くなったようだ."); } break; case PM_LIZARD: @@ -897,7 +1078,10 @@ case PM_DOPPELGANGER: /* case PM_SANDESTIN: */ if (!Unchanging) { +/*JP You_feel("a change coming over you."); +*/ + pline("変化が訪れた."); polyself(FALSE); } break; @@ -905,13 +1089,19 @@ case PM_MASTER_MIND_FLAYER: if (ABASE(A_INT) < ATTRMAX(A_INT)) { if (!rn2(2)) { +/*JP pline("Yum! That was real brain food!"); +*/ + pline("うまい!これこそ本当の「頭の良くなる食事」だ!"); (void) adjattrib(A_INT, 1, FALSE); break; /* don't give them telepathy, too */ } } else { +/*JP pline("For some reason, that tasted bland."); +*/ + pline("どうしたわけか,淡白な味だ."); } /* fall through to default case */ default: { @@ -920,7 +1110,10 @@ if (dmgtype(ptr, AD_STUN) || dmgtype(ptr, AD_HALU) || pm == PM_VIOLET_FUNGUS) { +/*JP pline ("Oh wow! Great stuff!"); +*/ + pline ("ワーォ!こりゃすごい!"); make_hallucinated(HHallucination + 200,FALSE,0L); } if(is_giant(ptr)) gainstr((struct obj *)0, 0); @@ -988,7 +1181,10 @@ { u.uconduct.unvegetarian++; if (Role_if(PM_MONK)) { +/*JP You_feel("guilty."); +*/ + pline("罪を感じた."); adjalign(-1); } return; @@ -1005,7 +1201,10 @@ costly_spot(tin.tin->ox, tin.tin->oy) && !tin.tin->no_charge) || tin.tin->unpaid)) { +/*JP verbalize("You %s it, you bought it!", verb ? verb : "open"); +*/ + verbalize("%sのなら買ってもらうよ!", verb ? verb : "開けた"); if(tin.tin->quan > 1L) tin.tin = splitobj(tin.tin, 1L); bill_dummy_object(tin.tin); } @@ -1023,21 +1222,36 @@ /* perhaps it was stolen? */ return(0); /* %% probably we should use tinoid */ if(tin.usedtime++ >= 50) { +/*JP You("give up your attempt to open the tin."); +*/ + You("缶を開けるのをあきらめた."); return(0); } if(tin.usedtime < tin.reqtime) return(1); /* still busy */ if(tin.tin->otrapped || (tin.tin->cursed && tin.tin->spe != -1 && !rn2(8))) { +/*JP b_trapped("tin", 0); +*/ + b_trapped("缶", 0); +/*JP costly_tin("destroyed"); +*/ + costly_tin("壊した"); goto use_me; } +/*JP You("succeed in opening the tin."); +*/ + You("缶を開けるのに成功した."); if(tin.tin->spe != 1) { if (tin.tin->corpsenm == NON_PM) { +/*JP pline("It turns out to be empty."); +*/ + pline("缶は空っぽだった."); tin.tin->dknown = tin.tin->known = TRUE; costly_tin((const char*)0); goto use_me; @@ -1059,10 +1273,19 @@ which = type_is_pname(&mons[tin.tin->corpsenm]) ? 1 : 2; } if (which == 0) what = makeplural(what); +/*JP pline("It smells like %s%s.", (which == 2) ? "the " : "", what); +*/ + pline("%sのような匂いがした.", jtrns_mon(what)); +/*JP if (yn("Eat it?") == 'n') { +*/ + if (yn("食べますか?") == 'n') { if (!Hallucination) tin.tin->dknown = tin.tin->known = TRUE; +/*JP if (flags.verbose) You("discard the open tin."); +*/ + if (flags.verbose) You("開けた缶を捨てた."); costly_tin((const char*)0); goto use_me; } @@ -1070,8 +1293,23 @@ victual.piece = (struct obj *)0; victual.fullwarn = victual.eating = victual.doreset = FALSE; +#if 0 /*JP*/ You("consume %s %s.", tintxts[r].txt, mons[tin.tin->corpsenm].mname); +#else +/*JP + 腐った(4),自家製の(5),ゆで(8),乾燥(9),は前置に, + それ以外は後置. + */ + if(r==4 || r==5 || r==8 || r==9) + You("%s%sの缶詰をたいらげた.", + tintxts[r].txt, + jtrns_mon(mons[tin.tin->corpsenm].mname)); + else + You("%s%sの缶詰をたいらげた.", + jtrns_mon(mons[tin.tin->corpsenm].mname), + tintxts[r].txt); +#endif /* KMH, conduct */ u.uconduct.food++; @@ -1093,21 +1331,38 @@ if(r == 0 || r == FRENCH_FRIED_TIN) { /* Assume !Glib, because you can't open tins when Glib. */ incr_itimeout(&Glib, rnd(15)); +/*JP pline("Eating deep fried food made your %s very slippery.", +*/ + pline("揚げ物を食べたのであなたの%sは滑りやすくなった.", makeplural(body_part(FINGER))); } } else { if (tin.tin->cursed) +#if 0 /*JP*/ pline("It contains some decaying%s%s substance.", Blind ? "" : " ", Blind ? "" : hcolor(NH_GREEN)); +#else + pline("%s腐った物体が入っている.", + Blind ? "" : hcolor(NH_GREEN)); +#endif else +/*JP pline("It contains spinach."); +*/ + pline("ホウレン草が入っている."); +/*JP if (yn("Eat it?") == 'n') { +*/ + if (yn("食べますか?") == 'n') { if (!Hallucination && !tin.tin->cursed) tin.tin->dknown = tin.tin->known = TRUE; if (flags.verbose) +/*JP You("discard the open tin."); +*/ + You("開けた缶を捨てた."); costly_tin((const char*)0); goto use_me; } @@ -1116,8 +1371,13 @@ costly_tin((const char*)0); if (!tin.tin->cursed) +#if 0 /*JP*/ pline("This makes you feel like %s!", Hallucination ? "Swee'pea" : "Popeye"); +#else + pline("%sのような気分になった!", + Hallucination ? "スイーピー" : "ポパイ"); +#endif lesshungry(600); gainstr(tin.tin, 0); u.uconduct.food++; @@ -1136,13 +1396,22 @@ register int tmp; if (metallivorous(youmonst.data)) { +/*JP You("bite right into the metal tin..."); +*/ + You("金属の缶を噛みはじめた..."); tmp = 1; } else if (nolimbs(youmonst.data)) { +/*JP You("cannot handle the tin properly to open it."); +*/ + You("缶をうまく開けられない."); return; } else if (otmp->blessed) { +/*JP pline_The("tin opens like magic!"); +*/ + pline("缶は魔法のように開いた!"); tmp = 1; } else if(uwep) { switch(uwep->otyp) { @@ -1164,13 +1433,24 @@ default: goto no_opener; } +#if 0 /*JP*/ pline("Using your %s you try to open the tin.", aobjnam(uwep, (char *)0)); +#else + You("%sを使って缶を開けようとした.", + xname(uwep)); +#endif } else { no_opener: +/*JP pline("It is not so easy to open this tin."); +*/ + pline("この缶を開けるのは容易なことではない."); if(Glib) { +/*JP pline_The("tin slips from your %s.", +*/ + pline("缶はあなたの%sから滑り落ちた.", makeplural(body_part(FINGER))); if(otmp->quan > 1L) { otmp = splitobj(otmp, 1L); @@ -1184,7 +1464,10 @@ tin.reqtime = tmp; tin.usedtime = 0; tin.tin = otmp; +/*JP set_occupation(opentin, "opening the tin", 0); +*/ + set_occupation(opentin, "缶を開ける", 0); return; } @@ -1200,32 +1483,61 @@ rottenfood(obj) struct obj *obj; { +/*JP pline("Blecch! Rotten %s!", foodword(obj)); +*/ + pline("ゲェ!腐った%sだ!", foodword(obj)); if(!rn2(4)) { +#if 0 /*JP*/ if (Hallucination) You_feel("rather trippy."); else You_feel("rather %s.", body_part(LIGHT_HEADED)); +#else + if (Hallucination) You("へろへろした."); + else You("%s.", body_part(LIGHT_HEADED)); +#endif make_confused(HConfusion + d(2,4),FALSE); } else if(!rn2(4) && !Blind) { +/*JP pline("Everything suddenly goes dark."); +*/ + pline("突然全てが暗くなった."); make_blinded((long)d(2,10),FALSE); if (!Blind) Your(vision_clears); } else if(!rn2(3)) { const char *what, *where; if (!Blind) +/*JP what = "goes", where = "dark"; +*/ + what = "なった", where = "暗闇に"; else if (Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) +/*JP what = "you lose control of", where = "yourself"; +*/ + what = "制御できなくなった", where = "自分を"; else +/*JP what = "you slap against the", where = +*/ + what = "にぶつかった", where = #ifdef STEED +/*JP (u.usteed) ? "saddle" : +*/ + (u.usteed) ? "鞍" : #endif surface(u.ux,u.uy); +/*JP pline_The("world spins and %s %s.", what, where); +*/ + pline("世界が回転し,%s%s.", where, what); flags.soundok = 0; nomul(-rnd(10)); +/*JP nomovemsg = "You are conscious again."; +*/ + nomovemsg = "あなたはまた正気づいた."; afternmv = Hear_again; return(1); } @@ -1238,7 +1550,9 @@ { int tp = 0, mnum = otmp->corpsenm; long rotted = 0L; +/*JP boolean uniq = !!(mons[mnum].geno & G_UNIQ); +*/ int retcode = 0; boolean stoneable = (touch_petrifies(&mons[mnum]) && !Stone_resistance && !poly_when_stoned(youmonst.data)); @@ -1257,12 +1571,22 @@ if (mnum != PM_ACID_BLOB && !stoneable && rotted > 5L) { boolean cannibal = maybe_cannibal(mnum, FALSE); +#if 0 /*JP*/ pline("Ulch - that %s was tainted%s!", mons[mnum].mlet == S_FUNGUS ? "fungoid vegetation" : !vegetarian(&mons[mnum]) ? "meat" : "protoplasm", cannibal ? " cannibal" : ""); +#else + pline("オェ!この%sは腐っている%s!", + mons[mnum].mlet == S_FUNGUS ? "細菌に汚染された植物" : + !vegetarian(&mons[mnum]) ? "肉" : "生物", + cannibal ? ".しかも共食いだ" : ""); +#endif if (Sick_resistance) { +/*JP pline("It doesn't seem at all sickening, though..."); +*/ + pline("しかし,いたって元気だ..."); } else { char buf[BUFSZ]; long sick_time; @@ -1271,34 +1595,59 @@ /* make sure new ill doesn't result in improvement */ if (Sick && (sick_time > Sick)) sick_time = (Sick > 1L) ? Sick - 1L : 1L; +#if 0 /*JP*/ if (!uniq) Sprintf(buf, "rotted %s", corpse_xname(otmp,TRUE)); else Sprintf(buf, "%s%s rotted corpse", !type_is_pname(&mons[mnum]) ? "the " : "", s_suffix(mons[mnum].mname)); +#else + Sprintf(buf, "腐った%s", corpse_xname(otmp,TRUE)); make_sick(sick_time, buf, TRUE, SICK_VOMITABLE); +#endif } if (carried(otmp)) useup(otmp); else useupf(otmp, 1L); return(2); } else if (acidic(&mons[mnum]) && !Acid_resistance) { tp++; +#if 0 /*JP:T*/ You("have a very bad case of stomach acid."); /* not body_part() */ +#else + pline("胃酸の調子がとても悪い."); +#endif +/*JP losehp(rnd(15), "acidic corpse", KILLED_BY_AN); +*/ + losehp(rnd(15), "酸の死体で", KILLED_BY_AN); } else if (poisonous(&mons[mnum]) && rn2(5)) { tp++; +/*JP pline("Ecch - that must have been poisonous!"); +*/ + pline("ウゲェー,有毒だったにちがいない!"); if(!Poison_resistance) { losestr(rnd(4)); +/*JP losehp(rnd(15), "poisonous corpse", KILLED_BY_AN); +*/ + losehp(rnd(15), "毒の死体で", KILLED_BY_AN); +/*JP } else You("seem unaffected by the poison."); +*/ + } else You("毒の影響を受けないようだ."); /* now any corpse left too long will make you mildly ill */ } else if ((rotted > 5L || (rotted > 3L && rn2(5))) && !Sick_resistance) { tp++; +#if 0 /*JP*/ You_feel("%ssick.", (Sick) ? "very " : ""); losehp(rnd(8), "cadaver", KILLED_BY_AN); +#else + You("%s気分が悪い.", (Sick) ? "とても" : ""); + losehp(rnd(8), "腐乱死体で", KILLED_BY_AN); +#endif } /* delay is weight dependent */ @@ -1314,7 +1663,11 @@ if (!mons[otmp->corpsenm].cnutrit) { /* no nutrution: rots away, no message if you passed out */ +#if 0 /*JP*/ if (!retcode) pline_The("corpse rots away completely."); +#else + if (!retcode) pline("死体は完全に腐ってしまった."); +#endif if (carried(otmp)) useup(otmp); else useupf(otmp, 1L); retcode = 2; @@ -1322,6 +1675,7 @@ if (!retcode) consume_oeaten(otmp, 2); /* oeaten >>= 2 */ } else { +#if 0 /*JP*/ pline("%s%s %s!", !uniq ? "This " : !type_is_pname(&mons[mnum]) ? "The " : "", food_xname(otmp, FALSE), @@ -1329,6 +1683,13 @@ (!carnivorous(youmonst.data) && herbivorous(youmonst.data)) : (carnivorous(youmonst.data) && !herbivorous(youmonst.data))) ? "is delicious" : "tastes terrible"); +#else + pline("この%sは%s!", food_xname(otmp, FALSE), + (vegan(&mons[mnum]) ? + (!carnivorous(youmonst.data) && herbivorous(youmonst.data)) : + (carnivorous(youmonst.data) && !herbivorous(youmonst.data))) + ? "とても旨い" : "ひどい味だ"); +#endif } return(retcode); @@ -1364,7 +1725,10 @@ return; } +/*JP Sprintf(msgbuf, "eating %s", food_xname(otmp, TRUE)); +*/ + Sprintf(msgbuf, "%sを食べる", food_xname(otmp, TRUE)); set_occupation(eatfood, msgbuf, 0); } @@ -1380,19 +1744,39 @@ switch(otmp->otyp) { case FOOD_RATION: if(u.uhunger <= 200) +#if 0 /*JP:T*/ pline(Hallucination ? "Oh wow, like, superior, man!" : "That food really hit the spot!"); +#else + pline(Hallucination ? "まったりとして,それでいてしつこくない!これぞ究極のメニューだ!" : + "この食べ物は本当に申し分ない!"); +#endif +#if 0 /*JP:T*/ else if(u.uhunger <= 700) pline("That satiated your %s!", body_part(STOMACH)); +#else + else if(u.uhunger <= 700) pline("満腹になった!"); +#endif break; case TRIPE_RATION: if (carnivorous(youmonst.data) && !humanoid(youmonst.data)) +/*JP pline("That tripe ration was surprisingly good!"); +*/ + pline("このモツ肉はおどろくほど旨い!"); else if (maybe_polyd(is_orc(youmonst.data), Race_if(PM_ORC))) +#if 0 /*JP*/ pline(Hallucination ? "Tastes great! Less filling!" : "Mmm, tripe... not bad!"); +#else + pline(Hallucination ? "うまい!もっとほしくなるね!" : + "んー,モツか...悪くない!"); +#endif else { +/*JP pline("Yak - dog food!"); +*/ + pline("うげ,ドッグフードだ!"); more_experienced(1,0); newexplevel(); /* not cannibalism, but we use similar criteria @@ -1416,8 +1800,14 @@ default: if (otmp->otyp==SLIME_MOLD && !otmp->cursed && otmp->spe == current_fruit) +/*JP pline("My, that was a %s %s!", +*/ + pline("おや,なんて%s%sだ!", +/*JP Hallucination ? "primo" : "yummy", +*/ + Hallucination ? "上品な" : "おいしい", singular(otmp, xname)); else #ifdef UNIX @@ -1436,14 +1826,22 @@ #endif #ifdef MAC /* KMH -- Why should Unix have all the fun? */ if (otmp->otyp == APPLE) { +/*JP pline("Delicious! Must be a Macintosh!"); +*/ + pline("すばらしい!マッキントッシュに違いない!"); } else #endif if (otmp->otyp == EGG && stale_egg(otmp)) { +#if 0 /*JP*/ pline("Ugh. Rotten egg."); /* perhaps others like it */ +#else + pline("ウゲェー腐った卵だ."); +#endif make_vomiting(Vomiting+d(10,4), TRUE); } else give_feedback: +#if 0 /*JP*/ pline("This %s is %s", singular(otmp, xname), otmp->cursed ? (Hallucination ? "grody!" : "terrible!") : (otmp->otyp == CRAM_RATION @@ -1451,6 +1849,15 @@ || otmp->otyp == C_RATION) ? "bland." : Hallucination ? "gnarly!" : "delicious!"); +#else + pline("この%sは%s", singular(otmp, xname), + otmp->cursed ? (Hallucination ? "イケてない!" : "ひどい味だ!") : + (otmp->otyp == CRAM_RATION + || otmp->otyp == K_RATION + || otmp->otyp == C_RATION) + ? "味気ない." : + Hallucination ? "イケてる!" : "うまい!"); +#endif break; } } @@ -1459,8 +1866,13 @@ accessory_has_effect(otmp) struct obj *otmp; { +#if 0 /*JP*/ pline("Magic spreads through your body as you digest the %s.", otmp->oclass == RING_CLASS ? "ring" : "amulet"); +#else + pline("あなたが%sを消化すると,その魔力が体にしみこんだ.", + otmp->oclass == RING_CLASS ? "指輪" : "魔除け"); +#endif } STATIC_OVL void @@ -1495,7 +1907,10 @@ if (Invis && !oldprop && !ESee_invisible && !perceives(youmonst.data) && !Blind) { newsym(u.ux,u.uy); +/*JP pline("Suddenly you can see yourself."); +*/ + pline("突然自分自身が見えるようになった."); makeknown(typ); } break; @@ -1503,8 +1918,13 @@ if (!oldprop && !EInvis && !BInvis && !See_invisible && !Blind) { newsym(u.ux,u.uy); +#if 0 /*JP*/ Your("body takes on a %s transparency...", Hallucination ? "normal" : "strange"); +#else + pline("%sあなたの体は透過性をもった...", + Hallucination ? "あたりまえなことだが" : "奇妙なことに"); +#endif makeknown(typ); } break; @@ -1556,15 +1976,23 @@ if (!(HSleep_resistance & FROMOUTSIDE)) accessory_has_effect(otmp); if (!Sleep_resistance) +/*JP You_feel("wide awake."); +*/ + You("ぱっちり目がさめた."); HSleep_resistance |= FROMOUTSIDE; break; case AMULET_OF_CHANGE: accessory_has_effect(otmp); makeknown(typ); change_sex(); +#if 0 /*JP*/ You("are suddenly very %s!", flags.female ? "feminine" : "masculine"); +#else + You("突然%sっぽくなった!", + flags.female ? "女" : "男"); +#endif flags.botl = 1; break; case AMULET_OF_UNCHANGING: @@ -1601,7 +2029,10 @@ register struct obj *otmp = victual.piece; /* lesshungry wants an occupation to handle choke messages correctly */ +/*JP set_occupation(eatfood, "eating non-food", 0); +*/ + set_occupation(eatfood, "食べる", 0); lesshungry(victual.nmod); occupation = 0; victual.piece = (struct obj *)0; @@ -1630,13 +2061,21 @@ /* KMH -- idea by "Tommy the Terrorist" */ if ((otmp->otyp == TRIDENT) && !otmp->cursed) { +#if 0 /*JP*/ pline(Hallucination ? "Four out of five dentists agree." : "That was pure chewing satisfaction!"); +#else + pline(Hallucination ? "五人に四人の歯医者がトライデントをお薦めしています." : + "純粋に噛みたい気持を満たした!"); +#endif exercise(A_WIS, TRUE); } if ((otmp->otyp == FLINT) && !otmp->cursed) { +/*JP pline("Yabba-dabba delicious!"); +*/ + pline("ヤッバダッバうまい!"); /* Flintstonesのパロディみたいです.原作よく知らず */ exercise(A_CON, TRUE); } @@ -1653,17 +2092,27 @@ /* NOTE: the order of these words exactly corresponds to the order of oc_material values #define'd in objclass.h. */ static const char *foodwords[] = { +#if 0 /*JP*/ "meal", "liquid", "wax", "food", "meat", "paper", "cloth", "leather", "wood", "bone", "scale", "metal", "metal", "metal", "silver", "gold", "platinum", "mithril", "plastic", "glass", "rich food", "stone" +#else + "肉", "液体", "油", "食料", "肉", + "紙", "服", "皮", "木", "骨", "鱗", + "金属", "金属", "金属", "銀", "金", "プラチナ", "ミスリル", + "プラスチック", "ガラス", "高級料理", "石" +#endif }; STATIC_OVL const char * foodword(otmp) register struct obj *otmp; { +/*JP if (otmp->oclass == FOOD_CLASS) return "food"; +*/ + if (otmp->oclass == FOOD_CLASS) return "食料"; if (otmp->oclass == GEM_CLASS && objects[otmp->otyp].oc_material == GLASS && otmp->dknown) @@ -1705,8 +2154,13 @@ u.uhp = u.uhpmax; } else if (u.uhp <= 0) { killer_format = KILLED_BY_AN; +#if 0 /*JP*/ killer = "rotten lump of royal jelly"; done(POISONING); +#else + killer = "腐ったロイヤルゼリーを食べ食中毒で"; + done(DIED); +#endif } } if(!otmp->cursed) heal_legs(); @@ -1717,7 +2171,10 @@ !(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))) { if (!Stoned) Stoned = 5; killer_format = KILLED_BY_AN; +/*JP Sprintf(killer_buf, "%s egg", mons[otmp->corpsenm].mname); +*/ + Sprintf(killer_buf, "%sの卵で", jtrns_mon(mons[otmp->corpsenm].mname)); delayed_killer = killer_buf; } } @@ -1745,18 +2202,33 @@ ability to detect food that is unfit for consumption or dangerous and avoid it. */ +#if 0 /*JP*/ char buf[BUFSZ], foodsmell[BUFSZ], it_or_they[QBUFSZ], eat_it_anyway[QBUFSZ]; +#else + char buf[BUFSZ], foodsmell[BUFSZ], + eat_it_anyway[QBUFSZ]; +#endif boolean cadaver = (otmp->otyp == CORPSE), stoneorslime = FALSE; int material = objects[otmp->otyp].oc_material, mnum = otmp->corpsenm; long rotted = 0L; +#if 0 /*JP*/ Strcpy(foodsmell, Tobjnam(otmp, "smell")); +#else + Strcpy(foodsmell, xname(otmp)); +#endif +#if 0 /*JP*/ Strcpy(it_or_they, (otmp->quan == 1L) ? "it" : "they"); +#endif +#if 0 /*JP*/ Sprintf(eat_it_anyway, "Eat %s anyway?", (otmp->quan == 1L) ? "it" : "one"); +#else + Strcpy(eat_it_anyway, "それでも食べる?"); +#endif if (cadaver || otmp->otyp == EGG || otmp->otyp == TIN) { /* These checks must match those in eatcorpse() */ @@ -1785,48 +2257,83 @@ if (cadaver && mnum != PM_ACID_BLOB && rotted > 5L && !Sick_resistance) { /* Tainted meat */ +#if 0 /*JP*/ Sprintf(buf, "%s like %s could be tainted! %s", foodsmell, it_or_they, eat_it_anyway); +#else + Sprintf(buf, "%sは汚染されているようなにおいがする!%s", + foodsmell, eat_it_anyway); +#endif if (yn_function(buf,ynchars,'n')=='n') return 1; else return 2; } if (stoneorslime) { +#if 0 /*JP*/ Sprintf(buf, "%s like %s could be something very dangerous! %s", foodsmell, it_or_they, eat_it_anyway); +#else + Sprintf(buf, "%sはなんだかすごく危険そうなにおいがする!%s", + foodsmell, eat_it_anyway); +#endif if (yn_function(buf,ynchars,'n')=='n') return 1; else return 2; } if (otmp->orotten || (cadaver && rotted > 3L)) { /* Rotten */ +#if 0 /*JP*/ Sprintf(buf, "%s like %s could be rotten! %s", foodsmell, it_or_they, eat_it_anyway); +#else + Sprintf(buf, "%sは腐ったようなにおいがする!%s", + foodsmell, eat_it_anyway); +#endif if (yn_function(buf,ynchars,'n')=='n') return 1; else return 2; } if (cadaver && poisonous(&mons[mnum]) && !Poison_resistance) { /* poisonous */ +#if 0 /*JP*/ Sprintf(buf, "%s like %s might be poisonous! %s", foodsmell, it_or_they, eat_it_anyway); +#else + Sprintf(buf, "%sは毒をもっていそうなにおいがする!%s", + foodsmell, eat_it_anyway); +#endif if (yn_function(buf,ynchars,'n')=='n') return 1; else return 2; } if (cadaver && !vegetarian(&mons[mnum]) && !u.uconduct.unvegetarian && Role_if(PM_MONK)) { +#if 0 /*JP*/ Sprintf(buf, "%s unhealthy. %s", foodsmell, eat_it_anyway); +#else + Sprintf(buf, "%sは健康に悪そうなにおいがする.%s", + foodsmell, eat_it_anyway); +#endif if (yn_function(buf,ynchars,'n')=='n') return 1; else return 2; } if (cadaver && acidic(&mons[mnum]) && !Acid_resistance) { +#if 0 /*JP*/ Sprintf(buf, "%s rather acidic. %s", foodsmell, eat_it_anyway); +#else + Sprintf(buf, "%sは少し酸っぱそうなにおいがする.%s", + foodsmell, eat_it_anyway); +#endif if (yn_function(buf,ynchars,'n')=='n') return 1; else return 2; } if (Upolyd && u.umonnum == PM_RUST_MONSTER && is_metallic(otmp) && otmp->oerodeproof) { +#if 0 /*JP*/ Sprintf(buf, "%s disgusting to you right now. %s", foodsmell, eat_it_anyway); +#else + Sprintf(buf, "%sは気分が悪くなるにおいがする.%s", + foodsmell, eat_it_anyway); +#endif if (yn_function(buf,ynchars,'n')=='n') return 1; else return 2; } @@ -1839,7 +2346,11 @@ ((material == LEATHER || material == BONE || material == DRAGON_HIDE || material == WAX) || (cadaver && !vegan(&mons[mnum])))) { +#if 0 /*JP*/ Sprintf(buf, "%s foul and unfamiliar to you. %s", +#else + Sprintf(buf, "%sは汚れていて,あなたになじまないようなにおいがする.%s", +#endif foodsmell, eat_it_anyway); if (yn_function(buf,ynchars,'n')=='n') return 1; else return 2; @@ -1848,7 +2359,11 @@ ((material == LEATHER || material == BONE || material == DRAGON_HIDE) || (cadaver && !vegetarian(&mons[mnum])))) { +#if 0 /*JP*/ Sprintf(buf, "%s unfamiliar to you. %s", +#else + Sprintf(buf, "%sはあなたになじまないようなにおいがする.%s", +#endif foodsmell, eat_it_anyway); if (yn_function(buf,ynchars,'n')=='n') return 1; else return 2; @@ -1856,8 +2371,13 @@ if (cadaver && mnum != PM_ACID_BLOB && rotted > 5L && Sick_resistance) { /* Tainted meat with Sick_resistance */ +#if 0 /*JP*/ Sprintf(buf, "%s like %s could be tainted! %s", foodsmell, it_or_they, eat_it_anyway); +#else + Sprintf(buf, "%sは汚染されているようなにおいがする!%s", + foodsmell, eat_it_anyway); +#endif if (yn_function(buf,ynchars,'n')=='n') return 1; else return 2; } @@ -1872,7 +2392,10 @@ boolean dont_start = FALSE; if (Strangled) { +/*JP pline("If you can't breathe air, how can you consume solids?"); +*/ + pline("息もできないのに,どうやって食べたらいいんだい?"); return 0; } if (!(otmp = floorfood("eat", 0))) return 0; @@ -1881,8 +2404,13 @@ if (u.uedibility) { int res = edibility_prompts(otmp); if (res) { +#if 0 /*JP*/ Your("%s stops tingling and your sense of smell returns to normal.", body_part(NOSE)); +#else + Your("%sがうずうずするのは止まり,嗅覚は普通に戻った.", + body_part(NOSE)); +#endif u.uedibility = 0; if (res == 1) return 0; } @@ -1894,7 +2422,10 @@ * metallic meal, etc.... */ if (!is_edible(otmp)) { +/*JP You("cannot eat that!"); +*/ + You("それを食べられない!"); return 0; } else if ((otmp->owornmask & (W_ARMOR|W_TOOL|W_AMUL #ifdef STEED @@ -1902,7 +2433,10 @@ #endif )) != 0) { /* let them eat rings */ +/*JP You_cant("eat %s you're wearing.", something); +*/ + You("身につけている間は食べれない."); return 0; } if (is_metallic(otmp) && @@ -1914,11 +2448,17 @@ else otmp = splitobj(otmp, 1L); } +/*JP pline("Ulch - That %s was rustproofed!", xname(otmp)); +*/ + pline("ウゲェー!%sは防錆されている!", xname(otmp)); /* The regurgitated object's rustproofing is gone now */ otmp->oerodeproof = 0; make_stunned(HStun + rn2(10), TRUE); +/*JP You("spit %s out onto the %s.", the(xname(otmp)), +*/ + You("%sを%sに吐き出した.", the(xname(otmp)), surface(u.ux, u.uy)); if (carried(otmp)) { freeinv(otmp); @@ -1929,7 +2469,10 @@ } /* KMH -- Slow digestion is... indigestible */ if (otmp->otyp == RIN_SLOW_DIGESTION) { +/*JP pline("This ring is indigestible!"); +*/ + pline("この指輪は消化しにくい!"); (void) rottenfood(otmp); if (otmp->dknown && !objects[otmp->otyp].oc_name_known && !objects[otmp->otyp].oc_uname) @@ -1968,14 +2511,31 @@ (void) rottenfood(otmp); if (otmp->oclass == WEAPON_CLASS && otmp->opoisoned) { +/*JP pline("Ecch - that must have been poisonous!"); +*/ + pline("ウゲェー,有毒だったに違いない!"); if(!Poison_resistance) { losestr(rnd(4)); +#if 0 /*JP*/ losehp(rnd(15), xname(otmp), KILLED_BY_AN); +#else + { + char jbuf[BUFSZ]; + Sprintf(jbuf, "%sで", xname(otmp)); + losehp(rnd(15), jbuf, KILLED_BY_AN); + } +#endif } else +/*JP You("seem unaffected by the poison."); +*/ + You("毒の影響を受けないようだ."); } else if (!otmp->cursed) +/*JP pline("This %s is delicious!", +*/ + pline("この%sは旨い!", otmp->oclass == COIN_CLASS ? foodword(otmp) : singular(otmp, xname)); @@ -1991,7 +2551,10 @@ */ if (u.uhs != SATIATED) victual.canchoke = FALSE; victual.piece = touchfood(otmp); +/*JP You("resume your meal."); +*/ + You("食事を再開した."); start_eating(victual.piece); return(1); } @@ -2200,15 +2763,24 @@ */ if (u.uhunger >= 1500) { if (!victual.eating || (victual.eating && !victual.fullwarn)) { +/*JP pline("You're having a hard time getting all of it down."); +*/ + pline("全てを飲みこむには時間がかかる."); +/*JP nomovemsg = "You're finally finished."; +*/ + nomovemsg = "やっと食べ終えた."; if (!victual.eating) multi = -2; else { victual.fullwarn = TRUE; if (victual.canchoke && victual.reqtime > 1) { /* a one-gulp food will not survive a stop */ +/*JP if (yn_function("Stop eating?",ynchars,'y')=='y') { +*/ + if (yn_function("食べるのを中断しますか?",ynchars,'y')=='y') { reset_eat(); nomovemsg = (char *)0; } @@ -2256,7 +2828,10 @@ flags.soundok = 0; nomul(-10+(u.uhunger/10)); +/*JP nomovemsg = "You regain consciousness."; +*/ + nomovemsg = "あなたは正気づいた."; afternmv = unfaint; } } @@ -2318,10 +2893,16 @@ if(!is_fainted() && multi >= 0 /* %% */) { /* stop what you're doing, then faint */ stop_occupation(); +/*JP You("faint from lack of food."); +*/ + You("腹が減って倒れた."); flags.soundok = 0; nomul(-10+(u.uhunger/10)); +/*JP nomovemsg = "You regain consciousness."; +*/ + nomovemsg = "あなたは正気づいた."; afternmv = unfaint; newhs = FAINTED; } @@ -2330,9 +2911,15 @@ u.uhs = STARVED; flags.botl = 1; bot(); +/*JP You("die from starvation."); +*/ + You("餓死した."); killer_format = KILLED_BY; +/*JP killer = "starvation"; +*/ + killer = "食料不足で餓死した"; done(STARVING); /* if we return, we lifesaved, and that calls newuhs */ return; @@ -2347,13 +2934,27 @@ switch(newhs){ case HUNGRY: if (Hallucination) { +#if 0 /*JP*/ You((!incr) ? "now have a lesser case of the munchies." : "are getting the munchies."); +#else + if (!incr) { + You("ハラヘリが減った."); + } else { + pline("ハラヘリヘリハラ."); + } +#endif } else +#if 0 /*JP*/ You((!incr) ? "only feel hungry now." : (u.uhunger < 145) ? "feel hungry." : "are beginning to feel hungry."); +#else + You((!incr) ? "単に腹ペコ状態になった." : + (u.uhunger < 145) ? "空腹感を感じた." : + "空腹感をおぼえはじめた."); +#endif if (incr && occupation && (occupation != eatfood && occupation != opentin)) stop_occupation(); @@ -2361,18 +2962,35 @@ case WEAK: if (Hallucination) pline((!incr) ? +#if 0 /*JP*/ "You still have the munchies." : "The munchies are interfering with your motor capabilities."); +#else + "ハラヘリが減らない.": + "ハラヘリがモーター性能に影響を与えている."); +#endif else if (incr && (Role_if(PM_WIZARD) || Race_if(PM_ELF) || Role_if(PM_VALKYRIE))) +#if 0 /*JP*/ pline("%s needs food, badly!", (Role_if(PM_WIZARD) || Role_if(PM_VALKYRIE)) ? urole.name.m : "Elf"); +#else + pline("%sには至急食料が必要だ!", + (Role_if(PM_WIZARD) || Role_if(PM_VALKYRIE)) ? + urole.jname.m : "エルフ"); +#endif else +#if 0 /*JP*/ You((!incr) ? "feel weak now." : (u.uhunger < 45) ? "feel weak." : "are beginning to feel weak."); +#else + You((!incr) ? "衰弱状態になった.": + (u.uhunger < 45) ? "衰弱してきた." : + "弱くなってきたように感じた."); +#endif if (incr && occupation && (occupation != eatfood && occupation != opentin)) stop_occupation(); @@ -2382,9 +3000,15 @@ flags.botl = 1; bot(); if ((Upolyd ? u.mh : u.uhp) < 1) { +/*JP You("die from hunger and exhaustion."); +*/ + You("空腹と衰弱で死んだ."); killer_format = KILLED_BY; +/*JP killer = "exhaustion"; +*/ + killer = "空腹と衰弱で死んだ"; done(STARVING); return; } @@ -2397,6 +3021,11 @@ /* Returns an object representing food. Object may be either on floor or * in inventory. */ +/*JP CHECK: 3.4.3 での呼び出し元 +apply.c:1959: if (!(corpse = floorfood("缶詰めにする", 2))) return; +eat.c:2404: if (!(otmp = floorfood("食べる", 0))) return 0; +pray.c:1478: if (!(otmp = floorfood("捧げる", 1))) return 0; +*/ struct obj * floorfood(verb,corpsecheck) /* get food from floor or pack */ const char *verb; @@ -2407,6 +3036,10 @@ char c; boolean feeding = (!strcmp(verb, "eat")); +#if 1 /*JP*/ + const char *jverb = trans_verb(verb)->jp; +#endif + /* if we can't touch floor objects then use invent food only */ if (!can_reach_floor() || #ifdef STEED @@ -2425,9 +3058,15 @@ /* If not already stuck in the trap, perhaps there should be a chance to becoming trapped? Probably not, because then the trap would just get eaten on the _next_ turn... */ +/*JP Sprintf(qbuf, "There is a bear trap here (%s); eat it?", +*/ + Sprintf(qbuf, "ここには熊の罠(%s)がある", (u.utrap && u.utraptype == TT_BEARTRAP) ? +/*JP "holding you" : "armed"); +*/ + "あなたを掴まえている" : "稼動中"); if ((c = yn_function(qbuf, ynqchars, 'n')) == 'y') { u.utrap = u.utraptype = 0; deltrap(ttmp); @@ -2439,11 +3078,16 @@ if (youmonst.data != &mons[PM_RUST_MONSTER] && (gold = g_at(u.ux, u.uy)) != 0) { +#if 0 /*JP*/ if (gold->quan == 1L) Sprintf(qbuf, "There is 1 gold piece here; eat it?"); else Sprintf(qbuf, "There are %ld gold pieces here; eat them?", gold->quan); +#else + Sprintf(qbuf, "ここには%ld枚の金貨がある.食べますか?", + gold->quan); +#endif if ((c = yn_function(qbuf, ynqchars, 'n')) == 'y') { return gold; } else if (c == 'q') { @@ -2458,10 +3102,15 @@ (otmp->otyp==CORPSE && (corpsecheck == 1 || tinnable(otmp))) : feeding ? (otmp->oclass != COIN_CLASS && is_edible(otmp)) : otmp->oclass==FOOD_CLASS) { +#if 0 /*JP*/ Sprintf(qbuf, "There %s %s here; %s %s?", otense(otmp, "are"), doname(otmp), verb, (otmp->quan == 1L) ? "it" : "one"); +#else + Sprintf(qbuf, "ここには%sがある.%sか?", + doname(otmp), jpolite(jverb)); +#endif if((c = yn_function(qbuf,ynqchars,'n')) == 'y') return(otmp); else if(c == 'q') @@ -2477,7 +3126,10 @@ (const char *)comestibles, verb); if (corpsecheck && otmp) if (otmp->otyp != CORPSE || (corpsecheck == 2 && !tinnable(otmp))) { +/*JP You_cant("%s that!", verb); +*/ + You_cant("それを%sことはできない!", jverb); return (struct obj *)0; } return otmp; diff -aurbN -xCVS -xXTAGS nethack/src/end.c jnethack/src/end.c --- nethack/src/end.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/end.c 2005-07-04 07:24:59.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #define NEED_VARARGS /* comment line for pre-compiled headers */ #include "hack.h" @@ -65,6 +72,7 @@ # endif #endif +#if 0 /*JP*/ /* * The order of these needs to match the macros in hack.h. */ @@ -75,7 +83,18 @@ "genocided", "panic", "trickery", "quit", "escaped", "ascended" }; +#endif /*JP*/ +#if 1 /*JP*/ +static NEARDATA const char *ends[] = { /* "when you..." */ + "死んだ", "窒息した", "毒におかされた", "餓死した", "溺死した", + "焼死した", "溶岩に溶けた", + "押し潰された", "石になった", "どろどろに溶けた", + "虐殺された", + "パニックにおちいった", "奇妙な出来事に会った", + "抜けた", "脱出した", "昇天した", "殺された" +}; +#else static NEARDATA const char *ends[] = { /* "when you..." */ "died", "choked", "were poisoned", "starved", "drowned", "burned", "dissolved in the lava", @@ -83,6 +102,7 @@ "were genocided", "panicked", "were tricked", "quit", "escaped", "ascended" }; +#endif extern const char * const killed_by_prefix[]; /* from topten.c */ @@ -112,7 +132,10 @@ int done2() { +/*JP if(yn("Really quit?") == 'n') { +*/ + if(yn("本当に?") == 'n') { #ifndef NO_SIGNAL (void) signal(SIGINT, (SIG_RET_TYPE) done1); #endif @@ -185,10 +208,14 @@ char buf[BUFSZ]; boolean distorted = (boolean)(Hallucination && canspotmon(mtmp)); +/*JP You("die..."); +*/ + pline("あなたは死にました..."); mark_synch(); /* flush buffered screen output */ buf[0] = '\0'; killer_format = KILLED_BY_AN; +#if 0 /*JP*//* 日本語には関係ないのでまとめてコメントアウト */ /* "killed by the high priest of Crom" is okay, "killed by the high priest" alone isn't */ if ((mtmp->data->geno & G_UNIQ) != 0 && !(mtmp->data == &mons[PM_HIGH_PRIEST] && !mtmp->ispriest)) { @@ -201,17 +228,34 @@ Strcat(buf, "the "); killer_format = KILLED_BY; } +#endif if (mtmp->minvis) +/*JP Strcat(buf, "invisible "); +*/ + Strcat(buf, "透明な"); if (distorted) +/*JP Strcat(buf, "hallucinogen-distorted "); +*/ + Strcat(buf, "幻覚で歪んだ"); if(mtmp->data == &mons[PM_GHOST]) { +#if 0 /*JP*/ Strcat(buf, "ghost"); if (mtmp->mnamelth) Sprintf(eos(buf), " of %s", NAME(mtmp)); +#else + if (mtmp->mnamelth) Sprintf(eos(buf), "%sの幽霊", NAME(mtmp)); + else Strcat(buf, "幽霊"); +#endif } else if(mtmp->isshk) { +#if 0 /*JP*/ Sprintf(eos(buf), "%s %s, the shopkeeper", (mtmp->female ? "Ms." : "Mr."), shkname(mtmp)); +#else + Sprintf(eos(buf), "%sという名の店主", + shkname(mtmp)); +#endif killer_format = KILLED_BY; } else if (mtmp->ispriest || mtmp->isminion) { /* m_monnam() suppresses "the" prefix plus "invisible", and @@ -219,12 +263,18 @@ killer = m_monnam(mtmp); Strcat(buf, killer); } else { +#if 0 /*JP*/ Strcat(buf, mtmp->data->mname); if (mtmp->mnamelth) Sprintf(eos(buf), " called %s", NAME(mtmp)); +#else + Strcat(buf, jtrns_mon_gen(mtmp->data->mname, mtmp->female)); +#endif } +#if 0 /*JP*/ if (multi) Strcat(buf, ", while helpless"); +#endif killer = buf; if (mtmp->data->mlet == S_WRAITH) u.ugrave_arise = PM_WRAITH; @@ -238,9 +288,31 @@ (mvitals[u.ugrave_arise].mvflags & G_GENOD)) u.ugrave_arise = NON_PM; if (touch_petrifies(mtmp->data)) +#if 0 /*JP*/ + done(STONING); +#else + { + /*JP + topten.c の killed_by_prefix を参照のこと。 + STONING の場合は "石化した" が補われる。 + */ + Strcat(buf, "の攻撃で"); done(STONING); + } +#endif else +#if 0 /*JP*/ + done(DIED); +#else + { + /*JP + DIED の場合は通常 "死んだ" が補われるが、 + 怪物による場合は "に殺された" を補う。 + */ + killer_format = KILLED_SUFFIX; done(DIED); + } +#endif return; } @@ -264,11 +336,19 @@ iflags.window_inited = 0; /* they're gone; force raw_print()ing */ } +#if 0 /*JP*/ raw_print(program_state.gameover ? "Postgame wrapup disrupted." : !program_state.something_worth_saving ? "Program initialization has failed." : "Suddenly, the dungeon collapses."); +#else + raw_print(program_state.gameover ? + "ゲーム終了時の処理が崩壊した." : + !program_state.something_worth_saving ? + "プログラムの初期化に失敗した." : + "突然迷宮が崩れた."); +#endif #if defined(WIZARD) && !defined(MICRO) # if defined(NOTIFY_NETHACK_BUGS) if (!wizard) @@ -278,14 +358,20 @@ raw_print("\nError save file being written.\n"); # else if (!wizard) +/*JP raw_printf("Report error to \"%s\"%s.", +*/ + raw_printf("%sにエラーを報告してください.%s", # ifdef WIZARD_NAME /*(KR1ED)*/ WIZARD_NAME, # else WIZARD, # endif !program_state.something_worth_saving ? "" : +/*JP " and it may be possible to rebuild."); +*/ + "エラー発生.再実行不可能."); # endif if (program_state.something_worth_saving) { set_error_savefile(); @@ -358,10 +444,18 @@ if (invent) { if(taken) +#if 0 /*JP*/ Sprintf(qbuf,"Do you want to see what you had when you %s?", (how == QUIT) ? "quit" : "died"); +#else + Sprintf(qbuf,"%sとき何を持っていたか見ますか?", + (how == QUIT) ? "やめた" : "死んだ"); +#endif else +/*JP Strcpy(qbuf,"Do you want your possessions identified?"); +*/ + Strcpy(qbuf,"持ち物を識別しますか?"); ask = should_query_disclose_option('i', &defquery); if (!done_stopprint) { @@ -382,8 +476,13 @@ ask = should_query_disclose_option('a', &defquery); if (!done_stopprint) { +#if 0 /*JP:T*/ c = ask ? yn_function("Do you want to see your attributes?", ynqchars, defquery) : defquery; +#else + c = ask ? yn_function("属性を見ますか?", + ynqchars, defquery) : defquery; +#endif if (c == 'y') enlightenment(how >= PANICKED ? 1 : 2); /* final */ if (c == 'q') done_stopprint++; @@ -399,8 +498,13 @@ ask = should_query_disclose_option('c', &defquery); if (!done_stopprint) { +#if 0 /*JP:T*/ c = ask ? yn_function("Do you want to see your conduct?", ynqchars, defquery) : defquery; +#else + c = ask ? yn_function("どういう行動をとったか見ますか?", + ynqchars, defquery) : defquery; +#endif if (c == 'y') show_conduct(how >= PANICKED ? 1 : 2); if (c == 'q') done_stopprint++; @@ -424,7 +528,10 @@ Sick = 0; } if (how == CHOKING) init_uhunger(); +/*JP nomovemsg = "You survived that attempt on your life."; +*/ + nomovemsg = "あなたは生きながらえた."; flags.move = 0; if(multi > 0) multi = 0; else multi = -1; if(u.utrap && u.utraptype == TT_LAVA) u.utrap = 0; @@ -503,7 +610,9 @@ char pbuf[BUFSZ]; struct obj *otmp; long value, points; +#if 0 /*JP*/ short dummy; /* object type returned by artifact_name() */ +#endif for (otmp = list; otmp; otmp = otmp->nobj) { if (otmp->oartifact || @@ -518,11 +627,18 @@ makeknown(otmp->otyp); otmp->known = otmp->dknown = otmp->bknown = otmp->rknown = 1; /* assumes artifacts don't have quan > 1 */ +#if 0 /*JP*/ Sprintf(pbuf, "%s%s (worth %ld %s and %ld points)", the_unique_obj(otmp) ? "The " : "", otmp->oartifact ? artifact_name(xname(otmp), &dummy) : OBJ_NAME(objects[otmp->otyp]), value, currency(value), points); +#else + Sprintf(pbuf, "%s(%ld%s,%ldポイントの価値),", + otmp->oartifact ? xname(otmp) : + jtrns_obj(' ', OBJ_NAME(objects[otmp->otyp])), + value, currency(value), points); +#endif putstr(endwin, 0, pbuf); } } @@ -550,7 +666,10 @@ } #ifdef WIZARD if (wizard) { +/*JP You("are a very tricky wizard, it seems."); +*/ + You("とても扱いにくいwizardのようだ."); return; } #endif @@ -566,25 +685,48 @@ /* Avoid killed by "a" burning or "a" starvation */ if (!killer && (how == STARVING || how == BURNING)) killer_format = KILLED_BY; +/*JP Strcpy(kilbuf, (!killer || how >= PANICKED ? deaths[how] : killer)); +*/ + Strcpy(kilbuf, (!killer || how >= PANICKED ? ends[how] : killer)); killer = kilbuf; if (how < PANICKED) u.umortality++; if (Lifesaved && (how <= GENOCIDED)) { +/*JP pline("But wait..."); +*/ + pline("ちょっとまった..."); makeknown(AMULET_OF_LIFE_SAVING); +#if 0 /*JP:T*/ Your("medallion %s!", !Blind ? "begins to glow" : "feels warm"); +#else + Your("魔除けは%s!", + !Blind ? "輝きはじめた" : "暖かくなりはじめた"); +#endif +/*JP if (how == CHOKING) You("vomit ..."); +*/ + if (how == CHOKING) You("胃の中のものを吐いた..."); +/*JP You_feel("much better!"); +*/ + You("気分がよくなった!"); +/*JP pline_The("medallion crumbles to dust!"); +*/ + pline("魔除けはこなごなにくだけた!"); if (uamul) useup(uamul); (void) adjattrib(A_CON, -1, TRUE); if(u.uhpmax <= 0) u.uhpmax = 10; /* arbitrary */ savelife(how); if (how == GENOCIDED) +/*JP pline("Unfortunately you are still genocided..."); +*/ + pline("残念ながら,あなたはもう虐殺されている..."); else { killer = 0; killer_format = 0; @@ -596,9 +738,16 @@ wizard || #endif discover) && (how <= GENOCIDED)) { +/*JP if(yn("Die?") == 'y') goto die; +*/ + if(yn("死んでみる?") == 'y') goto die; +#if 0 /*JP:T*/ pline("OK, so you don't %s.", (how == CHOKING) ? "choke" : "die"); +#else + You("死ななかった."); +#endif if(u.uhpmax <= 0) u.uhpmax = u.ulevel * 8; /* arbitrary */ savelife(how); killer = 0; @@ -625,7 +774,10 @@ * smiling... :-) -3. */ if (moves <= 1 && how < PANICKED) /* You die... --More-- */ +/*JP pline("Do not pass go. Do not collect 200 %s.", currency(200L)); +*/ + pline("注意一秒,怪我一生,死亡一歩."); if (have_windows) wait_synch(); /* flush screen output */ #ifndef NO_SIGNAL @@ -661,10 +813,27 @@ } corpse = mk_named_object(CORPSE, &mons[mnum], u.ux, u.uy, plname); +#if 0 /*JP*/ Sprintf(pbuf, "%s, %s%s", plname, killer_format == NO_KILLER_PREFIX ? "" : killed_by_prefix[how], killer_format == KILLED_BY_AN ? an(killer) : killer); +#else + { + const char *p; + switch(killer_format){ + case NO_KILLER_PREFIX: + p = ""; + break; + case KILLED_SUFFIX: + p = "に殺された"; + break; + default: + p = killed_by_prefix[how]; + } + Sprintf(pbuf, "%s%s%sの墓", killer, p, plname); + } +#endif make_grave(u.ux, u.uy, pbuf); } } @@ -675,7 +844,10 @@ how = DIED; u.umortality++; /* skipped above when how==QUIT */ /* note that killer is pointing at kilbuf */ +/*JP Strcpy(kilbuf, "quit while already on Charon's boat"); +*/ + Strcpy(kilbuf, "カロンの舟に乗っている間に抜けた"); } } if (how == ESCAPED || how == PANICKED) @@ -725,7 +897,10 @@ if (bones_ok) { #ifdef WIZARD +/*JP if (!wizard || yn("Save bones?") == 'y') +*/ + if (!wizard || yn("骨をうめる?") == 'y') #endif savebones(corpse); /* corpse may be invalid pointer now so @@ -761,21 +936,39 @@ /* changing kilbuf really changes killer. we do it this way because killer is declared a (const char *) */ +/*JP if (u.uhave.amulet) Strcat(kilbuf, " (with the Amulet)"); +*/ + if (u.uhave.amulet) Strcat(kilbuf, "魔除けを手に"); else if (how == ESCAPED) { if (Is_astralevel(&u.uz)) /* offered Amulet to wrong deity */ +/*JP Strcat(kilbuf, " (in celestial disgrace)"); +*/ + Strcat(kilbuf, "天上で恥辱を受け脱出した"); else if (carrying(FAKE_AMULET_OF_YENDOR)) +/*JP Strcat(kilbuf, " (with a fake Amulet)"); +*/ + Strcpy(kilbuf, "偽物の魔除けを掴まされ脱出した"); /* don't bother counting to see whether it should be plural */ } if (!done_stopprint) { +#if 0 /*JP*/ Sprintf(pbuf, "%s %s the %s...", Goodbye(), plname, how != ASCENDED ? (const char *) ((flags.female && urole.name.f) ? urole.name.f : urole.name.m) : (const char *) (flags.female ? "Demigoddess" : "Demigod")); +#else + Sprintf(pbuf, "%s%sの%s...", Goodbye(FALSE), + how != ASCENDED ? + (const char *) ((flags.female && urole.jname.f) ? + urole.jname.f : urole.jname.m) : + (const char *) (flags.female ? "女神" : "神"), + plname); +#endif putstr(endwin, 0, pbuf); putstr(endwin, 0, ""); } @@ -805,25 +998,43 @@ keepdogs(TRUE); viz_array[0][0] |= IN_SIGHT; /* need visibility for naming */ mtmp = mydogs; +/*JP if (!done_stopprint) Strcpy(pbuf, "You"); +*/ + if (!done_stopprint) Strcpy(pbuf, "あなた"); if (mtmp) { while (mtmp) { if (!done_stopprint) +/*JP Sprintf(eos(pbuf), " and %s", mon_nam(mtmp)); +*/ + Sprintf(eos(pbuf), "と%s", mon_nam(mtmp)); if (mtmp->mtame) u.urexp += mtmp->mhp; mtmp = mtmp->nmon; } +#if 1 /*JP*/ + if (!done_stopprint) Strcat(pbuf, "は"); +#endif if (!done_stopprint) putstr(endwin, 0, pbuf); pbuf[0] = '\0'; } else { +/*JP if (!done_stopprint) Strcat(pbuf, " "); +*/ + if (!done_stopprint) Strcat(pbuf, "は"); } if (!done_stopprint) { +#if 0 /*JP*/ Sprintf(eos(pbuf), "%s with %ld point%s,", how==ASCENDED ? "went to your reward" : "escaped from the dungeon", u.urexp, plur(u.urexp)); +#else + Sprintf(eos(pbuf), "%ldポイントマークし%s.", + u.urexp, + how==ASCENDED ? "昇天した" : "迷宮から脱出した"); +#endif putstr(endwin, 0, pbuf); } @@ -845,14 +1056,23 @@ otmp->dknown = 1; /* seen it (blindness fix) */ otmp->onamelth = 0; otmp->quan = count; +#if 0 /*JP*/ Sprintf(pbuf, "%8ld %s (worth %ld %s),", +#else + Sprintf(pbuf, "%ld個の%s(%ld%sの価値),", +#endif count, xname(otmp), count * (long)objects[typ].oc_cost, currency(2L)); obfree(otmp, (struct obj *)0); } else { Sprintf(pbuf, +#if 0 /*JP*/ "%8ld worthless piece%s of colored glass,", count, plur(count)); +#else + "%ld個の価値のない色つきガラス,", + count); +#endif } putstr(endwin, 0, pbuf); } @@ -863,33 +1083,63 @@ if (u.uz.dnum == 0 && u.uz.dlevel <= 0) { /* level teleported out of the dungeon; `how' is DIED, due to falling or to "arriving at heaven prematurely" */ +#if 0 /*JP*/ Sprintf(pbuf, "You %s beyond the confines of the dungeon", (u.uz.dlevel < 0) ? "passed away" : ends[how]); +#else + Sprintf(pbuf, "迷宮の領域を越え%s.", + (u.uz.dlevel < 0) ? "消えさった" : ends[how]); +#endif } else { /* more conventional demise */ const char *where = dungeons[u.uz.dnum].dname; +/*JP if (Is_astralevel(&u.uz)) where = "The Astral Plane"; +*/ + if (In_endgame(&u.uz)) where = "精霊界にて"; +/*JP Sprintf(pbuf, "You %s in %s", ends[how], where); +*/ + Sprintf(pbuf, "あなたは%s", jtrns_obj('d', where)); if (!In_endgame(&u.uz) && !Is_knox(&u.uz)) +/*JP Sprintf(eos(pbuf), " on dungeon level %d", +*/ + Sprintf(eos(pbuf), "の地下%d階で", In_quest(&u.uz) ? dunlev(&u.uz) : depth(&u.uz)); } +#if 0 /*JP*/ Sprintf(eos(pbuf), " with %ld point%s,", u.urexp, plur(u.urexp)); +#else + Sprintf(eos(pbuf), " %ldポイントをマークし,", + u.urexp); +#endif putstr(endwin, 0, pbuf); } if (!done_stopprint) { +#if 0 /*JP*/ Sprintf(pbuf, "and %ld piece%s of gold, after %ld move%s.", umoney, plur(umoney), moves, plur(moves)); +#else + Sprintf(pbuf, "%ld枚の金貨を持って,%ld歩動いた.", + u.ugold, moves); +#endif putstr(endwin, 0, pbuf); } if (!done_stopprint) { +#if 0 /*JP*/ Sprintf(pbuf, "You were level %d with a maximum of %d hit point%s when you %s.", u.ulevel, u.uhpmax, plur(u.uhpmax), ends[how]); +#else + Sprintf(pbuf, + "%sとき,あなたはレベル%uで,最大体力は%dであった.", + ends[how],u.ulevel, u.uhpmax); +#endif putstr(endwin, 0, pbuf); putstr(endwin, 0, ""); } @@ -929,7 +1179,10 @@ continue; /* wrong type of container */ } else if (box->cobj) { winid tmpwin = create_nhwindow(NHW_MENU); +/*JP Sprintf(buf, "Contents of %s:", the(xname(box))); +*/ + Sprintf(buf, "%sの中身:", the(xname(box))); putstr(tmpwin, 0, buf); putstr(tmpwin, 0, ""); for (obj = box->cobj; obj; obj = obj->nobj) { @@ -945,7 +1198,10 @@ if (all_containers) container_contents(box->cobj, identified, TRUE); } else { +/*JP pline("%s empty.", Tobjnam(box, "are")); +*/ + pline("%sは空っぽだ.", xname(box)); display_nhwindow(WIN_MESSAGE, FALSE); } } @@ -970,6 +1226,15 @@ dlb_cleanup(); } +#if 1 /*JP*/ + jputchar('\0'); /* reset terminal */ + if (iflags.DECgraphics){ + putchar(033); + putchar('$'); + putchar(')'); + putchar('B'); + } +#endif nethack_exit(status); } @@ -985,6 +1250,9 @@ winid klwin; char buf[BUFSZ]; +#ifdef GCC_WARN + c = 0; +#endif /* get totals first */ for (i = LOW_PM; i < NUMMONS; i++) { if (mvitals[i].died) ntypes++; @@ -996,12 +1264,20 @@ * includes all dead monsters, not just those killed by the player */ if (ntypes != 0) { +#if 0 /*JP:T*/ c = ask ? yn_function("Do you want an account of creatures vanquished?", ynqchars, defquery) : defquery; +#else + c = ask ? yn_function("倒した敵の一覧を見ますか?", + ynqchars, defquery) : defquery; +#endif if (c == 'q') done_stopprint++; if (c == 'y') { klwin = create_nhwindow(NHW_MENU); +/*JP putstr(klwin, 0, "Vanquished creatures:"); +*/ + putstr(klwin, 0, "倒した敵:"); putstr(klwin, 0, ""); /* countdown by monster "toughness" */ @@ -1009,10 +1285,16 @@ for (i = LOW_PM; i < NUMMONS; i++) if (mons[i].mlevel == lev && (nkilled = mvitals[i].died) > 0) { if ((mons[i].geno & G_UNIQ) && i != PM_HIGH_PRIEST) { +#if 0 /*JP*/ Sprintf(buf, "%s%s", !type_is_pname(&mons[i]) ? "The " : "", mons[i].mname); +#else + Sprintf(buf, "%s", + jtrns_mon(mons[i].mname)); +#endif if (nkilled > 1) { +#if 0 /*JP*/ switch (nkilled) { case 2: Sprintf(eos(buf)," (twice)"); break; case 3: Sprintf(eos(buf)," (thrice)"); break; @@ -1020,15 +1302,26 @@ nkilled, plur(nkilled)); break; } +#else + Sprintf(eos(buf)," (%d回)", nkilled); +#endif } } else { /* trolls or undead might have come back, but we don't keep track of that */ if (nkilled == 1) +/*JP Strcpy(buf, an(mons[i].mname)); +*/ + Strcpy(buf, jtrns_mon(mons[i].mname)); else +#if 0 /*JP*/ Sprintf(buf, "%d %s", nkilled, makeplural(mons[i].mname)); +#else + Sprintf(buf, "%d体の%s", + nkilled, jtrns_mon(mons[i].mname)); +#endif } putstr(klwin, 0, buf); } @@ -1038,7 +1331,10 @@ */ if (ntypes > 1) { putstr(klwin, 0, ""); +/*JP Sprintf(buf, "%ld creatures vanquished.", total_killed); +*/ + Sprintf(buf, "%ld匹の敵を倒した.", total_killed); putstr(klwin, 0, buf); } display_nhwindow(klwin, TRUE); @@ -1070,31 +1366,52 @@ winid klwin; char buf[BUFSZ]; +#ifdef GCC_WARN + c = 0; +#endif ngenocided = num_genocides(); /* genocided species list */ if (ngenocided != 0) { +#if 0 /*JP:T*/ c = ask ? yn_function("Do you want a list of species genocided?", ynqchars, defquery) : defquery; +#else + c = ask ? yn_function("虐殺した種の一覧を見ますか?", + ynqchars, defquery) : defquery; +#endif if (c == 'q') done_stopprint++; if (c == 'y') { klwin = create_nhwindow(NHW_MENU); +/*JP putstr(klwin, 0, "Genocided species:"); +*/ + putstr(klwin, 0, "虐殺した種:"); putstr(klwin, 0, ""); for (i = LOW_PM; i < NUMMONS; i++) if (mvitals[i].mvflags & G_GENOD) { if ((mons[i].geno & G_UNIQ) && i != PM_HIGH_PRIEST) +#if 0 /*JP*/ Sprintf(buf, "%s%s", !type_is_pname(&mons[i]) ? "" : "the ", mons[i].mname); +#else + Sprintf(buf, "%s", jtrns_mon(mons[i].mname)); +#endif else +/*JP Strcpy(buf, makeplural(mons[i].mname)); +*/ + Strcpy(buf, jtrns_mon(mons[i].mname)); putstr(klwin, 0, buf); } putstr(klwin, 0, ""); +/*JP Sprintf(buf, "%d species genocided.", ngenocided); +*/ + Sprintf(buf, "%d種類の種を虐殺した.", ngenocided); putstr(klwin, 0, buf); display_nhwindow(klwin, TRUE); diff -aurbN -xCVS -xXTAGS nethack/src/engrave.c jnethack/src/engrave.c --- nethack/src/engrave.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/engrave.c 2005-06-11 04:52:13.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "lev.h" #include @@ -11,6 +18,7 @@ #ifdef OVLB /* random engravings */ static const char *random_mesg[] = { +#if 0 /*JP*/ "Elbereth", /* trap engravings */ "Vlad was here", "ad aerarium", @@ -33,6 +41,36 @@ "You've got mail!", /* AOL */ #endif "As if!", /* Clueless */ + "Moon prism power make up!", /* Sailor Moon */ + "Lizard's Tail!", /* Mahoujin Guru Guru */ + "It's a show time!" /* St. Tail */ +#else + "Elbereth", + /* trap engravings */ + "ヴラドはここにいる", "ad aerarium", + /* take-offs and other famous engravings */ + "Owlbreath", "Galadriel", + "キルロイ参上", + "A.S. ->", "<- A.S.", /* Journey to the Center of the Earth */ + "それはできません.", /* 昔のアドベンチャーゲーム */ + "ここから入らんとするものは全て希望を捨てよ.", /* 神曲:地獄編, ダンテ */ + "よく来たな", /* Prisoner */ + "ご迷惑をおかけしたことを深くお詫びいたします.", /* So Long... */ + "早く来い来い木曜日", /* アメリカ横断ウルトラクイズ */ + "のらくろ", + "バイア☆ラ 8?7-5309", + "動物にエサを与えないでください.", /* Various zoos around the world */ + "私負けましたわ", /* 回文 */ + "イチ推し!", /* Siskel & Ebert */ + "Hello, World!", /* The First C Program */ +#ifdef MAIL + "ユー・ガッタ・メール!", /* AOL */ +#endif + "冗談じゃない!", /* Clueless */ /* 参考: http://www.iris.dti.ne.jp/~yfurui/alicia/rep_asif.html */ + "ムーン・クリスタル・パワー・メイクアップ!", /* Sailor Moon */ + "とかげのしっぽ!", /* Mahoujin Guru Guru */ + "イッツ・ア・ショウタイム!" /* St. Tail */ +#endif }; char * @@ -69,6 +107,7 @@ {'0', "C("}, {'1', "|"}, {'6', "o"}, {'7', "/"}, {'8', "3o"} }; +/*JP*/ void wipeout_text(engr, cnt, seed) @@ -76,7 +115,11 @@ int cnt; unsigned seed; /* for semi-controlled randomization */ { +#if 0 /*JP*/ char *s; +#else + unsigned char *s; +#endif int i, j, nxt, use_rubout, lth = (int)strlen(engr); if (lth && cnt > 0) { @@ -94,9 +137,36 @@ seed *= 31, seed %= (BUFSZ-1); use_rubout = seed & 3; } +#if 0 /*JP*/ s = &engr[nxt]; +#else +/*JP +** 2BYTE文字を間違わずに消す +** +** 英語では,'E' -> 'F' など断片的に文字が消えていくようなエンコーディングを +** しているが,日本語ではとりあえず保留. +*/ + + if(is_kanji2(engr, nxt)) + --nxt; + + s = (unsigned char *)&engr[nxt]; if (*s == ' ') continue; + if(is_kanji1(engr, nxt)){ + + if(engr[nxt] == "?"[0] && engr[nxt+1] == "?"[1]){ + s[0] = ' '; + s[1] = ' '; + continue; + } + else{ + s[0] = "?"[0]; + s[1] = "?"[1]; + continue; + } + } +#endif /* rub out unreadable & small punctuation marks */ if (index("?.,'`-|_", *s)) { *s = ' '; @@ -152,28 +222,61 @@ if ((x == u.ux) && (y == u.uy) && u.uswallow && is_animal(u.ustuck->data)) +/*JP return "maw"; +*/ + return "胃袋"; else if (IS_AIR(lev->typ) && Is_airlevel(&u.uz)) +/*JP return "air"; +*/ + return "空中"; else if (is_pool(x,y)) +/*JP return (Underwater && !Is_waterlevel(&u.uz)) ? "bottom" : "water"; +*/ + return (Underwater && !Is_waterlevel(&u.uz)) ? "水の底" : "水中"; else if (is_ice(x,y)) +/*JP return "ice"; +*/ + return "氷"; else if (is_lava(x,y)) +/*JP return "lava"; +*/ + return "溶岩"; else if (lev->typ == DRAWBRIDGE_DOWN) +/*JP return "bridge"; +*/ + return "橋"; else if(IS_ALTAR(levl[x][y].typ)) +/*JP return "altar"; +*/ + return "祭壇"; else if(IS_GRAVE(levl[x][y].typ)) +/*JP return "headstone"; +*/ + return "墓石"; else if(IS_FOUNTAIN(levl[x][y].typ)) +/*JP return "fountain"; +*/ + return "泉"; else if ((IS_ROOM(lev->typ) && !Is_earthlevel(&u.uz)) || IS_WALL(lev->typ) || IS_DOOR(lev->typ) || lev->typ == SDOOR) +/*JP return "floor"; +*/ + return "床"; else +/*JP return "ground"; +*/ + return "地面"; } const char * @@ -187,20 +290,41 @@ * see check_special_room() */ if (*in_rooms(x,y,VAULT)) +/*JP what = "vault's ceiling"; +*/ + what = "倉庫の天井"; else if (*in_rooms(x,y,TEMPLE)) +/*JP what = "temple's ceiling"; +*/ + what = "寺院の天井"; else if (*in_rooms(x,y,SHOPBASE)) +/*JP what = "shop's ceiling"; +*/ + what = "店の天井"; else if (IS_AIR(lev->typ)) +/*JP what = "sky"; +*/ + what = "空"; else if (Underwater) +/*JP what = "water's surface"; +*/ + what = "水面"; else if ((IS_ROOM(lev->typ) && !Is_earthlevel(&u.uz)) || IS_WALL(lev->typ) || IS_DOOR(lev->typ) || lev->typ == SDOOR) +/*JP what = "ceiling"; +*/ + what = "天井"; else +/*JP what = "rock above"; +*/ + what = "上方の岩"; return what; } @@ -289,31 +413,50 @@ case DUST: if(!Blind) { sensed = 1; +#if 0 /*JP*/ pline("%s is written here in the %s.", Something, is_ice(x,y) ? "frost" : "dust"); +#else + pline("何かの文字が%sに書いてある.", + is_ice(x,y) ? "氷" : "ほこり"); +#endif } break; case ENGRAVE: case HEADSTONE: if (!Blind || can_reach_floor()) { sensed = 1; +#if 0 /*JP*/ pline("%s is engraved here on the %s.", Something, surface(x,y)); +#else + pline("何かの文字が%sに刻まれている.", + surface(x,y)); +#endif } break; case BURN: if (!Blind || can_reach_floor()) { sensed = 1; +#if 0 /*JP*/ pline("Some text has been %s into the %s here.", is_ice(x,y) ? "melted" : "burned", surface(x,y)); +#else + pline("何かの文字が%s%sいる.", + surface(x,y), + is_ice(x,y) ? "に刻まれて" : "で燃えて"); +#endif } break; case MARK: if(!Blind) { sensed = 1; +/*JP pline("There's some graffiti on the %s here.", +*/ + pline("%sに落書がある.", surface(x,y)); } break; @@ -324,7 +467,10 @@ */ if(!Blind) { sensed = 1; +/*JP You("see a message scrawled in blood here."); +*/ + You("血文字がなぐり書きされているのを見つけた."); } break; default: @@ -334,15 +480,23 @@ } if (sensed) { char *et; +/*JP unsigned maxelen = BUFSZ - sizeof("You feel the words: \"\". "); +*/ + unsigned maxelen = BUFSZ - sizeof("あなたは次のように感じた:「」"); if (strlen(ep->engr_txt) > maxelen) { (void) strncpy(buf, ep->engr_txt, (int)maxelen); buf[maxelen] = '\0'; et = buf; } else et = ep->engr_txt; +#if 0 /*JP*/ You("%s: \"%s\".", (Blind) ? "feel the words" : "read", et); +#else + You("%s:「%s」", + (Blind) ? "次のように感じた" : "読んだ", ep->engr_txt); +#endif if(flags.run > 1) nomul(0); } } @@ -392,6 +546,7 @@ int freehand() { + return(!uwep || !welded(uwep) || (!bimanual(uwep) && (!uarms || !uarms->cursed))); /* if ((uwep && bimanual(uwep)) || @@ -473,26 +628,44 @@ if(u.uswallow) { if (is_animal(u.ustuck->data)) { +/*JP pline("What would you write? \"Jonah was here\"?"); +*/ + pline("何を書くんだい?「ヨナはここにいる」?"); return(0); } else if (is_whirly(u.ustuck->data)) { +/*JP You_cant("reach the %s.", surface(u.ux,u.uy)); +*/ + You("%sに届かない.", surface(u.ux,u.uy)); return(0); } else jello = TRUE; } else if (is_lava(u.ux, u.uy)) { +/*JP You_cant("write on the lava!"); +*/ + You("溶岩には書けない!"); return(0); } else if (is_pool(u.ux,u.uy) || IS_FOUNTAIN(levl[u.ux][u.uy].typ)) { +/*JP You_cant("write on the water!"); +*/ + You("水には書けない!"); return(0); } if(Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)/* in bubble */) { +/*JP You_cant("write in thin air!"); +*/ + You("空中には書けない!"); return(0); } if (cantwield(youmonst.data)) { +/*JP You_cant("even hold anything!"); +*/ + You("何も持てない!"); return(0); } if (check_capacity((char *)0)) return (0); @@ -511,31 +684,54 @@ * while both your hands are tied up. */ if (!freehand() && otmp != uwep && !otmp->owornmask) { +/*JP You("have no free %s to write with!", body_part(HAND)); +*/ + pline("%sの自由が効かないので書けない!", body_part(HAND)); return(0); } if (jello) { +/*JP You("tickle %s with your %s.", mon_nam(u.ustuck), writer); +*/ + You("%sで%sをくすぐった.", writer, mon_nam(u.ustuck)); +/*JP Your("message dissolves..."); +*/ + Your("メッセージは消えた..."); return(0); } if (otmp->oclass != WAND_CLASS && !can_reach_floor()) { +/*JP You_cant("reach the %s!", surface(u.ux,u.uy)); +*/ + You("%sに届かない!", surface(u.ux,u.uy)); return(0); } if (IS_ALTAR(levl[u.ux][u.uy].typ)) { +/*JP You("make a motion towards the altar with your %s.", writer); +*/ + You("%sを使って祭壇に書こうとした.", writer); altar_wrath(u.ux, u.uy); return(0); } if (IS_GRAVE(levl[u.ux][u.uy].typ)) { if (otmp == &zeroobj) { /* using only finger */ +#if 0 /*JP:T*/ You("would only make a small smudge on the %s.", surface(u.ux, u.uy)); +#else + You("は%sに小さなしみをつけることしかできなかった.", + surface(u.ux, u.uy)); +#endif return(0); } else if (!levl[u.ux][u.uy].disturbed) { +/*JP You("disturb the undead!"); +*/ + You("不死の者の眠りを妨げた!"); levl[u.ux][u.uy].disturbed = 1; (void) makemon(&mons[PM_GHOUL], u.ux, u.uy, NO_MM_FLAGS); exercise(A_WIS, FALSE); @@ -572,7 +768,10 @@ /* Objects too large to engrave with */ case BALL_CLASS: case ROCK_CLASS: +/*JP You_cant("engrave with such a large object!"); +*/ + pline("そんな大きなものを使って文字を刻めない!"); ptext = FALSE; break; @@ -580,8 +779,13 @@ case FOOD_CLASS: case SCROLL_CLASS: case SPBOOK_CLASS: +#if 0 /*JP*/ Your("%s would get %s.", xname(otmp), is_ice(u.ux,u.uy) ? "all frosty" : "too dirty"); +#else + Your("%sは%sなった.", xname(otmp), + is_ice(u.ux,u.uy) ? "氷づけに" : "汚なく"); +#endif ptext = FALSE; break; @@ -621,20 +825,29 @@ */ case WAN_STRIKING: Strcpy(post_engr_text, +/*JP "The wand unsuccessfully fights your attempt to write!" +*/ + "あなたが書こうとすると杖は抵抗した!" ); break; case WAN_SLOW_MONSTER: if (!Blind) { Sprintf(post_engr_text, +/*JP "The bugs on the %s slow down!", +*/ + "%sの上の虫の動きが遅くなった!", surface(u.ux, u.uy)); } break; case WAN_SPEED_MONSTER: if (!Blind) { Sprintf(post_engr_text, +/*JP "The bugs on the %s speed up!", +*/ + "%sの上の虫の動きが速くなった!", surface(u.ux, u.uy)); } break; @@ -659,7 +872,10 @@ ptext = TRUE; if (!Blind) { Sprintf(post_engr_text, +/*JP "The %s is riddled by bullet holes!", +*/ + "%sは散弾で細かい穴だらけになった!", surface(u.ux, u.uy)); } break; @@ -669,7 +885,10 @@ case WAN_DEATH: if (!Blind) { Sprintf(post_engr_text, +/*JP "The bugs on the %s stop moving!", +*/ + "%sの上の虫の動きが止まった!", surface(u.ux, u.uy)); } break; @@ -677,14 +896,20 @@ case WAN_COLD: if (!Blind) Strcpy(post_engr_text, +/*JP "A few ice cubes drop from the wand."); +*/ + "氷のかけらが杖からこぼれ落ちた."); if(!oep || (oep->engr_type != BURN)) break; case WAN_CANCELLATION: case WAN_MAKE_INVISIBLE: if (oep && oep->engr_type != HEADSTONE) { if (!Blind) +/*JP pline_The("engraving on the %s vanishes!", +*/ + pline("%sの上の文字は消えた!", surface(u.ux,u.uy)); dengr = TRUE; } @@ -692,7 +917,10 @@ case WAN_TELEPORTATION: if (oep && oep->engr_type != HEADSTONE) { if (!Blind) +/*JP pline_The("engraving on the %s vanishes!", +*/ + pline("%sの上の文字は消えた!", surface(u.ux,u.uy)); teleengr = TRUE; } @@ -704,19 +932,35 @@ type = ENGRAVE; if(!objects[otmp->otyp].oc_name_known) { if (flags.verbose) +#if 0 /*JP*/ pline("This %s is a wand of digging!", xname(otmp)); +#else + pline("これは穴掘りの杖だ!"); +#endif doknown = TRUE; } if (!Blind) +#if 0 /*JP*/ Strcpy(post_engr_text, IS_GRAVE(levl[u.ux][u.uy].typ) ? "Chips fly out from the headstone." : is_ice(u.ux,u.uy) ? "Ice chips fly up from the ice surface!" : "Gravel flies up from the floor."); +#else + Strcpy(post_engr_text, + IS_GRAVE(levl[u.ux][u.uy].typ) ? + "墓石から破片が飛び散った." : + is_ice(u.ux,u.uy) ? + "氷の表面から氷のかけらが飛び散った." : + "砂利が床から飛び散った."); +#endif else +/*JP Strcpy(post_engr_text, "You hear drilling!"); +*/ + Strcpy(post_engr_text, "穴が開く音を聞いた!"); break; /* type = BURN wands */ @@ -725,28 +969,49 @@ type = BURN; if(!objects[otmp->otyp].oc_name_known) { if (flags.verbose) +/*JP pline("This %s is a wand of fire!", xname(otmp)); +*/ + pline("これは炎の杖だ!"); doknown = TRUE; } +#if 0 /*JP*/ Strcpy(post_engr_text, Blind ? "You feel the wand heat up." : "Flames fly from the wand."); +#else + Strcpy(post_engr_text, + Blind ? "杖が暖かくなったような気がした." : + "炎が杖から飛び散った."); +#endif break; case WAN_LIGHTNING: ptext = TRUE; type = BURN; if(!objects[otmp->otyp].oc_name_known) { if (flags.verbose) +#if 0 /*JP*/ pline("This %s is a wand of lightning!", xname(otmp)); +#else + pline("これは雷の杖だ!"); +#endif doknown = TRUE; } if (!Blind) { +#if 0 /*JP*/ Strcpy(post_engr_text, "Lightning arcs from the wand."); +#else + Strcpy(post_engr_text, + "火花が杖から飛び散った."); +#endif doblind = TRUE; } else +/*JP Strcpy(post_engr_text, "You hear crackling!"); +*/ + Strcpy(post_engr_text, "パチパチという音を聞いた!"); break; /* type = MARK wands */ @@ -754,7 +1019,10 @@ } } else /* end if zappable */ if (!can_reach_floor()) { +/*JP You_cant("reach the %s!", surface(u.ux,u.uy)); +*/ + You("%sに届かない!", surface(u.ux,u.uy)); return(0); } break; @@ -764,20 +1032,29 @@ if ((int)otmp->spe > -3) type = ENGRAVE; else +/*JP Your("%s too dull for engraving.", aobjnam(otmp,"are")); +*/ + pline("%sは刃がボロボロで,文字を彫れない.",xname(otmp)); } break; case TOOL_CLASS: if(otmp == ublindf) { pline( +/*JP "That is a bit difficult to engrave with, don't you think?"); +*/ + "ちょっとそれで彫るのは大変だろう,そう思わない?"); return(0); } switch (otmp->otyp) { case MAGIC_MARKER: if (otmp->spe <= 0) +/*JP Your("marker has dried out."); +*/ + Your("マーカは乾ききった."); else type = MARK; break; @@ -789,19 +1066,36 @@ (oep->engr_type == ENGR_BLOOD) || (oep->engr_type == MARK )) { if (!Blind) +/*JP You("wipe out the message here."); +*/ + You("メッセージを拭きとった."); else +#if 0 /*JP*/ Your("%s %s %s.", xname(otmp), otense(otmp, "get"), is_ice(u.ux,u.uy) ? "frosty" : "dusty"); +#else + pline("%sは%sなった.", xname(otmp), + is_ice(u.ux,u.uy) ? + "氷づけに" : "ほこりまみれに"); +#endif dengr = TRUE; } else +/*JP Your("%s can't wipe out this engraving.", +*/ + pline("この文字は%sでは拭きとれない.", xname(otmp)); else +#if 0 /*JP*/ Your("%s %s %s.", xname(otmp), otense(otmp, "get"), is_ice(u.ux,u.uy) ? "frosty" : "dusty"); +#else + pline("%sは%sなった.", xname(otmp), + is_ice(u.ux,u.uy) ? "氷づけに" : "ほこりまみれに"); +#endif break; default: break; @@ -811,7 +1105,10 @@ case VENOM_CLASS: #ifdef WIZARD if (wizard) { +/*JP pline("Writing a poison pen letter??"); +*/ + pline("ふむ.これこそ本当の毒舌だ."); break; } #endif @@ -853,23 +1150,39 @@ /* Something has changed the engraving here */ if (*buf) { make_engr_at(u.ux, u.uy, buf, moves, type); +/*JP pline_The("engraving now reads: \"%s\".", buf); +*/ + pline("刻まれた文字を読んだ:「%s」.", buf); ptext = FALSE; } if (zapwand && (otmp->spe < 0)) { +#if 0 /*JP*/ pline("%s %sturns to dust.", The(xname(otmp)), Blind ? "" : "glows violently, then "); +#else + pline("%sは%sちりとなった.", + xname(otmp), Blind ? "" : "激しく輝き,"); +#endif if (!IS_GRAVE(levl[u.ux][u.uy].typ)) +#if 0 /*JP*/ You("are not going to get anywhere trying to write in the %s with your dust.", is_ice(u.ux,u.uy) ? "frost" : "dust"); +#else + You("塵で%sに何か書こうとしたが,できなかった.", + is_ice(u.ux,u.uy) ? "氷" : "ほこり"); +#endif useup(otmp); ptext = FALSE; } if (!ptext) { /* Early exit for some implements. */ if (otmp->oclass == WAND_CLASS && !can_reach_floor()) +/*JP You_cant("reach the %s!", surface(u.ux,u.uy)); +*/ + You("%sに届かない!", surface(u.ux,u.uy)); return(1); } @@ -887,7 +1200,10 @@ c = 'y'; } else if ( (type == oep->engr_type) && (!Blind || (oep->engr_type == BURN) || (oep->engr_type == ENGRAVE)) ) { +/*JP c = yn_function("Do you want to add to the current engraving?", +*/ + c = yn_function("何か書き加えますか?", ynqchars, 'y'); if (c == 'q') { pline(Never_mind); @@ -900,10 +1216,17 @@ if( (oep->engr_type == DUST) || (oep->engr_type == ENGR_BLOOD) || (oep->engr_type == MARK) ) { if (!Blind) { +#if 0 /*JP*/ You("wipe out the message that was %s here.", ((oep->engr_type == DUST) ? "written in the dust" : ((oep->engr_type == ENGR_BLOOD) ? "scrawled in blood" : "written"))); +#else + You("%sメッセージを拭きとった.", + ((oep->engr_type == DUST) ? "ほこりに書かれている" : + ((oep->engr_type == BLOOD) ? "血文字でなぐり書きされている" : + "書かれている"))); +#endif del_engr(oep); oep = (struct engr *)0; } else @@ -911,16 +1234,26 @@ eow = TRUE; } else if ( (type == DUST) || (type == MARK) || (type == ENGR_BLOOD) ) { +#if 0 /*JP*/ You( "cannot wipe out the message that is %s the %s here.", oep->engr_type == BURN ? (is_ice(u.ux,u.uy) ? "melted into" : "burned into") : "engraved in", surface(u.ux,u.uy)); +#else + You("%sメッセージを拭きとれなかった.", + ((oep->engr_type == DUST) ? "ほこりに書かれている" : + ((oep->engr_type == BLOOD) ? "血文字でなぐり書きされている" : + "書かれている"))); +#endif return(1); } else if ( (type != oep->engr_type) || (c == 'n') ) { if (!Blind || can_reach_floor()) +/*JP You("will overwrite the current message."); +*/ + You("メッセージを上書きしようとした."); eow = TRUE; } } @@ -929,47 +1262,98 @@ eloc = surface(u.ux,u.uy); switch(type){ default: +#if 0 /*JP*/ everb = (oep && !eow ? "add to the weird writing on" : "write strangely on"); +#else + everb = (oep && !eow ? "奇妙な文字列に書き加える" : + "奇妙な文字列を書く"); +#endif break; case DUST: +#if 0 /*JP*/ everb = (oep && !eow ? "add to the writing in" : "write in"); +#else + everb = (oep && !eow ? "書き加える" : + "書く"); +#endif +/*JP eloc = is_ice(u.ux,u.uy) ? "frost" : "dust"; +*/ + eloc = is_ice(u.ux,u.uy) ? "氷" : "ほこり"; break; case HEADSTONE: +#if 0 /*JP*/ everb = (oep && !eow ? "add to the epitaph on" : "engrave on"); +#else + everb = (oep && !eow ? "墓碑銘を刻み加える" : + "墓碑銘を刻む"); +#endif break; case ENGRAVE: +#if 0 /*JP*/ everb = (oep && !eow ? "add to the engraving in" : "engrave in"); +#else + everb = (oep && !eow ? "刻み加える" : + "刻む"); +#endif break; case BURN: +#if 0 /*JP*/ everb = (oep && !eow ? ( is_ice(u.ux,u.uy) ? "add to the text melted into" : "add to the text burned into") : ( is_ice(u.ux,u.uy) ? "melt into" : "burn into")); +#else + everb = (oep && !eow ? + ( is_ice(u.ux,u.uy) ? "刻み加える" : + "燃えている文字に書き加える") : + ( is_ice(u.ux,u.uy) ? "刻む" : "焼印をいれる")); +#endif break; case MARK: +#if 0 /*JP*/ everb = (oep && !eow ? "add to the graffiti on" : "scribble on"); +#else + everb = (oep && !eow ? "落書に書き加える" : + "はしり書きする"); +#endif break; case ENGR_BLOOD: +#if 0 /*JP*/ everb = (oep && !eow ? "add to the scrawl on" : "scrawl on"); +#else + everb = (oep && !eow ? "なぐり書きに書き加える" : + "なぐり書きする"); +#endif break; } /* Tell adventurer what is going on */ if (otmp != &zeroobj) +/*JP You("%s the %s with %s.", everb, eloc, doname(otmp)); +*/ + You("%sで%sに%s.", doname(otmp), eloc, jpast(everb)); else +#if 0 /*JP*/ You("%s the %s with your %s.", everb, eloc, makeplural(body_part(FINGER))); +#else + You("%sで%sに%s.", makeplural(body_part(FINGER)), + eloc, jpast(everb)); +#endif /* Prompt for engraving! */ +/*JP Sprintf(qbuf,"What do you want to %s the %s here?", everb, eloc); +*/ + Sprintf(qbuf,"%sに何と%sか?", eloc, jpolite(everb)); getlin(qbuf, ebuf); /* Count the actual # of chars engraved not including spaces */ @@ -979,8 +1363,12 @@ if (len == 0 || index(ebuf, '\033')) { if (zapwand) { if (!Blind) +#if 0 /*JP*/ pline("%s, then %s.", Tobjnam(otmp, "glow"), otense(otmp, "fade")); +#else + pline("%sは輝いたが,すぐに消えた.", xname(otmp)); +#endif return(1); } else { pline(Never_mind); @@ -995,12 +1383,27 @@ /* Mix up engraving if surface or state of mind is unsound. Note: this won't add or remove any spaces. */ for (sp = ebuf; *sp; sp++) { +#if 0 /*JP*/ if (isspace(*sp)) continue; +#else + if (isspace_8(*sp)) continue; +#endif if (((type == DUST || type == ENGR_BLOOD) && !rn2(25)) || (Blind && !rn2(11)) || (Confusion && !rn2(7)) || (Stunned && !rn2(4)) || (Hallucination && !rn2(2))) +#if 0 /*JP*/ *sp = ' ' + rnd(96 - 2); /* ASCII '!' thru '~' (excludes ' ' and DEL) */ +#else + { + if(is_kanji1(ebuf, sp-ebuf)) + jrndm_replace(sp); + else if(is_kanji2(ebuf, sp-ebuf)) + jrndm_replace(sp-1); + else + *sp = '!' + rn2(93); /* ASCII-code only */ + } +#endif } /* Previous engraving is overwritten */ @@ -1015,11 +1418,17 @@ switch(type){ default: multi = -(len/10); +/*JP if (multi) nomovemsg = "You finish your weird engraving."; +*/ + if (multi) nomovemsg = "あなたは奇妙な刻みを終えた."; break; case DUST: multi = -(len/10); +/*JP if (multi) nomovemsg = "You finish writing in the dust."; +*/ + if (multi) nomovemsg = "あなたはほこりに書き終えた."; break; case HEADSTONE: case ENGRAVE: @@ -1034,11 +1443,17 @@ * However, you could now engrave "Elb", then * "ere", then "th". */ +/*JP Your("%s dull.", aobjnam(otmp, "get")); +*/ + Your("%sは刃こぼれした.", xname(otmp)); if (otmp->unpaid) { struct monst *shkp = shop_keeper(*u.ushops); if (shkp) { +/*JP You("damage it, you pay for it!"); +*/ + You("未払いのものに傷をつけてしまった.支払いをしなきゃ!"); bill_dummy_object(otmp); } } @@ -1052,14 +1467,22 @@ if ( (otmp->oclass == RING_CLASS) || (otmp->oclass == GEM_CLASS) ) multi = -len; +/*JP if (multi) nomovemsg = "You finish engraving."; +*/ + if (multi) nomovemsg = "あなたは刻み終えた."; break; case BURN: multi = -(len/10); if (multi) nomovemsg = is_ice(u.ux,u.uy) ? +#if 0 /*JP*/ "You finish melting your message into the ice.": "You finish burning your message into the floor."; +#else + "氷へメッセージを刻み終えた.": + "炎へメッセージを焼きいれ終えた."; +#endif break; case MARK: multi = -(len/10); @@ -1067,29 +1490,51 @@ (otmp->otyp == MAGIC_MARKER)) { maxelen = (otmp->spe) * 2; /* one charge / 2 letters */ if (len > maxelen) { +/*JP Your("marker dries out."); +*/ + Your("マーカは乾ききった."); otmp->spe = 0; multi = -(maxelen/10); } else if (len > 1) otmp->spe -= len >> 1; else otmp->spe -= 1; /* Prevent infinite grafitti */ } +/*JP if (multi) nomovemsg = "You finish defacing the dungeon."; +*/ + if (multi) nomovemsg = "あなたは迷宮への落書を書き終えた."; break; case ENGR_BLOOD: multi = -(len/10); +/*JP if (multi) nomovemsg = "You finish scrawling."; +*/ + if (multi) nomovemsg = "はしり書きを書き終えた."; break; } /* Chop engraving down to size if necessary */ if (len > maxelen) { for (sp = ebuf; (maxelen && *sp); sp++) +/*JP if (!isspace(*sp)) maxelen--; +*/ + if (!isspace_8(*sp)) maxelen--; if (!maxelen && *sp) { +#if 1 /*JP*/ + if(is_kanji2(ebuf, sp - ebuf)) + --sp; +#endif *sp = (char)0; +/*JP if (multi) nomovemsg = "You cannot write any more."; +*/ + if (multi) nomovemsg = "これ以上何も書けなかった."; +/*JP You("only are able to write \"%s\"", ebuf); +*/ + You("「%s」とまでしか書けなかった.", ebuf); } } @@ -1103,7 +1548,10 @@ if (post_engr_text[0]) pline(post_engr_text); if (doblind && !resists_blnd(&youmonst)) { +/*JP You("are blinded by the flash!"); +*/ + You("まばゆい光で目がくらんだ!"); make_blinded((long)rnd(50),FALSE); if (!Blind) Your(vision_clears); } @@ -1201,6 +1649,7 @@ /* Epitaphs for random headstones */ static const char *epitaphs[] = { +#if 0 /*JP*/ "Rest in peace", "R.I.P.", "Rest In Pieces", @@ -1230,6 +1679,35 @@ "Soon ripe. Soon rotten. Soon gone. But not forgotten.", "Here lies the body of Jonathan Blake. Stepped on the gas instead of the brake.", "Go away!" +#else + "安らかに眠れ.", + "注意 --墓の中に価値あるものは*一つも*ない.", + "1994-1995 今迄でもっとも長生きしたハッカー.", + "名もしらぬハッカーの墓.", + "ここに眠っているのは誰かは知らない.しかし我々は埋葬した.", + "スパーキー -- すばらしい犬だった.", + "送電用の第三のレールに気をつけよ.", + "Made in Taiwan.", + "オレトモダチ,オレイイヤツ,オレ死んだ,オレ食料.", + "肉汁,肉汁,肉汁", + "下を見ろ!", + "掘らないでください.とても幸せなんです.-- 居住者", + "郵便屋さん.電報は下記の住所に転送してください.ゲヘナ市アスモデウス要塞5番町.", + "メリーさんの羊/ふわふわ真っ白/困ったときには/最初に逃げた", + "気をつけよ!さもなくば同じことが起きる.-- 使用者", + "もうすぐ仲間になれる!! -- イェンダーの魔法使い", + "気をつけよ!この墓は有毒な廃棄物が含まれている.", + "涅槃で待つ", + "無神論者ここに眠る.みんな着飾っているが,行く所がない.", + "エゼキエルここに眠る.享年102歳.いいやつは早く死ぬ.", + "わが妻ここに眠る.ここに眠らせた!妻は安息を得,私も安息を得た.", + "ジョニー・イーストここに眠る.眠ったままで失礼します.", + "彼はいつも土の上で眠っていたが,とうとう土の中で眠ることになった.", + "自ら灰になった.", + "早く咲けば,早く散る.早く去る.しかし決して忘れない.", + "ジョナサン・ブレイクここに眠る.ブレーキではなくアクセルを踏んだ.", + "立ちされ!" +#endif }; /* Create a headstone at the given location. diff -aurbN -xCVS -xXTAGS nethack/src/exper.c jnethack/src/exper.c --- nethack/src/exper.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/exper.c 2003-12-10 03:31:28.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" STATIC_DCL long FDECL(newuexp, (int)); @@ -126,7 +133,10 @@ if (resists_drli(&youmonst)) return; if (u.ulevel > 1) { +/*JP pline("%s level %d.", Goodbye(), u.ulevel--); +*/ + pline("さようならレベル%d.", u.ulevel--); /* remove intrinsic abilities */ adjabil(u.ulevel + 1, u.ulevel); reset_rndmonst(NON_PM); /* new monster selection */ @@ -183,7 +193,10 @@ { /* (false for potion of gain level) */ register int num; +/*JP if (!incr) You_feel("more experienced."); +*/ + if (!incr) You("より経験をつんだような気がした."); num = newhp(); u.uhpmax += num; u.uhp += num; @@ -210,7 +223,10 @@ } ++u.ulevel; if (u.ulevelmax < u.ulevel) u.ulevelmax = u.ulevel; +/*JP pline("Welcome to experience level %d.", u.ulevel); +*/ + pline("レベル%dにようこそ.", u.ulevel); adjabil(u.ulevel - 1, u.ulevel); /* give new intrinsics */ reset_rndmonst(NON_PM); /* new monster selection */ } diff -aurbN -xCVS -xXTAGS nethack/src/explode.c jnethack/src/explode.c --- nethack/src/explode.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/explode.c 2004-10-17 22:41:54.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (C) 1990 by Ken Arromdee */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #ifdef OVL0 @@ -41,6 +48,9 @@ /* 0=normal explosion, 1=do shieldeff, 2=do nothing */ boolean shopdamage = FALSE; boolean generic = FALSE; +#if 1 /*JP*/ + char jbuf[BUFSZ]; +#endif if (olet == WAND_CLASS) /* retributive strike */ switch (Role_switch) { @@ -55,33 +65,72 @@ } if (olet == MON_EXPLODE) { +#if 0 /*JP*/ str = killer; +#else +/*JP こういう日本語化のときに面倒なコーディングはやめてくれぃ */ + strcpy(jbuf, killer); + str = killer; + { +/*JP 苦肉の策 */ + int len = strlen(str); + if(len > 2 && str[len - 2] == "で"[0] && str[len - 1] == "で"[1]){ + ((char *)str)[len - 2] = '\0'; + } + } killer = 0; /* set again later as needed */ +#endif adtyp = AD_PHYS; } else switch (abs(type) % 10) { +/*JP case 0: str = "magical blast"; +*/ + case 0: str = "魔法の風"; adtyp = AD_MAGM; break; +#if 0 /*JP*/ case 1: str = olet == BURNING_OIL ? "burning oil" : olet == SCROLL_CLASS ? "tower of flame" : "fireball"; +#else + case 1: str = olet == BURNING_OIL ? "燃えている油" : + olet == SCROLL_CLASS ? "火柱" : + "火の玉"; +#endif adtyp = AD_FIRE; break; +/*JP case 2: str = "ball of cold"; +*/ + case 2: str = "氷の玉"; adtyp = AD_COLD; break; +#if 0 /*JP*/ case 4: str = (olet == WAND_CLASS) ? "death field" : "disintegration field"; +#else + case 4: str = (olet == WAND_CLASS) ? "死の風" : + "分解の風"; +#endif adtyp = AD_DISN; break; +/*JP case 5: str = "ball of lightning"; +*/ + case 5: str = "雷玉"; adtyp = AD_ELEC; break; +/*JP case 6: str = "poison gas cloud"; +*/ + case 6: str = "毒の雲"; adtyp = AD_DRST; break; +/*JP case 7: str = "splash of acid"; +*/ + case 7: str = "酸のしぶき"; adtyp = AD_ACID; break; default: impossible("explosion base type %d?", type); return; @@ -219,10 +268,16 @@ tmp_at(DISP_END, 0); /* clear the explosion */ } else { if (olet == MON_EXPLODE) { +/*JP str = "explosion"; +*/ + str = "爆発"; generic = TRUE; } +/*JP if (flags.soundok) You_hear("a blast."); +*/ + if (flags.soundok) You_hear("爆発音を聞いた."); } if (dam) @@ -243,6 +298,7 @@ if (!mtmp) continue; if (u.uswallow && mtmp == u.ustuck) { if (is_animal(u.ustuck->data)) +#if 0 /*JP*/ pline("%s gets %s!", Monnam(u.ustuck), (adtyp == AD_FIRE) ? "heartburn" : @@ -253,7 +309,20 @@ (adtyp == AD_DRST) ? "poisoned" : (adtyp == AD_ACID) ? "an upset stomach" : "fried"); +#else + pline("%sは%s!", + Monnam(u.ustuck), + (adtyp == AD_FIRE) ? "燃えた" : + (adtyp == AD_COLD) ? "凍らされた" : + (adtyp == AD_DISN) ? ((olet == WAND_CLASS) ? + "浄化の力を浴びた" : "穴をあけられた") : + (adtyp == AD_ELEC) ? "電撃をくらった" : + (adtyp == AD_DRST) ? "毒をくらった" : + (adtyp == AD_ACID) ? "酸をくらった" : + "パリパリになった"); +#endif else +#if 0 /*JP*/ pline("%s gets slightly %s!", Monnam(u.ustuck), (adtyp == AD_FIRE) ? "toasted" : @@ -264,9 +333,24 @@ (adtyp == AD_DRST) ? "intoxicated" : (adtyp == AD_ACID) ? "burned" : "fried"); +#else + pline("%sは少しだけ%s!", + Monnam(u.ustuck), + (adtyp == AD_FIRE) ? "焦げた" : + (adtyp == AD_COLD) ? "凍った" : + (adtyp == AD_DISN) ? ((olet == WAND_CLASS) ? + "浄化の力を浴びた" : "穴をあけられた") : + (adtyp == AD_ELEC) ? "電撃をくらった" : + (adtyp == AD_DRST) ? "毒をくらった" : + (adtyp == AD_ACID) ? "酸をくらった" : + "パリパリになった"); +#endif } else if (cansee(i+x-1, j+y-1)) { if(mtmp->m_ap_type) seemimic(mtmp); +/*JP pline("%s is caught in the %s!", Monnam(mtmp), str); +*/ + pline("%sは%sにつつまれた!", Monnam(mtmp), str); } idamres += destroy_mitem(mtmp, SCROLL_CLASS, (int) adtyp); @@ -287,7 +371,10 @@ if (resist(mtmp, olet, 0, FALSE)) { if (cansee(i+x-1,j+y-1)) +/*JP pline("%s resists the %s!", Monnam(mtmp), str); +*/ + pline("%sは%sに抵抗した!", Monnam(mtmp), str); mdam = dam/2; } if (mtmp == u.ustuck) @@ -310,12 +397,18 @@ if (uhurt) { if ((type >= 0 || adtyp == AD_PHYS) && /* gas spores */ flags.verbose && olet != SCROLL_CLASS) +/*JP You("are caught in the %s!", str); +*/ + You("%sにつつまれた!", str); /* do property damage first, in case we end up leaving bones */ if (adtyp == AD_FIRE) burn_away_slime(); if (Invulnerable) { damu = 0; +/*JP You("are unharmed!"); +*/ + You("傷つかない!"); } else if (Half_physical_damage && adtyp == AD_PHYS) damu = (damu+1) / 2; if (adtyp == AD_FIRE) (void) burnarmor(&youmonst); @@ -343,17 +436,31 @@ if (str != killer_buf && !generic) Strcpy(killer_buf, str); killer_format = KILLED_BY_AN; +#if 1 /*JP*/ + Strcat(killer_buf, "で"); +#endif } else if (type >= 0 && olet != SCROLL_CLASS) { +#if 0 /*JP*/ killer_format = NO_KILLER_PREFIX; Sprintf(killer_buf, "caught %sself in %s own %s", uhim(), uhis(), str); +#else + killer_format = KILLED_BY; + Sprintf(killer_buf, "自分自身の%sにつつまれて", + str); +#endif +#if 0 /*JP*//* an をつけるかどうかは関係ない */ } else if (!strncmpi(str,"tower of flame", 8) || !strncmpi(str,"fireball", 8)) { killer_format = KILLED_BY_AN; Strcpy(killer_buf, str); +#endif } else { killer_format = KILLED_BY; Strcpy(killer_buf, str); +#if 1 /*JP*/ + Strcat(killer_buf, "で"); +#endif } killer = killer_buf; /* Known BUG: BURNING suppresses corpse in bones data, @@ -365,10 +472,17 @@ } if (shopdamage) { +#if 0 /*JP*/ pay_for_damage(adtyp == AD_FIRE ? "burn away" : adtyp == AD_COLD ? "shatter" : adtyp == AD_DISN ? "disintegrate" : "destroy", FALSE); +#else + pay_for_damage(adtyp == AD_FIRE ? "燃やす" : + adtyp == AD_COLD ? "粉々にする" : + adtyp == AD_DISN ? "粉砕する" : "破壊する", + FALSE); +#endif } /* explosions are noisy */ @@ -437,7 +551,10 @@ && ((otmp->otyp == BOULDER) || (otmp->otyp == STATUE)) && rn2(10)) { if (otmp->otyp == BOULDER) { +/*JP pline("%s apart.", Tobjnam(otmp, "break")); +*/ + pline("%sは一部分が砕けた.",xname(otmp)); fracture_rock(otmp); place_object(otmp, sx, sy); if ((otmp = sobj_at(BOULDER, sx, sy)) != 0) { @@ -450,9 +567,14 @@ if ((trap = t_at(sx,sy)) && trap->ttyp == STATUE_TRAP) deltrap(trap); +/*JP pline("%s.", Tobjnam(otmp, "crumble")); +*/ + pline("%sはこなごなになった.",xname(otmp)); (void) break_statue(otmp); +#ifndef FIX_BUG_C340_2 place_object(otmp, sx, sy); /* put fragments on floor */ +#endif } used_up = TRUE; diff -aurbN -xCVS -xXTAGS nethack/src/files.c jnethack/src/files.c --- nethack/src/files.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/files.c 2004-07-29 01:05:03.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "dlb.h" @@ -491,9 +498,15 @@ settle for `lock' instead of `fq_lock' because the latter might end up being too big for nethack's BUFSZ */ if (fd < 0 && errbuf) +#if 0 /*JP*/ Sprintf(errbuf, "Cannot open file \"%s\" for level %d (errno %d).", lock, lev, errno); +#else + Sprintf(errbuf, + "n%dKt@C\"%s\"J(errno %d)D", + lev, lock, errno); +#endif return fd; } @@ -1550,6 +1563,15 @@ return(fp); # else /* should be only UNIX left */ envp = nh_getenv("HOME"); +#if 1 /*JP*/ +/* Kazuhiro Fujieda 94/6/22 */ + if (!envp) + Strcpy(tmp_config, ".jnethackrc"); + else + Sprintf(tmp_config, "%s/%s", envp, ".jnethackrc"); + if ((fp = fopenp(tmp_config, "r")) != (FILE *)0) + return(fp); +#endif if (!envp) Strcpy(tmp_config, configfile); else @@ -1691,7 +1713,10 @@ /* remove trailing whitespace */ bufp = eos(buf); +/*JP while (--bufp > buf && isspace(*bufp)) +*/ + while (--bufp > buf && isspace_8(*bufp)) continue; if (bufp <= buf) @@ -1706,7 +1731,10 @@ if (!bufp) return 0; /* skip whitespace between '=' and value */ +/*JP do { ++bufp; } while (isspace(*bufp)); +*/ + do { ++bufp; } while (isspace_8(*bufp)); /* Go through possible variables */ /* some of these (at least LEVELS and SAVE) should now set the @@ -1993,6 +2021,8 @@ # endif #endif char buf[4*BUFSZ]; +/*JP*/ + char jbuf[4*BUFSZ]; FILE *fp; if (!(fp = fopen_config_file(filename))) return; @@ -2009,10 +2039,17 @@ set_duplicate_opt_detection(1); while (fgets(buf, 4*BUFSZ, fp)) { + Strcpy(jbuf, str2ic(buf)); +#if 0 /*JP*/ if (!parse_config_line(fp, buf, tmp_ramdisk, tmp_levels)) { raw_printf("Bad option line: \"%.50s\"", buf); wait_synch(); } +#else + if (!parse_config_line(fp, jbuf, tmp_ramdisk, tmp_levels)) { + raw_printf("Bad option line: \"%.50s\"", jbuf); + } +#endif } (void) fclose(fp); diff -aurbN -xCVS -xXTAGS nethack/src/fountain.c jnethack/src/fountain.c --- nethack/src/fountain.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/fountain.c 2005-03-04 00:59:01.000000000 +0900 @@ -4,6 +4,13 @@ /* Code for drinking from fountains. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" STATIC_DCL void NDECL(dowatersnakes); @@ -16,7 +23,10 @@ floating_above(what) const char *what; { +/*JP You("are floating high above the %s.", what); +*/ + You("%sの遥か上方に浮いている.", what); } STATIC_OVL void @@ -27,16 +37,27 @@ if (!(mvitals[PM_WATER_MOCCASIN].mvflags & G_GONE)) { if (!Blind) +#if 0 /*JP*/ pline("An endless stream of %s pours forth!", Hallucination ? makeplural(rndmonnam()) : "snakes"); +#else + pline("%sがどどっと流れた!", + Hallucination ? makeplural(rndmonnam()) : "蛇"); +#endif else +/*JP You_hear("%s hissing!", something); +*/ + You_hear("シーッという音を聞いた!"); while(num-- > 0) if((mtmp = makemon(&mons[PM_WATER_MOCCASIN], u.ux, u.uy, NO_MM_FLAGS)) && t_at(mtmp->mx, mtmp->my)) (void) mintrap(mtmp); } else +/*JP pline_The("fountain bubbles furiously for a moment, then calms."); +*/ + pline("泉は突然激しく泡だち,やがて静かになった."); } STATIC_OVL @@ -48,21 +69,35 @@ if(!(mvitals[PM_WATER_DEMON].mvflags & G_GONE)) { if((mtmp = makemon(&mons[PM_WATER_DEMON],u.ux,u.uy, NO_MM_FLAGS))) { if (!Blind) +/*JP You("unleash %s!", a_monnam(mtmp)); +*/ + You("%sを解き放した!", a_monnam(mtmp)); else +/*JP You_feel("the presence of evil."); +*/ + You_feel("邪悪な存在を感じた!"); /* Give those on low levels a (slightly) better chance of survival */ if (rnd(100) > (80 + level_difficulty())) { +#if 0 /*JP*/ pline("Grateful for %s release, %s grants you a wish!", mhis(mtmp), mhe(mtmp)); +#else + pline("%sは解放をとても感謝し,のぞみをかなえてくれるようだ!", + mhis(mtmp)); +#endif makewish(); mongone(mtmp); } else if (t_at(mtmp->mx, mtmp->my)) (void) mintrap(mtmp); } } else +/*JP pline_The("fountain bubbles furiously for a moment, then calms."); +*/ + pline("泉は突然激しく泡だち,やがて静かになった."); } STATIC_OVL void @@ -73,17 +108,29 @@ if(!(mvitals[PM_WATER_NYMPH].mvflags & G_GONE) && (mtmp = makemon(&mons[PM_WATER_NYMPH],u.ux,u.uy, NO_MM_FLAGS))) { if (!Blind) +/*JP You("attract %s!", a_monnam(mtmp)); +*/ + pline("%sが現われた!", a_monnam(mtmp)); else +/*JP You_hear("a seductive voice."); +*/ + You_hear("魅惑的な声を聞いた."); mtmp->msleeping = 0; if (t_at(mtmp->mx, mtmp->my)) (void) mintrap(mtmp); } else if (!Blind) +/*JP pline("A large bubble rises to the surface and pops."); +*/ + pline("大きな泡が沸き出てはじけた."); else +/*JP You_hear("a loud pop."); +*/ + You_hear("大きなものがはじける音を聞いた."); } void @@ -95,9 +142,15 @@ do_clear_area(u.ux, u.uy, 7, gush, (genericptr_t)&madepool); if (!madepool) { if (drinking) +/*JP Your("thirst is quenched."); +*/ + Your("渇きは癒された."); else +/*JP pline("Water sprays all over you."); +*/ + pline("水しぶきがあなたにかかった."); } } @@ -119,7 +172,10 @@ return; if (!((*(int *)poolcnt)++)) +/*JP pline("Water gushes forth from the overflowing fountain!"); +*/ + pline("泉から水がどどっと溢れ出た!"); /* Put a pool at x, y */ levl[x][y].typ = POOL; @@ -136,8 +192,14 @@ STATIC_OVL void dofindgem() /* Find a gem in the sparkling waters. */ { +/*JP if (!Blind) You("spot a gem in the sparkling waters!"); +*/ + if (!Blind) pline("きらめく水の中に宝石を見つけた!"); +/*JP else You_feel("a gem here!"); +*/ + else You_feel("宝石があるようだ!"); (void) mksobj_at(rnd_class(DILITHIUM_CRYSTAL, LUCKSTONE-1), u.ux, u.uy, FALSE, FALSE); SET_FOUNTAIN_LOOTED(u.ux,u.uy); @@ -162,18 +224,30 @@ mtmp->data == &mons[PM_WATCH_CAPTAIN]) && couldsee(mtmp->mx, mtmp->my) && mtmp->mpeaceful) { +/*JP pline("%s yells:", Amonnam(mtmp)); +*/ + pline("%sは叫んだ:", Amonnam(mtmp)); +/*JP verbalize("Hey, stop using that fountain!"); +*/ + verbalize("おい,泉を汚すな!"); break; } } /* You can see or hear this effect */ +/*JP if(!mtmp) pline_The("flow reduces to a trickle."); +*/ + if(!mtmp) pline("流れはちょろちょろになった."); return; } #ifdef WIZARD if (isyou && wizard) { +/*JP if (yn("Dry up fountain?") == 'n') +*/ + if (yn("泉を飲みほしますか?") == 'n') return; } #endif @@ -181,7 +255,10 @@ levl[x][y].typ = ROOM; levl[x][y].looted = 0; levl[x][y].blessedftn = 0; +/*JP if (cansee(x,y)) pline_The("fountain dries up!"); +*/ + if (cansee(x,y)) pline("泉は干上がった!"); /* The location is seen if the hero/monster is invisible */ /* or felt if the hero is blind. */ newsym(x, y); @@ -199,14 +276,20 @@ register int fate = rnd(30); if (Levitation) { +/*JP floating_above("fountain"); +*/ + floating_above("泉"); return; } if (mgkftn && u.uluck >= 0 && fate >= 10) { int i, ii, littleluck = (u.uluck < 4); +/*JP pline("Wow! This makes you feel great!"); +*/ + pline("ワォ!とても気持ちよくなった!"); /* blessed restore ability */ for (ii = 0; ii < A_MAX; ii++) if (ABASE(ii) < AMAX(ii)) { @@ -221,14 +304,20 @@ if (++i >= A_MAX) i = 0; } display_nhwindow(WIN_MESSAGE, FALSE); +/*JP pline("A wisp of vapor escapes the fountain..."); +*/ + pline("煙のかたまりが泉から逃げた..."); exercise(A_WIS, TRUE); levl[u.ux][u.uy].blessedftn = 0; return; } if (fate < 10) { +/*JP pline_The("cool draught refreshes you."); +*/ + pline("冷たい一杯でさっぱりした."); u.uhunger += rnd(10); /* don't choke on water */ newuhs(FALSE); if(mgkftn) return; @@ -237,33 +326,57 @@ case 19: /* Self-knowledge */ +/*JP You_feel("self-knowledgeable..."); +*/ + You("自分自身が判るような気がした..."); display_nhwindow(WIN_MESSAGE, FALSE); enlightenment(0); exercise(A_WIS, TRUE); +/*JP pline_The("feeling subsides."); +*/ + pline("その感じはなくなった."); break; case 20: /* Foul water */ +/*JP pline_The("water is foul! You gag and vomit."); +*/ + pline("水はひどく不快な味がした!あなたは吐き戻した."); morehungry(rn1(20, 11)); vomit(); break; case 21: /* Poisonous */ +/*JP pline_The("water is contaminated!"); +*/ + pline("水は汚染されている!"); if (Poison_resistance) { +#if 0 /*JP*/ pline( "Perhaps it is runoff from the nearby %s farm.", fruitname(FALSE)); +#else + pline( + "たぶん,これは近くの%sの農場から流れている.", + fruitname(FALSE)); +#endif +/*JP losehp(rnd(4),"unrefrigerated sip of juice", +*/ + losehp(rnd(4),"腐った果汁のしたたりで", KILLED_BY_AN); break; } losestr(rn1(4,3)); +/*JP losehp(rnd(10),"contaminated water", KILLED_BY); +*/ + losehp(rnd(10),"汚染された水で", KILLED_BY); exercise(A_CON, FALSE); break; @@ -279,7 +392,10 @@ case 24: /* Curse an item */ { register struct obj *obj; +/*JP pline("This water's no good!"); +*/ + pline("この水はとてもまずい!"); morehungry(rn1(20, 11)); exercise(A_CON, FALSE); for(obj = invent; obj ; obj = obj->nobj) @@ -291,14 +407,29 @@ if (Blind) { if (Invisible) { +/*JP You("feel transparent."); +*/ + You("透明になった気がする."); } else { +/*JP You("feel very self-conscious."); +*/ + You("自意識過剰に感じた."); +/*JP pline("Then it passes."); +*/ + pline("その感じは消えた."); } } else { +/*JP You("see an image of someone stalking you."); +*/ + You("何かが自分の後をつけている映像を見た."); +/*JP pline("But it disappears."); +*/ + pline("しかし,それは消えてしまった."); } HSee_invisible |= FROMOUTSIDE; newsym(u.ux,u.uy); @@ -326,7 +457,10 @@ case 29: /* Scare */ { register struct monst *mtmp; +/*JP pline("This water gives you bad breath!"); +*/ + pline("水を飲んだら息が臭くなった!"); for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(!DEADMONSTER(mtmp)) monflee(mtmp, 0, FALSE, FALSE); @@ -340,7 +474,10 @@ default: +/*JP pline("This tepid water is tasteless."); +*/ + pline("このなまぬるい水は味がない."); break; } } @@ -352,7 +489,10 @@ register struct obj *obj; { if (Levitation) { +/*JP floating_above("fountain"); +*/ + floating_above("泉"); return; } @@ -365,8 +505,14 @@ if (u.ualign.type != A_LAWFUL) { /* Ha! Trying to cheat her. */ +/*JP pline("A freezing mist rises from the water and envelopes the sword."); +*/ + pline("氷の霧が水から立ち昇り,剣をつつんだ."); +/*JP pline_The("fountain disappears!"); +*/ + pline("泉は消えてしまった!"); curse(obj); if (obj->spe > -6 && !rn2(3)) obj->spe--; obj->oerodeproof = FALSE; @@ -374,8 +520,14 @@ } else { /* The lady of the lake acts! - Eric Backus */ /* Be *REAL* nice */ +/*JP pline("From the murky depths, a hand reaches up to bless the sword."); +*/ + pline("にごった深みから,剣を祝福せんと手が伸びてきた."); +/*JP pline("As the hand retreats, the fountain disappears!"); +*/ + pline("手が退くと,泉は消えてしまった!"); obj = oname(obj, artiname(ART_EXCALIBUR)); discover_artifact(ART_EXCALIBUR); bless(obj); @@ -410,10 +562,16 @@ case 20: /* Uncurse the item */ if(obj->cursed) { if (!Blind) +/*JP pline_The("water glows for a moment."); +*/ + pline("水は輝きだした."); uncurse(obj); } else { +/*JP pline("A feeling of loss comes over you."); +*/ + pline("奇妙な脱力感があなたをおそった."); } break; case 21: /* Water Demon */ @@ -434,18 +592,30 @@ dogushforth(FALSE); break; case 26: /* Strange feeling */ +/*JP pline("A strange tingling runs up your %s.", +*/ + pline("奇妙なしびれがあなたの%sに走った.", body_part(ARM)); break; case 27: /* Strange feeling */ +/*JP You_feel("a sudden chill."); +*/ + You("突然寒けを感じた."); break; case 28: /* Strange feeling */ +/*JP pline("An urge to take a bath overwhelms you."); +*/ + pline("風呂に入りたいという欲望にかられた."); #ifndef GOLDOBJ if (u.ugold > 10) { u.ugold -= somegold() / 10; +/*JP You("lost some of your gold in the fountain!"); +*/ + You("金貨を数枚,泉に落としてしまった!"); CLEAR_FOUNTAIN_LOOTED(u.ux,u.uy); exercise(A_WIS, FALSE); } @@ -464,7 +634,10 @@ money -= coin_loss * denomination; if (!otmp->quan) delobj(otmp); } +/*JP You("lost some of your money in the fountain!"); +*/ + You("金貨を数枚,泉に落としてしまった!"); CLEAR_FOUNTAIN_LOOTED(u.ux,u.uy); exercise(A_WIS, FALSE); } @@ -483,7 +656,10 @@ (rnd((dunlevs_in_dungeon(&u.uz)-dunlev(&u.uz)+1)*2)+5), u.ux, u.uy); if (!Blind) +/*JP pline("Far below you, you see coins glistening in the water."); +*/ + You("遥か下の水中に金貨の輝きをみつけた."); exercise(A_WIS, TRUE); newsym(u.ux,u.uy); break; @@ -498,7 +674,10 @@ int x, y; { if(cansee(x,y) || (x == u.ux && y == u.uy)) +/*JP pline_The("pipes break! Water spurts out!"); +*/ + pline("配管が壊れ水が噴出した!"); level.flags.nsinks--; levl[x][y].doormask = 0; levl[x][y].typ = FOUNTAIN; @@ -513,28 +692,56 @@ struct monst *mtmp; if (Levitation) { +/*JP floating_above("sink"); +*/ + floating_above("流し台"); return; } switch(rn2(20)) { +/*JP case 0: You("take a sip of very cold water."); +*/ + case 0: You("とても冷たい水を一口飲んだ."); break; +/*JP case 1: You("take a sip of very warm water."); +*/ + case 1: You("とてもぬるい水を一口飲んだ."); break; +/*JP case 2: You("take a sip of scalding hot water."); +*/ + case 2: You("とても熱い水を一口飲んだ."); if (Fire_resistance) +/*JP pline("It seems quite tasty."); +*/ + pline("とてもおいしい水だ."); +/*JP else losehp(rnd(6), "sipping boiling water", KILLED_BY); +*/ + else losehp(rnd(6), "沸騰した水を飲んで", KILLED_BY); break; case 3: if (mvitals[PM_SEWER_RAT].mvflags & G_GONE) +/*JP pline_The("sink seems quite dirty."); +*/ + pline("流し台はとても汚ならしい."); else { mtmp = makemon(&mons[PM_SEWER_RAT], u.ux, u.uy, NO_MM_FLAGS); +#if 0 /*JP*/ if (mtmp) pline("Eek! There's %s in the sink!", (Blind || !canspotmon(mtmp)) ? "something squirmy" : a_monnam(mtmp)); +#else + if (mtmp) pline("げ!流し台に%sがいる!", + (Blind || !canspotmon(mtmp)) ? + "身もだえするようなもの" : + a_monnam(mtmp)); +#endif } break; case 4: do { @@ -545,9 +752,15 @@ } } while(!otmp); otmp->cursed = otmp->blessed = 0; +#if 0 /*JP*/ pline("Some %s liquid flows from the faucet.", Blind ? "odd" : hcolor(OBJ_DESCR(objects[otmp->otyp]))); +#else + pline("蛇口から%s液体が流れた.", + Blind ? "奇妙な" : + hcolor(jtrns_obj('!',OBJ_DESCR(objects[otmp->otyp])))); +#endif otmp->dknown = !(Blind || Hallucination); otmp->quan++; /* Avoid panic upon useup() */ otmp->fromsink = 1; /* kludge for docall() */ @@ -555,46 +768,84 @@ obfree(otmp, (struct obj *)0); break; case 5: if (!(levl[u.ux][u.uy].looted & S_LRING)) { +/*JP You("find a ring in the sink!"); +*/ + You("流し台に指輪をみつけた!"); (void) mkobj_at(RING_CLASS, u.ux, u.uy, TRUE); levl[u.ux][u.uy].looted |= S_LRING; exercise(A_WIS, TRUE); newsym(u.ux,u.uy); +/*JP } else pline("Some dirty water backs up in the drain."); +*/ + } else pline("汚ない水が排水口に流れた."); break; case 6: breaksink(u.ux,u.uy); break; +/*JP case 7: pline_The("water moves as though of its own will!"); +*/ + case 7: pline("水が意思を持っているかのように動いた!"); if ((mvitals[PM_WATER_ELEMENTAL].mvflags & G_GONE) || !makemon(&mons[PM_WATER_ELEMENTAL], u.ux, u.uy, NO_MM_FLAGS)) +/*JP pline("But it quiets down."); +*/ + pline("しかし,静かになった."); break; +/*JP case 8: pline("Yuk, this water tastes awful."); +*/ + case 8: pline("オェ,とてもひどい味がする."); more_experienced(1,0); newexplevel(); break; +/*JP case 9: pline("Gaggg... this tastes like sewage! You vomit."); +*/ + case 9: pline("ゲェー.下水のような味がする!あなたは吐き戻した."); morehungry(rn1(30-ACURR(A_CON), 11)); vomit(); break; +/*JP case 10: pline("This water contains toxic wastes!"); +*/ + case 10: pline("この水は有毒な排水を含んでいる!"); if (!Unchanging) { +/*JP You("undergo a freakish metamorphosis!"); +*/ + You("奇形な変化をしはじめた!"); polyself(FALSE); } break; /* more odd messages --JJB */ +/*JP case 11: You_hear("clanking from the pipes..."); +*/ + case 11: You_hear("配管のカチンという音を聞いた..."); break; +/*JP case 12: You_hear("snatches of song from among the sewers..."); +*/ + case 12: You_hear("下水の中からとぎれとぎれの歌を聞いた..."); break; case 19: if (Hallucination) { +/*JP pline("From the murky drain, a hand reaches up... --oops--"); +*/ + pline("暗い排水口から手が伸びてきた..--おっと--"); break; } +#if 0 /*JP*/ default: You("take a sip of %s water.", rn2(3) ? (rn2(2) ? "cold" : "warm") : "hot"); +#else + default: You("%s水を一口飲んだ.", + rn2(3) ? (rn2(2) ? "冷い" : "ぬるい") : "熱い"); +#endif } } #endif /* SINKS */ diff -aurbN -xCVS -xXTAGS nethack/src/hack.c jnethack/src/hack.c --- nethack/src/hack.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/hack.c 2004-07-29 01:04:23.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #ifdef OVL1 @@ -75,7 +82,10 @@ nomul(0); if (Levitation || Is_airlevel(&u.uz)) { if (Blind) feel_location(sx, sy); +/*JP You("don't have enough leverage to push %s.", the(xname(otmp))); +*/ + You("体が浮いているので%sを押せない.", the(xname(otmp))); /* Give them a chance to climb over it? */ return -1; } @@ -85,7 +95,10 @@ #endif ) { if (Blind) feel_location(sx, sy); +/*JP pline("You're too small to push that %s.", xname(otmp)); +*/ + You("小さすぎて%sを押せない.",xname(otmp)); goto cannot_push; } if (isok(rx,ry) && !IS_ROCK(levl[rx][ry].typ) && @@ -102,13 +115,27 @@ /* KMH -- Sokoban doesn't let you push boulders diagonally */ if (In_sokoban(&u.uz) && u.dx && u.dy) { if (Blind) feel_location(sx,sy); +#if 0 /*JP*/ pline("%s won't roll diagonally on this %s.", The(xname(otmp)), surface(sx, sy)); +#else + pline("%sの上では%sは斜めに押せない.", + surface(sx, sy), The(xname(otmp))); +#endif goto cannot_push; } +#if 0 /*JP*/ if (revive_nasty(rx, ry, "You sense movement on the other side.")) return (-1); +#else + { + char jbuf[BUFSIZ]; + Sprintf(jbuf,"%sの反対側に動きを感じた.", xname(otmp)); + if (revive_nasty(rx, ry, jbuf)) + return (-1); + } +#endif if (mtmp && !noncorporeal(mtmp->data) && (!mtmp->mtrapped || @@ -116,17 +143,27 @@ (ttmp->ttyp == SPIKED_PIT))))) { if (Blind) feel_location(sx, sy); if (canspotmon(mtmp)) +/*JP pline("There's %s on the other side.", a_monnam(mtmp)); +*/ + pline("反対側に%sがいる.", a_monnam(mtmp)); else { +/*JP You_hear("a monster behind %s.", the(xname(otmp))); +*/ + pline("%sの背後に怪物の気配がする.", the(xname(otmp))); map_invisible(rx, ry); } if (flags.verbose) +#if 0 /*JP*/ pline("Perhaps that's why %s cannot move it.", #ifdef STEED u.usteed ? y_monnam(u.usteed) : #endif "you"); +#else + pline("たぶんこれが,岩を動かせない理由だ."); +#endif goto cannot_push; } @@ -138,9 +175,15 @@ place_object(otmp, rx, ry); unblock_point(sx, sy); newsym(sx, sy); +#if 0 /*JP*/ pline("KAABLAMM!!! %s %s land mine.", Tobjnam(otmp, "trigger"), ttmp->madeby_u ? "your" : "a"); +#else + pline("ちゅどーん!!%sで%s地雷の起爆スイッチが入った.", + xname(otmp), + ttmp->madeby_u ? "あなたの仕掛けた" : ""); +#endif blow_up_landmine(ttmp); /* if the boulder remains, it should fill the pit */ fill_pit(u.ux, u.uy); @@ -155,7 +198,10 @@ the pit will temporarily be seen even if this is one among multiple boulders */ if (!Blind) viz_array[ry][rx] |= IN_SIGHT; +/*JP if (!flooreffects(otmp, rx, ry, "fall")) { +*/ + if (!flooreffects(otmp, rx, ry, "落ちる")) { place_object(otmp, rx, ry); } if (mtmp && !Blind) newsym(rx, ry); @@ -163,9 +209,13 @@ case HOLE: case TRAPDOOR: if (Blind) +/*JP pline("Kerplunk! You no longer feel %s.", +*/ + pline("ドサッ!あなたはもう%sを感じられない.", the(xname(otmp))); else +#if 0 /*JP*/ pline("%s%s and %s a %s in the %s!", Tobjnam(otmp, (ttmp->ttyp == TRAPDOOR) ? "trigger" : "fall"), @@ -173,6 +223,12 @@ otense(otmp, "plug"), (ttmp->ttyp == TRAPDOOR) ? "trap door" : "hole", surface(rx, ry)); +#else + pline("%sは落ちて%sの%sを埋めた!", + xname(otmp), + surface(rx, ry), + (ttmp->ttyp == TRAPDOOR) ? "落し扉" : "穴"); +#endif deltrap(ttmp); delobj(otmp); bury_objs(rx, ry); @@ -182,11 +238,17 @@ case TELEP_TRAP: #ifdef STEED if (u.usteed) +/*JP pline("%s pushes %s and suddenly it disappears!", +*/ + pline("%sが%sを押すと,突然それは消滅した!", upstart(y_monnam(u.usteed)), the(xname(otmp))); else #endif +/*JP You("push %s and suddenly it disappears!", +*/ + You("%sを押すと,突然それは消滅した!", the(xname(otmp))); if (ttmp->ttyp == TELEP_TRAP) rloco(otmp); @@ -231,14 +293,25 @@ if (!u.usteed) { #endif if (moves > lastmovetime+2 || moves < lastmovetime) +#if 0 /*JP*/ pline("With %s effort you move %s.", throws_rocks(youmonst.data) ? "little" : "great", the(xname(otmp))); +#else + pline("%s力をこめて%sを押した.", + throws_rocks(youmonst.data) ? "ちょいと" : "", + the(xname(otmp))); +#endif exercise(A_STR, TRUE); #ifdef STEED } else +#if 0 /*JP*/ pline("%s moves %s.", upstart(y_monnam(u.usteed)), the(xname(otmp))); +#else + pline("%sは%sを動かした.", + upstart(y_monnam(u.usteed)), xname(otmp)); +#endif #endif lastmovetime = moves; } @@ -257,26 +330,45 @@ nopushmsg: #ifdef STEED if (u.usteed) +/*JP pline("%s tries to move %s, but cannot.", +*/ + pline("%sは%sを動かそうとしたが出来なかった.", upstart(y_monnam(u.usteed)), the(xname(otmp))); else #endif +/*JP You("try to move %s, but in vain.", the(xname(otmp))); +*/ + You("%sを動かそうとしたが,だめだった.", the(xname(otmp))); if (Blind) feel_location(sx, sy); cannot_push: if (throws_rocks(youmonst.data)) { #ifdef STEED if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) { +#if 0 /*JP*/ You("aren't skilled enough to %s %s from %s.", (flags.pickup && !In_sokoban(&u.uz)) ? "pick up" : "push aside", the(xname(otmp)), y_monnam(u.usteed)); +#else + You("%sに%sを%sるほど技量がない.", + mon_nam(u.usteed), + the(xname(otmp)), + flags.pickup ? "拾わせ" : "押させ"); +#endif } else #endif { +#if 0 /*JP*/ pline("However, you can easily %s.", (flags.pickup && !In_sokoban(&u.uz)) ? "pick it up" : "push it aside"); +#else + pline("しかし,あなたは簡単にそれを%s.", + (flags.pickup && !In_sokoban(&u.uz)) + ? "拾えた" : "別の方に押せた"); +#endif if (In_sokoban(&u.uz)) change_luck(-1); /* Sokoban guilt */ break; @@ -292,7 +384,10 @@ (!u.dx || !u.dy || (IS_ROCK(levl[u.ux][sy].typ) && IS_ROCK(levl[sx][u.uy].typ)))) || verysmall(youmonst.data))) { +/*JP pline("However, you can squeeze yourself into a small opening."); +*/ + pline("しかし,あなたは小さい隙間にこじ入った."); if (In_sokoban(&u.uz)) change_luck(-1); /* Sokoban guilt */ break; @@ -321,8 +416,13 @@ (void) memset((genericptr_t)&digging, 0, sizeof digging); if (!boulder && IS_ROCK(lev->typ) && !may_dig(x,y)) { +#if 0 /*JP*/ You("hurt your teeth on the %s.", IS_TREE(lev->typ) ? "tree" : "hard stone"); +#else + You("%sで歯を痛めた.", + IS_TREE(lev->typ) ? "木" : "固い岩"); +#endif nomul(0); return 1; } else if (digging.pos.x != x || digging.pos.y != y || @@ -336,19 +436,34 @@ /* solid rock takes more work & time to dig through */ digging.effort = (IS_ROCK(lev->typ) && !IS_TREE(lev->typ) ? 30 : 60) + u.udaminc; +#if 0 /*JP*/ You("start chewing %s %s.", (boulder || IS_TREE(lev->typ)) ? "on a" : "a hole in the", boulder ? "boulder" : IS_TREE(lev->typ) ? "tree" : IS_ROCK(lev->typ) ? "rock" : "door"); +#else + You("%s%sはじめた.", + boulder ? "岩" : + IS_TREE(lev->typ) ? "木" : IS_ROCK(lev->typ) ? "石" : "扉", + boulder ? "を噛み" : "に穴をあけ"); +#endif watch_dig((struct monst *)0, x, y, FALSE); return 1; } else if ((digging.effort += (30 + u.udaminc)) <= 100) { if (flags.verbose) +#if 0 /*JP*/ You("%s chewing on the %s.", digging.chew ? "continue" : "begin", boulder ? "boulder" : IS_TREE(lev->typ) ? "tree" : IS_ROCK(lev->typ) ? "rock" : "door"); +#else + You("%sを噛み%s.", + boulder ? "岩" : + IS_TREE(lev->typ) ? "木" : + IS_ROCK(lev->typ) ? "石" : "扉", + digging.chew ? "続けた" : "はじめた"); +#endif digging.chew = TRUE; watch_dig((struct monst *)0, x, y, FALSE); return 1; @@ -360,7 +475,11 @@ if (boulder) { delobj(boulder); /* boulder goes bye-bye */ +#if 0 /*JP*/ You("eat the boulder."); /* yum */ +#else + You("岩を食べた."); /* yum */ +#endif /* * The location could still block because of @@ -379,9 +498,15 @@ } else if (IS_WALL(lev->typ)) { if (*in_rooms(x, y, SHOPBASE)) { add_damage(x, y, 10L * ACURRSTR); +/*JP dmgtxt = "damage"; +*/ + dmgtxt = "傷つける"; } +/*JP digtxt = "chew a hole in the wall."; +*/ + digtxt = "壁に穴を開けた."; if (level.flags.is_maze_lev) { lev->typ = ROOM; } else if (level.flags.is_cavernous_lev && !in_town(x, y)) { @@ -391,14 +516,23 @@ lev->doormask = D_NODOOR; } } else if (IS_TREE(lev->typ)) { +/*JP digtxt = "chew through the tree."; +*/ + digtxt = "木に穴を開けた."; lev->typ = ROOM; } else if (lev->typ == SDOOR) { if (lev->doormask & D_TRAPPED) { lev->doormask = D_NODOOR; +/*JP b_trapped("secret door", 0); +*/ + b_trapped("秘密の扉", 0); } else { +/*JP digtxt = "chew through the secret door."; +*/ + digtxt = "秘密の扉を噛み砕いた."; lev->doormask = D_BROKEN; } lev->typ = DOOR; @@ -406,18 +540,30 @@ } else if (IS_DOOR(lev->typ)) { if (*in_rooms(x, y, SHOPBASE)) { add_damage(x, y, 400L); +/*JP dmgtxt = "break"; +*/ + dmgtxt = "壊す"; } if (lev->doormask & D_TRAPPED) { lev->doormask = D_NODOOR; +/*JP b_trapped("door", 0); +*/ + b_trapped("扉", 0); } else { +/*JP digtxt = "chew through the door."; +*/ + digtxt = "扉を砕いた."; lev->doormask = D_BROKEN; } } else { /* STONE or SCORR */ +/*JP digtxt = "chew a passage through the rock."; +*/ + digtxt = "岩を噛み砕いて通り抜けた."; lev->typ = CORR; } @@ -445,7 +591,10 @@ } #ifdef SINKS +/*JP static NEARDATA const char fell_on_sink[] = "fell onto a sink"; +*/ +static NEARDATA const char fell_on_sink[] = "流し台に落ちて"; STATIC_OVL void dosinkfall() @@ -453,7 +602,10 @@ register struct obj *obj; if (is_floater(youmonst.data) || (HLevitation & FROMOUTSIDE)) { +/*JP You("wobble unsteadily for a moment."); +*/ + You("ちょっとふらついた."); } else { long save_ELev = ELevitation, save_HLev = HLevitation; @@ -462,15 +614,33 @@ be fatal; fortunately the fact that rings and boots are really still worn has no effect on bones data */ ELevitation = HLevitation = 0L; +/*JP You("crash to the floor!"); +*/ + You("床に叩きつけられた!"); +#if 0 /*JP*/ losehp(rn1(8, 25 - (int)ACURR(A_CON)), fell_on_sink, NO_KILLER_PREFIX); +#else + losehp(rn1(8, 25 - (int)ACURR(A_CON)), + fell_on_sink, KILLED_BY); +#endif exercise(A_DEX, FALSE); +/*JP selftouch("Falling, you"); +*/ + selftouch("落ちながら,あなたは"); for (obj = level.objects[u.ux][u.uy]; obj; obj = obj->nexthere) if (obj->oclass == WEAPON_CLASS || is_weptool(obj)) { +/*JP You("fell on %s.", doname(obj)); +*/ + You("%sの上に落ちた.",doname(obj)); +#if 0 /*JP*/ losehp(rnd(3), fell_on_sink, NO_KILLER_PREFIX); +#else + losehp(rnd(3), fell_on_sink, KILLED_BY); +#endif exercise(A_CON, FALSE); } ELevitation = save_ELev; @@ -575,9 +745,15 @@ } else { if (mode == DO_MOVE) { if (Is_stronghold(&u.uz) && is_db_wall(x,y)) +/*JP pline_The("drawbridge is up!"); +*/ + pline("跳ね橋は上っている!"); if (Passes_walls && !may_passwall(x,y) && In_sokoban(&u.uz)) +/*JP pline_The("Sokoban walls resist your ability."); +*/ + pline_The("倉庫番の壁はあなたの能力に抵抗した."); } return FALSE; } @@ -587,27 +763,42 @@ if (Passes_walls) ; /* do nothing */ else if (can_ooze(&youmonst)) { +/*JP if (mode == DO_MOVE) You("ooze under the door."); +*/ + if (mode == DO_MOVE) You("ドアの下からにじみ出た."); } else if (tunnels(youmonst.data) && !needspick(youmonst.data)) { /* Eat the door. */ if (mode == DO_MOVE && still_chewing(x,y)) return FALSE; } else { if (mode == DO_MOVE) { if (amorphous(youmonst.data)) +/*JP You("try to ooze under the door, but can't squeeze your possessions through."); +*/ + You("ドアの下からにじみ出た,しかし持ち物はそうはいかない."); else if (x == ux || y == uy) { if (Blind || Stunned || ACURR(A_DEX) < 10 || Fumbling) { #ifdef STEED if (u.usteed) { +/*JP You_cant("lead %s through that closed door.", +*/ + You_cant("%sに閉まった扉を通過させることはできない.", y_monnam(u.usteed)); } else #endif { +/*JP pline("Ouch! You bump into a door."); +*/ + pline("いてっ!頭を扉にぶつけた."); exercise(A_DEX, FALSE); } +/*JP } else pline("That door is closed."); +*/ + } else pline("扉は閉まっている."); } } else if (mode == TEST_TRAV) goto testdiag; return FALSE; @@ -632,17 +823,26 @@ /* Move at a diagonal. */ if (In_sokoban(&u.uz)) { if (mode == DO_MOVE) +/*JP You("cannot pass that way."); +*/ + You("通りぬけできない."); return FALSE; } if (bigmonst(youmonst.data)) { if (mode == DO_MOVE) +/*JP Your("body is too large to fit through."); +*/ + Your("体が大きすぎて通りぬけられない."); return FALSE; } if (invent && (inv_weight() + weight_cap() > 600)) { if (mode == DO_MOVE) +/*JP You("are carrying too much to get through."); +*/ + pline("物を持ちすぎて通りぬけられない."); return FALSE; } } @@ -887,10 +1087,16 @@ : (u.uhp < 10 && u.uhp != u.uhpmax)))) && !Is_airlevel(&u.uz)) { if(wtcap < OVERLOADED) { +/*JP You("don't have enough stamina to move."); +*/ + You("へとへとで動けない."); exercise(A_CON, FALSE); } else +/*JP You("collapse under your load."); +*/ + pline("物を持ちすぎて倒れた."); nomul(0); return; } @@ -904,13 +1110,22 @@ !Levitation && !Flying) { switch(rn2(3)) { case 0: +/*JP You("tumble in place."); +*/ + You("その場で倒れた."); exercise(A_DEX, FALSE); break; case 1: +/*JP You_cant("control your movements very well."); break; +*/ + You("うまく歩けない."); break; case 2: +/*JP pline("It's hard to walk in thin air."); +*/ + pline("空中を歩くのは難しい."); exercise(A_DEX, TRUE); break; } @@ -985,7 +1200,10 @@ /* When polymorphed into a sticking monster, * u.ustuck means it's stuck to you, not you to it. */ +/*JP You("release %s.", mon_nam(u.ustuck)); +*/ + You("%sを放した.", mon_nam(u.ustuck)); u.ustuck = 0; } else { /* If holder is asleep or paralyzed: @@ -1000,7 +1218,10 @@ switch (rn2(!u.ustuck->mcanmove ? 8 : 40)) { case 0: case 1: case 2: pull_free: +/*JP You("pull free from %s.", mon_nam(u.ustuck)); +*/ + You("%sをひきはなした.", mon_nam(u.ustuck)); u.ustuck = 0; break; case 3: @@ -1014,7 +1235,10 @@ if (u.ustuck->mtame && !Conflict && !u.ustuck->mconf) goto pull_free; +/*JP You("cannot escape from %s!", mon_nam(u.ustuck)); +*/ + You("%sから逃げられない!", mon_nam(u.ustuck)); nomul(0); return; } @@ -1067,9 +1291,15 @@ && !sensemon(mtmp)) stumble_onto_mimic(mtmp); else if (mtmp->mpeaceful && !Hallucination) +/*JP pline("Pardon me, %s.", m_monnam(mtmp)); +*/ + pline("ちょっとごめんなさいよ,%sさん.", m_monnam(mtmp)); else +/*JP You("move right into %s.", mon_nam(mtmp)); +*/ + You("%sのそばに移動した.", mon_nam(mtmp)); return; } if(flags.forcefight || !mtmp->mundetected || sensemon(mtmp) || @@ -1082,7 +1312,10 @@ } else if (!Upolyd && u.uhp > 1) { u.uhp--; } else { +/*JP You("pass out from exertion!"); +*/ + You("気絶した."); exercise(A_CON, FALSE); fall_asleep(-10, FALSE); } @@ -1101,11 +1334,20 @@ (glyph_is_invisible(levl[x][y].glyph) && !flags.nopick)) { boolean expl = (Upolyd && attacktype(youmonst.data, AT_EXPL)); char buf[BUFSZ]; +/*JP Sprintf(buf,"a vacant spot on the %s", surface(x,y)); +*/ + Sprintf(buf,"%sの空いている場所", surface(x,y)); +#if 0 /*JP*/ You("%s %s.", expl ? "explode at" : "attack", !Underwater ? "thin air" : is_pool(x,y) ? "empty water" : buf); +#else + You("%sを攻撃した.", + !Underwater ? "何もない空間" : + is_pool(x,y) ? "何もない水中" : buf); +#endif unmap_object(x, y); /* known empty -- remove 'I' if present */ newsym(x, y); nomul(0); @@ -1122,26 +1364,40 @@ /* not attacking an animal, so we try to move */ #ifdef STEED if (u.usteed && !u.usteed->mcanmove && (u.dx || u.dy)) { +/*JP pline("%s won't move!", upstart(y_monnam(u.usteed))); +*/ + pline("%sは動かない!", upstart(y_monnam(u.usteed))); nomul(0); return; } else #endif if(!youmonst.data->mmove) { +#if 0 /*JP*/ You("are rooted %s.", Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz) ? "in place" : "to the ground"); +#else + You("その場に立ちすくんだ."); +#endif nomul(0); return; } if(u.utrap) { if(u.utraptype == TT_PIT) { if (!rn2(2) && sobj_at(BOULDER, u.ux, u.uy)) { +/*JP Your("%s gets stuck in a crevice.", body_part(LEG)); +*/ + Your("%sは割れ目にはまった.", body_part(LEG)); display_nhwindow(WIN_MESSAGE, FALSE); clear_nhwindow(WIN_MESSAGE); +/*JP You("free your %s.", body_part(LEG)); +*/ + You("%sは自由になった.", body_part(LEG)); } else if (!(--u.utrap)) { +#if 0 /*JP*/ You("%s to the edge of the pit.", (In_sokoban(&u.uz) && Levitation) ? "struggle against the air currents and float" : @@ -1149,40 +1405,74 @@ u.usteed ? "ride" : #endif "crawl"); +#else + You("落し穴のはじまで%s.", + (In_sokoban(&u.uz) && Levitation) ? + "空中をもがいて移動した" : +#ifdef STEED + u.usteed ? "移動した" : +#endif + "這っていった"); +#endif fill_pit(u.ux, u.uy); vision_full_recalc = 1; /* vision limits change */ } else if (flags.verbose) { #ifdef STEED if (u.usteed) +/*JP Norep("%s is still in a pit.", +*/ + Norep("%sはまだ落し穴にいる.", upstart(y_monnam(u.usteed))); else #endif Norep( (Hallucination && !rn2(5)) ? +#if 0 /*JP*/ "You've fallen, and you can't get up." : "You are still in a pit." ); +#else + "あなたは落ちた,起きあがれないよう.": + "まだ落し穴にいる."); +#endif } } else if (u.utraptype == TT_LAVA) { if(flags.verbose) { +/*JP predicament = "stuck in the lava"; +*/ + predicament = "溶岩にはまった"; #ifdef STEED if (u.usteed) +#if 0 /*JP*/ Norep("%s is %s.", upstart(y_monnam(u.usteed)), predicament); +#else + Norep("%sは%s.", upstart(y_monnam(u.usteed)), + predicament); +#endif else #endif +/*JP Norep("You are %s.", predicament); +*/ + Norep("あなたは%s.", predicament); } if(!is_lava(x,y)) { u.utrap--; if((u.utrap & 0xff) == 0) { #ifdef STEED if (u.usteed) +/*JP You("lead %s to the edge of the lava.", +*/ + You("%sを溶岩の端まで導いた.", y_monnam(u.usteed)); else #endif +/*JP You("pull yourself to the edge of the lava."); +*/ + You("溶岩の端までかろうじて,たどりついた."); u.utrap = 0; } } @@ -1190,62 +1480,113 @@ } else if (u.utraptype == TT_WEB) { if(uwep && uwep->oartifact == ART_STING) { u.utrap = 0; +/*JP pline("Sting cuts through the web!"); +*/ + pline("スティングはくもの巣を切りさいた!"); return; } if(--u.utrap) { if(flags.verbose) { +/*JP predicament = "stuck to the web"; +*/ + predicament = "くもの巣にひっかかった"; #ifdef STEED if (u.usteed) +#if 0 /*JP*/ Norep("%s is %s.", upstart(y_monnam(u.usteed)), predicament); +#else + Norep("%sは%s.", upstart(y_monnam(u.usteed)), + predicament); +#endif else #endif +/*JP Norep("You are %s.", predicament); +*/ + Norep("あなたは%s.", predicament); } } else { #ifdef STEED if (u.usteed) +/*JP pline("%s breaks out of the web.", +*/ + pline("%sはくもの巣を壊した.", upstart(y_monnam(u.usteed))); else #endif +/*JP You("disentangle yourself."); +*/ + You("自分でほどいた."); } } else if (u.utraptype == TT_INFLOOR) { if(--u.utrap) { if(flags.verbose) { +/*JP predicament = "stuck in the"; +*/ + predicament = "にはまった"; #ifdef STEED if (u.usteed) +#if 0 /*JP*/ Norep("%s is %s %s.", upstart(y_monnam(u.usteed)), predicament, surface(u.ux, u.uy)); +#else + Norep("%sは%s%s.", + upstart(y_monnam(u.usteed)), + predicament, surface(u.ux, u.uy)); +#endif else #endif +#if 0 /*JP*/ Norep("You are %s %s.", predicament, surface(u.ux, u.uy)); +#else + Norep("あなたは%s%s.", surface(u.ux, u.uy), + predicament); +#endif } } else { #ifdef STEED if (u.usteed) +/*JP pline("%s finally wiggles free.", +*/ + pline("%sは体をくねらせてぬけた.", upstart(y_monnam(u.usteed))); else #endif +/*JP You("finally wiggle free."); +*/ + You("体をくねらせてぬけた."); } } else { if(flags.verbose) { +/*JP predicament = "caught in a bear trap"; +*/ + predicament = "熊の罠につかまった"; #ifdef STEED if (u.usteed) +#if 0 /*JP*/ Norep("%s is %s.", upstart(y_monnam(u.usteed)), predicament); +#else + Norep("%sは%s.", upstart(y_monnam(u.usteed)), + predicament); +#endif else #endif +/*JP Norep("You are %s.", predicament); +*/ + Norep("あなたは%s.", predicament); } if((u.dx && u.dy) || !rn2(5)) u.utrap--; } @@ -1321,7 +1662,10 @@ (bigmonst(mtmp->data) || (curr_mon_load(mtmp) > 600))) { /* can't swap places when pet won't fit thru the opening */ u.ux = u.ux0, u.uy = u.uy0; /* didn't move after all */ +/*JP You("stop. %s won't fit through.", upstart(y_monnam(mtmp))); +*/ + You("止まった.%sは通り抜けられない.", upstart(y_monnam(mtmp))); } else { char pnambuf[BUFSZ]; @@ -1334,8 +1678,14 @@ /* check for displacing it into pools and traps */ switch (minliquid(mtmp) ? 2 : mintrap(mtmp)) { case 0: +#if 0 /*JP*/ You("%s %s.", mtmp->mtame ? "displaced" : "frightened", pnambuf); +#else + You("%s%sた.", + pnambuf, + mtmp->mtame ? "と入れ換わっ" : "を怖がらせ"); +#endif break; case 1: /* trapped */ case 3: /* changed levels */ @@ -1348,7 +1698,10 @@ * treat a pet! your god gets angry. */ if (rn2(4)) { +/*JP You_feel("guilty about losing your pet like this."); +*/ + pline("このような形でペットを失うとは罪深いことだと思った."); u.ugangr++; adjalign(-15); } @@ -1438,16 +1791,34 @@ nomul(0); /* stop running or travelling */ #ifdef STEED +/*JP if (u.usteed) Sprintf(buf, "beneath %s", y_monnam(u.usteed)); +*/ + if (u.usteed) Sprintf(buf, "%sの下に", y_monnam(u.usteed)); else #endif +/*JP if (Levitation || Flying) Strcpy(buf, "beneath you"); +*/ + if (Levitation || Flying) Strcpy(buf, "下方に"); +/*JP else Sprintf(buf, "under your %s", makeplural(body_part(FOOT))); +*/ + else Strcpy(buf, "足元に"); +/*JP You_feel("a strange vibration %s.", buf); +*/ + You("%s奇妙な振動を感じた.", buf); if (otmp && otmp->spe == 7 && otmp->lamplit) +#if 0 /*JP*/ pline("%s %s!", The(xname(otmp)), Blind ? "throbs palpably" : "glows with a strange light"); +#else + pline("%sは%sした!", The(xname(otmp)), + Blind ? "かすかに振動" : "奇妙な光を発"); +#endif + } } @@ -1465,21 +1836,42 @@ if (!is_pool(u.ux,u.uy)) { if (Is_waterlevel(&u.uz)) +/*JP You("pop into an air bubble."); +*/ + You("ひょいと空気の泡に入った."); else if (is_lava(u.ux, u.uy)) +#if 0 /*JP*/ You("leave the water..."); /* oops! */ +#else + You("水から抜けだした..."); /* oops! */ +#endif else +#if 0 /*JP*/ You("are on solid %s again.", is_ice(u.ux, u.uy) ? "ice" : "land"); +#else + You("固い%sの上にまた戻った.", + is_ice(u.ux, u.uy) ? "氷" : "地面"); +#endif } else if (Is_waterlevel(&u.uz)) goto stillinwater; else if (Levitation) +/*JP You("pop out of the water like a cork!"); +*/ + You("コルクのように飛びだした!"); else if (Flying) +/*JP You("fly out of the water."); +*/ + You("水から飛びだした."); else if (Wwalking) +/*JP You("slowly rise above the surface."); +*/ + You("ゆっくり水面まで上がった."); else goto stillinwater; was_underwater = Underwater && !Is_waterlevel(&u.uz); @@ -1529,19 +1921,35 @@ mtmp->mundetected = mtmp->msleeping = 0; switch(mtmp->data->mlet) { case S_PIERCER: +/*JP pline("%s suddenly drops from the %s!", +*/ + pline("%sが突然%sから落ちてきた!", Amonnam(mtmp), ceiling(u.ux,u.uy)); if(mtmp->mtame) /* jumps to greet you, not attack */ ; else if(uarmh && is_metallic(uarmh)) +/*JP pline("Its blow glances off your helmet."); +*/ + pline("攻撃はあなたの兜をかすめただけだった."); else if (u.uac + 3 <= rnd(20)) +#if 0 /*JP*/ You("are almost hit by %s!", x_monnam(mtmp, ARTICLE_A, "falling", 0, TRUE)); +#else + You("落ちてきた%sにもう少しで当たるところだった.", + x_monnam(mtmp, ARTICLE_A, "", 0, TRUE)); +#endif else { int dmg; +#if 0 /*JP*/ You("are hit by %s!", x_monnam(mtmp, ARTICLE_A, "falling", 0, TRUE)); +#else + You("落ちてきた%sに当たった!", + x_monnam(mtmp, ARTICLE_A, "", 0, TRUE)); +#endif dmg = d(4,6); if(Half_physical_damage) dmg = (dmg+1) / 2; mdamageu(mtmp, dmg); @@ -1549,15 +1957,26 @@ break; default: /* monster surprises you. */ if(mtmp->mtame) +#if 0 /*JP*/ pline("%s jumps near you from the %s.", + Amonnam(mtmp)); +#else + pline("%sが%sからあなたの近くに飛んできた.", Amonnam(mtmp), ceiling(u.ux,u.uy)); +#endif else if(mtmp->mpeaceful) { +/*JP You("surprise %s!", +*/ + You("%sを驚かした!", Blind && !sensemon(mtmp) ? something : a_monnam(mtmp)); mtmp->mpeaceful = 0; } else +/*JP pline("%s attacks you by surprise!", +*/ + pline("%sは驚いてあなたを攻撃した!", Amonnam(mtmp)); break; } @@ -1742,48 +2161,90 @@ * but everything else gives a message only the first time */ switch (rt) { case ZOO: +/*JP pline("Welcome to David's treasure zoo!"); +*/ + pline("デビット宝箱動物園にようこそ!"); break; case SWAMP: +#if 0 /*JP*/ pline("It %s rather %s down here.", Blind ? "feels" : "looks", Blind ? "humid" : "muddy"); +#else + pline("かなり%s%s.", + Blind ? "湿気がある" : "どろどろしている", + Blind ? "場所のようだ" : "場所だ"); +#endif break; case COURT: +/*JP You("enter an opulent throne room!"); +*/ + You("華やかな玉座の間に入った!"); break; case LEPREHALL: +/*JP You("enter a leprechaun hall!"); +*/ + You("レプラコーンホールに入った!"); break; case MORGUE: if(midnight()) { +#if 0 /*JP*/ const char *run = locomotion(youmonst.data, "Run"); pline("%s away! %s away!", run, run); +#else + pline("逃げろ!逃げろ!"); +#endif } else +/*JP You("have an uncanny feeling..."); +*/ + You("不気味な感じがした..."); break; case BEEHIVE: +/*JP You("enter a giant beehive!"); +*/ + You("巨大な蜂の巣に入った!"); break; case COCKNEST: +/*JP You("enter a disgusting nest!"); +*/ + You("むっとする臭いのする鳥の巣に入った!"); break; case ANTHOLE: +/*JP You("enter an anthole!"); +*/ + You("アリの巣に入った!"); break; case BARRACKS: if(monstinroom(&mons[PM_SOLDIER], roomno) || monstinroom(&mons[PM_SERGEANT], roomno) || monstinroom(&mons[PM_LIEUTENANT], roomno) || monstinroom(&mons[PM_CAPTAIN], roomno)) +/*JP You("enter a military barracks!"); +*/ + You("軍人の兵舍に入った!"); else +/*JP You("enter an abandoned barracks."); +*/ + You("放置されたままの兵舍に入った."); break; case DELPHI: if(monstinroom(&mons[PM_ORACLE], roomno)) +#if 0 /*JP*/ verbalize("%s, %s, welcome to Delphi!", Hello((struct monst *) 0), plname); +#else + verbalize("おお%s,デルファイの神託所によくぞまいられた!", + plname); +#endif break; case TEMPLE: intemple(roomno + ROOMOFFSET); @@ -1844,11 +2305,22 @@ if(u.uswallow) { if (!u.ustuck->minvent) { if (is_animal(u.ustuck->data)) { +/*JP You("pick up %s tongue.", s_suffix(mon_nam(u.ustuck))); +*/ + You("%sの舌を拾った.", mon_nam(u.ustuck)); +/*JP pline("But it's kind of slimy, so you drop it."); +*/ + pline("しかし,それはぬるぬるして不快だったので捨ててしまった."); } else +#if 0 /*JP*/ You("don't %s anything in here to pick up.", Blind ? "feel" : "see"); +#else + pline("ここには拾えるものがない%s.", + Blind ? "ようだ" : ""); +#endif return(1); } else { int tmpcount = -count; @@ -1858,36 +2330,58 @@ if(is_pool(u.ux, u.uy)) { if (Wwalking || is_floater(youmonst.data) || is_clinger(youmonst.data) || (Flying && !Breathless)) { +/*JP You("cannot dive into the water to pick things up."); +*/ + You("物を拾いあげるために水に飛びこめない."); return(0); } else if (!Underwater) { +#if 0 /*JP*/ You_cant("even see the bottom, let alone pick up %s.", something); +#else + pline("底さえ見えない,拾うのはやめよう."); +#endif return(0); } } if (is_lava(u.ux, u.uy)) { if (Wwalking || is_floater(youmonst.data) || is_clinger(youmonst.data) || (Flying && !Breathless)) { +/*JP You_cant("reach the bottom to pick things up."); +*/ + You_cant("物を拾い上げるために底までいけない."); return(0); } else if (!likes_lava(youmonst.data)) { +/*JP You("would burn to a crisp trying to pick things up."); +*/ + You("拾い上げようとしたら丸焦げになってしまうだろう."); return(0); } } if(!OBJ_AT(u.ux, u.uy)) { +/*JP There("is nothing here to pick up."); +*/ + pline("ここには拾えるものはない."); return(0); } if (!can_reach_floor()) { #ifdef STEED if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) +/*JP You("aren't skilled enough to reach from %s.", +*/ + You("まだ十分に技量を積んでいないので,%sから届かない.", y_monnam(u.usteed)); else #endif +/*JP You("cannot reach the %s.", surface(u.ux,u.uy)); +*/ + You("%sにたどりつくことができない.", surface(u.ux,u.uy)); return(0); } @@ -1899,7 +2393,10 @@ */ if ((traphere->ttyp == PIT || traphere->ttyp == SPIKED_PIT) && (!u.utrap || (u.utrap && u.utraptype != TT_PIT))) { +/*JP You("cannot reach the bottom of the pit."); +*/ + You("落し穴の底に%sが届かなかった.", body_part(HAND)); return(0); } } @@ -2106,20 +2603,38 @@ const char *who; int i, powercnt; +#if 0 /*JP*/ who = (Role_if(PM_WIZARD) || Role_if(PM_VALKYRIE)) ? urole.name.m : "Elf"; +#else + who = (Role_if(PM_WIZARD) || Role_if(PM_VALKYRIE)) ? + urole.jname.m : "エルフ"; +#endif if (u.uhp == 1) { +/*JP pline("%s is about to die.", who); +*/ + pline("%sは死にかけている.", who); } else { for (i = 0, powercnt = 0; i < SIZE(powers); ++i) if (u.uprops[powers[i]].intrinsic & INTRINSIC) ++powercnt; +#if 0 /*JP*/ pline(powercnt >= 4 ? "%s, all your powers will be lost..." : "%s, your life force is running out.", who); +#else + pline(powercnt >= 4 ? "%s,あなたの全ての力は失われつつある..." + : "%s,あなたの生命力は尽きようとしている...", who); +#endif } } else { +#if 0 /*JP*/ You_hear(u.uhp == 1 ? "the wailing of the Banshee..." : "the howling of the CwnAnnwn..."); +#else + You_hear(u.uhp == 1 ? "バンシーのすすり泣きが聞こえる..." + : "クーン・アンヌーンの遠吠が聞こえる..."); +#endif } } @@ -2147,7 +2662,10 @@ if(u.uhp < 1) { killer_format = k_format; killer = knam; /* the thing that killed you */ +/*JP You("die..."); +*/ + pline("あなたは死にました..."); done(DIED); } else if (n > 0 && u.uhp*10 < u.uhpmax) { maybe_wail(); @@ -2259,7 +2777,10 @@ if(str) pline(str); else +/*JP You_cant("do that while carrying so much stuff."); +*/ + You("沢山ものを持ちすぎているので,そんなことはできない."); return 1; } return 0; diff -aurbN -xCVS -xXTAGS nethack/src/hacklib.c jnethack/src/hacklib.c --- nethack/src/hacklib.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/hacklib.c 2004-12-05 05:12:13.000000000 +0900 @@ -3,6 +3,11 @@ /* Copyright (c) Robert Patrick Rankin, 1991 */ /* NetHack may be freely redistributed. See license for details. */ +/* + Y2K problem fixed + by Issei Numata 1 Nov, 1999 + */ + /* We could include only config.h, except for the overlay definitions... */ #include "hack.h" /*= @@ -90,6 +95,9 @@ register char *p; for (p = s; *p; p++) +#if 1 /*JP*/ + if (is_kanji(*(unsigned char *)p)) p++; else +#endif if ('A' <= *p && *p <= 'Z') *p |= 040; return s; } @@ -144,6 +152,19 @@ return s; } +#if 1 /*JP*/ +/* there are no `possessive' in Japanese */ +/* by issei@jaist.ac.jp */ +char * +s_suffix(s) + const char *s; +{ + Static char buf[BUFSZ]; + + Strcpy(buf, s); + return buf; +} +#else char * s_suffix(s) /* return a name converted to possessive */ const char *s; @@ -159,6 +180,7 @@ Strcat(buf, "'s"); return buf; } +#endif char * xcrypt(str, buf) /* trivial text encryption routine (see makedefs) */ @@ -514,7 +536,11 @@ yymmdd(date) time_t date; { +#if 0 /*JP*/ Static char datestr[10]; +#else + Static char datestr[16]; +#endif struct tm *lt; if (date == 0) @@ -526,8 +552,17 @@ lt = localtime(&date); #endif +#if 0 /*JP*/ Sprintf(datestr, "%02d%02d%02d", lt->tm_year, lt->tm_mon + 1, lt->tm_mday); +#else +/* + Y2K problem fixed (by issei 1 Nov 1999) + now yymmdd returned 8 degits format like as '20000101' + */ + Sprintf(datestr, "%04d%02d%02d", + lt->tm_year + 1900, lt->tm_mon + 1, lt->tm_mday); +#endif return(datestr); } #endif diff -aurbN -xCVS -xXTAGS nethack/src/invent.c jnethack/src/invent.c --- nethack/src/invent.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/invent.c 2005-07-16 04:12:40.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #define NOINVSYM '#' @@ -615,8 +622,12 @@ currency(amount) long amount; { +#if 0 /*JP*/ if (amount == 1L) return "zorkmid"; else return "zorkmids"; +#else + return "ゴールド"; +#endif } boolean @@ -740,6 +751,71 @@ return !strcmp(action, "wear") || !strcmp(action, "put on"); } +#if 1 /*JP*/ +static struct trans_verb trans_verb_list[] = { + {"adjust", "どれ", "を", "調整する"}, + {"call", "どれ", "を", "呼ぶ"}, + {"charge", "どれ", "を", "充填する"}, + {"dip into", "どれ", "に", "浸す"}, + {"dip", "どれ", "を", "浸す"}, + {"drink", "どれ", "を", "飲む"}, + {"drop", "どれ", "を", "置く"}, + {"eat", "どれ", "を", "食べる"}, + {"grease", "どれ", "に", "塗る"}, + {"identify", "どれ", "を", "識別する"}, + {"invoke", "ど", "の", "魔力を使う"}, + {"name", "どれ", "を", "名づける"}, + {"put on", "どれ", "を", "身につける"}, + {"read", "どれ", "を", "読む"}, + {"ready", "どれ", "を", "装填する"}, + {"remove", "どれ", "を", "はずす"}, + {"rub", "どれ", "を", "こする"}, + {"rub on the stone", "どれ", "を", "石でこする"}, + {"sacrifice", "どれ", "を", "捧げる"}, + {"take off", "ど", "の", "装備を解く"}, + {"throw", "どれ", "を", "投げる"}, + {"tin", "どれ", "を", "缶詰めにする"}, + {"untrap with", "どれ", "を", "使って解除する"}, + {"use or apply", "どれ", "を", "使う"}, + {"wear", "どれ", "を", "身につける"}, + {"write on", "どれ", "に", "書く"}, + {"write with", "どれ", "を", "使って書く"}, + {"zap", "どれ", "を", "振りかざす"}, + {(void *)0, (void *)0}, +}; + +static struct trans_verb wield = + {"wield", "どれ", "を", (void *)0} +; + +static struct trans_verb dummyverb = + {(void *)0, "どれ", "を", (void *)0} +; + +struct trans_verb +*trans_verb(const char *en){ + struct trans_verb *list = trans_verb_list; + + if(!strcmp(en, wield.en)){ + wield.jp = body_part(HANDED); + return &wield; + } + + + while(list->en){ + if(!strcmp(en, list->en)){ + return list; + } + list++; + } + + dummyverb.en = en; + dummyverb.jp = en; + + return &dummyverb;; +} +#endif + /* * getobj returns: * struct obj *xxx: object to do something with. @@ -750,6 +826,13 @@ !!!! may be able to remove "usegold" #endif */ +/*JP +** word には英語で動詞が入る. +** +** 日本語では,「どれを書きますか」より「どれに書きますか」の方が自然なので, +** 最初の一文字に「に」や「の」を指定した場合は助詞を変更する. +** +*/ struct obj * getobj(let,word) register const char *let,*word; @@ -773,6 +856,17 @@ boolean prezero = FALSE; long dummymask; +#if 1 /*JP*/ + const char *jword; + const char *joshi; + const char *what; + + struct trans_verb *tv = trans_verb(word); + + jword = tv->jp; + what = tv->what; + joshi = tv->particle; +#endif if(*let == ALLOW_COUNT) let++, allowcnt = 1; #ifndef GOLDOBJ if(*let == COIN_CLASS) let++, @@ -937,18 +1031,31 @@ #else if(!foo && !allowall && !allownone) { #endif +#if 0 /*JP*/ You("don't have anything %sto %s.", foox ? "else " : "", word); +#else + You("%s%sものを持っていない.", + foox ? "他に" : "", jconj(jword, "れる")); +#endif return((struct obj *)0); } for(;;) { cnt = 0; if (allowcnt == 2) allowcnt = 1; /* abort previous count */ if(!buf[0]) { +/*JP Sprintf(qbuf, "What do you want to %s? [*]", word); +*/ + Sprintf(qbuf, "%s%s%sか?[*]", what, joshi, jpolite(jword)); } else { +#if 0 /*JP*/ Sprintf(qbuf, "What do you want to %s? [%s or ?*]", word, buf); +#else + Sprintf(qbuf, "%s%s%sか?[%s or ?*]", what, joshi, + jpolite(jword), buf); +#endif } #ifdef REDO if (in_doagain) @@ -966,7 +1073,10 @@ ilet = readchar(); } if(digit(ilet)) { +/*JP pline("No count allowed with this command."); +*/ + pline("このコマンドに数字はつかえない."); continue; } if(index(quitchars,ilet)) { @@ -979,16 +1089,23 @@ } if(ilet == def_oc_syms[COIN_CLASS]) { if (!usegold) { +#if 0 /*JP*/ if (!strncmp(word, "rub on ", 7)) { /* the dangers of building sentences... */ You("cannot rub gold%s.", word + 3); } else { You("cannot %s gold.", word); } +#else + You("金貨%s%sことはできない.", joshi, jword); +#endif return(struct obj *)0; #ifndef GOLDOBJ } else if (!allowgold) { +/*JP You("are not carrying any gold."); +*/ + You("一銭も持ってない."); return(struct obj *)0; #endif } @@ -1000,7 +1117,10 @@ * from Larn. */ if(cnt < 0) { +/*JP pline_The("LRS would be very interested to know you have that much."); +*/ + pline("その技はとあるゲームのカジノで使えたけど,もはや使えないよ."); return(struct obj *)0; } @@ -1041,7 +1161,10 @@ allowcnt = 1; if(cnt == 0 && prezero) return((struct obj *)0); if(cnt > 1) { +/*JP You("can only throw one item at a time."); +*/ + You("同時にたくさんのものを投げられない."); continue; } } @@ -1054,13 +1177,19 @@ for (otmp = invent; otmp; otmp = otmp->nobj) if (otmp->invlet == ilet) break; if(!otmp) { +/*JP You("don't have that object."); +*/ + You("そんなものは持っていない."); #ifdef REDO if (in_doagain) return((struct obj *) 0); #endif continue; } else if (cnt < 0 || otmp->quan < cnt) { +/*JP You("don't have that many! You have only %ld.", +*/ + pline("そんなにたくさんは持っていない!せいぜい%ld個ってとこだ.", otmp->quan); #ifdef REDO if (in_doagain) return((struct obj *) 0); @@ -1074,7 +1203,11 @@ && !(usegold && otmp->oclass == COIN_CLASS) #endif ) { +#if 0 /*JP*/ silly_thing(word, otmp); +#else + silly_thing(jword, otmp); +#endif return((struct obj *)0); } if(allowcnt == 2) { /* cnt given */ @@ -1096,32 +1229,55 @@ const char *word; struct obj *otmp; { +#if 0 /*JP*/ const char *s1, *s2, *s3, *what; +#else + const char *s1, *s2, *s3; +#endif int ocls = otmp->oclass, otyp = otmp->otyp; s1 = s2 = s3 = 0; /* check for attempted use of accessory commands ('P','R') on armor and for corresponding armor commands ('W','T') on accessories */ - if (ocls == ARMOR_CLASS) { + if (ocls == ARMOR_CLASS) {/*argrath*/ +#if 0 /*JP*/ if (!strcmp(word, "put on")) s1 = "W", s2 = "wear", s3 = ""; else if (!strcmp(word, "remove")) s1 = "T", s2 = "take", s3 = " off"; +#else + if (!strcmp(word, "身につける")) + s1 = "W", s2 = "身につける", s3 = ""; + else if (!strcmp(word, "はずす")) + s1 = "T", s2 = "はずす", s3 = ""; +#endif } else if ((ocls == RING_CLASS || otyp == MEAT_RING) || ocls == AMULET_CLASS || (otyp == BLINDFOLD || otyp == TOWEL || otyp == LENSES)) { +#if 0 /*JP*/ if (!strcmp(word, "wear")) s1 = "P", s2 = "put", s3 = " on"; else if (!strcmp(word, "take off")) s1 = "R", s2 = "remove", s3 = ""; +#else + if (!strcmp(word, "身につける")) + s1 = "P", s2 = "身につける", s3 = ""; + else if (!strcmp(word, "はずす")) + s1 = "R", s2 = "はずす", s3 = ""; +#endif } if (s1) { +#if 0 /*JP*/ what = "that"; /* quantity for armor and accessory objects is always 1, but some things should be referred to as plural */ if (otyp == LENSES || is_gloves(otmp) || is_boots(otmp)) what = "those"; +#endif +/*JP pline("Use the '%s' command to %s %s%s.", s1, s2, what, s3); +*/ + pline("それを%sには'%s'コマンドを使うこと.", s2, s1); } else { pline(silly_thing_to, word); } @@ -1172,6 +1328,13 @@ /* interactive version of getobj - used for Drop, Identify and */ /* Takeoff (A). Return the number of times fn was called successfully */ /* If combo is TRUE, we just use this to get a category list */ +/*JP CHECK: 3.4.3 の呼び出し元 +do.c:864: (result = ggetobj("drop", drop, 0, FALSE, (unsigned *)0)) < -1) +do.c:925: i = ggetobj("drop", drop, 0, TRUE, &ggoresults); +do_wear.c:2538: (result = ggetobj("take off", select_off, 0, FALSE, (unsigned *)0)) < -1) +do_wear.c:2586: if (ggetobj("take off", select_off, 0, TRUE, (unsigned *)0) == -2) +invent.c:1782: n = ggetobj("identify", identify, id_limit, FALSE, (unsigned *)0); +*/ int ggetobj(word, fn, mx, combo, resultflags) const char *word; @@ -1191,6 +1354,14 @@ char sym, *ip, olets[MAXOCLASSES+5], ilets[MAXOCLASSES+5]; char extra_removeables[3+1]; /* uwep,uswapwep,uquiver */ char buf[BUFSZ], qbuf[QBUFSZ]; +#if 1 /*JP*/ + const char *joshi = "を"; + const char *jword; + + const struct trans_verb *tv = trans_verb(word); + jword = tv->jp; + joshi = tv->particle; +#endif if (resultflags) *resultflags = 0; #ifndef GOLDOBJ @@ -1202,7 +1373,10 @@ #else if(!invent){ #endif +/*JP You("have nothing to %s.", word); +*/ + You("%sものは持っていない.", jcan(jword)); return(0); } add_valid_menu_class(0); /* reset */ @@ -1241,8 +1415,13 @@ ilets[iletct] = '\0'; for (;;) { +#if 0 /*JP*/ Sprintf(qbuf,"What kinds of thing do you want to %s? [%s]", word, ilets); +#else + Sprintf(qbuf,"どの種類のもの%s%sか?[%s]",joshi, + jpolite(jword), ilets); +#endif getlin(qbuf, buf); if (buf[0] == '\033') return(0); if (index(buf, 'i')) { @@ -1269,23 +1448,41 @@ if (index(extra_removeables, oc_of_sym)) { ; /* skip rest of takeoff checks */ } else if (!index(removeables, oc_of_sym)) { +/*JP pline("Not applicable."); +*/ + pline("それはできない."); return 0; } else if (oc_of_sym == ARMOR_CLASS && !wearing_armor()) { +/*JP You("are not wearing any armor."); +*/ + You("鎧を着ていない."); return 0; } else if (oc_of_sym == WEAPON_CLASS && !uwep && !uswapwep && !uquiver) { +/*JP You("are not wielding anything."); +*/ + You("何も装備していない."); return 0; } else if (oc_of_sym == RING_CLASS && !uright && !uleft) { +/*JP You("are not wearing rings."); +*/ + You("指輪を身につけていない."); return 0; } else if (oc_of_sym == AMULET_CLASS && !uamul) { +/*JP You("are not wearing an amulet."); +*/ + You("魔除けを身につけていない."); return 0; } else if (oc_of_sym == TOOL_CLASS && !ublindf) { +/*JP You("are not wearing a blindfold."); +*/ + You("目隠しをしていない."); return 0; } } @@ -1295,7 +1492,10 @@ if (allowgold == 1) (*fn)(mkgoldobj(u.ugold)); else if (!u.ugold) +/*JP You("have no gold."); +*/ + You("一銭も持っていない."); allowgold = 2; #else flags.botl = 1; @@ -1322,7 +1522,10 @@ } else if (sym == 'm') { m_seen = TRUE; } else if (oc_of_sym == MAXOCLASSES) { +/*JP You("don't have any %c's.", sym); +*/ + You("%cに属する物を持っていない.", sym); } else if (oc_of_sym != VENOM_CLASS) { /* suppress venom */ if (!index(olets, oc_of_sym)) { add_valid_menu_class(oc_of_sym); @@ -1366,6 +1569,12 @@ * If allflag then no questions are asked. Max gives the max nr of * objects to be treated. Return the number of objects treated. */ +/*JP CHECK: 3.4.3 での呼び出し元 +invent.c:1512:ggetobj() int cnt = askchain(&invent, olets, allflag, fn, ckfn, mx, word); +pickup.c:2615:("nodot") if (askchain((struct obj **)¤t_container->cobj, +pickup.c:2711:("nodot") (void) askchain((struct obj **)&invent, + wordには動詞が英語で入る。 +*/ int askchain(objchn, olets, allflag, fn, ckfn, mx, word) struct obj **objchn; @@ -1402,7 +1611,10 @@ if (!allflag) { Strcpy(qbuf, !ininv ? doname(otmp) : xprname(otmp, (char *)0, ilet, !nodot, 0L, 0L)); +/*JP Strcat(qbuf, "?"); +*/ + Strcat(qbuf, "?"); sym = (takeoff || ident || otmp->quan < 2L) ? nyaq(qbuf) : nyNaq(qbuf); } @@ -1452,8 +1664,14 @@ } if (olets && *olets && *++olets) goto nextclass; +/*JP if(!takeoff && (dud || cnt)) pline("That was all."); +*/ + if(!takeoff && (dud || cnt)) pline("これで全部だ."); +/*JP else if(!dud && !cnt) pline("No applicable objects."); +*/ + else if(!dud && !cnt) pline("それはできない."); ret: return(cnt); } @@ -1496,8 +1714,13 @@ /* assumptions: id_limit > 0 and at least one unID'd item is present */ while (id_limit) { +#if 0 /*JP*/ Sprintf(buf, "What would you like to identify %s?", first ? "first" : "next"); +#else + Sprintf(buf, "どれを%sに識別しますか?", + first ? "最初" : "次"); +#endif n = query_objlist(buf, invent, SIGNAL_NOMENU|USE_INVLET|INVORDER_SORT, &pick_list, PICK_ANY, not_fully_identified); @@ -1508,7 +1731,10 @@ free((genericptr_t) pick_list); mark_synch(); /* Before we loop to pop open another menu */ } else { +/*JP if (n < 0) pline("That was all."); +*/ + if (n < 0) pline("これで全部だ."); id_limit = 0; /* Stop now */ } first = 0; @@ -1529,7 +1755,10 @@ if (not_fully_identified(obj)) ++unid_cnt, the_obj = obj; if (!unid_cnt) { +/*JP You("have already identified all of your possessions."); +*/ + You("全ての所有物を識別してしまっている."); } else if (!id_limit) { /* identify everything */ if (unid_cnt == 1) { @@ -1584,9 +1813,15 @@ long quan; { if (!prefix) prefix = ""; +#if 0 /*JP*/ pline("%s%s%s", prefix, *prefix ? " " : "", xprname(obj, (char *)0, obj_to_let(obj), TRUE, 0L, quan)); +#else + pline("%s%s", + xprname(obj, (char *)0, obj_to_let(obj), *prefix ? FALSE : TRUE, 0L, quan), + prefix); +#endif } #endif /* OVL2 */ @@ -1621,19 +1856,31 @@ */ if (cost != 0 || let == '*') { /* if dot is true, we're doing Iu, otherwise Ix */ +#if 0 /*JP*/ Sprintf(li, "%c - %-45s %6ld %s", +#else + Sprintf(li, "%c - %-45s %6ld%s", +#endif (dot && use_invlet ? obj->invlet : let), (txt ? txt : doname(obj)), cost, currency(cost)); #ifndef GOLDOBJ } else if (obj && obj->oclass == COIN_CLASS) { +#if 0 /*JP*/ Sprintf(li, "%ld gold piece%s%s", obj->quan, plur(obj->quan), (dot ? "." : "")); +#else + Sprintf(li, "%ld枚の金貨%s", obj->quan, + (dot ? "." : "")); +#endif #endif } else { /* ordinary inventory display or pickup message */ Sprintf(li, "%c - %s%s", (use_invlet ? obj->invlet : let), +/*JP (txt ? txt : doname(obj)), (dot ? "." : "")); +*/ + (txt ? txt : doname(obj)), (dot ? "." : "")); } if (savequan) obj->quan = savequan; @@ -1726,9 +1973,15 @@ */ if (!invent && !(flags.perm_invent && !lets && !want_reply)) { #ifndef GOLDOBJ +/*JP pline("Not carrying anything%s.", u.ugold ? " except gold" : ""); +*/ + pline("%s何も持っていない.", u.ugold ? "お金以外" : ""); #else +/*JP pline("Not carrying anything."); +*/ + pline("何も持っていない."); #endif return 0; } @@ -1750,6 +2003,9 @@ break; } } +#if 1 /*JP*/ + set_trns_mode(1); +#endif return ret; } @@ -1793,6 +2049,9 @@ } else ret = !n ? '\0' : '\033'; /* cancelled */ +#if 1 /*JP*/ + set_trns_mode(1); +#endif return ret; } @@ -1952,7 +2211,10 @@ } putstr(win, 0, ""); +/*JP putstr(win, 0, xprname((struct obj *)0, "Total:", '*', FALSE, totcost, 0L)); +*/ + putstr(win, 0, xprname((struct obj *)0, "合計:", '*', FALSE, totcost, 0L)); display_nhwindow(win, FALSE); destroy_nhwindow(win); } @@ -1979,14 +2241,20 @@ boolean billx = *u.ushops && doinvbill(0); menu_item *pick_list; boolean traditional = TRUE; +/*JP const char *prompt = "What type of object do you want an inventory of?"; +*/ + const char *prompt = "どの種類の持ち物を見ますか?"; #ifndef GOLDOBJ if (!invent && !u.ugold && !billx) { #else if (!invent && !billx) { #endif +/*JP You("aren't carrying anything."); +*/ + You("その種類の物は何も持っていない."); return 0; } unpaid_count = count_unpaid(invent); @@ -2054,14 +2322,20 @@ if (billx) (void) doinvbill(1); else +/*JP pline("No used-up objects on your shopping bill."); +*/ + pline("使ってしまった物は商店の請求書にない."); return 0; } if (c == 'u') { if (unpaid_count) dounpaid(); else +/*JP You("are not carrying any unpaid objects."); +*/ + You("未払いのアイテムを持っていない."); return 0; } if (traditional) { @@ -2069,7 +2343,10 @@ if (oclass == COIN_CLASS) { return doprgold(); } else if (index(types, c) > index(types, '\033')) { +/*JP You("have no such objects."); +*/ + You("何も持っていない."); return 0; } this_type = oclass; @@ -2097,12 +2374,18 @@ switch (lev->doormask) { case D_NODOOR: cmap = S_ndoor; break; /* "doorway" */ case D_ISOPEN: cmap = S_vodoor; break; /* "open door" */ +/*JP case D_BROKEN: dfeature = "broken door"; break; +*/ + case D_BROKEN: dfeature = "壊れた扉"; break; default: cmap = S_vcdoor; break; /* "closed door" */ } /* override door description for open drawbridge */ if (is_drawbridge_wall(x, y) >= 0) +/*JP dfeature = "open drawbridge portcullis", cmap = -1; +*/ + dfeature = "降りている跳ね橋", cmap = -1; } else if (IS_FOUNTAIN(ltyp)) cmap = S_fountain; /* "fountain" */ else if (IS_THRONE(ltyp)) @@ -2112,13 +2395,19 @@ else if (is_ice(x,y)) cmap = S_ice; /* "ice" */ else if (is_pool(x,y)) +/*JP dfeature = "pool of water"; +*/ + dfeature = "水たまり"; #ifdef SINKS else if (IS_SINK(ltyp)) cmap = S_sink; /* "sink" */ #endif else if (IS_ALTAR(ltyp)) { +/*JP Sprintf(altbuf, "altar to %s (%s)", a_gname(), +*/ + Sprintf(altbuf, "%sの祭壇(%s)", a_gname(), align_str(Amask2align(lev->altarmask & ~AM_SHRINE))); dfeature = altbuf; } else if ((x == xupstair && y == yupstair) || @@ -2140,9 +2429,17 @@ else if (ltyp == TREE) cmap = S_tree; /* "tree" */ else if (ltyp == IRONBARS) +/*JP dfeature = "set of iron bars"; +*/ + dfeature = "鉄の棒"; +#if 0 /*JP*/ if (cmap >= 0) dfeature = defsyms[cmap].explanation; +#else + if (cmap >= 0) + dfeature = jtrns_obj('S', defsyms[cmap].explanation); +#endif if (dfeature) Strcpy(buf, dfeature); return dfeature; } @@ -2156,7 +2453,10 @@ { struct obj *otmp; struct trap *trap; +/*JP const char *verb = Blind ? "feel" : "see"; +*/ + const char *verb = Blind ? "があるような気がした" : "をみつけた"; const char *dfeature = (char *)0; char fbuf[BUFSZ], fbuf2[BUFSZ]; winid tmpwin; @@ -2164,60 +2464,112 @@ if (u.uswallow && u.ustuck) { struct monst *mtmp = u.ustuck; +#if 0 /*JP*/ Sprintf(fbuf, "Contents of %s %s", s_suffix(mon_nam(mtmp)), mbodypart(mtmp, STOMACH)); +#else + Sprintf(fbuf, "%sの%sの中身", + mon_nam(mtmp), mbodypart(mtmp, STOMACH)); +#endif +#if 0 /*JP*//*語順が違うので素直に*/ /* Skip "Contents of " by using fbuf index 12 */ You("%s to %s what is lying in %s.", Blind ? "try" : "look around", verb, &fbuf[12]); +#else + You("%sの%sに何があるか%s.", + mon_nam(mtmp), mbodypart(mtmp, STOMACH), + Blind ? "さぐった" : "見回した"); +#endif otmp = mtmp->minvent; if (otmp) { for ( ; otmp; otmp = otmp->nobj) { /* If swallower is an animal, it should have become stone but... */ if (otmp->otyp == CORPSE) feel_cockatrice(otmp, FALSE); } +#if 0 /*JP*/ if (Blind) Strcpy(fbuf, "You feel"); Strcat(fbuf,":"); +#else + Sprintf(fbuf, "ここにある%sものは...", Blind ? "らしい" : ""); +#endif (void) display_minventory(mtmp, MINV_ALL, fbuf); } else { +#if 0 /*JP*/ You("%s no objects here.", verb); +#else + pline(Blind ? "あなたは何もないような気がした." + : "あなたは何もみつけられなかった."); +#endif } return(!!Blind); } if (!skip_objects && (trap = t_at(u.ux,u.uy)) && trap->tseen) +#if 0 /*JP*/ There("is %s here.", an(defsyms[trap_to_defsym(trap->ttyp)].explanation)); +#else + pline("ここには%sがある.", + jtrns_obj('^', (defsyms[trap_to_defsym(trap->ttyp)].explanation))); +#endif otmp = level.objects[u.ux][u.uy]; dfeature = dfeature_at(u.ux, u.uy, fbuf2); +/*JP if (dfeature && !strcmp(dfeature, "pool of water") && Underwater) +*/ + if (dfeature && !strcmp(dfeature, "水たまり") && Underwater) dfeature = 0; if (Blind) { boolean drift = Is_airlevel(&u.uz) || Is_waterlevel(&u.uz); +/*JP if (dfeature && !strncmp(dfeature, "altar ", 6)) { +*/ + if (dfeature && !strncmp(dfeature, "祭壇", 4)) { /* don't say "altar" twice, dfeature has more info */ +/*JP You("try to feel what is here."); +*/ + You("ここに何があるのか調べようとした."); } else { +#if 0 /*JP*/ You("try to feel what is %s%s.", drift ? "floating here" : "lying here on the ", drift ? "" : surface(u.ux, u.uy)); +#else + You("何が%s%sのか調べようとした.", + drift ? "" : surface(u.ux, u.uy), + drift ? "浮いている" : "の上にある"); +#endif } if (dfeature && !drift && !strcmp(dfeature, surface(u.ux,u.uy))) dfeature = 0; /* ice already identifed */ if (!can_reach_floor()) { +/*JP pline("But you can't reach it!"); +*/ + pline("しかし届かない!"); return(0); } } if (dfeature) +/*JP Sprintf(fbuf, "There is %s here.", an(dfeature)); +*/ + Sprintf(fbuf, "ここには%sがある.", an(dfeature)); if (!otmp || is_lava(u.ux,u.uy) || (is_pool(u.ux,u.uy) && !Underwater)) { if (dfeature) pline(fbuf); read_engr_at(u.ux, u.uy); /* Eric Backus */ if (!skip_objects && (Blind || !dfeature)) +#if 0 /*JP*/ You("%s no objects here.", verb); +#else + pline(Blind ? + "なにもないような気がする." : + "なにもみつけられなかった."); +#endif return(!!Blind); } /* we know there is something here */ @@ -2225,17 +2577,31 @@ if (skip_objects) { if (dfeature) pline(fbuf); read_engr_at(u.ux, u.uy); /* Eric Backus */ +#if 0 /*JP*/ There("are %s%s objects here.", (obj_cnt <= 10) ? "several" : "many", picked_some ? " more" : ""); +#else + pline("ここには%sものが%sある.", + (obj_cnt <= 10) ? "いくつか" : "沢山の", + picked_some ? "さらに" : ""); +#endif } else if (!otmp->nexthere) { /* only one object */ if (dfeature) pline(fbuf); read_engr_at(u.ux, u.uy); /* Eric Backus */ #ifdef INVISIBLE_OBJECTS +#if 0 /*JP*/ if (otmp->oinvis && !See_invisible) verb = "feel"; +#else + if (otmp->oinvis && !See_invisible) + verb = "があるような気がした"; +#endif #endif +/*JP You("%s here %s.", verb, doname(otmp)); +*/ + pline("%s%s.", doname(otmp), verb); if (otmp->otyp == CORPSE) feel_cockatrice(otmp, FALSE); } else { display_nhwindow(WIN_MESSAGE, FALSE); @@ -2244,8 +2610,13 @@ putstr(tmpwin, 0, fbuf); putstr(tmpwin, 0, ""); } +#if 0 /*JP:T*/ putstr(tmpwin, 0, Blind ? "Things that you feel here:" : "Things that are here:"); +#else + putstr(tmpwin, 0, Blind ? "ここにあるらしいものは..." : + "ここにあるものは..."); +#endif for ( ; otmp; otmp = otmp->nexthere) { if (otmp->otyp == CORPSE && will_feel_cockatrice(otmp, FALSE)) { char buf[BUFSZ]; @@ -2292,12 +2663,25 @@ if (will_feel_cockatrice(otmp, force_touch)) { if(poly_when_stoned(youmonst.data)) +#if 0 /*JP*/ You("touched the %s corpse with your bare %s.", mons[otmp->corpsenm].mname, makeplural(body_part(HAND))); +#else + You("%sの死体に素%sで触った.", + jtrns_mon(mons[otmp->corpsenm].mname), body_part(HAND)); +#endif else +#if 0 /*JP*/ pline("Touching the %s corpse is a fatal mistake...", mons[otmp->corpsenm].mname); +#else + pline("%sの死体に触れるのは致命的な間違いだ...", + jtrns_mon(mons[otmp->corpsenm].mname)); +#endif +/*JP Sprintf(kbuf, "%s corpse", an(mons[otmp->corpsenm].mname)); +*/ + Sprintf(kbuf, "%sの死体に触れて", jtrns_mon(mons[otmp->corpsenm].mname)); instapetrify(kbuf); } } @@ -2401,15 +2785,27 @@ take containers into account */ #ifndef GOLDOBJ if(!u.ugold) +/*JP Your("wallet is empty."); +*/ + Your("財布は空っぽだ."); else +/*JP Your("wallet contains %ld gold piece%s.", u.ugold, plur(u.ugold)); +*/ + Your("財布には%ld枚の金貨が入っている.", u.ugold); #else long umoney = money_cnt(invent); if(!umoney) +/*JP Your("wallet is empty."); +*/ + Your("財布は空っぽだ."); else +/*JP Your("wallet contains %ld %s.", umoney, currency(umoney)); +*/ + Your("財布には%ld%sが入っている.", umoney, currency(umoney)); #endif shopper_financial_report(); return 0; @@ -2422,7 +2818,10 @@ doprwep() { if (!uwep) { +/*JP You("are empty %s.", body_part(HANDED)); +*/ + if(!uwep) You("%sに武器をもっていない.", body_part(HAND)); } else { prinv((char *)0, uwep, 0L); if (u.twoweap) prinv((char *)0, uswapwep, 0L); @@ -2434,7 +2833,10 @@ doprarm() { if(!wearing_armor()) +/*JP You("are not wearing any armor."); +*/ + You("鎧を着ていない."); else { #ifdef TOURIST char lets[8]; @@ -2462,7 +2864,10 @@ doprring() { if(!uleft && !uright) +/*JP You("are not wearing any rings."); +*/ + You("指輪を身につけていない."); else { char lets[3]; register int ct = 0; @@ -2479,7 +2884,10 @@ dopramulet() { if (!uamul) +/*JP You("are not wearing an amulet."); +*/ + You("魔除けを身につけていない."); else prinv((char *)0, uamul, 0L); return 0; @@ -2510,7 +2918,10 @@ if (tool_in_use(otmp)) lets[ct++] = obj_to_let(otmp); lets[ct] = '\0'; +/*JP if (!ct) You("are not using any tools."); +*/ + if (!ct) You("使える道具をもっていない."); else (void) display_inventory(lets, FALSE); return 0; } @@ -2528,7 +2939,10 @@ if (is_worn(otmp) || tool_in_use(otmp)) lets[ct++] = obj_to_let(otmp); lets[ct] = '\0'; +/*JP if (!ct) You("are not wearing or wielding anything."); +*/ + if (!ct) You("何も着ていないし,装備していない."); else (void) display_inventory(lets, FALSE); return 0; } @@ -2570,10 +2984,17 @@ * This must match the object class order. */ STATIC_VAR NEARDATA const char *names[] = { 0, +#if 0 /*JP*/ "Illegal objects", "Weapons", "Armor", "Rings", "Amulets", "Tools", "Comestibles", "Potions", "Scrolls", "Spellbooks", "Wands", "Coins", "Gems", "Boulders/Statues", "Iron balls", "Chains", "Venoms" +#else + "妙な物体", "武器", "鎧", "指輪", "魔除け", + "道具", "食料", "薬", "巻物", "魔法書", + "杖", "金貨", "宝石", "岩または彫像", "鉄球", + "鎖", "毒" +#endif }; static NEARDATA const char oth_symbols[] = { @@ -2582,7 +3003,10 @@ }; static NEARDATA const char *oth_names[] = { +/*JP "Bagged/Boxed items" +*/ + "詰められた道具" }; static NEARDATA char *invbuf = (char *)0; @@ -2605,14 +3029,20 @@ else class_name = names[0]; +/*JP len = strlen(class_name) + (unpaid ? sizeof "unpaid_" : sizeof ""); +*/ + len = strlen(class_name) + (unpaid ? sizeof "未払いの" : sizeof ""); if (len > invbufsiz) { if (invbuf) free((genericptr_t)invbuf); invbufsiz = len + 10; /* add slop to reduce incremental realloc */ invbuf = (char *) alloc(invbufsiz); } if (unpaid) +/*JP Strcat(strcpy(invbuf, "Unpaid "), class_name); +*/ + Strcat(strcpy(invbuf, "未払いの"), class_name); else Strcpy(invbuf, class_name); return invbuf; @@ -2681,20 +3111,29 @@ /* get new letter to use as inventory letter */ for (;;) { +/*JP Sprintf(qbuf, "Adjust letter to what [%s]?",buf); +*/ + Sprintf(qbuf, "どの文字に調整しますか[%s]?", buf); let = yn_function(qbuf, (char *)0, '\0'); if(index(quitchars,let)) { pline(Never_mind); return(0); } if (let == '@' || !letter(let)) +/*JP pline("Select an inventory slot letter."); +*/ + pline("持ち物の文字を選んでください."); else break; } /* change the inventory and print the resulting item */ +/*JP adj_type = "Moving:"; +*/ + adj_type = "を移動した."; /* * don't use freeinv/addinv to avoid double-touching artifacts, @@ -2704,13 +3143,19 @@ for (otmp = invent; otmp;) if (merged(&otmp,&obj)) { +/*JP adj_type = "Merging:"; +*/ + adj_type = "を合わせた."; obj = otmp; otmp = otmp->nobj; extract_nobj(obj, &invent); } else { if (otmp->invlet == let) { +/*JP adj_type = "Swapping:"; +*/ + adj_type = "を交換した."; otmp->invlet = obj->invlet; } otmp = otmp->nobj; @@ -2793,8 +3238,13 @@ int do_all = (dflags & MINV_ALL) != 0; #endif +#if 0 /*JP*/ Sprintf(tmp,"%s %s:", s_suffix(noit_Monnam(mon)), do_all ? "possessions" : "armament"); +#else + Sprintf(tmp, "%sの%s:", Monnam(mon), + do_all ? "持ち物" : "装備"); +#endif #ifndef GOLDOBJ if (do_all ? (mon->minvent || mon->mgold) @@ -2835,7 +3285,10 @@ set_uasmon(); } else { +/*JP invdisp_nothing(title ? title : tmp, "(none)"); +*/ + invdisp_nothing(title ? title : tmp, "(何もない)"); n = 0; } @@ -2868,13 +3321,19 @@ int n; menu_item *selected = 0; +/*JP Sprintf(tmp,"Contents of %s:", doname(obj)); +*/ + Sprintf(tmp,"%sの中身:", doname(obj)); if (obj->cobj) { n = query_objlist(tmp, obj->cobj, INVORDER_SORT, &selected, PICK_NONE, allow_all); } else { +/*JP invdisp_nothing(tmp, "(empty)"); +*/ + invdisp_nothing(tmp, "(空っぽ)"); n = 0; } if (n > 0) { @@ -2920,7 +3379,10 @@ if (n) { only.x = x; only.y = y; +/*JP if (query_objlist("Things that are buried here:", +*/ + if (query_objlist("ここに埋められているもの:", level.buriedobjlist, INVORDER_SORT, &selected, PICK_NONE, only_here) > 0) free((genericptr_t)selected); diff -aurbN -xCVS -xXTAGS nethack/src/lock.c jnethack/src/lock.c --- nethack/src/lock.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/lock.c 2005-07-29 23:03:03.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" STATIC_PTR int NDECL(picklock); @@ -47,17 +54,35 @@ { /* "unlocking"+2 == "locking" */ static const char *actions[] = { +/* +** 英語は un をつけるだけで逆の意味になるが,日本語はそうはいかない. +** 誰だ?こんな数バイトけちるコード書いたやつは? +*/ +#if 0 /*JP*/ /* [0] */ "unlocking the door", /* [1] */ "unlocking the chest", /* [2] */ "unlocking the box", /* [3] */ "picking the lock" +#else + /* [0] */ "扉の鍵をはずす", + /* [1] */ "宝箱の鍵をはずす", + /* [2] */ "箱の鍵をはずす", + /* [3] */ "鍵をはずす" +#endif /*JP*/ }; /* if the target is currently unlocked, we're trying to lock it now */ if (xlock.door && !(xlock.door->doormask & D_LOCKED)) +#if 0 /*JP*/ return actions[0]+2; /* "locking the door" */ +#else + return "扉に鍵をかける"; +#endif else if (xlock.box && !xlock.box->olocked) +/*JP return xlock.box->otyp == CHEST ? actions[1]+2 : actions[2]+2; +*/ + return xlock.box->otyp == CHEST ? "宝箱に鍵をかける" : "箱に鍵をかける"; /* otherwise we're trying to unlock it */ else if (xlock.picktyp == LOCK_PICK) return actions[3]; /* "picking the lock" */ @@ -86,29 +111,47 @@ } switch (xlock.door->doormask) { case D_NODOOR: +/*JP pline("This doorway has no door."); +*/ + pline("出入口には扉がない."); return((xlock.usedtime = 0)); case D_ISOPEN: +/*JP You("cannot lock an open door."); +*/ + pline("開いてる扉に鍵をかけられない."); return((xlock.usedtime = 0)); case D_BROKEN: +/*JP pline("This door is broken."); +*/ + pline("扉は壊れている."); return((xlock.usedtime = 0)); } } if (xlock.usedtime++ >= 50 || nohands(youmonst.data)) { +/*JP You("give up your attempt at %s.", lock_action()); +*/ + pline("%sのをあきらめた.", lock_action()); exercise(A_DEX, TRUE); /* even if you don't succeed */ return((xlock.usedtime = 0)); } if(rn2(100) >= xlock.chance) return(1); /* still busy */ +/*JP You("succeed in %s.", lock_action()); +*/ + You("%sのに成功した.", lock_action()); if (xlock.door) { if(xlock.door->doormask & D_TRAPPED) { +/*JP b_trapped("door", FINGER); +*/ + b_trapped("扉", FINGER); xlock.door->doormask = D_NODOOR; unblock_point(u.ux+u.dx, u.uy+u.dy); if (*in_rooms(u.ux+u.dx, u.uy+u.dy, SHOPBASE)) @@ -137,7 +180,10 @@ return((xlock.usedtime = 0)); /* you or it moved */ if (xlock.usedtime++ >= 50 || !uwep || nohands(youmonst.data)) { +/*JP You("give up your attempt to force the lock."); +*/ + pline("鍵をこじ開けるのをあきらめた."); if(xlock.usedtime >= 50) /* you made the effort */ exercise((xlock.picktyp) ? A_DEX : A_STR, TRUE); return((xlock.usedtime = 0)); @@ -150,10 +196,17 @@ /* for a +0 weapon, probability that it survives an unsuccessful * attempt to force the lock is (.992)^50 = .67 */ +#if 0 /*JP*/ pline("%sour %s broke!", (uwep->quan > 1L) ? "One of y" : "Y", xname(uwep)); +#else + pline("%sは壊れてしまった!",xname(uwep)); +#endif useup(uwep); +/*JP You("give up your attempt to force the lock."); +*/ + pline("鍵をこじ開けるのをあきらめた."); exercise(A_DEX, TRUE); return((xlock.usedtime = 0)); } @@ -162,7 +215,10 @@ if(rn2(100) >= xlock.chance) return(1); /* still busy */ +/*JP You("succeed in forcing the lock."); +*/ + pline("鍵をこじ開けた."); xlock.box->olocked = 0; xlock.box->obroken = 1; if(!xlock.picktyp && !rn2(3)) { @@ -173,8 +229,13 @@ costly = (*u.ushops && costly_spot(u.ux, u.uy)); shkp = costly ? shop_keeper(*u.ushops) : 0; +#if 0 /*JP*/ pline("In fact, you've totally destroyed %s.", the(xname(xlock.box))); +#else + pline("実際のところ,%sを完全に壊してしまった.", + xname(xlock.box)); +#endif /* Put the contents on ground at the hero's feet. */ while ((otmp = xlock.box->cobj) != 0) { @@ -201,7 +262,10 @@ if (costly) loss += stolen_value(xlock.box, u.ux, u.uy, (boolean)shkp->mpeaceful, TRUE); +/*JP if(loss) You("owe %ld %s for objects destroyed.", loss, currency(loss)); +*/ + if(loss) You("器物破損で%ld%sの借りをつくった.", loss, currency(loss)); delobj(xlock.box); } exercise((xlock.picktyp) ? A_DEX : A_STR, TRUE); @@ -236,30 +300,51 @@ /* check whether we're resuming an interrupted previous attempt */ if (xlock.usedtime && picktyp == xlock.picktyp) { +/*JP static char no_longer[] = "Unfortunately, you can no longer %s %s."; +*/ + static char no_longer[] = "ざんねんながら,あなたは%s%s"; if (nohands(youmonst.data)) { +/*JP const char *what = (picktyp == LOCK_PICK) ? "pick" : "key"; +*/ + const char *what = (picktyp == LOCK_PICK) ? "鍵開け器具" : "鍵"; #ifdef TOURIST +/*JP if (picktyp == CREDIT_CARD) what = "card"; +*/ + if (picktyp == CREDIT_CARD) what = "カード"; #endif +/*JP pline(no_longer, "hold the", what); +*/ + pline(no_longer, what, "をつかめない"); reset_pick(); return 0; } else if (xlock.box && !can_reach_floor()) { +/*JP pline(no_longer, "reach the", "lock"); +*/ + pline(no_longer, "鍵に", "届かない"); reset_pick(); return 0; } else { const char *action = lock_action(); +/*JP You("resume your attempt at %s.", action); +*/ + pline("%sのを再開した.", action); set_occupation(picklock, action, 0); return(1); } } if(nohands(youmonst.data)) { +/*JP You_cant("hold %s -- you have no hands!", doname(pick)); +*/ + You("%sをつかむことができない!手がないんだもの!", xname(pick)); return(0); } @@ -273,22 +358,36 @@ } ch = 0; /* lint suppression */ +/*JP if(!get_adjacent_loc((char *)0, "Invalid location!", u.ux, u.uy, &cc)) return 0; +*/ + if(!get_adjacent_loc((char *)0, "位置がおかしい!", u.ux, u.uy, &cc)) return 0; if (cc.x == u.ux && cc.y == u.uy) { /* pick lock on a container */ const char *verb; boolean it; int count; if (u.dz < 0) { +#if 0 /*JP*/ There("isn't any sort of lock up %s.", Levitation ? "here" : "there"); +#else + pline("%sには鍵をかけるような物はない.", + Levitation ? "ここ" : "下方"); +#endif return 0; } else if (is_lava(u.ux, u.uy)) { +/*JP pline("Doing that would probably melt your %s.", +*/ + pline("そんなことをしたら%sが溶けてしまう.", xname(pick)); return 0; } else if (is_pool(u.ux, u.uy) && !Underwater) { +/*JP pline_The("water has no lock."); +*/ + pline("水に錠前はない."); return 0; } @@ -298,31 +397,54 @@ if (Is_box(otmp)) { ++count; if (!can_reach_floor()) { +/*JP You_cant("reach %s from up here.", the(xname(otmp))); +*/ + You("ここにある%sに届かない.", the(xname(otmp))); return 0; } it = 0; +#if 0 /*JP*/ if (otmp->obroken) verb = "fix"; else if (!otmp->olocked) verb = "lock", it = 1; else if (picktyp != LOCK_PICK) verb = "unlock", it = 1; else verb = "pick"; +#else + if (otmp->obroken) verb = "修復する"; + else if (!otmp->olocked) verb = "鍵をかける", it = 1; + else if (picktyp != LOCK_PICK) verb = "鍵をはずす", it = 1; + else verb = "こじあける"; +#endif /*JP*/ +#if 0 /*JP*/ Sprintf(qbuf, "There is %s here, %s %s?", safe_qbuf("", sizeof("There is here, unlock its lock?"), doname(otmp), an(simple_typename(otmp->otyp)), "a box"), verb, it ? "it" : "its lock"); +#else + Sprintf(qbuf, "ここには%sがある.%s?", + safe_qbuf("", sizeof("ここにはがある.鍵をはずしますか?"), + doname(otmp), an(simple_typename(otmp->otyp)), "箱"), + verb); +#endif c = ynq(qbuf); if(c == 'q') return(0); if(c == 'n') continue; if (otmp->obroken) { +/*JP You_cant("fix its broken lock with %s.", doname(pick)); +*/ + You("壊れた鍵を%sで修復できない.", doname(pick)); return 0; } #ifdef TOURIST else if (picktyp == CREDIT_CARD && !otmp->olocked) { /* credit cards are only good for unlocking */ +/*JP You_cant("do that with %s.", doname(pick)); +*/ + pline("%sじゃそんなことはできない.", doname(pick)); return 0; } #endif @@ -349,14 +471,20 @@ } if (c != 'y') { if (!count) +/*JP There("doesn't seem to be any sort of lock here."); +*/ + pline("ここには鍵をかけるような物はないようだ."); return(0); /* decided against all boxes */ } } else { /* pick the lock in a door */ struct monst *mtmp; if (u.utrap && u.utraptype == TT_PIT) { +/*JP You_cant("reach over the edge of the pit."); +*/ + pline("落し穴の中から届かない."); return(0); } @@ -367,42 +495,75 @@ #ifdef TOURIST if (picktyp == CREDIT_CARD && (mtmp->isshk || mtmp->data == &mons[PM_ORACLE])) +/*JP verbalize("No checks, no credit, no problem."); +*/ + verbalize("いつもニコニコ現金払い."); else #endif +/*JP pline("I don't think %s would appreciate that.", mon_nam(mtmp)); +*/ + pline("%sがその価値を認めるとは思えない.", mon_nam(mtmp)); return(0); } if(!IS_DOOR(door->typ)) { if (is_drawbridge_wall(cc.x,cc.y) >= 0) +#if 0 /*JP*/ You("%s no lock on the drawbridge.", Blind ? "feel" : "see"); +#else + pline("跳ね橋には鍵がない%s.", + Blind ? "ようだ" : "ように見える"); +#endif else +#if 0 /*JP*/ You("%s no door there.", Blind ? "feel" : "see"); +#else + pline("ここには扉がない%s.", + Blind ? "ようだ" : "ように見える"); +#endif return(0); } switch (door->doormask) { case D_NODOOR: +/*JP pline("This doorway has no door."); +*/ + pline("出入口には扉がない."); return(0); case D_ISOPEN: +/*JP You("cannot lock an open door."); +*/ + pline("開いてる扉に鍵をかけれない."); return(0); case D_BROKEN: +/*JP pline("This door is broken."); +*/ + pline("扉は壊れている."); return(0); default: #ifdef TOURIST /* credit cards are only good for unlocking */ if(picktyp == CREDIT_CARD && !(door->doormask & D_LOCKED)) { +/*JP You_cant("lock a door with a credit card."); +*/ + You("クレジットカードで鍵をかけることはできない."); return(0); } #endif +#if 0 /*JP*/ Sprintf(qbuf,"%sock it?", (door->doormask & D_LOCKED) ? "Unl" : "L" ); +#else + Sprintf(qbuf,"%sますか?", + (door->doormask & D_LOCKED) ? "はずし" : "かけ" ); +#endif c = yn(qbuf); if(c == 'n') return(0); @@ -450,15 +611,26 @@ || uwep->otyp == RUBBER_HOSE #endif ) { +#if 0 /*JP*/ You_cant("force anything without a %sweapon.", (uwep) ? "proper " : ""); +#else + pline("%s武器なしで鍵をこじあけることはできない.", + (uwep) ? "適切な" : ""); +#endif return(0); } picktyp = is_blade(uwep); if(xlock.usedtime && xlock.box && picktyp == xlock.picktyp) { +/*JP You("resume your attempt to force the lock."); +*/ + pline("鍵をこじあけるのを再開した."); +/*JP set_occupation(forcelock, "forcing the lock", 0); +*/ + set_occupation(forcelock, "鍵をこじあける", 0); return(1); } @@ -467,23 +639,41 @@ for(otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp->nexthere) if(Is_box(otmp)) { if (otmp->obroken || !otmp->olocked) { +#if 0 /*JP*/ There("is %s here, but its lock is already %s.", doname(otmp), otmp->obroken ? "broken" : "unlocked"); +#else + pline("ここには%sがある,しかしその鍵はもう%s.", + doname(otmp), otmp->obroken ? "壊れている" : "はずされている"); +#endif continue; } +#if 0 /*JP*/ Sprintf(qbuf,"There is %s here, force its lock?", safe_qbuf("", sizeof("There is here, force its lock?"), doname(otmp), an(simple_typename(otmp->otyp)), "a box")); +#else + Sprintf(qbuf,"ここには%sがある,鍵をこじあけますか?", + safe_qbuf("", sizeof("ここにはがある,鍵をこじあけますか?"), + doname(otmp), an(simple_typename(otmp->otyp)), + "箱")); +#endif c = ynq(qbuf); if(c == 'q') return(0); if(c == 'n') continue; if(picktyp) +/*JP You("force your %s into a crack and pry.", xname(uwep)); +*/ + You("%sを鍵穴に入れてガチャガチャした.",xname(uwep)); else +/*JP You("start bashing it with your %s.", xname(uwep)); +*/ + pline("%sで殴りつけた.", xname(uwep)); xlock.box = otmp; xlock.chance = objects[uwep->otyp].oc_wldam * 2; xlock.picktyp = picktyp; @@ -491,8 +681,14 @@ break; } +/*JP if(xlock.box) set_occupation(forcelock, "forcing the lock", 0); +*/ + if(xlock.box) set_occupation(forcelock, "鍵をこじあける", 0); +/*JP else You("decide not to force the issue."); +*/ + else pline("それは無意味な行為だ."); return(1); } @@ -504,12 +700,18 @@ struct monst *mtmp; if (nohands(youmonst.data)) { +/*JP You_cant("open anything -- you have no hands!"); +*/ + You("何も開けることができない!手がないんだもの!"); return 0; } if (u.utrap && u.utraptype == TT_PIT) { +/*JP You_cant("reach over the edge of the pit."); +*/ + pline("落し穴の中から届かない."); return 0; } @@ -531,15 +733,24 @@ if(!IS_DOOR(door->typ)) { if (is_db_wall(cc.x,cc.y)) { +/*JP There("is no obvious way to open the drawbridge."); +*/ + pline("跳ね橋を降ろす明白な方法はない."); return(0); } +#if 0 /*JP*/ You("%s no door there.", Blind ? "feel" : "see"); +#else + pline("そこには扉はない%s.", + Blind ? "ようだ" : "ように見える"); +#endif return(0); } if (!(door->doormask & D_CLOSED)) { +#if 0 /*JP*/ const char *mesg; switch (door->doormask) { @@ -549,20 +760,45 @@ default: mesg = " is locked"; break; } pline("This door%s.", mesg); +#else + switch(door->doormask) { + case D_BROKEN: + pline("扉は壊れている."); + break; + case D_NODOOR: + pline("出入口には扉がない."); + break; + case D_ISOPEN: + pline("扉はもう開いている."); + break; + default: + pline("扉には鍵が掛かっている."); + break; + } +#endif if (Blind) feel_location(cc.x,cc.y); return(0); } if(verysmall(youmonst.data)) { +/*JP pline("You're too small to pull the door open."); +*/ + You("小さすぎて扉を開けられない."); return(0); } /* door is known to be CLOSED */ if (rnl(20) < (ACURRSTR+ACURR(A_DEX)+ACURR(A_CON))/3) { +/*JP pline_The("door opens."); +*/ + pline("扉は開いた."); if(door->doormask & D_TRAPPED) { +/*JP b_trapped("door", FINGER); +*/ + b_trapped("扉", FINGER); door->doormask = D_NODOOR; if (*in_rooms(cc.x, cc.y, SHOPBASE)) add_damage(cc.x, cc.y, 0L); } else @@ -574,7 +810,10 @@ unblock_point(cc.x,cc.y); /* vision: new see through there */ } else { exercise(A_STR, TRUE); +/*JP pline_The("door resists!"); +*/ + pline("なかなか開かない!"); } return(1); @@ -589,14 +828,22 @@ if(mtmp && mtmp->m_ap_type != M_AP_FURNITURE) { if (mtmp->m_ap_type == M_AP_OBJECT) goto objhere; +#if 0 /*JP*/ pline("%s stands in the way!", !canspotmon(mtmp) ? "Some creature" : Monnam(mtmp)); +#else + pline("%sが立ちふさがっている.", !canspotmon(mtmp) ? + "何者か" : Monnam(mtmp)); +#endif if (!canspotmon(mtmp)) map_invisible(mtmp->mx, mtmp->my); return(TRUE); } if (OBJ_AT(x, y)) { +/*JP objhere: pline("%s's in the way.", Something); +*/ +objhere: pline("何かが出入口にある."); return(TRUE); } return(FALSE); @@ -610,12 +857,18 @@ struct monst *mtmp; if (nohands(youmonst.data)) { +/*JP You_cant("close anything -- you have no hands!"); +*/ + You("閉めることができない!手がないんだもの!"); return 0; } if (u.utrap && u.utraptype == TT_PIT) { +/*JP You_cant("reach over the edge of the pit."); +*/ + pline("落し穴の中から届かない."); return 0; } @@ -624,7 +877,10 @@ x = u.ux + u.dx; y = u.uy + u.dy; if((x == u.ux) && (y == u.uy)) { +/*JP You("are in the way!"); +*/ + pline("あなたが出入口にいるので閉まらない."); return(1); } @@ -642,27 +898,44 @@ if(!IS_DOOR(door->typ)) { if (door->typ == DRAWBRIDGE_DOWN) +/*JP There("is no obvious way to close the drawbridge."); +*/ + pline("跳ね橋を上げる明白な方法はない."); else +#if 0 /*JP*/ You("%s no door there.", Blind ? "feel" : "see"); +#else + pline("そこに扉はない%s.", + Blind ? "ようだ" : "ように見える"); +#endif return(0); } if(door->doormask == D_NODOOR) { +/*JP pline("This doorway has no door."); +*/ + pline("扉は壊れている."); return(0); } if(obstructed(x, y)) return(0); if(door->doormask == D_BROKEN) { +/*JP pline("This door is broken."); +*/ + pline("扉は壊れている."); return(0); } if(door->doormask & (D_CLOSED | D_LOCKED)) { +/*JP pline("This door is already closed."); +*/ + pline("扉はもう閉じている."); return(0); } @@ -672,7 +945,10 @@ && !u.usteed #endif ) { +/*JP pline("You're too small to push the door closed."); +*/ + You("小さすぎて扉を閉められない."); return(0); } if ( @@ -680,7 +956,10 @@ u.usteed || #endif rn2(25) < (ACURRSTR+ACURR(A_DEX)+ACURR(A_CON))/3) { +/*JP pline_The("door closes."); +*/ + pline("扉は閉じた."); door->doormask = D_CLOSED; if (Blind) feel_location(x,y); /* the hero knows she closed it */ @@ -690,7 +969,10 @@ } else { exercise(A_STR, TRUE); +/*JP pline_The("door resists!"); +*/ + pline("なかなか閉まらない!"); } } @@ -707,7 +989,10 @@ case WAN_LOCKING: case SPE_WIZARD_LOCK: if (!obj->olocked) { /* lock it; fix if broken */ +/*JP pline("Klunk!"); +*/ + pline("カチ!"); obj->olocked = 1; obj->obroken = 0; res = 1; @@ -716,7 +1001,10 @@ case WAN_OPENING: case SPE_KNOCK: if (obj->olocked) { /* unlock; couldn't be broken */ +/*JP pline("Klick!"); +*/ + pline("コンコン!"); obj->olocked = 0; res = 1; } else /* silently fix if broken */ @@ -742,8 +1030,13 @@ boolean res = TRUE; int loudness = 0; const char *msg = (const char *)0; +#if 0 /*JP*/ const char *dustcloud = "A cloud of dust"; const char *quickly_dissipates = "quickly dissipates"; +#else + const char *dustcloud = "ほこり"; + const char *quickly_dissipates = "あっと言うまに飛び散った"; +#endif if (door->typ == SDOOR) { switch (otmp->otyp) { @@ -754,7 +1047,10 @@ door->typ = DOOR; door->doormask = D_CLOSED | (door->doormask & D_TRAPPED); newsym(x,y); +/*JP if (cansee(x,y)) pline("A door appears in the wall!"); +*/ + if (cansee(x,y)) pline("壁から扉が現れた!"); if (otmp->otyp == WAN_OPENING || otmp->otyp == SPE_KNOCK) return TRUE; break; /* striking: continue door handling below */ @@ -772,17 +1068,29 @@ if (Is_rogue_level(&u.uz)) { boolean vis = cansee(x,y); /* Can't have real locking in Rogue, so just hide doorway */ +/*JP if (vis) pline("%s springs up in the older, more primitive doorway.", +*/ + if (vis) pline("古くさい,原始的な出入口に%sが立ちこめた.", dustcloud); else +/*JP You_hear("a swoosh."); +*/ + You_hear("シューッという音を聞いた."); if (obstructed(x,y)) { +/*JP if (vis) pline_The("cloud %s.",quickly_dissipates); +*/ + if (vis) pline("ほこりは%s.",quickly_dissipates); return FALSE; } block_point(x, y); door->typ = SDOOR; +/*JP if (vis) pline_The("doorway vanishes!"); +*/ + if (vis) pline("出入口は消えた!"); newsym(x,y); return TRUE; } @@ -793,24 +1101,39 @@ if (t_at(x,y)) { /* maketrap() clears doormask, so it should be NODOOR */ pline( +/*JP "%s springs up in the doorway, but %s.", +*/ + "%sが出入口に立ちこめた,しかし%s", dustcloud, quickly_dissipates); return FALSE; } switch (door->doormask & ~D_TRAPPED) { case D_CLOSED: +/*JP msg = "The door locks!"; +*/ + msg = "扉に鍵がかかった!"; break; case D_ISOPEN: +/*JP msg = "The door swings shut, and locks!"; +*/ + msg = "扉は勢いよく閉まり,鍵がかかった!"; break; case D_BROKEN: +/*JP msg = "The broken door reassembles and locks!"; +*/ + msg = "壊れた扉が集まって,鍵がかかった!"; break; case D_NODOOR: msg = +/*JP "A cloud of dust springs up and assembles itself into a door!"; +*/ + "ほこりがたちこめ,集まって扉になった!"; break; default: res = FALSE; @@ -823,7 +1146,10 @@ case WAN_OPENING: case SPE_KNOCK: if (door->doormask & D_LOCKED) { +/*JP msg = "The door unlocks!"; +*/ + msg = "扉の鍵ははずれた!"; door->doormask = D_CLOSED | (door->doormask & D_TRAPPED); } else res = FALSE; break; @@ -835,9 +1161,15 @@ (void) mb_trapped(m_at(x,y)); else if (flags.verbose) { if (cansee(x,y)) +/*JP pline("KABOOM!! You see a door explode."); +*/ + pline("ちゅどーん!扉が爆発した."); else if (flags.soundok) +/*JP You_hear("a distant explosion."); +*/ + You_hear("遠くの爆発音を聞いた."); } door->doormask = D_NODOOR; unblock_point(x,y); @@ -848,9 +1180,15 @@ door->doormask = D_BROKEN; if (flags.verbose) { if (cansee(x,y)) +/*JP pline_The("door crashes open!"); +*/ + pline("扉は壊れ開いた!"); else if (flags.soundok) +/*JP You_hear("a crashing sound."); +*/ + You_hear("何かが壊れる音を聞いた."); } unblock_point(x,y); newsym(x,y); @@ -886,7 +1224,13 @@ long save_Blinded; if (otmp->oclass == POTION_CLASS) { +/*JP You("%s %s shatter!", Blind ? "hear" : "see", an(bottlename())); +*/ + if (Blind) + You_hear("%sが割れる音を聞いた!", bottlename()); + else + pline("%sが割れた!", bottlename()); if (!breathless(youmonst.data) || haseyes(youmonst.data)) potionbreathe(otmp); return; @@ -898,22 +1242,46 @@ thing = singular(otmp, xname); Blinded = save_Blinded; switch (objects[otmp->otyp].oc_material) { +/*JP case PAPER: disposition = "is torn to shreds"; +*/ + case PAPER: disposition = "は寸断された"; break; +/*JP case WAX: disposition = "is crushed"; +*/ + case WAX: disposition = "を床にぶちまけた"; break; +/*JP case VEGGY: disposition = "is pulped"; +*/ + case VEGGY: disposition = "はどろどろになった"; break; +/*JP case FLESH: disposition = "is mashed"; +*/ + case FLESH: disposition = "はどろどろになった"; break; +/*JP case GLASS: disposition = "shatters"; +*/ + case GLASS: disposition = "は割れた"; break; +/*JP case WOOD: disposition = "splinters to fragments"; +*/ + case WOOD: disposition = "はかけらになった"; break; +/*JP default: disposition = "is destroyed"; +*/ + default: disposition = "は壊れた"; break; } +/*JP pline("%s %s!", An(thing), disposition); +*/ + pline("%s%s!", thing, disposition); } #endif /* OVLB */ diff -aurbN -xCVS -xXTAGS nethack/src/mail.c jnethack/src/mail.c --- nethack/src/mail.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/mail.c 2003-12-25 01:06:54.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #ifdef MAIL @@ -257,9 +264,15 @@ /* Let the mail daemon have a larger vocabulary. */ static NEARDATA const char *mail_text[] = { +#if 0 /*JP*/ "Gangway!", "Look out!", "Pardon me!" +#else + "どいたどいた!", + "気をつけろ!", + "じゃまするよ!" +#endif }; #define md_exclamations() (mail_text[rn2(3)]) @@ -319,7 +332,10 @@ if ((mon = m_at(fx,fy)) != 0) /* save monster at this position */ verbalize(md_exclamations()); else if (fx == u.ux && fy == u.uy) +/*JP verbalize("Excuse me."); +*/ + verbalize("ちょっとしつれい."); place_monster(md,fx,fy); /* put md down */ newsym(fx,fy); /* see it */ @@ -344,7 +360,10 @@ if ((mon = m_at(fx, fy)) != 0) { place_monster(md, fx, fy); /* display md with text below */ newsym(fx, fy); +/*JP verbalize("This place's too crowded. I'm outta here."); +*/ + verbalize("ここは混みすぎ.ここで待ってるよ."); if ((mon->mx != fx) || (mon->my != fy)) /* put mon back */ place_worm_seg(mon, fx, fy); @@ -382,12 +401,18 @@ if (!md_rush(md, stop.x, stop.y)) goto go_back; message_seen = TRUE; +/*JP verbalize("%s, %s! %s.", Hello(md), plname, info->display_txt); +*/ + verbalize("%s,%s.", Hello(md, TRUE), info->display_txt); if (info->message_typ) { struct obj *obj = mksobj(SCR_MAIL, FALSE, FALSE); if (distu(md->mx,md->my) > 2) +/*JP verbalize("Catch!"); +*/ + verbalize("ほらよ!"); display_nhwindow(WIN_MESSAGE, FALSE); if (info->object_nam) { obj = oname(obj, info->object_nam); @@ -400,7 +425,10 @@ /* Note: renaming object will discard the hidden command. */ } } +/*JP obj = hold_another_object(obj, "Oops!", +*/ + obj = hold_another_object(obj, "おっと!", (const char *)0, (const char *)0); } @@ -411,7 +439,10 @@ /* deliver some classes of messages even if no daemon ever shows up */ give_up: if (!message_seen && info->message_typ == MSG_OTHER) +/*JP pline("Hark! \"%s.\"", info->display_txt); +*/ + pline("「%s.」と言うことだ!", info->display_txt); } # if !defined(UNIX) && !defined(VMS) && !defined(LAN_MAIL) @@ -428,7 +459,10 @@ } if (--mustgetmail <= 0) { static struct mail_info +/*JP deliver = {MSG_MAIL,"I have some mail for you",0,0}; +*/ + deliver = {MSG_MAIL,"メイルを持ってきたよ",0,0}; newmail(&deliver); mustgetmail = -1; } @@ -440,20 +474,35 @@ struct obj *otmp; { static char *junk[] = { +#if 0 /*JP*/ "Please disregard previous letter.", "Welcome to NetHack.", +#else + "前のメールは忘れてください.", + "NetHackへようこそ!", +#endif #ifdef AMIGA "Only Amiga makes it possible.", "CATS have all the answers.", #endif +#if 0 /*JP*/ "Report bugs to .", "Invitation: Visit the NetHack web site at http://www.nethack.org!" +#endif }; if (Blind) { +#if 0 /*JP*/ pline("Unfortunately you cannot see what it says."); +#else + pline("不幸にも何と書いてあるのか見ることができない."); +#endif } else +#if 0 /*JP*/ pline("It reads: \"%s\"", junk[rn2(SIZE(junk))]); +#else + pline("それを読んだ:\"%s\"", junk[rn2(SIZE(junk))]); +#endif } @@ -483,10 +532,16 @@ if (nmstat.st_size) { static struct mail_info deliver = { # ifndef NO_MAILREADER +/*JP MSG_MAIL, "I have some mail for you", +*/ + MSG_MAIL, "メイルを持ってきたよ", # else /* suppress creation and delivery of scroll of mail */ +/*JP MSG_OTHER, "You have some mail in the outside world", +*/ + MSG_OTHER, "外の世界からのメールだ", # endif 0, 0 }; diff -aurbN -xCVS -xXTAGS nethack/src/makemon.c jnethack/src/makemon.c --- nethack/src/makemon.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/makemon.c 2003-12-10 03:31:34.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "epri.h" #include "emin.h" @@ -1455,9 +1462,15 @@ ptr = &mons[newtype]; if (mvitals[newtype].mvflags & G_GENOD) { /* allow G_EXTINCT */ if (sensemon(mtmp)) +#if 0 /*JP*/ pline("As %s grows up into %s, %s %s!", mon_nam(mtmp), an(ptr->mname), mhe(mtmp), nonliving(ptr) ? "expires" : "dies"); +#else + pline("%sが成長して%sになると%sしまった!", mon_nam(mtmp), + jtrns_mon_gen(ptr->mname, mtmp->female), + nonliving(ptr) ? "消えて" : "死んで"); +#endif set_mon_data(mtmp, ptr, -1); /* keep mvitals[] accurate */ mondied(mtmp); return (struct permonst *)0; diff -aurbN -xCVS -xXTAGS nethack/src/mcastu.c jnethack/src/mcastu.c --- nethack/src/mcastu.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/mcastu.c 2004-07-29 01:04:23.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" /* monster mage spells */ @@ -53,21 +60,39 @@ const char *point_msg; /* spellcasting monsters are impolite */ if (undirected) +/*JP point_msg = "all around, then curses"; +*/ + point_msg = "あたり一面を"; else if ((Invis && !perceives(mtmp->data) && (mtmp->mux != u.ux || mtmp->muy != u.uy)) || (youmonst.m_ap_type == M_AP_OBJECT && youmonst.mappearance == STRANGE_OBJECT) || u.uundetected) +/*JP point_msg = "and curses in your general direction"; +*/ + point_msg = "あなたのいるあたりを"; else if (Displaced && (mtmp->mux != u.ux || mtmp->muy != u.uy)) +/*JP point_msg = "and curses at your displaced image"; +*/ + point_msg = "あなたの幻影を"; else +/*JP point_msg = "at you, then curses"; +*/ + point_msg = "あなたを"; +/*JP pline("%s points %s.", Monnam(mtmp), point_msg); +*/ + pline("%sは%s指差し,呪いをかけた.", Monnam(mtmp), point_msg); } else if ((!(moves % 4) || !rn2(4))) { +/*JP if (flags.soundok) Norep("You hear a mumbled curse."); +*/ + if (flags.soundok) Norep("呪いの言葉をつぶやく声を聞いた."); } } @@ -221,20 +246,31 @@ penalizing mspec_used. */ if (!foundyou && thinks_it_foundyou && !is_undirected_spell(mattk->adtyp, spellnum)) { +#if 0 /*JP*/ pline("%s casts a spell at %s!", canseemon(mtmp) ? Monnam(mtmp) : "Something", levl[mtmp->mux][mtmp->muy].typ == WATER ? "empty water" : "thin air"); +#else + pline("%sは何もない%sに魔法をかけた!", + canseemon(mtmp) ? Monnam(mtmp) : "何者か", + levl[mtmp->mux][mtmp->muy].typ == WATER + ? "水中" : "空間"); +#endif return(0); } nomul(0); if(rn2(ml*10) < (mtmp->mconf ? 100 : 20)) { /* fumbled attack */ if (canseemon(mtmp) && flags.soundok) +/*JP pline_The("air crackles around %s.", mon_nam(mtmp)); +*/ + pline("%sの回りの空気はピリピリしている.", mon_nam(mtmp)); return(0); } if (canspotmon(mtmp) || !is_undirected_spell(mattk->adtyp, spellnum)) { +#if 0 /*JP*/ pline("%s casts a spell%s!", canspotmon(mtmp) ? Monnam(mtmp) : "Something", is_undirected_spell(mattk->adtyp, spellnum) ? "" : @@ -244,6 +280,21 @@ (Displaced && (mtmp->mux != u.ux || mtmp->muy != u.uy)) ? " at your displaced image" : " at you"); +#else + char *who = (canspotmon(mtmp) ? Monnam(mtmp) : "何者か"); + if(is_undirected_spell(mattk->adtyp, spellnum)){ + pline("%sは呪文を唱えた!", who); + } else { + pline("%sはあなた%sに魔法をかけた!", + who, + (Invisible && !perceives(mtmp->data) && + (mtmp->mux != u.ux || mtmp->muy != u.uy)) ? + "のすぐそば" : + (Displaced && (mtmp->mux != u.ux || mtmp->muy != u.uy)) ? + "の幻影" : + ""); + } +#endif } /* @@ -268,27 +319,45 @@ switch (mattk->adtyp) { case AD_FIRE: +/*JP pline("You're enveloped in flames."); +*/ + You("炎につつまれた."); if(Fire_resistance) { shieldeff(u.ux, u.uy); +/*JP pline("But you resist the effects."); +*/ + pline("しかし,あなたは影響を受けない."); dmg = 0; } burn_away_slime(); break; case AD_COLD: +/*JP pline("You're covered in frost."); +*/ + You("氷に覆われた."); if(Cold_resistance) { shieldeff(u.ux, u.uy); +/*JP pline("But you resist the effects."); +*/ + pline("しかし,あなたは影響を受けない."); dmg = 0; } break; case AD_MAGM: +/*JP You("are hit by a shower of missiles!"); +*/ + You("魔法の矢をくらった!"); if(Antimagic) { shieldeff(u.ux, u.uy); +/*JP pline_The("missiles bounce off!"); +*/ + pline("魔法の矢は反射した!"); dmg = 0; } else dmg = d((int)mtmp->m_lev/2 + 1,6); break; @@ -330,26 +399,44 @@ switch (spellnum) { case MGC_DEATH_TOUCH: +/*JP pline("Oh no, %s's using the touch of death!", mhe(mtmp)); +*/ + pline("なんてこったい,%sは死の宣告を使っている!", mhe(mtmp)); if (nonliving(youmonst.data) || is_demon(youmonst.data)) { +/*JP You("seem no deader than before."); +*/ + You("これ以上死ねないようだ."); } else if (!Antimagic && rn2(mtmp->m_lev) > 12) { if (Hallucination) { +/*JP You("have an out of body experience."); +*/ + You("幽体離脱を体験した."); } else { killer_format = KILLED_BY_AN; +/*JP killer = "touch of death"; +*/ + killer = "死の宣告で"; done(DIED); } } else { if (Antimagic) shieldeff(u.ux, u.uy); +/*JP pline("Lucky for you, it didn't work!"); +*/ + pline("運のよいことになんともなかった!"); } dmg = 0; break; case MGC_CLONE_WIZ: if (mtmp->iswiz && flags.no_of_wizards == 1) { +/*JP pline("Double Trouble..."); +*/ + pline("二重苦だ..."); clonewiz(); dmg = 0; } else @@ -361,49 +448,83 @@ count = nasty(mtmp); /* summon something nasty */ if (mtmp->iswiz) +/*JP verbalize("Destroy the thief, my pet%s!", plur(count)); +*/ + verbalize("盗賊を殺せ!我が下僕よ!"); else { +#if 0 /*JP*/ const char *mappear = (count == 1) ? "A monster appears" : "Monsters appear"; +#else + const char *mappear = "怪物が%s現れた!"; +#endif /* messages not quite right if plural monsters created but only a single monster is seen */ if (Invisible && !perceives(mtmp->data) && (mtmp->mux != u.ux || mtmp->muy != u.uy)) +/*JP pline("%s around a spot near you!", mappear); +*/ + pline(mappear, "あなたのすぐそばに"); else if (Displaced && (mtmp->mux != u.ux || mtmp->muy != u.uy)) +/*JP pline("%s around your displaced image!", mappear); +*/ + pline(mappear, "あなたの幻影のすぐそばに"); else +/*JP pline("%s from nowhere!", mappear); +*/ + pline(mappear, "どこからともなく"); } dmg = 0; break; } case MGC_AGGRAVATION: +/*JP You_feel("that monsters are aware of your presence."); +*/ + You_feel("怪物たちがあなたの存在に気付いたような気がした."); aggravate(); dmg = 0; break; case MGC_CURSE_ITEMS: +/*JP You_feel("as if you need some help."); +*/ + You_feel("助けが必要な気がした."); rndcurse(); dmg = 0; break; case MGC_DESTRY_ARMR: if (Antimagic) { shieldeff(u.ux, u.uy); +/*JP pline("A field of force surrounds you!"); +*/ + pline("不思議な力があなたをとりまいた!"); } else if (!destroy_arm(some_armor(&youmonst))) { +/*JP Your("skin itches."); +*/ + You("ムズムズした."); } dmg = 0; break; case MGC_WEAKEN_YOU: /* drain strength */ if (Antimagic) { shieldeff(u.ux, u.uy); +/*JP You_feel("momentarily weakened."); +*/ + You_feel("一瞬弱くなったような気がした."); } else { +/*JP You("suddenly feel weaker!"); +*/ + You("突然弱くなったような気がした."); dmg = mtmp->m_lev - 6; if (Half_spell_damage) dmg = (dmg + 1) / 2; losestr(rnd(dmg)); @@ -415,8 +536,13 @@ case MGC_DISAPPEAR: /* makes self invisible */ if (!mtmp->minvis && !mtmp->invis_blkd) { if (canseemon(mtmp)) +#if 0 /*JP*/ pline("%s suddenly %s!", Monnam(mtmp), !See_invisible ? "disappears" : "becomes transparent"); +#else + pline("%sは突然%s!", Monnam(mtmp), + !See_invisible ? "消えた" : "透明になった"); +#endif mon_set_minvis(mtmp); dmg = 0; } else @@ -426,10 +552,16 @@ if (Antimagic || Free_action) { shieldeff(u.ux, u.uy); if (!Stunned) +/*JP You_feel("momentarily disoriented."); +*/ + You("一瞬方向感覚を失った."); make_stunned(1L, FALSE); } else { +/*JP You(Stunned ? "struggle to keep your balance." : "reel..."); +*/ + You(Stunned ? "バランスを取ろうともがいた." : "よろめいた..."); dmg = d(ACURR(A_DEX) < 12 ? 6 : 4, 4); if (Half_spell_damage) dmg = (dmg + 1) / 2; make_stunned(HStun + dmg, FALSE); @@ -443,7 +575,10 @@ case MGC_CURE_SELF: if (mtmp->mhp < mtmp->mhpmax) { if (canseemon(mtmp)) +/*JP pline("%s looks better.", Monnam(mtmp)); +*/ + pline("%sは気分がよくなったようだ.", Monnam(mtmp)); /* note: player healing does 6d4; this used to do 1d8 */ if ((mtmp->mhp += d(3,6)) > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax; @@ -458,13 +593,25 @@ dmg = (dmg + 1) / 2; } if (dmg <= 5) +/*JP You("get a slight %sache.", body_part(HEAD)); +*/ + You("ちょっと%s痛がした.",body_part(HEAD)); else if (dmg <= 10) +/*JP Your("brain is on fire!"); +*/ + You("怒りにつつまれた!"); else if (dmg <= 20) +/*JP Your("%s suddenly aches painfully!", body_part(HEAD)); +*/ + You("突然%s痛におそわれた!", body_part(HEAD)); else +/*JP Your("%s suddenly aches very painfully!", body_part(HEAD)); +*/ + You("突然激しい%s痛におそわれた!", body_part(HEAD)); break; default: impossible("mcastu: invalid magic spell (%d)", spellnum); @@ -490,12 +637,18 @@ switch (spellnum) { case CLC_GEYSER: /* this is physical damage, not magical damage */ +/*JP pline("A sudden geyser slams into you from nowhere!"); +*/ + pline("濁流がどこからともなく現れてあなたを打ちつけた!"); dmg = d(8, 6); if (Half_physical_damage) dmg = (dmg + 1) / 2; break; case CLC_FIRE_PILLAR: +/*JP pline("A pillar of fire strikes all around you!"); +*/ + pline("あなたの周りに火柱が立った!"); if (Fire_resistance) { shieldeff(u.ux, u.uy); dmg = 0; @@ -513,8 +666,14 @@ { boolean reflects; +/*JP pline("A bolt of lightning strikes down at you from above!"); +*/ + pline("あなたの真上から稲妻が降り注いだ!"); +/*JP reflects = ureflects("It bounces off your %s%s.", ""); +*/ + reflects = ureflects("それはあなたの%s%sで跳ね返った.", ""); if (reflects || Shock_resistance) { shieldeff(u.ux, u.uy); dmg = 0; @@ -528,7 +687,10 @@ break; } case CLC_CURSE_ITEMS: +/*JP You_feel("as if you need some help."); +*/ + You_feel("助けが必要な気がした."); rndcurse(); dmg = 0; break; @@ -565,30 +727,54 @@ * -- message assumes plural monsters seen */ if (!success) +#if 0 /*JP*/ pline("%s casts at a clump of sticks, but nothing happens.", +#else + pline("%sは棒切れに魔法をかけたが,なにもおこらなかった.", +#endif Monnam(mtmp)); else if (let == S_SNAKE) +#if 0 /*JP*/ pline("%s transforms a clump of sticks into snakes!", +#else + pline("%sは棒切れをヘビに変えた!", +#endif Monnam(mtmp)); else if (Invisible && !perceives(mtmp->data) && (mtmp->mux != u.ux || mtmp->muy != u.uy)) +#if 0 /*JP*/ pline("%s summons insects around a spot near you!", +#else + pline("%sは虫をあなたのすぐそばに召喚した!", +#endif Monnam(mtmp)); else if (Displaced && (mtmp->mux != u.ux || mtmp->muy != u.uy)) +#if 0 /*JP*/ pline("%s summons insects around your displaced image!", +#else + pline("%sは虫をあなたの幻影の周りに召喚した!", +#endif Monnam(mtmp)); else +#if 0 /*JP*/ pline("%s summons insects!", Monnam(mtmp)); +#else + pline("%sは虫を召喚した!", Monnam(mtmp)); +#endif dmg = 0; break; } case CLC_BLIND_YOU: /* note: resists_blnd() doesn't apply here */ if (!Blinded) { +#if 0 /*JP*/ int num_eyes = eyecount(youmonst.data); pline("Scales cover your %s!", (num_eyes == 1) ? body_part(EYE) : makeplural(body_part(EYE))); +#else + pline("鱗があなたの%sを覆った!", body_part(EYE)); +#endif make_blinded(Half_spell_damage ? 100L : 200L, FALSE); if (!Blind) Your(vision_clears); dmg = 0; @@ -599,11 +785,17 @@ if (Antimagic || Free_action) { shieldeff(u.ux, u.uy); if (multi >= 0) +/*JP You("stiffen briefly."); +*/ + You("一瞬硬直した."); nomul(-1); } else { if (multi >= 0) +/*JP You("are frozen in place!"); +*/ + You("その場で動けなくなった!"); dmg = 4 + (int)mtmp->m_lev; if (Half_spell_damage) dmg = (dmg + 1) / 2; nomul(-dmg); @@ -613,7 +805,10 @@ case CLC_CONFUSE_YOU: if (Antimagic) { shieldeff(u.ux, u.uy); +/*JP You_feel("momentarily dizzy."); +*/ + You("一瞬めまいがした."); } else { boolean oldprop = !!Confusion; @@ -621,16 +816,28 @@ if (Half_spell_damage) dmg = (dmg + 1) / 2; make_confused(HConfusion + dmg, TRUE); if (Hallucination) +#if 0 /*JP*/ You_feel("%s!", oldprop ? "trippier" : "trippy"); +#else + You("%sへろへろになった!", oldprop ? "もっと" : ""); +#endif else +#if 0 /*JP*/ You_feel("%sconfused!", oldprop ? "more " : ""); +#else + You("%s混乱した!", oldprop ? "もっと" : ""); +#endif } dmg = 0; break; case CLC_CURE_SELF: if (mtmp->mhp < mtmp->mhpmax) { if (canseemon(mtmp)) +#if 0 /*JP*/ pline("%s looks better.", Monnam(mtmp)); +#else + pline("%sは気分がよくなったようだ.", Monnam(mtmp)); +#endif /* note: player healing does 6d4; this used to do 1d8 */ if ((mtmp->mhp += d(3,6)) > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax; @@ -643,13 +850,25 @@ dmg = (dmg + 1) / 2; } if (dmg <= 5) +/*JP Your("skin itches badly for a moment."); +*/ + Your("皮膚は一瞬,ムズムズっとした."); else if (dmg <= 10) +/*JP pline("Wounds appear on your body!"); +*/ + pline("傷があなたの体に出来た!"); else if (dmg <= 20) +/*JP pline("Severe wounds appear on your body!"); +*/ + pline("ひどい傷があなたの体に出来た!"); else +/*JP Your("body is covered with painful wounds!"); +*/ + pline("体が傷だらけになった!"); break; default: impossible("mcastu: invalid clerical spell (%d)", spellnum); @@ -774,7 +993,10 @@ nomul(0); if(mattk->adtyp && (mattk->adtyp < 11)) { /* no cf unsigned >0 */ if(canseemon(mtmp)) +/*JP pline("%s zaps you with a %s!", Monnam(mtmp), +*/ + pline("%sは%sをあなたに向けて放った.", Monnam(mtmp), flash_types[ad_to_typ(mattk->adtyp)]); buzz(-ad_to_typ(mattk->adtyp), (int)mattk->damn, mtmp->mx, mtmp->my, sgn(tbx), sgn(tby)); diff -aurbN -xCVS -xXTAGS nethack/src/mhitm.c jnethack/src/mhitm.c --- nethack/src/mhitm.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/mhitm.c 2005-01-05 05:02:08.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "artifact.h" #include "edog.h" @@ -15,7 +22,10 @@ static NEARDATA struct obj *otmp; static const char brief_feeling[] = +/*JP "have a %s feeling for a moment, then it passes."; +*/ + "%s気持におそわれたが,すぐに過ぎさった."; STATIC_DCL char *FDECL(mon_nam_too, (char *,struct monst *,struct monst *)); STATIC_DCL void FDECL(mrustm, (struct monst *, struct monst *, struct obj *)); @@ -44,11 +54,15 @@ { Strcpy(outbuf, mon_nam(mon)); if (mon == other_mon) +#if 1 /*JP*/ + Strcpy(outbuf, "自分自身"); +#else switch (pronoun_gender(mon)) { case 0: Strcpy(outbuf, "himself"); break; case 1: Strcpy(outbuf, "herself"); break; default: Strcpy(outbuf, "itself"); break; } +#endif return outbuf; } @@ -62,9 +76,16 @@ if(flags.soundok && (farq != far_noise || moves-noisetime > 10)) { far_noise = farq; noisetime = moves; +#if 0 /*JP*/ You_hear("%s%s.", (mattk->aatyp == AT_EXPL) ? "an explosion" : "some noises", farq ? " in the distance" : ""); +#else + You_hear("%s%sを聞いた.", + farq ? "遠くで" : "", + (mattk->aatyp == AT_EXPL) ? "爆発音" : "何かが戦う音" + ); +#endif } } @@ -85,9 +106,15 @@ if (mdef->m_ap_type) seemimic(mdef); if (magr->m_ap_type) seemimic(magr); fmt = (could_seduce(magr,mdef,mattk) && !magr->mcan) ? +/*JP "%s pretends to be friendly to" : "%s misses"; +*/ + "%sは%%sに友好的なふりをした." : "%sの%%sへの攻撃は外れた."; Sprintf(buf, fmt, Monnam(magr)); +/*JP pline("%s %s.", buf, mon_nam_too(mdef_name, mdef, magr)); +*/ + pline(buf, mon_nam_too(mdef_name, mdef, magr)); } else noises(magr, mattk); } @@ -134,7 +161,10 @@ if(monnear(mtmp,mon->mx,mon->my)) { if(!u.uswallow && (mtmp == u.ustuck)) { if(!rn2(4)) { +/*JP pline("%s releases you!", Monnam(mtmp)); +*/ + pline("%sはあなたを解放した!", Monnam(mtmp)); u.ustuck = 0; } else break; @@ -225,10 +255,17 @@ mdef->mundetected = 0; newsym(mdef->mx, mdef->my); if(canseemon(mdef) && !sensemon(mdef)) { +#if 0 /*JP:T*/ if (u.usleep) You("dream of %s.", (mdef->data->geno & G_UNIQ) ? a_monnam(mdef) : makeplural(m_monnam(mdef))); +#else + if (u.usleep) You("%sの夢を見た.", a_monnam(mdef)); +#endif +/*JP else pline("Suddenly, you notice %s.", a_monnam(mdef)); +*/ + else pline("突然,あなたは%sに気がついた.", a_monnam(mdef)); } } @@ -301,7 +338,10 @@ char buf[BUFSZ]; Strcpy(buf, Monnam(mdef)); +/*JP pline("%s divides as %s hits it!", buf, mon_nam(magr)); +*/ + pline("%sの攻撃で%sが分裂した!", mon_nam(magr), buf); } } } @@ -394,41 +434,74 @@ if(mdef->m_ap_type) seemimic(mdef); if(magr->m_ap_type) seemimic(magr); if((compat = could_seduce(magr,mdef,mattk)) && !magr->mcan) { +#if 0 /*JP*/ Sprintf(buf, "%s %s", Monnam(magr), mdef->mcansee ? "smiles at" : "talks to"); pline("%s %s %s.", buf, mon_nam(mdef), compat == 2 ? "engagingly" : "seductively"); +#else + Sprintf(buf, "%sは%%sに%%s%s.", Monnam(magr), + mdef->mcansee ? "微笑みかけた" : "話しかけた"); + pline(buf, mon_nam(mdef), + compat == 2 ? + "魅力的に" : "誘惑的に"); +#endif } else { char magr_name[BUFSZ]; Strcpy(magr_name, Monnam(magr)); switch (mattk->aatyp) { case AT_BITE: +/*JP Sprintf(buf,"%s bites", magr_name); +*/ + Sprintf(buf,"%sは%%sに噛みついた.", magr_name); break; case AT_STNG: +/*JP Sprintf(buf,"%s stings", magr_name); +*/ + Sprintf(buf,"%sは%%sを突きさした.", magr_name); break; case AT_BUTT: +/*JP Sprintf(buf,"%s butts", magr_name); +*/ + Sprintf(buf,"%sは%%sに頭突きをくらわした.", magr_name); break; case AT_TUCH: +/*JP Sprintf(buf,"%s touches", magr_name); +*/ + Sprintf(buf,"%sは%%sに触れた.", magr_name); break; case AT_TENT: +/*JP Sprintf(buf, "%s tentacles suck", +*/ + Sprintf(buf, "%sの触手が%%sの体液を吸いとった.", s_suffix(magr_name)); break; case AT_HUGS: if (magr != u.ustuck) { +/*JP Sprintf(buf,"%s squeezes", magr_name); +*/ + Sprintf(buf,"%sは%%sを絞めた.", magr_name); break; } default: +/*JP Sprintf(buf,"%s hits", magr_name); +*/ + Sprintf(buf,"%sの%%sへの攻撃は命中した.", magr_name); } +#if 0 /*JP*/ pline("%s %s.", buf, mon_nam_too(mdef_name, mdef, magr)); +#else + pline(buf, mon_nam_too(mdef_name, mdef, magr)); +#endif } } else noises(magr, mattk); return(mdamagem(magr, mdef, mattk)); @@ -443,37 +516,59 @@ char buf[BUFSZ]; if(vis) { +#if 0 /*JP*/ Sprintf(buf,"%s gazes at", Monnam(magr)); pline("%s %s...", buf, mon_nam(mdef)); +#else + Sprintf(buf,"%sは%%sをにらみつけた...", Monnam(magr)); + pline(buf, mon_nam(mdef)); +#endif } if (magr->mcan || !magr->mcansee || (magr->minvis && !perceives(mdef->data)) || !mdef->mcansee || mdef->msleeping) { +/*JP if(vis) pline("but nothing happens."); +*/ + if(vis) pline("しかし何もおこらなかった."); return(MM_MISS); } /* call mon_reflects 2x, first test, then, if visible, print message */ if (magr->data == &mons[PM_MEDUSA] && mon_reflects(mdef, (char *)0)) { if (canseemon(mdef)) (void) mon_reflects(mdef, +/*JP "The gaze is reflected away by %s %s."); +*/ + "にらみは%sの%sで反射した."); if (mdef->mcansee) { if (mon_reflects(magr, (char *)0)) { if (canseemon(magr)) (void) mon_reflects(magr, +/*JP "The gaze is reflected away by %s %s."); +*/ + "にらみは%sの%sで反射した."); return (MM_MISS); } if (mdef->minvis && !perceives(magr->data)) { if (canseemon(magr)) { +#if 0 /*JP*/ pline("%s doesn't seem to notice that %s gaze was reflected.", Monnam(magr), mhis(magr)); +#else + pline("にらみが反射していることに%sは気付いていないようだ.", + Monnam(magr)); +#endif } return (MM_MISS); } if (canseemon(magr)) +/*JP pline("%s is turned to stone!", Monnam(magr)); +*/ + pline("%sは石になった!", Monnam(magr)); monstone(magr); if (magr->mhp > 0) return (MM_MISS); return (MM_AGR_DIED); @@ -497,8 +592,13 @@ if (mdef->data->msize >= MZ_HUGE) return MM_MISS; if (vis) { +#if 0 /*JP*/ Sprintf(buf,"%s swallows", Monnam(magr)); pline("%s %s.", buf, mon_nam(mdef)); +#else + Sprintf(buf,"%sは%%sをぐっと飲みこんだ.", Monnam(magr)); + pline(buf, mon_nam(mdef)); +#endif } for (obj = mdef->minvent; obj; obj = obj->nobj) (void) snuff_lit(obj); @@ -541,7 +641,10 @@ } else { /* both alive, put them back */ if (cansee(dx, dy)) +/*JP pline("%s is regurgitated!", Monnam(mdef)); +*/ + pline("%sは吐き戻された!", Monnam(mdef)); place_monster(magr, ax, ay); place_monster(mdef, dx, dy); @@ -563,7 +666,10 @@ return MM_MISS; if(cansee(magr->mx, magr->my)) +/*JP pline("%s explodes!", Monnam(magr)); +*/ + pline("%sは爆発した!", Monnam(magr)); else noises(magr, mattk); result = mdamagem(magr, mdef, mattk); @@ -575,7 +681,10 @@ result |= MM_AGR_DIED; } if (magr->mtame) /* give this one even if it was visible */ +/*JP You(brief_feeling, "melancholy"); +*/ + You(brief_feeling, "もの悲しい"); return result; } @@ -607,11 +716,17 @@ mon_to_stone(magr); return MM_HIT; /* no damage during the polymorph */ } +/*JP if (vis) pline("%s turns to stone!", Monnam(magr)); +*/ + if (vis) pline("%sは石になった!", Monnam(magr)); monstone(magr); if (magr->mhp > 0) return 0; else if (magr->mtame && !vis) +/*JP You(brief_feeling, "peculiarly sad"); +*/ + You(brief_feeling, "もの悲しい"); return MM_AGR_DIED; } } @@ -625,19 +740,34 @@ /* eating a Rider or its corpse is fatal */ if (is_rider(mdef->data)) { if (vis) +#if 0 /*JP*/ pline("%s %s!", Monnam(magr), mdef->data == &mons[PM_FAMINE] ? "belches feebly, shrivels up and dies" : mdef->data == &mons[PM_PESTILENCE] ? "coughs spasmodically and collapses" : "vomits violently and drops dead"); +#else + pline("%s%s!", Monnam(magr), + mdef->data == &mons[PM_FAMINE] ? + "弱々しく吐きもどしたかと思うと,体がしぼみ死んでしまった" : + mdef->data == &mons[PM_PESTILENCE] ? + "痙攣したようにせきこみ倒れた" : + "激しく嘔吐し死んだ"); +#endif mondied(magr); if (magr->mhp > 0) return 0; /* lifesaved */ else if (magr->mtame && !vis) +/*JP You(brief_feeling, "queasy"); +*/ + You(brief_feeling, "不安な"); return MM_AGR_DIED; } +/*JP if(flags.verbose && flags.soundok) verbalize("Burrrrp!"); +*/ + if(flags.verbose && flags.soundok) verbalize("げっぷ!"); tmp = mdef->mhp; /* Use up amulet of life saving */ if (!!(obj = mlifesaver(mdef))) m_useup(mdef, obj); @@ -670,8 +800,12 @@ case AD_STUN: if (magr->mcan) break; if (canseemon(mdef)) +#if 0 /*JP*/ pline("%s %s for a moment.", Monnam(mdef), makeplural(stagger(mdef->data, "stagger"))); +#else + pline("%sはすこしよろめいた.", Monnam(mdef)); +#endif mdef->mstun = 1; goto physical; case AD_LEGS: @@ -716,15 +850,26 @@ break; } if (vis) +#if 0 /*JP*/ pline("%s is %s!", Monnam(mdef), on_fire(mdef->data, mattk)); +#else + pline("%sは%s!", Monnam(mdef), + on_fire(mdef->data, mattk)); +#endif if (pd == &mons[PM_STRAW_GOLEM] || pd == &mons[PM_PAPER_GOLEM]) { +/*JP if (vis) pline("%s burns completely!", Monnam(mdef)); +*/ + if (vis) pline("%sは灰になった!", Monnam(mdef)); mondied(mdef); if (mdef->mhp > 0) return 0; else if (mdef->mtame && !vis) +/*JP pline("May %s roast in peace.", mon_nam(mdef)); +*/ + pline("%sよ,安らかに燃えん事を.", mon_nam(mdef)); return (MM_DEF_DIED | (grow_up(magr,mdef) ? 0 : MM_AGR_DIED)); } @@ -732,7 +877,10 @@ tmp += destroy_mitem(mdef, SPBOOK_CLASS, AD_FIRE); if (resists_fire(mdef)) { if (vis) +/*JP pline_The("fire doesn't seem to burn %s!", +*/ + pline("%sは炎で燃えないようだ!", mon_nam(mdef)); shieldeff(mdef->mx, mdef->my); golemeffects(mdef, AD_FIRE, tmp); @@ -746,10 +894,16 @@ tmp = 0; break; } +/*JP if (vis) pline("%s is covered in frost!", Monnam(mdef)); +*/ + if (vis) pline("%sは氷で覆われた!", Monnam(mdef)); if (resists_cold(mdef)) { if (vis) +/*JP pline_The("frost doesn't seem to chill %s!", +*/ + pline("氷は%sを凍らすことができないようだ!", mon_nam(mdef)); shieldeff(mdef->mx, mdef->my); golemeffects(mdef, AD_COLD, tmp); @@ -762,10 +916,16 @@ tmp = 0; break; } +/*JP if (vis) pline("%s gets zapped!", Monnam(mdef)); +*/ + if (vis) pline("%sは衝撃をくらった!", Monnam(mdef)); tmp += destroy_mitem(mdef, WAND_CLASS, AD_ELEC); if (resists_elec(mdef)) { +/*JP if (vis) pline_The("zap doesn't shock %s!", mon_nam(mdef)); +*/ + if (vis) pline("衝撃は%sに影響を与えない!", mon_nam(mdef)); shieldeff(mdef->mx, mdef->my); golemeffects(mdef, AD_ELEC, tmp); tmp = 0; @@ -780,12 +940,20 @@ } if (resists_acid(mdef)) { if (vis) +/*JP pline("%s is covered in acid, but it seems harmless.", +*/ + pline("%sは酸につつまれた.しかしなんともないようだ.", Monnam(mdef)); tmp = 0; } else if (vis) { +#if 0 /*JP*/ pline("%s is covered in acid!", Monnam(mdef)); pline("It burns %s!", mon_nam(mdef)); +#else + pline("%sは酸につつまれた!", Monnam(mdef)); + pline("%sは焼かれた!", mon_nam(mdef)); +#endif } if (!rn2(30)) erode_armor(mdef, TRUE); if (!rn2(6)) erode_obj(MON_WEP(mdef), TRUE, TRUE); @@ -793,11 +961,17 @@ case AD_RUST: if (magr->mcan) break; if (pd == &mons[PM_IRON_GOLEM]) { +/*JP if (vis) pline("%s falls to pieces!", Monnam(mdef)); +*/ + if (vis) pline("%sはバラバラになった!", Monnam(mdef)); mondied(mdef); if (mdef->mhp > 0) return 0; else if (mdef->mtame && !vis) +/*JP pline("May %s rust in peace.", mon_nam(mdef)); +*/ + pline("%sよ,安らかに錆びん事を.", mon_nam(mdef)); return (MM_DEF_DIED | (grow_up(magr,mdef) ? 0 : MM_AGR_DIED)); } @@ -815,11 +989,17 @@ if (magr->mcan) break; if (pd == &mons[PM_WOOD_GOLEM] || pd == &mons[PM_LEATHER_GOLEM]) { +/*JP if (vis) pline("%s falls to pieces!", Monnam(mdef)); +*/ + if (vis) pline("%sはバラバラになった!", Monnam(mdef)); mondied(mdef); if (mdef->mhp > 0) return 0; else if (mdef->mtame && !vis) +/*JP pline("May %s rot in peace.", mon_nam(mdef)); +*/ + pline("%sよ,安らかに腐らん事を.", mon_nam(mdef)); return (MM_DEF_DIED | (grow_up(magr,mdef) ? 0 : MM_AGR_DIED)); } @@ -838,11 +1018,17 @@ break; } if (!resists_ston(mdef)) { +/*JP if (vis) pline("%s turns to stone!", Monnam(mdef)); +*/ + if (vis) pline("%sは石になった!", Monnam(mdef)); monstone(mdef); post_stone: if (mdef->mhp > 0) return 0; else if (mdef->mtame && !vis) +/*JP You(brief_feeling, "peculiarly sad"); +*/ + You(brief_feeling, "もの悲しい"); return (MM_DEF_DIED | (grow_up(magr,mdef) ? 0 : MM_AGR_DIED)); } @@ -861,7 +1047,10 @@ && mdef != u.usteed #endif ) +/*JP pline("%s suddenly disappears!", mdef_Monnam); +*/ + pline("%sは突然消えた!", mdef_Monnam); } break; case AD_SLEE: @@ -869,7 +1058,10 @@ sleep_monst(mdef, rnd(10), -1)) { if (vis) { Strcpy(buf, Monnam(mdef)); +/*JP pline("%s is put to sleep by %s.", buf, mon_nam(magr)); +*/ + pline("%sは%sによって眠らされた.", buf, mon_nam(magr)); } mdef->mstrategy &= ~STRAT_WAITFORU; slept_monst(mdef); @@ -879,7 +1071,10 @@ if(!cancelled && mdef->mcanmove) { if (vis) { Strcpy(buf, Monnam(mdef)); +/*JP pline("%s is frozen by %s.", buf, mon_nam(magr)); +*/ + pline("%sは%sによって動けなくなった.", buf, mon_nam(magr)); } mdef->mcanmove = 0; mdef->mfrozen = rnd(10); @@ -893,7 +1088,10 @@ mon_adjust_speed(mdef, -1, (struct obj *)0); mdef->mstrategy &= ~STRAT_WAITFORU; if (mdef->mspeed != oldspeed && vis) +/*JP pline("%s slows down.", Monnam(mdef)); +*/ + pline("%sは動作がのろくなった.", Monnam(mdef)); } break; case AD_CONF: @@ -902,7 +1100,10 @@ * we still should check for it). */ if (!magr->mcan && !mdef->mconf && !magr->mspec_used) { +/*JP if (vis) pline("%s looks confused.", Monnam(mdef)); +*/ + if (vis) pline("%sは混乱しているように見える.", Monnam(mdef)); mdef->mconf = 1; mdef->mstrategy &= ~STRAT_WAITFORU; } @@ -912,7 +1113,10 @@ register unsigned rnd_tmp; if (vis && mdef->mcansee) +/*JP pline("%s is blinded.", Monnam(mdef)); +*/ + pline("%sは目が見えなくなった.", Monnam(mdef)); rnd_tmp = d((int)mattk->damn, (int)mattk->damd); if ((rnd_tmp += mdef->mblinded) > 127) rnd_tmp = 127; mdef->mblinded = rnd_tmp; @@ -923,8 +1127,13 @@ break; case AD_HALU: if (!magr->mcan && haseyes(pd) && mdef->mcansee) { +#if 0 /*JP*/ if (vis) pline("%s looks %sconfused.", Monnam(mdef), mdef->mconf ? "more " : ""); +#else + if (vis) pline("%sは%s混乱しているように見える.", + Monnam(mdef), mdef->mconf ? "ますます" : ""); +#endif mdef->mconf = 1; mdef->mstrategy &= ~STRAT_WAITFORU; } @@ -939,20 +1148,35 @@ were_change(mdef); if (pd == &mons[PM_CLAY_GOLEM]) { if (vis) { +/*JP pline("Some writing vanishes from %s head!", +*/ + pline("何かの文字が%sの頭から消えた!", s_suffix(mon_nam(mdef))); +/*JP pline("%s is destroyed!", Monnam(mdef)); +*/ + pline("%sは破壊された!", Monnam(mdef)); } mondied(mdef); if (mdef->mhp > 0) return 0; else if (mdef->mtame && !vis) +/*JP You(brief_feeling, "strangely sad"); +*/ + You(brief_feeling, "妙に悲しい"); return (MM_DEF_DIED | (grow_up(magr,mdef) ? 0 : MM_AGR_DIED)); } if (flags.soundok) { +/*JP if (!vis) You_hear("laughter."); +*/ + if (!vis) You_hear("笑い声を聞いた."); +/*JP else pline("%s chuckles.", Monnam(magr)); +*/ + else pline("%sはくすくす笑った.", Monnam(magr)); } } break; @@ -980,19 +1204,28 @@ mdef->mstrategy &= ~STRAT_WAITFORU; if (vis) { Strcpy(buf, Monnam(magr)); +/*JP pline("%s steals some gold from %s.", buf, mon_nam(mdef)); +*/ + pline("%sは%sから金を盗んだ.", buf, mon_nam(mdef)); } if (!tele_restrict(magr)) { (void) rloc(magr, FALSE); if (vis && !canspotmon(magr)) +/*JP pline("%s suddenly disappears!", buf); +*/ + pline("%sは突然消えた!", buf); } break; case AD_DRLI: if (!cancelled && !rn2(3) && !resists_drli(mdef)) { tmp = d(2,6); if (vis) +/*JP pline("%s suddenly seems weaker!", Monnam(mdef)); +*/ + pline("%sは突然弱くなったように見えた!", Monnam(mdef)); mdef->mhpmax -= tmp; if (mdef->m_lev == 0) tmp = mdef->mhp; @@ -1039,8 +1272,13 @@ (void) add_to_minv(magr, otmp); if (vis) { Strcpy(buf, Monnam(magr)); +#if 0 /*JP*/ pline("%s steals %s from %s!", buf, onambuf, mdefnambuf); +#else + pline("%sは%sから%sを盗んだ!", buf, + mdefnambuf, onambuf); +#endif } possibly_unwield(mdef, FALSE); mdef->mstrategy &= ~STRAT_WAITFORU; @@ -1052,7 +1290,10 @@ !tele_restrict(magr)) { (void) rloc(magr, FALSE); if (vis && !canspotmon(magr)) +/*JP pline("%s suddenly disappears!", buf); +*/ + pline("%sは突然消えた!", buf); } } tmp = 0; @@ -1062,16 +1303,25 @@ case AD_DRCO: if (!cancelled && !rn2(8)) { if (vis) +/*JP pline("%s %s was poisoned!", s_suffix(Monnam(magr)), +*/ + pline("%sの%sは毒されている!", Monnam(magr), mpoisons_subj(magr, mattk)); if (resists_poison(mdef)) { if (vis) +/*JP pline_The("poison doesn't seem to affect %s.", +*/ + pline("%sは毒の影響を受けない.", mon_nam(mdef)); } else { if (rn2(10)) tmp += rn1(10,6); else { +/*JP if (vis) pline_The("poison was deadly..."); +*/ + if (vis) pline("毒は致死量だった..."); tmp = mdef->mhp; } } @@ -1079,7 +1329,10 @@ break; case AD_DRIN: if (notonhead || !has_head(pd)) { +/*JP if (vis) pline("%s doesn't seem harmed.", Monnam(mdef)); +*/ + if (vis) pline("%sは傷ついたようには見えない.", Monnam(mdef)); /* Not clear what to do for green slimes */ tmp = 0; break; @@ -1087,15 +1340,26 @@ if ((mdef->misc_worn_check & W_ARMH) && rn2(8)) { if (vis) { Strcpy(buf, s_suffix(Monnam(mdef))); +#if 0 /*JP*/ pline("%s helmet blocks %s attack to %s head.", buf, s_suffix(mon_nam(magr)), mhis(mdef)); +#else + pline("%sの兜は%sの頭への攻撃を防いだ.", + buf, mon_nam(magr)); +#endif } break; } +/*JP if (vis) pline("%s brain is eaten!", s_suffix(Monnam(mdef))); +*/ + if (vis) pline("%sの脳は食べられた!", Monnam(mdef)); if (mindless(pd)) { +/*JP if (vis) pline("%s doesn't notice.", Monnam(mdef)); +*/ + if (vis) pline("%sは気づいていない.", Monnam(mdef)); break; } tmp += rnd(10); /* fakery, since monsters lack INT scores */ @@ -1104,7 +1368,10 @@ magr->mconf = 0; } if (tmp >= mdef->mhp && vis) +/*JP pline("%s last thought fades away...", +*/ + pline("%sの最後の思いがよぎる...", s_suffix(Monnam(mdef))); break; case AD_SLIM: @@ -1208,7 +1475,10 @@ { if ((mon->msleeping || !mon->mcanmove) && mon == u.ustuck && !sticks(youmonst.data) && !u.uswallow) { +/*JP pline("%s grip relaxes.", s_suffix(Monnam(mon))); +*/ + pline("%sの握る力が弱くなった.", Monnam(mon)); unstuck(mon); } } @@ -1237,15 +1507,26 @@ (is_acid ? obj->oeroded2 : obj->oeroded) < MAX_ERODE) { if (obj->greased || obj->oerodeproof || (obj->blessed && rn2(3))) { if (cansee(mdef->mx, mdef->my) && flags.verbose) +/*JP pline("%s weapon is not affected.", +*/ + pline("%sの武器は影響を受けない.", s_suffix(Monnam(magr))); if (obj->greased && !rn2(2)) obj->greased = 0; } else { if (cansee(mdef->mx, mdef->my)) { +#if 0 /*JP*/ pline("%s %s%s!", s_suffix(Monnam(magr)), aobjnam(obj, (is_acid ? "corrode" : "rust")), (is_acid ? obj->oeroded2 : obj->oeroded) ? " further" : ""); +#else + pline("%sの%sは%s%s!", Monnam(magr), + xname(obj), + (is_acid ? obj->oeroded2 : obj->oeroded) + ? "さらに" : "", + is_acid ? "腐食した" : "錆びた"); +#endif } if (is_acid) obj->oeroded2++; else obj->oeroded++; @@ -1261,9 +1542,16 @@ char buf[BUFSZ]; if (!flags.verbose || Blind || !mon_visible(magr)) return; Strcpy(buf, mon_nam(mdef)); +#if 0 /*JP*/ pline("%s %s %s %s at %s.", Monnam(magr), (objects[otemp->otyp].oc_dir & PIERCE) ? "thrusts" : "swings", mhis(magr), singular(otemp, xname), buf); +#else + pline((objects[otemp->otyp].oc_dir & PIERCE) ? + "%sは%sで%sを突いた." : + "%sは%sを振りまわし%sを攻撃した.", Monnam(magr), + xname(otemp), buf); +#endif } /* @@ -1299,11 +1587,17 @@ if (mhit && !rn2(2)) { Strcpy(buf, Monnam(magr)); if(canseemon(magr)) +/*JP pline("%s is splashed by %s acid!", +*/ + pline("%sは%sの酸を浴びた!", buf, s_suffix(mon_nam(mdef))); if (resists_acid(magr)) { if(canseemon(magr)) +/*JP pline("%s is not affected.", Monnam(magr)); +*/ + pline("%sは影響をうけない.", Monnam(magr)); tmp = 0; } } else tmp = 0; @@ -1327,14 +1621,20 @@ if (!rn2(4)) tmp = 127; if (magr->mcansee && haseyes(madat) && mdef->mcansee && (perceives(madat) || !mdef->minvis)) { +/*JP Sprintf(buf, "%s gaze is reflected by %%s %%s.", +*/ + Sprintf(buf, "%sのにらみは%%sによって%%s.", s_suffix(mon_nam(mdef))); if (mon_reflects(magr, canseemon(magr) ? buf : (char *)0)) return(mdead|mhit); Strcpy(buf, Monnam(magr)); if(canseemon(magr)) +/*JP pline("%s is frozen by %s gaze!", +*/ + pline("%sは%sのにらみで動けなくなった!", buf, s_suffix(mon_nam(mdef))); magr->mcanmove = 0; magr->mfrozen = tmp; @@ -1343,7 +1643,10 @@ } else { /* gelatinous cube */ Strcpy(buf, Monnam(magr)); if(canseemon(magr)) +/*JP pline("%s is frozen by %s.", buf, mon_nam(mdef)); +*/ + pline("%sは%sによって動けなくなった.", buf, mon_nam(mdef)); magr->mcanmove = 0; magr->mfrozen = tmp; return (mdead|mhit); @@ -1352,14 +1655,20 @@ case AD_COLD: if (resists_cold(magr)) { if (canseemon(magr)) { +/*JP pline("%s is mildly chilly.", Monnam(magr)); +*/ + pline("%sは冷えた.", Monnam(magr)); golemeffects(magr, AD_COLD, tmp); } tmp = 0; break; } if(canseemon(magr)) +/*JP pline("%s is suddenly very cold!", Monnam(magr)); +*/ + pline("%sは突然凍りづけになった!", Monnam(magr)); mdef->mhp += tmp / 2; if (mdef->mhpmax < mdef->mhp) mdef->mhpmax = mdef->mhp; if (mdef->mhpmax > ((int) (mdef->m_lev+1) * 8)) @@ -1369,34 +1678,50 @@ if (!magr->mstun) { magr->mstun = 1; if (canseemon(magr)) +#if 0 /*JP*/ pline("%s %s...", Monnam(magr), makeplural(stagger(magr->data, "stagger"))); +#else + pline("%sはくらくらした...", Monnam(magr)); +#endif } tmp = 0; break; case AD_FIRE: if (resists_fire(magr)) { if (canseemon(magr)) { +/*JP pline("%s is mildly warmed.", Monnam(magr)); +*/ + pline("%sは暖かくなった.", Monnam(magr)); golemeffects(magr, AD_FIRE, tmp); } tmp = 0; break; } if(canseemon(magr)) +/*JP pline("%s is suddenly very hot!", Monnam(magr)); +*/ + pline("%sは突然とても熱くなった!", Monnam(magr)); break; case AD_ELEC: if (resists_elec(magr)) { if (canseemon(magr)) { +/*JP pline("%s is mildly tingled.", Monnam(magr)); +*/ + pline("%sはピリピリしている.", Monnam(magr)); golemeffects(magr, AD_ELEC, tmp); } tmp = 0; break; } if(canseemon(magr)) +/*JP pline("%s is jolted with electricity!", Monnam(magr)); +*/ + pline("%sは電気ショックをうけた!", Monnam(magr)); break; default: tmp = 0; break; diff -aurbN -xCVS -xXTAGS nethack/src/mhitu.c jnethack/src/mhitu.c --- nethack/src/mhitu.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/mhitu.c 2005-06-21 19:17:12.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "artifact.h" @@ -48,37 +55,71 @@ /* If same gender, "engagingly" for nymph, normal msg for others */ if((compat = could_seduce(mtmp, &youmonst, mattk)) && !mtmp->mcan && !mtmp->mspec_used) { +#if 0 /*JP*/ pline("%s %s you %s.", Monnam(mtmp), Blind ? "talks to" : "smiles at", compat == 2 ? "engagingly" : "seductively"); +#else + pline("%sはあなた%s%s.", Monnam(mtmp), + compat == 2 ? "を引きつけるように" : "に好意をよせるように", + Blind ? "話しかけた" : "微笑んだ"); +#endif } else switch (mattk->aatyp) { case AT_BITE: +/*JP pline("%s bites!", Monnam(mtmp)); +*/ + pline("%sは噛みついた!", Monnam(mtmp)); break; case AT_KICK: +#if 0 /*JP*/ pline("%s kicks%c", Monnam(mtmp), thick_skinned(youmonst.data) ? '.' : '!'); +#else + pline("%sは蹴とばした%s",Monnam(mtmp), + thick_skinned(youmonst.data) ? "." : "!"); +#endif break; case AT_STNG: +/*JP pline("%s stings!", Monnam(mtmp)); +*/ + pline("%sは突きさした!", Monnam(mtmp)); break; case AT_BUTT: +/*JP pline("%s butts!", Monnam(mtmp)); +*/ + pline("%sは頭突きをくらわした!", Monnam(mtmp)); break; case AT_TUCH: +/*JP pline("%s touches you!", Monnam(mtmp)); +*/ + pline("%sはあなたに触れた!", Monnam(mtmp)); break; case AT_TENT: +#if 0 /*JP*/ pline("%s tentacles suck you!", s_suffix(Monnam(mtmp))); +#else + pline("%sの触手があなたの体液を吸いとった!", + Monnam(mtmp)); +#endif break; case AT_EXPL: case AT_BOOM: +/*JP pline("%s explodes!", Monnam(mtmp)); +*/ + pline("%sは爆発した!", Monnam(mtmp)); break; default: +/*JP pline("%s hits!", Monnam(mtmp)); +*/ + pline("%sの攻撃は命中した!", Monnam(mtmp)); } } @@ -92,12 +133,21 @@ map_invisible(mtmp->mx, mtmp->my); if(could_seduce(mtmp, &youmonst, mattk) && !mtmp->mcan) +/*JP pline("%s pretends to be friendly.", Monnam(mtmp)); +*/ + pline("%sは友好的なふりをしている.",Monnam(mtmp)); else { if (!flags.verbose || !nearmiss) +/*JP pline("%s misses.", Monnam(mtmp)); +*/ + pline("%sの攻撃ははずれた.", Monnam(mtmp)); else +/*JP pline("%s just misses!", Monnam(mtmp)); +*/ + pline("%sの攻撃は空を切った.", Monnam(mtmp)); } stop_occupation(); } @@ -109,9 +159,15 @@ { if (!flags.verbose || Blind || !mon_visible(mtmp)) return; +#if 0 /*JP*/ pline("%s %s %s %s.", Monnam(mtmp), (objects[otemp->otyp].oc_dir & PIERCE) ? "thrusts" : "swings", mhis(mtmp), singular(otemp, xname)); +#else + pline("%sは%s%s.", Monnam(mtmp), + xname(otemp), + (objects[otemp->otyp].oc_dir & PIERCE) ? "を突いた" : "を振りまわした"); +#endif } /* return how a poison attack was delivered */ @@ -124,11 +180,20 @@ struct obj *mwep = (mtmp == &youmonst) ? uwep : MON_WEP(mtmp); /* "Foo's attack was poisoned." is pretty lame, but at least it's better than "sting" when not a stinging attack... */ +/*JP return (!mwep || !mwep->opoisoned) ? "attack" : "weapon"; +*/ + return (!mwep || !mwep->opoisoned) ? "攻撃" : "武器"; } else { +#if 0 /*JP*/ return (mattk->aatyp == AT_TUCH) ? "contact" : (mattk->aatyp == AT_GAZE) ? "gaze" : (mattk->aatyp == AT_BITE) ? "bite" : "sting"; +#else + return (mattk->aatyp == AT_TUCH) ? "接触" : + (mattk->aatyp == AT_GAZE) ? "にらみ" : + (mattk->aatyp == AT_BITE) ? "噛みつき" : "突きさし"; +#endif } } @@ -138,9 +203,15 @@ { HFast = 0L; if (!Fast) +/*JP You("slow down."); +*/ + You("動きが遅くなった."); else /* speed boots */ +/*JP Your("quickness feels less natural."); +*/ + You("速さについていけなくなった."); exercise(A_DEX, FALSE); } @@ -165,16 +236,28 @@ if (!mtmp->mcansee || (Invis && !perceives(mtmp->data))) { const char *swings = +#if 0 /*JP*/ mattk->aatyp == AT_BITE ? "snaps" : mattk->aatyp == AT_KICK ? "kicks" : (mattk->aatyp == AT_STNG || mattk->aatyp == AT_BUTT || nolimbs(mtmp->data)) ? "lunges" : "swings"; +#else + mattk->aatyp == AT_BITE ? "噛みつく" : + mattk->aatyp == AT_KICK ? "蹴とばす" : + (mattk->aatyp == AT_STNG || + mattk->aatyp == AT_BUTT || + nolimbs(mtmp->data)) ? "突進する" : "振り回す"; +#endif if (compat) +/*JP pline("%s tries to touch you and misses!", Monnam(mtmp)); +*/ + pline("%sはあなたに触ろうとしたが失敗した!", Monnam(mtmp)); else switch(rn2(3)) { +#if 0 /*JP*/ case 0: pline("%s %s wildly and misses!", Monnam(mtmp), swings); break; @@ -186,15 +269,36 @@ break; default:pline("%s %s wildly!", Monnam(mtmp), swings); break; +#else /*JP*/ + case 0: pline("%sは激しく%sが,はずした.", Monnam(mtmp), + jpast(swings)); + break; + case 1: pline("%sの攻撃はあなたの脇腹をかすめた.", Monnam(mtmp)); + break; + case 2: pline("%sは%sを打ちつけた!", Monnam(mtmp), + Underwater ? "水" : "何もないところ"); + break; + default:pline("%sは激しく%s!", Monnam(mtmp), + jpast(swings)); + break; +#endif /*JP*/ } } else if (Displaced) { if (compat) +#if 0 /*JP*/ pline("%s smiles %s at your %sdisplaced image...", Monnam(mtmp), compat == 2 ? "engagingly" : "seductively", Invis ? "invisible " : ""); +#else + pline("%sは%sあなたの幻影に対して%s微笑んだ...", + Monnam(mtmp), + Invis ? "透明な" : "", + compat == 2 ? "魅力的に" : "誘惑的に"); +#endif else +#if 0 /*JP*/ pline("%s strikes at your %sdisplaced image and misses you!", /* Note: if you're both invisible and displaced, * only monsters which see invisible will attack your @@ -203,14 +307,25 @@ */ Monnam(mtmp), Invis ? "invisible " : ""); +#else + pline("%sはあなたの%s幻影を攻撃し,はずした!", + Monnam(mtmp), + Invis ? "透明な" : ""); +#endif } else if (Underwater) { /* monsters may miss especially on water level where bubbles shake the player here and there */ if (compat) +/*JP pline("%s reaches towards your distorted image.",Monnam(mtmp)); +*/ + pline("%sはあなたの歪んだ幻影の方へ向かった.",Monnam(mtmp)); else +/*JP pline("%s is fooled by water reflections and misses!",Monnam(mtmp)); +*/ + pline("%sは水の反射にだまされ,はずした!",Monnam(mtmp)); } else impossible("%s attacks you without knowing your location?", Monnam(mtmp)); @@ -224,7 +339,10 @@ { if (message) { if (is_animal(mdat)) +/*JP You("get regurgitated!"); +*/ + You("吐きだされた!"); else { char blast[40]; register int i; @@ -240,16 +358,34 @@ switch (mdat->mattk[i].adtyp) { case AD_ELEC: Strcpy(blast, +/*JP " in a shower of sparks"); +*/ + "の火花の雨の中から"); break; case AD_COLD: Strcpy(blast, +/*JP " in a blast of frost"); +*/ + "の冷気の風の中から"); + break; +#if 1 /*JP*//*By Hiramoto Kouji*/ + default: + Strcpy(blast, + "から"); break; +#endif } } else +/*JP Strcpy(blast, " with a squelch"); +*/ + Strcpy(blast, "から吐き出されるように"); +/*JP You("get expelled from %s%s!", +*/ + You("%s%s脱出した!", mon_nam(mtmp), blast); } } @@ -260,7 +396,10 @@ spoteffects(TRUE); /* to cover for a case where mtmp is not in a next square */ if(um_dist(mtmp->mx,mtmp->my,1)) +/*JP pline("Brrooaa... You land hard at some distance."); +*/ + pline("ブロロロ..遠くに着陸するのは難しい."); } #endif /* OVLB */ @@ -358,7 +497,10 @@ coord cc; /* maybe we need a unexto() function? */ struct obj *obj; +/*JP You("fall from the %s!", ceiling(u.ux,u.uy)); +*/ + You("%sから落ちた!", ceiling(u.ux,u.uy)); if (enexto(&cc, u.ux, u.uy, youmonst.data)) { remove_monster(mtmp->mx, mtmp->my); newsym(mtmp->mx,mtmp->my); @@ -368,8 +510,13 @@ set_apparxy(mtmp); newsym(u.ux,u.uy); } else { +#if 0 /*JP*/ pline("%s is killed by a falling %s (you)!", Monnam(mtmp), youmonst.data->mname); +#else + pline("%sは落ちてきた%s(あなた)によって死んだ!", + Monnam(mtmp),jtrns_mon_gen(youmonst.data->mname, flags.female)); +#endif killed(mtmp); newsym(u.ux,u.uy); if (mtmp->mhp > 0) return 0; @@ -380,21 +527,33 @@ obj = which_armor(mtmp, WORN_HELMET); if (obj && is_metallic(obj)) { +/*JP Your("blow glances off %s helmet.", +*/ + Your("攻撃は%sの兜をかすめた.", s_suffix(mon_nam(mtmp))); } else { if (3 + find_mac(mtmp) <= rnd(20)) { +/*JP pline("%s is hit by a falling piercer (you)!", +*/ + pline("%sは落ちる針(あなた)で傷ついた!", Monnam(mtmp)); if ((mtmp->mhp -= d(3,6)) < 1) killed(mtmp); } else +/*JP pline("%s is almost hit by a falling piercer (you)!", +*/ + pline("%sはもう少しで落ちる針(あなた)で傷つくところだった!", Monnam(mtmp)); } } else { if (!youseeit) +/*JP pline("It tries to move where you are hiding."); +*/ + pline("何者かがあなたが隠れているところを移動しようとした."); else { /* Ugly kludge for eggs. The message is phrased so as * to be directed at the monster, not the player, @@ -412,12 +571,23 @@ if (obj->otyp == EGG) obj->spe = 0; } if (youmonst.data->mlet == S_EEL) +#if 0 /*JP*/ pline("Wait, %s! There's a hidden %s named %s there!", m_monnam(mtmp), youmonst.data->mname, plname); +#else + pline("待て,%s!%sという名の%sが隠れている!", + m_monnam(mtmp), plname, jtrns_mon_gen(youmonst.data->mname, flags.female)); +#endif else +#if 0 /*JP*/ pline("Wait, %s! There's a %s named %s hiding under %s!", m_monnam(mtmp), youmonst.data->mname, plname, doname(level.objects[u.ux][u.uy])); +#else + pline("待て,%s!%sという名の%sが%sの下に隠れている!", + m_monnam(mtmp), plname, jtrns_mon_gen(youmonst.data->mname, flags.female), + doname(level.objects[u.ux][u.uy])); +#endif if (obj) obj->spe = save_spe; } else impossible("hiding under nothing?"); @@ -428,9 +598,18 @@ } if (youmonst.data->mlet == S_MIMIC && youmonst.m_ap_type && !range2 && foundyou && !u.uswallow) { +/*JP if (!youseeit) pline("It gets stuck on you."); +*/ + if (!youseeit) pline("何者かがあなたの上にのしかかった."); +#if 0 /*JP*/ else pline("Wait, %s! That's a %s named %s!", m_monnam(mtmp), youmonst.data->mname, plname); +#else + else pline("待て,%s!それは%sという名の%sだ!", + m_monnam(mtmp), + plname, jtrns_mon_gen(youmonst.data->mname, flags.female)); +#endif u.ustuck = mtmp; youmonst.m_ap_type = M_AP_NOTHING; youmonst.mappearance = 0; @@ -441,19 +620,39 @@ /* player might be mimicking an object */ if (youmonst.m_ap_type == M_AP_OBJECT && !range2 && foundyou && !u.uswallow) { if (!youseeit) +#if 0 /*JP*/ pline("%s %s!", Something, (likes_gold(mtmp->data) && youmonst.mappearance == GOLD_PIECE) ? "tries to pick you up" : "disturbs you"); +#else + pline("%sは%s!", Something, + (likes_gold(mtmp->data) && youmonst.mappearance == GOLD_PIECE) ? + "あなたを拾おうとした" : "無視した"); +#endif +#if 0 /*JP*/ else pline("Wait, %s! That %s is really %s named %s!", m_monnam(mtmp), mimic_obj_name(&youmonst), an(mons[u.umonnum].mname), plname); +#else + else pline("待て,%s!その%sは%sという名の%sだ!", + m_monnam(mtmp), + mimic_obj_name(&youmonst), + plname, + jtrns_mon(mons[u.umonnum].mname)); +#endif if (multi < 0) { /* this should always be the case */ char buf[BUFSZ]; +#if 0 /*JP*/ Sprintf(buf, "You appear to be %s again.", Upolyd ? (const char *) an(youmonst.data->mname) : (const char *) "yourself"); +#else + Sprintf(buf, "あなたはふたたび%sになった.", + Upolyd ? (const char *) a_monnam(&youmonst) : + (const char *) "自分自身"); +#endif unmul(buf); /* immediately stop mimicking */ } return 0; @@ -491,27 +690,51 @@ if(!rn2(10) && !mtmp->mcan) { int numseen, numhelp; +#if 0 /*JP*/ char buf[BUFSZ], genericwere[BUFSZ]; +#else + char genericwere[BUFSZ]; +#endif Strcpy(genericwere, "creature"); numhelp = were_summon(mdat, FALSE, &numseen, genericwere); if (youseeit) { +/*JP pline("%s summons help!", Monnam(mtmp)); +*/ + pline("%sは助けを呼んだ!", Monnam(mtmp)); if (numhelp > 0) { if (numseen == 0) +/*JP You_feel("hemmed in."); +*/ + pline("何者かに囲まれたような気がする."); +/*JP } else pline("But none comes."); +*/ + } else pline("しかし何も来なかった."); } else { const char *from_nowhere; if (flags.soundok) { +#if 0 /*JP:T*/ pline("%s %s!", Something, makeplural(growl_sound(mtmp))); +#else + pline("何かが%s!", growl_sound(mtmp)); +#endif from_nowhere = ""; +/*JP } else from_nowhere = " from nowhere"; +*/ + } else from_nowhere = "どこからともなく"; if (numhelp > 0) { +/*JP if (numseen < 1) You_feel("hemmed in."); +*/ + if (numseen < 1) pline("何者かに囲まれたような気がする."); else { +#if 0 /*JP*/ if (numseen == 1) Sprintf(buf, "%s appears", an(genericwere)); @@ -519,6 +742,12 @@ Sprintf(buf, "%s appear", makeplural(genericwere)); pline("%s%s!", upstart(buf), from_nowhere); +#else + pline("%sが%s現れた!", + strcmp(genericwere, "creature") ? + jtrns_mon(genericwere) : + "何か", from_nowhere); +#endif } } /* else no help came; but you didn't know it tried */ } @@ -528,13 +757,22 @@ if(u.uinvulnerable) { /* monsters won't attack you */ if(mtmp == u.ustuck) +/*JP pline("%s loosens its grip slightly.", Monnam(mtmp)); +*/ + pline("%sは締めつけをわずかに緩めた.", Monnam(mtmp)); else if(!range2) { if (youseeit || sensemon(mtmp)) +/*JP pline("%s starts to attack you, but pulls back.", +*/ + pline("%sはあなたを攻撃しかけたが,ひっこめた.", Monnam(mtmp)); else +/*JP You_feel("%s move nearby.", something); +*/ + pline("何者かがあなたのそばを通りぬけたような気がした."); } return (0); } @@ -606,15 +844,28 @@ missmu(mtmp, (tmp == j), mattk); } } else if (is_animal(mtmp->data)) { +/*JP pline("%s gulps some air!", Monnam(mtmp)); +*/ + pline("%sは息を吸いこんた!", Monnam(mtmp)); } else { if (youseeit) +/*JP pline("%s lunges forward and recoils!", +*/ + pline("%sは突進し,戻った!", Monnam(mtmp)); else +#if 0 /*JP*/ You_hear("a %s nearby.", is_whirly(mtmp->data) ? "rushing noise" : "splat"); +#else + You_hear("すぐそばで%s音を聞いた.", + is_whirly(mtmp->data)? + "突撃してくる" : + "ピシャッという"); +#endif } } break; @@ -683,7 +934,10 @@ if(sum[i] == 1) { /* successful attack */ if (u.usleep && u.usleep < monstermoves && !rn2(10)) { multi = -1; +/*JP nomovemsg = "The combat suddenly awakens you."; +*/ + nomovemsg = "あなたは起こされた."; } } if(sum[i] == 2) return 1; /* attacker dead */ @@ -767,11 +1021,19 @@ struct permonst *mdat; { if (Sick_resistance) { +/*JP You_feel("a slight illness."); +*/ + You("すこし気分が悪くなったような気がした."); return FALSE; } else { +#if 0 /*JP*/ make_sick(Sick ? Sick/3L + 1L : (long)rn1(ACURR(A_CON), 20), mdat->mname, TRUE, SICK_NONVOMITABLE); +#else + make_sick(Sick ? Sick/3L + 1L : (long)rn1(ACURR(A_CON), 20), + jtrns_mon(mdat->mname), TRUE, SICK_NONVOMITABLE); +#endif return TRUE; } } @@ -793,6 +1055,7 @@ protection might fail (33% chance) when the armor is cursed */ if (obj && (obj->greased || obj->otyp == OILSKIN_CLOAK) && (!obj->cursed || rn2(3))) { +#if 0 /*JP*/ pline("%s %s your %s %s!", Monnam(mtmp), (mattk->adtyp == AD_WRAP) ? @@ -802,9 +1065,21 @@ for undiscovered oilskin cloak */ (obj->greased || objects[obj->otyp].oc_name_known) ? xname(obj) : cloak_simple_name(obj)); +#else + pline("%sは%s%s%s!", + Monnam(mtmp), + obj->greased ? "油の塗られた" : "滑りやすい", + (obj->greased || objects[obj->otyp].oc_name_known) ? + xname(obj) : cloak_simple_name(obj), + (mattk->adtyp == AD_WRAP) ? + "で滑った" : "をつかまえようとしたが,できなかった"); +#endif if (obj->greased && !rn2(2)) { +/*JP pline_The("grease wears off."); +*/ + pline("脂は落ちてしまった."); obj->greased = 0; update_inventory(); } @@ -886,9 +1161,12 @@ mtmp->mundetected = 0; if (!(Blind ? Blind_telepat : Unblind_telepat)) { struct obj *obj; +#if 0 /*JP*/ const char *what; +#endif if ((obj = level.objects[mtmp->mx][mtmp->my]) != 0) { +#if 0 /*JP*/ if (Blind && !obj->dknown) what = something; else if (is_pool(mtmp->mx, mtmp->my) && !Underwater) @@ -897,6 +1175,14 @@ what = doname(obj); pline("%s was hidden under %s!", Amonnam(mtmp), what); +#else + if (Blind && !obj->dknown) + pline("%sが何かの下に隠れている!", Amonnam(mtmp)); + else if (is_pool(mtmp->mx, mtmp->my) && !Underwater) + pline("%sが水中に隠れている!", Amonnam(mtmp)); + else + pline("%sが%sの下に隠れている!", Amonnam(mtmp), doname(obj)); +#endif } newsym(mtmp->mx, mtmp->my); } @@ -924,21 +1210,35 @@ dmg = 0; } else { u.ustuck = mtmp; +/*JP pline("%s grabs you!", Monnam(mtmp)); +*/ + pline("%sにつかまえられている!", Monnam(mtmp)); } } else if(u.ustuck == mtmp) { exercise(A_STR, FALSE); +#if 0 /*JP*/ You("are being %s.", (mtmp->data == &mons[PM_ROPE_GOLEM]) ? "choked" : "crushed"); +#else + You("%sている.", + (mtmp->data == &mons[PM_ROPE_GOLEM]) + ? "首を絞められ" : "押しつぶされ"); +#endif } } else { /* hand to hand weapon */ if(mattk->aatyp == AT_WEAP && otmp) { if (otmp->otyp == CORPSE && touch_petrifies(&mons[otmp->corpsenm])) { dmg = 1; +#if 0 /*JP*/ pline("%s hits you with the %s corpse.", Monnam(mtmp), mons[otmp->corpsenm].mname); +#else + pline("%sは%sの死体で攻撃した.", + Monnam(mtmp), jtrns_mon(mons[otmp->corpsenm].mname)); +#endif if (!Stoned) goto do_stone; } @@ -962,7 +1262,10 @@ flags.botl = 1; dmg = 0; if(cloneu()) +/*JP You("divide as %s hits you!",mon_nam(mtmp)); +*/ + pline("%sの攻撃によってあなたは分裂した!", mon_nam(mtmp)); } urustm(mtmp, otmp); } else if (mattk->aatyp != AT_TUCH || dmg != 0 || @@ -977,15 +1280,24 @@ case AD_FIRE: hitmsg(mtmp, mattk); if (uncancelled) { +/*JP pline("You're %s!", on_fire(youmonst.data, mattk)); +*/ + pline("あなたは%s!", on_fire(youmonst.data, mattk)); if (youmonst.data == &mons[PM_STRAW_GOLEM] || youmonst.data == &mons[PM_PAPER_GOLEM]) { +/*JP You("roast!"); +*/ + You("焦げた!"); /* KMH -- this is okay with unchanging */ rehumanize(); break; } else if (Fire_resistance) { +/*JP pline_The("fire doesn't feel hot!"); +*/ + pline("火はぜんぜん熱くない!"); dmg = 0; } if((int) mtmp->m_lev > rn2(20)) @@ -1000,9 +1312,15 @@ case AD_COLD: hitmsg(mtmp, mattk); if (uncancelled) { +/*JP pline("You're covered in frost!"); +*/ + You("氷で覆われた!"); if (Cold_resistance) { +/*JP pline_The("frost doesn't seem cold!"); +*/ + pline("氷は冷さを感じさせない!"); dmg = 0; } if((int) mtmp->m_lev > rn2(20)) @@ -1012,9 +1330,15 @@ case AD_ELEC: hitmsg(mtmp, mattk); if (uncancelled) { +/*JP You("get zapped!"); +*/ + You("電撃をくらった!"); if (Shock_resistance) { +/*JP pline_The("zap doesn't shock you!"); +*/ + pline("電撃はしびれを感じさせない!"); dmg = 0; } if((int) mtmp->m_lev > rn2(20)) @@ -1028,13 +1352,22 @@ if (uncancelled && multi >= 0 && !rn2(5)) { if (Sleep_resistance) break; fall_asleep(-rnd(10), TRUE); +/*JP if (Blind) You("are put to sleep!"); +*/ + if (Blind) You("眠りにおちた!"); +/*JP else You("are put to sleep by %s!", mon_nam(mtmp)); +*/ + else You("%sに眠らされた!", mon_nam(mtmp)); } break; case AD_BLND: if (can_blnd(mtmp, &youmonst, mattk->aatyp, (struct obj*)0)) { +/*JP if (!Blind) pline("%s blinds you!", Monnam(mtmp)); +*/ + if (!Blind) pline("%s攻撃で目が見えなくなった!", Monnam(mtmp)); make_blinded(Blinded+(long)dmg,FALSE); if (!Blind) Your(vision_clears); } @@ -1051,15 +1384,26 @@ dopois: hitmsg(mtmp, mattk); if (uncancelled && !rn2(8)) { +#if 0 /*JP*/ Sprintf(buf, "%s %s", s_suffix(Monnam(mtmp)), mpoisons_subj(mtmp, mattk)); +#else + Sprintf(buf, "%sの%s", + Monnam(mtmp), mpoisons_subj(mtmp, mattk)); +#endif +/*JP poisoned(buf, ptmp, mdat->mname, 30); +*/ + poisoned(buf, ptmp, jtrns_mon(mdat->mname), 30); } break; case AD_DRIN: hitmsg(mtmp, mattk); if (defends(AD_DRIN, uwep) || !has_head(youmonst.data)) { +/*JP You("don't seem harmed."); +*/ + You("傷ついていないようだ."); /* Not clear what to do for green slimes */ break; } @@ -1067,14 +1411,20 @@ if (uarmh && rn2(8)) { /* not body_part(HEAD) */ +/*JP Your("helmet blocks the attack to your head."); +*/ + Your("兜が頭への攻撃を防いだ."); break; } if (Half_physical_damage) dmg = (dmg+1) / 2; mdamageu(mtmp, dmg); if (!uarmh || uarmh->otyp != DUNCE_CAP) { +/*JP Your("brain is eaten!"); +*/ + Your("脳は食べられた!"); /* No such thing as mindless players... */ if (ABASE(A_INT) <= ATTRMIN(A_INT)) { int lifesaved = 0; @@ -1091,16 +1441,28 @@ /* explicitly chose not to die; arbitrarily boost intelligence */ ABASE(A_INT) = ATTRMIN(A_INT) + 2; +/*JP You_feel("like a scarecrow."); +*/ + You("かかしのような気持がした."); break; } } if (lifesaved) +/*JP pline("Unfortunately your brain is still gone."); +*/ + pline("残念ながらあなたには脳がない."); else +/*JP Your("last thought fades away."); +*/ + Your("最後の思いが走馬燈のように横ぎった."); +/*JP killer = "brainlessness"; +*/ + killer = "脳を失って"; killer_format = KILLED_BY; done(DIED); lifesaved++; @@ -1117,10 +1479,19 @@ hitmsg(mtmp, mattk); if (uncancelled && multi >= 0 && !rn2(3)) { if (Free_action) { +/*JP You("momentarily stiffen."); +*/ + You("一瞬硬直した."); } else { +/*JP if (Blind) You("are frozen!"); +*/ + if (Blind) You("動けない!"); +/*JP else You("are frozen by %s!", mon_nam(mtmp)); +*/ + else pline("%sによって動けなくなった!", mon_nam(mtmp)); nomovemsg = 0; /* default: "you can move again" */ nomul(-rnd(10)); exercise(A_DEX, FALSE); @@ -1130,12 +1501,18 @@ case AD_DRLI: hitmsg(mtmp, mattk); if (uncancelled && !rn2(3) && !Drain_resistance) { +/*JP losexp("life drainage"); +*/ + losexp("生命力を吸収されて"); } break; case AD_LEGS: { register long side = rn2(2) ? RIGHT_SIDE : LEFT_SIDE; +/*JP const char *sidestr = (side == RIGHT_SIDE) ? "right" : "left"; +*/ + const char *sidestr = (side == RIGHT_SIDE) ? "右" : "左"; /* This case is too obvious to ignore, but Nethack is not in * general very good at considering height--most short monsters @@ -1147,29 +1524,53 @@ u.usteed || #endif Levitation || Flying) { +#if 0 /*JP*/ pline("%s tries to reach your %s %s!", Monnam(mtmp), sidestr, body_part(LEG)); +#else + pline("%sはあなたの%s%sに攻撃しようとした!", Monnam(mtmp), + sidestr, body_part(LEG)); +#endif dmg = 0; } else if (mtmp->mcan) { +#if 0 /*JP*/ pline("%s nuzzles against your %s %s!", Monnam(mtmp), sidestr, body_part(LEG)); +#else + pline("%sはあなたの%s%sに鼻をすりよせた!", Monnam(mtmp), + sidestr, body_part(LEG)); +#endif dmg = 0; } else { if (uarmf) { if (rn2(2) && (uarmf->otyp == LOW_BOOTS || uarmf->otyp == IRON_SHOES)) +#if 0 /*JP*/ pline("%s pricks the exposed part of your %s %s!", Monnam(mtmp), sidestr, body_part(LEG)); +#else + pline("%sはあなたの%s%sをちくりと刺した!", + Monnam(mtmp), sidestr, body_part(LEG)); +#endif else if (!rn2(5)) +/*JP pline("%s pricks through your %s boot!", +*/ + pline("%sはあなたの%sの靴をちくりと刺した!", Monnam(mtmp), sidestr); else { +/*JP pline("%s scratches your %s boot!", Monnam(mtmp), +*/ + pline("%sはあなたの%sの靴をひっかいた!", Monnam(mtmp), sidestr); dmg = 0; break; } +/*JP } else pline("%s pricks your %s %s!", Monnam(mtmp), +*/ + } else pline("%sはあなたの%s%sをちくりと刺した!", Monnam(mtmp), sidestr, body_part(LEG)); set_wounded_legs(side, rnd(60-ACURR(A_DEX))); exercise(A_STR, FALSE); @@ -1182,10 +1583,16 @@ if(!rn2(3)) { if (mtmp->mcan) { if (flags.soundok) +/*JP You_hear("a cough from %s!", mon_nam(mtmp)); +*/ + You_hear("%sがゴホッゴホッという音を聞いた!", mon_nam(mtmp)); } else { if (flags.soundok) +/*JP You_hear("%s hissing!", s_suffix(mon_nam(mtmp))); +*/ + You_hear("%sがシューッという声を聞いた!", mon_nam(mtmp)); if(!rn2(10) || (flags.moonphase == NEW_MOON && !have_lizard())) { do_stone: @@ -1193,7 +1600,10 @@ && !(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))) { Stoned = 5; +/*JP delayed_killer = mtmp->data->mname; +*/ + delayed_killer = jtrns_mon(mtmp->data->mname); if (mtmp->data->geno & G_UNIQ) { if (!type_is_pname(mtmp->data)) { static char kbuf[BUFSZ]; @@ -1223,7 +1633,10 @@ if (u_slip_free(mtmp, mattk)) { dmg = 0; } else { +/*JP pline("%s swings itself around you!", +*/ + pline("%sはあなたに身体を絡みつかせた!", Monnam(mtmp)); u.ustuck = mtmp; } @@ -1236,19 +1649,34 @@ !Is_medusa_level(&u.uz) && !Is_waterlevel(&u.uz); +/*JP pline("%s drowns you...", Monnam(mtmp)); +*/ + pline("あなたは%sに絡みつかれて溺れた...", Monnam(mtmp)); killer_format = KILLED_BY_AN; +#if 0 /*JP*/ Sprintf(buf, "%s by %s", moat ? "moat" : "pool of water", an(mtmp->data->mname)); +#else + Sprintf(buf, "%sの%sに絡みつかれて", + moat ? "堀" : "池", + jtrns_mon(mtmp->data->mname)); +#endif killer = buf; done(DROWNING); } else if(mattk->aatyp == AT_HUGS) +/*JP You("are being crushed."); +*/ + You("押しつぶされた."); } else { dmg = 0; if(flags.verbose) +/*JP pline("%s brushes against your %s.", Monnam(mtmp), +*/ + pline("%sはあなたの%sに触れた.", Monnam(mtmp), body_part(LEG)); } } else dmg = 0; @@ -1258,7 +1686,10 @@ if (uncancelled && !rn2(4) && u.ulycn == NON_PM && !Protection_from_shape_changers && !defends(AD_WERE,uwep)) { +/*JP You_feel("feverish."); +*/ + You("熱があるような気がした."); exercise(A_CON, FALSE); u.ulycn = monsndx(mdat); } @@ -1280,17 +1711,30 @@ || dmgtype(youmonst.data, AD_SSEX) #endif ) { +#if 0 /*JP*/ pline("%s %s.", Monnam(mtmp), mtmp->minvent ? "brags about the goods some dungeon explorer provided" : "makes some remarks about how difficult theft is lately"); +#else + pline("%sは%s.", Monnam(mtmp), mtmp->minvent ? + "ある迷宮の冒険家が置いてった品物を自慢した" : + "窃盗がいかに困難か淡々と述べた"); +#endif if (!tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); return 3; } else if (mtmp->mcan) { if (!Blind) { +#if 0 /*JP*/ pline("%s tries to %s you, but you seem %s.", Adjmonnam(mtmp, "plain"), flags.female ? "charm" : "seduce", flags.female ? "unaffected" : "uninterested"); +#else + pline("%sはあなたを%sしようとした,しかしあなたは%s.", + Adjmonnam(mtmp, "地味な"), + flags.female ? "魅了" : "誘惑", + flags.female ? "影響をうけない" : "興味がない"); +#endif } if(rn2(3)) { if (!tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); @@ -1309,10 +1753,16 @@ (void) rloc(mtmp, FALSE); if (is_animal(mtmp->data) && *buf) { if (canseemon(mtmp)) +#if 0 /*JP*/ pline("%s tries to %s away with %s.", Monnam(mtmp), locomotion(mtmp->data, "run"), buf); +#else + pline("%sは%sを持って逃げ出した.", + Monnam(mtmp), + buf); +#endif } monflee(mtmp, 0, FALSE, FALSE); return 3; @@ -1339,7 +1789,10 @@ hitmsg(mtmp, mattk); if (uncancelled) { if(flags.verbose) +/*JP Your("position suddenly seems very uncertain!"); +*/ + pline("自分のいる位置が突然不明確になった!"); tele(); } break; @@ -1347,7 +1800,10 @@ hitmsg(mtmp, mattk); if (mtmp->mcan) break; if (u.umonnum == PM_IRON_GOLEM) { +/*JP You("rust!"); +*/ + You("錆びついた!"); /* KMH -- this is okay with unchanging */ rehumanize(); break; @@ -1364,7 +1820,10 @@ if (mtmp->mcan) break; if (u.umonnum == PM_WOOD_GOLEM || u.umonnum == PM_LEATHER_GOLEM) { +/*JP You("rot!"); +*/ + You("腐った!"); /* KMH -- this is okay with unchanging */ rehumanize(); break; @@ -1383,7 +1842,10 @@ #endif && !uarm && !uarmh && !uarms && !uarmg && !uarmc && !uarmf) { boolean goaway = FALSE; +/*JP pline("%s hits! (I hope you don't mind.)", Monnam(mtmp)); +*/ + pline("%sの攻撃は命中した.(気にしないように.)", Monnam(mtmp)); if (Upolyd) { u.mh += rnd(7); if (!rn2(7)) { @@ -1418,7 +1880,10 @@ } else { if (Role_if(PM_HEALER)) { if (flags.soundok && !(moves % 5)) +/*JP verbalize("Doc, I can't help you unless you cooperate."); +*/ + verbalize("ドクター!協力をおねがいしますわ."); dmg = 0; } else hitmsg(mtmp, mattk); } @@ -1428,11 +1893,19 @@ if(!night() && mdat == &mons[PM_GREMLIN]) break; if(!mtmp->mcan && !rn2(10)) { if (flags.soundok) { +#if 0 /*JP*/ if (Blind) You_hear("laughter."); else pline("%s chuckles.", Monnam(mtmp)); +#else + if (Blind) You_hear("笑い声を聞いた."); + else pline("%sはクスクス笑った.", Monnam(mtmp)); +#endif } if (u.umonnum == PM_CLAY_GOLEM) { +/*JP pline("Some writing vanishes from your head!"); +*/ + pline("いくつかの文字があなたの頭から消えた!"); /* KMH -- this is okay with unchanging */ rehumanize(); break; @@ -1451,10 +1924,16 @@ hitmsg(mtmp, mattk); if (!mtmp->mcan && !rn2(3)) if (Acid_resistance) { +/*JP pline("You're covered in acid, but it seems harmless."); +*/ + pline("酸で覆われた.しかし傷つかない."); dmg = 0; } else { +/*JP pline("You're covered in acid! It burns!"); +*/ + You("酸で覆われ焼けた!"); exercise(A_STR, FALSE); } else dmg = 0; @@ -1476,46 +1955,73 @@ if(!mtmp->mcan && !rn2(4) && !mtmp->mspec_used) { mtmp->mspec_used = mtmp->mspec_used + (dmg + rn2(6)); if(Confusion) +/*JP You("are getting even more confused."); +*/ + You("ますます混乱した."); +/*JP else You("are getting confused."); +*/ + else You("混乱してきた."); make_confused(HConfusion + dmg, FALSE); } dmg = 0; break; case AD_DETH: +/*JP pline("%s reaches out with its deadly touch.", Monnam(mtmp)); +*/ + pline("%sは死の腕をのばした.", Monnam(mtmp)); if (is_undead(youmonst.data)) { /* Still does normal damage */ +/*JP pline("Was that the touch of death?"); +*/ + pline("今のは死の宣告だったのかな?"); break; } switch (rn2(20)) { case 19: case 18: case 17: if (!Antimagic) { killer_format = KILLED_BY_AN; +/*JP killer = "touch of death"; +*/ + killer = "死の宣告で"; done(DIED); dmg = 0; break; } /* else FALLTHRU */ default: /* case 16: ... case 5: */ +/*JP You_feel("your life force draining away..."); +*/ + You("体力が奪われていくような気がした..."); permdmg = 1; /* actual damage done below */ break; case 4: case 3: case 2: case 1: case 0: if (Antimagic) shieldeff(u.ux, u.uy); +/*JP pline("Lucky for you, it didn't work!"); +*/ + pline("運のよいことになんともなかった!"); dmg = 0; break; } break; case AD_PEST: +/*JP pline("%s reaches out, and you feel fever and chills.", +*/ + pline("%sは腕をのばした,あなたは悪寒を感じた.", Monnam(mtmp)); (void) diseasemu(mdat); /* plus the normal damage */ break; case AD_FAMN: +/*JP pline("%s reaches out, and your body shrivels.", +*/ + pline("%sは腕を伸ばした,あなたの体はしなびた.", Monnam(mtmp)); exercise(A_CON, FALSE); if (!is_fainted()) morehungry(rn1(40,40)); @@ -1525,20 +2031,35 @@ hitmsg(mtmp, mattk); if (!uncancelled) break; if (flaming(youmonst.data)) { +/*JP pline_The("slime burns away!"); +*/ + pline_The("スライムは燃えた!"); dmg = 0; } else if (Unchanging || youmonst.data == &mons[PM_GREEN_SLIME]) { +/*JP You("are unaffected."); +*/ + You("影響を受けない."); dmg = 0; } else if (!Slimed) { +/*JP You("don't feel very well."); +*/ + You("気分が悪い."); Slimed = 10L; flags.botl = 1; killer_format = KILLED_BY_AN; +/*JP delayed_killer = mtmp->data->mname; +*/ + delayed_killer = jtrns_mon(mtmp->data->mname); } else +/*JP pline("Yuck!"); +*/ + pline("ウゲェー!"); break; case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */ hitmsg(mtmp, mattk); @@ -1548,7 +2069,10 @@ struct obj *obj = some_armor(&youmonst); if (drain_item(obj)) { +/*JP Your("%s less effective.", aobjnam(obj, "seem")); +*/ + Your("%sから魔力が消えた.", xname(obj)); } } break; @@ -1600,8 +2124,10 @@ *hpmax_p -= permdmg; else if (*hpmax_p > lowerlimit) *hpmax_p = lowerlimit; +#ifndef GCC_WARN else /* unlikely... */ ; /* already at or below minimum threshold; do nothing */ +#endif flags.botl = 1; } @@ -1650,25 +2176,40 @@ * like horses for now :-) */ Strcpy(buf, mon_nam(u.usteed)); +/*JP pline ("%s lunges forward and plucks you off %s!", +*/ + pline ("%sは突進しあなたを%sから引き落した!", Monnam(mtmp), buf); dismount_steed(DISMOUNT_ENGULFED); } else #endif +/*JP pline("%s engulfs you!", Monnam(mtmp)); +*/ + pline("%sはあなたを飲みこんだ!", Monnam(mtmp)); stop_occupation(); reset_occupations(); /* behave as if you had moved */ if (u.utrap) { +#if 0 /*JP*/ You("are released from the %s!", u.utraptype==TT_WEB ? "web" : "trap"); +#else + You("%sから解放された!", + u.utraptype==TT_WEB ? "くもの巣" : "罠"); +#endif u.utrap = 0; } i = number_leashed(); if (i > 0) { +#if 0 /*JP*/ const char *s = (i > 1) ? "leashes" : "leash"; pline_The("%s %s loose.", s, vtense(s, "snap")); +#else + pline("紐はパチンと切れた."); +#endif unleash_all(); } @@ -1703,44 +2244,76 @@ u.uswldtim = 0; tmp = 0; } else if (u.uswldtim == 0) { +/*JP pline("%s totally digests you!", Monnam(mtmp)); +*/ + pline("%sはあなたを完全に消化した!", Monnam(mtmp)); tmp = u.uhp; if (Half_physical_damage) tmp *= 2; /* sorry */ } else { +#if 0 /*JP*/ pline("%s%s digests you!", Monnam(mtmp), (u.uswldtim == 2) ? " thoroughly" : (u.uswldtim == 1) ? " utterly" : ""); +#else + pline("%sはあなたを%s消化している!", Monnam(mtmp), + (u.uswldtim == 2) ? " 徹底的に" : + (u.uswldtim == 1) ? " 完全に" : ""); +#endif exercise(A_STR, FALSE); } break; case AD_PHYS: if (mtmp->data == &mons[PM_FOG_CLOUD]) { +#if 0 /*JP:T*/ You("are laden with moisture and %s", flaming(youmonst.data) ? "are smoldering out!" : Breathless ? "find it mildly uncomfortable." : amphibious(youmonst.data) ? "feel comforted." : "can barely breathe!"); +#else + You("湿気に苦しめられ,%s", + flaming(youmonst.data) ? "くすぶった!" : + Breathless ? "少々不快に感じた." : + amphibious(youmonst.data) ? "安らぎを感じた." : + "息をするのがやっとだ!"); +#endif /* NB: Amphibious includes Breathless */ if (Amphibious && !flaming(youmonst.data)) tmp = 0; } else { +/*JP You("are pummeled with debris!"); +*/ + You("瓦礫で痛めつけられた!"); exercise(A_STR, FALSE); } break; case AD_ACID: if (Acid_resistance) { +/*JP You("are covered with a seemingly harmless goo."); +*/ + You("ねばつくものでおおわれた."); tmp = 0; } else { +/*JP if (Hallucination) pline("Ouch! You've been slimed!"); +*/ + if (Hallucination) pline("げげん!あなたはぬるぬるだ!"); +/*JP else You("are covered in slime! It burns!"); +*/ + else You("べとべとになった.そして酸に焼かれた!"); exercise(A_STR, FALSE); } break; case AD_BLND: if (can_blnd(mtmp, &youmonst, mattk->aatyp, (struct obj*)0)) { if(!Blind) { +/*JP You_cant("see in here!"); +*/ + You("何も見えない!"); make_blinded((long)tmp,FALSE); if (!Blind) Your(vision_clears); } else @@ -1751,10 +2324,16 @@ break; case AD_ELEC: if(!mtmp->mcan && rn2(2)) { +/*JP pline_The("air around you crackles with electricity."); +*/ + pline("あなたの回りの空気は電気でピリピリしている."); if (Shock_resistance) { shieldeff(u.ux, u.uy); +/*JP You("seem unhurt."); +*/ + You("傷つかないようだ."); ugolemeffects(AD_ELEC,tmp); tmp = 0; } @@ -1764,20 +2343,32 @@ if(!mtmp->mcan && rn2(2)) { if (Cold_resistance) { shieldeff(u.ux, u.uy); +/*JP You_feel("mildly chilly."); +*/ + pline("ひんやりした."); ugolemeffects(AD_COLD,tmp); tmp = 0; +/*JP } else You("are freezing to death!"); +*/ + } else You("凍死しそうだ!"); } else tmp = 0; break; case AD_FIRE: if(!mtmp->mcan && rn2(2)) { if (Fire_resistance) { shieldeff(u.ux, u.uy); +/*JP You_feel("mildly hot."); +*/ + pline("ポカポカした."); ugolemeffects(AD_FIRE,tmp); tmp = 0; +/*JP } else You("are burning to a crisp!"); +*/ + } else You("燃えてカラカラになった!"); burn_away_slime(); } else tmp = 0; break; @@ -1795,14 +2386,25 @@ if (tmp) stop_occupation(); if (touch_petrifies(youmonst.data) && !resists_ston(mtmp)) { +#if 0 /*JP*/ pline("%s very hurriedly %s you!", Monnam(mtmp), is_animal(mtmp->data)? "regurgitates" : "expels"); +#else + pline("%sは慌ててあなたを%sした!", Monnam(mtmp), + is_animal(mtmp->data)? "吐き戻" : "排出"); +#endif expels(mtmp, mtmp->data, FALSE); } else if (!u.uswldtim || youmonst.data->msize >= MZ_HUGE) { +/*JP You("get %s!", is_animal(mtmp->data)? "regurgitated" : "expelled"); +*/ + You("%sされた!", is_animal(mtmp->data)? "吐き戻" : "排出"); if (flags.verbose && (is_animal(mtmp->data) || (dmgtype(mtmp->data, AD_DGST) && Slow_digestion))) +/*JP pline("Obviously %s doesn't like your taste.", mon_nam(mtmp)); +*/ + You("どうも%s好みの味じゃないようだ.", mon_nam(mtmp)); expels(mtmp, mtmp->data, FALSE); } return(1); @@ -1817,10 +2419,17 @@ if (mtmp->mcan) return(0); if (!ufound) +#if 0 /*JP*/ pline("%s explodes at a spot in %s!", canseemon(mtmp) ? Monnam(mtmp) : "It", levl[mtmp->mux][mtmp->muy].typ == WATER ? "empty water" : "thin air"); +#else + pline("%sは何もない%sで爆発した!", + canseemon(mtmp) ? Monnam(mtmp) : "何者か", + levl[mtmp->mux][mtmp->muy].typ == WATER ? + "水中" : "空間"); +#endif else { register int tmp = d((int)mattk->damn, (int)mattk->damd); register boolean not_affected = defends((int)mattk->adtyp, uwep); @@ -1840,10 +2449,16 @@ if (!not_affected) { if (ACURR(A_DEX) > rnd(20)) { +/*JP You("duck some of the blast."); +*/ + You("衝撃をさけた."); tmp = (tmp+1) / 2; } else { +/*JP if (flags.verbose) You("get blasted!"); +*/ + if (flags.verbose) You("衝撃をくらった!"); } if (mattk->adtyp == AD_FIRE) burn_away_slime(); if (Half_physical_damage) tmp = (tmp+1) / 2; @@ -1856,11 +2471,17 @@ if (!not_affected) { /* sometimes you're affected even if it's invisible */ if (mon_visible(mtmp) || (rnd(tmp /= 2) > u.ulevel)) { +/*JP You("are blinded by a blast of light!"); +*/ + You("まばゆい光に目がくらんだ!"); make_blinded((long)tmp, FALSE); if (!Blind) Your(vision_clears); } else if (flags.verbose) +/*JP You("get the impression it was not terribly bright."); +*/ + You("それは恐ろしくまぶしいというほどじゃないと思った."); } break; @@ -1872,9 +2493,15 @@ if (!not_affected) { boolean chg; if (!Hallucination) +/*JP You("are caught in a blast of kaleidoscopic light!"); +*/ + You("万華鏡の光に捕らえられた!"); chg = make_hallucinated(HHallucination + (long)tmp,FALSE,0L); +/*JP You("%s.", chg ? "are freaked out" : "seem unaffected"); +*/ + You("%s.", chg ? "酔いしれた" : "影響をうけなかった"); } break; @@ -1882,7 +2509,10 @@ break; } if (not_affected) { +/*JP You("seem unaffected by it."); +*/ + You("影響を受けないようだ."); ugolemeffects((int)mattk->adtyp, tmp); } } @@ -1897,14 +2527,24 @@ register struct monst *mtmp; register struct attack *mattk; { +#if 1 /*JP*/ + static char jbuf[BUFSZ]; +#endif switch(mattk->adtyp) { case AD_STON: if (mtmp->mcan || !mtmp->mcansee) { if (!canseemon(mtmp)) break; /* silently */ +#if 0 /*JP:T*/ pline("%s %s.", Monnam(mtmp), (mtmp->data == &mons[PM_MEDUSA] && mtmp->mcan) ? "doesn't look all that ugly" : "gazes ineffectually"); +#else + pline("%sは%s.", Monnam(mtmp), + (mtmp->data == &mons[PM_MEDUSA] && mtmp->mcan) ? + "それほど醜くないことに気がついた" : + "無意味ににらんだ"); +#endif break; } if (Reflecting && couldsee(mtmp->mx, mtmp->my) && @@ -1913,20 +2553,34 @@ boolean useeit = canseemon(mtmp); if (useeit) +/*JP (void) ureflects("%s gaze is reflected by your %s.", +*/ + (void) ureflects("%sのにらみは%sで反射された.", s_suffix(Monnam(mtmp))); if (mon_reflects(mtmp, !useeit ? (char *)0 : +/*JP "The gaze is reflected away by %s %s!")) +*/ + "にらみは%sの%sによって反射された!")) break; if (!m_canseeu(mtmp)) { /* probably you're invisible */ if (useeit) +#if 0 /*JP:T*/ pline( "%s doesn't seem to notice that %s gaze was reflected.", Monnam(mtmp), mhis(mtmp)); +#else + pline("にらみが反射していることに%sは気付いていないようだ.", + Monnam(mtmp)); +#endif break; } if (useeit) +/*JP pline("%s is turned to stone!", Monnam(mtmp)); +*/ + pline("%sは石になった!", Monnam(mtmp)); stoned = TRUE; killed(mtmp); @@ -1935,13 +2589,24 @@ } if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my) && !Stone_resistance) { +/*JP You("meet %s gaze.", s_suffix(mon_nam(mtmp))); +*/ + You("%sににらまれた.", s_suffix(mon_nam(mtmp))); stop_occupation(); if(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM)) break; +/*JP You("turn to stone..."); +*/ + You("石になった..."); killer_format = KILLED_BY; +#if 0 /*JP*/ killer = mtmp->data->mname; +#else + Sprintf(jbuf, "%sのにらみで", jtrns_mon(mons[PM_MEDUSA].mname)); + killer = jbuf; +#endif done(STONING); } break; @@ -1953,10 +2618,16 @@ mtmp->mspec_used = mtmp->mspec_used + (conf + rn2(6)); if(!Confusion) +/*JP pline("%s gaze confuses you!", +*/ + pline("%sのにらみであなたは混乱した!", s_suffix(Monnam(mtmp))); else +/*JP You("are getting more and more confused."); +*/ + You("ますます混乱した."); make_confused(HConfusion + conf, FALSE); stop_occupation(); } @@ -1968,7 +2639,10 @@ int stun = d(2,6); mtmp->mspec_used = mtmp->mspec_used + (stun + rn2(6)); +/*JP pline("%s stares piercingly at you!", Monnam(mtmp)); +*/ + pline("%sは冷いまなざしをあなたに向けた!", Monnam(mtmp)); make_stunned(HStun + stun, TRUE); stop_occupation(); } @@ -1978,7 +2652,10 @@ && distu(mtmp->mx,mtmp->my) <= BOLT_LIM*BOLT_LIM) { int blnd = d((int)mattk->damn, (int)mattk->damd); +/*JP You("are blinded by %s radiance!", +*/ + You("%sの光で目が見えなくなった!", s_suffix(mon_nam(mtmp))); make_blinded((long)blnd,FALSE); stop_occupation(); @@ -1995,10 +2672,16 @@ mtmp->mcansee && !mtmp->mspec_used && rn2(5)) { int dmg = d(2,6); +/*JP pline("%s attacks you with a fiery gaze!", Monnam(mtmp)); +*/ + pline("%sは炎のにらみ攻撃をしてきた!", Monnam(mtmp)); stop_occupation(); if (Fire_resistance) { +/*JP pline_The("fire doesn't feel hot!"); +*/ + pline("火はぜんぜん熱くない!"); dmg = 0; } burn_away_slime(); @@ -2018,7 +2701,10 @@ multi >= 0 && !rn2(5) && !Sleep_resistance) { fall_asleep(-rnd(10), TRUE); +/*JP pline("%s gaze makes you very sleepy...", +*/ + pline("%sのにらみであなたは眠くなった...", s_suffix(Monnam(mtmp))); } break; @@ -2080,16 +2766,26 @@ (is_acid ? obj->oeroded2 : obj->oeroded) < MAX_ERODE) { if (obj->greased || obj->oerodeproof || (obj->blessed && rn2(3))) { if (vis) +/*JP pline("Somehow, %s weapon is not affected.", +*/ + pline("どういうわけか,%sの武器は影響をうけない.", s_suffix(mon_nam(mon))); if (obj->greased && !rn2(2)) obj->greased = 0; } else { if (vis) +#if 0 /*JP*/ pline("%s %s%s!", s_suffix(Monnam(mon)), aobjnam(obj, (is_acid ? "corrode" : "rust")), (is_acid ? obj->oeroded2 : obj->oeroded) ? " further" : ""); +#else + pline("%sの%sは%s%s!", + Monnam(mon), xname(obj), + obj->oeroded ? "さらに" : "", + aobjnam(obj, (is_acid ? "腐食した" : "錆びた"))); +#endif if (is_acid) obj->oeroded2++; else obj->oeroded++; } @@ -2164,33 +2860,59 @@ char qbuf[QBUFSZ]; if (mon->mcan || mon->mspec_used) { +#if 0 /*JP*/ pline("%s acts as though %s has got a %sheadache.", Monnam(mon), mhe(mon), mon->mcan ? "severe " : ""); +#else + pline("%sは%s頭が痛いふりをした.", + Monnam(mon), + mon->mcan ? "ひどく" : ""); +#endif return 0; } if (unconscious()) { +/*JP pline("%s seems dismayed at your lack of response.", +*/ + pline("%sは返事がないので気が萎えたようだ.", Monnam(mon)); return 0; } +/*JP if (Blind) pline("It caresses you..."); +*/ + if (Blind) pline("何者かがあなたを抱きしめてる..."); +/*JP else You_feel("very attracted to %s.", mon_nam(mon)); +*/ + else You("%sに引きつけられてるような気がした.", mon_nam(mon)); for(ring = invent; ring; ring = nring) { nring = ring->nobj; if (ring->otyp != RIN_ADORNMENT) continue; if (fem) { if (rn2(20) < ACURR(A_CHA)) { +#if 0 /*JP*/ Sprintf(qbuf, "\"That %s looks pretty. May I have it?\"", safe_qbuf("",sizeof("\"That looks pretty. May I have it?\""), xname(ring), simple_typename(ring->otyp), "ring")); +#else + Sprintf(qbuf, "「なんて素敵な%sでしょう.わたしにくれません?」", + safe_qbuf("",sizeof("「なんて素敵なでしょう.わたしにくれません?」"), + xname(ring), simple_typename(ring->otyp), "指輪")); +#endif makeknown(RIN_ADORNMENT); if (yn(qbuf) == 'n') continue; +#if 0 /*JP*/ } else pline("%s decides she'd like your %s, and takes it.", Blind ? "She" : Monnam(mon), xname(ring)); +#else + } else pline("%sは%sがとても気にいって,それを取りあげた.", + Blind ? "彼女" : Monnam(mon), xname(ring)); +#endif makeknown(RIN_ADORNMENT); if (ring==uleft || ring==uright) Ring_gone(ring); if (ring==uwep) setuwep((struct obj *)0); @@ -2206,36 +2928,69 @@ break; if (ring==uleft || ring==uright) continue; if (rn2(20) < ACURR(A_CHA)) { +#if 0 /*JP*/ Sprintf(qbuf,"\"That %s looks pretty. Would you wear it for me?\"", safe_qbuf("", sizeof("\"That looks pretty. Would you wear it for me?\""), xname(ring), simple_typename(ring->otyp), "ring")); +#else + Sprintf(qbuf,"「おやなんてすばらしい%sだ.私のために指にはめてくれないかい?」", + safe_qbuf("", + sizeof("「おやなんてすばらしいだ.私のために指にはめてくれないかい?」"), + xname(ring), simple_typename(ring->otyp), "指輪")); +#endif makeknown(RIN_ADORNMENT); if (yn(qbuf) == 'n') continue; } else { +#if 0 /*JP*/ pline("%s decides you'd look prettier wearing your %s,", Blind ? "He" : Monnam(mon), xname(ring)); pline("and puts it on your finger."); +#else + pline("%sは%sをつけたあなたがより魅力的だと考え,", + Blind ? "彼" : Monnam(mon), xname(ring)); + pline("あなたの指にそれをはめた."); +#endif } makeknown(RIN_ADORNMENT); if (!uright) { +#if 0 /*JP*/ pline("%s puts %s on your right %s.", Blind ? "He" : Monnam(mon), the(xname(ring)), body_part(HAND)); +#else + pline("%sは%sをあなたの右%sにはめた.", + Blind ? "彼" : Monnam(mon), the(xname(ring)), body_part(HAND)); +#endif setworn(ring, RIGHT_RING); } else if (!uleft) { +#if 0 /*JP*/ pline("%s puts %s on your left %s.", Blind ? "He" : Monnam(mon), the(xname(ring)), body_part(HAND)); +#else + pline("%sは%sをあなたの左%sにはめた.", + Blind ? "彼" : Monnam(mon), the(xname(ring)), body_part(HAND)); +#endif setworn(ring, LEFT_RING); } else if (uright && uright->otyp != RIN_ADORNMENT) { Strcpy(buf, xname(uright)); +#if 0 /*JP*/ pline("%s replaces your %s with your %s.", Blind ? "He" : Monnam(mon), buf, xname(ring)); +#else + pline("%sは%sを%sにとりかえた.", + Blind ? "彼" : Monnam(mon), buf, xname(ring)); +#endif Ring_gone(uright); setworn(ring, RIGHT_RING); } else if (uleft && uleft->otyp != RIN_ADORNMENT) { Strcpy(buf, xname(uleft)); +#if 0 /*JP*/ pline("%s replaces your %s with your %s.", Blind ? "He" : Monnam(mon), buf, xname(ring)); +#else + pline("%sは%sを%sにとりかえた.", + Blind ? "彼" : Monnam(mon), buf, xname(ring)); +#endif Ring_gone(uleft); setworn(ring, LEFT_RING); } else impossible("ring replacement"); @@ -2249,27 +3004,59 @@ && !uarmu #endif ) +#if 0 /*JP*/ pline("%s murmurs sweet nothings into your ear.", Blind ? (fem ? "She" : "He") : Monnam(mon)); +#else + pline("%sはあなたの耳もとで甘いささやきをつぶやいた.", + Blind ? (fem ? "彼女" : "彼") : Monnam(mon)); +#endif else +#if 0 /*JP*/ pline("%s murmurs in your ear, while helping you undress.", Blind ? (fem ? "She" : "He") : Monnam(mon)); +#else + pline("%sは耳もとであなたの服を脱がせながらささやいた.", + Blind ? (fem ? "彼女" : "彼") : Monnam(mon)); +#endif mayberem(uarmc, cloak_simple_name(uarmc)); if(!uarmc) +/*JP mayberem(uarm, "suit"); +*/ + mayberem(uarm, "スーツ"); +/*JP mayberem(uarmf, "boots"); +*/ + mayberem(uarmf, "ブーツ"); if(!uwep || !welded(uwep)) +/*JP mayberem(uarmg, "gloves"); +*/ + mayberem(uarmg, "小手"); +/*JP mayberem(uarms, "shield"); +*/ + mayberem(uarms, "盾"); +/*JP mayberem(uarmh, "helmet"); +*/ + mayberem(uarmh, "兜"); #ifdef TOURIST if(!uarmc && !uarm) +/*JP mayberem(uarmu, "shirt"); +*/ + mayberem(uarmu, "シャツ"); #endif if (uarm || uarmc) { +#if 0 /*JP*/ verbalize("You're such a %s; I wish...", flags.female ? "sweet lady" : "nice guy"); +#else + verbalize( flags.female ? "チャーミングだ...といいのに" : "すてき...だといいのに"); +#endif if (!tele_restrict(mon)) (void) rloc(mon, FALSE); return 1; } @@ -2277,71 +3064,119 @@ adjalign(1); /* by this point you have discovered mon's identity, blind or not... */ +/*JP pline("Time stands still while you and %s lie in each other's arms...", +*/ + pline("あなたは%sと抱き合った,時が止まったように感じた...", noit_mon_nam(mon)); if (rn2(35) > ACURR(A_CHA) + ACURR(A_INT)) { /* Don't bother with mspec_used here... it didn't get tired! */ +/*JP pline("%s seems to have enjoyed it more than you...", +*/ + pline("%sはあなたよりずっと楽しんだようだ...", noit_Monnam(mon)); switch (rn2(5)) { +/*JP case 0: You_feel("drained of energy."); +*/ + case 0: You("体力が消耗したような気がした."); u.uen = 0; u.uenmax -= rnd(Half_physical_damage ? 5 : 10); exercise(A_CON, FALSE); if (u.uenmax < 0) u.uenmax = 0; break; +/*JP case 1: You("are down in the dumps."); +*/ + case 1: You("意気消沈した."); (void) adjattrib(A_CON, -1, TRUE); exercise(A_CON, FALSE); flags.botl = 1; break; +/*JP case 2: Your("senses are dulled."); +*/ + case 2: Your("五感は鈍った."); (void) adjattrib(A_WIS, -1, TRUE); exercise(A_WIS, FALSE); flags.botl = 1; break; case 3: if (!resists_drli(&youmonst)) { +/*JP You_feel("out of shape."); +*/ + You("くたびれた."); +/*JP losexp("overexertion"); +*/ + losexp("過労で"); } else { +/*JP You("have a curious feeling..."); +*/ + You("変な感じがした..."); } break; case 4: { int tmp; +/*JP You_feel("exhausted."); +*/ + You("疲れを感じた."); exercise(A_STR, FALSE); tmp = rn1(10, 6); if(Half_physical_damage) tmp = (tmp+1) / 2; +/*JP losehp(tmp, "exhaustion", KILLED_BY); +*/ + losehp(tmp, "精力の使いすぎで", KILLED_BY); break; } } } else { mon->mspec_used = rnd(100); /* monster is worn out */ +/*JP You("seem to have enjoyed it more than %s...", +*/ + You("%sよりも楽しんだ...", noit_mon_nam(mon)); switch (rn2(5)) { +/*JP case 0: You_feel("raised to your full potential."); +*/ + case 0: You("絶頂に達した!"); exercise(A_CON, TRUE); u.uen = (u.uenmax += rnd(5)); break; +/*JP case 1: You_feel("good enough to do it again."); +*/ + case 1: You("まだできると思った."); (void) adjattrib(A_CON, 1, TRUE); exercise(A_CON, TRUE); flags.botl = 1; break; +/*JP case 2: You("will always remember %s...", noit_mon_nam(mon)); +*/ + case 2: You("いつまでも%sを覚えてるだろう...", mon_nam(mon)); (void) adjattrib(A_WIS, 1, TRUE); exercise(A_WIS, TRUE); flags.botl = 1; break; +/*JP case 3: pline("That was a very educational experience."); +*/ + case 3: pline("とても貴重な経験だった."); pluslvl(FALSE); exercise(A_WIS, TRUE); break; +/*JP case 4: You_feel("restored to health!"); +*/ + case 4: You("とても健康になった!"); u.uhp = u.uhpmax; if (Upolyd) u.mh = u.mhmax; exercise(A_STR, TRUE); @@ -2352,12 +3187,22 @@ if (mon->mtame) /* don't charge */ ; else if (rn2(20) < ACURR(A_CHA)) { +#if 0 /*JP*/ pline("%s demands that you pay %s, but you refuse...", noit_Monnam(mon), Blind ? (fem ? "her" : "him") : mhim(mon)); +#else + pline("%sはあなたに金を払うよう要求した,しかしあなたは拒んだ...", + Monnam(mon)); +#endif } else if (u.umonnum == PM_LEPRECHAUN) +#if 0 /*JP*/ pline("%s tries to take your money, but fails...", noit_Monnam(mon)); +#else + pline("%sは金を取ろうとしたが,失敗した...", + noit_Monnam(mon)); +#endif else { #ifndef GOLDOBJ long cost; @@ -2371,9 +3216,16 @@ if (!cost) cost = 1L; } if (cost > u.ugold) cost = u.ugold; +/*JP if (!cost) verbalize("It's on the house!"); +*/ + if (!cost) verbalize("これはおごり%s!",fem ? "よ" : "さ"); else { +#if 0 /*JP*/ pline("%s takes %ld %s for services rendered!", +#else + pline("%sはサービス料として%ld%s奪い取った!", +#endif noit_Monnam(mon), cost, currency(cost)); u.ugold -= cost; mon->mgold += cost; @@ -2392,9 +3244,16 @@ if (!cost) cost = 1L; } if (cost > umoney) cost = umoney; +/*JP if (!cost) verbalize("It's on the house!"); +*/ + if (!cost) verbalize("これはおごり%s!", fem ? "よ" : "さ"); else { +#if 0 /*JP*/ pline("%s takes %ld %s for services rendered!", +#else + pline("%sはサービス料として%ld%s奪い取った!", +#endif noit_Monnam(mon), cost, currency(cost)); money2mon(mon, cost); flags.botl = 1; @@ -2416,15 +3275,28 @@ if (!obj || !obj->owornmask) return; if (rn2(20) < ACURR(A_CHA)) { +#if 0 /*JP*/ Sprintf(qbuf,"\"Shall I remove your %s, %s?\"", str, (!rn2(2) ? "lover" : !rn2(2) ? "dear" : "sweetheart")); +#else + Sprintf(qbuf,"「%sを取っていい,%s?」", + str, + (!rn2(2) ? "ねぇ" : flags.female ? "ハニー" : "ダーリン" )); +#endif if (yn(qbuf) == 'n') return; } else { char hairbuf[BUFSZ]; +#if 0 /*JP*/ Sprintf(hairbuf, "let me run my fingers through your %s", body_part(HAIR)); +#else + Sprintf(hairbuf, + flags.female ? "なんて綺麗な%sなんだ" : "兜を取ったらなかなかイカスじゃない", + body_part(HAIR)); +#endif +#if 0 /*JP*/ verbalize("Take off your %s; %s.", str, (obj == uarm) ? "let's get a little closer" : (obj == uarmc || obj == uarms) ? "it's in the way" : @@ -2435,6 +3307,18 @@ #endif /* obj == uarmh */ hairbuf); +#else /*JP*/ + verbalize("%sを脱いで...%s.", str, + (obj == uarm) ? "ちょっと寄りそって" : + (obj == uarmc || obj == uarms) ? "そうそう" : + (obj == uarmf) ?(flags.female ? "綺麗な足だね" : "うふっ,たくましい足ね") : + (obj == uarmg) ?(flags.female ? "なんて素敵な手だ" : "たくましい腕ね") : +#ifdef TOURIST + (obj == uarmu) ?(flags.female ? "きれいな体だ" : "たくましいのね") : +#endif + /* obj == uarmh */ + hairbuf); +#endif /*JP*/ } remove_worn_item(obj, TRUE); } @@ -2469,9 +3353,15 @@ switch(olduasmon->mattk[i].adtyp) { case AD_ACID: if (!rn2(2)) { +/*JP pline("%s is splashed by your acid!", Monnam(mtmp)); +*/ + pline("%sはあなたの酸をくらった!", Monnam(mtmp)); if (resists_acid(mtmp)) { +/*JP pline("%s is not affected.", Monnam(mtmp)); +*/ + pline("%sは影響をうけない.", Monnam(mtmp)); tmp = 0; } } else tmp = 0; @@ -2493,7 +3383,10 @@ mon_to_stone(mtmp); return (1); } +/*JP pline("%s turns to stone!", Monnam(mtmp)); +*/ + pline("%sは石になった!", Monnam(mtmp)); stoned = 1; xkilled(mtmp, 0); if (mtmp->mhp > 0) return 1; @@ -2516,7 +3409,10 @@ if (rn2(3)) switch(youmonst.data->mattk[i].adtyp) { case AD_PHYS: if (youmonst.data->mattk[i].aatyp == AT_BOOM) { +/*JP You("explode!"); +*/ + pline("あなたは爆発した!"); /* KMH, balance patch -- this is okay with unchanging */ rehumanize(); goto assess_dmg; @@ -2529,20 +3425,36 @@ if (mtmp->mcansee && haseyes(mtmp->data) && rn2(3) && (perceives(mtmp->data) || !Invis)) { if (Blind) +#if 0 /*JP*/ pline("As a blind %s, you cannot defend yourself.", youmonst.data->mname); +#else + pline("%sは目が見えないので,防御できない.", + jtrns_mon_gen(youmonst.data->mname, flags.female)); +#endif else { +#if 0 /*JP*/ if (mon_reflects(mtmp, "Your gaze is reflected by %s %s.")) +#else + if (mon_reflects(mtmp, + "あなたのにらみは%sの%sで反射した.")) +#endif return 1; +/*JP pline("%s is frozen by your gaze!", Monnam(mtmp)); +*/ + pline("%sはあなたのにらみで動けなくなった!", Monnam(mtmp)); mtmp->mcanmove = 0; mtmp->mfrozen = tmp; return 3; } } } else { /* gelatinous cube */ +/*JP pline("%s is frozen by you.", Monnam(mtmp)); +*/ + pline("%sは動けない.", Monnam(mtmp)); mtmp->mcanmove = 0; mtmp->mfrozen = tmp; return 3; @@ -2551,12 +3463,18 @@ case AD_COLD: /* Brown mold or blue jelly */ if (resists_cold(mtmp)) { shieldeff(mtmp->mx, mtmp->my); +/*JP pline("%s is mildly chilly.", Monnam(mtmp)); +*/ + pline("%sは冷えた.", Monnam(mtmp)); golemeffects(mtmp, AD_COLD, tmp); tmp = 0; break; } +/*JP pline("%s is suddenly very cold!", Monnam(mtmp)); +*/ + pline("%sは突然凍りづけになった!", Monnam(mtmp)); u.mh += tmp / 2; if (u.mhmax < u.mh) u.mhmax = u.mh; if (u.mhmax > ((youmonst.data->mlevel+1) * 8)) @@ -2565,30 +3483,50 @@ case AD_STUN: /* Yellow mold */ if (!mtmp->mstun) { mtmp->mstun = 1; +#if 0 /*JP*/ pline("%s %s.", Monnam(mtmp), makeplural(stagger(mtmp->data, "stagger"))); +#else + pline("%sはくらくらした.", Monnam(mtmp)); +#endif } tmp = 0; break; case AD_FIRE: /* Red mold */ if (resists_fire(mtmp)) { shieldeff(mtmp->mx, mtmp->my); +#if 0 /*JP*/ pline("%s is mildly warm.", Monnam(mtmp)); +#else + pline("%sは暖かくなった.", Monnam(mtmp)); +#endif golemeffects(mtmp, AD_FIRE, tmp); tmp = 0; break; } +#if 0 /*JP*/ pline("%s is suddenly very hot!", Monnam(mtmp)); +#else + pline("%sは突然熱くなった!", Monnam(mtmp)); +#endif break; case AD_ELEC: if (resists_elec(mtmp)) { shieldeff(mtmp->mx, mtmp->my); +#if 0 /*JP*/ pline("%s is slightly tingled.", Monnam(mtmp)); +#else + pline("%sはちょっとピリピリした.", Monnam(mtmp)); +#endif golemeffects(mtmp, AD_ELEC, tmp); tmp = 0; break; } +#if 0 /*JP*/ pline("%s is jolted with your electricity!", Monnam(mtmp)); +#else + pline("%sは電気ショックをうけた!", Monnam(mtmp)); +#endif break; default: tmp = 0; break; @@ -2597,7 +3535,10 @@ assess_dmg: if((mtmp->mhp -= tmp) <= 0) { +/*JP pline("%s dies!", Monnam(mtmp)); +*/ + pline("%sは死んだ!", Monnam(mtmp)); xkilled(mtmp,0); if (mtmp->mhp > 0) return 1; return 2; diff -aurbN -xCVS -xXTAGS nethack/src/minion.c jnethack/src/minion.c --- nethack/src/minion.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/minion.c 2003-12-25 01:06:56.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "emin.h" #include "epri.h" @@ -126,10 +133,19 @@ mon = makemon(&mons[mnum], u.ux, u.uy, NO_MM_FLAGS); if (mon) { if (talk) { +/*JP pline_The("voice of %s booms:", align_gname(alignment)); +*/ + pline("%sの声が響いた:", align_gname(alignment)); +/*JP verbalize("Thou shalt pay for thy indiscretion!"); +*/ + verbalize("汝,無分別なる行いの罰を受けるべし!"); if (!Blind) +/*JP pline("%s appears before you.", Amonnam(mon)); +*/ + pline("%sがあなたの前に現われた.", Amonnam(mon)); } mon->mpeaceful = FALSE; /* don't call set_malign(); player was naughty */ @@ -145,7 +161,10 @@ long cash, demand, offer; if (uwep && uwep->oartifact == ART_EXCALIBUR) { +/*JP pline("%s looks very angry.", Amonnam(mtmp)); +*/ + pline("%sはとても怒っているように見える.", Amonnam(mtmp)); mtmp->mpeaceful = mtmp->mtame = 0; set_malign(mtmp); newsym(mtmp->mx, mtmp->my); @@ -155,12 +174,20 @@ /* Slight advantage given. */ if (is_dprince(mtmp->data) && mtmp->minvis) { mtmp->minvis = mtmp->perminvis = 0; +/*JP if (!Blind) pline("%s appears before you.", Amonnam(mtmp)); +*/ + if (!Blind) pline("%sが目の前に現われた.", Amonnam(mtmp)); newsym(mtmp->mx,mtmp->my); } if (youmonst.data->mlet == S_DEMON) { /* Won't blackmail their own. */ +#if 0 /*JP*/ pline("%s says, \"Good hunting, %s.\"", Amonnam(mtmp), flags.female ? "Sister" : "Brother"); +#else + pline("%sは言った「よう兄%s!」.そして消えた.", + Amonnam(mtmp), flags.female ? "妹" : "弟"); +#endif if (!tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); return(1); } @@ -183,17 +210,30 @@ if (mon_has_amulet(mtmp)) demand = cash + (long)rn1(1000,40); +#if 0 /*JP*/ pline("%s demands %ld %s for safe passage.", +#else + pline("%sは通行料として%ld%s要求した.", +#endif Amonnam(mtmp), demand, currency(demand)); if ((offer = bribe(mtmp)) >= demand) { +/*JP pline("%s vanishes, laughing about cowardly mortals.", +*/ + pline("臆病な定命のものを笑いながら,%sは消えた.", Amonnam(mtmp)); } else if (offer > 0L && (long)rnd(40) > (demand - offer)) { +/*JP pline("%s scowls at you menacingly, then vanishes.", +*/ + pline("%sはあなたを威嚇し,消えた.", Amonnam(mtmp)); } else { +/*JP pline("%s gets angry...", Amonnam(mtmp)); +*/ + pline("%sは怒った...", Amonnam(mtmp)); mtmp->mpeaceful = 0; set_malign(mtmp); return 0; @@ -213,33 +253,54 @@ long umoney = money_cnt(invent); #endif +/*JP getlin("How much will you offer?", buf); +*/ + getlin("お金をいくら与える?", buf); if (sscanf(buf, "%ld", &offer) != 1) offer = 0L; /*Michael Paddon -- fix for negative offer to monster*/ /*JAR880815 - */ if (offer < 0L) { +/*JP You("try to shortchange %s, but fumble.", +*/ + You("%sをだまそうとしたが,失敗した.", mon_nam(mtmp)); return 0L; } else if (offer == 0L) { +/*JP You("refuse."); +*/ + You("拒んだ."); return 0L; #ifndef GOLDOBJ } else if (offer >= u.ugold) { +/*JP You("give %s all your gold.", mon_nam(mtmp)); +*/ + You("%sにお金を全て与えた.", mon_nam(mtmp)); offer = u.ugold; } else { +/*JP You("give %s %ld %s.", mon_nam(mtmp), offer, currency(offer)); +*/ + You("%sに%ld%s与えた.", mon_nam(mtmp), offer, currency(offer)); } u.ugold -= offer; mtmp->mgold += offer; #else } else if (offer >= umoney) { +/*JP You("give %s all your gold.", mon_nam(mtmp)); +*/ + You("%sにお金を全て与えた.", mon_nam(mtmp)); offer = umoney; } else { +/*JP You("give %s %ld %s.", mon_nam(mtmp), offer, currency(offer)); +*/ + You("%sに%ld%s与えた.", mon_nam(mtmp), offer, currency(offer)); } (void) money2mon(mtmp, offer); #endif diff -aurbN -xCVS -xXTAGS nethack/src/mklev.c jnethack/src/mklev.c --- nethack/src/mklev.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/mklev.c 2003-12-10 03:31:40.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" /* #define DEBUG */ /* uncomment to enable code debugging */ @@ -453,7 +460,10 @@ (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, /* 14..16: trap door, teleport, level-teleport */ +/*JP "Vlad was here", "ad aerarium", "ad aerarium", +*/ + "ヴラドはここにいる", "ad aerarium", "ad aerarium", (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, }; @@ -1392,7 +1402,10 @@ } while (occupied(m.x, m.y) || bydoor(m.x, m.y)); /* Put a grave at m.x, m.y */ +/*JP make_grave(m.x, m.y, dobell ? "Saved by the bell!" : (char *) 0); +*/ + make_grave(m.x, m.y, dobell ? "ベルに救われた!" : (char *) 0); /* Possibly fill it with objects */ if (!rn2(3)) (void) mkgold(0L, m.x, m.y); @@ -1430,8 +1443,14 @@ xchar ymin = inv_pos.y, ymax = inv_pos.y; register xchar i; +/*JP pline_The("floor shakes violently under you!"); +*/ + pline("あなたの下の床が突然揺れた!"); +/*JP pline_The("walls around you begin to bend and crumble!"); +*/ + pline("そしてまわりの壁がねじれ,砕けた!"); display_nhwindow(WIN_MESSAGE, TRUE); mkinvpos(xmin, ymin, 0); /* middle, before placing stairs */ @@ -1458,7 +1477,10 @@ delay_output(); } +/*JP You("are standing at the top of a stairwell leading down!"); +*/ + You("下に続く吹き抜け階段の上に立っている!"); mkstairs(u.ux, u.uy, 0, (struct mkroom *)0); /* down */ newsym(u.ux, u.uy); vision_full_recalc = 1; /* everything changed */ diff -aurbN -xCVS -xXTAGS nethack/src/mkmaze.c jnethack/src/mkmaze.c --- nethack/src/mkmaze.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/mkmaze.c 2003-12-25 01:10:46.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "sp_lev.h" #include "lev.h" /* save & restore info */ @@ -1084,7 +1091,10 @@ u.dx = dx; eff = TRUE; } +/*JP if (eff) pline("Water turbulence affects your movements."); +*/ + if (eff) pline("水の流れがあなたの動きに影響を与えた."); } void @@ -1156,20 +1166,38 @@ ltyp = lev->typ; if (is_lava(x,y)) +/*JP return "lava"; +*/ + return "溶岩"; else if (ltyp == ICE || (ltyp == DRAWBRIDGE_UP && (levl[x][y].drawbridgemask & DB_UNDER) == DB_ICE)) +/*JP return "ice"; +*/ + return "氷"; else if (((ltyp != POOL) && (ltyp != WATER) && !Is_medusa_level(&u.uz) && !Is_waterlevel(&u.uz) && !Is_juiblex_level(&u.uz)) || (ltyp == DRAWBRIDGE_UP && (levl[x][y].drawbridgemask & DB_UNDER) == DB_MOAT)) +/*JP return "moat"; +*/ + return "堀"; else if ((ltyp != POOL) && (ltyp != WATER) && Is_juiblex_level(&u.uz)) +/*JP return "swamp"; +*/ + return "沼"; else if (ltyp == POOL) +/*JP return "pool of water"; +*/ + return "水たまり"; +/*JP else return "water"; +*/ + else return "水中"; } STATIC_OVL void diff -aurbN -xCVS -xXTAGS nethack/src/mon.c jnethack/src/mon.c --- nethack/src/mon.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/mon.c 2005-06-08 01:40:31.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + /* If you're using precompiled headers, you don't want this either */ #ifdef MICROPORT_BUG #define MKROOM_H @@ -38,7 +45,10 @@ int lastwarnlev; const char *warnings[] = { +/*JP "white", "pink", "red", "ruby", "purple", "black" +*/ + "白い","ピンク色の","赤い","ルビー色の","紫の","黒い" }; STATIC_DCL void NDECL(warn_effects); @@ -203,7 +213,10 @@ case PM_BLACK_UNICORN: if (mtmp->mrevived && rn2(20)) { if (canseemon(mtmp)) +/*JP pline("%s recently regrown horn crumbles to dust.", +*/ + pline("最近再生した%sの角は粉々になった.", s_suffix(Monnam(mtmp))); } else (void) mksobj_at(UNICORN_HORN, x, y, TRUE, FALSE); @@ -333,8 +346,13 @@ if (warnlevel == 100) { if(!Blind && uwep && (warnlevel > lastwarnlev || moves > lastwarntime + warnDelay)) { +#if 0 /*JP*/ Your("%s %s!", aobjnam(uwep, "glow"), hcolor(NH_LIGHT_BLUE)); +#else + Your("%sは%s輝いた!", xname(uwep), + jconj_adj(hcolor(NH_LIGHT_BLUE))); +#endif lastwarnlev = warnlevel; lastwarntime = moves; } @@ -350,24 +368,52 @@ long rings = (EWarning & (LEFT_RING|RIGHT_RING)); if (rings) { +/*JP what = Hallucination ? "mood ring" : "ring"; +*/ + what = Hallucination ? "左手の流行の指輪" : "左手の指輪"; +#if 0 /*JP*/ how = "glows"; /* singular verb */ +#else + how = "輝いた"; /* singular verb */ +#endif if (rings == LEFT_RING) { +/*JP which = "left "; +*/ + which = "左"; } else if (rings == RIGHT_RING) { +/*JP which = "right "; +*/ + which = "右"; } else { /* both */ which = ""; what = (const char *) makeplural(what); +#if 0 /*JP*/ how = "glow"; /* plural verb */ +#endif } +#if 0 /*JP*/ Your("%s%s %s %s!", which, what, how, hcolor(warnings[warnlevel])); +#else + Your("%sの%sは%s%s!", which, what, + jconj_adj(hcolor(warnings[warnlevel])), how); +#endif } else { if (Hallucination) +/*JP Your("spider-sense is tingling..."); +*/ + Your("クモ的感覚はピリピリした..."); else +#if 0 /*JP*/ You_feel("apprehensive as you sense a %s flash.", warnings[warnlevel]); +#else + You("%s光を感じ,とても不安に思った.", + warnings[warnlevel]); +#endif } lastwarntime = moves; @@ -408,7 +454,10 @@ } else if (mtmp->data == &mons[PM_IRON_GOLEM] && inpool && !rn2(5)) { int dam = d(2,6); if (cansee(mtmp->mx,mtmp->my)) +/*JP pline("%s rusts.", Monnam(mtmp)); +*/ + pline("%sは錆びた.", Monnam(mtmp)); mtmp->mhp -= dam; if (mtmp->mhpmax > dam) mtmp->mhpmax -= dam; if (mtmp->mhp < 1) { @@ -428,19 +477,31 @@ if (!is_clinger(mtmp->data) && !likes_lava(mtmp->data)) { if (!resists_fire(mtmp)) { if (cansee(mtmp->mx,mtmp->my)) +#if 0 /*JP*/ pline("%s %s.", Monnam(mtmp), mtmp->data == &mons[PM_WATER_ELEMENTAL] ? "boils away" : "burns to a crisp"); +#else + pline("%sは%sた.", Monnam(mtmp), + mtmp->data == &mons[PM_WATER_ELEMENTAL] ? + "沸騰し" : "燃えてパリパリになっ"); +#endif mondead(mtmp); } else { if (--mtmp->mhp < 1) { if (cansee(mtmp->mx,mtmp->my)) +/*JP pline("%s surrenders to the fire.", Monnam(mtmp)); +*/ + pline("%sは炎に呑まれた.", Monnam(mtmp)); mondead(mtmp); } else if (cansee(mtmp->mx,mtmp->my)) +/*JP pline("%s burns slightly.", Monnam(mtmp)); +*/ + pline("%sはちょっと焦げた.", Monnam(mtmp)); } if (mtmp->mhp > 0) { (void) fire_damage(mtmp->minvent, FALSE, FALSE, @@ -458,13 +519,21 @@ if (!is_clinger(mtmp->data) && !is_swimmer(mtmp->data) && !amphibious(mtmp->data)) { if (cansee(mtmp->mx,mtmp->my)) { +/*JP pline("%s drowns.", Monnam(mtmp)); +*/ + pline("%sは溺れた.", Monnam(mtmp)); } if (u.ustuck && u.uswallow && u.ustuck == mtmp) { /* This can happen after a purple worm plucks you off a flying steed while you are over water. */ +#if 0 /*JP:T*/ pline("%s sinks as water rushes in and flushes you out.", Monnam(mtmp)); +#else + pline("%sは水流に沈み.あなたを吐き出した.", + Monnam(mtmp)); +#endif } mondead(mtmp); if (mtmp->mhp > 0) { @@ -677,25 +746,44 @@ touch_artifact(otmp,mtmp)) { if (mtmp->data == &mons[PM_RUST_MONSTER] && otmp->oerodeproof) { if (canseemon(mtmp) && flags.verbose) { +#if 0 /*JP*/ pline("%s eats %s!", Monnam(mtmp), distant_name(otmp,doname)); +#else + pline("%sは%sを食べている!", + Monnam(mtmp), + distant_name(otmp,doname)); +#endif } /* The object's rustproofing is gone now */ otmp->oerodeproof = 0; mtmp->mstun = 1; if (canseemon(mtmp) && flags.verbose) { +#if 0 /*JP*/ pline("%s spits %s out in disgust!", Monnam(mtmp), distant_name(otmp,doname)); +#else + pline("%sは%sをペッと吐き出した!", + Monnam(mtmp), distant_name(otmp,doname)); +#endif } /* KMH -- Don't eat indigestible/choking objects */ } else if (otmp->otyp != AMULET_OF_STRANGULATION && otmp->otyp != RIN_SLOW_DIGESTION) { if (cansee(mtmp->mx,mtmp->my) && flags.verbose) +#if 0 /*JP*/ pline("%s eats %s!", Monnam(mtmp), distant_name(otmp,doname)); +#else + pline("%sは%sを食べている!", Monnam(mtmp), + distant_name(otmp,doname)); +#endif else if (flags.soundok && flags.verbose) +/*JP You_hear("a crunching sound."); +*/ + You_hear("バリバリと食べる音を聞いた."); mtmp->meating = otmp->owt/2 + 1; /* Heal up to the object's weight in hp */ if (mtmp->mhp < mtmp->mhpmax) { @@ -726,7 +814,10 @@ ptr = mtmp->data; } else if (!resists_ston(mtmp)) { if (canseemon(mtmp)) +/*JP pline("%s turns to stone!", Monnam(mtmp)); +*/ + pline("%sは石になった!", Monnam(mtmp)); monstone(mtmp); ptr = (struct permonst *)0; } @@ -773,10 +864,16 @@ continue; ++count; if (cansee(mtmp->mx,mtmp->my) && flags.verbose) +/*JP pline("%s eats %s!", Monnam(mtmp), +*/ + pline("%sは%sを食べている!", Monnam(mtmp), distant_name(otmp, doname)); else if (flags.soundok && flags.verbose) +/*JP You_hear("a slurping sound."); +*/ + You_hear("ごくんと飲み込む音を聞いた."); /* Heal up to the object's weight in hp */ if (mtmp->mhp < mtmp->mhpmax) { mtmp->mhp += objects[otmp->otyp].oc_weight; @@ -815,10 +912,16 @@ otmp != uball && otmp != uchain) { ++ecount; if (ecount == 1) { +/*JP Sprintf(buf, "%s engulfs %s.", Monnam(mtmp), +*/ + Sprintf(buf, "%sは%sを飲み込んだ.", Monnam(mtmp), distant_name(otmp,doname)); } else if (ecount == 2) +/*JP Sprintf(buf, "%s engulfs several objects.", Monnam(mtmp)); +*/ + Sprintf(buf, "%sはいくつかの物を飲み込んだ.", Monnam(mtmp)); obj_extract_self(otmp); (void) mpickobj(mtmp, otmp); /* slurp */ } @@ -829,9 +932,13 @@ if (cansee(mtmp->mx, mtmp->my) && flags.verbose && buf[0]) pline("%s", buf); else if (flags.soundok && flags.verbose) +#if 0 /*JP*/ You_hear("%s slurping sound%s.", ecount == 1 ? "a" : "several", ecount == 1 ? "" : "s"); +#else + You_hear("ズルズルという音を聞いた."); +#endif } return ((count > 0) || (ecount > 0)) ? 1 : 0; } @@ -854,8 +961,12 @@ #endif if (cansee(mtmp->mx, mtmp->my) ) { if (flags.verbose && !mtmp->isgd) +#if 0 /*JP*/ pline("%s picks up some %s.", Monnam(mtmp), mat_idx == GOLD ? "gold" : "money"); +#else + pline("%sはお金を拾った.", Monnam(mtmp)); +#endif newsym(mtmp->mx, mtmp->my); } } @@ -890,7 +1001,10 @@ if (otmp->oinvis && !perceives(mtmp->data)) continue; #endif if (cansee(mtmp->mx,mtmp->my) && flags.verbose) +/*JP pline("%s picks up %s.", Monnam(mtmp), +*/ + pline("%sは%sを拾った.", Monnam(mtmp), (distu(mtmp->mx, mtmp->my) <= 5) ? doname(otmp) : distant_name(otmp, doname)); obj_extract_self(otmp); @@ -1380,16 +1494,33 @@ /* Nor do you check invisibility, because glowing and disinte- */ /* grating amulets are always visible. */ if (cansee(mtmp->mx, mtmp->my)) { +/*JP pline("But wait..."); +*/ + pline("しかし..."); +#if 0 /*JP*/ pline("%s medallion begins to glow!", s_suffix(Monnam(mtmp))); +#else + pline("%sのメダリオンが輝きはじめた!", + Monnam(mtmp)); +#endif makeknown(AMULET_OF_LIFE_SAVING); if (attacktype(mtmp->data, AT_EXPL) || attacktype(mtmp->data, AT_BOOM)) +/*JP pline("%s reconstitutes!", Monnam(mtmp)); +*/ + pline("%sは再構成された!", Monnam(mtmp)); else +/*JP pline("%s looks much better!", Monnam(mtmp)); +*/ + pline("%sはすっかり回復したようだ!", Monnam(mtmp)); +/*JP pline_The("medallion crumbles to dust!"); +*/ + pline_The("メダリオンはこなごなにくだけてしまった!"); } m_useup(mtmp, lifesave); mtmp->mcanmove = 1; @@ -1401,7 +1532,10 @@ mtmp->mhp = mtmp->mhpmax; if (mvitals[monsndx(mtmp->data)].mvflags & G_GENOD) { if (cansee(mtmp->mx, mtmp->my)) +/*JP pline("Unfortunately %s is still genocided...", +*/ + pline("しかし%sは虐殺されている...", mon_nam(mtmp)); } else return; @@ -1498,7 +1632,10 @@ if (mdat == &mons[PM_VLAD_THE_IMPALER] || mdat->mlet == S_LICH) { if (cansee(mon->mx, mon->my) && !was_swallowed) +/*JP pline("%s body crumbles into dust.", s_suffix(Monnam(mon))); +*/ + pline("%sの体は粉々になった.", Monnam(mon)); return FALSE; } @@ -1513,28 +1650,49 @@ else tmp = 0; if (was_swallowed && magr) { if (magr == &youmonst) { +/*JP There("is an explosion in your %s!", +*/ + pline("%sの中で爆発が起きた!", body_part(STOMACH)); +#if 0 /*JP*/ Sprintf(killer_buf, "%s explosion", s_suffix(mdat->mname)); +#else + Sprintf(killer_buf, "%sの爆発で", + jtrns_mon(mdat->mname)); +#endif if (Half_physical_damage) tmp = (tmp+1) / 2; losehp(tmp, killer_buf, KILLED_BY_AN); } else { +/*JP if (flags.soundok) You_hear("an explosion."); +*/ + if (flags.soundok) You_hear("爆発音を聞いた."); magr->mhp -= tmp; if (magr->mhp < 1) mondied(magr); if (magr->mhp < 1) { /* maybe lifesaved */ if (canspotmon(magr)) +/*JP pline("%s rips open!", Monnam(magr)); +*/ + pline("%sはビリっと破れた!", Monnam(magr)); } else if (canseemon(magr)) +/*JP pline("%s seems to have indigestion.", +*/ + pline("%sは消化不良のようだ.", Monnam(magr)); } return FALSE; } +#if 0 /*JP*/ Sprintf(killer_buf, "%s explosion", s_suffix(mdat->mname)); +#else + Sprintf(killer_buf, "%sの爆発で", jtrns_mon(mdat->mname)); +#endif killer = killer_buf; killer_format = KILLED_BY_AN; explode(mon->mx, mon->my, -1, tmp, MON_EXPLODE, EXPL_NOXIOUS); @@ -1628,7 +1786,10 @@ (obj->otyp == STATUE && mons[obj->corpsenm].msize >= mdef->data->msize) || #endif obj_resists(obj, 0, 0)) { +/*JP if (flooreffects(obj, x, y, "fall")) continue; +*/ + if (flooreffects(obj, x, y, "落ちる")) continue; place_object(obj, x, y); } else { if (obj->lamplit) end_burn(obj, TRUE); @@ -1673,9 +1834,15 @@ mondead(mdef); if (wasinside) { if (is_animal(mdef->data)) +#if 0 /*JP*/ You("%s through an opening in the new %s.", locomotion(youmonst.data, "jump"), xname(otmp)); +#else + You("新しくできた%sから%s.", + xname(otmp), + jumpedthrough(youmonst.data, "飛び出た")); +#endif } } @@ -1690,11 +1857,22 @@ if ((mdef->wormno ? worm_known(mdef) : cansee(mdef->mx, mdef->my)) && fltxt) +#if 0 /*JP*/ pline("%s is %s%s%s!", Monnam(mdef), nonliving(mdef->data) ? "destroyed" : "killed", *fltxt ? " by the " : "", fltxt ); +#else + { + if( *fltxt ) + pline("%sは%sによって%s!", Monnam(mdef), fltxt, + nonliving(mdef->data) ? "倒された" : "殺された"); + else + pline("%sは%s!", Monnam(mdef), + nonliving(mdef->data) ? "倒された" : "殺された"); + } +#endif else be_sad = (mdef->mtame != 0); @@ -1705,7 +1883,10 @@ mondied(mdef); if (be_sad && mdef->mhp <= 0) +/*JP You("have a sad feeling for a moment, then it passes."); +*/ + You("悲しい気持におそわれたが,すぐに過ぎさった."); } void @@ -1756,11 +1937,17 @@ u.uconduct.killer++; if (dest & 1) { +/*JP const char *verb = nonliving(mtmp->data) ? "destroy" : "kill"; +*/ if (!wasinside && !canspotmon(mtmp)) +/*JP You("%s it!", verb); +*/ + You("何者かを倒した!"); else { +#if 0 /*JP*/ You("%s %s!", verb, !mtmp->mtame ? mon_nam(mtmp) : x_monnam(mtmp, @@ -1768,6 +1955,11 @@ "poor", mtmp->mnamelth ? SUPPRESS_SADDLE : 0, FALSE)); +#else + You("%s%sを倒した!", + mtmp->mtame ? "かわいそうな" : "", + mon_nam(mtmp)); +#endif } } @@ -1795,7 +1987,10 @@ * appears). */ stoned = FALSE; +/*JP if (!cansee(x,y)) pline("Maybe not..."); +*/ + if (!cansee(x,y)) pline("いや,違うかも..."); return; } @@ -1858,7 +2053,10 @@ u.ualign.type != A_CHAOTIC) { HTelepat &= ~INTRINSIC; change_luck(-2); +/*JP You("murderer!"); +*/ + You("殺人鬼だ!"); if (Blind && !Blind_telepat) see_monsters(); /* Can't sense monsters any more. */ } @@ -1866,7 +2064,10 @@ if (is_unicorn(mdat) && sgn(u.ualign.type) == sgn(mdat->maligntyp)) { change_luck(-5); +/*JP You_feel("guilty..."); +*/ + You("罪を感じた..."); } /* give experience points */ @@ -1877,14 +2078,24 @@ /* adjust alignment points */ if (mtmp->m_id == quest_status.leader_m_id) { /* REAL BAD! */ adjalign(-(u.ualign.record+(int)ALIGNLIM/2)); +#if 0 /*JP*/ pline("That was %sa bad idea...", u.uevent.qcompleted ? "probably " : ""); +#else + pline("%sよくない行為だった...", + u.uevent.qcompleted ? "たぶん" : ""); +#endif } else if (mdat->msound == MS_NEMESIS) /* Real good! */ adjalign((int)(ALIGNLIM/4)); else if (mdat->msound == MS_GUARDIAN) { /* Bad */ adjalign(-(int)(ALIGNLIM/8)); +#if 0 /*JP*/ if (!Hallucination) pline("That was probably a bad idea..."); else pline("Whoopsie-daisy!"); +#else + if (!Hallucination) pline("よくない行為だった..."); + else pline("シンジマッター!"); +#endif }else if (mtmp->ispriest) { adjalign((p_coaligned(mtmp)) ? -2 : 2); /* cancel divine protection for killing your priest */ @@ -1894,8 +2105,13 @@ } else if (mtmp->mtame) { adjalign(-15); /* bad!! */ /* your god is mighty displeased... */ +#if 0 /*JP*/ if (!Hallucination) You_hear("the rumble of distant thunder..."); else You_hear("the studio audience applaud!"); +#else + if (!Hallucination) You_hear("遠くで雷鳴を聞いた..."); + else pline("聴衆の喝采を浴びた!"); +#endif } else if (mtmp->mpeaceful) adjalign(-5); @@ -1912,13 +2128,22 @@ if(mtmp->data->mlet == S_GOLEM) { /* it's a golem, and not a stone golem */ if(canseemon(mtmp)) +/*JP pline("%s solidifies...", Monnam(mtmp)); +*/ + pline("%sは凝固した...", Monnam(mtmp)); if (newcham(mtmp, &mons[PM_STONE_GOLEM], FALSE, FALSE)) { if(canseemon(mtmp)) +/*JP pline("Now it's %s.", an(mtmp->data->mname)); +*/ + pline("なんと%sになってしまった.", a_monnam(mtmp)); } else { if(canseemon(mtmp)) +/*JP pline("... and returns to normal."); +*/ + pline("...そして普通に戻った."); } } else impossible("Can't polystone %s!", a_monnam(mtmp)); @@ -1996,9 +2221,15 @@ static const char *poiseff[] = { +#if 0 /*JP*/ " feel weaker", "r brain is on fire", "r judgement is impaired", "r muscles won't obey you", " feel very sick", " break out in hives" +#else + "とても衰弱した", "頭に血がのぼった", + "判断力を失った", "思うように動けない", + "とても気分が悪い", "じんましんがあらわれた" +#endif }; void @@ -2006,7 +2237,10 @@ int typ; { +/*JP pline("You%s.", poiseff[typ]); +*/ + You("%s.", poiseff[typ]); } void @@ -2014,24 +2248,47 @@ const char *string, *pname; int typ, fatal; { +#if 0 /*JP*/ int i, plural, kprefix = KILLED_BY_AN; +#else + int i, kprefix = KILLED_BY_AN; +#endif boolean thrown_weapon = (fatal < 0); if (thrown_weapon) fatal = -fatal; +#if 0 /*JP*/ if(strcmp(string, "blast") && !thrown_weapon) { +#else + if((strcmp(string, "blast") && strcmp(string,"風") + && strcmp(string,"息")) && !thrown_weapon) { +#endif +#if 0 /*JP*/ /* 'blast' has already given a 'poison gas' message */ /* so have "poison arrow", "poison dart", etc... */ plural = (string[strlen(string) - 1] == 's')? 1 : 0; /* avoid "The" Orcus's sting was poisoned... */ pline("%s%s %s poisoned!", isupper(*string) ? "" : "The ", string, plural ? "were" : "was"); +#else /*JP*/ + pline("%sは毒におかされている!",string); +#endif } if(Poison_resistance) { +#if 0 /*JP*/ if(!strcmp(string, "blast")) shieldeff(u.ux, u.uy); +#else + if(!strcmp(string, "blast") || !strcmp(string,"息") || + !strcmp(string,"風")) + shieldeff(u.ux, u.uy); +#endif +/*JP pline_The("poison doesn't seem to affect you."); +*/ + pline("毒は効かなかったようだ."); return; } +#if 0 /*JP*//*日本語では不要*/ /* suppress killer prefix if it already has one */ if ((i = name_to_mon(pname)) >= LOW_PM && mons[i].geno & G_UNIQ) { kprefix = KILLED_BY; @@ -2042,24 +2299,43 @@ /*[ does this need a plural check too? ]*/ kprefix = KILLED_BY; } +#endif i = rn2(fatal + 20*thrown_weapon); if(i == 0 && typ != A_CHA) { u.uhp = -1; +/*JP pline_The("poison was deadly..."); +*/ + pline("毒は致死量だった..."); } else if(i <= 5) { /* Check that a stat change was made */ if (adjattrib(typ, thrown_weapon ? -1 : -rn1(3,3), 1)) +/*JP pline("You%s!", poiseff[typ]); +*/ + You("%s!", poiseff[typ]); } else { i = thrown_weapon ? rnd(6) : rn1(10,6); if(Half_physical_damage) i = (i+1) / 2; +#if 0 /*JP*/ losehp(i, pname, kprefix); +#else + { + char jbuf[BUFSZ]; + Sprintf(jbuf, "%sの攻撃で", pname); + losehp(i, jbuf, kprefix); + } +#endif } if(u.uhp < 1) { killer_format = kprefix; killer = pname; +#if 0 /*JP*//*「毒針の毒で死んだ」はあり*/ /* "Poisoned by a poisoned ___" is redundant */ done(strstri(pname, "poison") ? DIED : POISONING); +#else + done(POISONING); +#endif } (void) encumber_msg(); } @@ -2072,7 +2348,10 @@ { if(mtmp->data->msound == MS_SHRIEK) { if(flags.soundok) { +/*JP pline("%s shrieks.", Monnam(mtmp)); +*/ + pline("%sは金切り声をあげた.", Monnam(mtmp)); stop_occupation(); } if (!rn2(10)) { @@ -2112,7 +2391,10 @@ adjalign(-1); /* attacking peaceful monsters is bad */ if (couldsee(mtmp->mx, mtmp->my)) { if (humanoid(mtmp->data) || mtmp->isshk || mtmp->isgd) +/*JP pline("%s gets angry!", Monnam(mtmp)); +*/ + pline("%sは怒った!", Monnam(mtmp)); else if (flags.verbose && flags.soundok) growl(mtmp); } @@ -2130,10 +2412,14 @@ if (canseemon(mon)) ++got_mad; } if (got_mad && !Hallucination) +#if 0 /*JP*/ pline_The("%s appear%s to be angry too...", got_mad == 1 ? q_guardian->mname : makeplural(q_guardian->mname), got_mad == 1 ? "s" : ""); +#else + pline("%sも怒った...", q_guardian->mname); +#endif } } @@ -2496,9 +2782,15 @@ if (!noncorporeal(mdat) && !amorphous(mdat) && !is_whirly(mdat) && (mdat != &mons[PM_YELLOW_LIGHT])) { +#if 0 /*JP*/ You("break out of %s%s!", mon_nam(mtmp), (is_animal(mdat)? "'s stomach" : "")); +#else + You("%s%sを破り出た!", mon_nam(mtmp), + (is_animal(mdat)? + "の胃袋" : "")); +#endif mtmp->mhp = 1; /* almost dead */ } expels(mtmp, olddata, FALSE); @@ -2530,16 +2822,25 @@ if (msg) { uchar save_mnamelth = mtmp->mnamelth; mtmp->mnamelth = 0; +#if 0 /*JP*/ pline("%s turns into %s!", oldname, mdat == &mons[PM_GREEN_SLIME] ? "slime" : x_monnam(mtmp, ARTICLE_A, (char*)0, SUPPRESS_SADDLE, FALSE)); +#else + pline("%sは%sになった!", oldname, + mdat == &mons[PM_GREEN_SLIME] ? "スライム" : + x_monnam(mtmp, ARTICLE_A, (char*)0, SUPPRESS_SADDLE, FALSE)); +#endif mtmp->mnamelth = save_mnamelth; } possibly_unwield(mtmp, polyspot); /* might lose use of weapon */ mon_break_armor(mtmp, polyspot); if (!(mtmp->misc_worn_check & W_ARMG)) +/*JP mselftouch(mtmp, "No longer petrify-resistant, ", +*/ + mselftouch(mtmp, "石化への抵抗力がなくなって,", !flags.mon_moving); m_dowear(mtmp, FALSE); @@ -2731,7 +3032,10 @@ mon->mhp += dam; if (mon->mhp > mon->mhpmax) mon->mhp = mon->mhpmax; if (cansee(mon->mx, mon->my)) +/*JP pline("%s seems healthier.", Monnam(mon)); +*/ + pline("%sは元気になったように見える.", Monnam(mon)); } } } @@ -2762,16 +3066,31 @@ } if(ct) { if(!silent) { /* do we want pline msgs? */ +#if 0 /*JP*/ if(slct) pline_The("guard%s wake%s up!", slct > 1 ? "s" : "", slct == 1 ? "s" : ""); +#else + if(slct) pline("番兵は目を覚ました!"); +#endif if(nct || sct) { +#if 0 /*JP*/ if(nct) pline_The("guard%s get%s angry!", nct == 1 ? "" : "s", nct == 1 ? "s" : ""); +#else + if(nct) pline("番兵は怒った!"); +#endif else if(!Blind) +#if 0 /*JP*/ You("see %sangry guard%s approaching!", sct == 1 ? "an " : "", sct > 1 ? "s" : ""); +#else + You("怒った番兵が近寄ってくるのが見えた!"); +#endif } else if(flags.soundok) +/*JP You_hear("the shrill sound of a guard's whistle."); +*/ + You("番兵の笛がけたたましく鳴るのが聞こえた."); } return(TRUE); } @@ -2805,9 +3124,15 @@ break; case M_AP_OBJECT: if (otyp == SPE_HEALING || otyp == SPE_EXTRA_HEALING) { +#if 0 /*JP*/ pline("%s seems a more vivid %s than before.", The(simple_typename(ap)), c_obj_colors[objects[ap].oc_color]); +#else + pline("%sは以前よりより鮮やかな%sになったようだ.", + The(simple_typename(ap)), + c_obj_colors[objects[ap].oc_color]); +#endif } break; } diff -aurbN -xCVS -xXTAGS nethack/src/mondata.c jnethack/src/mondata.c --- nethack/src/mondata.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/mondata.c 2004-07-27 17:06:38.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "eshk.h" #include "epri.h" @@ -664,6 +671,7 @@ else return(mtmp->data); } +#if 0 /*JP*/ static const char *levitate[4] = { "float", "Float", "wobble", "Wobble" }; static const char *flys[4] = { "fly", "Fly", "flutter", "Flutter" }; static const char *flyl[4] = { "fly", "Fly", "stagger", "Stagger" }; @@ -671,6 +679,15 @@ static const char *ooze[4] = { "ooze", "Ooze", "tremble", "Tremble" }; static const char *immobile[4] = { "wiggle", "Wiggle", "pulsate", "Pulsate" }; static const char *crawl[4] = { "crawl", "Crawl", "falter", "Falter" }; +#else +static const char *levitate[4] = { "浮く", "浮く", "よろめく", "よろめく" }; +static const char *flys[4] = { "飛ぶ", "飛ぶ", "はためく", "はためく" }; +static const char *flyl[4] = { "飛ぶ", "飛ぶ", "よろめく", "よろめく" }; +static const char *slither[4] = { "滑る", "滑る", "たじろぐ", "たじろぐ" }; +static const char *ooze[4] = { "にじみ出る", "にじみ出る", "震える", "震える" }; +static const char *immobile[4] = { "震える", "震える", "震える", "震える" }; +static const char *crawl[4] = { "はいずる", "はいずる", "たじろぐ", "たじろぐ" }; +#endif const char * locomotion(ptr, def) @@ -711,6 +728,28 @@ ); } +#if 1 /*JP*/ +static const char *levitate2 = "浮き出た"; +static const char *fly2 = "飛び出た"; +static const char *slither2 = "滑り出た"; +static const char *ooze2 = "にじみ出た"; +static const char *crawl2 = "はいずり出た"; + +const char * +jumpedthrough(ptr, def) +const struct permonst *ptr; +const char *def; +{ + return ( + is_floater(ptr) ? levitate2 : + is_flyer(ptr) ? fly2 : + slithy(ptr) ? slither2 : + amorphous(ptr) ? ooze2 : + nolimbs(ptr) ? crawl2 : + def + ); +} +#endif /* return a phrase describing the effect of fire attack on a type of monster */ const char * @@ -725,16 +764,25 @@ case PM_FIRE_VORTEX: case PM_FIRE_ELEMENTAL: case PM_SALAMANDER: +/*JP what = "already on fire"; +*/ + what = "すでに炎につつまれている"; break; case PM_WATER_ELEMENTAL: case PM_FOG_CLOUD: case PM_STEAM_VORTEX: +/*JP what = "boiling"; +*/ + what = "沸騰した"; break; case PM_ICE_VORTEX: case PM_GLASS_GOLEM: +/*JP what = "melting"; +*/ + what = "溶けた"; break; case PM_STONE_GOLEM: case PM_CLAY_GOLEM: @@ -743,10 +791,16 @@ case PM_EARTH_ELEMENTAL: case PM_DUST_VORTEX: case PM_ENERGY_VORTEX: +/*JP what = "heating up"; +*/ + what = "熱くなった"; break; default: +/*JP what = (mattk->aatyp == AT_HUGS) ? "being roasted" : "on fire"; +*/ + what = (mattk->aatyp == AT_HUGS) ? "丸焼けになった" : "火だるまになった"; break; } return what; diff -aurbN -xCVS -xXTAGS nethack/src/monmove.c jnethack/src/monmove.c --- nethack/src/monmove.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/monmove.c 2003-12-10 03:31:42.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "mfndpos.h" #include "artifact.h" @@ -25,9 +32,15 @@ { if (flags.verbose) { if (cansee(mtmp->mx, mtmp->my)) +/*JP pline("KABOOM!! You see a door explode."); +*/ + pline("ちゅどーん!ドアが爆発するのを見た."); else if (flags.soundok) +/*JP You_hear("a distant explosion."); +*/ + You_hear("遠方で爆発する音を聞いた."); } wake_nearto(mtmp->mx, mtmp->my, 7*7); mtmp->mstun = 1; @@ -59,12 +72,21 @@ if(couldsee(mtmp->mx, mtmp->my)) { +/*JP pline("%s yells:", Amonnam(mtmp)); +*/ + pline("%sは叫んだ:", Amonnam(mtmp)); if(levl[x][y].looted & D_WARNED) { +/*JP verbalize("Halt, thief! You're under arrest!"); +*/ + verbalize("待て!ぬすっと!おまえを逮捕する!"); (void) angry_guards(!(flags.soundok)); } else { +/*JP verbalize("Hey, stop picking that lock!"); +*/ + verbalize("おい,鍵を勝手に開けるんじゃない!"); levl[x][y].looted |= D_WARNED; } stop_occupation(); @@ -217,7 +239,11 @@ expels(mtmp, mtmp->data, TRUE); else if (!sticks(youmonst.data)) { unstuck(mtmp); /* monster lets go when fleeing */ +#if 0 /*JP*/ You("get released!"); +#else + You("解放された!"); +#endif } } @@ -232,7 +258,10 @@ mtmp->mfleetim = min(fleetime, 127); } if (!mtmp->mflee && fleemsg && canseemon(mtmp) && !mtmp->mfrozen) +/*JP pline("%s turns to flee!", (Monnam(mtmp))); +*/ + pline("%sはおびえて逃げ出した!", (Monnam(mtmp))); mtmp->mflee = 1; } } @@ -382,8 +411,13 @@ if(nearby && mdat->msound == MS_BRIBE && mtmp->mpeaceful && !mtmp->mtame && !u.uswallow) { if (mtmp->mux != u.ux || mtmp->muy != u.uy) { +#if 0 /*JP*/ pline("%s whispers at thin air.", cansee(mtmp->mux, mtmp->muy) ? Monnam(mtmp) : "It"); +#else + pline("%sがささやいた.", + cansee(mtmp->mux, mtmp->muy) ? Monnam(mtmp) : "何か"); +#endif if (is_demon(youmonst.data)) { /* "Good hunting, brother" */ @@ -391,7 +425,10 @@ } else { mtmp->minvis = mtmp->perminvis = 0; /* Why? For the same reason in real demon talk */ +/*JP pline("%s gets angry!", Amonnam(mtmp)); +*/ + pline("%sは怒った!", Amonnam(mtmp)); mtmp->mpeaceful = 0; /* since no way is an image going to pay it off */ } @@ -406,26 +443,47 @@ struct monst *m2, *nmon = (struct monst *)0; if (canseemon(mtmp)) +/*JP pline("%s concentrates.", Monnam(mtmp)); +*/ + pline("%sは精神を集中している.", Monnam(mtmp)); if (distu(mtmp->mx, mtmp->my) > BOLT_LIM * BOLT_LIM) { +/*JP You("sense a faint wave of psychic energy."); +*/ + You("サイコエネルギーの波動を感じた."); goto toofar; } +/*JP pline("A wave of psychic energy pours over you!"); +*/ + pline("あなたはサイコエネルギーの波動を浴びた!"); if (mtmp->mpeaceful && (!Conflict || resist(mtmp, RING_CLASS, 0, 0))) +/*JP pline("It feels quite soothing."); +*/ + pline("心がなごんだ."); else { register boolean m_sen = sensemon(mtmp); if (m_sen || (Blind_telepat && rn2(2)) || !rn2(10)) { int dmg; +#if 0 /*JP*/ pline("It locks on to your %s!", m_sen ? "telepathy" : Blind_telepat ? "latent telepathy" : "mind"); +#else + pline("それはあなたの%sを直撃した!", + m_sen ? "テレパシー能力" : + Blind_telepat ? "潜在能力" : "精神"); +#endif dmg = rnd(15); if (Half_spell_damage) dmg = (dmg+1) / 2; +/*JP losehp(dmg, "psychic blast", KILLED_BY_AN); +*/ + losehp(dmg, "サイコ攻撃で", KILLED_BY_AN); } } for(m2=fmon; m2; m2 = nmon) { @@ -437,7 +495,10 @@ if ((telepathic(m2->data) && (rn2(2) || m2->mblinded)) || !rn2(10)) { if (cansee(m2->mx, m2->my)) +/*JP pline("It locks on to %s.", mon_nam(m2)); +*/ + pline("%sを直撃した.", mon_nam(m2)); m2->mhp -= rnd(15); if (m2->mhp <= 0) monkilled(m2, "", AD_DRIN); @@ -578,7 +639,10 @@ register struct monst *mtmp; { if (sticks(youmonst.data) && mtmp==u.ustuck && !u.uswallow) { +/*JP pline("%s cannot escape from you!", Monnam(mtmp)); +*/ + pline("%sはあなたから逃げられない!", Monnam(mtmp)); return(TRUE); } return(FALSE); @@ -691,7 +755,10 @@ #ifdef MAIL if(ptr == &mons[PM_MAIL_DAEMON]) { if(flags.soundok && canseemon(mtmp)) +/*JP verbalize("I'm late!"); +*/ + verbalize("遅くなってすまない!"); mongone(mtmp); return(2); } @@ -1062,10 +1129,17 @@ if(here->doormask & (D_LOCKED|D_CLOSED) && amorphous(ptr)) { if (flags.verbose && canseemon(mtmp)) +#if 0 /*JP*/ pline("%s %s under the door.", Monnam(mtmp), (ptr == &mons[PM_FOG_CLOUD] || ptr == &mons[PM_YELLOW_LIGHT]) ? "flows" : "oozes"); +#else + pline("%sは扉の下から%s.", Monnam(mtmp), + (ptr == &mons[PM_FOG_CLOUD] || + ptr == &mons[PM_YELLOW_LIGHT]) + ? "流れでた" : "にじみでた"); +#endif } else if(here->doormask & D_LOCKED && can_unlock) { if(btrapped) { here->doormask = D_NODOOR; @@ -1075,9 +1149,15 @@ } else { if (flags.verbose) { if (canseeit) +/*JP You("see a door unlock and open."); +*/ + You("扉の鍵がはずれ,開くのが見えた."); else if (flags.soundok) +/*JP You_hear("a door unlock and open."); +*/ + You_hear("扉の鍵がはずれ,開く音を聞いた."); } here->doormask = D_ISOPEN; /* newsym(mtmp->mx, mtmp->my); */ @@ -1092,9 +1172,15 @@ } else { if (flags.verbose) { if (canseeit) +/*JP You("see a door open."); +*/ + You("扉が開くのが見えた."); else if (flags.soundok) +/*JP You_hear("a door open."); +*/ + You_hear("扉が開く音を聞いた."); } here->doormask = D_ISOPEN; /* newsym(mtmp->mx, mtmp->my); */ /* done below */ @@ -1110,9 +1196,15 @@ } else { if (flags.verbose) { if (canseeit) +/*JP You("see a door crash open."); +*/ + You("扉が破壊されるのを見た."); else if (flags.soundok) +/*JP You_hear("a door crash open."); +*/ + You_hear("扉が破壊される音を聞いた."); } if (here->doormask & D_LOCKED && !rn2(2)) here->doormask = D_NODOOR; @@ -1126,10 +1218,15 @@ } } else if (levl[mtmp->mx][mtmp->my].typ == IRONBARS) { if (flags.verbose && canseemon(mtmp)) +#if 0 /*JP*/ Norep("%s %s %s the iron bars.", Monnam(mtmp), /* pluralization fakes verb conjugation */ makeplural(locomotion(ptr, "pass")), passes_walls(ptr) ? "through" : "between"); +#else + Norep("%sは鉄の棒%sをすり抜けた.", Monnam(mtmp), + passes_walls(ptr) ? "" : "の間"); +#endif } /* possibly dig */ diff -aurbN -xCVS -xXTAGS nethack/src/mplayer.c jnethack/src/mplayer.c --- nethack/src/mplayer.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/mplayer.c 2003-12-10 03:31:42.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Izchak Miller, 1992. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" STATIC_DCL const char *NDECL(dev_name); @@ -34,6 +41,10 @@ "Helge", "Ron", "Timo", /* VMS team */ "Joshua", "Pat", +#if 1 /*JP*/ + /* Japanese team */ + "Issei", "Nao", "Mya", +#endif ""}; @@ -70,6 +81,9 @@ { boolean fmlkind = is_female(mtmp->data); const char *devnam; +#if 1 /*JP*/ + char tmp_nam[PL_NSIZ]; +#endif devnam = dev_name(); if (!devnam) @@ -82,10 +96,19 @@ mtmp->female = 1; else mtmp->female = 0; +#if 0 /*JP*/ Strcat(nam, " the "); Strcat(nam, rank_of((int)mtmp->m_lev, monsndx(mtmp->data), (boolean)mtmp->female)); +#else + Strcpy(tmp_nam, rank_of(rn1(11, 20), + highc(mtmp->data->mname[0]), + (boolean)mtmp->female)); + Strcat(tmp_nam, "の"); + Strcat(tmp_nam, nam); + Strcpy(nam, tmp_nam); +#endif } STATIC_OVL void @@ -319,6 +342,7 @@ mplayer_talk(mtmp) register struct monst *mtmp; { +#if 0 /*JP*/ static const char *same_class_msg[3] = { "I can't win, and neither will you!", "You don't deserve to win!", @@ -328,13 +352,46 @@ "Fight, scum!", "Here is what I have to say!", }; +#else + static const char *same_class_msg_f[3] = { + "私ですら達成できないのに,あなたに達成できて?", + "あなたが成功するなんてありえませんわ.", + "名誉は私に!あなたになんてとんでもない.", + }, *other_class_msg_f[3] = { + "私と話したいですって?", + "剣を取りなさい!", + "あなたと話すことなどありませんわ!", + }; + static const char *same_class_msg[3] = { + "私ですら達成できないのに,お前に達成できるのか?", + "お前が成功するなんてことはないな.", + "名誉を我に!お前じゃない!", + }, *other_class_msg[3] = { + "下衆が話しかけるか?ははーん?", + "戦え!この野郎!", + "お前と話すことなどなにもない!", + }; +#endif if(mtmp->mpeaceful) return; /* will drop to humanoid talk */ +#if 0 /*JP*/ pline("Talk? -- %s", (mtmp->data == &mons[urole.malenum] || mtmp->data == &mons[urole.femalenum]) ? same_class_msg[rn2(3)] : other_class_msg[rn2(3)]); +#else + if(mtmp->female) + pline("話す? -- %s", + (mtmp->data == &mons[urole.malenum] || + mtmp->data == &mons[urole.femalenum]) ? + same_class_msg_f[rn2(3)] : other_class_msg_f[rn2(3)]); + else + pline("話す? -- %s", + (mtmp->data == &mons[urole.malenum] || + mtmp->data == &mons[urole.femalenum]) ? + same_class_msg[rn2(3)] : other_class_msg[rn2(3)]); +#endif } /*mplayer.c*/ diff -aurbN -xCVS -xXTAGS nethack/src/mthrowu.c jnethack/src/mthrowu.c --- nethack/src/mthrowu.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/mthrowu.c 2004-12-04 03:37:44.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" STATIC_DCL int FDECL(drop_throw,(struct obj *,BOOLEAN_P,int,int)); @@ -20,6 +27,7 @@ * Keep consistent with breath weapons in zap.c, and AD_* in monattk.h. */ STATIC_OVL NEARDATA const char *breathwep[] = { +#if 0 /*JP*/ "fragments", "fire", "frost", @@ -30,6 +38,18 @@ "acid", "strange breath #8", "strange breath #9" +#else + "破片", + "炎", + "冷気", + "睡眠ガス", + "分解の息", + "稲妻", + "毒の息", + "酸", + "strange breath #8", + "strange breath #9" +#endif }; /* hero is hit by something other than a monster */ @@ -51,34 +71,62 @@ knm = strcpy(knmbuf, killer_xname(obj)); kprefix = KILLED_BY; /* killer_name supplies "an" if warranted */ } else { +#if 0 /*JP*/ knm = name; /* [perhaps ought to check for plural here to] */ if (!strncmpi(name, "the ", 4) || !strncmpi(name, "an ", 3) || !strncmpi(name, "a ", 2)) kprefix = KILLED_BY; +#else + knm = strcpy(knmbuf, name); +#endif } +#if 1 /*JP*/ + strcat(knmbuf, "に当たって"); +#endif onm = (obj && obj_is_pname(obj)) ? the(name) : (obj && obj->quan > 1L) ? name : an(name); is_acid = (obj && obj->otyp == ACID_VENOM); if(u.uac + tlev <= rnd(20)) { +/*JP if(Blind || !flags.verbose) pline("It misses."); +*/ + if(Blind || !flags.verbose) pline("それははずれた."); +/*JP else You("are almost hit by %s.", onm); +*/ + else pline("もう少しで%sに命中するところだった!",onm); return(0); } else { +/*JP if(Blind || !flags.verbose) You("are hit!"); +*/ + if(Blind || !flags.verbose) pline("何かがあなたに命中した!"); +/*JP else You("are hit by %s%s", onm, exclam(dam)); +*/ + else pline("%sがあなたに命中した!", onm); if (obj && objects[obj->otyp].oc_material == SILVER && hates_silver(youmonst.data)) { dam += rnd(20); +/*JP pline_The("silver sears your flesh!"); +*/ + pline("あなたの体は銀で焼かれた!"); exercise(A_CON, FALSE); } if (is_acid && Acid_resistance) +/*JP pline("It doesn't seem to hurt you."); +*/ + pline("あなたは傷つかなかった."); else { +/*JP if (is_acid) pline("It burns!"); +*/ + if (is_acid) pline("酸で焼かれた!"); if (Half_physical_damage) dam = (dam+1) / 2; losehp(dam, knm, kprefix); exercise(A_STR, FALSE); @@ -118,7 +166,11 @@ if (down_gate(x, y) != -1) objgone = ship_object(obj, x, y, FALSE); if (!objgone) { +#if 0 /*JP*/ if (!flooreffects(obj,x,y,"fall")) { /* don't double-dip on damage */ +#else + if (!flooreffects(obj,x,y,"落ちる")) { /* don't double-dip on damage */ +#endif place_object(obj, x, y); if (!mtmp && x == u.ux && y == u.uy) mtmp = &youmonst; @@ -157,7 +209,10 @@ if (tmp < rnd(20)) { if (!ismimic) { if (vis) miss(distant_name(otmp, mshot_xname), mtmp); +/*JP else if (verbose) pline("It is missed."); +*/ + else if (verbose) pline("何かがかすめた."); } if (!range) { /* Last position; object drops */ (void) drop_throw(otmp, 0, mtmp->mx, mtmp->my); @@ -176,43 +231,74 @@ if (ismimic) seemimic(mtmp); mtmp->msleeping = 0; if (vis) hit(distant_name(otmp,mshot_xname), mtmp, exclam(damage)); +/*JP else if (verbose) pline("%s is hit%s", Monnam(mtmp), exclam(damage)); +*/ + else if (verbose) pline("%sに命中した%s", Monnam(mtmp), exclam(damage)); if (otmp->opoisoned && is_poisonable(otmp)) { if (resists_poison(mtmp)) { +#if 0 /*JP*/ if (vis) pline_The("poison doesn't seem to affect %s.", +#else + if (vis) pline("%sは毒の影響を受けない.", +#endif mon_nam(mtmp)); } else { if (rn2(30)) { damage += rnd(6); } else { +/*JP if (vis) pline_The("poison was deadly..."); +*/ + if (vis) pline("毒は致死量だった..."); damage = mtmp->mhp; } } } if (objects[otmp->otyp].oc_material == SILVER && hates_silver(mtmp->data)) { +/*JP if (vis) pline_The("silver sears %s flesh!", +*/ + if (vis) pline("%sの体は銀で焼かれた!", s_suffix(mon_nam(mtmp))); +/*JP else if (verbose) pline("Its flesh is seared!"); +*/ + else if (verbose) pline("何者かの体は焼かれた!"); } if (otmp->otyp == ACID_VENOM && cansee(mtmp->mx,mtmp->my)) { if (resists_acid(mtmp)) { if (vis || verbose) +/*JP pline("%s is unaffected.", Monnam(mtmp)); +*/ + pline("%sは影響を受けない.", Monnam(mtmp)); damage = 0; } else { +/*JP if (vis) pline_The("acid burns %s!", mon_nam(mtmp)); +*/ + if (vis) pline("%sは酸で焼かれた!", mon_nam(mtmp)); +/*JP else if (verbose) pline("It is burned!"); +*/ + else if (verbose) pline("何かは焼かれた!"); } } mtmp->mhp -= damage; if (mtmp->mhp < 1) { if (vis || verbose) +#if 0 /*JP*/ pline("%s is %s!", Monnam(mtmp), (nonliving(mtmp->data) || !canspotmon(mtmp)) ? "destroyed" : "killed"); +#else + pline("%sは%s!", Monnam(mtmp), + (nonliving(mtmp->data) || !canspotmon(mtmp)) + ? "倒された" : "死んだ"); +#endif /* don't blame hero for unknown rolling boulder trap */ if (!flags.mon_moving && (otmp->otyp != BOULDER || range >= 0 || !otmp->otrapped)) @@ -224,7 +310,10 @@ (uchar)(otmp->otyp == BLINDING_VENOM ? AT_SPIT : AT_WEAP), otmp)) { if (vis && mtmp->mcansee) +/*JP pline("%s is blinded by %s.", Monnam(mtmp), the(xname(otmp))); +*/ + pline("%sは%sによって目が見えなくなった.", Monnam(mtmp), the(xname(otmp))); mtmp->mcansee = 0; tmp = (int)mtmp->mblinded + rnd(25) + 20; if (tmp > 127) tmp = 127; @@ -285,10 +374,18 @@ if (singleobj->cursed && (dx || dy) && !rn2(7)) { if(canseemon(mon) && flags.verbose) { if(is_ammo(singleobj)) +/*JP pline("%s misfires!", Monnam(mon)); +*/ + pline("%sははずした!", Monnam(mon)); else +#if 0 /*JP*/ pline("%s as %s throws it!", Tobjnam(singleobj, "slip"), mon_nam(mon)); +#else + pline("%sが投げようとしたとたん%sが滑った!", + mon_nam(mon), xname(singleobj)); +#endif } dx = rn2(3)-1; dy = rn2(3)-1; @@ -330,17 +427,31 @@ singleobj->otyp <= LAST_GEM+9 /* 9 glass colors */ && is_unicorn(youmonst.data)) { if (singleobj->otyp > LAST_GEM) { +/*JP You("catch the %s.", xname(singleobj)); +*/ + You("%sをつかまえた.", xname(singleobj)); +/*JP You("are not interested in %s junk.", +*/ + You("%sのガラクタに興味はない.", s_suffix(mon_nam(mon))); makeknown(singleobj->otyp); dropy(singleobj); } else { +/*JP You("accept %s gift in the spirit in which it was intended.", +*/ + You("これが欲しかったんだと思いながら%sの贈り物を受けとった.", s_suffix(mon_nam(mon))); (void)hold_another_object(singleobj, +#if 0 /*JP*/ "You catch, but drop, %s.", xname(singleobj), "You catch:"); +#else + "あなたは%sをつかまえたが,落した.", xname(singleobj), + "をつかまえた."); +#endif } break; } @@ -394,11 +505,20 @@ AT_SPIT : AT_WEAP), singleobj)) { blindinc = rnd(25); if(singleobj->otyp == CREAM_PIE) { +/*JP if(!Blind) pline("Yecch! You've been creamed."); +*/ + if(!Blind) pline("ウェー.クリームをかぶった."); +#if 0 /*JP*/ else pline("There's %s sticky all over your %s.", something, body_part(FACE)); +#else + else pline("あなたは%sにべとつくものを感じた.", + body_part(FACE)); +#endif } else if(singleobj->otyp == BLINDING_VENOM) { +#if 0 /*JP*/ int num_eyes = eyecount(youmonst.data); /* venom in the eyes */ if(!Blind) pline_The("venom blinds you."); @@ -406,6 +526,10 @@ (num_eyes == 1) ? body_part(EYE) : makeplural(body_part(EYE)), (num_eyes == 1) ? "s" : ""); +#else + if(!Blind) pline("毒で目が見えなくなった."); + else Your("%sはちくちくした.", makeplural(body_part(EYE))); +#endif } } if (hitu && singleobj->otyp == EGG) { @@ -511,8 +635,12 @@ if (canseemon(mtmp)) { onm = xname(otmp); +#if 0 /*JP*/ pline("%s thrusts %s.", Monnam(mtmp), obj_is_pname(otmp) ? the(onm) : an(onm)); +#else + pline("%sは%sを突き刺した.", Monnam(mtmp), onm); +#endif } dam = dmgval(otmp, &youmonst); @@ -585,7 +713,10 @@ if (multishot > 1) { /* "N arrows"; multishot > 1 implies otmp->quan > 1, so xname()'s result will already be pluralized */ +/*JP Sprintf(onmbuf, "%d %s", multishot, xname(otmp)); +*/ + Sprintf(onmbuf, "%d%sの%s", multishot, numeral(otmp), xname(otmp)); onm = onmbuf; } else { /* "an arrow" */ @@ -593,8 +724,13 @@ onm = obj_is_pname(otmp) ? the(onm) : an(onm); } m_shot.s = ammo_and_launcher(otmp,mwep) ? TRUE : FALSE; +#if 0 /*JP*/ pline("%s %s %s!", Monnam(mtmp), m_shot.s ? "shoots" : "throws", onm); +#else + pline("%sは%sを%s!", Monnam(mtmp), onm, + m_shot.s ? "撃った" : "投げた"); +#endif m_shot.o = otmp->otyp; } else { m_shot.o = STRANGE_OBJECT; /* don't give multishot feedback */ @@ -624,7 +760,10 @@ if(mtmp->mcan) { if(flags.soundok) +/*JP pline("A dry rattle comes from %s throat.", +*/ + pline("%sの喉がガラガラと鳴った.", s_suffix(mon_nam(mtmp))); return 0; } @@ -643,7 +782,10 @@ } if(!rn2(BOLT_LIM-distmin(mtmp->mx,mtmp->my,mtmp->mux,mtmp->muy))) { if (canseemon(mtmp)) +/*JP pline("%s spits venom!", Monnam(mtmp)); +*/ + pline("%sは毒を吐いた!", Monnam(mtmp)); m_throw(mtmp, mtmp->mx, mtmp->my, sgn(tbx), sgn(tby), distmin(mtmp->mx,mtmp->my,mtmp->mux,mtmp->muy), otmp); nomul(0); @@ -669,9 +811,15 @@ if(mtmp->mcan) { if(flags.soundok) { if(canseemon(mtmp)) +/*JP pline("%s coughs.", Monnam(mtmp)); +*/ + pline("%sはせきをした.", Monnam(mtmp)); else +/*JP You_hear("a cough."); +*/ + You_hear("せきの音を聞いた."); } return(0); } @@ -680,7 +828,10 @@ if((typ >= AD_MAGM) && (typ <= AD_ACID)) { if(canseemon(mtmp)) +/*JP pline("%s breathes %s!", Monnam(mtmp), +*/ + pline("%sは%sを吐いた!", Monnam(mtmp), breathwep[typ-1]); buzz((int) (-20 - (typ-1)), (int)mattk->damn, mtmp->mx, mtmp->my, sgn(tbx), sgn(tby)); @@ -807,13 +958,22 @@ *obj_p = otmp = 0; /* object is now gone */ /* breakage makes its own noises */ else if (obj_type == BOULDER || obj_type == HEAVY_IRON_BALL) +/*JP pline("Whang!"); +*/ + pline("ぐわーん!"); else if (otmp->oclass == COIN_CLASS || objects[obj_type].oc_material == GOLD || objects[obj_type].oc_material == SILVER) +/*JP pline("Clink!"); +*/ + pline("チャリン!"); else +/*JP pline("Clonk!"); +*/ + pline("ゴツン!"); } return hits; diff -aurbN -xCVS -xXTAGS nethack/src/muse.c jnethack/src/muse.c --- nethack/src/muse.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/muse.c 2003-12-25 01:43:07.000000000 +0900 @@ -3,6 +3,13 @@ /* NetHack may be freely redistributed. See license for details. */ /* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + +/* * Monster item usage routines. */ @@ -65,7 +72,10 @@ if (obj->oclass == POTION_CLASS) { coord cc; +/*JP static const char *empty = "The potion turns out to be empty."; +*/ + static const char *empty = "薬は空っぽであることがわかった."; const char *potion_descr; struct monst *mtmp; #define POTION_OCCUPANT_CHANCE(n) (13 + 2*(n)) /* also in potion.c */ @@ -82,10 +92,19 @@ if (vis) pline(empty); } else { if (vis) { +/*JP pline("As %s opens the bottle, an enormous %s emerges!", +*/ + pline("%sが瓶を開けると,巨大な%sが出てきた!", mon_nam(mon), +/*JP Hallucination ? rndmonnam() : (const char *)"ghost"); +*/ + jtrns_mon(Hallucination ? rndmonnam() : (const char *)"ghost")); +/*JP pline("%s is frightened to death, and unable to move.", +*/ + pline("%sはまっさおになって驚き,動けなくなった.", Monnam(mon)); } mon->mcanmove = 0; @@ -105,18 +124,33 @@ if (vis) pline(empty); } else { if (vis) +/*JP pline("In a cloud of smoke, %s emerges!", +*/ + pline("煙の中から,%sが現われた!", a_monnam(mtmp)); +/*JP pline("%s speaks.", vis ? Monnam(mtmp) : Something); +*/ + pline("%sは話した.", vis ? Monnam(mtmp) : Something); /* I suspect few players will be upset that monsters */ /* can't wish for wands of death here.... */ if (rn2(2)) { +/*JP verbalize("You freed me!"); +*/ + verbalize("解放してくれたのはお前か!"); mtmp->mpeaceful = 1; set_malign(mtmp); } else { +/*JP verbalize("It is about time."); +*/ + verbalize("さらばだ!"); +/*JP if (vis) pline("%s vanishes.", Monnam(mtmp)); +*/ + if (vis) pline("%sは消えた.", Monnam(mtmp)); mongone(mtmp); } } @@ -127,9 +161,15 @@ int dam = d(obj->spe+2, 6); if (flags.soundok) { +/*JP if (vis) pline("%s zaps %s, which suddenly explodes!", +*/ + if (vis) pline("%sは%sをふりかざした,それは突然爆発した!", Monnam(mon), an(xname(obj))); +/*JP else You_hear("a zap and an explosion in the distance."); +*/ + else You_hear("遠方の杖の音と爆発音を聞いた."); } m_useup(mon, obj); if (mon->mhp <= dam) { @@ -151,14 +191,28 @@ { if (!canseemon(mtmp)) { if (flags.soundok) +#if 0 /*JP*/ You_hear("a %s zap.", (distu(mtmp->mx,mtmp->my) <= (BOLT_LIM+1)*(BOLT_LIM+1)) ? "nearby" : "distant"); +#else + You_hear("%sくで杖の音を聞いた.", + (distu(mtmp->mx,mtmp->my) <= (BOLT_LIM+1)*(BOLT_LIM+1)) ? + "近" : "遠"); +#endif } else if (self) +#if 0 /*JP*/ pline("%s zaps %sself with %s!", Monnam(mtmp), mhim(mtmp), doname(otmp)); +#else + pline("%sは自分自身に%sをふりかざした!", + Monnam(mtmp), doname(otmp)); +#endif else { +/*JP pline("%s zaps %s!", Monnam(mtmp), an(xname(otmp))); +*/ + pline("%sは%sをふりかざした!", Monnam(mtmp), an(xname(otmp))); stop_occupation(); } } @@ -190,15 +244,24 @@ otmp->bknown = savebknown; if (vismon) +/*JP pline("%s reads %s!", Monnam(mtmp), onambuf); +*/ + pline("%sは%sを読んだ!", Monnam(mtmp), onambuf); else +/*JP You_hear("%s reading %s.", +*/ + You_hear("%sが%sを読んでいる声を聞いた.", x_monnam(mtmp, ARTICLE_A, (char *)0, (SUPPRESS_IT|SUPPRESS_INVISIBLE|SUPPRESS_SADDLE), FALSE), onambuf); if (mtmp->mconf) +/*JP pline("Being confused, %s mispronounces the magic words...", +*/ + pline("混乱しているので,%sは呪文を間違って唱えてしまった...", vismon ? mon_nam(mtmp) : mhe(mtmp)); } @@ -209,10 +272,16 @@ { if (canseemon(mtmp)) { otmp->dknown = 1; +/*JP pline("%s drinks %s!", Monnam(mtmp), singular(otmp, doname)); +*/ + pline("%sは%sを飲んだ!", Monnam(mtmp), singular(otmp, doname)); } else if (flags.soundok) +/*JP You_hear("a chugging sound."); +*/ + You_hear("ゴクッ!という音を聞いた."); } /* Defines for various types of stuff. The order in which monsters prefer @@ -529,7 +598,10 @@ int i, fleetim, how = 0; struct obj *otmp = m.defensive; boolean vis, vismon, oseen; +/*JP const char *mcsa = "%s can see again."; +*/ + const char *mcsa = "%sはまた見えるようになった."; if ((i = precheck(mtmp, otmp)) != 0) return i; vis = cansee(mtmp->mx, mtmp->my); @@ -546,9 +618,15 @@ case MUSE_UNICORN_HORN: if (vismon) { if (otmp) +/*JP pline("%s uses a unicorn horn!", Monnam(mtmp)); +*/ + pline("%sはユニコーンの角を使った!", Monnam(mtmp)); else +/*JP pline_The("tip of %s's horn glows!", mon_nam(mtmp)); +*/ + pline("%sの角の先端が輝いた!", mon_nam(mtmp)); } if (!mtmp->mcansee) { mtmp->mcansee = 1; @@ -557,14 +635,23 @@ } else if (mtmp->mconf || mtmp->mstun) { mtmp->mconf = mtmp->mstun = 0; if (vismon) +/*JP pline("%s seems steadier now.", Monnam(mtmp)); +*/ + pline("%sは平静をとりもどした.", Monnam(mtmp)); } else impossible("No need for unicorn horn?"); return 2; case MUSE_BUGLE: if (vismon) +/*JP pline("%s plays %s!", Monnam(mtmp), doname(otmp)); +*/ + pline("%sは%sを吹いた!", Monnam(mtmp), doname(otmp)); else if (flags.soundok) +/*JP You_hear("a bugle playing reveille!"); +*/ + You("起床ラッパの音を聞いた!"); awaken_soldiers(); return 2; case MUSE_WAN_TELEPORTATION_SELF: @@ -589,7 +676,10 @@ #endif On_W_tower_level(&u.uz)) && !rn2(3)) { if (vismon) +/*JP pline("%s seems disoriented for a moment.", +*/ + pline("%sは一瞬方向感覚を失った.", Monnam(mtmp)); return 2; } @@ -622,14 +712,20 @@ if (mon_has_amulet(mtmp) || In_endgame(&u.uz)) { if (vismon) +/*JP pline("%s seems very disoriented for a moment.", +*/ + pline("%sは一瞬方向感覚を失った.", Monnam(mtmp)); return 2; } nlev = random_teleport_level(); if (nlev == depth(&u.uz)) { if (vismon) +/*JP pline("%s shudders for a moment.", +*/ + pline("%sは一瞬震えた.", Monnam(mtmp)); return 2; } @@ -652,12 +748,18 @@ (is_drawbridge_wall(mtmp->mx, mtmp->my) >= 0) || (sstairs.sx && sstairs.sx == mtmp->mx && sstairs.sy == mtmp->my)) { +/*JP pline_The("digging ray is ineffective."); +*/ + pline("掘削の光は効果がない."); return 2; } if (!Can_dig_down(&u.uz)) { if(canseemon(mtmp)) +/*JP pline_The("%s here is too hard to dig in.", +*/ + pline("ここの%sは固くて掘れない.", surface(mtmp->mx, mtmp->my)); return 2; } @@ -665,12 +767,25 @@ if (!ttmp) return 2; seetrap(ttmp); if (vis) { +#if 0 /*JP*/ pline("%s has made a hole in the %s.", Monnam(mtmp), surface(mtmp->mx, mtmp->my)); +#else + pline("%sは%sに穴を開けた.", Monnam(mtmp), + surface(mtmp->mx, mtmp->my)); +#endif +#if 0 /*JP*/ pline("%s %s through...", Monnam(mtmp), is_flyer(mtmp->data) ? "dives" : "falls"); +#else + pline("%sは通り抜けて%s...", Monnam(mtmp), + is_flyer(mtmp->data) ? "飛びこんだ" : "落ちた"); +#endif } else if (flags.soundok) +/*JP You_hear("%s crash through the %s.", something, +*/ + You_hear("何かが%sを通り抜けて落ちる音を聞いた...", surface(mtmp->mx, mtmp->my)); /* we made sure that there is a level for mtmp to go to */ migrate_to_level(mtmp, ledger_no(&u.uz) + 1, @@ -735,9 +850,15 @@ if (vis) { struct trap *t; t = t_at(trapx,trapy); +#if 0 /*JP*/ pline("%s %s into a %s!", Monnam(mtmp), makeplural(locomotion(mtmp->data, "jump")), t->ttyp == TRAPDOOR ? "trap door" : "hole"); +#else + pline("%sは%sに%s入った!", Monnam(mtmp), + t->ttyp == TRAPDOOR ? "落し扉" : "穴", + jconj(locomotion(mtmp->data, "飛ぶ"), "て")); +#endif if (levl[trapx][trapy].typ == SCORR) { levl[trapx][trapy].typ = CORR; unblock_point(trapx, trapy); @@ -766,7 +887,10 @@ if (mon_has_special(mtmp)) return 0; if (vismon) +/*JP pline("%s escapes the dungeon!", Monnam(mtmp)); +*/ + pline("%sは迷宮から逃走した!", Monnam(mtmp)); mongone(mtmp); return 2; } @@ -774,7 +898,10 @@ if (Inhell && mon_has_amulet(mtmp) && !rn2(4) && (dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz) - 3)) { if (vismon) pline( +/*JP "As %s climbs the stairs, a mysterious force momentarily surrounds %s...", +*/ + "%sが階段をのぼろうとすると奇妙な力が%sをつつんだ...", mon_nam(mtmp), mhim(mtmp)); /* simpler than for the player; this will usually be the Wizard and he'll immediately go right to the @@ -783,26 +910,38 @@ migrate_to_level(mtmp, ledger_no(&u.uz) + 1, MIGR_RANDOM, (coord *)0); } else { +/*JP if (vismon) pline("%s escapes upstairs!", Monnam(mtmp)); +*/ + if (vismon) pline("%sは階段をのぼって逃げた!", Monnam(mtmp)); migrate_to_level(mtmp, ledger_no(&u.uz) - 1, MIGR_STAIRS_DOWN, (coord *)0); } return 2; case MUSE_DOWNSTAIRS: m_flee(mtmp); +/*JP if (vismon) pline("%s escapes downstairs!", Monnam(mtmp)); +*/ + if (vismon) pline("%sは階段を降りて逃げた!", Monnam(mtmp)); migrate_to_level(mtmp, ledger_no(&u.uz) + 1, MIGR_STAIRS_UP, (coord *)0); return 2; case MUSE_UP_LADDER: m_flee(mtmp); +/*JP if (vismon) pline("%s escapes up the ladder!", Monnam(mtmp)); +*/ + if (vismon) pline("%sははしごをのぼって逃げた!", Monnam(mtmp)); migrate_to_level(mtmp, ledger_no(&u.uz) - 1, MIGR_LADDER_DOWN, (coord *)0); return 2; case MUSE_DN_LADDER: m_flee(mtmp); +/*JP if (vismon) pline("%s escapes down the ladder!", Monnam(mtmp)); +*/ + if (vismon) pline("%sははしごを降りて逃げた!", Monnam(mtmp)); migrate_to_level(mtmp, ledger_no(&u.uz) + 1, MIGR_LADDER_UP, (coord *)0); return 2; @@ -812,22 +951,32 @@ /* regular stairs, not sstairs. */ if (sstairs.up) { if (vismon) +/*JP pline("%s escapes upstairs!", Monnam(mtmp)); +*/ + pline("%sは階段をのぼって逃げた!", Monnam(mtmp)); if(Inhell) { migrate_to_level(mtmp, ledger_no(&sstairs.tolev), MIGR_RANDOM, (coord *)0); return 2; } } else if (vismon) +/*JP pline("%s escapes downstairs!", Monnam(mtmp)); +*/ + pline("%sは階段を降りて逃げた!", Monnam(mtmp)); migrate_to_level(mtmp, ledger_no(&sstairs.tolev), MIGR_SSTAIRS, (coord *)0); return 2; case MUSE_TELEPORT_TRAP: m_flee(mtmp); if (vis) { +#if 0 /*JP*/ pline("%s %s onto a teleport trap!", Monnam(mtmp), makeplural(locomotion(mtmp->data, "jump"))); +#else + pline("%sは瞬間移動の罠に飛び込んだ!", Monnam(mtmp)); +#endif if (levl[trapx][trapy].typ == SCORR) { levl[trapx][trapy].typ = CORR; unblock_point(trapx, trapy); @@ -852,7 +1001,10 @@ mtmp->mblinded = 0; if (vismon) pline(mcsa, Monnam(mtmp)); } +/*JP if (vismon) pline("%s looks better.", Monnam(mtmp)); +*/ + if (vismon) pline("%sは気分がよくなったようだ.", Monnam(mtmp)); if (oseen) makeknown(POT_HEALING); m_useup(mtmp, otmp); return 2; @@ -867,7 +1019,10 @@ mtmp->mblinded = 0; if (vismon) pline(mcsa, Monnam(mtmp)); } +/*JP if (vismon) pline("%s looks much better.", Monnam(mtmp)); +*/ + if (vismon) pline("%sとても気分がよくなったようだ.", Monnam(mtmp)); if (oseen) makeknown(POT_EXTRA_HEALING); m_useup(mtmp, otmp); return 2; @@ -880,7 +1035,10 @@ mtmp->mblinded = 0; if (vismon) pline(mcsa, Monnam(mtmp)); } +/*JP if (vismon) pline("%s looks completely healed.", Monnam(mtmp)); +*/ + if (vismon) pline("%sは完全に回復したようだ.", Monnam(mtmp)); if (oseen) makeknown(otmp->otyp); m_useup(mtmp, otmp); return 2; @@ -1113,26 +1271,47 @@ if (zap_oseen) makeknown(WAN_STRIKING); if (Antimagic) { shieldeff(u.ux, u.uy); +/*JP pline("Boing!"); +*/ + pline("ボイン!"); } else if (rnd(20) < 10 + u.uac) { +/*JP pline_The("wand hits you!"); +*/ + pline("杖はあなたに命中した!"); tmp = d(2,12); if(Half_spell_damage) tmp = (tmp+1) / 2; +/*JP losehp(tmp, "wand", KILLED_BY_AN); +*/ + losehp(tmp, "衝撃の杖によって", KILLED_BY_AN); +/*JP } else pline_The("wand misses you."); +*/ + } else pline("杖ははずれた."); stop_occupation(); nomul(0); } else if (resists_magm(mtmp)) { shieldeff(mtmp->mx, mtmp->my); +/*JP pline("Boing!"); +*/ + pline("ボイン!"); } else if (rnd(20) < 10+find_mac(mtmp)) { tmp = d(2,12); +/*JP hit("wand", mtmp, exclam(tmp)); +*/ + hit("杖", mtmp, exclam(tmp)); (void) resist(mtmp, otmp->oclass, tmp, TELL); if (cansee(mtmp->mx, mtmp->my) && zap_oseen) makeknown(WAN_STRIKING); } else { +/*JP miss("wand", mtmp); +*/ + miss("杖", mtmp); if (cansee(mtmp->mx, mtmp->my) && zap_oseen) makeknown(WAN_STRIKING); } @@ -1146,7 +1325,10 @@ if (mtmp->ispriest && *in_rooms(mtmp->mx, mtmp->my, TEMPLE)) { if (cansee(mtmp->mx, mtmp->my)) +/*JP pline("%s resists the magic!", Monnam(mtmp)); +*/ + pline("%sは魔法を防いだ!", Monnam(mtmp)); mtmp->msleeping = 0; if(mtmp->m_ap_type) seemimic(mtmp); } else if (!tele_restrict(mtmp)) @@ -1296,9 +1478,15 @@ case MUSE_FROST_HORN: if (oseen) { makeknown(otmp->otyp); +/*JP pline("%s plays a %s!", Monnam(mtmp), xname(otmp)); +*/ + pline("%sは%sを吹いた!", Monnam(mtmp), xname(otmp)); } else +/*JP You_hear("a horn being played."); +*/ + You_hear("ホルンの音を聞いた."); otmp->spe--; m_using = TRUE; buzz(-30 - ((otmp->otyp==FROST_HORN) ? AD_COLD-1 : AD_FIRE-1), @@ -1326,12 +1514,22 @@ mreadmsg(mtmp, otmp); /* Identify the scroll */ if (canspotmon(mtmp)) { +#if 0 /*JP*/ pline_The("%s rumbles %s %s!", ceiling(mtmp->mx, mtmp->my), otmp->blessed ? "around" : "above", mon_nam(mtmp)); +#else + pline("%sの%sの%sからゴロゴロと音が聞こえてきた.", + mon_nam(mtmp), + otmp->blessed ? "まわり" : "真上", + ceiling(mtmp->mx, mtmp->my)); +#endif if (oseen) makeknown(otmp->otyp); } else if (cansee(mtmp->mx, mtmp->my)) { +/*JP pline_The("%s rumbles in the middle of nowhere!", +*/ + pline_The("どこかの%sからゴロゴロと音が聞こえてきた.", ceiling(mtmp->mx, mtmp->my)); if (mtmp->minvis) map_invisible(mtmp->mx, mtmp->my); @@ -1368,8 +1566,13 @@ int mdmg; if (cansee(mtmp2->mx, mtmp2->my)) { +#if 0 /*JP*/ pline("%s is hit by %s!", Monnam(mtmp2), doname(otmp2)); +#else + pline("%sは%sに命中した!", + doname(otmp2), Monnam(mtmp2)); +#endif if (mtmp2->minvis && !canspotmon(mtmp2)) map_invisible(mtmp2->mx, mtmp2->my); } @@ -1377,25 +1580,40 @@ if (helmet) { if(is_metallic(helmet)) { if (canspotmon(mtmp2)) +/*JP pline("Fortunately, %s is wearing a hard helmet.", mon_nam(mtmp2)); +*/ + pline("幸運にも%sは固い兜を身につけている.", mon_nam(mtmp2)); else if (flags.soundok) +/*JP You_hear("a clanging sound."); +*/ + You_hear("ガツーンという音を聞いた."); if (mdmg > 2) mdmg = 2; } else { if (canspotmon(mtmp2)) +/*JP pline("%s's %s does not protect %s.", +*/ + pline("%sの%sでは%sを防げない.", Monnam(mtmp2), xname(helmet), mhim(mtmp2)); } } mtmp2->mhp -= mdmg; if (mtmp2->mhp <= 0) { +/*JP pline("%s is killed.", Monnam(mtmp2)); +*/ + pline("%sは死んだ.", Monnam(mtmp2)); mondied(mtmp2); } } /* Drop the rock/boulder to the floor */ +/*JP if (!flooreffects(otmp2, x, y, "fall")) { +*/ + if (!flooreffects(otmp2, x, y, "落ちる")) { place_object(otmp2, x, y); stackobj(otmp2); newsym(x, y); /* map the rock */ @@ -1419,25 +1637,42 @@ !Passes_walls && !noncorporeal(youmonst.data) && !unsolid(youmonst.data)) { +/*JP You("are hit by %s!", doname(otmp2)); +*/ + You("%sはあなたに命中した!", doname(otmp2)); dmg = dmgval(otmp2, &youmonst) * otmp2->quan; if (uarmh) { if(is_metallic(uarmh)) { +/*JP pline("Fortunately, you are wearing a hard helmet."); +*/ + pline("幸運にも,あなたは固い兜を身につけていた."); if (dmg > 2) dmg = 2; } else if (flags.verbose) { +#if 0 /*JP*/ Your("%s does not protect you.", xname(uarmh)); +#else + Your("%sでは防げない.", + xname(uarmh)); +#endif } } } else dmg = 0; +/*JP if (!flooreffects(otmp2, u.ux, u.uy, "fall")) { +*/ + if (!flooreffects(otmp2, u.ux, u.uy, "落ちる")) { place_object(otmp2, u.ux, u.uy); stackobj(otmp2); newsym(u.ux, u.uy); } +/*JP if (dmg) losehp(dmg, "scroll of earth", KILLED_BY_AN); +*/ + if (dmg) losehp(dmg, "大地の巻物で", KILLED_BY_AN); } xxx_noobj: @@ -1451,24 +1686,39 @@ mreadmsg(mtmp, otmp); if (mtmp->mconf) { if (vis) +/*JP pline("Oh, what a pretty fire!"); +*/ + pline("わぁ,きれいな炎だ!"); } else { struct monst *mtmp2; int num; if (vis) +/*JP pline_The("scroll erupts in a tower of flame!"); +*/ + pline("巻物から火柱が立ち昇った!"); shieldeff(mtmp->mx, mtmp->my); +/*JP pline("%s is uninjured.", Monnam(mtmp)); +*/ + pline("%sは傷つかなかった.", Monnam(mtmp)); (void) destroy_mitem(mtmp, SCROLL_CLASS, AD_FIRE); (void) destroy_mitem(mtmp, SPBOOK_CLASS, AD_FIRE); (void) destroy_mitem(mtmp, POTION_CLASS, AD_FIRE); num = (2*(rn1(3, 3) + 2 * bcsign(otmp)) + 1)/3; if (Fire_resistance) +/*JP You("are not harmed."); +*/ + You("傷つかなかった."); burn_away_slime(); if (Half_spell_damage) num = (num+1) / 2; +/*JP else losehp(num, "scroll of fire", KILLED_BY_AN); +*/ + else losehp(num, "炎の巻物で", KILLED_BY_AN); for(mtmp2 = fmon; mtmp2; mtmp2 = mtmp2->nmon) { if(DEADMONSTER(mtmp2)) continue; if(mtmp == mtmp2) continue; @@ -1499,7 +1749,10 @@ */ if (cansee(mtmp->mx, mtmp->my)) { otmp->dknown = 1; +/*JP pline("%s hurls %s!", Monnam(mtmp), +*/ + pline("%sは%sを強く投げつけた!", Monnam(mtmp), singular(otmp, doname)); } m_throw(mtmp, mtmp->mx, mtmp->my, sgn(mtmp->mux-mtmp->mx), @@ -1716,7 +1969,10 @@ /* insurance against future changes... */ if(on_level(&tolevel, &u.uz)) goto skipmsg; if (vismon) { +/*JP pline("%s rises up, through the %s!", +*/ + pline("%sは%sを突き抜けた!", Monnam(mtmp), ceiling(mtmp->mx, mtmp->my)); if(!objects[POT_GAIN_LEVEL].oc_name_known && !objects[POT_GAIN_LEVEL].oc_uname) @@ -1729,7 +1985,10 @@ } else { skipmsg: if (vismon) { +/*JP pline("%s looks uneasy.", Monnam(mtmp)); +*/ + pline("%sは不安げに見える.", Monnam(mtmp)); if(!objects[POT_GAIN_LEVEL].oc_name_known && !objects[POT_GAIN_LEVEL].oc_uname) docall(otmp); @@ -1738,7 +1997,10 @@ return 2; } } +/*JP if (vismon) pline("%s seems more experienced.", Monnam(mtmp)); +*/ + if (vismon) pline("%sは経験を積んだように見える.", Monnam(mtmp)); if (oseen) makeknown(POT_GAIN_LEVEL); m_useup(mtmp, otmp); if (!grow_up(mtmp,(struct monst *)0)) return 1; @@ -1756,11 +2018,20 @@ mon_set_minvis(mtmp); if (vismon && mtmp->minvis) { /* was seen, now invisible */ if (See_invisible) +#if 0 /*JP*/ pline("%s body takes on a %s transparency.", s_suffix(nambuf), Hallucination ? "normal" : "strange"); +#else + pline("%s%sの体は透過性をもった.", + Hallucination ? "あたりまえなことだが" : "奇妙なことに", + nambuf); +#endif else +/*JP pline("Suddenly you cannot see %s.", nambuf); +*/ + pline("%sは突然見えなくなった.", nambuf); if (oseen) makeknown(otmp->otyp); } if (otmp->otyp == POT_INVISIBILITY) { @@ -1790,16 +2061,24 @@ return 2; case MUSE_POT_POLYMORPH: mquaffmsg(mtmp, otmp); +/*JP if (vismon) pline("%s suddenly mutates!", Monnam(mtmp)); +*/ + if (vismon) pline("%sは突然変化した!", Monnam(mtmp)); (void) newcham(mtmp, muse_newcham_mon(mtmp), FALSE, FALSE); if (oseen) makeknown(POT_POLYMORPH); m_useup(mtmp, otmp); return 2; case MUSE_POLY_TRAP: if (vismon) +#if 0 /*JP*/ pline("%s deliberately %s onto a polymorph trap!", Monnam(mtmp), makeplural(locomotion(mtmp->data, "jump"))); +#else + pline("%sはわざと変化の罠に飛びこんだ!", + Monnam(mtmp)); +#endif if (vis) seetrap(t_at(trapx,trapy)); /* don't use rloc() due to worms */ @@ -1814,7 +2093,10 @@ case MUSE_BULLWHIP: /* attempt to disarm hero */ if (uwep && !rn2(5)) { +/*JP const char *The_whip = vismon ? "The bullwhip" : "A whip"; +*/ + const char *The_whip = vismon ? "鞭" : "鞭"; int where_to = rn2(4); struct obj *obj = uwep; const char *hand; @@ -1825,24 +2107,42 @@ if (bimanual(obj)) hand = makeplural(hand); if (vismon) +/*JP pline("%s flicks a bullwhip towards your %s!", +*/ + pline("%sはあなたの%sに向かって鞭を打った!", Monnam(mtmp), hand); if (obj->otyp == HEAVY_IRON_BALL) { +/*JP pline("%s fails to wrap around %s.", +*/ + pline("%sは%sにはからみつかなかった.", The_whip, the_weapon); return 1; } +/*JP pline("%s wraps around %s you're wielding!", +*/ + pline("%sはあなたの装備している%sにからみついた!", The_whip, the_weapon); if (welded(obj)) { +#if 0 /*JP*/ pline("%s welded to your %s%c", !is_plural(obj) ? "It is" : "They are", hand, !obj->bknown ? '!' : '.'); +#else + pline("しかし,それはまだあなたの%sの中にある%s", + hand, !obj->bknown ? "!" : "."); +#endif /* obj->bknown = 1; */ /* welded() takes care of this */ where_to = 0; } if (!where_to) { +#if 0 /*JP*/ pline_The("whip slips free."); /* not `The_whip' */ +#else + pline("鞭はほどけた."); /* not `The_whip' */ +#endif return 1; } else if (where_to == 3 && hates_silver(mtmp->data) && objects[obj->otyp].oc_material == SILVER) { @@ -1854,17 +2154,26 @@ uwepgone(); switch (where_to) { case 1: /* onto floor beneath mon */ +/*JP pline("%s yanks %s from your %s!", Monnam(mtmp), +*/ + pline("%sは%sをあなたの%sからぐいとひっぱった!", Monnam(mtmp), the_weapon, hand); place_object(obj, mtmp->mx, mtmp->my); break; case 2: /* onto floor beneath you */ +/*JP pline("%s yanks %s to the %s!", Monnam(mtmp), +*/ + pline("%sは%sを%sに引き落した!", Monnam(mtmp), the_weapon, surface(u.ux, u.uy)); dropy(obj); break; case 3: /* into mon's inventory */ +/*JP pline("%s snatches %s!", Monnam(mtmp), +*/ + pline("%sは%sを奪った!", Monnam(mtmp), the_weapon); (void) mpickobj(mtmp,obj); break; @@ -1884,7 +2193,10 @@ you_aggravate(mtmp) struct monst *mtmp; { +/*JP pline("For some reason, %s presence is known to you.", +*/ + pline("なぜか,あなたは%sの存在に気がついた.", s_suffix(noit_mon_nam(mtmp))); cls(); #ifdef CLIPPING @@ -1892,13 +2204,19 @@ #endif show_glyph(mtmp->mx, mtmp->my, mon_to_glyph(mtmp)); display_self(); +/*JP You_feel("aggravated at %s.", noit_mon_nam(mtmp)); +*/ + You("%sに腹がたった.", mon_nam(mtmp)); display_nhwindow(WIN_MAP, TRUE); docrt(); if (unconscious()) { multi = -1; nomovemsg = +/*JP "Aggravated, you are jolted into full consciousness."; +*/ + "腹がたっていて,ピリピリしている."; } newsym(mtmp->mx,mtmp->my); if (!canspotmon(mtmp)) @@ -2032,32 +2350,47 @@ if (orefl && orefl->otyp == SHIELD_OF_REFLECTION) { if (str) { +/*JP pline(str, s_suffix(mon_nam(mon)), "shield"); +*/ + pline(str, mon_nam(mon), "盾"); makeknown(SHIELD_OF_REFLECTION); } return TRUE; } else if (arti_reflects(MON_WEP(mon))) { /* due to wielded artifact weapon */ if (str) +/*JP pline(str, s_suffix(mon_nam(mon)), "weapon"); +*/ + pline(str, mon_nam(mon), "武器"); return TRUE; } else if ((orefl = which_armor(mon, W_AMUL)) && orefl->otyp == AMULET_OF_REFLECTION) { if (str) { +/*JP pline(str, s_suffix(mon_nam(mon)), "amulet"); +*/ + pline(str, mon_nam(mon), "魔除け"); makeknown(AMULET_OF_REFLECTION); } return TRUE; } else if ((orefl = which_armor(mon, W_ARM)) && (orefl->otyp == SILVER_DRAGON_SCALES || orefl->otyp == SILVER_DRAGON_SCALE_MAIL)) { if (str) +/*JP pline(str, s_suffix(mon_nam(mon)), "armor"); +*/ + pline(str, mon_nam(mon), "鎧"); return TRUE; } else if (mon->data == &mons[PM_SILVER_DRAGON] || mon->data == &mons[PM_CHROMATIC_DRAGON]) { /* Silver dragons only reflect when mature; babies do not */ if (str) +/*JP pline(str, s_suffix(mon_nam(mon)), "scales"); +*/ + pline(str, mon_nam(mon), "鱗"); return TRUE; } return FALSE; @@ -2070,28 +2403,43 @@ /* Check from outermost to innermost objects */ if (EReflecting & W_ARMS) { if (fmt && str) { +/*JP pline(fmt, str, "shield"); +*/ + pline(fmt, str, "盾"); makeknown(SHIELD_OF_REFLECTION); } return TRUE; } else if (EReflecting & W_WEP) { /* Due to wielded artifact weapon */ if (fmt && str) +/*JP pline(fmt, str, "weapon"); +*/ + pline(fmt, str, "武器"); return TRUE; } else if (EReflecting & W_AMUL) { if (fmt && str) { +/*JP pline(fmt, str, "medallion"); +*/ + pline(fmt, str, "メダリオン"); makeknown(AMULET_OF_REFLECTION); } return TRUE; } else if (EReflecting & W_ARM) { if (fmt && str) +/*JP pline(fmt, str, "armor"); +*/ + pline(fmt, str, "鎧"); return TRUE; } else if (youmonst.data == &mons[PM_SILVER_DRAGON]) { if (fmt && str) +/*JP pline(fmt, str, "scales"); +*/ + pline(fmt, str, "鱗"); return TRUE; } return FALSE; @@ -2138,36 +2486,60 @@ long save_quan = obj->quan; obj->quan = 1L; +#if 0 /*JP*/ pline("%s %ss %s.", Monnam(mon), (obj->otyp == POT_ACID) ? "quaff" : "eat", distant_name(obj,doname)); +#else + pline("%sは%sを%s.", Monnam(mon), + distant_name(obj,doname), + (obj->otyp == POT_ACID) ? "飲んだ" : "食べた"); +#endif obj->quan = save_quan; } else if (flags.soundok) +/*JP You_hear("%s.", (obj->otyp == POT_ACID) ? "drinking" : "chewing"); +*/ + You_hear("%sという音を聞いた.", (obj->otyp == POT_ACID) ? "ゴクン" : "クチャクチャ"); m_useup(mon, obj); if (((obj->otyp == POT_ACID) || acidic(&mons[obj->corpsenm])) && !resists_acid(mon)) { mon->mhp -= rnd(15); +/*JP pline("%s has a very bad case of stomach acid.", +*/ + pline("%sは胃酸の調子がとても悪い.", Monnam(mon)); } if (mon->mhp <= 0) { +/*JP pline("%s dies!", Monnam(mon)); +*/ + pline("%sは死んだ!", Monnam(mon)); if (by_you) xkilled(mon, 0); else mondead(mon); return; } if (stoning && canseemon(mon)) { if (Hallucination) +/*JP pline("What a pity - %s just ruined a future piece of art!", +*/ + pline("なんてことだ!%sは芸術作品になれたかもしれないのに!", mon_nam(mon)); else +/*JP pline("%s seems limber!", Monnam(mon)); +*/ + pline("%sは体が柔らかくなったように見える!", Monnam(mon)); } if (obj->otyp == CORPSE && obj->corpsenm == PM_LIZARD && mon->mconf) { mon->mconf = 0; if (canseemon(mon)) +/*JP pline("%s seems steadier now.", Monnam(mon)); +*/ + pline("%sはより丈夫になったようだ.", Monnam(mon)); } if (mon->mtame && !mon->isminion && nutrit > 0) { struct edog *edog = EDOG(mon); diff -aurbN -xCVS -xXTAGS nethack/src/music.c jnethack/src/music.c --- nethack/src/music.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/music.c 2004-10-09 02:21:01.000000000 +0900 @@ -3,6 +3,13 @@ /* NetHack may be freely redistributed. See license for details. */ /* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + +/* * This file contains the different functions designed to manipulate the * musical instruments and their various effects. * @@ -123,12 +130,21 @@ newsym(mtmp->mx, mtmp->my); if (canseemon(mtmp)) { if (!could_see_mon) +/*JP You("notice %s, swaying with the music.", +*/ + You("%sが音楽に合わせて揺れているのに気付いた.", a_monnam(mtmp)); else +#if 0 /*JP*/ pline("%s freezes, then sways with the music%s.", Monnam(mtmp), was_peaceful ? "" : ", and now seems quieter"); +#else + pline("%sは立ちすくみ,音楽に合わせて揺れ%sた.", + Monnam(mtmp), + was_peaceful ? "" : ",おとなしくなっ"); +#endif } } mtmp = mtmp->nmon; @@ -153,7 +169,10 @@ mtmp->mavenge = 0; if (canseemon(mtmp)) pline( +/*JP "%s listens cheerfully to the music, then seems quieter.", +*/ + "%sは音楽に聞きいり,おとなしくなった.", Monnam(mtmp)); } mtmp = mtmp->nmon; @@ -173,9 +192,15 @@ mtmp->mpeaceful = mtmp->msleeping = mtmp->mfrozen = 0; mtmp->mcanmove = 1; if (canseemon(mtmp)) +/*JP pline("%s is now ready for battle!", Monnam(mtmp)); +*/ + pline("%sは戦いの準備が整った!", Monnam(mtmp)); else +/*JP Norep("You hear the rattle of battle gear being readied."); +*/ + Norep("あなたは戦いの準備が整ったことを示す音を聞いた."); } mtmp = mtmp->nmon; } @@ -236,12 +261,21 @@ if (mtmp->mundetected && is_hider(mtmp->data)) { mtmp->mundetected = 0; if (cansee(x,y)) +/*JP pline("%s is shaken loose from the ceiling!", +*/ + pline("%sは揺すられ,天井から落ちてきた!", Amonnam(mtmp)); else +/*JP You_hear("a thumping sound."); +*/ + You_hear("ドンドンという音を聞いた."); if (x==u.ux && y==u.uy) +/*JP You("easily dodge the falling %s.", +*/ + You("落ちてきた%sを簡単にかわした.", mon_nam(mtmp)); newsym(x,y); } @@ -249,27 +283,42 @@ if (!rn2(14 - force)) switch (levl[x][y].typ) { case FOUNTAIN : /* Make the fountain disappear */ if (cansee(x,y)) +/*JP pline_The("fountain falls into a chasm."); +*/ + pline("泉は地割れに落ちた."); goto do_pit; #ifdef SINKS case SINK : if (cansee(x,y)) +/*JP pline_The("kitchen sink falls into a chasm."); +*/ + pline("流し台は地割れに落ちた."); goto do_pit; #endif case ALTAR : if (Is_astralevel(&u.uz) || Is_sanctum(&u.uz)) break; if (cansee(x,y)) +/*JP pline_The("altar falls into a chasm."); +*/ + pline("祭壇は地割れに落ちた."); goto do_pit; case GRAVE : if (cansee(x,y)) +/*JP pline_The("headstone topples into a chasm."); +*/ + pline("墓石は崩れさった."); goto do_pit; case THRONE : if (cansee(x,y)) +/*JP pline_The("throne falls into a chasm."); +*/ + pline("玉座は地割れに落ちた."); /* Falls into next case */ case ROOM : case CORR : /* Try to make a pit */ @@ -283,8 +332,13 @@ if ((otmp = sobj_at(BOULDER, x, y)) != 0) { if (cansee(x, y)) +#if 0 /*JP*/ pline("KADOOM! The boulder falls into a chasm%s!", ((x == u.ux) && (y == u.uy)) ? " below you" : ""); +#else + pline("ドドーン!岩は%s地割れに落ちた!", + ((x == u.ux) && (y == u.uy)) ? "あなたの下の" : ""); +#endif if (mtmp) mtmp->mtrapped = 0; obj_extract_self(otmp); @@ -299,19 +353,37 @@ if(!is_flyer(mtmp->data) && !is_clinger(mtmp->data)) { mtmp->mtrapped = 1; if(cansee(x,y)) +/*JP pline("%s falls into a chasm!", Monnam(mtmp)); +*/ + pline("%sは地割れに落ちた!", Monnam(mtmp)); else if (flags.soundok && humanoid(mtmp->data)) +/*JP You_hear("a scream!"); +*/ + You_hear("叫び声を聞いた!"); +/*JP mselftouch(mtmp, "Falling, ", TRUE); +*/ + mselftouch(mtmp, "落下中,", TRUE); if (mtmp->mhp > 0) if ((mtmp->mhp -= rnd(6)) <= 0) { if(!cansee(x,y)) +/*JP pline("It is destroyed!"); +*/ + pline("何者かは死んだ!"); else { +#if 0 /*JP*/ You("destroy %s!", mtmp->mtame ? x_monnam(mtmp, ARTICLE_THE, "poor", mtmp->mnamelth ? SUPPRESS_SADDLE : 0, FALSE): mon_nam(mtmp)); +#else + pline("%s%sは死んだ!", mtmp->mtame ? + "かわいそうな" : "", + mon_nam(mtmp)); +#endif } xkilled(mtmp,0); } @@ -319,22 +391,42 @@ } else if (x == u.ux && y == u.uy) { if (Levitation || Flying || is_clinger(youmonst.data)) { +/*JP pline("A chasm opens up under you!"); +*/ + pline("地割れが足元に開いた!"); +/*JP You("don't fall in!"); +*/ + You("落ちなかった!"); } else { +/*JP You("fall into a chasm!"); +*/ + You("地割れに落ちた!"); u.utrap = rn1(6,2); u.utraptype = TT_PIT; +#if 0 /*JP:T*/ losehp(rnd(6),"fell into a chasm", NO_KILLER_PREFIX); +#else + losehp(rnd(6),"地割れに落ちて", + KILLED_BY); +#endif +/*JP selftouch("Falling, you"); +*/ + selftouch("落ちながら,あなたは"); } } else newsym(x,y); break; case DOOR : /* Make the door collapse */ if (levl[x][y].doormask == D_NODOOR) goto do_pit; if (cansee(x,y)) +/*JP pline_The("door collapses."); +*/ + pline_The("扉はこなごなになった."); if (*in_rooms(x, y, SHOPBASE)) add_damage(x, y, 0L); levl[x][y].doormask = D_NODOOR; @@ -377,23 +469,35 @@ #endif /* MAC || AMIGA || VPIX_MUSIC || PCMUSIC */ if (!do_spec) +/*JP pline("What you produce is quite far from music..."); +*/ + pline("あなたが奏でたものは音楽とはとても呼べない..."); else +/*JP You("start playing %s.", the(xname(instr))); +*/ + You("%sを奏ではじめた.", the(xname(instr))); switch (instr->otyp) { case MAGIC_FLUTE: /* Make monster fall asleep */ if (do_spec && instr->spe > 0) { consume_obj_charge(instr, TRUE); +/*JP You("produce soft music."); +*/ + You("柔らかい音色を奏でた."); put_monsters_to_sleep(u.ulevel * 5); exercise(A_DEX, TRUE); break; } /* else FALLTHRU */ case WOODEN_FLUTE: /* May charm snakes */ do_spec &= (rn2(ACURR(A_DEX)) + u.ulevel > 25); +/*JP pline("%s.", Tobjnam(instr, do_spec ? "trill" : "toot")); +*/ + pline("%sを%sた.", xname(instr), do_spec ? "奏で" : "吹い"); if (do_spec) charm_snakes(u.ulevel * 3); exercise(A_DEX, TRUE); break; @@ -403,13 +507,21 @@ consume_obj_charge(instr, TRUE); if (!getdir((char *)0)) { +/*JP pline("%s.", Tobjnam(instr, "vibrate")); +*/ + pline("%sは震えた.", xname(instr)); break; } else if (!u.dx && !u.dy && !u.dz) { if ((damage = zapyourself(instr, TRUE)) != 0) { +#if 0 /*JP*/ char buf[BUFSZ]; Sprintf(buf, "using a magical horn on %sself", uhim()); losehp(damage, buf, KILLED_BY); +#else + losehp(damage, "自分自身の魔法のホルンの力を浴びて", + KILLED_BY); +#endif } } else { buzz((instr->otyp == FROST_HORN) ? AD_COLD-1 : AD_FIRE-1, @@ -419,12 +531,18 @@ break; } /* else FALLTHRU */ case TOOLED_HORN: /* Awaken or scare monsters */ +/*JP You("produce a frightful, grave sound."); +*/ + You("身震いするような死者の音楽を奏でた."); awaken_monsters(u.ulevel * 30); exercise(A_WIS, FALSE); break; case BUGLE: /* Awaken & attract soldiers */ +/*JP You("extract a loud noise from %s.", the(xname(instr))); +*/ + You("%sから大きな耳障りな音を出した.", the(xname(instr))); awaken_soldiers(); exercise(A_WIS, FALSE); break; @@ -432,15 +550,23 @@ if (do_spec && instr->spe > 0) { consume_obj_charge(instr, TRUE); +/*JP pline("%s very attractive music.", Tobjnam(instr, "produce")); +*/ + pline("%sはとても魅力的な音楽を奏でた.", xname(instr)); charm_monsters((u.ulevel - 1) / 3 + 1); exercise(A_DEX, TRUE); break; } /* else FALLTHRU */ case WOODEN_HARP: /* May calm Nymph */ do_spec &= (rn2(ACURR(A_DEX)) + u.ulevel > 25); +#if 0 /*JP*/ pline("%s %s.", The(xname(instr)), do_spec ? "produces a lilting melody" : "twangs"); +#else + You("%s.", + do_spec ? "軽快な音楽を奏でた" : "ポローンという音を出した"); +#endif if (do_spec) calm_nymphs(u.ulevel * 3); exercise(A_DEX, TRUE); break; @@ -448,8 +574,14 @@ if (do_spec && instr->spe > 0) { consume_obj_charge(instr, TRUE); +/*JP You("produce a heavy, thunderous rolling!"); +*/ + You("重厚な雷のような音を奏でた!"); +/*JP pline_The("entire dungeon is shaking around you!"); +*/ + pline("あなたの回りの迷宮が揺れた!"); do_earthquake((u.ulevel - 1) / 3 + 1); /* shake up monsters in a much larger radius... */ awaken_monsters(ROWNO * COLNO); @@ -457,7 +589,10 @@ break; } /* else FALLTHRU */ case LEATHER_DRUM: /* Awaken monsters */ +/*JP You("beat a deafening row!"); +*/ + You("耳が聞こえなくなるくらい叩いた!"); awaken_monsters(u.ulevel * 40); exercise(A_WIS, FALSE); break; @@ -482,17 +617,29 @@ boolean ok; if (Underwater) { +/*JP You_cant("play music underwater!"); +*/ + You("水の中では音楽を奏でられない!"); return(0); } if (instr->otyp != LEATHER_DRUM && instr->otyp != DRUM_OF_EARTHQUAKE) { +/*JP c = yn("Improvise?"); +*/ + c = yn("即興で演奏する?"); } if (c == 'n') { +/*JP if (u.uevent.uheard_tune == 2 && yn("Play the passtune?") == 'y') { +*/ + if (u.uevent.uheard_tune == 2 && yn("コードを演奏する?") == 'y') { Strcpy(buf, tune); } else { +/*JP getlin("What tune are you playing? [5 notes, A-G]", buf); +*/ + getlin("どのような調べを演奏しますか?[A-G から5音をいれてね]", buf); (void)mungspaces(buf); /* convert to uppercase and change any "H" to the expected "B" */ for (s = buf; *s; s++) { @@ -505,7 +652,10 @@ if (*s == 'H') *s = 'B'; } } +/*JP You("extract a strange sound from %s!", the(xname(instr))); +*/ + You("%sから奇妙な音を出した!", the(xname(instr))); #ifdef UNIX386MUSIC /* if user is at the console, play through the console speaker */ if (atconsole()) @@ -589,13 +739,26 @@ } if(tumblers) if(gears) +#if 0 /*JP*/ You_hear("%d tumbler%s click and %d gear%s turn.", tumblers, plur(tumblers), gears, plur(gears)); +#else + You_hear("%dの金具がカチっとなり,%dの歯車がまわる音を聞いた.", + tumblers, gears); +#endif else +#if 0 /*JP*/ You_hear("%d tumbler%s click.", tumblers, plur(tumblers)); +#else + You_hear("%dの金具がカチっとなる音を聞いた.", + tumblers); +#endif else if(gears) { +/*JP You_hear("%d gear%s turn.", gears, plur(gears)); +*/ + You_hear("%dの歯車が回る音を聞いた.", gears); /* could only get `gears == 5' by playing five correct notes followed by excess; otherwise, tune would have matched above */ @@ -629,7 +792,10 @@ */ char *termtype = nh_getenv("TERM"); +/*JP return(!strcmp(termtype, "AT386") || !strcmp(termtype, "xterm")); +*/ + return(!strcmp(termtype, "AT386") || !strcmp(termtype, "xterm") || !strcmp(termtype, "kterm")); } STATIC_OVL void diff -aurbN -xCVS -xXTAGS nethack/src/o_init.c jnethack/src/o_init.c --- nethack/src/o_init.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/o_init.c 2004-04-25 12:29:05.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "lev.h" /* save & restore info */ @@ -374,7 +381,10 @@ char buf[BUFSZ]; tmpwin = create_nhwindow(NHW_MENU); +/*JP putstr(tmpwin, 0, "Discoveries"); +*/ + putstr(tmpwin, 0, "発見物一覧"); putstr(tmpwin, 0, ""); /* gather "unique objects" into a pseudo-class; note that they'll @@ -382,8 +392,13 @@ for (i = dis = 0; i < SIZE(uniq_objs); i++) if (objects[uniq_objs[i]].oc_name_known) { if (!dis++) +#if 0 /*JP*/ putstr(tmpwin, iflags.menu_headings, "Unique Items"); Sprintf(buf, " %s", OBJ_NAME(objects[uniq_objs[i]])); +#else + putstr(tmpwin, iflags.menu_headings, "特殊アイテム"); + Sprintf(buf, " %s", jtrns_obj(' ', OBJ_NAME(objects[uniq_objs[i]]))); +#endif putstr(tmpwin, 0, buf); ++ct; } @@ -416,7 +431,10 @@ } } if (ct == 0) { +/*JP You("haven't discovered anything yet..."); +*/ + You("まだ何も発見していない..."); } else display_nhwindow(tmpwin, TRUE); destroy_nhwindow(tmpwin); diff -aurbN -xCVS -xXTAGS nethack/src/objnam.c jnethack/src/objnam.c --- nethack/src/objnam.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/objnam.c 2005-06-21 19:14:18.000000000 +0900 @@ -2,10 +2,22 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" /* "an uncursed greased partly eaten guardian naga hatchling [corpse]" */ +#if 0 /*JP*/ #define PREFIX 80 /* (56) */ +#else +/* 「呪われていない油の塗られた食べかけのクロマティック・ドラゴン(の死体)」*/ +#define PREFIX 100 +#endif #define SCHAR_LIM 127 #define NUMOBUF 12 @@ -15,6 +27,11 @@ #endif static char *NDECL(nextobuf); static void FDECL(add_erosion_words, (struct obj *, char *)); +static char *FDECL(substitute, (char *, char *, char *)); +static char *FDECL(transpose, (char *buf,char *)); +static char *FDECL(delete, (char *, char *str)); +static int FDECL(digit_8, (int)); +static int FDECL(atoi_8, (const char *)); struct Jitem { int item; @@ -97,30 +114,87 @@ register const char *dn = OBJ_DESCR(*ocl); register const char *un = ocl->oc_uname; register int nn = ocl->oc_name_known; +#if 1 /*JP*/ + char type; + char type_name[BUFSZ]; +#endif if (Role_if(PM_SAMURAI) && Japanese_item_name(otyp)) actualn = Japanese_item_name(otyp); +#if 1 /*JP*/ + buf[0]='\0'; + type_name[0]='\0'; + if(un) + Sprintf(buf, "%sと呼ばれる", un); +#endif switch(ocl->oc_class) { case COIN_CLASS: +#if 0 /*JP*/ Strcpy(buf, "coin"); +#else + if(nn) + Strcat(buf,jtrns_obj('$',actualn)); + type = '$'; +#endif break; case POTION_CLASS: +#if 0 /*JP*/ Strcpy(buf, "potion"); +#else + if(nn) + Strcat(buf,jtrns_obj('!',actualn)); + else if(un) + Strcat(buf, "薬"); + type = '!'; +#endif break; case SCROLL_CLASS: +#if 0 /*JP*/ Strcpy(buf, "scroll"); +#else + if(nn) + Strcat(buf,jtrns_obj('?',actualn)); + else if(un) + Strcat(buf, "巻物"); + type = '?'; +#endif break; case WAND_CLASS: +#if 0 /*JP*/ Strcpy(buf, "wand"); +#else + if(nn) + Strcat(buf,jtrns_obj('/',actualn)); + else if(un) + Strcat(buf, "杖"); + type = '/'; +#endif break; case SPBOOK_CLASS: +#if 0 /*JP*/ Strcpy(buf, "spellbook"); +#else + if(nn) + Strcat(buf,jtrns_obj('+',actualn)); + else if(un) + Strcat(buf, "魔法書"); + type = '+'; +#endif break; case RING_CLASS: +#if 0 /*JP*/ Strcpy(buf, "ring"); +#else + if(nn) + Strcat(buf,jtrns_obj('=',actualn)); + else if(un) + Strcat(buf, "指輪"); + type = '='; +#endif break; case AMULET_CLASS: if(nn) +#if 0 /*JP*/ Strcpy(buf,actualn); else Strcpy(buf,"amulet"); @@ -129,8 +203,28 @@ if(dn) Sprintf(eos(buf)," (%s)",dn); return(buf); +#else + Strcat(buf,jtrns_obj('"',actualn)); + else if(un) + Strcat(buf, "魔除け"); + type = '"'; + break; +#endif +#if 1 /*JP*/ + case GEM_CLASS: + if(nn) + Strcat(buf,jtrns_obj('*',actualn)); + else if(un) + Strcat(buf, "宝石"); + type = '*'; + break; +#endif default: +#if 1 /*JP*/ + type = ' '; +#endif if(nn) { +#if 0 /*JP*/ Strcpy(buf, actualn); if (GemStone(otyp)) Strcat(buf, " stone"); @@ -138,16 +232,29 @@ Sprintf(eos(buf), " called %s", un); if(dn) Sprintf(eos(buf), " (%s)", dn); +#else + Strcat(buf, jtrns_obj(' ',actualn)); +#endif } else { +#if 0 /*JP*/ Strcpy(buf, dn ? dn : actualn); if(ocl->oc_class == GEM_CLASS) Strcat(buf, (ocl->oc_material == MINERAL) ? " stone" : " gem"); if(un) Sprintf(eos(buf), " called %s", un); +#else + Strcat(buf, dn ? jtrns_obj(' ',dn) + : jtrns_obj(' ',actualn)); +#endif } +#if 0 /*JP*/ return(buf); +#else + break; +#endif } +#if 0 /*JP*/ /* here for ring/scroll/potion/wand */ if(nn) { if (ocl->oc_unique) @@ -157,8 +264,14 @@ } if(un) Sprintf(eos(buf), " called %s", un); +#endif if(dn) +#if 0 /*JP*/ Sprintf(eos(buf), " (%s)", dn); +#else + Sprintf(eos(buf), "(%s%s)", jtrns_obj(type, dn), + ocl->oc_class == POTION_CLASS ? "薬" : ""); +#endif return(buf); } @@ -215,6 +328,11 @@ fruitname(juice) boolean juice; /* whether or not to append " juice" to the name */ { +#if 1 /*JP*//*日本語ではそこまでしない*/ + char *buf = nextobuf(); + Sprintf(buf, "%s%s", pl_fruit, juice ? "ジュース" : ""); + return buf; +#else char *buf = nextobuf(); const char *fruit_nam = strstri(pl_fruit, " of "); @@ -225,6 +343,7 @@ Sprintf(buf, "%s%s", makesingular(fruit_nam), juice ? " juice" : ""); return buf; +#endif } #endif /* OVLB */ @@ -241,6 +360,9 @@ register const char *actualn = OBJ_NAME(*ocl); register const char *dn = OBJ_DESCR(*ocl); register const char *un = ocl->oc_uname; +#if 1 /*JP*/ + register const char *jactualn = NULL,*jdn = NULL; +#endif buf = nextobuf() + PREFIX; /* leave room for "17 -3 " */ if (Role_if(PM_SAMURAI) && Japanese_item_name(typ)) @@ -257,65 +379,157 @@ if (!Blind) obj->dknown = TRUE; if (Role_if(PM_PRIEST)) obj->bknown = TRUE; if (obj_is_pname(obj)) +#if 0 /*JP*/ goto nameit; +#else + { + Strcat(buf, jtrns_obj('A', ONAME(obj))); + goto nameit; + } +#endif +#if 1 /*JP*/ + if (obj->onamelth && obj->dknown) { + if(!obj->oartifact) + Strcat(buf, ONAME(obj)); + else + Strcat(buf, jtrns_obj('A', ONAME(obj))); + Strcat(buf, "と名づけられた"); + } +#endif switch (obj->oclass) { case AMULET_CLASS: +#if 1 /*JP*/ + jactualn = jtrns_obj('"', actualn); + jdn = jtrns_obj('"', dn); +#endif if (!obj->dknown) +/*JP Strcpy(buf, "amulet"); +*/ + Strcat(buf, "魔除け"); else if (typ == AMULET_OF_YENDOR || typ == FAKE_AMULET_OF_YENDOR) /* each must be identified individually */ +/*JP Strcpy(buf, obj->known ? actualn : dn); +*/ + Strcat(buf, obj->known ? jactualn : jdn); else if (nn) +#if 0 /*JP*/ Strcpy(buf, actualn); +#else + Strcat(buf, jactualn); +#endif else if (un) +/*JP Sprintf(buf,"amulet called %s", un); +*/ + Sprintf(eos(buf),"%sと呼ばれる魔除け", un); else +/*JP Sprintf(buf,"%s amulet", dn); +*/ + Sprintf(eos(buf),"%s", jdn); break; case WEAPON_CLASS: +#if 1 /*JP*/ + jactualn = jtrns_obj(')',actualn); + jdn = jtrns_obj(')',dn); +#endif if (is_poisonable(obj) && obj->opoisoned) +/*JP Strcpy(buf, "poisoned "); +*/ + Strcpy(buf, "毒の塗られた"); case VENOM_CLASS: case TOOL_CLASS: +#if 1 /*JP*/ + if(obj->oclass == VENOM_CLASS){ + jactualn = jtrns_obj('\'',actualn); + jdn = jtrns_obj('\'',dn); + } + else if(obj->oclass == TOOL_CLASS){ + jactualn = jtrns_obj('(',actualn); + jdn = jtrns_obj('(',dn); + } + if (typ == FIGURINE) + Sprintf(eos(buf), "%sの", jtrns_mon(mons[obj->corpsenm].mname)); +#endif if (typ == LENSES) +/*JP Strcpy(buf, "pair of "); +*/ + Strcpy(buf, "一対の"); if (!obj->dknown) +/*JP Strcat(buf, dn ? dn : actualn); +*/ + Strcat(buf, jdn ? jdn : jactualn); else if (nn) +/*JP Strcat(buf, actualn); +*/ + Strcat(buf, jactualn); else if (un) { +#if 0 /*JP*/ Strcat(buf, dn ? dn : actualn); Strcat(buf, " called "); Strcat(buf, un); +#else + Strcat(buf, un); + Strcat(buf, "と呼ばれる"); + Strcat(buf, dn ? jdn : jactualn); +#endif } else +/*JP Strcat(buf, dn ? dn : actualn); +*/ + Strcat(buf, dn ? jdn : jactualn); +#if 0 /*JP*/ /*これは語順の関係から上の方で定義*/ /* If we use an() here we'd have to remember never to use */ /* it whenever calling doname() or xname(). */ if (typ == FIGURINE) Sprintf(eos(buf), " of a%s %s", index(vowels,*(mons[obj->corpsenm].mname)) ? "n" : "", mons[obj->corpsenm].mname); +#endif break; case ARMOR_CLASS: +#if 1 /*JP*/ + jactualn = jtrns_obj(']',actualn); + jdn = jtrns_obj(']',dn); +#endif /* depends on order of the dragon scales objects */ if (typ >= GRAY_DRAGON_SCALES && typ <= YELLOW_DRAGON_SCALES) { +/*JP Sprintf(buf, "set of %s", actualn); +*/ + Sprintf(buf, "%s一式", jactualn); break; } +/*JP if(is_boots(obj) || is_gloves(obj)) Strcpy(buf,"pair of "); +*/ + if(is_boots(obj) || is_gloves(obj)) Strcat(buf,"一対の"); if(obj->otyp >= ELVEN_SHIELD && obj->otyp <= ORCISH_SHIELD && !obj->dknown) { +/*JP Strcpy(buf, "shield"); +*/ + Strcat(buf, "盾"); break; } if(obj->otyp == SHIELD_OF_REFLECTION && !obj->dknown) { +/*JP Strcpy(buf, "smooth shield"); +*/ + Strcat(buf, "すべすべした盾"); break; } +#if 0 /*JP*/ if(nn) Strcat(buf, actualn); else if(un) { if(is_boots(obj)) @@ -333,8 +547,25 @@ Strcat(buf, " called "); Strcat(buf, un); } else Strcat(buf, dn); +#else + if(nn) Strcat(buf, jactualn); + else if(un) { + char *p; + if(is_boots(obj)) p = "靴"; + else if(is_gloves(obj)) p = "小手"; + else if(is_cloak(obj)) p = "クローク"; + else if(is_helmet(obj)) p = "兜"; + else if(is_shield(obj)) p = "盾"; + else p = "鎧"; + Sprintf(eos(buf), "%sと呼ばれる%s", un, p); + } else Strcat(buf, jdn); +#endif break; case FOOD_CLASS: +#if 1 /*JP*/ + jactualn = jtrns_obj('%',actualn); + jdn = jtrns_obj('%',dn); +#endif if (typ == SLIME_MOLD) { register struct fruit *f; @@ -348,24 +579,58 @@ break; } +#if 0 /*JP*/ Strcpy(buf, actualn); +#endif if (typ == TIN && obj->known) { if(obj->spe > 0) +/*JP Strcat(buf, " of spinach"); +*/ + Strcat(buf, "ホウレン草の"); else if (obj->corpsenm == NON_PM) +/*JP Strcpy(buf, "empty tin"); +*/ + Strcat(buf, "空っぽの"); else if (vegetarian(&mons[obj->corpsenm])) +/*JP Sprintf(eos(buf), " of %s", mons[obj->corpsenm].mname); +*/ + Sprintf(eos(buf), "%sの", jtrns_mon(mons[obj->corpsenm].mname)); else +/*JP Sprintf(eos(buf), " of %s meat", mons[obj->corpsenm].mname); +*/ + Sprintf(eos(buf), "%sの肉の", jtrns_mon(mons[obj->corpsenm].mname)); } +#if 1 /*JP*/ + Strcat(buf, jactualn); +#endif break; case COIN_CLASS: +#if 1 /*JP*/ + jactualn = jtrns_obj('$',actualn); + jdn = jtrns_obj('$',dn); + Strcat(buf, jactualn); + break; +#endif case CHAIN_CLASS: +#if 0 /*JP*/ Strcpy(buf, actualn); +#else + jactualn = jtrns_obj('_',actualn); + jdn = jtrns_obj('_',dn); + Strcat(buf, jactualn); +#endif break; case ROCK_CLASS: +#if 1 /*JP*/ + jactualn = jtrns_obj('\'',actualn); + jdn = jtrns_obj('\'',dn); +#endif if (typ == STATUE) +#if 0 /*JP*/ Sprintf(buf, "%s%s of %s%s", (Role_if(PM_ARCHEOLOGIST) && (obj->spe & STATUE_HISTORIC)) ? "historic " : "" , actualn, @@ -375,102 +640,243 @@ "an " : "a "), mons[obj->corpsenm].mname); else Strcpy(buf, actualn); +#else + Sprintf(eos(buf), "%s%sの%s", + (Role_if(PM_ARCHEOLOGIST) && obj->spe) ? "歴史的な" : "" , + jtrns_mon(mons[obj->corpsenm].mname), jactualn); + else Strcat(buf, jactualn); +#endif break; case BALL_CLASS: +#if 0 /*JP*/ Sprintf(buf, "%sheavy iron ball", (obj->owt > ocl->oc_weight) ? "very " : ""); +#else + Sprintf(eos(buf), "%s%s", + (obj->owt > ocl->oc_weight) ? "とても" : "", + jtrns_obj('0', "heavy iron ball")); +#endif break; case POTION_CLASS: +#if 1 /*JP*/ + jactualn = jtrns_obj('!',actualn); + jdn = jtrns_obj('!',dn); +#endif if (obj->dknown && obj->odiluted) +/*JP Strcpy(buf, "diluted "); +*/ + Strcat(buf, "薄まった"); if(nn || un || !obj->dknown) { +#if 0 /*JP*/ Strcat(buf, "potion"); if(!obj->dknown) break; +#else + if(!obj->dknown){ + Strcat(buf,"薬"); + break; + } +#endif if(nn) { +#if 0 /*JP*/ Strcat(buf, " of "); +#endif if (typ == POT_WATER && obj->bknown && (obj->blessed || obj->cursed)) { +/*JP Strcat(buf, obj->blessed ? "holy " : "unholy "); +*/ + Strcat(buf, obj->blessed ? "聖" : "不浄な"); } +/*JP Strcat(buf, actualn); +*/ + Strcat(buf, jactualn); } else { +#if 0 /*JP*/ Strcat(buf, " called "); Strcat(buf, un); +#else + Strcat(buf, un); + Strcat(buf, "と呼ばれる薬"); +#endif } } else { +#if 0 /*JP*/ Strcat(buf, dn); Strcat(buf, " potion"); +#else + Strcat(buf, jdn); + Strcat(buf, "薬"); +#endif } break; case SCROLL_CLASS: +#if 1 /*JP*/ + jactualn = jtrns_obj('?', actualn); + jdn = jtrns_obj('?', dn); + if(!obj->dknown){ + Strcat(buf,"巻物"); + break; + } +#else Strcpy(buf, "scroll"); if(!obj->dknown) break; +#endif if(nn) { +#if 0 /*JP*/ Strcat(buf, " of "); Strcat(buf, actualn); +#else + Strcat(buf, jactualn); +#endif } else if(un) { +#if 0 /*JP*/ Strcat(buf, " called "); Strcat(buf, un); +#else + Strcat(buf, un); + Strcat(buf, "と呼ばれる巻物"); +#endif } else if (ocl->oc_magic) { +#if 0 /*JP*/ Strcat(buf, " labeled "); Strcat(buf, dn); +#else + Strcat(buf, jdn); +#endif } else { +#if 0 /*JP*/ Strcpy(buf, dn); Strcat(buf, " scroll"); +#else + Strcat(buf, jdn); +#endif } break; case WAND_CLASS: +#if 1 /*JP*/ + jactualn = jtrns_obj('/',actualn); + jdn = jtrns_obj('/',dn); +#endif if(!obj->dknown) +/*JP Strcpy(buf, "wand"); +*/ + Strcat(buf, "杖"); else if(nn) +/*JP Sprintf(buf, "wand of %s", actualn); +*/ + Strcat(buf, jactualn); else if(un) +/*JP Sprintf(buf, "wand called %s", un); +*/ + Sprintf(eos(buf), "%sと呼ばれる杖", un); else +/*JP Sprintf(buf, "%s wand", dn); +*/ + Strcat(buf, jdn); break; case SPBOOK_CLASS: +#if 1 /*JP*/ + jactualn = jtrns_obj('+',actualn); + jdn = jtrns_obj('+',dn); +#endif if (!obj->dknown) { +/*JP Strcpy(buf, "spellbook"); +*/ + Strcat(buf, "魔法書"); } else if (nn) { +#if 0 /*JP*/ if (typ != SPE_BOOK_OF_THE_DEAD) Strcpy(buf, "spellbook of "); Strcat(buf, actualn); +#else + Strcat(buf, jactualn); +#endif } else if (un) { +/*JP Sprintf(buf, "spellbook called %s", un); +*/ + Sprintf(eos(buf), "%sと呼ばれる魔法書", un); } else +/*JP Sprintf(buf, "%s spellbook", dn); +*/ + Sprintf(eos(buf), "%s", jdn); break; case RING_CLASS: +#if 1 /*JP*/ + jactualn = jtrns_obj('=',actualn); + jdn = jtrns_obj('=',dn); +#endif if(!obj->dknown) +/*JP Strcpy(buf, "ring"); +*/ + Strcat(buf, "指輪"); else if(nn) +/*JP Sprintf(buf, "ring of %s", actualn); +*/ + Strcat(buf, jactualn); else if(un) +/*JP Sprintf(buf, "ring called %s", un); +*/ + Sprintf(eos(buf), "%sと呼ばれる指輪", un); else +/*JP Sprintf(buf, "%s ring", dn); +*/ + Strcat(buf, jdn); break; case GEM_CLASS: +#if 1 /*JP*/ + jactualn = jtrns_obj('*',actualn); + jdn = jtrns_obj('*',dn); +#endif { const char *rock = +/*JP (ocl->oc_material == MINERAL) ? "stone" : "gem"; +*/ + (ocl->oc_material == MINERAL) ? "石" : "宝石"; if (!obj->dknown) { +/*JP Strcpy(buf, rock); +*/ + Strcat(buf, rock); } else if (!nn) { +#if 0 /*JP*/ if (un) Sprintf(buf,"%s called %s", rock, un); else Sprintf(buf, "%s %s", dn, rock); +#else + if (un) Sprintf(eos(buf), "%sと呼ばれる%s", un, rock); + else Strcat(buf, jdn); +#endif } else { +#if 0 /*JP*/ Strcpy(buf, actualn); if (GemStone(typ)) Strcat(buf, " stone"); +#else + Strcpy(buf, jactualn); +#endif } break; } default: Sprintf(buf,"glorkum %d %d %d", obj->oclass, typ, obj->spe); } +#if 0 /*JP*/ if (obj->quan != 1L) Strcpy(buf, makeplural(buf)); +#endif +#if 0 /*JP*/ if (obj->onamelth && obj->dknown) { Strcat(buf, " named "); nameit: @@ -478,6 +884,9 @@ } if (!strncmpi(buf, "the ", 4)) buf += 4; +#else +nameit: +#endif return(buf); } @@ -494,7 +903,11 @@ Strcpy(tmpbuf, onm); /* "the Nth arrow"; value will eventually be passed to an() or The(), both of which correctly handle this "the " prefix */ +#if 0 /*JP*/ Sprintf(onm, "the %d%s %s", m_shot.i, ordin(m_shot.i), tmpbuf); +#else + Sprintf(onm, "%d%s目の%s", m_shot.i, numeral(obj), tmpbuf); +#endif } return onm; @@ -503,6 +916,7 @@ #endif /* OVL1 */ #ifdef OVL0 +#if 0 /*JP*/ /* used for naming "the unique_item" instead of "a unique_item" */ boolean the_unique_obj(obj) @@ -516,6 +930,7 @@ return (boolean)(objects[obj->otyp].oc_unique && (obj->known || obj->otyp == AMULET_OF_YENDOR)); } +#endif static void add_erosion_words(obj,prefix) @@ -531,26 +946,50 @@ * rotted food and diluted potions, which are all not is_damageable(). */ if (obj->oeroded && !iscrys) { +#if 0 /*JP*/ switch (obj->oeroded) { case 2: Strcat(prefix, "very "); break; case 3: Strcat(prefix, "thoroughly "); break; } Strcat(prefix, is_rustprone(obj) ? "rusty " : "burnt "); +#else + switch (obj->oeroded) { + case 2: Strcat(prefix, "とても"); break; + case 3: Strcat(prefix, "かなり"); break; + } + Strcat(prefix, is_rustprone(obj) ? "錆びた" : "傷ついた"); +#endif } if (obj->oeroded2 && !iscrys) { +#if 0 /*JP*/ switch (obj->oeroded2) { case 2: Strcat(prefix, "very "); break; case 3: Strcat(prefix, "thoroughly "); break; } Strcat(prefix, is_corrodeable(obj) ? "corroded " : "rotted "); +#else + switch (obj->oeroded2) { + case 2: Strcat(prefix, "とても"); break; + case 3: Strcat(prefix, "かなり"); break; + } + Strcat(prefix, is_corrodeable(obj) ? "腐食した" : + "腐った"); +#endif } if (obj->rknown && obj->oerodeproof) Strcat(prefix, +#if 0 /*JP*/ iscrys ? "fixed " : is_rustprone(obj) ? "rustproof " : is_corrodeable(obj) ? "corrodeproof " : /* "stainless"? */ is_flammable(obj) ? "fireproof " : ""); +#else + iscrys ? "安定した" : + is_rustprone(obj) ? "錆びない" : + is_corrodeable(obj) ? "腐食しない" : /* "stainless"? */ + is_flammable(obj) ? "燃えない" : ""); +#endif } char * @@ -559,11 +998,16 @@ { boolean ispoisoned = FALSE; char prefix[PREFIX]; +#if 0 /*JP*/ char tmpbuf[PREFIX+1]; +#endif /* when we have to add something at the start of prefix instead of the * end (Strcat is used on the end) */ register char *bp = xname(obj); +#if 1 /*JP*/ /* 苦肉の策 */ + char preprefix[PREFIX], *tp; +#endif /* When using xname, we want "poisoned arrow", and when using * doname, we want "poisoned +0 arrow". This kludge is about the only @@ -571,19 +1015,46 @@ * combining both into one function taking a parameter. */ /* must check opoisoned--someone can have a weirdly-named fruit */ +#if 0 /*JP*/ if (!strncmp(bp, "poisoned ", 9) && obj->opoisoned) { bp += 9; ispoisoned = TRUE; } +#else + if (!strncmp(bp, "毒の塗られた", 12) && obj->opoisoned) { + bp += 12; + ispoisoned = TRUE; + } +#endif +#if 1 /*JP*/ + /* JP + *「子猫のたまと名づけられた死体」より「たまと名づけられた子猫の死体」 + * のほうが自然である. + */ + preprefix[0] = '\0'; + if((tp = strstri(bp, "名づけられた")) != NULL){ + tp += 12; /* 「名づけられた」*/ + strncpy(preprefix, bp, tp - bp); + preprefix[tp - bp] = '\0'; + bp = tp; + } + Strcpy(prefix, ""); +#endif if(obj->quan != 1L) +#if 0 /*JP*/ Sprintf(prefix, "%ld ", obj->quan); +#else /* 日本語としては数詞がないのは不自然 */ + Sprintf(prefix, "%ld%sの", obj->quan, numeral(obj)); +#endif +#if 0 /*JP*/ /* 冠詞は不要 */ else if (obj_is_pname(obj) || the_unique_obj(obj)) { if (!strncmpi(bp, "the ", 4)) bp += 4; Strcpy(prefix, "the "); } else Strcpy(prefix, "a "); +#endif #ifdef INVISIBLE_OBJECTS if (obj->oinvis) Strcat(prefix,"invisible "); @@ -597,9 +1068,15 @@ * always allow "uncursed potion of water" */ if (obj->cursed) +/*JP Strcat(prefix, "cursed "); +*/ + Strcat(prefix, "呪われた"); else if (obj->blessed) +/*JP Strcat(prefix, "blessed "); +*/ + Strcat(prefix, "祝福された"); else if ((!obj->known || !objects[obj->otyp].oc_charged || (obj->oclass == ARMOR_CLASS || obj->oclass == RING_CLASS)) @@ -619,19 +1096,31 @@ && obj->otyp != FAKE_AMULET_OF_YENDOR && obj->otyp != AMULET_OF_YENDOR && !Role_if(PM_PRIEST)) +/*JP Strcat(prefix, "uncursed "); +*/ + Strcat(prefix, "呪われていない"); } +/*JP if (obj->greased) Strcat(prefix, "greased "); +*/ + if (obj->greased) Strcat(prefix, "油の塗られた"); switch(obj->oclass) { case AMULET_CLASS: if(obj->owornmask & W_AMUL) +/*JP Strcat(bp, " (being worn)"); +*/ + Strcat(bp, "(身につけている)"); break; case WEAPON_CLASS: if(ispoisoned) +/*JP Strcat(prefix, "poisoned "); +*/ + Strcat(prefix, "毒の塗られた"); plus: add_erosion_words(obj, prefix); if(obj->known) { @@ -641,8 +1130,13 @@ break; case ARMOR_CLASS: if(obj->owornmask & W_ARMOR) +#if 0 /*JP*/ Strcat(bp, (obj == uskin) ? " (embedded in your skin)" : " (being worn)"); +#else + Strcat(bp, (obj == uskin) ? "(肌に埋めこまれている)" : + "(身につけている)"); +#endif goto plus; case TOOL_CLASS: /* weptools already get this done when we go to the +n code */ @@ -653,16 +1147,23 @@ | W_SADDLE #endif )) { +/*JP Strcat(bp, " (being worn)"); +*/ + Strcat(bp, "(身につけている)"); break; } if (obj->otyp == LEASH && obj->leashmon != 0) { +/*JP Strcat(bp, " (in use)"); +*/ + Strcat(bp, "(結びつけている)"); break; } if (is_weptool(obj)) goto plus; if (obj->otyp == CANDELABRUM_OF_INVOCATION) { +#if 0 /*JP*/ if (!obj->spe) Strcpy(tmpbuf, "no"); else @@ -670,14 +1171,32 @@ Sprintf(eos(bp), " (%s candle%s%s)", tmpbuf, plur(obj->spe), !obj->lamplit ? " attached" : ", lit"); +#else + if(!obj->spe) + Sprintf(eos(bp), "(一本も取りつけられていない)"); + else { + if(!obj->lamplit) + Sprintf(eos(bp), "(%d本取りつけられている)", + obj->spe); + else + Sprintf(eos(bp), "(%d本光っている)", + obj->spe); + } +#endif break; } else if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP || obj->otyp == BRASS_LANTERN || Is_candle(obj)) { if (Is_candle(obj) && obj->age < 20L * (long)objects[obj->otyp].oc_cost) +/*JP Strcat(prefix, "partly used "); +*/ + Strcat(prefix, "使いさしの"); if(obj->lamplit) +/*JP Strcat(bp, " (lit)"); +*/ + Strcat(bp, "(光っている)"); break; } if(objects[obj->otyp].oc_charged) @@ -687,39 +1206,68 @@ add_erosion_words(obj, prefix); charges: if(obj->known) +/*JP Sprintf(eos(bp), " (%d:%d)", (int)obj->recharged, obj->spe); +*/ + Sprintf(eos(bp), "(%d:%d)", (int)obj->recharged, obj->spe); break; case POTION_CLASS: if (obj->otyp == POT_OIL && obj->lamplit) +/*JP Strcat(bp, " (lit)"); +*/ + Strcat(bp, "(光っている)"); break; case RING_CLASS: add_erosion_words(obj, prefix); ring: +/*JP if(obj->owornmask & W_RINGR) Strcat(bp, " (on right "); +*/ + if(obj->owornmask & W_RINGR) Strcat(bp, "(右"); +/*JP if(obj->owornmask & W_RINGL) Strcat(bp, " (on left "); +*/ + if(obj->owornmask & W_RINGL) Strcat(bp, "(左"); if(obj->owornmask & W_RING) { Strcat(bp, body_part(HAND)); Strcat(bp, ")"); } if(obj->known && objects[obj->otyp].oc_charged) { +#if 1 /*JP*/ + Strcat(prefix, " "); +#endif Strcat(prefix, sitoa(obj->spe)); Strcat(prefix, " "); } break; case FOOD_CLASS: if (obj->oeaten) +/*JP Strcat(prefix, "partly eaten "); +*/ + Strcat(prefix, "食べかけの"); if (obj->otyp == CORPSE) { if (mons[obj->corpsenm].geno & G_UNIQ) { +#if 0 /*JP*/ Sprintf(prefix, "%s%s ", (type_is_pname(&mons[obj->corpsenm]) ? "" : "the "), s_suffix(mons[obj->corpsenm].mname)); if (obj->oeaten) Strcat(prefix, "partly eaten "); +#else + if (obj->oeaten) Strcpy(prefix, "食べかけの"); + Sprintf(eos(prefix), "%sの", + jtrns_mon(mons[obj->corpsenm].mname)); +#endif } else { +#if 0 /*JP*/ Strcat(prefix, mons[obj->corpsenm].mname); Strcat(prefix, " "); +#else + Strcat(prefix, jtrns_mon(mons[obj->corpsenm].mname)); + Strcat(prefix, "の"); +#endif } } else if (obj->otyp == EGG) { #if 0 /* corpses don't tell if they're stale either */ @@ -729,10 +1277,18 @@ if (obj->corpsenm >= LOW_PM && (obj->known || mvitals[obj->corpsenm].mvflags & MV_KNOWS_EGG)) { +#if 0 /*JP*/ Strcat(prefix, mons[obj->corpsenm].mname); Strcat(prefix, " "); +#else + Strcat(prefix, jtrns_mon(mons[obj->corpsenm].mname)); + Strcat(prefix, "の"); +#endif if (obj->spe) +/*JP Strcat(bp, " (laid by you)"); +*/ + Strcat(bp, "(あなたが産んだ)"); } } if (obj->otyp == MEAT_RING) goto ring; @@ -741,28 +1297,46 @@ case CHAIN_CLASS: add_erosion_words(obj, prefix); if(obj->owornmask & W_BALL) +/*JP Strcat(bp, " (chained to you)"); +*/ + Strcat(bp, "(あなたに繋がれている)"); break; } if((obj->owornmask & W_WEP) && !mrg_to_wielded) { if (obj->quan != 1L) { +/*JP Strcat(bp, " (wielded)"); +*/ + Strcat(bp, "(装備している)"); } else { const char *hand_s = body_part(HAND); if (bimanual(obj)) hand_s = makeplural(hand_s); +/*JP Sprintf(eos(bp), " (weapon in %s)", hand_s); +*/ + Sprintf(eos(bp), "(%sにしている)", hand_s); } } if(obj->owornmask & W_SWAPWEP) { if (u.twoweap) +/*JP Sprintf(eos(bp), " (wielded in other %s)", +*/ + Sprintf(eos(bp), "(左%sにしている)", body_part(HAND)); else +/*JP Strcat(bp, " (alternate weapon; not wielded)"); +*/ + Strcat(bp, "(予備の武器;装備していない)"); } +/*JP if(obj->owornmask & W_QUIVER) Strcat(bp, " (in quiver)"); +*/ + if(obj->owornmask & W_QUIVER) Strcat(bp, "(装填している)"); if(obj->unpaid) { xchar ox, oy; long quotedprice = unpaid_cost(obj); @@ -773,9 +1347,14 @@ costly_spot(ox, oy) && (shkp = shop_keeper(*in_rooms(ox, oy, SHOPBASE)))) quotedprice += contained_cost(obj, shkp, 0L, FALSE, TRUE); +#if 0 /*JP*/ Sprintf(eos(bp), " (unpaid, %ld %s)", +#else + Sprintf(eos(bp), "(未払い,%ld%s)", +#endif quotedprice, currency(quotedprice)); } +#if 0 /*JP*/ /* a-an はない */ if (!strncmp(prefix, "a ", 2) && index(vowels, *(prefix+2) ? *(prefix+2) : *bp) && (*(prefix+2) || (strncmp(bp, "uranium", 7) @@ -786,6 +1365,10 @@ Strcpy(prefix+3, tmpbuf+2); } bp = strprepend(bp, prefix); +#else + Strcat(preprefix,prefix); + bp = strprepend(bp, preprefix); +#endif return(bp); } @@ -836,12 +1419,17 @@ { char *nambuf = nextobuf(); +#if 1 /*JP*/ + Sprintf(nambuf, "%sの死体", jtrns_mon(mons[otmp->corpsenm].mname)); + return nambuf; +#else Sprintf(nambuf, "%s corpse", mons[otmp->corpsenm].mname); if (ignore_oquan || otmp->quan < 2) return nambuf; else return makeplural(nambuf); +#endif } /* xname, unless it's a corpse, then corpse_xname(obj, FALSE) */ @@ -923,6 +1511,7 @@ { char *buf = nextobuf(); +#if 0 /*JP*/ buf[0] = '\0'; if (strncmpi(str, "the ", 4) && @@ -941,6 +1530,9 @@ } Strcat(buf, str); +#else + Strcpy(buf, str); +#endif return buf; } @@ -949,7 +1541,9 @@ const char *str; { register char *tmp = an(str); +#if 0 /*JP*/ *tmp = highc(*tmp); +#endif return tmp; } @@ -962,6 +1556,7 @@ const char *str; { char *buf = nextobuf(); +#if 0 /*JP*/ boolean insert_the = FALSE; if (!strncmpi(str, "the ", 4)) { @@ -1001,6 +1596,9 @@ buf[0] = '\0'; Strcat(buf, str); +#else + Strcpy(buf, str); +#endif /*JP*/ return buf; } @@ -1009,10 +1607,22 @@ const char *str; { register char *tmp = the(str); +#if 0 /*JP*/ *tmp = highc(*tmp); +#endif return tmp; } +#if 1 /*JP*/ +char * +aobjnam(otmp, verb) +register struct obj *otmp; +register const char *verb; +{ + return xname(otmp); +} + +#else /* returns "count cxname(otmp)" or just cxname(otmp) if count == 1 */ char * aobjnam(otmp,verb) @@ -1020,6 +1630,17 @@ register const char *verb; { register char *bp = cxname(otmp); +#if 1 /*JP*/ + static char prefix[PREFIX]; + + Strcpy(prefix,bp); + if(verb){ + Strcat(prefix,"は"); + Strcat(prefix,verb); + } + + return prefix; +#else char prefix[PREFIX]; if(otmp->quan != 1L) { @@ -1032,8 +1653,11 @@ Strcat(bp, otense(otmp, verb)); } return(bp); +#endif } +#endif +#if 0 /*JP*//*日本語には三単現のsはない*/ /* like aobjnam, but prepend "The", not count, and use xname */ char * Tobjnam(otmp, verb) @@ -1048,7 +1672,9 @@ } return(bp); } +#endif +#if 0 /*JP*//*日本語には三単現のsはない*/ /* return form of the verb (input plural) if xname(otmp) were the subject */ char * otense(otmp, verb) @@ -1069,6 +1695,7 @@ Strcpy(buf, verb); return buf; } +#endif /* various singular words that vtense would otherwise categorize as plural */ static const char * const special_subjs[] = { @@ -1083,6 +1710,7 @@ 0 }; +#if 0 /*JP*//*日本語には三単現のsはない*/ /* return form of the verb (input plural) for present tense 3rd person subj */ char * vtense(subj, verb) @@ -1177,6 +1805,7 @@ return buf; } +#endif /* capitalized variant of doname() */ char * @@ -1196,9 +1825,15 @@ { char *outbuf = nextobuf(); char *s = shk_your(outbuf, obj); /* assert( s == outbuf ); */ +#if 0 /*JP*/ int space_left = BUFSZ - strlen(s) - sizeof " "; return strncat(strcat(s, " "), cxname(obj), space_left); +#else + int space_left = BUFSZ - strlen(s); + + return strncat(s, xname(obj), space_left); +#endif } /* capitalized variant of yname() */ @@ -1208,7 +1843,9 @@ { char *s = yname(obj); +#if 0 /*JP*/ *s = highc(*s); +#endif return s; } @@ -1222,9 +1859,15 @@ { char *outbuf = nextobuf(); char *s = shk_your(outbuf, obj); /* assert( s == outbuf ); */ +#if 0 /*JP*/ int space_left = BUFSZ - strlen(s) - sizeof " "; return strncat(strcat(s, " "), simple_typename(obj->otyp), space_left); +#else + int space_left = BUFSZ - strlen(s); + + return strncat(s, simple_typename(obj->otyp), space_left); +#endif } /* capitalized variant of ysimple_name() */ @@ -1234,7 +1877,9 @@ { char *s = ysimple_name(obj); +#if 0 /*JP*/ *s = highc(*s); +#endif return s; } @@ -1268,6 +1913,11 @@ makeplural(oldstr) const char *oldstr; { +/*JP: Japanese is simple... */ +#if 1 /*JP*/ + char *str = nextobuf(); + Strcpy(str, oldstr); +#else /* Note: cannot use strcmpi here -- it'd give MATZot, CAVEMeN,... */ register char *spot; char *str = nextobuf(); @@ -1478,6 +2128,7 @@ Strcpy(spot+1, "s"); bottom: if (excess) Strcpy(eos(str), excess); +#endif /*JP*/ return str; } @@ -1532,11 +2183,20 @@ * of readobjnam, and is also used in pager.c to singularize the string * for which help is sought. */ +/*JP + * 基本的には単数化は必要ないのでコメントアウト。 + * 但し、願いで複数形の英語を入力すると判定されなくなるので、 + * それを避けたい場合は #define USE_MAKESINGULAR すれば単数化される。 + */ char * makesingular(oldstr) const char *oldstr; { +#ifdef USE_MAKESINGULAR /*JP*/ register char *p, *bp; +#else + register char *bp; +#endif char *str = nextobuf(); if (!oldstr || !*oldstr) { @@ -1547,6 +2207,7 @@ Strcpy(str, oldstr); bp = str; +#ifdef USE_MAKESINGULAR /*JP*//*日本語は単複同形*/ while (*bp == ' ') bp++; /* find "cloves of garlic", "worthless pieces of blue glass" */ if ((p = strstri(bp, "s of ")) != 0) { @@ -1634,6 +2295,7 @@ /* here we cannot find the plural suffix */ } +#endif return bp; } @@ -1746,6 +2408,7 @@ * return null. * If from_user is false, we're reading from the wizkit, nothing was typed in. */ + struct obj * readobjnam(bp, no_wish, from_user) register char *bp; @@ -1766,6 +2429,10 @@ struct fruit *f; int ftype = current_fruit; char fruitbuf[BUFSZ]; +#if 1 /*JP*/ + char buf[BUFSZ]; + char pfx[BUFSZ]; +#endif /* Fruits may not mess up the ability to wish for real objects (since * you can leave a fruit in a bones file and it will be added to * another person's game), so they must be checked for last, after @@ -1801,6 +2468,134 @@ actualn = dn = un = 0; if (!bp) goto any; + +#if 1 /*JP*/ + /* 2バイト文字のスペースを削除 */ +#undef WISHDEBUG + +#ifdef WISHDEBUG + pline("Wish DEBUG[%s]\n", bp); +#endif + while(delete(bp, " ")) + ; +#ifdef WISHDEBUG + pline("Wish DEBUG[%s]\n", bp); +#endif + Strcpy(buf, bp); + +#define S(a, b) substitute(buf, (a), (b)) +#define T(a) transpose(buf, (a)) +#define D(a) delete(buf, (a)) +#define I(a) insert(buf, (a)) + +/* 特殊2バイト文字を1バイト文字へ変換 */ + + while(S("+", "+") || + S("−", "-") || + S("(", "(") || + S(")", ")") || + S("0", "0") || + S("1", "1") || + S("2", "2") || + S("3", "3") || + S("4", "4") || + S("5", "5") || + S("6", "6") || + S("7", "7") || + S("8", "8") || + S("9", "9")) + ; + +#ifdef WISHDEBUG + pline("Wish DEBUG0[%s]\n", bp); +#endif + + T("と名づけられた"); + T("と呼ばれる"); + T("と言う名の"); + T("という名の"); + + S("と名づけられた", " named "); + S("と呼ばれる", " called "); + S("と言う名の", " named "); + S("という名の", " named "); + + T("ホウレン草の"); + S("ホウレン草の", " of spinach "); + + T("の死体"); + S("の死体", " corpse of "); + + T("の死骸"); + S("の死骸", " corpse of "); + + T("の像"); + S("の像", " statue of "); + + T("の人形"); + S("の人形", " figurine of "); + + S("祝福された", "blessed "); + S("聖水", "holy water "); + S("聖なる", "blessed "); + + S("呪われた", "cursed "); + S("不浄な", "cursed "); + + S("呪われていない", "uncursed "); + + S("錆びない", "rustproof "); + S("腐食しない", "erodeproof "); + S("燃えない", "corrodeproof "); + S("傷つかない", "fireproof "); + + S("光っている", "lit "); + S("燃えている", "burning "); + S("消えている", "unlit "); + S("ラベルのない", "unlabelled "); + S("真っ白な", "blank "); + + S("毒の塗られた", "poisoned "); + S("油の塗られた", "greased "); + S("脂の塗られた", "greased "); + + S("とても", "very "); + S("かなり", "thoroughly "); + + S("錆びた", "rusty "); + S("腐食した", "eroded "); + S("傷ついた", "damaged "); + S("腐った", "rotted "); + S("燃えた", "burned "); + + S("食べかけの", "partly eaten "); + + S("薄い", "diluted "); + S("薄まった", "diluted "); + + S("空の", "empty "); + S("空っぽの", "empty "); + + D("一式"); + + if(strlen(buf)>4 && !strcmp(buf + strlen(buf) - 4, "巻物")) + Strcpy(pfx, "scroll of "); + else if(strlen(buf)>6 && !strcmp(buf + strlen(buf) - 6, "巻き物")) + Strcpy(pfx, "scroll of "); + else if(strlen(buf)>6 && !strcmp(buf + strlen(buf) - 6, "魔法書")) + Strcpy(pfx, "spellbook of "); + else if(strlen(buf)>2 && !strcmp(buf + strlen(buf) - 2, "杖")) + Strcpy(pfx, "wand of "); + else if(strlen(buf)>4 && !strcmp(buf + strlen(buf) - 4, "指輪")) + Strcpy(pfx, "ring of "); + else + pfx[0] = '\0'; + + bp = buf; +#ifdef WISHDEBUG + pline("Wish DEBUG1[%s]\n", bp); +#endif +#endif /*JP*/ /* first, remove extra whitespace they may have typed */ (void)mungspaces(bp); /* allow wishing for "nothing" to preserve wishless conduct... @@ -1819,15 +2614,88 @@ cnt = 1; } else if (!strncmpi(bp, "the ", l=4)) { ; /* just increment `bp' by `l' below */ +#if 0 /*JP*/ } else if (!cnt && digit(*bp) && strcmp(bp, "0")) { cnt = atoi(bp); while(digit(*bp)) bp++; +#else + } else if (!cnt && digit_8(*bp) && strcmp(bp, "0")) { + cnt = atoi_8(bp); + while(digit_8(*bp)) bp++; +#endif while(*bp == ' ') bp++; l = 0; +#if 1 /*JP*/ +/* 後に数詞があるときは削除 */ + if(!strncmp(bp, "冊の", l = 4) || + !strncmp(bp, "本の", l = 4) || + !strncmp(bp, "着の", l = 4) || + !strncmp(bp, "個の", l = 4) || + !strncmp(bp, "枚の", l = 4) || + !strncmp(bp, "つの", l = 4) || + !strncmp(bp, "の", l = 2)) + ; + else + l = 0; +#endif +#if 1 /*JP*/ + /* +漢字で数字を指定するときは数詞が必要 +*/ + } else if(!cnt && + (!strncmp(bp + 2, "冊の", l = 4) || + !strncmp(bp + 2, "本の", l = 4) || + !strncmp(bp + 2, "着の", l = 4) || + !strncmp(bp + 2, "個の", l = 4) || + !strncmp(bp + 2, "枚の", l = 4) || + !strncmp(bp + 2, "つの", l = 4) || + !strncmp(bp + 2, "の", l = 2))){ + if(!strncmp(bp, "一", 2)){ + cnt = 1; + } + else if(!strncmp(bp, "二", 2)){ + cnt = 2; + } + else if(!strncmp(bp, "三", 2)){ + cnt = 3; + } + else if(!strncmp(bp, "四", 2)){ + cnt = 4; + } + else if(!strncmp(bp, "五", 2)){ + cnt = 5; + } + else if(!strncmp(bp, "六", 2)){ + cnt = 6; + } + else if(!strncmp(bp, "七", 2)){ + cnt = 7; + } + else if(!strncmp(bp, "八", 2)){ + cnt = 8; + } + else if(!strncmp(bp, "九", 2)){ + cnt = 9; + } + else if(!strncmp(bp, "十", 2)){ + cnt = 10; + } + if(cnt) + l += 2; + else{ + l = 0; + cnt = 1; + } +#endif } else if (*bp == '+' || *bp == '-') { spesgn = (*bp++ == '+') ? 1 : -1; +#if 0 /*JP*/ spe = atoi(bp); while(digit(*bp)) bp++; +#else + spe = atoi_8(bp); + while(digit_8(*bp)) bp++; +#endif while(*bp == ' ') bp++; l = 0; } else if (!strncmpi(bp, "blessed ", l=8) || @@ -1903,7 +2771,10 @@ if (!strcmpi(p, "lit)")) { islit = 1; } else { +/*JP spe = atoi(p); +*/ + spe = atoi_8(p); while (digit(*p)) p++; if (*p == ':') { p++; @@ -1921,6 +2792,78 @@ } } } +#if 1 /*JP*/ + while(*bp == ' ') + ++bp; +/* +天邪鬼のために 1から10まではサポート. +*/ + if(!strncmp(bp, "一", 2)){ + spe = 1; bp += 2; + } + else if(!strncmp(bp, "二", 2)){ + spe = 2; bp += 2; + } + else if(!strncmp(bp, "三", 2)){ + spe = 3; bp += 2; + } + else if(!strncmp(bp, "四", 2)){ + spe = 4; bp += 2; + } + else if(!strncmp(bp, "五", 2)){ + spe = 5; bp += 2; + } + else if(!strncmp(bp, "六", 2)){ + spe = 6; bp += 2; + } + else if(!strncmp(bp, "七", 2)){ + spe = 7; bp += 2; + } + else if(!strncmp(bp, "八", 2)){ + spe = 8; bp += 2; + } + else if(!strncmp(bp, "九", 2)){ + spe = 9; bp += 2; + } + else if(!strncmp(bp, "十", 2)){ + spe = 10; bp += 2; + } + + while(*bp == ' ') + ++bp; + + while(1) + { + unsigned char *bp2, *bp1; + unsigned char buf1[BUFSZ]; + const char *en; + + bp1 = buf1; + bp2 = (unsigned char *)bp; + + while(!(*bp2 & 0x80)) + ++bp2; + + while(*bp2 & 0x80){ + *(bp1++) = *(bp2++); + *(bp1++) = *(bp2++); + } + *bp1 = '\0'; + +#ifdef WISHDEBUG + pline("Wish DEBUG2[%s]\n", bp); +#endif + en = etrns_obj(' ', buf1); + if(!strncmpi(en, "The Staff of Aesculapius", 24)) + substitute(pfx, "wand of ", ""); + Strcat(pfx, en); + if(!strcmp(en, buf1) || !substitute(bp, buf1, pfx)) + break; + } +#ifdef WISHDEBUG + pline("Wish DEBUG3[%s]", bp); +#endif +#endif /* otmp->spe is type schar; so we don't want spe to be any bigger or smaller. also, spe should always be positive -- some cheaters may try to confuse @@ -2700,7 +3643,10 @@ artifact_exists(otmp, ONAME(otmp), FALSE); obfree(otmp, (struct obj *) 0); otmp = &zeroobj; +/*JP pline("For a moment, you feel %s in your %s, but it disappears!", +*/ + pline("一瞬%sが%sの中にあるような感じがしたが,すぐに消えさった!", something, makeplural(body_part(HAND))); } @@ -2758,17 +3704,34 @@ if (cloak) { switch (cloak->otyp) { case ROBE: +#if 0 /*JP*/ return "robe"; +#else + return "ローブ"; +#endif case MUMMY_WRAPPING: +#if 0 /*JP*/ return "wrapping"; +#else + return "包帯"; +#endif case ALCHEMY_SMOCK: +#if 0 /*JP*/ return (objects[cloak->otyp].oc_name_known && cloak->dknown) ? "smock" : "apron"; +#else + return (objects[cloak->otyp].oc_name_known && + cloak->dknown) ? "スモック" : "エプロン"; +#endif default: break; } } +#if 0 /*JP*/ return "cloak"; +#else + return "クローク"; +#endif } const char * @@ -2777,11 +3740,149 @@ { if (mtmp->m_ap_type == M_AP_OBJECT && mtmp->mappearance != STRANGE_OBJECT) { int idx = objects[mtmp->mappearance].oc_descr_idx; +#if 0 /*JP*/ if (mtmp->mappearance == GOLD_PIECE) return "gold"; +#else + if (mtmp->mappearance == GOLD_PIECE) return "金貨"; +#endif return obj_descr[idx].oc_name; } +#if 0 /*JP*/ return "whatcha-may-callit"; +#else + return "何とかいうもの"; +#endif } #endif /* OVLB */ +#if 1 /*JP*/ +/* +** 文字列 buf の str1を str2へ置換 +** bufは置換後の文字列が入るだけの領域が必要 +*/ +static +char * +substitute(buf, str1, str2) + char *buf; + char *str1; + char *str2; +{ + unsigned char *p, *pp; + char tmp[BUFSZ]; + int len = strlen(str1); + + if(!buf) + return buf; + + p = (unsigned char *)buf; + + while(*p){ + if(!strncmp(p, str1, len)){ + Strcpy(tmp, p + len); + while(*str2) + *(p++) = *(str2++); + + pp = tmp; + while(*pp) + *(p++) = *(pp++); + *(p++) = '\0'; + return buf; + } + if(*p >= 0x80) + p += 2; + else + ++p; + } + + return (char *)0; +} + +/* +** 文字列 buf の strの前の部分と strの後の部分を交換する. +** +** EX) ほえほえ(と名づけられた)犬 -> 犬(と名づけられた)ほえほえ +*/ +static +char * +transpose(buf, str) + char *buf; + char *str; +{ + unsigned char *p, *pp, *ppp; + char tmp[BUFSZ]; + int len = strlen(str); + + Strcpy(tmp, buf); + ppp = pp = p = (unsigned char *)tmp; + + while(*p){ + if(!strncmp(p, str, len)){ + Strcpy(buf, p + len); + Strcat(buf, str); + ppp = eos(buf); + while(pp != p) + *(ppp++) = *(pp++); + *(ppp++) = '\0'; + return buf; + } + if(*p >= 0x80) + p += 2; + else + ++p; + } + + return (char *)0; + +} +/* +** 文字列 buf の先頭に strを挿入する +*/ +#if 0 +static +char * +insert(buf, str) + char *buf; + char *str; +{ + return substitute(buf, "", str); +} +#endif + +/* +** 文字列 buf から strを取り除く. +*/ +static +char * +delete(buf, str) + char *buf; + char *str; +{ + return substitute(buf, str, (char *)""); +} + +static int +digit_8(c) + int c; +{ + unsigned int uc = c; + + return (uc >= '0' && uc <= '9') ? 1 : 0; +} + +static int +atoi_8(s) + const char *s; +{ + char *pp; + char tmp[BUFSZ]; + + pp = tmp; + + while(digit_8(*s)) + *(pp++) = *(s++); + *pp = '\0'; + + return atoi(tmp); +} +#endif /*objnam.c*/ diff -aurbN -xCVS -xXTAGS nethack/src/options.c jnethack/src/options.c --- nethack/src/options.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/options.c 2005-06-05 18:40:29.000000000 +0900 @@ -210,15 +210,34 @@ * a different format */ int optflags; } compopt[] = { +#if 0 /*JP*/ { "align", "your starting alignment (lawful, neutral, or chaotic)", 8, DISP_IN_GAME }, { "align_message", "message window alignment", 20, DISP_IN_GAME }, /*WC*/ { "align_status", "status window alignment", 20, DISP_IN_GAME }, /*WC*/ { "altkeyhandler", "alternate key handler", 20, DISP_IN_GAME }, +#else /*JP*/ + { "align", "ゲームスタート時の属性 (lawful, neutral, or chaoticのいずれか)", + 8, DISP_IN_GAME }, + { "align_message", "メッセージウィンドウの揃え", 20, DISP_IN_GAME }, /*WC*/ + { "align_status", "状況ウィンドウの揃え", 20, DISP_IN_GAME }, /*WC*/ + { "altkeyhandler", "ALTキーハンドラ", 20, DISP_IN_GAME }, +#endif /*JP*/ +#if 0 /*JP*/ { "boulder", "the symbol to use for displaying boulders", 1, SET_IN_GAME }, +#else /*JP*/ + { "boulder", "巨岩を表示するシンボル文字", + 1, SET_IN_GAME }, +#endif /*JP*/ +#if 0 /*JP*/ { "catname", "the name of your (first) cat (e.g., catname:Tabby)", PL_PSIZ, DISP_IN_GAME }, +#else /*JP*/ + { "catname", "冒険を供にする(最初の)猫の名前 (例 catname:たま)", + PL_PSIZ, DISP_IN_GAME }, +#endif /*JP*/ +#if 0 /*JP*/ { "disclose", "the kinds of information to disclose at end of game", sizeof(flags.end_disclose) * 2, SET_IN_GAME }, @@ -226,8 +245,23 @@ PL_PSIZ, DISP_IN_GAME }, { "dungeon", "the symbols to use in drawing the dungeon map", MAXDCHARS+1, SET_IN_FILE }, +#else /*JP*/ + { "disclose", "ゲーム終了時に見る情報の種類", + sizeof(flags.end_disclose) * 2, + SET_IN_GAME }, + { "dogname", "冒険を供にする(最初の)犬の名前 (例 dogname:ポチ)", + PL_PSIZ, DISP_IN_GAME }, + { "dungeon", "ダンジョンを描画するシンボル文字", + MAXDCHARS+1, SET_IN_FILE }, +#endif /*JP*/ +#if 0 /*JP*/ { "effects", "the symbols to use in drawing special effects", MAXECHARS+1, SET_IN_FILE }, +#else /*JP*/ + { "effects", "特殊効果を描画するシンボル文字", + MAXECHARS+1, SET_IN_FILE }, +#endif /*JP*/ +#if 0 /*JP*/ { "font_map", "the font to use in the map window", 40, DISP_IN_GAME }, /*WC*/ { "font_menu", "the font to use in menus", 40, DISP_IN_GAME }, /*WC*/ { "font_message", "the font to use in the message window", @@ -241,10 +275,35 @@ { "font_text", "the font to use in text windows", 40, DISP_IN_GAME }, /*WC*/ { "fruit", "the name of a fruit you enjoy eating", PL_FSIZ, SET_IN_GAME }, +#else /*JP*/ + { "font_map", "マップウィンドウに使用するフォント", 40, DISP_IN_GAME }, /*WC*/ + { "font_menu", "メニューに使用するフォント", 40, DISP_IN_GAME }, /*WC*/ + { "font_message", "メッセージウィンドウに使用するフォント", + 40, DISP_IN_GAME }, /*WC*/ + { "font_size_map", "マップフォントのサイズ", 20, DISP_IN_GAME }, /*WC*/ + { "font_size_menu", "メニューフォントのサイズ", 20, DISP_IN_GAME }, /*WC*/ + { "font_size_message", "メッセージフォントのサイズ", 20, DISP_IN_GAME }, /*WC*/ + { "font_size_status", "状況フォントのサイズ", 20, DISP_IN_GAME }, /*WC*/ + { "font_size_text", "テキストフォントのサイズ", 20, DISP_IN_GAME }, /*WC*/ + { "font_status", "状況ウィンドウに使用するフォント", 40, DISP_IN_GAME }, /*WC*/ + { "font_text", "テキストウィンドウに使用するフォント", 40, DISP_IN_GAME }, /*WC*/ + { "fruit", "好物の果物の名前", PL_FSIZ, SET_IN_GAME }, +#endif /*JP*/ +#if 0 /*JP*/ { "gender", "your starting gender (male or female)", 8, DISP_IN_GAME }, +#else /*JP*/ + { "gender", "ゲーム開始時の性別(male または female)", + 8, DISP_IN_GAME }, +#endif /*JP*/ +#if 0 /*JP*/ { "horsename", "the name of your (first) horse (e.g., horsename:Silver)", PL_PSIZ, DISP_IN_GAME }, +#else /*JP*/ + { "horsename", "冒険を供にする(最初の)馬の名前 (例 ghoulname:シルバー)", + PL_PSIZ, DISP_IN_GAME }, +#endif /*JP*/ +#if 0 /*JP*/ { "map_mode", "map display mode under Windows", 20, DISP_IN_GAME }, /*WC*/ { "menustyle", "user interface for object selection", MENUTYPELEN, SET_IN_GAME }, @@ -273,13 +332,61 @@ # else {"msg_window", "the type of message window required", 1, SET_IN_FILE}, # endif +#else /*JP*/ + { "map_mode", "ウィンドウ表示時のマップの表示モード", 20, DISP_IN_GAME }, /*WC*/ + { "menucolor", "メニューの色設定", PL_PSIZ, SET_IN_FILE }, + { "menustyle", "オブジェクトを選択するときのユーザーインタフェース", + MENUTYPELEN, SET_IN_GAME }, + { "menu_deselect_all", "全てのアイテムを非選択", 4, SET_IN_FILE }, + { "menu_deselect_page", "現在表示されているページのアイテムを非選択", + 4, SET_IN_FILE }, + { "menu_first_page", "メニューの最初のページへ", + 4, SET_IN_FILE }, + { "menu_headings", "強調,反転または下線で種類を表示する", 9, SET_IN_GAME }, + { "menu_invert_all", "全てのアイテムを反転", 4, SET_IN_FILE }, + { "menu_invert_page", "現在表示されているページのアイテムを反転", + 4, SET_IN_FILE }, + { "menu_last_page", "メニューの最後のページへ", 4, SET_IN_FILE }, + { "menu_next_page", "次のメニューのページへ", 4, SET_IN_FILE }, + { "menu_previous_page", "前のメニューのページへ", 4, SET_IN_FILE }, + { "menu_search", "メニューの検索", 4, SET_IN_FILE }, + { "menu_select_all", "全てのアイテムを選択", 4, SET_IN_FILE }, + { "menu_select_page", "現在表示されている全てのアイテムを選択", + 4, SET_IN_FILE }, + { "monsters", "モンスターに使用されるシンボル文字", + MAXMCLASSES, SET_IN_FILE }, + { "msghistory", "先頭行に表示されたメッセージ履歴の保存数", + 5, DISP_IN_GAME }, +# ifdef TTY_GRAPHICS + {"msg_window", "メッセージウィンドウのタイプを設定",1, SET_IN_GAME}, +# else + {"msg_window", "メッセージウィンドウのタイプを設定", 1, SET_IN_FILE}, +# endif +#endif /*JP*/ +#if 0 /*JP*/ { "name", "your character's name (e.g., name:Merlin-W)", PL_NSIZ, DISP_IN_GAME }, { "number_pad", "use the number pad", 1, SET_IN_GAME}, +#else /*JP*/ + { "name", "あなたの名前 (例 name:マーリン-W)", + PL_NSIZ, DISP_IN_GAME }, + { "number_pad", "ナンバーパッドを使用する", 1, SET_IN_GAME}, +#endif /*JP*/ +#if 0 /*JP*/ { "objects", "the symbols to use for objects", MAXOCLASSES, SET_IN_FILE }, +#else /*JP*/ + { "objects", "アイテムに使用されるシンボル文字", + MAXOCLASSES, SET_IN_FILE }, +#endif /*JP*/ +#if 0 /*JP*/ { "packorder", "the inventory order of the items in your pack", MAXOCLASSES, SET_IN_GAME }, +#else /*JP*/ + { "packorder", "背負い袋内の物の順番を決めるシンボル", + MAXOCLASSES, SET_IN_GAME }, +#endif /*JP*/ +#if 0 /*JP*/ #ifdef CHANGE_COLOR { "palette", "palette (00c/880/-fff is blue/yellow/reverse white)", 15 , SET_IN_GAME }, @@ -288,6 +395,17 @@ 15, SET_IN_FILE }, # endif #endif +#else /*JP*/ +#ifdef CHANGE_COLOR + { "palette", "パレット (00c/880/-fffはそれぞれ青/黄/反転白を示す)", + 15 , SET_IN_GAME }, +# if defined(MAC) + { "hicolor", "パレットが同じとき、指示したものだけ反転させる", + 15, SET_IN_FILE }, +# endif +#endif +#endif /*JP*/ +#if 0 /*JP*/ { "pettype", "your preferred initial pet type", 4, DISP_IN_GAME }, { "pickup_burden", "maximum burden picked up before prompt", 20, SET_IN_GAME }, @@ -295,12 +413,31 @@ MAXOCLASSES, SET_IN_GAME }, { "player_selection", "choose character via dialog or prompts", 12, DISP_IN_GAME }, +#else /*JP*/ + { "pettype", "あなたの選択した初期ペットの種類", 4, DISP_IN_GAME }, + { "pickup_burden", "拾うときに最大荷重になる手前で確認する", + 20, SET_IN_GAME }, + { "pickup_types", "自動で拾いあげる物のシンボル", + MAXOCLASSES, SET_IN_GAME }, + { "player_selection", "キャラクター選択にダイアログや確認画面を使う", + 12, DISP_IN_GAME }, +#endif +#if 0 /*JP*/ { "race", "your starting race (e.g., Human, Elf)", PL_CSIZ, DISP_IN_GAME }, { "role", "your starting role (e.g., Barbarian, Valkyrie)", PL_CSIZ, DISP_IN_GAME }, { "runmode", "display frequency when `running' or `travelling'", sizeof "teleport", SET_IN_GAME }, +#else /*JP*/ + { "race", "ゲーム開始時の種族 (例 Human, Elf)", + PL_CSIZ, DISP_IN_GAME }, + { "role", "ゲーム開始時の職業 (例 Barbarian, Valkyrie)", + PL_CSIZ, DISP_IN_GAME }, + { "runmode", "トラベルコマンド等での連続移動時の描画頻度", + sizeof "teleport", SET_IN_GAME }, +#endif +#if 0 /*JP*/ { "scores", "the parts of the score list you wish to see", 32, SET_IN_GAME }, { "scroll_amount", "amount to scroll map when scroll_margin is reached", @@ -311,11 +448,34 @@ #endif { "suppress_alert", "suppress alerts about version-specific features", 8, SET_IN_GAME }, +#else /*JP*/ + { "scores", "ゲーム終了時に見るスコアの種類", + 32, SET_IN_GAME }, + { "scroll_amount", "scroll_marginに届いたときのマップスクロール量", + 20, DISP_IN_GAME }, /*WC*/ + { "scroll_margin", "マップ端からのマップスクロール開始距離", 20, DISP_IN_GAME }, /*WC*/ +#ifdef MSDOS + { "soundcard", "使用しているサウンドカードの種類", 20, SET_IN_FILE }, +#endif + { "suppress_alert", "バージョン間の違いに関する警告メッセージの無効化", + 8, SET_IN_GAME }, +#endif /*JP*/ +#if 0 /*JP*/ { "tile_width", "width of tiles", 20, DISP_IN_GAME}, /*WC*/ { "tile_height", "height of tiles", 20, DISP_IN_GAME}, /*WC*/ { "tile_file", "name of tile file", 70, DISP_IN_GAME}, /*WC*/ { "traps", "the symbols to use in drawing traps", MAXTCHARS+1, SET_IN_FILE }, +#else /*JP*/ + { "tile_width", "タイルの幅", 20, DISP_IN_GAME}, /*WC*/ + { "tile_height", "タイルの高さ", 20, DISP_IN_GAME}, /*WC*/ + { "tile_file", "タイルファイルの名前", 70, DISP_IN_GAME}, /*WC*/ + { "tileset", "あらかじめ設定されたタイルセット名を使用する", + PL_PSIZ, SET_IN_GAME }, + { "traps", "罠を描画するシンボル文字", + MAXTCHARS+1, SET_IN_FILE }, +#endif /*JP*/ +#if 0 /*JP*/ { "vary_msgcount", "show more old messages at a time", 20, DISP_IN_GAME }, /*WC*/ #ifdef MSDOS { "video", "method of video updating", 20, SET_IN_FILE }, @@ -329,9 +489,33 @@ #ifdef WIN32CON {"subkeyvalue", "override keystroke value", 7, SET_IN_FILE}, #endif +#else /*JP*/ + { "vary_msgcount", "一度に表示するメッセージの数", 20, DISP_IN_GAME }, /*WC*/ +#ifdef MSDOS + { "video", "使用するビデオモードを設定する", 20, SET_IN_FILE }, +#endif +#ifdef VIDEOSHADES + { "videocolors", "内蔵スクリーンルーチン用のカラーマップを用いる", + 40, DISP_IN_GAME }, + { "videoshades", "表示にグレイスケールを用いる", + 32, DISP_IN_GAME }, +#endif +#ifdef WIN32CON + {"subkeyvalue", "キーマッピングを変更する", 7, SET_IN_FILE}, +#endif +#endif /*JP*/ +#if 0 /*JP*/ { "windowcolors", "the foreground/background colors of windows", /*WC*/ 80, DISP_IN_GAME }, { "windowtype", "windowing system to use", WINTYPELEN, DISP_IN_GAME }, +#else /*JP*/ + { "windowcolors", "ウィンドウを指定した前景色/背景色で表示する", /*WC*/ + 80, DISP_IN_GAME }, + { "windowtype", "使用するウインドウシステム", WINTYPELEN, DISP_IN_GAME }, +#endif /*JP*/ +#if 1 /*JP*/ + { "kcode", "端末の漢字コード,", 4, SET_IN_FILE }, +#endif { (char *)0, (char *)0, 0, 0 } }; @@ -459,7 +643,11 @@ *q = index(user_string, '='); if (!p || (q && q < p)) p = q; +#if 0 /*JP*/ while(p && p > user_string && isspace(*(p-1))) p--; +#else + while(p && p > user_string && isspace_8(*(p-1))) p--; +#endif if (p) len = (int)(p - user_string); } @@ -987,9 +1175,17 @@ } /* strip leading and trailing white space */ +#if 0 /*JP*/ while (isspace(*opts)) opts++; +#else + while (isspace_8(*opts)) opts++; +#endif op = eos(opts); +#if 0 /*JP*/ while (--op >= opts && isspace(*op)) *op = '\0'; +#else + while (--op >= opts && isspace_8(*op)) *op = '\0'; +#endif if (!*opts) return; negated = FALSE; @@ -1054,7 +1250,11 @@ preferred_pet = 'n'; break; default: +#if 0 /*JP*/ pline("Unrecognized pet type '%s'.", op); +#else + pline("'%s'はペットの種類として受け付けられません.", op); +#endif break; } } else if (negated) preferred_pet = 'n'; @@ -1345,7 +1545,10 @@ num++; } if (num >= 100) { +/*JP pline("Doing that so many times isn't very fruitful."); +*/ + pline("そんなに何回もやってもほとんど意味はない."); return; } } @@ -1668,8 +1871,13 @@ if (flags.menu_style == MENU_TRADITIONAL || flags.menu_style == MENU_COMBINATION) { use_menu = FALSE; +#if 0 /*JP*/ Sprintf(qbuf, "New pickup_types: [%s am] (%s)", ocl, *tbuf ? tbuf : "all"); +#else + Sprintf(qbuf, "新しいpickup_typeを入力してください:[%s am] (%s)", + ocl, *tbuf ? tbuf : "all"); +#endif getlin(qbuf, abuf); op = mungspaces(abuf); if (abuf[0] == '\0' || abuf[0] == '\033') @@ -1678,8 +1886,13 @@ use_menu = TRUE; } if (use_menu) { +#if 0 /*JP*/ (void) choose_classes_menu("Auto-Pickup what?", 1, TRUE, ocl, tbuf); +#else + (void) choose_classes_menu("どれを自動拾いに設定しますか?", 1, + TRUE, ocl, tbuf); +#endif op = tbuf; } } @@ -1799,6 +2012,14 @@ if (badopt) badoption(opts); return; } +#if 1 /*JP*/ + if (!strncmpi(opts, "kcode", 3)){ + if ((op = string_for_env_opt("kcode", opts, FALSE)) != 0){ + setkcode(*op); + } + return; + } +#endif /* scores:5t[op] 5a[round] o[wn] */ if (match_optname(opts, "scores", 4, TRUE)) { @@ -2255,12 +2476,21 @@ }; static NEARDATA const char *burdentype[] = { +#if 0 /*JP*/ "unencumbered", "burdened", "stressed", "strained", "overtaxed", "overloaded" +#else + "通常", "よろめき", "圧迫", + "限界", "荷重", "超過" +#endif }; static NEARDATA const char *runmodes[] = { +#if 0 /*JP*/ "teleport", "run", "walk", "crawl" +#else + "一瞬", "走る", "歩く", "這う" +#endif }; /* @@ -2383,8 +2613,13 @@ start_menu(tmpwin); any.a_void = 0; +#if 0 /*JP*/ add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, "Booleans (selecting will toggle value):", MENU_UNSELECTED); +#else + add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, + "真偽オプション (選択すると値が切り替わります):", MENU_UNSELECTED); +#endif any.a_int = 0; /* first list any other non-modifiable booleans, then modifiable ones */ for (pass = 0; pass <= 1; pass++) @@ -2417,9 +2652,15 @@ indexoffset = boolcount; any.a_void = 0; add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED); +#if 0 /*JP*/ add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, "Compounds (selecting will prompt for new value):", MENU_UNSELECTED); +#else + add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, + "文字列オプション (選択すると新しい値の入力を求めます):", + MENU_UNSELECTED); +#endif startpass = DISP_IN_GAME; endpass = SET_IN_GAME; @@ -2461,8 +2702,13 @@ } #ifdef AUTOPICKUP_EXCEPTIONS any.a_int = -1; +#if 0 /*JP*/ Sprintf(buf, "autopickup exceptions (%d currently set)", count_ape_maps((int *)0, (int *)0)); +#else + Sprintf(buf, "自動拾いの対象外 (現在の設定数:%d)", + count_ape_maps((int *)0, (int *)0)); +#endif add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); #endif /* AUTOPICKUP_EXCEPTIONS */ @@ -2474,7 +2720,10 @@ for (i = 0; i < PREFIX_COUNT; i++) doset_add_menu(tmpwin, fqn_prefix_names[i], 0); #endif +/*JP end_menu(tmpwin, "Set what options?"); +*/ + end_menu(tmpwin, "どのオプションを設定しますか?"); need_redraw = FALSE; if ((pick_cnt = select_menu(tmpwin, PICK_ANY, &pick_list)) > 0) { /* @@ -2505,7 +2754,10 @@ if (!special_handling(compopt[opt_indx].name, setinitial, fromfile)) { +/*JP Sprintf(buf, "Set %s to what?", compopt[opt_indx].name); +*/ + Sprintf(buf, "%sに何を設定しますか?", compopt[opt_indx].name); getlin(buf, buf2); if (buf2[0] == '\033') continue; @@ -2558,7 +2810,10 @@ add_menu(tmpwin, NO_GLYPH, &any, *style_name, 0, ATR_NONE, style_name, MENU_UNSELECTED); } +/*JP end_menu(tmpwin, "Select menustyle:"); +*/ + end_menu(tmpwin, "メニュースタイルを選択してください:"); if (select_menu(tmpwin, PICK_ONE, &style_pick) > 0) { flags.menu_style = style_pick->item.a_int - 1; free((genericptr_t)style_pick); @@ -2576,7 +2831,10 @@ add_menu(tmpwin, NO_GLYPH, &any, burden_letters[i], 0, ATR_NONE, burden_name, MENU_UNSELECTED); } +/*JP end_menu(tmpwin, "Select encumbrance level:"); +*/ + end_menu(tmpwin, "警告を出す荷重レベルを選択してください:"); if (select_menu(tmpwin, PICK_ONE, &burden_pick) > 0) { flags.pickup_burden = burden_pick->item.a_int - 1; free((genericptr_t)burden_pick); @@ -2595,7 +2853,10 @@ * must correspond to disclosure_options in decl.h */ static const char *disclosure_names[] = { +/*JP "inventory", "attributes", "vanquished", "genocides", "conduct" +*/ + "所持アイテム", "最終属性", "殺害一覧", "虐殺一覧", "挑戦一覧" }; int disc_cat[NUM_DISCLOSURE_OPTIONS]; const char *disclosure_name; @@ -2609,7 +2870,10 @@ ATR_NONE, disclosure_name, MENU_UNSELECTED); disc_cat[i] = 0; } +/*JP end_menu(tmpwin, "Change which disclosure options categories:"); +*/ + end_menu(tmpwin, "どのカテゴリの表示情報オプションを変更しますか:"); if ((pick_cnt = select_menu(tmpwin, PICK_ANY, &disclosure_category_pick)) > 0) { for (pick_idx = 0; pick_idx < pick_cnt; ++pick_idx) { opt_idx = disclosure_category_pick[pick_idx].item.a_int - 1; @@ -2624,24 +2888,47 @@ if (disc_cat[i]) { char dbuf[BUFSZ]; menu_item *disclosure_option_pick = (menu_item *)0; +/*JP Sprintf(dbuf, "Disclosure options for %s:", disclosure_names[i]); +*/ + Sprintf(dbuf, "%sの出力形式:", disclosure_names[i]); tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); any.a_char = DISCLOSE_NO_WITHOUT_PROMPT; +#if 0 /*JP*/ add_menu(tmpwin, NO_GLYPH, &any, 'a', 0, ATR_NONE,"Never disclose and don't prompt", MENU_UNSELECTED); +#else + add_menu(tmpwin, NO_GLYPH, &any, 'a', 0, + ATR_NONE,"確認せずに出力もしない", MENU_UNSELECTED); +#endif any.a_void = 0; any.a_char = DISCLOSE_YES_WITHOUT_PROMPT; +#if 0 /*JP*/ add_menu(tmpwin, NO_GLYPH, &any, 'b', 0, ATR_NONE,"Always disclose and don't prompt", MENU_UNSELECTED); +#else + add_menu(tmpwin, NO_GLYPH, &any, 'b', 0, + ATR_NONE,"確認せずに出力する", MENU_UNSELECTED); +#endif any.a_void = 0; any.a_char = DISCLOSE_PROMPT_DEFAULT_NO; +#if 0 /*JP*/ add_menu(tmpwin, NO_GLYPH, &any, 'c', 0, ATR_NONE,"Prompt and default answer to \"No\"", MENU_UNSELECTED); +#else + add_menu(tmpwin, NO_GLYPH, &any, 'c', 0, + ATR_NONE,"デフォルトを「出力しない」として確認する", MENU_UNSELECTED); +#endif any.a_void = 0; any.a_char = DISCLOSE_PROMPT_DEFAULT_YES; +#if 0 /*JP*/ add_menu(tmpwin, NO_GLYPH, &any, 'd', 0, ATR_NONE,"Prompt and default answer to \"Yes\"", MENU_UNSELECTED); +#else + add_menu(tmpwin, NO_GLYPH, &any, 'd', 0, + ATR_NONE,"デフォルトを「出力する」として確認する", MENU_UNSELECTED); +#endif end_menu(tmpwin, dbuf); if (select_menu(tmpwin, PICK_ONE, &disclosure_option_pick) > 0) { flags.end_disclose[i] = disclosure_option_pick->item.a_char; @@ -2653,16 +2940,28 @@ retval = TRUE; } else if (!strcmp("runmode", optname)) { const char *mode_name; +#if 1 /*JP*/ + const char *mode_letters = "trwc"; +#endif menu_item *mode_pick = (menu_item *)0; tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); for (i = 0; i < SIZE(runmodes); i++) { mode_name = runmodes[i]; any.a_int = i + 1; +#if 0 /*JP*/ add_menu(tmpwin, NO_GLYPH, &any, *mode_name, 0, ATR_NONE, mode_name, MENU_UNSELECTED); +#else + add_menu(tmpwin, NO_GLYPH, &any, mode_letters[i], 0, + ATR_NONE, mode_name, MENU_UNSELECTED); +#endif } +#if 0 /*JP*/ end_menu(tmpwin, "Select run/travel display mode:"); +#else + end_menu(tmpwin, "走行/トラベルの表示モードを選択してください:"); +#endif if (select_menu(tmpwin, PICK_ONE, &mode_pick) > 0) { iflags.runmode = mode_pick->item.a_int - 1; free((genericptr_t)mode_pick); @@ -2677,18 +2976,41 @@ tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); any.a_char = 's'; +#if 0 /*JP*/ add_menu(tmpwin, NO_GLYPH, &any, 's', 0, ATR_NONE, "single", MENU_UNSELECTED); +#else + add_menu(tmpwin, NO_GLYPH, &any, 's', 0, + ATR_NONE, "一行ずつ表示(single)", MENU_UNSELECTED); +#endif any.a_char = 'c'; +#if 0 /*JP*/ add_menu(tmpwin, NO_GLYPH, &any, 'c', 0, ATR_NONE, "combination", MENU_UNSELECTED); +#else + add_menu(tmpwin, NO_GLYPH, &any, 'c', 0, + ATR_NONE, "single×2の後にfull(combination)", MENU_UNSELECTED); +#endif any.a_char = 'f'; +#if 0 /*JP*/ add_menu(tmpwin, NO_GLYPH, &any, 'f', 0, ATR_NONE, "full", MENU_UNSELECTED); +#else + add_menu(tmpwin, NO_GLYPH, &any, 'f', 0, + ATR_NONE, "古いものから一画面表示(full)", MENU_UNSELECTED); +#endif any.a_char = 'r'; +#if 0 /*JP*/ add_menu(tmpwin, NO_GLYPH, &any, 'r', 0, ATR_NONE, "reversed", MENU_UNSELECTED); +#else + add_menu(tmpwin, NO_GLYPH, &any, 'r', 0, + ATR_NONE, "最近のものから一画面表示(reversed)", MENU_UNSELECTED); +#endif +/*JP end_menu(tmpwin, "Select message history display type:"); +*/ + end_menu(tmpwin, "メッセージ履歴の表示方法を選択してください:"); if (select_menu(tmpwin, PICK_ONE, &window_pick) > 0) { iflags.prevmsg_window = window_pick->item.a_char; free((genericptr_t)window_pick); @@ -2706,19 +3028,44 @@ tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); any.a_int = ALIGN_TOP; +#if 0 /*JP*/ add_menu(tmpwin, NO_GLYPH, &any, 't', 0, ATR_NONE, "top", MENU_UNSELECTED); +#else + add_menu(tmpwin, NO_GLYPH, &any, 't', 0, + ATR_NONE, "上側", MENU_UNSELECTED); +#endif any.a_int = ALIGN_BOTTOM; +#if 0 /*JP*/ add_menu(tmpwin, NO_GLYPH, &any, 'b', 0, ATR_NONE, "bottom", MENU_UNSELECTED); +#else + add_menu(tmpwin, NO_GLYPH, &any, 'b', 0, + ATR_NONE, "下側", MENU_UNSELECTED); +#endif any.a_int = ALIGN_LEFT; +#if 0 /*JP*/ add_menu(tmpwin, NO_GLYPH, &any, 'l', 0, ATR_NONE, "left", MENU_UNSELECTED); +#else + add_menu(tmpwin, NO_GLYPH, &any, 'l', 0, + ATR_NONE, "左側", MENU_UNSELECTED); +#endif any.a_int = ALIGN_RIGHT; +#if 0 /*JP*/ add_menu(tmpwin, NO_GLYPH, &any, 'r', 0, ATR_NONE, "right", MENU_UNSELECTED); +#else + add_menu(tmpwin, NO_GLYPH, &any, 'r', 0, + ATR_NONE, "右側", MENU_UNSELECTED); +#endif +#if 0 /*JP*/ Sprintf(abuf, "Select %s window placement relative to the map:", msg ? "message" : "status"); +#else + Sprintf(abuf, "%sウィンドウのマップに対する表示位置を選択してください:", + msg ? "メッセージ" : "状態"); +#endif end_menu(tmpwin, abuf); if (select_menu(tmpwin, PICK_ONE, &window_pick) > 0) { if (msg) iflags.wc_align_message = window_pick->item.a_int; @@ -2729,7 +3076,10 @@ retval = TRUE; } else if (!strcmp("number_pad", optname)) { static const char *npchoices[3] = +/*JP {"0 (off)", "1 (on)", "2 (on, DOS compatible)"}; +*/ + {"0 (無効)", "1 (有効)", "2 (有効,DOS互換)"}; const char *npletters = "abc"; menu_item *mode_pick = (menu_item *)0; @@ -2740,7 +3090,10 @@ add_menu(tmpwin, NO_GLYPH, &any, npletters[i], 0, ATR_NONE, npchoices[i], MENU_UNSELECTED); } +/*JP end_menu(tmpwin, "Select number_pad mode:"); +*/ + end_menu(tmpwin, "number_padモードを選択してください:"); if (select_menu(tmpwin, PICK_ONE, &mode_pick) > 0) { int mode = mode_pick->item.a_int - 1; switch(mode) { @@ -2762,7 +3115,10 @@ destroy_nhwindow(tmpwin); retval = TRUE; } else if (!strcmp("menu_headings", optname)) { +/*JP static const char *mhchoices[3] = {"bold", "inverse", "underline"}; +*/ + static const char *mhchoices[3] = {"太字", "反転", "下線"}; const char *npletters = "biu"; menu_item *mode_pick = (menu_item *)0; @@ -2773,7 +3129,10 @@ add_menu(tmpwin, NO_GLYPH, &any, npletters[i], 0, ATR_NONE, mhchoices[i], MENU_UNSELECTED); } +/*JP end_menu(tmpwin, "How to highlight menu headings:"); +*/ + end_menu(tmpwin, "メニューヘッダの強調方法を選択してください:"); if (select_menu(tmpwin, PICK_ONE, &mode_pick) > 0) { int mode = mode_pick->item.a_int - 1; switch(mode) { @@ -2801,10 +3160,17 @@ char apebuf[BUFSZ]; struct autopickup_exception *ape; static const char *action_titles[] = { +#if 0 /*JP*/ "a", "add new autopickup exception", "l", "list autopickup exceptions", "r", "remove existing autopickup exception", "e", "exit this menu", +#else + "a", "新しい自動拾いの例外を追加", + "l", "自動拾いの例外を一覧表示", + "r", "既にある自動拾いの例外を削除", + "e", "このメニューを閉じる", +#endif }; ape_again: opt_idx = 0; @@ -2818,7 +3184,10 @@ add_menu(tmpwin, NO_GLYPH, &any, *action_titles[i], 0, ATR_NONE, action_titles[i+1], MENU_UNSELECTED); } +/*JP end_menu(tmpwin, "Do what?"); +*/ + end_menu(tmpwin, "どうしますか?"); if ((pick_cnt = select_menu(tmpwin, PICK_ONE, &pick_list)) > 0) { for (pick_idx = 0; pick_idx < pick_cnt; ++pick_idx) { opt_idx = pick_list[pick_idx].item.a_int - 1; @@ -2830,7 +3199,10 @@ if (pick_cnt < 1) return FALSE; if (opt_idx == 0) { /* add new */ +/*JP getlin("What new autopickup exception pattern?", &apebuf[1]); +*/ + getlin("新しい自動拾い例外のパターンを入力してください:", &apebuf[1]); if (apebuf[1] == '\033') return FALSE; apebuf[0] = '"'; Strcat(apebuf,"\""); @@ -2845,8 +3217,13 @@ if (numapes[pass] == 0) continue; ape = iflags.autopickup_exceptions[pass]; any.a_void = 0; +#if 0 /*JP*/ add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, (pass == 0) ? "Never pickup" : "Always pickup", +#else + add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, + (pass == 0) ? "常に拾わない" : "常に拾う", +#endif MENU_UNSELECTED); for (i = 0; i < numapes[pass] && ape; i++) { any.a_void = (opt_idx == 1) ? 0 : ape; @@ -2856,8 +3233,14 @@ ape = ape->next; } } +#if 0 /*JP*/ Sprintf(apebuf, "%s autopickup exceptions", (opt_idx == 1) ? "List of" : "Remove which"); +#else + Sprintf(apebuf, "%s自動拾い例外%s", + (opt_idx == 1) ? "" : "どの", + (opt_idx == 1) ? "の一覧" : "を削除しますか?"); +#endif end_menu(tmpwin, apebuf); pick_cnt = select_menu(tmpwin, (opt_idx == 1) ? PICK_NONE : PICK_ANY, @@ -2889,31 +3272,59 @@ char *buf; { char ocl[MAXOCLASSES+1]; +#if 0 /*JP*/ static const char none[] = "(none)", randomrole[] = "random", to_be_done[] = "(to be done)", defopt[] = "default", defbrief[] = "def"; +#else + static const char none[] = "(なし)", randomrole[] = "ランダム", + to_be_done[] = "(設定済み)", + defopt[] = "デフォルト", + defbrief[] = "def"; +#endif int i; buf[0] = '\0'; if (!strcmp(optname,"align_message")) +#if 0 /*JP*/ Sprintf(buf, "%s", iflags.wc_align_message == ALIGN_TOP ? "top" : iflags.wc_align_message == ALIGN_LEFT ? "left" : iflags.wc_align_message == ALIGN_BOTTOM ? "bottom" : iflags.wc_align_message == ALIGN_RIGHT ? "right" : defopt); +#else + Sprintf(buf, "%s", iflags.wc_align_message == ALIGN_TOP ? "上側" : + iflags.wc_align_message == ALIGN_LEFT ? "左側" : + iflags.wc_align_message == ALIGN_BOTTOM ? "下側" : + iflags.wc_align_message == ALIGN_RIGHT ? "右側" : + defopt); +#endif else if (!strcmp(optname,"align_status")) +#if 0 /*JP*/ Sprintf(buf, "%s", iflags.wc_align_status == ALIGN_TOP ? "top" : iflags.wc_align_status == ALIGN_LEFT ? "left" : iflags.wc_align_status == ALIGN_BOTTOM ? "bottom" : iflags.wc_align_status == ALIGN_RIGHT ? "right" : defopt); +#else + Sprintf(buf, "%s", iflags.wc_align_status == ALIGN_TOP ? "上側" : + iflags.wc_align_status == ALIGN_LEFT ? "左側" : + iflags.wc_align_status == ALIGN_BOTTOM ? "下側" : + iflags.wc_align_status == ALIGN_RIGHT ? "右側" : + defopt); +#endif else if (!strcmp(optname,"align")) Sprintf(buf, "%s", rolestring(flags.initalign, aligns, adj)); #ifdef WIN32CON else if (!strcmp(optname,"altkeyhandler")) +#if 0 /*JP*/ Sprintf(buf, "%s", iflags.altkeyhandler[0] ? iflags.altkeyhandler : "default"); +#else + Sprintf(buf, "%s", iflags.altkeyhandler[0] ? + iflags.altkeyhandler : defopt); +#endif /*JP*/ #endif else if (!strcmp(optname, "boulder")) Sprintf(buf, "%c", iflags.bouldersym ? @@ -2971,7 +3382,11 @@ else if (!strcmp(optname, "fruit")) Sprintf(buf, "%s", pl_fruit); else if (!strcmp(optname, "gender")) +#if 0 /*JP*/ Sprintf(buf, "%s", rolestring(flags.initgend, genders, adj)); +#else + Sprintf(buf, "%s", rolestring(flags.initgend, genders, j)); +#endif else if (!strcmp(optname, "horsename")) Sprintf(buf, "%s", horsename[0] ? horsename : none); else if (!strcmp(optname, "map_mode")) @@ -2999,10 +3414,17 @@ else if (!strcmp(optname, "menu_invert_all")) Sprintf(buf, "%s", to_be_done); else if (!strcmp(optname, "menu_headings")) { +#if 0 /*JP*/ Sprintf(buf, "%s", (iflags.menu_headings == ATR_BOLD) ? "bold" : (iflags.menu_headings == ATR_INVERSE) ? "inverse" : (iflags.menu_headings == ATR_ULINE) ? "underline" : "unknown"); +#else + Sprintf(buf, "%s", (iflags.menu_headings == ATR_BOLD) ? + "太字" : (iflags.menu_headings == ATR_INVERSE) ? + "反転" : (iflags.menu_headings == ATR_ULINE) ? + "下線" : "不明"); +#endif } else if (!strcmp(optname, "menu_invert_page")) Sprintf(buf, "%s", to_be_done); @@ -3031,9 +3453,15 @@ else if (!strcmp(optname, "name")) Sprintf(buf, "%s", plname); else if (!strcmp(optname, "number_pad")) +#if 0 /*JP*/ Sprintf(buf, "%s", (!iflags.num_pad) ? "0=off" : (iflags.num_pad_mode) ? "2=on, DOS compatible" : "1=on"); +#else + Sprintf(buf, "%s", + (!iflags.num_pad) ? "0=無効" : + (iflags.num_pad_mode) ? "2=有効,DOS互換" : "1=有効"); +#endif else if (!strcmp(optname, "objects")) Sprintf(buf, "%s", to_be_done); else if (!strcmp(optname, "packorder")) { @@ -3045,9 +3473,15 @@ Sprintf(buf, "%s", get_color_string()); #endif else if (!strcmp(optname, "pettype")) +#if 0 /*JP*/ Sprintf(buf, "%s", (preferred_pet == 'c') ? "cat" : (preferred_pet == 'd') ? "dog" : (preferred_pet == 'n') ? "none" : "random"); +#else + Sprintf(buf, "%s", (preferred_pet == 'c') ? "猫" : + (preferred_pet == 'd') ? "犬" : + (preferred_pet == 'n') ? "なし" : randomrole); +#endif else if (!strcmp(optname, "pickup_burden")) Sprintf(buf, "%s", burdentype[flags.pickup_burden] ); else if (!strcmp(optname, "pickup_types")) { @@ -3055,9 +3489,17 @@ Sprintf(buf, "%s", ocl[0] ? ocl : "all" ); } else if (!strcmp(optname, "race")) +#if 0 /*JP*/ Sprintf(buf, "%s", rolestring(flags.initrace, races, noun)); +#else + Sprintf(buf, "%s", rolestring(flags.initrace, races, j)); +#endif else if (!strcmp(optname, "role")) +#if 0 /*JP*/ Sprintf(buf, "%s", rolestring(flags.initrole, roles, name.m)); +#else + Sprintf(buf, "%s", rolestring(flags.initrole, roles, jname.m)); +#endif else if (!strcmp(optname, "runmode")) Sprintf(buf, "%s", runmodes[iflags.runmode]); else if (!strcmp(optname, "scores")) { @@ -3073,7 +3515,11 @@ else Strcpy(buf, defopt); } else if (!strcmp(optname, "player_selection")) +#if 0 /*JP*/ Sprintf(buf, "%s", iflags.wc_player_selection ? "prompts" : "dialog"); +#else + Sprintf(buf, "%s入力", iflags.wc_player_selection ? "プロンプト" : "ダイアログ"); +#endif #ifdef MSDOS else if (!strcmp(optname, "soundcard")) Sprintf(buf, "%s", to_be_done); @@ -3141,7 +3587,11 @@ #endif if (buf[0]) return buf; +#if 0 /*JP*/ else return "unknown"; +#else + else return "不明"; +#endif } int @@ -3152,7 +3602,10 @@ flags.pickup = !flags.pickup; if (flags.pickup) { oc_to_str(flags.pickup_types, ocl); +/*JP Sprintf(buf, "ON, for %s objects%s", ocl[0] ? ocl : "all", +*/ + Sprintf(buf, "%sアイテムについてオン", ocl[0] ? ocl : "全ての", #ifdef AUTOPICKUP_EXCEPTIONS (iflags.autopickup_exceptions[AP_LEAVE] || iflags.autopickup_exceptions[AP_GRAB]) ? @@ -3161,9 +3614,15 @@ #endif ""); } else { +/*JP Strcpy(buf, "OFF"); +*/ + Strcpy(buf, "オフ"); } +/*JP pline("Autopickup: %s.", buf); +*/ + pline("自動拾い:%s.", buf); return 0; } @@ -3265,27 +3724,51 @@ /* data for option_help() */ static const char *opt_intro[] = { "", +/*JP " NetHack Options Help:", +*/ + " NetHackオプションヘルプ:", "", #define CONFIG_SLOT 3 /* fill in next value at run-time */ (char *)0, #if !defined(MICRO) && !defined(MAC) +/*JP "or use `NETHACKOPTIONS=\"\"' in your environment", +*/ + "または環境変数に`NETHACKOPTIONS=\"\"'と定義できます", #endif +/*JP "( is a list of options separated by commas)", +*/ + "(はカンマで区切って連続して指定することができます)", #ifdef VMS +/*JP "-- for example, $ DEFINE NETHACKOPTIONS \"noautopickup,fruit:kumquat\"", +*/ + "-- 例えば次のようにします:$ DEFINE NETHACKOPTIONS \"noautopickup,fruit:kumquat\"", #endif +/*JP "or press \"O\" while playing and use the menu.", +*/ + "もしくはゲームプレイ中に\"O\"ボタンを押すことで設定可能です.", "", +/*JP "Boolean options (which can be negated by prefixing them with '!' or \"no\"):", +*/ + "真偽値オプション (否定の値を指定する場合,'!'もしくは\"no\"を先頭に付加します):", (char *)0 }; static const char *opt_epilog[] = { "", +/*JP "Some of the options can be set only before the game is started; those", +*/ + "幾つかのオプションはゲーム開始前のみにしか設定できないものがあります.", +/*JP "items will not be selectable in the 'O' command's menu.", +*/ + "それらは'O'コマンドのメニューでは選択することができません.", (char *)0 }; @@ -3297,7 +3780,10 @@ winid datawin; datawin = create_nhwindow(NHW_TEXT); +/*JP Sprintf(buf, "Set options as OPTIONS= in %s", configfile); +*/ + Sprintf(buf, "オプションは%sの中でOPTIONS=と設定します", configfile); opt_intro[CONFIG_SLOT] = (const char *) buf; for (i = 0; opt_intro[i]; i++) putstr(datawin, 0, opt_intro[i]); @@ -3315,7 +3801,10 @@ next_opt(datawin, ""); /* Compound options */ +/*JP putstr(datawin, 0, "Compound options:"); +*/ + putstr(datawin, 0, "文字列オプション:"); for (i = 0; compopt[i].name; i++) { Sprintf(buf2, "`%s'", compopt[i].name); Sprintf(buf, "%-20s - %s%c", buf2, compopt[i].descr, @@ -3411,7 +3900,11 @@ for(c = pl_fruit; *c >= '0' && *c <= '9'; c++) ; +#if 0 /*JP*/ if (isspace(*c) || *c == 0) numeric = TRUE; +#else + if (isspace_8(*c) || *c == 0) numeric = TRUE; +#endif } if (found || numeric || !strncmp(str, "cursed ", 7) || diff -aurbN -xCVS -xXTAGS nethack/src/pager.c jnethack/src/pager.c --- nethack/src/pager.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/pager.c 2005-01-24 21:46:15.000000000 +0900 @@ -5,12 +5,22 @@ /* This file contains the command routines dowhatis() and dohelp() and */ /* a few other help related facilities */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "dlb.h" STATIC_DCL boolean FDECL(is_swallow_sym, (int)); STATIC_DCL int FDECL(append_str, (char *, const char *)); +/*JP STATIC_DCL struct permonst * FDECL(lookat, (int, int, char *, char *)); +*/ +STATIC_DCL struct permonst * FDECL(lookat, (int, int, char *, char *, char *)); STATIC_DCL void FDECL(checkfile, (char *,struct permonst *,BOOLEAN_P,BOOLEAN_P)); STATIC_DCL int FDECL(do_look, (BOOLEAN_P)); @@ -45,8 +55,13 @@ if (strstri(buf, new_str)) return 0; space_left = BUFSZ - strlen(buf) - 1; +#if 0 /*JP*/ (void) strncat(buf, " or ", space_left); (void) strncat(buf, new_str, space_left - 4); +#else + (void) strncat(buf, "または", space_left); + (void) strncat(buf, new_str, space_left - 6); +#endif return 1; } @@ -55,14 +70,28 @@ * If not hallucinating and the glyph is a monster, also monster data. */ STATIC_OVL struct permonst * +#if 0 /*JP*/ lookat(x, y, buf, monbuf) int x, y; char *buf, *monbuf; +#else +/*JP*/ /* `buf2' is simple name for search data file easily. */ +lookat(x, y, buf, monbuf, buf2) + int x, y; + char *buf, *monbuf, *buf2; +#endif { register struct monst *mtmp = (struct monst *) 0; struct permonst *pm = (struct permonst *) 0; int glyph; +#if 1 /*JP*/ + if(!query_lang_mode()) + (void)set_trns_mode(0); + + buf[0] = 0; + buf2[0] = 0; +#endif buf[0] = monbuf[0] = 0; glyph = glyph_at(x,y); if (u.ux == x && u.uy == y && senseself()) { @@ -74,6 +103,7 @@ Sprintf(race, "%s ", urace.adj); } +#if 0 /*JP*/ Sprintf(buf, "%s%s%s called %s", Invis ? "invisible " : "", race, @@ -85,11 +115,21 @@ if (Role_if(PM_WIZARD) && Race_if(PM_GNOME) && !Upolyd) pm = &mons[PM_WIZARD]; +#else + Sprintf(buf, "%s%sという名の%s", + Invis ? "姿の見えない" : "", + plname, + jtrns_mon(mons[u.umonnum].mname)); + Strcpy(buf2, mons[u.umonnum].mname); +#endif #ifdef STEED if (u.usteed) { char steedbuf[BUFSZ]; +/*JP Sprintf(steedbuf, ", mounted on %s", y_monnam(u.usteed)); +*/ + Sprintf(steedbuf, ",%sに乗っている", y_monnam(u.usteed)); /* assert((sizeof buf >= strlen(buf)+strlen(steedbuf)+1); */ Strcat(buf, steedbuf); } @@ -117,8 +157,15 @@ } } else if (u.uswallow) { /* all locations when swallowed other than the hero are the monster */ +#if 0 /*JP*/ Sprintf(buf, "interior of %s", Blind ? "a monster" : a_monnam(u.ustuck)); +#else + Sprintf(buf2, "interior of %s", + Blind ? "a monster" : a_monnam(u.ustuck)); + Sprintf(buf, "%sの内部", + Blind ? "怪物" : a_monnam(u.ustuck)); +#endif pm = u.ustuck->data; } else if (glyph_is_monster(glyph)) { bhitpos.x = x; @@ -134,6 +181,7 @@ name = distant_monnam(mtmp, ARTICLE_NONE, monnambuf); pm = mtmp->data; +#if 0 /*JP*/ Sprintf(buf, "%s%s%s", (mtmp->mx != x || mtmp->my != y) ? ((mtmp->isshk && accurate) @@ -141,11 +189,30 @@ (mtmp->mtame && accurate) ? "tame " : (mtmp->mpeaceful && accurate) ? "peaceful " : "", name); +#else + Strcpy(buf2, mtmp->data->mname); + Sprintf(buf, "%s%s%s", + (mtmp->mtame && accurate) ? "手なずけられた" : + (mtmp->mpeaceful && accurate) ? "友好的な" : "", + name, + (mtmp->mx != x || mtmp->my != y) ? + ((mtmp->isshk && accurate) + ? "の尻尾" : "の尻尾") : ""); +#endif if (u.ustuck == mtmp) +#if 0 /*JP*/ Strcat(buf, (Upolyd && sticks(youmonst.data)) ? ", being held" : ", holding you"); +#else + Strcat(buf, (Upolyd && sticks(youmonst.data)) ? + ",あなたが掴まえている" : ",あなたを掴まえている"); +#endif if (mtmp->mleashed) +#if 0 /*JP*/ Strcat(buf, ", leashed to you"); +#else + Strcat(buf, ",紐で結ばれている"); +#endif if (mtmp->mtrapped && cansee(mtmp->mx, mtmp->my)) { struct trap *t = t_at(mtmp->mx, mtmp->my); @@ -154,8 +221,13 @@ /* newsym lets you know of the trap, so mention it here */ if (tt == BEAR_TRAP || tt == PIT || tt == SPIKED_PIT || tt == WEB) +#if 0 /*JP*/ Sprintf(eos(buf), ", trapped in %s", an(defsyms[trap_to_defsym(tt)].explanation)); +#else + Sprintf(eos(buf), ", %sに捕まっている", + jtrns_obj('^', defsyms[trap_to_defsym(tt)].explanation)); +#endif } { @@ -189,40 +261,84 @@ if (ways_seen > 1 || !normal) { if (normal) { +/*JP Strcat(monbuf, "normal vision"); +*/ + Strcat(monbuf, "通常の視覚"); /* can't actually be 1 yet here */ +/*JP if (ways_seen-- > 1) Strcat(monbuf, ", "); +*/ + if (ways_seen-- > 1) Strcat(monbuf, ","); } if (useemon && mtmp->minvis) { +/*JP Strcat(monbuf, "see invisible"); +*/ + Strcat(monbuf, "見えないものを見る視覚"); +/*JP if (ways_seen-- > 1) Strcat(monbuf, ", "); +*/ + if (ways_seen-- > 1) Strcat(monbuf, ","); } if ((!mtmp->minvis || See_invisible) && see_with_infrared(mtmp)) { +/*JP Strcat(monbuf, "infravision"); +*/ + Strcat(monbuf, "赤外線が見える視覚"); +/*JP if (ways_seen-- > 1) Strcat(monbuf, ", "); +*/ + if (ways_seen-- > 1) Strcat(monbuf, ","); } if (tp_sensemon(mtmp)) { +/*JP Strcat(monbuf, "telepathy"); +*/ + Strcat(monbuf, "テレパシー"); +/*JP if (ways_seen-- > 1) Strcat(monbuf, ", "); +*/ + if (ways_seen-- > 1) Strcat(monbuf, ","); } if (useemon && xraydist > 0 && distu(mtmp->mx, mtmp->my) <= xraydist) { /* Eyes of the Overworld */ +/*JP Strcat(monbuf, "astral vision"); +*/ + Strcat(monbuf, "精神による視覚"); +/*JP if (ways_seen-- > 1) Strcat(monbuf, ", "); +*/ + if (ways_seen-- > 1) Strcat(monbuf, ","); } if (Detect_monsters) { +/*JP Strcat(monbuf, "monster detection"); +*/ + Strcat(monbuf, "怪物を発見する能力"); +/*JP if (ways_seen-- > 1) Strcat(monbuf, ", "); +*/ + if (ways_seen-- > 1) Strcat(monbuf, ","); } if (MATCH_WARN_OF_MON(mtmp)) { char wbuf[BUFSZ]; if (Hallucination) +/*JP Strcat(monbuf, "paranoid delusion"); +*/ + Strcat(monbuf, "偏執的妄想"); else { +#if 0 /*JP:T*/ Sprintf(wbuf, "warned of %s", makeplural(mtmp->data->mname)); +#else + Sprintf(wbuf, "%sを警告している", + jtrns_mon(mtmp->data->mname)); +#endif Strcat(monbuf, wbuf); } if (ways_seen-- > 1) Strcat(monbuf, ", "); @@ -246,44 +362,101 @@ } } else Strcpy(buf, distant_name(otmp, xname)); +#if 1 /*JP*/ + Strcpy(buf2, buf); +#endif if (levl[x][y].typ == STONE || levl[x][y].typ == SCORR) +/*JP Strcat(buf, " embedded in stone"); +*/ + Strcat(buf, ",岩に埋めこまれている"); else if (IS_WALL(levl[x][y].typ) || levl[x][y].typ == SDOOR) +/*JP Strcat(buf, " embedded in a wall"); +*/ + Strcat(buf, ",壁に埋めこまれている"); else if (closed_door(x,y)) +/*JP Strcat(buf, " embedded in a door"); +*/ + Strcat(buf, ",扉に埋めこまれている"); else if (is_pool(x,y)) + /*JP 3.4.3 この部分は物体にしか使われない */ +/*JP Strcat(buf, " in water"); +*/ + Strcat(buf, ",水中にある"); else if (is_lava(x,y)) +#if 0 /*JP:T*/ Strcat(buf, " in molten lava"); /* [can this ever happen?] */ +#else + Strcat(buf, ",溶岩の中にある"); /* [can this ever happen?] */ +#endif } else if (glyph_is_trap(glyph)) { int tnum = what_trap(glyph_to_trap(glyph)); +#if 0 /*JP:T*/ Strcpy(buf, defsyms[trap_to_defsym(tnum)].explanation); +#else + Strcpy(buf, jtrns_obj('^', defsyms[ + trap_to_defsym(Hallucination ? rn2(TRAPNUM-3)+3 : tnum)].explanation)); +#endif } else if(!glyph_is_cmap(glyph)) { +/*JP Strcpy(buf,"dark part of a room"); +*/ + Strcpy(buf,"部屋の暗い部分"); } else switch(glyph_to_cmap(glyph)) { case S_altar: if(!In_endgame(&u.uz)) +#if 0 /*JP*/ Sprintf(buf, "%s altar", align_str(Amask2align(levl[x][y].altarmask & ~AM_SHRINE))); +#else + Sprintf(buf, "%sの祭壇", + align_str(Amask2align(levl[x][y].altarmask & ~AM_SHRINE))); +#endif +/*JP else Sprintf(buf, "aligned altar"); +*/ + else Sprintf(buf, "属性の祭壇"); break; case S_ndoor: if (is_drawbridge_wall(x, y) >= 0) +/*JP Strcpy(buf,"open drawbridge portcullis"); +*/ + Strcpy(buf,"降りている跳ね橋"); else if ((levl[x][y].doormask & ~D_TRAPPED) == D_BROKEN) +/*JP Strcpy(buf,"broken door"); +*/ + Strcpy(buf,"壊れた扉"); else +/*JP Strcpy(buf,"doorway"); +*/ + Strcpy(buf,"通路"); break; case S_cloud: +/*JP Strcpy(buf, Is_airlevel(&u.uz) ? "cloudy area" : "fog/vapor cloud"); +*/ + Strcpy(buf, Is_airlevel(&u.uz) ? "曇っている場所" : "霧/蒸気の雲"); break; default: +/*JP Strcpy(buf,defsyms[glyph_to_cmap(glyph)].explanation); +*/ + Strcpy(buf, jtrns_obj('S', defsyms[glyph_to_cmap(glyph)].explanation)); break; } +#if 1 /*JP*/ + if(buf2[0] == '\0'){ + Strcpy(buf2, buf); + } + set_trns_mode(1); +#endif return ((pm && !Hallucination) ? pm : (struct permonst *) 0); } @@ -313,7 +486,11 @@ fp = dlb_fopen(DATAFILE, "r"); if (!fp) { +#if 0 /*JP*/ pline("Cannot open data file!"); +#else + pline("データファイルを開けない!"); +#endif return; } @@ -421,11 +598,18 @@ return; } +/*JP if (user_typed_name || without_asking || yn("More info?") == 'y') { +*/ + if (user_typed_name || without_asking || yn("詳細を見る?") == 'y') { winid datawin; if (dlb_fseek(fp, txt_offset + entry_offset, SEEK_SET) < 0) { +#if 0 /*JP*/ pline("? Seek error on 'data' file!"); +#else + pline("'data'ファイルのシークエラー!"); +#endif (void) dlb_fclose(fp); return; } @@ -440,7 +624,10 @@ destroy_nhwindow(datawin); } } else if (user_typed_name) +/*JP pline("I don't have any information on those things."); +*/ + pline("そんな名前は聞いたことがない."); (void) dlb_fclose(fp); } @@ -452,13 +639,20 @@ #define LOOK_VERBOSE 3 /* ':' -- show more info w/o asking */ /* also used by getpos hack in do_name.c */ +/*JP const char what_is_an_unknown_object[] = "an unknown object"; +*/ +const char what_is_an_unknown_object[] = "謎の物体"; STATIC_OVL int do_look(quick) boolean quick; /* use cursor && don't search for "more info" */ { char out_str[BUFSZ], look_buf[BUFSZ]; +#if 1 /*JP*/ + char look_buf2[BUFSZ]; + const char *firstmatch2 = 0; +#endif const char *x_str, *firstmatch = 0; struct permonst *pm = 0; int i, ans = 0; @@ -470,12 +664,18 @@ boolean need_to_look; /* need to get explan. from glyph */ boolean hit_trap; /* true if found trap explanation */ int skipped_venom; /* non-zero if we ignored "splash of venom" */ +/*JP static const char *mon_interior = "the interior of a monster"; +*/ + static const char *mon_interior = "怪物の内部"; if (quick) { from_screen = TRUE; /* yes, we want to use the cursor */ } else { +/*JP i = ynq("Specify unknown object by cursor?"); +*/ + i = ynq("カーソルで物体を指定する?"); if (i == 'q') return 0; from_screen = (i == 'y'); } @@ -485,7 +685,10 @@ cc.y = u.uy; sym = 0; /* gcc -Wall lint */ } else { +/*JP getlin("Specify what? (type the word)", out_str); +*/ + getlin("何を調べる?(文字を入れてね)", out_str); if (out_str[0] == '\0' || out_str[0] == '\033') return 0; @@ -514,10 +717,17 @@ int glyph; /* glyph at selected position */ if (flags.verbose) +#if 0 /*JP*/ pline("Please move the cursor to %s.", what_is_an_unknown_object); +#else + pline("カーソルを物体に移動してください."); +#endif else +/*JP pline("Pick an object."); +*/ + pline("物体を指定してください."); ans = getpos(&cc, quick, what_is_an_unknown_object); if (ans < 0 || cc.x < 0) { @@ -564,11 +774,22 @@ monexplain[i]) { need_to_look = TRUE; if (!found) { +/*JP Sprintf(out_str, "%c %s", sym, an(monexplain[i])); +*/ + Sprintf(out_str, "%c %s", sym, jtrns_obj('S', monexplain[i])); +#if 0 /*JP*/ firstmatch = monexplain[i]; +#else + firstmatch = jtrns_obj('S',monexplain[i]); + firstmatch2 = monexplain[i]; +#endif found++; } else { +/*JP found += append_str(out_str, an(monexplain[i])); +*/ + found += append_str(out_str, jtrns_obj('S',monexplain[i])); } } } @@ -579,7 +800,11 @@ (sym == monsyms[S_HUMAN] && cc.x == u.ux && cc.y == u.uy) : (sym == def_monsyms[S_HUMAN] && !iflags.showrace)) && !(Race_if(PM_HUMAN) || Race_if(PM_ELF)) && !Upolyd) +#if 0 /*JP*/ found += append_str(out_str, "you"); /* tack on "or you" */ +#else + found += append_str(out_str, "あなた"); /* tack on "or you" */ +#endif /* * Special case: if identifying from the screen, and we're swallowed, @@ -589,7 +814,12 @@ if (u.uswallow && from_screen && is_swallow_sym(sym)) { if (!found) { Sprintf(out_str, "%c %s", sym, mon_interior); +#if 0 /*JP*/ firstmatch = mon_interior; +#else + firstmatch = "怪物の内部"; + firstmatch2 = mon_interior; +#endif } else { found += append_str(out_str, mon_interior); } @@ -605,22 +835,44 @@ continue; } if (!found) { +/*JP Sprintf(out_str, "%c %s", sym, an(objexplain[i])); +*/ + Sprintf(out_str, "%c %s", sym, jtrns_obj('S',objexplain[i])); +#if 0 /*JP*/ firstmatch = objexplain[i]; +#else + firstmatch = jtrns_obj('S',objexplain[i]); + firstmatch2 = objexplain[i]; +#endif found++; } else { +/*JP found += append_str(out_str, an(objexplain[i])); +*/ + found += append_str(out_str, jtrns_obj('S',objexplain[i])); } } } if (sym == DEF_INVISIBLE) { if (!found) { +/*JP Sprintf(out_str, "%c %s", sym, an(invisexplain)); +*/ + Sprintf(out_str, "%c %s", sym, jtrns_obj('S',invisexplain)); +#if 0 /*JP*/ firstmatch = invisexplain; +#else + firstmatch = jtrns_obj('S', invisexplain); + firstmatch2 = invisexplain; +#endif found++; } else { +/*JP found += append_str(out_str, an(invisexplain)); +*/ + found += append_str(out_str, jtrns_obj('S', invisexplain)); } } @@ -632,26 +884,45 @@ x_str = defsyms[i].explanation; if (sym == (from_screen ? showsyms[i] : defsyms[i].sym) && *x_str) { /* avoid "an air", "a water", or "a floor of a room" */ +#if 0 /*JP*/ int article = (i == S_room) ? 2 : /* 2=>"the" */ !(strcmp(x_str, "air") == 0 || /* 1=>"an" */ strcmp(x_str, "water") == 0); /* 0=>(none)*/ +#endif if (!found) { if (is_cmap_trap(i)) { +/*JP Sprintf(out_str, "%c a trap", sym); +*/ + Sprintf(out_str, "%c 罠", sym); hit_trap = TRUE; } else { +#if 0 /*JP*/ Sprintf(out_str, "%c %s", sym, article == 2 ? the(x_str) : article == 1 ? an(x_str) : x_str); +#else + Sprintf(out_str, "%c %s", sym, + jtrns_obj('S', x_str)); +#endif } +#if 0 /*JP*/ firstmatch = x_str; +#else + firstmatch = jtrns_obj('S', x_str); + firstmatch2 = x_str; +#endif found++; } else if (!u.uswallow && !(hit_trap && is_cmap_trap(i)) && !(found >= 3 && is_cmap_drawbridge(i))) { +#if 0 /*JP*/ found += append_str(out_str, article == 2 ? the(x_str) : article == 1 ? an(x_str) : x_str); +#else + found += append_str(out_str, jtrns_obj('S', x_str)); +#endif if (is_cmap_trap(i)) hit_trap = TRUE; } @@ -668,6 +939,9 @@ Sprintf(out_str, "%c %s", sym, def_warnsyms[i].explanation); firstmatch = def_warnsyms[i].explanation; +#if 1 /*JP*/ /* 多分不要だが念のため */ + firstmatch2 = firstmatch; +#endif found++; } else { found += append_str(out_str, def_warnsyms[i].explanation); @@ -684,22 +958,40 @@ if (skipped_venom && found < 2) { x_str = objexplain[VENOM_CLASS]; if (!found) { +#if 0 /*JP*/ Sprintf(out_str, "%c %s", sym, an(x_str)); firstmatch = x_str; +#else + Sprintf(out_str, "%c %s", sym, jtrns_obj('S', (x_str))); + firstmatch = jtrns_obj('S', x_str); + firstmatch2 = x_str; +#endif found++; } else { +/*JP found += append_str(out_str, an(x_str)); +*/ + found += append_str(out_str, jtrns_obj('S', x_str)); } } /* handle optional boulder symbol as a special case */ if (iflags.bouldersym && sym == iflags.bouldersym) { if (!found) { +#if 0 /*JP*/ firstmatch = "boulder"; Sprintf(out_str, "%c %s", sym, an(firstmatch)); +#else + firstmatch = "岩"; + firstmatch2 = "boulder"; + Sprintf(out_str, "%c 岩", sym); +#endif found++; } else { +/*JP found += append_str(out_str, "boulder"); +*/ + found += append_str(out_str, "岩"); } } @@ -712,15 +1004,24 @@ char monbuf[BUFSZ]; char temp_buf[BUFSZ]; +/*JP pm = lookat(cc.x, cc.y, look_buf, monbuf); +*/ + pm = lookat(cc.x, cc.y, look_buf, monbuf, look_buf2); firstmatch = look_buf; +#if 1 /*JP*/ + firstmatch2 = look_buf2; +#endif if (*firstmatch) { Sprintf(temp_buf, " (%s)", firstmatch); (void)strncat(out_str, temp_buf, BUFSZ-strlen(out_str)-1); found = 1; /* we have something to look up */ } if (monbuf[0]) { +/*JP Sprintf(temp_buf, " [seen: %s]", monbuf); +*/ + Sprintf(temp_buf, "[%s]", monbuf); (void)strncat(out_str, temp_buf, BUFSZ-strlen(out_str)-1); } } @@ -730,14 +1031,26 @@ if (found) { pline("%s", out_str); /* check the data file for information about this thing */ +#if 0 /*JP*/ if (found == 1 && ans != LOOK_QUICK && ans != LOOK_ONCE && (ans == LOOK_VERBOSE || (flags.help && !quick))) { +#else + if (found == 1 && ans != LOOK_QUICK && ans != LOOK_ONCE && + (ans == LOOK_VERBOSE || (flags.help && !quick)) && + firstmatch2) { +#endif char temp_buf[BUFSZ]; +/*JP Strcpy(temp_buf, firstmatch); +*/ + Strcpy(temp_buf, firstmatch2); checkfile(temp_buf, pm, FALSE, (boolean)(ans == LOOK_VERBOSE)); } } else { +/*JP pline("I've never heard of such things."); +*/ + pline("そんな名前は聞いたことがない."); } } while (from_screen && !quick && ans != LOOK_ONCE); @@ -777,6 +1090,7 @@ tt == ROCKTRAP) break; } tt = what_trap(tt); +#if 0 /*JP*/ pline("That is %s%s%s.", an(defsyms[trap_to_defsym(tt)].explanation), !trap->madeby_u ? "" : (tt == WEB) ? " woven" : @@ -785,9 +1099,18 @@ as much "set" as "dug" anyway */ (tt == HOLE || tt == PIT) ? " dug" : " set", !trap->madeby_u ? "" : " by you"); +#else + pline("それは%s%sだ.", + !trap->madeby_u ? "" : (tt == WEB) ? "あなたが張った" : + (tt == HOLE || tt == PIT) ? "あなたが掘った" : "あなたが仕掛けた", + jtrns_obj('^', defsyms[trap_to_defsym(tt)].explanation)); +#endif return 0; } +/*JP pline("I can't see a trap there."); +*/ + pline("そこには罠はみあたらない."); return 0; } @@ -802,7 +1125,11 @@ fp = dlb_fopen(CMDHELPFILE, "r"); if (!fp) { +#if 0 /*JP*/ pline("Cannot open data file!"); +#else + pline("データファイルを開けない!"); +#endif return 0; } @@ -845,7 +1172,10 @@ #if defined(UNIX) || defined(VMS) introff(); #endif +/*JP q = yn_function("What command?", (char *)0, '\0'); +*/ + q = yn_function("どういうコマンド?", (char *)0, '\0'); #if defined(UNIX) || defined(VMS) intron(); #endif @@ -853,12 +1183,16 @@ if (reslt) pline("%s", reslt); else +/*JP pline("I've never heard of such commands."); +*/ + pline("そんなコマンドは知らない."); return 0; } /* data for help_menu() */ static const char *help_menu_items[] = { +#if 0 /*JP*/ /* 0*/ "Long description of the game and commands.", /* 1*/ "List of game commands.", /* 2*/ "Concise history of NetHack.", @@ -878,6 +1212,28 @@ #ifdef WIZARD "List of wizard-mode commands.", #endif +#else /*JP*/ +/* 0*/ "ゲームおよびコマンドの解説.(長文)", +/* 1*/ "コマンド一覧.", +/* 2*/ "NetHackの簡単な歴史.", +/* "JNetHackの簡単な歴史.",*/ +/* 3*/ "画面に表示される文字の説明.", +/* 4*/ "このキーが何を意味するかの説明.", +/* 5*/ "ゲームのオプション一覧.", +/* 6*/ "ゲームのオプション一覧.(長文)", +/* 7*/ "拡張コマンド一覧.", +/* 8*/ "NetHackのライセンス.", +#ifdef PORT_HELP + "%sに特有のヘルプおよびコマンド.", +#define PORT_HELP_ID 100 +#define WIZHLP_SLOT 10 +#else +#define WIZHLP_SLOT 9 +#endif +#ifdef WIZARD + "ウィザードモードのコマンド一覧.", +#endif +#endif /*JP*/ "", (char *)0 }; @@ -915,7 +1271,10 @@ add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, help_menu_items[i], MENU_UNSELECTED); } +/*JP end_menu(tmpwin, "Select one item:"); +*/ + end_menu(tmpwin, "選んでください:"); n = select_menu(tmpwin, PICK_ONE, &selected); destroy_nhwindow(tmpwin); if (n > 0) { diff -aurbN -xCVS -xXTAGS nethack/src/pickup.c jnethack/src/pickup.c --- nethack/src/pickup.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/pickup.c 2005-07-16 04:08:49.000000000 +0900 @@ -3,6 +3,13 @@ /* NetHack may be freely redistributed. See license for details. */ /* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + +/* * Contains code for picking objects up, and container use. */ @@ -55,9 +62,15 @@ /* if you can figure this out, give yourself a hearty pat on the back... */ #define GOLD_CAPACITY(w,n) (((w) * -100L) - ((n) + 50L) - 1L) +#if 0 /*JP*/ static const char moderateloadmsg[] = "You have a little trouble lifting"; static const char nearloadmsg[] = "You have much trouble lifting"; static const char overloadmsg[] = "You have extreme difficulty lifting"; +#else +static const char moderateloadmsg[] = "を持ったら少しふらついた."; +static const char nearloadmsg[] = "はずっしりと肩にのしかかった."; +static const char overloadmsg[] = "を持ちあげるのはとてもつらい."; +#endif /* BUG: this lets you look at cockatrice corpses while blind without touching them */ @@ -137,6 +150,11 @@ * "?/a" or "a?/" or "/a?",&c picks all '?' even though no '/' * (ie, treated as if it had just been "?a"). */ +/*JP CHECK: 3.4.3 での呼び出し元 +pickup.c:572:("拾う") if (!query_classes(oclasses, &selective, &all_of_a_type, +pickup.c:2604:("取り出す") if (query_classes(select, &one_by_one, &allflag, +pickup.c:2704:("入れる") if (query_classes(select, &one_by_one, &allflag, "入れる", +*/ #ifndef GOLDOBJ STATIC_OVL boolean query_classes(oclasses, one_at_a_time, everything, action, objs, @@ -200,8 +218,13 @@ oclasses[oclassct = 0] = '\0'; *one_at_a_time = *everything = FALSE; not_everything = FALSE; +#if 0 /*JP*/ Sprintf(qbuf,"What kinds of thing do you want to %s? [%s]", action, ilets); +#else + Sprintf(qbuf,"どの種類のものを%sか?[%s]", + jpolite(action), ilets); +#endif getlin(qbuf,inbuf); if (*inbuf == '\033') return FALSE; @@ -226,13 +249,25 @@ oclasses[oclassct] = '\0'; } else { if (!where) +#if 0 /*JP*/ where = !strcmp(action,"pick up") ? "here" : !strcmp(action,"take out") ? "inside" : ""; +#else + where = !strcmp(action,"拾う") ? "ここ" : + !strcmp(action,"取り出す") ? + "の中" : ""; +#endif if (*where) +/*JP There("are no %c's %s.", sym, where); +*/ + pline("%cは%sにない.", sym, where); else +/*JP You("have no %c's.", sym); +*/ + You("%cは持っていない.", sym); not_everything = TRUE; } } @@ -433,7 +468,10 @@ } if (notake(youmonst.data)) { if (!autopickup) +/*JP You("are physically incapable of picking anything up."); +*/ + You("物理的に拾いあげることができない."); else check_here(FALSE); return (0); @@ -467,7 +505,10 @@ /* use menus exclusively */ if (count) { /* looking for N of something */ char buf[QBUFSZ]; +/*JP Sprintf(buf, "Pick %d of what?", count); +*/ + Sprintf(buf, "何を%d個拾いますか?", count); val_for_n_or_more = count; /* set up callback selector */ n = query_objlist(buf, objchain, traverse_how|AUTOSELECT_SINGLE|INVORDER_SORT, @@ -476,7 +517,10 @@ for (i = 0; i < n; i++) pick_list[i].count = count; } else { +/*JP n = query_objlist("Pick up what?", objchain, +*/ + n = query_objlist("何を拾いますか?", objchain, traverse_how|AUTOSELECT_SINGLE|INVORDER_SORT|FEEL_COCKATRICE, &pick_list, PICK_ANY, all_but_uchain); } @@ -519,17 +563,28 @@ } else if (ct >= 2) { int via_menu = 0; +#if 0 /*JP*/ There("are %s objects here.", (ct <= 10) ? "several" : "many"); +#else + pline("ここには%sものがある.", + (ct <= 10) ? "いくつか" : "沢山の"); +#endif if (!query_classes(oclasses, &selective, &all_of_a_type, +/*JP "pick up", objchain, +*/ + "拾う", objchain, traverse_how == BY_NEXTHERE, #ifndef GOLDOBJ FALSE, #endif &via_menu)) { if (!via_menu) return (0); +/*JP n = query_objlist("Pick up what?", +*/ + n = query_objlist("何を拾いますか?", objchain, traverse_how|(selective ? 0 : INVORDER_SORT), &pick_list, PICK_ANY, @@ -550,9 +605,15 @@ if (!all_of_a_type) { char qbuf[BUFSZ]; +#if 0 /*JP*/ Sprintf(qbuf, "Pick up %s?", safe_qbuf("", sizeof("Pick up ?"), doname(obj), an(simple_typename(obj->otyp)), "something")); +#else + Sprintf(qbuf, "%sを拾いますか?", + safe_qbuf("", sizeof("%sを拾いますか?"), doname(obj), + an(simple_typename(obj->otyp)), "これ")); +#endif switch ((obj->quan < 2L) ? ynaq(qbuf) : ynNaq(qbuf)) { case 'q': goto end_query; /* out 2 levels */ case 'n': continue; @@ -850,7 +911,10 @@ any.a_void = 0; any.a_int = ALL_TYPES_SELECTED; add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, +/*JP (qflags & WORN_TYPES) ? "All worn types" : "All types", +*/ + (qflags & WORN_TYPES) ? "身につけるもの全て" : "全て", MENU_UNSELECTED); invlet = 'b'; } else @@ -886,7 +950,10 @@ any.a_void = 0; any.a_int = 'u'; add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, +/*JP "Unpaid items", MENU_UNSELECTED); +*/ + "未払の道具", MENU_UNSELECTED); } /* billed items: checked by caller, so always include if BILLED_TYPES */ if (qflags & BILLED_TYPES) { @@ -894,7 +961,10 @@ any.a_void = 0; any.a_int = 'x'; add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, +/*JP "Unpaid items already used up", MENU_UNSELECTED); +*/ + "未払で使ってしまった道具", MENU_UNSELECTED); } if (qflags & CHOOSE_ALL) { invlet = 'A'; @@ -902,8 +972,13 @@ any.a_int = 'A'; add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, (qflags & WORN_TYPES) ? +#if 0 /*JP*/ "Auto-select every item being worn" : "Auto-select every item", MENU_UNSELECTED); +#else + "身につけられる物全て" : + "全て", MENU_UNSELECTED); +#endif } /* items with b/u/c/unknown if there are any */ if (do_blessed) { @@ -911,28 +986,40 @@ any.a_void = 0; any.a_int = 'B'; add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, +/*JP "Items known to be Blessed", MENU_UNSELECTED); +*/ + "祝福されているとわかっているもの", MENU_UNSELECTED); } if (do_cursed) { invlet = 'C'; any.a_void = 0; any.a_int = 'C'; add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, +/*JP "Items known to be Cursed", MENU_UNSELECTED); +*/ + "呪われているとわかっているもの", MENU_UNSELECTED); } if (do_uncursed) { invlet = 'U'; any.a_void = 0; any.a_int = 'U'; add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, +/*JP "Items known to be Uncursed", MENU_UNSELECTED); +*/ + "呪われていないとわかっているもの", MENU_UNSELECTED); } if (do_buc_unknown) { invlet = 'X'; any.a_void = 0; any.a_int = 'X'; add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, +/*JP "Items of unknown B/C/U status", +*/ + "祝福/呪いがわからないもの", MENU_UNSELECTED); } end_menu(win, qstr); @@ -989,7 +1076,11 @@ long umoney = money_cnt(invent); #endif unsigned saveowt; +#if 0 /*JP*/ const char *verb, *prefx1, *prefx2, *suffx; +#else + const char *verb, *prefx1; +#endif char obj_nambuf[BUFSZ], where[BUFSZ]; savequan = obj->quan; @@ -1094,11 +1185,23 @@ /* some message will be given */ Strcpy(obj_nambuf, doname(obj)); if (container) { +/*JP Sprintf(where, "in %s", the(xname(container))); +*/ + Sprintf(where, "%sの中に入っている", the(xname(container))); +/*JP verb = "carry"; +*/ + verb = "運べない"; } else { +/*JP Strcpy(where, "lying here"); +*/ + Strcpy(where, "ここに置いてある"); +/*JP verb = telekinesis ? "acquire" : "lift"; +*/ + verb = telekinesis ? "獲得できない" : "持ちあげられない"; } } else { /* lint supppression */ @@ -1108,29 +1211,51 @@ /* we can carry qq of them */ if (qq > 0) { if (qq < count) +#if 0 /*JP*/ You("can only %s %s of the %s %s.", verb, (qq == 1L) ? "one" : "some", obj_nambuf, where); +#else + You("%s%sのうちの%sしか%s.", + where, obj_nambuf, (qq == 1L) ? "1つ" : "いくつか", verb); +#endif *wt_after = wt; return qq; } +#if 0 /*JP*/ if (!container) Strcpy(where, "here"); /* slightly shorter form */ +#else + if (!container) Strcpy(where, "ここには"); /* slightly shorter form */ +#endif #ifndef GOLDOBJ if (invent || u.ugold) { #else if (invent || umoney) { #endif +#if 0 /*JP*/ prefx1 = "you cannot "; prefx2 = ""; suffx = " any more"; +#else + prefx1 = "これ以上"; +#endif } else { +#if 0 /*JP*/ prefx1 = (obj->quan == 1L) ? "it " : "even one "; prefx2 = "is too heavy for you to "; suffx = ""; +#else + prefx1 = "重すぎて"; +#endif } +#if 0 /*JP*/ There("%s %s %s, but %s%s%s%s.", otense(obj, "are"), obj_nambuf, where, prefx1, prefx2, verb, suffx); +#else + pline("%s%sがある,しかし%s.", + where, obj_nambuf, verb); +#endif /* *wt_after = iw; */ return 0L; @@ -1147,8 +1272,13 @@ int result, old_wt, new_wt, prev_encumbr, next_encumbr; if (obj->otyp == BOULDER && In_sokoban(&u.uz)) { +#if 0 /*JP*/ You("cannot get your %s around this %s.", body_part(HAND), xname(obj)); +#else + You("%sを%sで持ちあげることができない.", + xname(obj), body_part(HAND)); +#endif return -1; } if (obj->otyp == LOADSTONE || @@ -1164,7 +1294,10 @@ #else } else if (inv_cnt() >= 52 && !merge_choice(invent, obj)) { #endif +/*JP Your("knapsack cannot accommodate any more items."); +*/ + Your("ナップザックはこれ以上アイテムを詰め込めない."); result = -1; /* nothing lifted */ } else { result = 1; @@ -1178,8 +1311,12 @@ } else { char qbuf[BUFSZ]; long savequan = obj->quan; +#if 1 /*JP*/ + const char *msg; +#endif obj->quan = *cnt_p; +#if 0 /*JP*/ Strcpy(qbuf, (next_encumbr > HVY_ENCUMBER) ? overloadmsg : (next_encumbr > MOD_ENCUMBER) ? nearloadmsg : @@ -1187,6 +1324,15 @@ Sprintf(eos(qbuf), " %s. Continue?", safe_qbuf(qbuf, sizeof(" . Continue?"), doname(obj), an(simple_typename(obj->otyp)), "something")); +#else + msg = (next_encumbr > HVY_ENCUMBER) ? overloadmsg : + (next_encumbr > MOD_ENCUMBER) ? nearloadmsg : + moderateloadmsg; + Sprintf(qbuf, "%s%s.続けますか?", + safe_qbuf(qbuf, strlen(msg) + sizeof(".続けますか?"), + doname(obj), simple_typename(obj->otyp), "これ"), + msg); +#endif obj->quan = savequan; switch (ynq(qbuf)) { case 'q': result = -1; break; @@ -1243,7 +1389,10 @@ int res, nearload; #ifndef GOLDOBJ const char *where = (obj->ox == u.ux && obj->oy == u.uy) ? +/*JP "here" : "there"; +*/ + "ここ" : "そこ"; #endif if (obj->quan < count) { @@ -1272,26 +1421,50 @@ if (gold_capacity <= 0L) { pline( +#if 0 /*JP*/ "There %s %ld gold piece%s %s, but you cannot carry any more.", otense(obj, "are"), obj->quan, plur(obj->quan), where); +#else + "%sには%ld枚の金貨がある,しかしこれ以上持てない.", + where, obj->quan); +#endif return 0; } else if (gold_capacity < count) { +#if 0 /*JP*/ You("can only %s %s of the %ld gold pieces lying %s.", telekinesis ? "acquire" : "carry", gold_capacity == 1L ? "one" : "some", obj->quan, where); +#else + You("%sにある%ld枚の金貨の%sしか%s.", + where, + obj->quan, gold_capacity == 1L ? "ひとつ" : "一部", + telekinesis ? "獲得できない" : "運べない"); +#endif +#if 0 /*JP*/ pline("%s %ld gold piece%s.", nearloadmsg, gold_capacity, plur(gold_capacity)); +#else + pline("%ld枚の金貨%s.", + gold_capacity, nearloadmsg); +#endif u.ugold += gold_capacity; obj->quan -= gold_capacity; costly_gold(obj->ox, obj->oy, gold_capacity); } else { u.ugold += count; if ((nearload = near_capacity()) != 0) +#if 0 /*JP*/ pline("%s %ld gold piece%s.", nearload < MOD_ENCUMBER ? moderateloadmsg : nearloadmsg, count, plur(count)); +#else + pline("%ld枚の金貨%s", + count, + nearload < MOD_ENCUMBER ? + moderateloadmsg : nearloadmsg); +#endif else prinv((char *) 0, obj, count); costly_gold(obj->ox, obj->oy, count); @@ -1312,14 +1485,25 @@ else { char kbuf[BUFSZ]; +#if 0 /*JP:T*/ Strcpy(kbuf, an(corpse_xname(obj, TRUE))); pline("Touching %s is a fatal mistake.", kbuf); +#else + char *p = corpse_xname(obj, TRUE); + pline("%sに触れるのは致命的な間違いだ.", p); + Sprintf(kbuf, "%sに触れて", p); +#endif instapetrify(kbuf); return -1; } } else if (is_rider(&mons[obj->corpsenm])) { +#if 0 /*JP*/ pline("At your %s, the corpse suddenly moves...", telekinesis ? "attempted acquisition" : "touch"); +#else + pline("あなたが%sると突然死体が動き出した...", + telekinesis ? "獲得しようとす" : "触"); +#endif (void) revive_corpse(obj); exercise(A_WIS, FALSE); return -1; @@ -1328,10 +1512,15 @@ if (obj->blessed) obj->blessed = 0; else if (!obj->spe && !obj->cursed) obj->spe = 1; else { +#if 0 /*JP*/ pline_The("scroll%s %s to dust as you %s %s up.", plur(obj->quan), otense(obj, "turn"), telekinesis ? "raise" : "pick", (obj->quan == 1L) ? "it" : "them"); +#else + pline("%s巻物はあなたが拾い上げると塵となってしまった.", + (obj->quan == 1L) ? "その" : "それらの"); +#endif if (!(objects[SCR_SCARE_MONSTER].oc_name_known) && !(objects[SCR_SCARE_MONSTER].oc_uname)) docall(obj); @@ -1409,6 +1598,7 @@ if(oldcap < newcap) { switch(newcap) { +#if 0 /*JP*/ case 1: Your("movements are slowed slightly because of your load."); break; case 2: You("rebalance your load. Movement is difficult."); @@ -1418,11 +1608,23 @@ break; default: You("%s move a handspan with this load!", newcap == 4 ? "can barely" : "can't even"); +#else + case 1: Your("動きは荷物のために少し遅くなった."); + break; + case 2: You("荷物の釣合をとり直したが,動きにくい."); + break; + case 3: You("荷物の重みでのたうちまわった.動くのが非常にきつい."); + break; + case 4: You("かろうじて,動くことができる."); + break; + default: You("この重さでは少しも動けない!"); +#endif break; } flags.botl = 1; } else if(oldcap > newcap) { switch(newcap) { +#if 0 /*JP*/ case 0: Your("movements are now unencumbered."); break; case 1: Your("movements are only slowed slightly by your load."); @@ -1432,6 +1634,16 @@ case 3: You("%s under your load. Movement is still very hard.", stagger(youmonst.data, "stagger")); break; +#else + case 0: Your("動きは楽になった."); + break; + case 1: You("ちょっと動きやすくなった."); + break; + case 2: You("荷物の釣合をとり直した.だがまだ動くのはきつい."); + break; + case 3: You("荷物の重みがずっしりと肩にくる.まだ動くのが非常にきつい."); + break; +#endif } flags.botl = 1; } @@ -1469,18 +1681,32 @@ rider_cant_reach(); /* not skilled enough to reach */ else #endif +/*JP You("cannot reach the %s.", surface(x, y)); +*/ + You("%sに届かない.", surface(x, y)); return FALSE; } else if (is_pool(x, y) || is_lava(x, y)) { /* at present, can't loot in water even when Underwater */ +#if 0 /*JP*/ You("cannot loot things that are deep in the %s.", is_lava(x, y) ? "lava" : "water"); +#else + You("%sに深くに沈んだものを開けることできない.", + is_lava(u.ux, u.uy) ? "溶岩" : "水"); +#endif return FALSE; } else if (nolimbs(youmonst.data)) { +/*JP pline("Without limbs, you cannot loot anything."); +*/ + pline("手足がないので,開けることはできない."); return FALSE; } else if (!freehand()) { +/*JP pline("Without a free %s, you cannot loot anything.", +*/ + pline("自由になる%sがないので,開けることはできない.", body_part(HAND)); return FALSE; } @@ -1510,7 +1736,9 @@ int timepassed = 0; coord cc; boolean underfoot = TRUE; +#if 0 /*JP*/ const char *dont_find_anything = "don't find anything"; +#endif struct monst *mtmp; char qbuf[BUFSZ]; int prev_inquiry = 0; @@ -1521,7 +1749,11 @@ return 0; } if (nohands(youmonst.data)) { +#if 0 /*JP*/ You("have no hands!"); /* not `body_part(HAND)' */ +#else + pline("あなたには手がない!"); +#endif return 0; } cc.x = u.ux; cc.y = u.uy; @@ -1536,32 +1768,54 @@ nobj = cobj->nexthere; if (Is_container(cobj)) { +#if 0 /*JP*/ Sprintf(qbuf, "There is %s here, loot it?", safe_qbuf("", sizeof("There is here, loot it?"), doname(cobj), an(simple_typename(cobj->otyp)), "a container")); +#else + Sprintf(qbuf, "ここには%sがある.開けますか?", + safe_qbuf("", sizeof("ここにはがある.開けますか?"), + doname(cobj), an(simple_typename(cobj->otyp)), + "入れ物")); +#endif c = ynq(qbuf); if (c == 'q') return (timepassed); if (c == 'n') continue; any = TRUE; if (cobj->olocked) { +/*JP pline("Hmmm, it seems to be locked."); +*/ + pline("むーん,鍵がかかっているようだ."); continue; } if (cobj->otyp == BAG_OF_TRICKS) { int tmp; +/*JP You("carefully open the bag..."); +*/ + You("慎重に鞄を開けた..."); +/*JP pline("It develops a huge set of teeth and bites you!"); +*/ + pline("鞄から大きな歯が生えてきて,あなたを噛んだ!"); tmp = rnd(10); if (Half_physical_damage) tmp = (tmp+1) / 2; +/*JP losehp(tmp, "carnivorous bag", KILLED_BY_AN); +*/ + losehp(tmp, "食肉鞄に噛まれて", KILLED_BY_AN); makeknown(BAG_OF_TRICKS); timepassed = 1; continue; } +/*JP You("carefully open %s...", the(xname(cobj))); +*/ + You("慎重に%sを開けた...", the(xname(cobj))); timepassed |= use_container(cobj, 0); if (multi < 0) return 1; /* chest trap */ } @@ -1594,7 +1848,10 @@ goto gotit; /* two level break */ gotit: if (coffers) { +/*JP verbalize("Thank you for your contribution to reduce the debt."); +*/ + verbalize("赤字国債返済のための寄付に感謝します."); (void) add_to_container(coffers, goldob); coffers->owt = weight(coffers); } else { @@ -1604,7 +1861,10 @@ #ifndef GOLDOBJ mon->mgold += goldob->quan; delobj(goldob); +/*JP pline("The exchequer accepts your contribution."); +*/ + pline("財務省はあなたの寄付を受けとった."); } else { dropx(goldob); } @@ -1613,7 +1873,10 @@ dropx(goldob); #else add_to_minv(mon, goldob); +/*JP pline("The exchequer accepts your contribution."); +*/ + pline("財務省はあなたの寄付を受けとった."); } else { dropy(goldob); } @@ -1621,18 +1884,29 @@ } else { dropy(goldob); #endif +/*JP pline("Ok, now there is loot here."); +*/ + pline("オーケー,ここに賄賂を置いておこう."); } } } else if (IS_GRAVE(levl[cc.x][cc.y].typ)) { +/*JP You("need to dig up the grave to effectively loot it..."); +*/ + You("墓荒らしをするには掘らなくては..."); } /* * 3.3.1 introduced directional looting for some things. */ if (c != 'y' && mon_beside(u.ux, u.uy)) { +#if 0 /*JP*/ if (!get_adjacent_loc("Loot in what direction?", "Invalid loot location", u.ux, u.uy, &cc)) return 0; +#else + if (!get_adjacent_loc("どの方向を調べる?", "調べるものがない", + u.ux, u.uy, &cc)) return 0; +#endif if (cc.x == u.ux && cc.y == u.uy) { underfoot = TRUE; if (container_at(cc.x, cc.y, FALSE)) @@ -1640,8 +1914,13 @@ } else underfoot = FALSE; if (u.dz < 0) { +#if 0 /*JP*/ You("%s to loot on the %s.", dont_find_anything, ceiling(cc.x, cc.y)); +#else + You("%sを調べたが何もみつからなかった.", + ceiling(cc.x, cc.y)); +#endif timepassed = 1; return timepassed; } @@ -1655,21 +1934,40 @@ if (!underfoot) { if (container_at(cc.x, cc.y, FALSE)) { if (mtmp) { +#if 0 /*JP*/ You_cant("loot anything %sthere with %s in the way.", prev_inquiry ? "else " : "", mon_nam(mtmp)); +#else + pline("%sがいるので%s箱を開けられない.", + mon_nam(mtmp), prev_inquiry ? "ほかの" : ""); +#endif return timepassed; } else { +#if 0 /*JP*/ You("have to be at a container to loot it."); +#else + You("は箱を開けるためには同じ位置にいなければならない."); +#endif } } else { +#if 0 /*JP*/ You("%s %sthere to loot.", dont_find_anything, (prev_inquiry || prev_loot) ? "else " : ""); +#else + pline("ここには%s開けられるものはない.", + (prev_inquiry || prev_loot) ? "ほかに" : ""); +#endif return timepassed; } } } else if (c != 'y' && c != 'n') { +#if 0 /*JP*/ You("%s %s to loot.", dont_find_anything, underfoot ? "here" : "there"); +#else + pline("%sには開けられるものはない.", + underfoot ? "ここ" : "そこ"); +#endif } return (timepassed); } @@ -1694,15 +1992,25 @@ if (mtmp && mtmp != u.usteed && (otmp = which_armor(mtmp, W_SADDLE))) { long unwornmask; if (passed_info) *passed_info = 1; +/*JP Sprintf(qbuf, "Do you want to remove the saddle from %s?", +*/ + Sprintf(qbuf, "%sから鞍をはずしますか?", x_monnam(mtmp, ARTICLE_THE, (char *)0, SUPPRESS_SADDLE, FALSE)); if ((c = yn_function(qbuf, ynqchars, 'n')) == 'y') { if (nolimbs(youmonst.data)) { +#if 0 /*JP*/ You_cant("do that without limbs."); /* not body_part(HAND) */ +#else + You_cant("手がないとできない."); +#endif return (0); } if (otmp->cursed) { +/*JP You("can't. The saddle seems to be stuck to %s.", +*/ + pline("鞍は%sにくっついているようだ.", x_monnam(mtmp, ARTICLE_THE, (char *)0, SUPPRESS_SADDLE, FALSE)); @@ -1715,7 +2023,10 @@ otmp->owornmask = 0L; update_mon_intrinsics(mtmp, otmp, FALSE, FALSE); } +/*JP otmp = hold_another_object(otmp, "You drop %s!", doname(otmp), +*/ + otmp = hold_another_object(otmp, "%sを落とした!", doname(otmp), (const char *)0); timepassed = rnd(3); if (prev_loot) *prev_loot = TRUE; @@ -1777,18 +2088,32 @@ impossible(" no current_container?"); return 0; } else if (obj == uball || obj == uchain) { +/*JP You("must be kidding."); +*/ + pline("ご冗談を."); return 0; } else if (obj == current_container) { +/*JP pline("That would be an interesting topological exercise."); +*/ + pline("それは興味をそそられるトポロジーの問題だ."); return 0; } else if (obj->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL)) { +#if 0 /*JP*/ Norep("You cannot %s %s you are wearing.", Icebox ? "refrigerate" : "stash", something); +#else + Norep("身につけているものを%sことはできない.", + Icebox ? "冷凍する" : "しまう"); +#endif return 0; } else if ((obj->otyp == LOADSTONE) && obj->cursed) { obj->bknown = 1; +/*JP pline_The("stone%s won't leave your person.", plur(obj->quan)); +*/ + pline("どういうわけかその石をしまうことはできない."); return 0; } else if (obj->otyp == AMULET_OF_YENDOR || obj->otyp == CANDELABRUM_OF_INVOCATION || @@ -1798,10 +2123,16 @@ * steal them. It also becomes a pain to check to see if someone * has the Amulet. Ditto for the Candelabrum, the Bell and the Book. */ +/*JP pline("%s cannot be confined in such trappings.", The(xname(obj))); +*/ + pline("%sは詰めることはできない.", The(xname(obj))); return 0; } else if (obj->otyp == LEASH && obj->leashmon != 0) { +/*JP pline("%s attached to your pet.", Tobjnam(obj, "are")); +*/ + pline("%sはペットに付けられている.", xname(obj)); return 0; } else if (obj == uwep) { if (welded(obj)) { @@ -1826,8 +2157,14 @@ else { char kbuf[BUFSZ]; +#if 0 /*JP:T*/ Strcpy(kbuf, an(corpse_xname(obj, TRUE))); pline("Touching %s is a fatal mistake.", kbuf); +#else + char *p = corpse_xname(obj, TRUE); + pline("%sに触れるのは致命的な間違いだ.", p); + Sprintf(kbuf, "%sに触れて", p); +#endif instapetrify(kbuf); return -1; } @@ -1844,7 +2181,10 @@ * of evaluation of the parameters is undefined. */ Strcpy(buf, the(xname(obj))); +/*JP You("cannot fit %s into %s.", buf, +*/ + pline("%sを%sに詰め込むことはできない.", buf, the(xname(current_container))); return 0; } @@ -1878,9 +2218,15 @@ } } else if (Is_mbag(current_container) && mbag_explodes(obj, 0)) { /* explicitly mention what item is triggering the explosion */ +#if 0 /*JP:T*/ pline( "As you put %s inside, you are blasted by a magical explosion!", doname(obj)); +#else + pline( + "%sを中に入れると,あなたは魔法の爆発を浴びた!", + doname(obj)); +#endif /* did not actually insert obj yet */ if (was_unpaid) addtobill(obj, FALSE, FALSE, TRUE); obfree(obj, (struct obj *)0); @@ -1892,13 +2238,19 @@ else panic("in_container: bag not found."); +/*JP losehp(d(6,6),"magical explosion", KILLED_BY_AN); +*/ + losehp(d(6,6),"魔法の爆発で", KILLED_BY_AN); current_container = 0; /* baggone = TRUE; */ } if (current_container) { Strcpy(buf, the(xname(current_container))); +/*JP You("put %s into %s.", doname(obj), buf); +*/ + You("%sを%sの中にしまった.", doname(obj), buf); /* gold in container always needs to be added to credit */ if (floor_container && obj->oclass == COIN_CLASS) @@ -1949,8 +2301,14 @@ else { char kbuf[BUFSZ]; +#if 0 /*JP:T*/ Strcpy(kbuf, an(corpse_xname(obj, TRUE))); pline("Touching %s is a fatal mistake.", kbuf); +#else + char *p = corpse_xname(obj, TRUE); + pline("%sに触れるのは致命的な間違いだ.", p); + Sprintf(kbuf, "%sに触れて", p); +#endif instapetrify(kbuf); return -1; } @@ -1982,14 +2340,22 @@ addtobill(obj, FALSE, FALSE, FALSE); } if (is_pick(obj) && !obj->unpaid && *u.ushops && shop_keeper(*u.ushops)) +/*JP verbalize("You sneaky cad! Get out of here with that pick!"); +*/ + verbalize("卑劣なやつめ!すぐにつるはしを持って消えな!"); otmp = addinv(obj); loadlev = near_capacity(); prinv(loadlev ? (loadlev < MOD_ENCUMBER ? +#if 0 /*JP*/ "You have a little trouble removing" : "You have much trouble removing") : (char *)0, +#else + "を運ぶのは少々困難だ." : + "を運ぶのはかなり困難だ.") : (char *)0, +#endif otmp, count); if (is_gold) { @@ -2011,9 +2377,17 @@ long loss = 0L; if (item->dknown) +/*JP pline("%s %s vanished!", Doname2(item), otense(item, "have")); +*/ + pline("%sは消え去った!", Doname2(item)); else +#if 0 /*JP*/ You("%s %s disappear!", Blind ? "notice" : "see", doname(item)); +#else + You("%sが見えなくなるの%s.", + doname(item), Blind ? "に気づいた" : "を見た"); +#endif if (*u.ushops && (shkp = shop_keeper(*u.ushops)) != 0) { if (held ? (boolean) item->unpaid : costly_spot(u.ux, u.uy)) @@ -2028,7 +2402,10 @@ observe_quantum_cat(box) struct obj *box; { +/*JP static NEARDATA const char sc[] = "Schroedinger's Cat"; +*/ + static NEARDATA const char sc[] = "シュレディンガーの猫"; struct obj *deadcat; struct monst *livecat; xchar ox, oy; @@ -2047,9 +2424,15 @@ livecat->mpeaceful = 1; set_malign(livecat); if (!canspotmon(livecat)) +/*JP You("think %s brushed your %s.", something, body_part(FOOT)); +*/ + You("%sがあなたの%sをくすぐった.", something, body_part(FOOT)); else +/*JP pline("%s inside the box is still alive!", Monnam(livecat)); +*/ + pline("箱のなかの%sはまだ生きている!", Monnam(livecat)); (void) christen_monst(livecat, sc); } else { deadcat = mk_named_object(CORPSE, &mons[PM_HOUSECAT], @@ -2058,8 +2441,13 @@ obj_extract_self(deadcat); (void) add_to_container(box, deadcat); } +#if 0 /*JP*/ pline_The("%s inside the box is dead!", Hallucination ? rndmonnam() : "housecat"); +#else + pline("箱の中の%sは死んでいる!", + jtrns_mon(Hallucination ? rndmonnam() : "housecat")); +#endif } box->owt = weight(box); return; @@ -2086,18 +2474,34 @@ emptymsg[0] = '\0'; if (nohands(youmonst.data)) { +#if 0 /*JP*/ You("have no hands!"); /* not `body_part(HAND)' */ +#else + pline("あなたには手がない!"); /* not `body_part(HAND)' */ +#endif return 0; } else if (!freehand()) { +/*JP You("have no free %s.", body_part(HAND)); +*/ + You("%sの自由が効かない.", body_part(HAND)); return 0; } if (obj->olocked) { +/*JP pline("%s to be locked.", Tobjnam(obj, "seem")); +*/ + pline("%sは鍵がかかっているようだ.", xname(obj)); +/*JP if (held) You("must put it down to unlock."); +*/ + if (held) pline("下に置かないことには鍵をはずせない."); return 0; } else if (obj->otrapped) { +/*JP if (held) You("open %s...", the(xname(obj))); +*/ + if (held) You("%sを開けた...", the(xname(obj))); (void) chest_trap(obj, HAND, FALSE); /* even if the trap fails, you've used up this turn */ if (multi >= 0) { /* in case we didn't become paralyzed */ @@ -2127,17 +2531,30 @@ } if (loss) /* magic bag lost some shop goods */ +/*JP You("owe %ld %s for lost merchandise.", loss, currency(loss)); +*/ + You("失った商品のために%ld%sの負債を負った.", loss, currency(loss)); obj->owt = weight(obj); /* in case any items were lost */ if (!cnt) +#if 0 /*JP:T*/ Sprintf(emptymsg, "%s is %sempty.", Yname2(obj), quantum_cat ? "now " : ""); +#else + Sprintf(emptymsg, "%sは%s空っぽだ.", Yname2(obj), + quantum_cat ? "今は" : ""); +#endif if (cnt || flags.menu_style == MENU_FULL) { +#if 0 /*JP*/ Strcpy(qbuf, "Do you want to take something out of "); Sprintf(eos(qbuf), "%s?", safe_qbuf(qbuf, 1, yname(obj), ysimple_name(obj), "it")); +#else + Sprintf(qbuf, "%sから何か取り出しますか?", + safe_qbuf(qbuf, sizeof("から何か取り出しますか?"), yname(obj), ysimple_name(obj), "そこ")); +#endif if (flags.menu_style != MENU_TRADITIONAL) { if (flags.menu_style == MENU_FULL) { int t; @@ -2150,12 +2567,18 @@ #endif if (!outokay && !inokay) { pline("%s", emptymsg); +/*JP You("don't have anything to put in."); +*/ + You("入れるものが何もない."); return used; } menuprompt[0] = '\0'; if (!cnt) Sprintf(menuprompt, "%s ", emptymsg); +/*JP Strcat(menuprompt, "Do what?"); +*/ + Strcat(menuprompt, "どうする?"); t = in_or_out_menu(menuprompt, current_container, outokay, inokay); if (t <= 0) return 0; loot_out = (t & 0x01) != 0; @@ -2180,7 +2603,10 @@ goto ask_again2; case 'y': if (query_classes(select, &one_by_one, &allflag, +/*JP "take out", current_container->cobj, +*/ + "取り出す", current_container->cobj, FALSE, #ifndef GOLDOBJ FALSE, @@ -2218,11 +2644,17 @@ if (!invent) { #endif /* nothing to put in, but some feedback is necessary */ +/*JP You("don't have anything to put in."); +*/ + You("中に入れるものを何も持っていない."); return used; } if (flags.menu_style != MENU_FULL) { +/*JP Sprintf(qbuf, "Do you wish to put %s in?", something); +*/ + Strcpy(qbuf, "中に何か入れますか?"); Strcpy(pbuf, ynqchars); if (flags.menu_style == MENU_TRADITIONAL && invent && inv_cnt() > 0) Strcat(pbuf, "m"); @@ -2267,7 +2699,10 @@ } else { /* traditional code */ menu_on_request = 0; +/*JP if (query_classes(select, &one_by_one, &allflag, "put in", +*/ + if (query_classes(select, &one_by_one, &allflag, "入れる", invent, FALSE, #ifndef GOLDOBJ (u.ugold != 0L), @@ -2306,7 +2741,10 @@ int n, i, n_looted = 0; boolean all_categories = TRUE, loot_everything = FALSE; char buf[BUFSZ]; +/*JP const char *takeout = "Take out", *putin = "Put in"; +*/ + const char *takeout = "取り出しますか", *putin = "入れますか"; struct obj *otmp, *otmp2; menu_item *pick_list; int mflags, res; @@ -2316,7 +2754,10 @@ all_categories = (retry == -2); } else if (flags.menu_style == MENU_FULL) { all_categories = FALSE; +/*JP Sprintf(buf,"%s what type of objects?", put_in ? putin : takeout); +*/ + Sprintf(buf,"どのタイプの物体を%s?", put_in ? putin : takeout); mflags = put_in ? ALL_TYPES | BUC_ALLBKNOWN | BUC_UNKNOWN : ALL_TYPES | CHOOSE_ALL | BUC_ALLBKNOWN | BUC_UNKNOWN; n = query_category(buf, put_in ? invent : container->cobj, @@ -2342,7 +2783,10 @@ } else { mflags = INVORDER_SORT; if (put_in && flags.invlet_constant) mflags |= USE_INVLET; +/*JP Sprintf(buf,"%s what?", put_in ? putin : takeout); +*/ + Sprintf(buf,"何を%s?", put_in ? putin : takeout); n = query_objlist(buf, put_in ? invent : container->cobj, mflags, &pick_list, PICK_ANY, all_categories ? allow_all : allow_category); @@ -2388,21 +2832,30 @@ start_menu(win); if (outokay) { any.a_int = 1; +/*JP Sprintf(buf,"Take %s out of %s", something, the(xname(obj))); +*/ + Sprintf(buf,"%sから出す", the(xname(obj))); add_menu(win, NO_GLYPH, &any, *menuselector, 0, ATR_NONE, buf, MENU_UNSELECTED); } menuselector++; if (inokay) { any.a_int = 2; +/*JP Sprintf(buf,"Put %s into %s", something, the(xname(obj))); +*/ + Sprintf(buf,"%sへ入れる", the(xname(obj))); add_menu(win, NO_GLYPH, &any, *menuselector, 0, ATR_NONE, buf, MENU_UNSELECTED); } menuselector++; if (outokay && inokay) { any.a_int = 3; add_menu(win, NO_GLYPH, &any, *menuselector, 0, ATR_NONE, +/*JP "Both of the above", MENU_UNSELECTED); +*/ + "両方", MENU_UNSELECTED); } end_menu(win, prompt); n = select_menu(win, PICK_ONE, &pick_list); diff -aurbN -xCVS -xXTAGS nethack/src/pline.c jnethack/src/pline.c --- nethack/src/pline.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/pline.c 2005-06-05 17:20:37.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #define NEED_VARARGS /* Uses ... */ /* comment line for pre-compiled headers */ #include "hack.h" #include "epri.h" @@ -116,7 +123,10 @@ char *tmp; VA_START(line); VA_INIT(line, const char *); +/*JP vpline(YouMessage(tmp, "You ", line), VA_ARGS); +*/ + vpline(YouMessage(tmp, "あなたは", line), VA_ARGS); VA_END(); } @@ -126,7 +136,10 @@ char *tmp; VA_START(line); VA_INIT(line, const char *); +/*JP vpline(YouMessage(tmp, "Your ", line), VA_ARGS); +*/ + vpline(YouMessage(tmp, "あなたの", line), VA_ARGS); VA_END(); } @@ -136,7 +149,10 @@ char *tmp; VA_START(line); VA_INIT(line, const char *); +/*JP vpline(YouMessage(tmp, "You feel ", line), VA_ARGS); +*/ + vpline(YouMessage(tmp, "あなたは", line), VA_ARGS); VA_END(); } @@ -147,7 +163,10 @@ char *tmp; VA_START(line); VA_INIT(line, const char *); +/*JP vpline(YouMessage(tmp, "You can't ", line), VA_ARGS); +*/ + vpline(YouMessage(tmp, "あなたは", line), VA_ARGS); VA_END(); } @@ -157,7 +176,10 @@ char *tmp; VA_START(line); VA_INIT(line, const char *); +/*JP vpline(YouMessage(tmp, "The ", line), VA_ARGS); +*/ + vpline(YouMessage(tmp, "", line), VA_ARGS); VA_END(); } @@ -167,7 +189,10 @@ char *tmp; VA_START(line); VA_INIT(line, const char *); +/*JP vpline(YouMessage(tmp, "There ", line), VA_ARGS); +*/ + vpline(YouMessage(tmp, "", line), VA_ARGS); VA_END(); } @@ -175,15 +200,46 @@ void You_hear VA_DECL(const char *,line) char *tmp; +#if 1 /*JP*/ + char *adj; + char *p; +#endif VA_START(line); VA_INIT(line, const char *); if (Underwater) +/*JP YouPrefix(tmp, "You barely hear ", line); +*/ + adj = "かすかに"; else if (u.usleep) +/*JP YouPrefix(tmp, "You dream that you hear ", line); +*/ + adj = "夢の中で"; else +/*JP YouPrefix(tmp, "You hear ", line); +*/ + adj = ""; +#if 0 /*JP*/ vpline(strcat(tmp, line), VA_ARGS); +#else + tmp = You_buf(strlen(adj) + strlen(line) + sizeof("あなたは ")); + + p = (char *)strstr(line, "聞こ") ; + if( p == NULL ) + Strcpy(tmp, "あなたは"); + else + Strcpy(tmp, ""); + if( p != NULL || (p = (char *)strstr(line, "聞い")) != NULL ){ + strncat(tmp, line, (p - line)); + strcat(tmp, adj); + strcat(tmp, p); + } else{ + Strcat(tmp, line); + } + vpline(tmp, VA_ARGS); +#endif VA_END(); } @@ -194,10 +250,17 @@ if (!flags.soundok) return; VA_START(line); VA_INIT(line, const char *); +#if 0 /*JP*/ tmp = You_buf((int)strlen(line) + sizeof "\"\""); Strcpy(tmp, "\""); Strcat(tmp, line); Strcat(tmp, "\""); +#else + tmp = You_buf((int)strlen(line) + sizeof "「」"); + Strcpy(tmp, "「"); + Strcat(tmp, line); + Strcat(tmp, "」"); +#endif vpline(tmp, VA_ARGS); VA_END(); } @@ -257,7 +320,11 @@ paniclog("impossible", pbuf); } vpline(s,VA_ARGS); +#if 0 /*JP*/ pline("Program in disorder - perhaps you'd better #quit."); +#else + pline("プログラムに障害発生 - #quitしたほうがよさそうだ."); +#endif program_state.in_impossible = 0; VA_END(); } @@ -267,12 +334,22 @@ aligntyp alignment; { switch ((int)alignment) { +#if 0 /*JP*/ case A_CHAOTIC: return "chaotic"; case A_NEUTRAL: return "neutral"; case A_LAWFUL: return "lawful"; case A_NONE: return "unaligned"; +#else + case A_CHAOTIC: return "混沌"; + case A_NEUTRAL: return "中立"; + case A_LAWFUL: return "秩序"; + case A_NONE: return "無心"; +#endif } +/*JP return "unknown"; +*/ + return "不明"; } void @@ -292,6 +369,7 @@ A_NEUTRAL; info[0] = 0; +#if 0 /*JP*/ if (mtmp->mtame) { Strcat(info, ", tame"); #ifdef WIZARD if (wizard) { @@ -303,13 +381,47 @@ } #endif } +#else + if (mtmp->mtame) { Strcat(info, ", 飼いならされている"); +#ifdef WIZARD + if (wizard) { + Sprintf(eos(info), " (%d", mtmp->mtame); + if (!mtmp->isminion) + Sprintf(eos(info), "; hungry %ld; apport %d", + EDOG(mtmp)->hungrytime, EDOG(mtmp)->apport); + Strcat(info, ")"); + } +#endif + } +#endif /*JP*/ +/*JP else if (mtmp->mpeaceful) Strcat(info, ", peaceful"); +*/ + else if (mtmp->mpeaceful) Strcat(info, ", 友好的"); +/*JP if (mtmp->meating) Strcat(info, ", eating"); +*/ + if (mtmp->meating) Strcat(info, ", 食事中"); +/*JP if (mtmp->mcan) Strcat(info, ", cancelled"); +*/ + if (mtmp->mcan) Strcat(info, ", 無力"); +/*JP if (mtmp->mconf) Strcat(info, ", confused"); +*/ + if (mtmp->mconf) Strcat(info, ", 混乱状態"); +#if 0 /*JP:T*/ if (mtmp->mblinded || !mtmp->mcansee) Strcat(info, ", blind"); +#else + if (mtmp->mblinded || !mtmp->mcansee) + Strcat(info, ", 盲目"); +#endif +/*JP if (mtmp->mstun) Strcat(info, ", stunned"); +*/ + if (mtmp->mstun) Strcat(info, ", くらくら状態"); +#if 0 /*JP*/ if (mtmp->msleeping) Strcat(info, ", asleep"); #if 0 /* unfortunately mfrozen covers temporary sleep and being busy (donning armor, for instance) as well as paralysis */ @@ -322,21 +434,65 @@ else if (mtmp->mstrategy & STRAT_WAITMASK) Strcat(info, ", meditating"); else if (mtmp->mflee) Strcat(info, ", scared"); +#else /*JP*/ + if (mtmp->msleeping) Strcat(info, ", 睡眠状態"); +#if 0 /* unfortunately mfrozen covers temporary sleep and being busy + (donning armor, for instance) as well as paralysis */ + else if (mtmp->mfrozen) Strcat(info, ", paralyzed"); +#else + else if (mtmp->mfrozen || !mtmp->mcanmove) + Strcat(info, ", 動けない"); +#endif + /* [arbitrary reason why it isn't moving] */ + else if (mtmp->mstrategy & STRAT_WAITMASK) + Strcat(info, ", 冥想中"); + else if (mtmp->mflee) Strcat(info, ", 怯えている"); +#endif +/*JP if (mtmp->mtrapped) Strcat(info, ", trapped"); +*/ + if (mtmp->mtrapped) Strcat(info, ", 罠にかかっている"); +#if 0 /*JP:T*/ if (mtmp->mspeed) Strcat(info, mtmp->mspeed == MFAST ? ", fast" : mtmp->mspeed == MSLOW ? ", slow" : ", ???? speed"); +#else + if (mtmp->mspeed) Strcat(info, + mtmp->mspeed == MFAST ? ", 素早い" : + mtmp->mspeed == MSLOW ? ", 遅い" : + ", 速度不明"); +#endif +/*JP if (mtmp->mundetected) Strcat(info, ", concealed"); +*/ + if (mtmp->mundetected) Strcat(info, ", 隠れている"); +/*JP if (mtmp->minvis) Strcat(info, ", invisible"); +*/ + if (mtmp->minvis) Strcat(info, ", 不可視"); +#if 0 /*JP:T*/ if (mtmp == u.ustuck) Strcat(info, (sticks(youmonst.data)) ? ", held by you" : u.uswallow ? (is_animal(u.ustuck->data) ? ", swallowed you" : ", engulfed you") : ", holding you"); +#else + if (mtmp == u.ustuck) Strcat(info, + (sticks(youmonst.data)) ? ", あなたが掴まえている" : + u.uswallow ? (is_animal(u.ustuck->data) ? + ", 飲み込んでいる" : + ", 巻き込んでいる") : + ", 掴まえている"); +#endif + #ifdef STEED +#if 0 /*JP*/ if (mtmp == u.usteed) Strcat(info, ", carrying you"); +#else + if (mtmp == u.usteed) Strcat(info, ", あなたを乗せている"); +#endif #endif /* avoid "Status of the invisible newt ..., invisible" */ @@ -344,7 +500,10 @@ Strcpy(monnambuf, x_monnam(mtmp, ARTICLE_THE, (char *)0, (SUPPRESS_IT|SUPPRESS_INVISIBLE), FALSE)); +/*JP pline("Status of %s (%s): Level %d HP %d(%d) AC %d%s.", +*/ + pline("%sの状態 (%s): Level %d HP %d(%d) AC %d%s", monnambuf, align_str(alignment), mtmp->m_lev, @@ -361,30 +520,67 @@ info[0] = '\0'; if (Sick) { +#if 0 /*JP*/ Strcat(info, ", dying from"); +#else + Strcat(info, ", "); +#endif if (u.usick_type & SICK_VOMITABLE) +/*JP Strcat(info, " food poisoning"); +*/ + Strcat(info, "食中毒"); if (u.usick_type & SICK_NONVOMITABLE) { if (u.usick_type & SICK_VOMITABLE) +/*JP Strcat(info, " and"); +*/ + Strcat(info, "と"); +/*JP Strcat(info, " illness"); +*/ + Strcat(info, "病気"); } +#if 1 /*JP*/ + Strcat(info, "で死につつある"); +#endif } +#if 0 /*JP*/ if (Stoned) Strcat(info, ", solidifying"); if (Slimed) Strcat(info, ", becoming slimy"); if (Strangled) Strcat(info, ", being strangled"); if (Vomiting) Strcat(info, ", nauseated"); /* !"nauseous" */ if (Confusion) Strcat(info, ", confused"); +#else + if (Stoned) Strcat(info, ", 石化しつつある"); + if (Slimed) Strcat(info, ", スライムになりつつある"); + if (Strangled) Strcat(info, ", 首を絞められている"); + if (Vomiting) Strcat(info, ", 吐き気がする"); + if (Confusion) Strcat(info, ", 混乱状態"); +#endif if (Blind) { +/*JP Strcat(info, ", blind"); +*/ + Strcat(info, ", 盲目状態"); if (u.ucreamed) { +#if 0 /*JP*/ if ((long)u.ucreamed < Blinded || Blindfolded || !haseyes(youmonst.data)) Strcat(info, ", cover"); Strcat(info, "ed by sticky goop"); +#else + Strcat(info, "ねばねばべとつくもので"); + if ((long)u.ucreamed < Blinded || Blindfolded + || !haseyes(youmonst.data)) + Strcat(info, "覆われている,"); +#endif } /* note: "goop" == "glop"; variation is intentional */ } +/*JP if (Stunned) Strcat(info, ", stunned"); +*/ + if (Stunned) Strcat(info, ", くらくら状態"); #ifdef STEED if (!u.usteed) #endif @@ -392,24 +588,51 @@ const char *what = body_part(LEG); if ((Wounded_legs & BOTH_SIDES) == BOTH_SIDES) what = makeplural(what); +/*JP Sprintf(eos(info), ", injured %s", what); +*/ + Sprintf(eos(info), ", %sにけがをしている", what); } +/*JP if (Glib) Sprintf(eos(info), ", slippery %s", +*/ + if (Glib) Sprintf(eos(info), ", %sがぬるぬる", makeplural(body_part(HAND))); +#if 0 /*JP*/ if (u.utrap) Strcat(info, ", trapped"); if (Fast) Strcat(info, Very_fast ? ", very fast" : ", fast"); if (u.uundetected) Strcat(info, ", concealed"); if (Invis) Strcat(info, ", invisible"); +#else + if (u.utrap) Strcat(info, ", 罠にかかっている"); + if (Fast) Strcat(info, Very_fast ? + ", とても素早い" : ", 素早い"); + if (u.uundetected) Strcat(info, ", 隠れている"); + if (Invis) Strcat(info, ", 不可視"); +#endif if (u.ustuck) { +#if 0 /*JP*/ if (sticks(youmonst.data)) Strcat(info, ", holding "); else Strcat(info, ", held by "); Strcat(info, mon_nam(u.ustuck)); +#else + Strcat(info, ", "); + Strcat(info, mon_nam(u.ustuck)); + if (sticks(youmonst.data)) + Strcat(info, "を掴まえている"); + else + Strcat(info, "に掴まえられている"); +#endif } +/*JP pline("Status of %s (%s%s): Level %d HP %d(%d) AC %d%s.", +*/ + pline("%sの状態 (%s %s): Level %d HP %d(%d) AC %d%s", +#if 0 /*JP*/ plname, (u.ualign.record >= 20) ? "piously " : (u.ualign.record > 13) ? "devoutly " : @@ -419,6 +642,17 @@ (u.ualign.record >= 1) ? "haltingly " : (u.ualign.record == 0) ? "nominally " : "insufficiently ", +#else + plname, + (u.ualign.record >= 20) ? "敬虔" : + (u.ualign.record > 13) ? "信心深い" : + (u.ualign.record > 8) ? "熱烈" : + (u.ualign.record > 3) ? "声のかん高い" : + (u.ualign.record == 3) ? "" : + (u.ualign.record >= 1) ? "有名無実" : + (u.ualign.record == 0) ? "迷惑" : + "不適当", +#endif align_str(u.ualign.type), Upolyd ? mons[u.umonnum].mlevel : u.ulevel, Upolyd ? u.mh : u.uhp, @@ -430,10 +664,17 @@ void self_invis_message() { +#if 0 /*JP*/ pline("%s %s.", Hallucination ? "Far out, man! You" : "Gee! All of a sudden, you", See_invisible ? "can see right through yourself" : "can't see yourself"); +#else + pline("%sあなたは%s.", + Hallucination ? "ワーオ!" : "げ!突然", + See_invisible ? "自分自身がちゃんと見えなくなった" : + "自分自身が見えなくなった"); +#endif } #endif /* OVLB */ diff -aurbN -xCVS -xXTAGS nethack/src/polyself.c jnethack/src/polyself.c --- nethack/src/polyself.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/polyself.c 2004-10-09 02:21:01.000000000 +0900 @@ -3,6 +3,13 @@ /* NetHack may be freely redistributed. See license for details. */ /* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + +/* * Polymorph self routine. * * Note: the light source handling code assumes that both youmonst.m_id @@ -69,9 +76,15 @@ (mvitals[urace.femalenum].mvflags & G_GENOD))) { /* intervening activity might have clobbered genocide info */ killer = delayed_killer; +/*JP if (!killer || !strstri(killer, "genocid")) { +*/ + if (!killer || !strstr(killer, "虐殺")) { killer_format = KILLED_BY; +/*JP killer = "self-genocide"; +*/ + killer = "自虐的虐殺で"; } done(GENOCIDED); } @@ -196,20 +209,36 @@ if (u.uhpmax <= 0) u.uhpmax = 1; } else { dead: /* we come directly here if their experience level went to 0 or less */ +/*JP Your("new form doesn't seem healthy enough to survive."); +*/ + Your("新しい姿は生きていくだけの力がないようだ."); killer_format = KILLED_BY_AN; +/*JP killer="unsuccessful polymorph"; +*/ + killer="変化の失敗で"; done(DIED); newuhs(FALSE); return; /* lifesaved */ } } newuhs(FALSE); +#if 0 /*JP*/ polyman("feel like a new %s!", (flags.female && urace.individual.f) ? urace.individual.f : (urace.individual.m) ? urace.individual.m : urace.noun); +#else + polyman("%sとして生まれかわったような気がした!", + jtrns_mon_gen( + (flags.female && urace.individual.f) ? urace.individual.f : + (urace.individual.m) ? urace.individual.m : urace.noun, flags.female)); +#endif if (Slimed) { +/*JP Your("body transforms, but there is still slime on you."); +*/ + Your("体は変化したが,スライムがついたままだ."); Slimed = 10L; } flags.botl = 1; @@ -235,7 +264,10 @@ if(!Polymorph_control && !forcecontrol && !draconian && !iswere && !isvamp) { if (rn2(20) > ACURR(A_CON)) { You(shudder_for_moment); +/*JP losehp(rnd(30), "system shock", KILLED_BY_AN); +*/ + losehp(rnd(30), "システムショックで", KILLED_BY_AN); exercise(A_CON, FALSE); return; } @@ -244,16 +276,33 @@ if (Polymorph_control || forcecontrol) { do { +/*JP getlin("Become what kind of monster? [type the name]", +*/ + getlin("どの種の怪物になる?[名前を入れてね]", buf); +#if 1 /*JP*/ + (void)mungspaces(buf); + { + const char *p; + p = etrns_mon(buf); + if(p) strcpy(buf, p); + } +#endif mntmp = name_to_mon(buf); if (mntmp < LOW_PM) +/*JP pline("I've never heard of such monsters."); +*/ + pline("そんな怪物は聞いたことがない."); /* Note: humans are illegal as monsters, but an * illegal monster forces newman(), which is what we * want if they specified a human.... */ else if (!polyok(&mons[mntmp]) && !your_race(&mons[mntmp])) +/*JP You("cannot polymorph into that."); +*/ + pline("それになることはできない."); else break; } while(++tries < 5); if (tries==5) pline(thats_enough_tries); @@ -268,7 +317,10 @@ mntmp = armor_to_dragon(uarm->otyp); if (!(mvitals[mntmp].mvflags & G_GENOD)) { /* allow G_EXTINCT */ +/*JP You("merge with your scaly armor."); +*/ + You("鱗の鎧と一体化した."); uskin = uarm; uarm = (struct obj *)0; /* save/restore hack */ @@ -308,7 +360,10 @@ newman(); else if(!polymon(mntmp)) return; +/*JP if (!uarmg) selftouch("No longer petrify-resistant, you"); +*/ + if (!uarmg) selftouch("石化への抵抗力がなくなって,あなたは"); made_change: new_light = Upolyd ? emits_light(youmonst.data) : 0; @@ -336,7 +391,12 @@ int mlvl; if (mvitals[mntmp].mvflags & G_GENOD) { /* allow G_EXTINCT */ +#if 0 /*JP:T*/ You_feel("rather %s-ish.",mons[mntmp].mname); +#else + You("%sっぽくなったような気がした.", + jtrns_mon(mons[mntmp].mname)); +#endif exercise(A_WIS, TRUE); return(0); } @@ -374,20 +434,41 @@ } if (dochange) { flags.female = !flags.female; +#if 0 /*JP*/ You("%s %s%s!", (u.umonnum != mntmp) ? "turn into a" : "feel like a new", (is_male(&mons[mntmp]) || is_female(&mons[mntmp])) ? "" : flags.female ? "female " : "male ", mons[mntmp].mname); +#else + You("%s%sになった%s!", + (is_male(&mons[mntmp]) || is_female(&mons[mntmp])) ? "" : + flags.female ? "女の" : "男の", + jtrns_mon_gen(mons[mntmp].mname, flags.female), + (u.umonnum != mntmp) ? "" : "ような気がした"); +#endif } else { if (u.umonnum != mntmp) +#if 0 /*JP*/ You("turn into %s!", an(mons[mntmp].mname)); +#else + You("%sになった!", + jtrns_mon_gen(mons[mntmp].mname, flags.female)); +#endif else +#if 0 /*JP*/ You_feel("like a new %s!", mons[mntmp].mname); +#else + You("別の%sになったような気がした!", + jtrns_mon_gen(mons[mntmp].mname, flags.female)); +#endif } if (Stoned && poly_when_stoned(&mons[mntmp])) { /* poly_when_stoned already checked stone golem genocide */ +/*JP You("turn to stone!"); +*/ + You("石になった!"); mntmp = PM_STONE_GOLEM; Stoned = 0; delayed_killer = 0; @@ -405,15 +486,24 @@ if (Stone_resistance && Stoned) { /* parnes@eniac.seas.upenn.edu */ Stoned = 0; delayed_killer = 0; +/*JP You("no longer seem to be petrifying."); +*/ + You("石化から解放されたようだ."); } if (Sick_resistance && Sick) { make_sick(0L, (char *) 0, FALSE, SICK_ALL); +/*JP You("no longer feel sick."); +*/ + You("病気から解放されたようだ."); } if (Slimed) { if (flaming(youmonst.data)) { +/*JP pline_The("slime burns away!"); +*/ + pline_The("スライムは燃えた!"); Slimed = 0L; flags.botl = 1; } else if (mntmp == PM_GREEN_SLIME) { @@ -485,9 +575,15 @@ !Stone_resistance && rnl(3)) { char buf[BUFSZ]; +#if 0 /*JP*/ pline("No longer petrifying-resistant, you touch %s.", mon_nam(u.usteed)); Sprintf(buf, "riding %s", an(u.usteed->data->mname)); +#else + pline("石化への耐性がないのに%sに触れてしまった.", + mon_nam(u.usteed)); + Sprintf(buf, "%sに乗って", a_monnam(u.usteed)); +#endif instapetrify(buf); } if (!can_ride(u.usteed)) dismount_steed(DISMOUNT_POLY); @@ -495,32 +591,71 @@ #endif if (flags.verbose) { +/*JP static const char use_thec[] = "Use the command #%s to %s."; +*/ + static const char use_thec[] = "#%sコマンドで%sことができる."; static const char monsterc[] = "monster"; if (can_breathe(youmonst.data)) +/*JP pline(use_thec,monsterc,"use your breath weapon"); +*/ + pline(use_thec,monsterc,"息を吐きかける"); if (attacktype(youmonst.data, AT_SPIT)) +/*JP pline(use_thec,monsterc,"spit venom"); +*/ + pline(use_thec,monsterc,"毒を吐く"); if (youmonst.data->mlet == S_NYMPH) +/*JP pline(use_thec,monsterc,"remove an iron ball"); +*/ + pline(use_thec,monsterc,"鉄球をはずす"); if (attacktype(youmonst.data, AT_GAZE)) +/*JP pline(use_thec,monsterc,"gaze at monsters"); +*/ + pline(use_thec,monsterc,"怪物を睨む"); if (is_hider(youmonst.data)) +/*JP pline(use_thec,monsterc,"hide"); +*/ + pline(use_thec,monsterc,"隠れる"); if (is_were(youmonst.data)) +/*JP pline(use_thec,monsterc,"summon help"); +*/ + pline(use_thec,monsterc,"仲間を召喚する"); if (webmaker(youmonst.data)) +/*JP pline(use_thec,monsterc,"spin a web"); +*/ + pline(use_thec,monsterc,"くもの巣を張る"); if (u.umonnum == PM_GREMLIN) +/*JP pline(use_thec,monsterc,"multiply in a fountain"); +*/ + pline(use_thec,monsterc,"泉の中で分裂する"); if (is_unicorn(youmonst.data)) +/*JP pline(use_thec,monsterc,"use your horn"); +*/ + pline(use_thec,monsterc,"角を使う"); if (is_mind_flayer(youmonst.data)) +/*JP pline(use_thec,monsterc,"emit a mental blast"); +*/ + pline(use_thec,monsterc,"精神波を発生させる"); if (youmonst.data->msound == MS_SHRIEK) /* worthless, actually */ +/*JP pline(use_thec,monsterc,"shriek"); +*/ + pline(use_thec,monsterc,"金切り声をあげる"); if (lays_eggs(youmonst.data) && flags.female) +/*JP pline(use_thec,"sit","lay an egg"); +*/ + pline(use_thec,"sit","卵を産む"); } /* you now know what an egg of your type looks like */ if (lays_eggs(youmonst.data)) { @@ -535,27 +670,44 @@ spoteffects(TRUE); if (Passes_walls && u.utrap && u.utraptype == TT_INFLOOR) { u.utrap = 0; +/*JP pline_The("rock seems to no longer trap you."); +*/ + pline("岩に閉じ込められることはないだろう."); } else if (likes_lava(youmonst.data) && u.utrap && u.utraptype == TT_LAVA) { u.utrap = 0; +/*JP pline_The("lava now feels soothing."); +*/ + pline("溶岩が精神を落ちつかせてくれる."); } if (amorphous(youmonst.data) || is_whirly(youmonst.data) || unsolid(youmonst.data)) { if (Punished) { +/*JP You("slip out of the iron chain."); +*/ + You("鉄の鎖からするりと抜けた."); unpunish(); } } if (u.utrap && (u.utraptype == TT_WEB || u.utraptype == TT_BEARTRAP) && (amorphous(youmonst.data) || is_whirly(youmonst.data) || unsolid(youmonst.data) || (youmonst.data->msize <= MZ_SMALL && u.utraptype == TT_BEARTRAP))) { +#if 0 /*JP*/ You("are no longer stuck in the %s.", u.utraptype == TT_WEB ? "web" : "bear trap"); +#else + You("%sから脱出した.", + u.utraptype == TT_WEB ? "くもの巣" : "熊の罠"); +#endif /* probably should burn webs too if PM_FIRE_ELEMENTAL */ u.utrap = 0; } if (webmaker(youmonst.data) && u.utrap && u.utraptype == TT_WEB) { +/*JP You("orient yourself on the web."); +*/ + You("くもの巣に適応した."); u.utrap = 0; } flags.botl = 1; @@ -575,47 +727,74 @@ if (breakarm(youmonst.data)) { if ((otmp = uarm) != 0) { if (donning(otmp)) cancel_don(); +/*JP You("break out of your armor!"); +*/ + You("鎧を壊した!"); exercise(A_STR, FALSE); (void) Armor_gone(); useup(otmp); } if ((otmp = uarmc) != 0) { if(otmp->oartifact) { +/*JP Your("%s falls off!", cloak_simple_name(otmp)); +*/ + Your("%sは脱げ落ちた!", cloak_simple_name(otmp)); (void) Cloak_off(); dropx(otmp); } else { +/*JP Your("%s tears apart!", cloak_simple_name(otmp)); +*/ + Your("%sはずたずたに引き裂かれた!", cloak_simple_name(otmp)); (void) Cloak_off(); useup(otmp); } } #ifdef TOURIST if (uarmu) { +/*JP Your("shirt rips to shreds!"); +*/ + Your("シャツは引き裂かれた!"); useup(uarmu); } #endif } else if (sliparm(youmonst.data)) { if (((otmp = uarm) != 0) && (racial_exception(&youmonst, otmp) < 1)) { if (donning(otmp)) cancel_don(); +/*JP Your("armor falls around you!"); +*/ + Your("鎧はあなたのまわりに落ちた!"); (void) Armor_gone(); dropx(otmp); } if ((otmp = uarmc) != 0) { if (is_whirly(youmonst.data)) +/*JP Your("%s falls, unsupported!", cloak_simple_name(otmp)); +*/ + Your("%sはすとんと落ちた!", cloak_simple_name(otmp)); +/*JP else You("shrink out of your %s!", cloak_simple_name(otmp)); +*/ + else You("%sから縮み出た!", cloak_simple_name(otmp)); (void) Cloak_off(); dropx(otmp); } #ifdef TOURIST if ((otmp = uarmu) != 0) { if (is_whirly(youmonst.data)) +/*JP You("seep right through your shirt!"); +*/ + You("シャツからしみ出た!"); +/*JP else You("become much too small for your shirt!"); +*/ + else You("シャツよりずっと小さくなった!"); setworn((struct obj *)0, otmp->owornmask & W_ARMU); dropx(otmp); } @@ -624,15 +803,23 @@ if (has_horns(youmonst.data)) { if ((otmp = uarmh) != 0) { if (is_flimsy(otmp) && !donning(otmp)) { +#if 0 /*JP*/ char hornbuf[BUFSZ], yourbuf[BUFSZ]; /* Future possiblities: This could damage/destroy helmet */ Sprintf(hornbuf, "horn%s", plur(num_horns(youmonst.data))); Your("%s %s through %s %s.", hornbuf, vtense(hornbuf, "pierce"), shk_your(yourbuf, otmp), xname(otmp)); +#else + char yourbuf[BUFSZ]; + Your("角が%s%sをつらぬいた.", shk_your(yourbuf, otmp), xname(otmp)); +#endif } else { if (donning(otmp)) cancel_don(); +/*JP Your("helmet falls to the %s!", surface(u.ux, u.uy)); +*/ + Your("兜は%sに落ちた!", surface(u.ux, u.uy)); (void) Helmet_off(); dropx(otmp); } @@ -642,19 +829,28 @@ if ((otmp = uarmg) != 0) { if (donning(otmp)) cancel_don(); /* Drop weapon along with gloves */ +/*JP You("drop your gloves%s!", uwep ? " and weapon" : ""); +*/ + You("小手%sを落した!", uwep ? "や武器" : ""); drop_weapon(0); (void) Gloves_off(); dropx(otmp); } if ((otmp = uarms) != 0) { +/*JP You("can no longer hold your shield!"); +*/ + You("もう盾を持ってられない!"); (void) Shield_off(); dropx(otmp); } if ((otmp = uarmh) != 0) { if (donning(otmp)) cancel_don(); +/*JP Your("helmet falls to the %s!", surface(u.ux, u.uy)); +*/ + Your("兜は%sに落ちた!", surface(u.ux, u.uy)); (void) Helmet_off(); dropx(otmp); } @@ -664,9 +860,17 @@ if ((otmp = uarmf) != 0) { if (donning(otmp)) cancel_don(); if (is_whirly(youmonst.data)) +/*JP Your("boots fall away!"); +*/ + Your("靴は脱げ落ちた!"); +#if 0 /*JP*/ else Your("boots %s off your feet!", verysmall(youmonst.data) ? "slide" : "are pushed"); +#else + else Your("靴はあなたの足から%s!", + verysmall(youmonst.data) ? "滑り落ちた" : "脱げ落ちた"); +#endif (void) Boots_off(); dropx(otmp); } @@ -688,8 +892,12 @@ if (!alone || cantwield(youmonst.data)) { struct obj *wep = uwep; +#if 0 /*JP*/ if (alone) You("find you must drop your weapon%s!", u.twoweap ? "s" : ""); +#else + if (alone) You("武器を落したことに気がついた!"); +#endif otmp2 = u.twoweap ? uswapwep : 0; uwepgone(); if (!wep->cursed || wep->otyp != LOADSTONE) @@ -711,24 +919,38 @@ { /* You can't revert back while unchanging */ if (Unchanging && (u.mh < 1)) { +#if 0 /*JP*/ killer_format = NO_KILLER_PREFIX; killer = "killed while stuck in creature form"; +#else + killer_format = KILLED_BY; + killer = "元の姿へ戻れずに"; +#endif done(DIED); } if (emits_light(youmonst.data)) del_light_source(LS_MONSTER, (genericptr_t)&youmonst); +/*JP polyman("return to %s form!", urace.adj); +*/ + polyman("%sに戻った!", urace.j); if (u.uhp < 1) { char kbuf[256]; +/*JP Sprintf(kbuf, "reverting to unhealthy %s form", urace.adj); +*/ + Sprintf(kbuf, "不健康な%sの姿に戻って", urace.j); killer_format = KILLED_BY; killer = kbuf; done(DIED); } +/*JP if (!uarmg) selftouch("No longer petrify-resistant, you"); +*/ + if (!uarmg) selftouch("石化への抵抗力がなくなって,あなたは"); nomul(0); flags.botl = 1; @@ -742,11 +964,17 @@ struct attack *mattk; if (Strangled) { +/*JP You_cant("breathe. Sorry."); +*/ + You_cant("息を吐くことができない.残念."); return(0); } if (u.uen < 15) { +/*JP You("don't have enough energy to breathe!"); +*/ + You("息を吐くのに十分なエネルギーがなかった."); return(0); } u.uen -= 15; @@ -780,7 +1008,10 @@ doremove() { if (!Punished) { +/*JP You("are not chained to anything!"); +*/ + You("何もつながれていない!"); return(0); } unpunish(); @@ -794,11 +1025,17 @@ if (Levitation || Is_airlevel(&u.uz) || Underwater || Is_waterlevel(&u.uz)) { +/*JP You("must be on the ground to spin a web."); +*/ + You("くもの巣を張るには地面の上にいなくてはならない."); return(0); } if (u.uswallow) { +/*JP You("release web fluid inside %s.", mon_nam(u.ustuck)); +*/ + You("%sの内でくもの巣を吐き出した.", mon_nam(u.ustuck)); if (is_animal(u.ustuck->data)) { expels(u.ustuck, u.ustuck->data, TRUE); return(0); @@ -817,55 +1054,93 @@ sweep[0] = '\0'; switch(u.ustuck->data->mattk[i].adtyp) { case AD_FIRE: +/*JP Strcpy(sweep, "ignites and "); +*/ + Strcpy(sweep, "発火し"); break; case AD_ELEC: +/*JP Strcpy(sweep, "fries and "); +*/ + Strcpy(sweep, "焦げ"); break; case AD_COLD: Strcpy(sweep, +/*JP "freezes, shatters and "); +*/ + "凍りつき,こなごなになり"); break; } +/*JP pline_The("web %sis swept away!", sweep); +*/ + pline("くもの巣は%sなくなった!", sweep); } return(0); } /* default: a nasty jelly-like creature */ +/*JP pline_The("web dissolves into %s.", mon_nam(u.ustuck)); +*/ + pline("くもの巣は分解して%sになった.", mon_nam(u.ustuck)); return(0); } if (u.utrap) { +/*JP You("cannot spin webs while stuck in a trap."); +*/ + You("罠にはまっている間はくもの巣を張れない."); return(0); } exercise(A_DEX, TRUE); if (ttmp) switch (ttmp->ttyp) { case PIT: +/*JP case SPIKED_PIT: You("spin a web, covering up the pit."); +*/ + case SPIKED_PIT: You("くもの巣を張り,落し穴を覆った."); deltrap(ttmp); bury_objs(u.ux, u.uy); newsym(u.ux, u.uy); return(1); +/*JP case SQKY_BOARD: pline_The("squeaky board is muffled."); +*/ + case SQKY_BOARD: pline("きしむ板は覆われた."); deltrap(ttmp); newsym(u.ux, u.uy); return(1); case TELEP_TRAP: case LEVEL_TELEP: case MAGIC_PORTAL: +/*JP Your("webbing vanishes!"); +*/ + Your("くもの巣は消えた!"); return(0); +/*JP case WEB: You("make the web thicker."); +*/ + case WEB: You("くもの巣をより厚くした."); return(1); case HOLE: case TRAPDOOR: +#if 0 /*JP*/ You("web over the %s.", (ttmp->ttyp == TRAPDOOR) ? "trap door" : "hole"); +#else + You("%sをくもの巣で覆った.", + (ttmp->ttyp == TRAPDOOR) ? "落し扉" : "穴"); +#endif deltrap(ttmp); newsym(u.ux, u.uy); return 1; case ROLLING_BOULDER_TRAP: +/*JP You("spin a web, jamming the trigger."); +*/ + You("くもの巣を張って,スイッチを動かなくした."); deltrap(ttmp); newsym(u.ux, u.uy); return(1); @@ -880,7 +1155,10 @@ case MAGIC_TRAP: case ANTI_MAGIC: case POLY_TRAP: +/*JP You("have triggered a trap!"); +*/ + You("罠を始動させてしまった!"); dotrap(ttmp, 0); return(1); default: @@ -889,8 +1167,13 @@ } else if (On_stairs(u.ux, u.uy)) { /* cop out: don't let them hide the stairs */ +#if 0 /*JP:T*/ Your("web fails to impede access to the %s.", (levl[u.ux][u.uy].typ == STAIRS) ? "stairs" : "ladder"); +#else + Your("くもの巣は%sへの移動を邪魔できない.", + (levl[u.ux][u.uy].typ == STAIRS) ? "階段" : "はしご"); +#endif return(1); } @@ -908,16 +1191,25 @@ { int placeholder; if (u.uen < 10) { +/*JP You("lack the energy to send forth a call for help!"); +*/ + You("助けを呼ぶだけの体力がない!"); return(0); } u.uen -= 10; flags.botl = 1; +/*JP You("call upon your brethren for help!"); +*/ + You("仲間を呼んだ!"); exercise(A_WIS, TRUE); if (!were_summon(youmonst.data, TRUE, &placeholder, (char *)0)) +/*JP pline("But none arrive."); +*/ + pline("しかし,何も来ない."); return(1); } @@ -943,11 +1235,17 @@ if (Blind) { +/*JP You_cant("see anything to gaze at."); +*/ + You("目が見えないので,にらめない."); return 0; } if (u.uen < 15) { +/*JP You("lack the energy to use your special gaze!"); +*/ + You("にらむだけの体力がない!"); return(0); } u.uen -= 15; @@ -958,22 +1256,37 @@ if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my)) { looked++; if (Invis && !perceives(mtmp->data)) +/*JP pline("%s seems not to notice your gaze.", Monnam(mtmp)); +*/ + pline("%sはあなたのにらみに気がついてないようだ.", Monnam(mtmp)); else if (mtmp->minvis && !See_invisible) +/*JP You_cant("see where to gaze at %s.", Monnam(mtmp)); +*/ + You("%sは見えないので,にらめない", Monnam(mtmp)); else if (mtmp->m_ap_type == M_AP_FURNITURE || mtmp->m_ap_type == M_AP_OBJECT) { looked--; continue; } else if (flags.safe_dog && !Confusion && !Hallucination && mtmp->mtame) { +/*JP You("avoid gazing at %s.", y_monnam(mtmp)); +*/ + You("%sから目をそらしてしまった.", y_monnam(mtmp)); } else { if (flags.confirm && mtmp->mpeaceful && !Confusion && !Hallucination) { +#if 0 /*JP*/ Sprintf(qbuf, "Really %s %s?", (adtyp == AD_CONF) ? "confuse" : "attack", mon_nam(mtmp)); +#else + Sprintf(qbuf, "本当に%sを%s?", + mon_nam(mtmp), + (adtyp == AD_CONF) ? "混乱させる" : "攻撃する"); +#endif if (yn(qbuf) != 'y') continue; setmangry(mtmp); } @@ -987,16 +1300,30 @@ */ if (adtyp == AD_CONF) { if (!mtmp->mconf) +/*JP Your("gaze confuses %s!", mon_nam(mtmp)); +*/ + Your("にらみは%sを混乱させた!", mon_nam(mtmp)); else +/*JP pline("%s is getting more and more confused.", +*/ + pline("%sはますます混乱した!", Monnam(mtmp)); mtmp->mconf = 1; } else if (adtyp == AD_FIRE) { int dmg = d(2,6); +#if 0 /*JP*/ You("attack %s with a fiery gaze!", mon_nam(mtmp)); +#else + You("炎のにらみで%sを攻撃した!", mon_nam(mtmp)); +#endif if (resists_fire(mtmp)) { +#if 0 /*JP*/ pline_The("fire doesn't burn %s!", mon_nam(mtmp)); +#else + pline("%sは炎で燃えなかった!", mon_nam(mtmp)); +#endif dmg = 0; } if((int) u.ulevel > rn2(20)) @@ -1014,7 +1341,10 @@ if (!DEADMONSTER(mtmp) && (mtmp->data==&mons[PM_FLOATING_EYE]) && !mtmp->mcan) { if (!Free_action) { +/*JP You("are frozen by %s gaze!", +*/ + You("%sのにらみで動けなくなった!", s_suffix(mon_nam(mtmp))); nomul((u.ulevel > 6 || rn2(4)) ? -d((int)mtmp->m_lev+1, @@ -1022,7 +1352,10 @@ : -200); return 1; } else +/*JP You("stiffen momentarily under %s gaze.", +*/ + You("%sのにらみで一瞬硬直した.", s_suffix(mon_nam(mtmp))); } /* Technically this one shouldn't affect you at all because @@ -1033,18 +1366,30 @@ if (!DEADMONSTER(mtmp) && (mtmp->data == &mons[PM_MEDUSA]) && !mtmp->mcan) { pline( +/*JP "Gazing at the awake %s is not a very good idea.", +*/ + "目を覚ましている%sをにらむのは賢いことじゃない.", l_monnam(mtmp)); /* as if gazing at a sleeping anything is fruitful... */ +/*JP You("turn to stone..."); +*/ + You("石になった..."); killer_format = KILLED_BY; +/*JP killer = "deliberately meeting Medusa's gaze"; +*/ + killer = "わざわざメデューサのにらみをまともに見て"; done(STONING); } } } } +/*JP if (!looked) You("gaze at no place in particular."); +*/ + if (!looked) You("実際には何もにらめなかった."); return 1; } @@ -1054,7 +1399,10 @@ boolean ismimic = youmonst.data->mlet == S_MIMIC; if (u.uundetected || (ismimic && youmonst.m_ap_type != M_AP_NOTHING)) { +/*JP You("are already hiding."); +*/ + You("もう隠れている."); return(0); } if (ismimic) { @@ -1073,14 +1421,23 @@ struct monst *mtmp, *nmon; if (u.uen < 10) { +/*JP You("concentrate but lack the energy to maintain doing so."); +*/ + You("集中した.しかしエネルギーが足りない."); return(0); } u.uen -= 10; flags.botl = 1; +/*JP You("concentrate."); +*/ + You("集中した."); +/*JP pline("A wave of psychic energy pours out."); +*/ + pline("精神エネルギー波が放散した."); for(mtmp=fmon; mtmp; mtmp = nmon) { int u_sen; @@ -1093,10 +1450,17 @@ continue; u_sen = telepathic(mtmp->data) && !mtmp->mcansee; if (u_sen || (telepathic(mtmp->data) && rn2(2)) || !rn2(10)) { +#if 0 /*JP*/ You("lock in on %s %s.", s_suffix(mon_nam(mtmp)), u_sen ? "telepathy" : telepathic(mtmp->data) ? "latent telepathy" : "mind"); +#else + pline("%sの%sり込んだ.", mon_nam(mtmp), + u_sen ? "精神に入" : + telepathic(mtmp->data) ? "潜在的精神に入" : + "深層意識に潜"); +#endif mtmp->mhp -= rnd(15); if (mtmp->mhp <= 0) killed(mtmp); @@ -1108,7 +1472,10 @@ STATIC_OVL void uunstick() { +/*JP pline("%s is no longer in your clutches.", Monnam(u.ustuck)); +*/ + pline("%sはあなたの手から逃れた.", Monnam(u.ustuck)); u.ustuck = 0; } @@ -1117,7 +1484,10 @@ boolean silently; { if (uskin) { +/*JP if (!silently) Your("skin returns to its original form."); +*/ + Your("皮膚は本来の姿に戻った."); uarm = uskin; uskin = (struct obj *)0; /* undo save/restore hack */ @@ -1134,50 +1504,125 @@ int part; { static NEARDATA const char +#if 0 /*JP*/ *humanoid_parts[] = { "arm", "eye", "face", "finger", "fingertip", "foot", "hand", "handed", "head", "leg", "light headed", "neck", "spine", "toe", "hair", "blood", "lung", "nose", "stomach"}, +#else + *humanoid_parts[] = { "腕", "目", "顔", "指", + "指先", "足", "手", "手にする", "頭", "足", + "めまいがした", "首", "背骨", "爪先", "髪", + "血", "肺", "鼻", "胃"}, +#endif +#if 0 /*JP*/ *jelly_parts[] = { "pseudopod", "dark spot", "front", "pseudopod extension", "pseudopod extremity", "pseudopod root", "grasp", "grasped", "cerebral area", "lower pseudopod", "viscous", "middle", "surface", "pseudopod extremity", "ripples", "juices", "surface", "sensor", "stomach" }, +#else + *jelly_parts[] = { "擬似触手", "黒い斑点", "前面", + "擬似触手の先", "擬似触手", + "擬似触手の幹", "触手", "握る", "脳の領域", + "下方の擬似触手", "ねばねばしてきた", "中間領域", "表面", + "擬似触手", "波紋", "体液", + "表面", "感覚器", "胃"}, +#endif +#if 0 /*JP*/ *animal_parts[] = { "forelimb", "eye", "face", "foreclaw", "claw tip", "rear claw", "foreclaw", "clawed", "head", "rear limb", "light headed", "neck", "spine", "rear claw tip", "fur", "blood", "lung", "nose", "stomach" }, +#else + *animal_parts[] = { "前足", "目", "顔", "前爪", "爪先", + "後爪", "前爪", "ひっかける", "頭", "後足", + "めまいがした", "首", "背骨", "後爪先", + "毛皮", "血", "肺", "鼻", "胃"}, +#endif +#if 0 /*JP*/ *bird_parts[] = { "wing", "eye", "face", "wing", "wing tip", "foot", "wing", "winged", "head", "leg", "light headed", "neck", "spine", "toe", "feathers", "blood", "lung", "bill", "stomach" }, +#else + *bird_parts[] = { "翼", "目", "顔", "翼", "翼の先", + "足", "翼", "翼にとる", "頭", "足", + "めまいがした", "首", "背骨", "爪先", + "羽毛", "血", "肺", "くちばし", "胃" }, +#endif +#if 0 /*JP*/ *horse_parts[] = { "foreleg", "eye", "face", "forehoof", "hoof tip", "rear hoof", "foreclaw", "hooved", "head", "rear leg", "light headed", "neck", "backbone", "rear hoof tip", "mane", "blood", "lung", "nose", "stomach"}, +#else + *horse_parts[] = { "前足", "目", "顔", "前蹄", "蹄", + "後蹄", "前爪", "蹄にはさむ", "頭", "後足", + "めまいがした", "首", "背骨", "後爪先", + "たてがみ", "血", "肺", "鼻", "胃"}, +#endif +#if 0 /*JP*/ *sphere_parts[] = { "appendage", "optic nerve", "body", "tentacle", "tentacle tip", "lower appendage", "tentacle", "tentacled", "body", "lower tentacle", "rotational", "equator", "body", "lower tentacle tip", "cilia", "life force", "retina", "olfactory nerve", "interior" }, +#else + *sphere_parts[] = { "突起", "視覚神経", "体", "触手", + "触手の先", "下の突起", "触手", "触手に持つ", + "体", "下の触手", "回転した", "中心線", "体", + "下の触手の先", "繊毛", "生命力", "網膜", + "嗅覚中枢", "内部" }, +#endif +#if 0 /*JP*/ *fungus_parts[] = { "mycelium", "visual area", "front", "hypha", "hypha", "root", "strand", "stranded", "cap area", "rhizome", "sporulated", "stalk", "root", "rhizome tip", "spores", "juices", "gill", "gill", "interior" }, +#else + *fungus_parts[] = { "菌糸体", "視覚領域", "前", "菌糸", + "菌糸", "根", "触手", "触手にからみつける", "傘", + "根茎", "混乱する", "軸", "根", "根茎の先", + "芽胞", "体液", "えら", "えら", "内部"}, +#endif +#if 0 /*JP*/ *vortex_parts[] = { "region", "eye", "front", "minor current", "minor current", "lower current", "swirl", "swirled", "central core", "lower current", "addled", "center", "currents", "edge", "currents", "life force", "center", "leading edge", "interior" }, +#else + *vortex_parts[] = { "領域", "目", "前", "小さい流れ", + "小さい流れ", "下部の流れ", "渦巻", "渦に巻く", + "渦の中心", "下部の流れ", "混乱した", "中心部", + "流れ", "外周", "気流", "生命力", + "中心", "前縁", "内部"}, +#endif +#if 0 /*JP*/ *snake_parts[] = { "vestigial limb", "eye", "face", "large scale", "large scale tip", "rear region", "scale gap", "scale gapped", "head", "rear region", "light headed", "neck", "length", "rear scale", "scales", "blood", "lung", "forked tongue", "stomach" }, +#else + *snake_parts[] = { "退化した足", "目", "顔", "大きな鱗", + "大きな鱗の先", "後部分", "鱗の隙間", "鱗の隙間につける", + "頭", "後部分", "めまいがした", "首", "体", + "後部分の鎧", "鱗", "血", "肺", "舌", "胃"}, +#endif +#if 0 /*JP*/ *fish_parts[] = { "fin", "eye", "premaxillary", "pelvic axillary", "pelvic fin", "anal fin", "pectoral fin", "finned", "head", "peduncle", "played out", "gills", "dorsal fin", "caudal fin", "scales", "blood", "gill", "nostril", "stomach" }; +#else + *fish_parts[] = { "ひれ", "目", "顔", "ひれの先", + "ひれの先", "尾びれ", "胸ひれ", "ひれで持つ", "頭", "尾びれ", + "めまいがした", "えら", "背びれ", "尾びれ", + "鱗", "血", "えら", "鼻", "胃" }; +#endif /*JP*/ +#if 0 /*JP*/ /* claw attacks are overloaded in mons[]; most humanoids with such attacks should still reference hands rather than claws */ static const char not_claws[] = { @@ -1186,8 +1631,14 @@ S_ORC, S_GIANT, /* quest nemeses */ '\0' /* string terminator; assert( S_xxx != 0 ); */ }; +#endif struct permonst *mptr = mon->data; +#if 0 /*JP*/ +/* pawは犬とか猫の手,clawはタカの足のようなかぎつめ, + どっちらも日本語じゃ「手」でいいでしょう. + trunkは象の鼻を意味するそうです。日本語では単に鼻でいいかと。 +*/ if (part == HAND || part == HANDED) { /* some special cases */ if (mptr->mlet == S_DOG || mptr->mlet == S_FELINE || mptr->mlet == S_YETI) @@ -1201,13 +1652,26 @@ if ((mptr == &mons[PM_MUMAK] || mptr == &mons[PM_MASTODON]) && part == NOSE) return "trunk"; +#endif if (mptr == &mons[PM_SHARK] && part == HAIR) +#if 0 /*JP*/ return "skin"; /* sharks don't have scales */ +#else + return "頭"; /* sharks don't have scales */ +#endif if (mptr == &mons[PM_JELLYFISH] && (part == ARM || part == FINGER || part == HAND || part == FOOT || part == TOE)) +#if 0 /*JP*/ return "tentacle"; +#else + return "触手"; +#endif if (mptr == &mons[PM_FLOATING_EYE] && part == EYE) +#if 0 /*JP*/ return "cornea"; +#else + return "角膜"; +#endif if (humanoid(mptr) && (part == ARM || part == FINGER || part == FINGERTIP || part == HAND || part == HANDED)) @@ -1218,10 +1682,17 @@ (mptr == &mons[PM_ROTHE] && part != HAIR)) return horse_parts[part]; if (mptr->mlet == S_LIGHT) { +#if 0 /*JP*/ if (part == HANDED) return "rayed"; else if (part == ARM || part == FINGER || part == FINGERTIP || part == HAND) return "ray"; else return "beam"; +#else + if (part == HANDED || part == ARM || part == FINGER || + part == FINGERTIP || part == HAND) { + return "光"; + } +#endif } if (mptr->mlet == S_EEL && mptr != &mons[PM_JELLYFISH]) return fish_parts[part]; @@ -1287,7 +1758,10 @@ u.mh += heal; if (u.mh > u.mhmax) u.mh = u.mhmax; flags.botl = 1; +/*JP pline("Strangely, you feel better than before."); +*/ + pline("奇妙なことに,前より気分がよくなった."); exercise(A_STR, TRUE); } } diff -aurbN -xCVS -xXTAGS nethack/src/potion.c jnethack/src/potion.c --- nethack/src/potion.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/potion.c 2005-06-05 07:13:19.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #ifdef OVLB @@ -62,8 +69,13 @@ if (!xtime && old) { if (talk) +#if 0 /*JP*/ You_feel("less %s now.", Hallucination ? "trippy" : "confused"); +#else + You("%sがおさまった.", + Hallucination ? "ヘロヘロ" : "混乱"); +#endif } if ((xtime && !old) || (!xtime && old)) flags.botl = TRUE; @@ -79,17 +91,28 @@ if (!xtime && old) { if (talk) +#if 0 /*JP*/ You_feel("%s now.", Hallucination ? "less wobbly" : "a bit steadier"); +#else + You_feel("%s.", + Hallucination ? "へろりらがおさまった" : "だんだんしっかりしてきた"); +#endif } if (xtime && !old) { if (talk) { #ifdef STEED if (u.usteed) +/*JP You("wobble in the saddle."); +*/ + You("鞍の上でぐらぐらした."); else #endif +/*JP You("%s...", stagger(youmonst.data, "stagger")); +*/ + You("%s...", stagger(youmonst.data, "くらくらした")); } } if ((!xtime && old) || (xtime && !old)) flags.botl = TRUE; @@ -110,11 +133,19 @@ if (Sick_resistance) return; if (!old) { /* newly sick */ +/*JP You_feel("deathly sick."); +*/ + You("病気で死にそうだ."); } else { /* already sick */ +#if 0 /*JP*/ if (talk) You_feel("%s worse.", xtime <= Sick/2L ? "much" : "even"); +#else + if (talk) You("%s悪化したような気がする.", + xtime <= Sick/2L ? "さらに" : "もっと"); +#endif } set_itimeout(&Sick, xtime); u.usick_type |= type; @@ -123,10 +154,16 @@ /* was sick, now not */ u.usick_type &= ~type; if (u.usick_type) { /* only partly cured */ +/*JP if (talk) You_feel("somewhat better."); +*/ + if (talk) You("ちょっとよくなった."); set_itimeout(&Sick, Sick * 2); /* approximation */ } else { +/*JP if (talk) pline("What a relief!"); +*/ + if (talk) pline("ああ助かった!"); Sick = 0L; /* set_itimeout(&Sick, 0L) */ } flags.botl = TRUE; @@ -152,13 +189,22 @@ long old = Vomiting; if(!xtime && old) +/*JP if(talk) You_feel("much less nauseated now."); +*/ + if(talk) You("吐き気がおさまった."); set_itimeout(&Vomiting, xtime); } +/*JP static const char vismsg[] = "vision seems to %s for a moment but is %s now."; +*/ +static const char vismsg[] = "視界は一瞬%sなったがまた%sなった."; +/*JP static const char eyemsg[] = "%s momentarily %s."; +*/ +static const char eyemsg[] = "%sは一瞬%s."; void make_blinded(xtime, talk) @@ -167,8 +213,10 @@ { long old = Blinded; boolean u_could_see, can_see_now; +#if 0 /*JP*/ int eyecnt; char buf[BUFSZ]; +#endif /* we need to probe ahead in case the Eyes of the Overworld are or will be overriding blindness */ @@ -182,9 +230,15 @@ if (can_see_now && !u_could_see) { /* regaining sight */ if (talk) { if (Hallucination) +/*JP pline("Far out! Everything is all cosmic again!"); +*/ + pline("げ!なにもかもがまた虹色に見える!"); else +/*JP You("can see again."); +*/ + You("また見えるようになった."); } } else if (old && !xtime) { /* clearing temporary blindness without toggling blindness */ @@ -192,13 +246,22 @@ if (!haseyes(youmonst.data)) { strange_feeling((struct obj *)0, (char *)0); } else if (Blindfolded) { +#if 0 /*JP*/ Strcpy(buf, body_part(EYE)); eyecnt = eyecount(youmonst.data); Your(eyemsg, (eyecnt == 1) ? buf : makeplural(buf), (eyecnt == 1) ? "itches" : "itch"); +#else + Your(eyemsg, body_part(EYE), "かゆくなった"); +#endif } else { /* Eyes of the Overworld */ +#if 0 /*JP*/ Your(vismsg, "brighten", Hallucination ? "sadder" : "normal"); +#else + Your(vismsg, "明るく", + Hallucination ? "根暗に" : "普通に"); +#endif } } } @@ -206,9 +269,15 @@ if (u_could_see && !can_see_now) { /* losing sight */ if (talk) { if (Hallucination) +/*JP pline("Oh, bummer! Everything is dark! Help!"); +*/ + pline("暗いよー,狭いよー,恐いよー!"); else +/*JP pline("A cloud of darkness falls upon you."); +*/ + pline("暗黒の雲があなたを覆った."); } /* Before the hero goes blind, set the ball&chain variables. */ if (Punished) set_bc(0); @@ -218,13 +287,22 @@ if (!haseyes(youmonst.data)) { strange_feeling((struct obj *)0, (char *)0); } else if (Blindfolded) { +#if 0 /*JP*/ Strcpy(buf, body_part(EYE)); eyecnt = eyecount(youmonst.data); Your(eyemsg, (eyecnt == 1) ? buf : makeplural(buf), (eyecnt == 1) ? "twitches" : "twitch"); +#else + Your(eyemsg, body_part(EYE), "ピクピクした"); +#endif } else { /* Eyes of the Overworld */ +#if 0 /*JP*/ Your(vismsg, "dim", Hallucination ? "happier" : "normal"); +#else + Your(vismsg, "薄暗く", + Hallucination ? "ハッピーに" : "普通に"); +#endif } } } @@ -248,9 +326,17 @@ boolean changed = 0; const char *message, *verb; +#if 0 /*JP*/ message = (!xtime) ? "Everything %s SO boring now." : "Oh wow! Everything %s so cosmic!"; +#else + message = (!xtime) ? "何もかもが*退屈*に%sる." : + "ワーオ!何もかも虹色に%sる!"; +#endif +/*JP verb = (!Blind) ? "looks" : "feels"; +*/ + verb = (!Blind) ? "見え" : "感じ"; if (mask) { if (HHallucination) changed = TRUE; @@ -267,14 +353,21 @@ if (!haseyes(youmonst.data)) { strange_feeling((struct obj *)0, (char *)0); } else if (Blind) { +#if 0 /*JP*/ char buf[BUFSZ]; int eyecnt = eyecount(youmonst.data); Strcpy(buf, body_part(EYE)); Your(eyemsg, (eyecnt == 1) ? buf : makeplural(buf), (eyecnt == 1) ? "itches" : "itch"); +#else + Your(eyemsg, body_part(EYE), "かゆくなった"); +#endif } else { /* Grayswandir */ +/*JP Your(vismsg, "flatten", "normal"); +*/ + Your(vismsg, "おかしく", "普通に"); } } } @@ -305,19 +398,37 @@ struct monst *mtmp = makemon(&mons[PM_GHOST], u.ux, u.uy, NO_MM_FLAGS); if (!mtmp) { +/*JP pline("This bottle turns out to be empty."); +*/ + pline("瓶は空っぽだった."); return; } if (Blind) { +/*JP pline("As you open the bottle, %s emerges.", something); +*/ + pline("瓶を開けると,何かが出てきた."); return; } +/*JP pline("As you open the bottle, an enormous %s emerges!", +*/ + pline("瓶を開けると,巨大な%sが出てきた!", +/*JP Hallucination ? rndmonnam() : (const char *)"ghost"); +*/ + Hallucination ? rndmonnam() : (const char *)"幽霊"); if(flags.verbose) +/*JP You("are frightened to death, and unable to move."); +*/ + You("まっさおになって驚き,動けなくなった."); nomul(-3); +/*JP nomovemsg = "You regain your composure."; +*/ + nomovemsg = "あなたは平静を取り戻した."; } /* "Quaffing is like drinking, except you spill more." -- Terry Pratchett @@ -329,12 +440,18 @@ const char *potion_descr; if (Strangled) { +/*JP pline("If you can't breathe air, how can you drink liquid?"); +*/ + pline("息もできないのに,どうやって液体を飲むんだい?"); return 0; } /* Is there a fountain to drink from here? */ if (IS_FOUNTAIN(levl[u.ux][u.uy].typ) && !Levitation) { +/*JP if(yn("Drink from the fountain?") == 'y') { +*/ + if(yn("泉の水を飲みますか?") == 'y') { drinkfountain(); return 1; } @@ -342,7 +459,10 @@ #ifdef SINKS /* Or a kitchen sink? */ if (IS_SINK(levl[u.ux][u.uy].typ)) { +/*JP if (yn("Drink from the sink?") == 'y') { +*/ + if (yn("流し台の水を飲みますか?") == 'y') { drinksink(); return 1; } @@ -351,8 +471,14 @@ /* Or are you surrounded by water? */ if (Underwater) { +/*JP if (yn("Drink the water around you?") == 'y') { +*/ + if (yn("まわりの水を飲みますか?") == 'y') { +/*JP pline("Do you know what lives in this water!"); +*/ + pline("この水中で何が生きているのか知ってるかい!"); return 1; } } @@ -394,8 +520,13 @@ if(nothing) { unkn++; +#if 0 /*JP*/ You("have a %s feeling for a moment, then it passes.", Hallucination ? "normal" : "peculiar"); +#else + You("%s気分におそわれたが,すぐに消えさった.", + Hallucination ? "普通の" : "独特な"); +#endif } if(otmp->dknown && !objects[otmp->otyp].oc_name_known) { if(!unkn) { @@ -419,13 +550,23 @@ case SPE_RESTORE_ABILITY: unkn++; if(otmp->cursed) { +/*JP pline("Ulch! This makes you feel mediocre!"); +*/ + pline("うーん,どうもさえないなあ."); break; } else { +#if 0 /*JP*/ pline("Wow! This makes you feel %s!", (otmp->blessed) ? (unfixable_trouble_count(FALSE) ? "better" : "great") : "good"); +#else + pline("ワーオ!気分が%sなった!", + (otmp->blessed) ? + (unfixable_trouble_count(FALSE) ? "だいぶよく" : "とてもよく") + : "よく"); +#endif i = rn2(A_MAX); /* start at a random point */ for (ii = 0; ii < A_MAX; ii++) { lim = AMAX(i); @@ -448,7 +589,10 @@ break; case POT_WATER: if(!otmp->blessed && !otmp->cursed) { +/*JP pline("This tastes like water."); +*/ + pline("水のような味がする."); u.uhunger += rnd(10); newuhs(FALSE); break; @@ -457,25 +601,40 @@ if(is_undead(youmonst.data) || is_demon(youmonst.data) || u.ualign.type == A_CHAOTIC) { if(otmp->blessed) { +/*JP pline("This burns like acid!"); +*/ + pline("酸のように舌がひりひりする!"); exercise(A_CON, FALSE); if (u.ulycn >= LOW_PM) { +/*JP Your("affinity to %s disappears!", +*/ + Your("%sへの親近感はなくなった!", makeplural(mons[u.ulycn].mname)); if (youmonst.data == &mons[u.ulycn]) you_unwere(FALSE); u.ulycn = NON_PM; /* cure lycanthropy */ } +/*JP losehp(d(2,6), "potion of holy water", KILLED_BY_AN); +*/ + losehp(d(2,6), "聖水で", KILLED_BY_AN); } else if(otmp->cursed) { +/*JP You_feel("quite proud of yourself."); +*/ + You("自尊心を感じた."); healup(d(2,6),0,0,0); if (u.ulycn >= LOW_PM && !Upolyd) you_were(); exercise(A_CON, TRUE); } } else { if(otmp->blessed) { +/*JP You_feel("full of awe."); +*/ + You("畏怖の念にかられた."); make_sick(0L, (char *) 0, TRUE, SICK_ALL); exercise(A_WIS, TRUE); exercise(A_CON, TRUE); @@ -484,11 +643,22 @@ /* make_confused(0L,TRUE); */ } else { if(u.ualign.type == A_LAWFUL) { +/*JP pline("This burns like acid!"); +*/ + pline("酸のように舌がひりひりする!"); +#if 0 /*JP*/ losehp(d(2,6), "potion of unholy water", KILLED_BY_AN); +#else + losehp(d(2,6), "不浄水で", + KILLED_BY_AN); +#endif } else +/*JP You_feel("full of dread."); +*/ + You("恐怖の念にかられた."); if (u.ulycn >= LOW_PM && !Upolyd) you_were(); exercise(A_CON, FALSE); } @@ -496,9 +666,15 @@ break; case POT_BOOZE: unkn++; +#if 0 /*JP*/ pline("Ooph! This tastes like %s%s!", otmp->odiluted ? "watered down " : "", Hallucination ? "dandelion wine" : "liquid fire"); +#else + pline("うぇっぷ!これは%s%sのような味がする!", + otmp->odiluted ? "水で薄めた" : "", + Hallucination ? "タンポポワイン" : "燃料オイル"); +#endif if (!otmp->blessed) make_confused(itimeout_incr(HConfusion, d(3,8)), FALSE); /* the whiskey makes us feel better */ @@ -507,32 +683,50 @@ newuhs(FALSE); exercise(A_WIS, FALSE); if(otmp->cursed) { +/*JP You("pass out."); +*/ + You("気絶した."); multi = -rnd(15); +/*JP nomovemsg = "You awake with a headache."; +*/ + nomovemsg = "目がさめたが頭痛がする."; } break; case POT_ENLIGHTENMENT: if(otmp->cursed) { unkn++; +/*JP You("have an uneasy feeling..."); +*/ + You("不安な気持になった..."); exercise(A_WIS, FALSE); } else { if (otmp->blessed) { (void) adjattrib(A_INT, 1, FALSE); (void) adjattrib(A_WIS, 1, FALSE); } +/*JP You_feel("self-knowledgeable..."); +*/ + You("自分自身が判るような気がした..."); display_nhwindow(WIN_MESSAGE, FALSE); enlightenment(0); +/*JP pline_The("feeling subsides."); +*/ + pline("その感じはなくなった."); exercise(A_WIS, TRUE); } break; case SPE_INVISIBILITY: /* spell cannot penetrate mummy wrapping */ if (BInvis && uarmc->otyp == MUMMY_WRAPPING) { +/*JP You_feel("rather itchy under your %s.", xname(uarmc)); +*/ + You("%sの下がムズムズした.", xname(uarmc)); break; } /* FALLTHRU */ @@ -546,7 +740,10 @@ else incr_itimeout(&HInvis, rn1(15,31)); newsym(u.ux,u.uy); /* update position */ if(otmp->cursed) { +/*JP pline("For some reason, you feel your presence is known."); +*/ + pline("なぜか,存在が知られているような気がした."); aggravate(); } break; @@ -558,14 +755,26 @@ unkn++; if (otmp->cursed) +#if 0 /*JP*/ pline("Yecch! This tastes %s.", Hallucination ? "overripe" : "rotten"); +#else + pline("オェー!これは%sジュースの味がする.", + Hallucination ? "熟しすぎた" : "腐った"); +#endif else +#if 0 /*JP*/ pline(Hallucination ? "This tastes like 10%% real %s%s all-natural beverage." : "This tastes like %s%s.", otmp->odiluted ? "reconstituted " : "", fruitname(TRUE)); +#else + pline(Hallucination ? + "10%%%sの純自然飲料のような味がする." : + "%s%sジュースのような味がする.", + otmp->odiluted ? "成分調整された" : "", pl_fruit); +#endif if (otmp->otyp == POT_FRUIT_JUICE) { u.uhunger += (otmp->odiluted ? 5 : 10) * (2 + bcsign(otmp)); newuhs(FALSE); @@ -585,24 +794,40 @@ see_monsters(); /* see invisible monsters */ newsym(u.ux,u.uy); /* see yourself! */ if (msg && !Blind) { /* Blind possible if polymorphed */ +/*JP You("can see through yourself, but you are visible!"); +*/ + You("透明である.しかし見えるようになった!"); unkn--; } break; } case POT_PARALYSIS: if (Free_action) +/*JP You("stiffen momentarily."); +*/ + You("一瞬動けなくなった."); else { if (Levitation || Is_airlevel(&u.uz)||Is_waterlevel(&u.uz)) +/*JP You("are motionlessly suspended."); +*/ + You("空中で動けなくなった."); #ifdef STEED else if (u.usteed) +/*JP You("are frozen in place!"); +*/ + You("その場で動けなくなった!"); #endif else +#if 0 /*JP*/ Your("%s are frozen to the %s!", makeplural(body_part(FOOT)), surface(u.ux, u.uy)); +#else + You("動けなくなった!"); +#endif nomul(-(rn1(10, 25 - 12*bcsign(otmp)))); nomovemsg = You_can_move_again; exercise(A_DEX, FALSE); @@ -610,9 +835,15 @@ break; case POT_SLEEPING: if(Sleep_resistance || Free_action) +/*JP You("yawn."); +*/ + You("あくびをした."); else { +/*JP You("suddenly fall asleep!"); +*/ + pline("突然眠ってしまった!"); fall_asleep(-rn1(10, 25 - 12*bcsign(otmp)), TRUE); } break; @@ -639,7 +870,10 @@ } } see_monsters(); +/*JP if (unkn) You_feel("lonely."); +*/ + if (unkn) You("心細くなった."); break; } if (monster_detect(otmp, 0)) @@ -653,21 +887,41 @@ exercise(A_WIS, TRUE); break; case POT_SICKNESS: +/*JP pline("Yecch! This stuff tastes like poison."); +*/ + pline("ウェー!毒のような味がする."); if (otmp->blessed) { +#if 0 /*JP*/ pline("(But in fact it was mildly stale %s.)", fruitname(TRUE)); +#else + pline("(しかし実際それは少し古くなった%s.)", + fruitname(TRUE)); +#endif if (!Role_if(PM_HEALER)) { /* NB: blessed otmp->fromsink is not possible */ +/*JP losehp(1, "mildly contaminated potion", KILLED_BY_AN); +*/ + losehp(1, "病気に汚染された薬で", KILLED_BY_AN); } } else { if(Poison_resistance) +#if 0 /*JP*/ pline( "(But in fact it was biologically contaminated %s.)", fruitname(TRUE)); +#else + pline( + "(しかし実際それは生物学的に汚染された%sだ.)", + fruitname(TRUE)); +#endif if (Role_if(PM_HEALER)) +/*JP pline("Fortunately, you have been immunized."); +*/ + pline("幸運なことに,あなたは免疫がある."); else { int typ = rn2(A_MAX); @@ -680,26 +934,41 @@ if(!Poison_resistance) { if (otmp->fromsink) losehp(rnd(10)+5*!!(otmp->cursed), +/*JP "contaminated tap water", KILLED_BY); +*/ + "疫病に汚染された水で", KILLED_BY_AN); else losehp(rnd(10)+5*!!(otmp->cursed), +/*JP "contaminated potion", KILLED_BY_AN); +*/ + "疫病に汚染された薬で", KILLED_BY_AN); } exercise(A_CON, FALSE); } } if(Hallucination) { +/*JP You("are shocked back to your senses!"); +*/ + You("五感に衝撃を受けた!"); (void) make_hallucinated(0L,FALSE,0L); } break; case POT_CONFUSION: if(!Confusion) if (Hallucination) { +/*JP pline("What a trippy feeling!"); +*/ + pline("なんかヘロヘロする!"); unkn++; } else +/*JP pline("Huh, What? Where am I?"); +*/ + pline("ほえ?私は誰?"); else nothing++; make_confused(itimeout_incr(HConfusion, rn1(7, 16 - 8 * bcsign(otmp))), @@ -707,7 +976,10 @@ break; case POT_GAIN_ABILITY: if(otmp->cursed) { +/*JP pline("Ulch! That potion tasted foul!"); +*/ + pline("ウェ!悪臭がする!"); unkn++; } else if (Fixed_abil) { nothing++; @@ -736,10 +1008,18 @@ } /* and fall through */ case SPE_HASTE_SELF: if(!Very_fast) /* wwf@doe.carleton.ca */ +#if 0 /*JP*/ You("are suddenly moving %sfaster.", Fast ? "" : "much "); +#else + You("突然%s速く移動できるようになった.", + Fast ? "" : "とても"); +#endif else { +/*JP Your("%s get new energy.", +*/ + pline("%sにエネルギーが注ぎこまれるような感じがした.", makeplural(body_part(LEG))); unkn++; } @@ -758,7 +1038,10 @@ /* they went up a level */ if((ledger_no(&u.uz) == 1 && u.uhave.amulet) || Can_rise_up(u.ux, u.uy, &u.uz)) { +/*JP const char *riseup ="rise up, through the %s!"; +*/ + const char *riseup ="%sを突き抜けた!"; if(ledger_no(&u.uz) == 1) { You(riseup, ceiling(u.ux,u.uy)); goto_level(&earth_level, FALSE, FALSE, FALSE); @@ -768,13 +1051,19 @@ get_level(&newlevel, newlev); if(on_level(&newlevel, &u.uz)) { +/*JP pline("It tasted bad."); +*/ + pline("とてもまずい."); break; } else You(riseup, ceiling(u.ux,u.uy)); goto_level(&newlevel, FALSE, FALSE, FALSE); } } +/*JP else You("have an uneasy feeling."); +*/ + else You("不安な気持になった."); break; } pluslvl(FALSE); @@ -785,13 +1074,19 @@ u.uexp = rndexp(TRUE); break; case POT_HEALING: +/*JP You_feel("better."); +*/ + You("気分がよくなった."); healup(d(6 + 2 * bcsign(otmp), 4), !otmp->cursed ? 1 : 0, !!otmp->blessed, !otmp->cursed); exercise(A_CON, TRUE); break; case POT_EXTRA_HEALING: +/*JP You_feel("much better."); +*/ + You("気分がとてもよくなった."); healup(d(6 + 2 * bcsign(otmp), 8), otmp->blessed ? 5 : !otmp->cursed ? 2 : 0, !otmp->cursed, TRUE); @@ -800,7 +1095,10 @@ exercise(A_STR, TRUE); break; case POT_FULL_HEALING: +/*JP You_feel("completely healed."); +*/ + You("完全に回復した."); healup(400, 4+4*bcsign(otmp), !otmp->cursed, TRUE); /* Restore one lost level if blessed */ if (otmp->blessed && u.ulevel < u.ulevelmax) { @@ -827,12 +1125,24 @@ && (u.ux != sstairs.sx || u.uy != sstairs.sy || !sstairs.up) && (!xupladder || u.ux != xupladder || u.uy != yupladder) ) { +#if 0 /*JP*/ You("hit your %s on the %s.", body_part(HEAD), ceiling(u.ux,u.uy)); +#else + You("%sを%sにぶつけた.", + body_part(HEAD), + ceiling(u.ux,u.uy)); +#endif +#if 0 /*JP*/ losehp(uarmh ? 1 : rnd(10), "colliding with the ceiling", KILLED_BY); +#else + losehp(uarmh ? 1 : rnd(10), + "天井に頭をぶつけて", + KILLED_BY); +#endif } else (void) doup(); } } else @@ -846,9 +1156,15 @@ case POT_GAIN_ENERGY: /* M. Stephenson */ { register int num; if(otmp->cursed) +/*JP You_feel("lackluster."); +*/ + You("意気消沈した."); else +/*JP pline("Magical energies course through your body."); +*/ + pline("魔法のエネルギーがあなたの体に満ちた."); num = rnd(5) + 5 * otmp->blessed + 1; u.uenmax += (otmp->cursed) ? -num : num; u.uen += (otmp->cursed) ? -num : num; @@ -864,36 +1180,64 @@ if (otmp->lamplit) { if (likes_fire(youmonst.data)) { +/*JP pline("Ahh, a refreshing drink."); +*/ + pline("わーお,生き返る."); good_for_you = TRUE; } else { +/*JP You("burn your %s.", body_part(FACE)); +*/ + Your("%sは黒焦げになった.", body_part(FACE)); losehp(d(Fire_resistance ? 1 : 3, 4), +/*JP "burning potion of oil", KILLED_BY_AN); +*/ + "燃えている油を飲んで", KILLED_BY_AN); } } else if(otmp->cursed) +/*JP pline("This tastes like castor oil."); +*/ + pline("ひまし油のような味がする."); else +/*JP pline("That was smooth!"); +*/ + pline("口あたりがよい!"); exercise(A_WIS, good_for_you); } break; case POT_ACID: if (Acid_resistance) /* Not necessarily a creature who _likes_ acid */ +/*JP pline("This tastes %s.", Hallucination ? "tangy" : "sour"); +*/ + pline("%s味がする.", Hallucination ? "ぴりっとした" : "酸の"); else { +#if 0 /*JP*/ pline("This burns%s!", otmp->blessed ? " a little" : otmp->cursed ? " a lot" : " like acid"); losehp(d(otmp->cursed ? 2 : 1, otmp->blessed ? 4 : 8), "potion of acid", KILLED_BY_AN); +#else + pline("%s焦げた!", otmp->blessed ? "少し" : + otmp->cursed ? "すごく" : ""); + losehp(d(otmp->cursed ? 2 : 1, otmp->blessed ? 4 : 8), + "酸の薬を飲んで", KILLED_BY_AN); +#endif exercise(A_CON, FALSE); } if (Stoned) fix_petrification(); unkn++; /* holy/unholy water can burn like acid too */ break; case POT_POLYMORPH: +/*JP You_feel("a little %s.", Hallucination ? "normal" : "strange"); +*/ + You("少し%sな感じがした.", Hallucination ? "普通" : "変"); if (!Unchanging) polyself(FALSE); break; default: @@ -903,6 +1247,24 @@ return(-1); } +#ifdef JPEXTENSION +void +make_totter(xtime, talk) +long xtime; /* nonzero if this is an attempt to turn on hallucination */ +boolean talk; +{ + const char *message = 0; + + if (!xtime) + message = "方向感覚が正常になった."; + else + message = "方向感覚が麻痺した."; + + set_itimeout(&Totter, xtime); + pline(message); +} +#endif + void healup(nhp, nxtra, curesick, cureblind) int nhp, nxtra; @@ -929,8 +1291,13 @@ register const char *txt; { if (flags.beginner || !txt) +#if 0 /*JP*/ You("have a %s feeling for a moment, then it passes.", Hallucination ? "normal" : "strange"); +#else + You("%s気分におそわれたが,すぐに消えさった.", + Hallucination ? "普通の" : "奇妙な"); +#endif else pline(txt); @@ -944,7 +1311,11 @@ } const char *bottlenames[] = { +#if 0 /*JP*/ "bottle", "phial", "flagon", "carafe", "flask", "jar", "vial" +#else + "瓶","瑠璃瓶","一升瓶","水差し","フラスコ","壷","ガラス瓶" +#endif }; @@ -966,24 +1337,42 @@ if(isyou) { distance = 0; +/*JP pline_The("%s crashes on your %s and breaks into shards.", +*/ + pline("%sがあなたの%sの上で壊れ破片となった.", botlnam, body_part(HEAD)); +/*JP losehp(rnd(2), "thrown potion", KILLED_BY_AN); +*/ + losehp(rnd(2), "投げられた薬で", KILLED_BY_AN); } else { distance = distu(mon->mx,mon->my); +/*JP if (!cansee(mon->mx,mon->my)) pline("Crash!"); +*/ + if (!cansee(mon->mx,mon->my)) pline("ガシャン!"); else { char *mnam = mon_nam(mon); char buf[BUFSZ]; if(has_head(mon->data)) { +/*JP Sprintf(buf, "%s %s", +*/ + Sprintf(buf, "%sの%s", s_suffix(mnam), +/*JP (notonhead ? "body" : "head")); +*/ + (notonhead ? "体" : "頭")); } else { Strcpy(buf, mnam); } +/*JP pline_The("%s crashes on %s and breaks into shards.", +*/ + pline("%sが%sの上で壊れ破片となった.", botlnam, buf); } if(rn2(5) && mon->mhp > 1) @@ -992,7 +1381,10 @@ /* oil doesn't instantly evaporate */ if (obj->otyp != POT_OIL && cansee(mon->mx,mon->my)) +/*JP pline("%s.", Tobjnam(obj, "evaporate")); +*/ + pline("%sは蒸発した.", xname(obj)); if (isyou) { switch (obj->otyp) { @@ -1001,15 +1393,28 @@ splatter_burning_oil(u.ux, u.uy); break; case POT_POLYMORPH: +/*JP You_feel("a little %s.", Hallucination ? "normal" : "strange"); +*/ + You("%sな感じがした.", Hallucination ? "普通" : "変"); if (!Unchanging && !Antimagic) polyself(FALSE); break; case POT_ACID: if (!Acid_resistance) { +#if 0 /*JP*/ pline("This burns%s!", obj->blessed ? " a little" : obj->cursed ? " a lot" : ""); +#else + pline("%s燃えた!", obj->blessed ? "少し" : + obj->cursed ? "はげしく" : ""); +#endif +#if 0 /*JP*/ losehp(d(obj->cursed ? 2 : 1, obj->blessed ? 4 : 8), "potion of acid", KILLED_BY_AN); +#else + losehp(d(obj->cursed ? 2 : 1, obj->blessed ? 4 : 8), + "酸の薬を浴びて", KILLED_BY_AN); +#endif } break; } @@ -1030,7 +1435,10 @@ if(mon->mhp < mon->mhpmax) { mon->mhp = mon->mhpmax; if (canseemon(mon)) +/*JP pline("%s looks sound and hale again.", Monnam(mon)); +*/ + pline("%sは元気になったように見える.", Monnam(mon)); } break; case POT_SICKNESS: @@ -1039,7 +1447,11 @@ dmgtype(mon->data, AD_PEST) || /* won't happen, see prior goto */ resists_poison(mon)) { if (canseemon(mon)) +#if 0 /*JP*/ pline("%s looks unharmed.", Monnam(mon)); +#else + pline("%sはなんともないようだ.", Monnam(mon)); +#endif break; } do_illness: @@ -1049,7 +1461,10 @@ mon->mhp /= 2; if (mon->mhp > mon->mhpmax) mon->mhp = mon->mhpmax; if (canseemon(mon)) +/*JP pline("%s looks rather ill.", Monnam(mon)); +*/ + pline("%sは病気っぽく見える.", Monnam(mon)); break; case POT_CONFUSION: case POT_BOOZE: @@ -1062,7 +1477,10 @@ case POT_SLEEPING: /* wakeup() doesn't rouse victims of temporary sleep */ if (sleep_monst(mon, rnd(12), POTION_CLASS)) { +/*JP pline("%s falls asleep.", Monnam(mon)); +*/ + pline("%sは眠ってしまった.", Monnam(mon)); slept_monst(mon); } break; @@ -1092,8 +1510,13 @@ if (is_undead(mon->data) || is_demon(mon->data) || is_were(mon->data)) { if (obj->blessed) { +#if 0 /*JP*/ pline("%s %s in pain!", Monnam(mon), is_silent(mon->data) ? "writhes" : "shrieks"); +#else + pline("%sは苦痛%s!", Monnam(mon), + is_silent(mon->data) ? "に身もだえした" : "の叫び声をあげた"); +#endif mon->mhp -= d(2,6); /* should only be by you */ if (mon->mhp < 1) killed(mon); @@ -1102,7 +1525,10 @@ } else if (obj->cursed) { angermon = FALSE; if (canseemon(mon)) +/*JP pline("%s looks healthier.", Monnam(mon)); +*/ + pline("%sはより元気になったように見える.", Monnam(mon)); mon->mhp += d(2,6); if (mon->mhp > mon->mhpmax) mon->mhp = mon->mhpmax; if (is_were(mon->data) && is_human(mon->data) && @@ -1114,7 +1540,11 @@ (void)split_mon(mon, (struct monst *)0); } else if(mon->data == &mons[PM_IRON_GOLEM]) { if (canseemon(mon)) +#if 0 /*JP*/ pline("%s rusts.", Monnam(mon)); +#else + pline("%sは錆びた.", Monnam(mon)); +#endif mon->mhp -= d(1,6); /* should only be by you */ if (mon->mhp < 1) killed(mon); @@ -1126,8 +1556,13 @@ break; case POT_ACID: if (!resists_acid(mon) && !resist(mon, POTION_CLASS, 0, NOTELL)) { +#if 0 /*JP*/ pline("%s %s in pain!", Monnam(mon), is_silent(mon->data) ? "writhes" : "shrieks"); +#else + pline("%sは苦痛%s!", Monnam(mon), + is_silent(mon->data) ? "に身もだえした" : "の叫び声をあげた"); +#endif mon->mhp -= d(obj->cursed ? 2 : 1, obj->blessed ? 4 : 8); if (mon->mhp < 1) { if (your_fault) @@ -1189,12 +1624,19 @@ case POT_GAIN_ABILITY: if(obj->cursed) { if (!breathless(youmonst.data)) +/*JP pline("Ulch! That potion smells terrible!"); +*/ + pline("ウゲェ!薬はものすごい匂いがする!"); else if (haseyes(youmonst.data)) { +#if 0 /*JP*/ int numeyes = eyecount(youmonst.data); Your("%s sting%s!", (numeyes == 1) ? body_part(EYE) : makeplural(body_part(EYE)), (numeyes == 1) ? "s" : ""); +#else + Your("%sがずきずきする!", body_part(EYE)); +#endif } break; } else { @@ -1235,49 +1677,79 @@ } break; case POT_HALLUCINATION: +/*JP You("have a momentary vision."); +*/ + You("一瞬幻影につつまれた."); break; case POT_CONFUSION: case POT_BOOZE: if(!Confusion) +/*JP You_feel("somewhat dizzy."); +*/ + You("めまいを感じた."); make_confused(itimeout_incr(HConfusion, rnd(5)), FALSE); break; case POT_INVISIBILITY: if (!Blind && !Invis) { kn++; +#if 0 /*JP*/ pline("For an instant you %s!", See_invisible ? "could see right through yourself" : "couldn't see yourself"); +#else + pline("一瞬自分自身が%s見えなくなった!", + See_invisible ? "正しく" + : ""); +#endif } break; case POT_PARALYSIS: kn++; if (!Free_action) { +/*JP pline("%s seems to be holding you.", Something); +*/ + pline("%sがあなたをつかまえているような気がした.", Something); nomul(-rnd(5)); nomovemsg = You_can_move_again; exercise(A_DEX, FALSE); +/*JP } else You("stiffen momentarily."); +*/ + } else You("一瞬硬直した."); break; case POT_SLEEPING: kn++; if (!Free_action && !Sleep_resistance) { +/*JP You_feel("rather tired."); +*/ + You("すこし疲れた."); nomul(-rnd(5)); nomovemsg = You_can_move_again; exercise(A_DEX, FALSE); +/*JP } else You("yawn."); +*/ + } else You("あくびをした."); break; case POT_SPEED: +/*JP if (!Fast) Your("knees seem more flexible now."); +*/ + if (!Fast) Your("膝はよりすばやく動くようになった."); incr_itimeout(&HFast, rnd(5)); exercise(A_DEX, TRUE); break; case POT_BLINDNESS: if (!Blind && !u.usleep) { kn++; +/*JP pline("It suddenly gets dark."); +*/ + pline("突然暗くなった."); } make_blinded(itimeout_incr(Blinded, rnd(5)), FALSE); if (!Blind && !u.usleep) Your(vision_clears); @@ -1436,17 +1908,34 @@ if (obj->otyp == POT_WATER) return FALSE; /* KMH -- Water into acid causes an explosion */ if (obj->otyp == POT_ACID) { +/*JP pline("It boils vigorously!"); +*/ + pline("激しく沸騰した!"); +/*JP You("are caught in the explosion!"); +*/ + You("爆発に巻き込まれた!"); +/*JP losehp(rnd(10), "elementary chemistry", KILLED_BY); +*/ + losehp(rnd(10), "初等化学実験で", KILLED_BY); makeknown(obj->otyp); update_inventory(); return (TRUE); } +#if 0 /*JP*/ pline("%s %s%s.", Your_buf, aobjnam(obj,"dilute"), obj->odiluted ? " further" : ""); +#else + pline("%s%sは%s薄まった.", Your_buf, xname(obj), + obj->odiluted ? "さらに" : ""); +#endif if(obj->unpaid && costly_spot(u.ux, u.uy)) { +/*JP You("dilute it, you pay for it."); +*/ + You("薄めてしまった,賠償せねばならない."); bill_dummy_object(obj); } if (obj->odiluted) { @@ -1468,12 +1957,19 @@ #endif ) { if (!Blind) { +#if 0 /*JP*/ boolean oq1 = obj->quan == 1L; pline_The("scroll%s %s.", oq1 ? "" : "s", otense(obj, "fade")); +#else + pline("巻物の文字は薄れた."); +#endif } if(obj->unpaid && costly_spot(u.ux, u.uy)) { +/*JP You("erase it, you pay for it."); +*/ + You("文字を消してしまった,賠償せねばならない."); bill_dummy_object(obj); } obj->otyp = SCR_BLANK_PAPER; @@ -1485,16 +1981,26 @@ if (obj->otyp != SPE_BLANK_PAPER) { if (obj->otyp == SPE_BOOK_OF_THE_DEAD) { +/*JP pline("%s suddenly heats up; steam rises and it remains dry.", +*/ + pline("%sは突然熱くなり,蒸気がたちこめ,乾いてしまった.", The(xname(obj))); } else { if (!Blind) { +#if 0 /*JP*/ boolean oq1 = obj->quan == 1L; pline_The("spellbook%s %s.", oq1 ? "" : "s", otense(obj, "fade")); +#else + pline("魔法書の文字は薄れた."); +#endif } if(obj->unpaid && costly_spot(u.ux, u.uy)) { +/*JP You("erase it, you pay for it."); +*/ + You("文字を消してしまった,賠償せねばならない."); bill_dummy_object(obj); } obj->otyp = SPE_BLANK_PAPER; @@ -1509,15 +2015,23 @@ default: if (!obj->oerodeproof && is_rustprone(obj) && (obj->oeroded < MAX_ERODE) && !rn2(2)) { +#if 0 /*JP*/ pline("%s %s some%s.", Your_buf, aobjnam(obj, "rust"), obj->oeroded ? " more" : "what"); +#else + pline("%s%sは%s錆びた.", Your_buf, xname(obj), + obj->oeroded ? "さらに" : ""); +#endif obj->oeroded++; update_inventory(); return TRUE; } else break; } +/*JP pline("%s %s wet.", Your_buf, aobjnam(obj,"get")); +*/ + pline("%s%sは濡れた.", Your_buf, xname(obj)); return FALSE; } @@ -1539,13 +2053,19 @@ here = levl[u.ux][u.uy].typ; /* Is there a fountain to dip into here? */ if (IS_FOUNTAIN(here)) { +/*JP if(yn("Dip it into the fountain?") == 'y') { +*/ + if(yn("泉に浸しますか?") == 'y') { dipfountain(obj); return(1); } } else if (is_pool(u.ux,u.uy)) { tmp = waterbody_name(u.ux,u.uy); +/*JP Sprintf(qbuf, "Dip it into the %s?", tmp); +*/ + Sprintf(qbuf, "%sに浸しますか?", tmp); if (yn(qbuf) == 'y') { if (Levitation) { floating_above(tmp); @@ -1565,7 +2085,10 @@ if(!(potion = getobj(beverages, "dip into"))) return(0); if (potion == obj && potion->quan == 1L) { +/*JP pline("That is a potion bottle, not a Klein bottle!"); +*/ + pline("これは薬瓶だ!クラインの壷じゃない!"); return 0; } potion->in_use = TRUE; /* assume it will be used up */ @@ -1575,10 +2098,17 @@ if (potion->blessed) { if (obj->cursed) { if (useeit) +#if 0 /*JP*/ pline("%s %s %s.", Your_buf, aobjnam(obj, "softly glow"), hcolor(NH_AMBER)); +#else + pline("%s%sはうっすらと%s輝いた.", + Your_buf, + xname(obj), + jconj_adj(hcolor(NH_AMBER))); +#endif uncurse(obj); obj->bknown=1; poof: @@ -1590,10 +2120,15 @@ } else if(!obj->blessed) { if (useeit) { tmp = hcolor(NH_LIGHT_BLUE); +#if 0 /*JP*/ pline("%s %s with a%s %s aura.", Your_buf, aobjnam(obj, "softly glow"), index(vowels, *tmp) ? "n" : "", tmp); +#else + pline("%s%sはぼんやりとした%sオーラにつつまれた.", + Your_buf, xname(obj), tmp); +#endif } bless(obj); obj->bknown=1; @@ -1602,20 +2137,31 @@ } else if (potion->cursed) { if (obj->blessed) { if (useeit) +#if 0 /*JP*/ pline("%s %s %s.", Your_buf, aobjnam(obj, "glow"), hcolor((const char *)"brown")); +#else + pline("%s%sは%s輝いた.", + Your_buf, xname(obj), + jconj_adj(hcolor((const char *)"茶色の"))); +#endif unbless(obj); obj->bknown=1; goto poof; } else if(!obj->cursed) { if (useeit) { tmp = hcolor(NH_BLACK); +#if 0 /*JP*/ pline("%s %s with a%s %s aura.", Your_buf, aobjnam(obj, "glow"), index(vowels, *tmp) ? "n" : "", tmp); +#else + pline("%s%sは%sオーラにつつまれた.", + Your_buf, xname(obj),tmp); +#endif } curse(obj); obj->bknown=1; @@ -1656,7 +2202,10 @@ prinv((char *)0, obj, 0L); return 1; } else { +/*JP pline("Nothing seems to happen."); +*/ + pline("何も起こらなかったようだ."); goto poof; } } @@ -1664,16 +2213,25 @@ return(1); } else if(obj->oclass == POTION_CLASS && obj->otyp != potion->otyp) { /* Mixing potions is dangerous... */ +/*JP pline_The("potions mix..."); +*/ + pline("薬は調合された..."); /* KMH, balance patch -- acid is particularly unstable */ if (obj->cursed || obj->otyp == POT_ACID || !rn2(10)) { +/*JP pline("BOOM! They explode!"); +*/ + pline("バーン!爆発した!"); exercise(A_STR, FALSE); if (!breathless(youmonst.data) || haseyes(youmonst.data)) potionbreathe(obj); useup(obj); useup(potion); +/*JP losehp(rnd(10), "alchemic blast", KILLED_BY_AN); +*/ + losehp(rnd(10), "調合の失敗で", KILLED_BY_AN); return(1); } @@ -1701,7 +2259,10 @@ break; default: if (!Blind) +/*JP pline_The("mixture glows brightly and evaporates."); +*/ + pline("混ぜると薬は明るく輝き,蒸発した."); useup(obj); useup(potion); return(1); @@ -1711,17 +2272,28 @@ obj->odiluted = (obj->otyp != POT_WATER); if (obj->otyp == POT_WATER && !Hallucination) { +#if 0 /*JP*/ pline_The("mixture bubbles%s.", Blind ? "" : ", then clears"); +#else + pline("薬を混ぜると%s泡だった.", + Blind ? "" : "しばらく"); +#endif } else if (!Blind) { +#if 0 /*JP*/ pline_The("mixture looks %s.", hcolor(OBJ_DESCR(objects[obj->otyp]))); +#else + pline("混ぜた薬は%s薬に見える.", + jtrns_obj('!',OBJ_DESCR(objects[obj->otyp]))); +#endif } useup(potion); return(1); } +/*JP これは NH3.4では#defineされていない */ #ifdef INVISIBLE_OBJECTS if (potion->otyp == POT_INVISIBILITY && !obj->oinvis) { obj->oinvis = TRUE; @@ -1748,10 +2320,16 @@ if(potion->otyp == POT_SICKNESS && !obj->opoisoned) { char buf[BUFSZ]; if (potion->quan > 1L) +/*JP Sprintf(buf, "One of %s", the(xname(potion))); +*/ + Sprintf(buf, "%sの一つ", the(xname(potion))); else Strcpy(buf, The(xname(potion))); +/*JP pline("%s forms a coating on %s.", +*/ + pline("%sが%sに塗られた.", buf, the(xname(obj))); obj->opoisoned = TRUE; goto poof; @@ -1759,7 +2337,10 @@ (potion->otyp == POT_HEALING || potion->otyp == POT_EXTRA_HEALING || potion->otyp == POT_FULL_HEALING)) { +/*JP pline("A coating wears off %s.", the(xname(obj))); +*/ + pline("毒が%sから剥げおちた.", the(xname(obj))); obj->opoisoned = 0; goto poof; } @@ -1774,14 +2355,24 @@ /* catch_lit does all the work if true */ } else if (obj->oerodeproof || obj_resists(obj, 5, 95) || !is_flammable(obj) || obj->oclass == FOOD_CLASS) { +#if 0 /*JP*/ pline("%s %s to burn for a moment.", Yname2(obj), otense(obj, "seem")); +#else + pline("%sはしばらくの間燃えた.", Yname2(obj)); +#endif } else { if ((omat == PLASTIC || omat == PAPER) && !obj->oartifact) obj->oeroded = MAX_ERODE; +#if 0 /*JP*/ pline_The("burning oil %s %s.", obj->oeroded == MAX_ERODE ? "destroys" : "damages", yname(obj)); +#else + pline("%sは燃えている油によって%s.", + yname(obj), + obj->oeroded == MAX_ERODE ? "破壊された" : "傷つけられた"); +#endif if (obj->oeroded == MAX_ERODE) { obj_extract_self(obj); obfree(obj, (struct obj *)0); @@ -1790,14 +2381,20 @@ /* we know it's carried */ if (obj->unpaid) { /* create a dummy duplicate to put on bill */ +/*JP verbalize("You burnt it, you bought it!"); +*/ + verbalize("燃やしたのなら買ってもらうよ!"); bill_dummy_object(obj); } obj->oeroded++; } } } else if (potion->cursed) { +/*JP pline_The("potion spills and covers your %s with oil.", +*/ + pline("油は飛び散りあなたの%sにかかった.", makeplural(body_part(FINGER))); incr_itimeout(&Glib, d(2,10)); } else if (obj->oclass != WEAPON_CLASS && !is_weptool(obj)) { @@ -1810,13 +2407,24 @@ } else if ((!is_rustprone(obj) && !is_corrodeable(obj)) || is_ammo(obj) || (!obj->oeroded && !obj->oeroded2)) { /* uses up potion, doesn't set obj->greased */ +#if 0 /*JP*/ pline("%s %s with an oily sheen.", Yname2(obj), otense(obj, "gleam")); +#else + pline("%sは油の光沢できらりと光った.", + Yname2(obj)); +#endif } else { +#if 0 /*JP*/ pline("%s %s less %s.", Yname2(obj), otense(obj, "are"), (obj->oeroded && obj->oeroded2) ? "corroded and rusty" : obj->oeroded ? "rusty" : "corroded"); +#else + pline("%sの%sが取れた.", Yname2(obj), + (obj->oeroded && obj->oeroded2) ? "腐食と錆" : + obj->oeroded ? "錆" : "腐食"); +#endif if (obj->oeroded > 0) obj->oeroded--; if (obj->oeroded2 > 0) obj->oeroded2--; wisx = TRUE; @@ -1844,10 +2452,16 @@ obj->age = 0; } if (obj->age > 1000L) { +/*JP pline("%s %s full.", Yname2(obj), otense(obj, "are")); +*/ + pline("%sにはたっぷり入っている.", Yname2(obj)); potion->in_use = FALSE; /* didn't go poof */ } else { +/*JP You("fill %s with oil.", yname(obj)); +*/ + You("%sに油を入れた.", yname(obj)); check_unpaid(potion); /* Yendorian Fuel Tax */ obj->age += 2*potion->age; /* burns more efficiently */ if (obj->age > 1500L) obj->age = 1500L; @@ -1863,16 +2477,27 @@ potion->in_use = FALSE; /* didn't go poof */ if ((obj->otyp == UNICORN_HORN || obj->otyp == AMETHYST) && (mixture = mixtype(obj, potion)) != 0) { +#if 0 /*JP*/ char oldbuf[BUFSZ], newbuf[BUFSZ]; +#else + char oldbuf[BUFSZ]; +#endif short old_otyp = potion->otyp; boolean old_dknown = FALSE; +#if 0 /*JP*/ boolean more_than_one = potion->quan > 1; +#endif oldbuf[0] = '\0'; if (potion->dknown) { old_dknown = TRUE; +#if 0 /*JP*/ Sprintf(oldbuf, "%s ", hcolor(OBJ_DESCR(objects[potion->otyp]))); +#else + Sprintf(oldbuf, "%s", + jtrns_obj('!', hcolor(OBJ_DESCR(objects[potion->otyp])))); +#endif } /* with multiple merged potions, split off one and just clear it */ @@ -1881,7 +2506,10 @@ } else singlepotion = potion; if(singlepotion->unpaid && costly_spot(u.ux, u.uy)) { +/*JP You("use it, you pay for it."); +*/ + You("使ってしまった,賠償せねばならない."); bill_dummy_object(singlepotion); } singlepotion->otyp = mixture; @@ -1895,6 +2523,7 @@ singlepotion->dknown = FALSE; } else { singlepotion->dknown = !Hallucination; +#if 0 /*JP*/ if (mixture == POT_WATER && singlepotion->dknown) Sprintf(newbuf, "clears"); else @@ -1903,6 +2532,14 @@ pline_The("%spotion%s %s.", oldbuf, more_than_one ? " that you dipped into" : "", newbuf); +#else + if (mixture == POT_WATER && singlepotion->dknown) + pline("%s薬は透明になった.", oldbuf); + else + pline("%s薬は%s薬になった.", oldbuf, + jtrns_obj('!', + hcolor(OBJ_DESCR(objects[mixture])))); +#endif if(!objects[old_otyp].oc_uname && !objects[old_otyp].oc_name_known && old_dknown) { struct obj fakeobj; @@ -1915,13 +2552,19 @@ } obj_extract_self(singlepotion); singlepotion = hold_another_object(singlepotion, +/*JP "You juggle and drop %s!", +*/ + "お手玉して%sを落としてしまった!", doname(singlepotion), (const char *)0); update_inventory(); return(1); } +/*JP pline("Interesting..."); +*/ + pline("面白い..."); return(1); } @@ -1934,16 +2577,29 @@ int chance; if(!(mtmp = makemon(&mons[PM_DJINNI], u.ux, u.uy, NO_MM_FLAGS))){ +/*JP pline("It turns out to be empty."); +*/ + pline("薬は空っぽだった."); return; } if (!Blind) { +#if 0 /*JP*/ pline("In a cloud of smoke, %s emerges!", a_monnam(mtmp)); pline("%s speaks.", Monnam(mtmp)); +#else + pline("煙の中から,%sが現われた!", a_monnam(mtmp)); + pline("%sは話しかけた.", Monnam(mtmp)); +#endif } else { +#if 0 /*JP*/ You("smell acrid fumes."); pline("%s speaks.", Something); +#else + You("ツンとする匂いがした."); + pline("%sが話しかけた.", Something); +#endif } chance = rn2(5); @@ -1952,22 +2608,40 @@ /* 0,1,2,3,4: b=80%,5,5,5,5; nc=20%,20,20,20,20; c=5%,5,5,5,80 */ switch (chance) { +/*JP case 0 : verbalize("I am in your debt. I will grant one wish!"); +*/ + case 0 : verbalize("お前には借りができた.1つ願いをかなえてやろう!"); makewish(); mongone(mtmp); break; +/*JP case 1 : verbalize("Thank you for freeing me!"); +*/ + case 1 : verbalize("私を助けてくれたことを感謝する!"); (void) tamedog(mtmp, (struct obj *)0); break; +/*JP case 2 : verbalize("You freed me!"); +*/ + case 2 : verbalize("解放してくれたのはお前か!"); mtmp->mpeaceful = TRUE; set_malign(mtmp); break; +/*JP case 3 : verbalize("It is about time!"); +*/ + case 3 : verbalize("さらばだ!"); +/*JP pline("%s vanishes.", Monnam(mtmp)); +*/ + pline("%sは消えた.", Monnam(mtmp)); mongone(mtmp); break; +/*JP default: verbalize("You disturbed me, fool!"); +*/ + default: verbalize("おまえは私の眠りを妨げた.おろかものめ!"); break; } } @@ -1983,9 +2657,11 @@ char reason[BUFSZ]; reason[0] = '\0'; +#if 0 /*JP*/ if (mtmp) Sprintf(reason, " from %s heat", (mtmp == &youmonst) ? (const char *)"your" : (const char *)s_suffix(mon_nam(mtmp))); +#endif if (mon == &youmonst) { mtmp2 = cloneu(); @@ -1993,7 +2669,10 @@ mtmp2->mhpmax = u.mhmax / 2; u.mhmax -= mtmp2->mhpmax; flags.botl = 1; +/*JP You("multiply%s!", reason); +*/ + You("%s分裂した!", reason); } } else { mtmp2 = clone_mon(mon, 0, 0); @@ -2001,7 +2680,10 @@ mtmp2->mhpmax = mon->mhpmax / 2; mon->mhpmax -= mtmp2->mhpmax; if (canspotmon(mon)) +/*JP pline("%s multiplies%s!", Monnam(mon), reason); +*/ + pline("%sは%s分裂した!", Monnam(mon), reason); } } return mtmp2; diff -aurbN -xCVS -xXTAGS nethack/src/pray.c jnethack/src/pray.c --- nethack/src/pray.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/pray.c 2005-04-26 18:35:41.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Benson I. Margulies, Mike Stephenson, Steve Linhart, 1989. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "epri.h" @@ -47,10 +54,17 @@ static const char *Moloch = "Moloch"; static const char *godvoices[] = { +#if 0 /*JP*/ "booms out", "thunders", "rings out", "booms", +#else + "響きわたった", + "雷のように響いた", + "とどろいた", + "響いた", +#endif }; /* values calculated when prayer starts, and used when completed */ @@ -267,33 +281,53 @@ int i; struct obj *otmp = 0; const char *what = (const char *)0; +#if 0 /*JP*/ static NEARDATA const char leftglow[] = "left ring softly glows", rightglow[] = "right ring softly glows"; +#else + static NEARDATA const char leftglow[] = "左の指輪", + rightglow[] = "右の指輪"; +#endif switch (trouble) { case TROUBLE_STONED: +/*JP You_feel("more limber."); +*/ + You("軟らかくなったような気がした."); Stoned = 0; flags.botl = 1; delayed_killer = 0; break; case TROUBLE_SLIMED: +/*JP pline_The("slime disappears."); +*/ + You("どろどろ感は消えた."); Slimed = 0; flags.botl = 1; delayed_killer = 0; break; case TROUBLE_STRANGLED: if (uamul && uamul->otyp == AMULET_OF_STRANGULATION) { +/*JP Your("amulet vanishes!"); +*/ + Your("魔除けは消えさった!"); useup(uamul); } +/*JP You("can breathe again."); +*/ + You("呼吸できるようになった."); Strangled = 0; flags.botl = 1; break; case TROUBLE_LAVA: +/*JP You("are back on solid ground."); +*/ + You("固い地面に戻った."); /* teleport should always succeed, but if not, * just untrap them. */ @@ -304,19 +338,28 @@ losestr(-1); /* fall into... */ case TROUBLE_HUNGRY: +/*JP Your("%s feels content.", body_part(STOMACH)); +*/ + Your("食欲は満たされた."); init_uhunger(); flags.botl = 1; break; case TROUBLE_SICK: +/*JP You_feel("better."); +*/ + You("気分が良くなった."); make_sick(0L, (char *) 0, FALSE, SICK_ALL); break; case TROUBLE_HIT: /* "fix all troubles" will keep trying if hero has 5 or less hit points, so make sure they're always boosted to be more than that */ +/*JP You_feel("much better."); +*/ + You("気分が良くなった."); if (Upolyd) { u.mhmax += rnd(5); if (u.mhmax <= 5) u.mhmax = 5+1; @@ -332,7 +375,10 @@ flags.botl = 1; break; case TROUBLE_STUCK_IN_WALL: +/*JP Your("surroundings change."); +*/ + Your("環境が変化した."); /* no control, but works on no-teleport levels */ (void) safe_teleds(FALSE); break; @@ -352,7 +398,10 @@ } if (Upolyd && nohands(youmonst.data)) { if (!Unchanging) { +/*JP Your("shape becomes uncertain."); +*/ + Your("体型は不明確になった."); rehumanize(); /* "You return to {normal} form." */ } else if ((otmp = unchanger()) != 0 && otmp->cursed) { /* otmp is an amulet of unchanging */ @@ -371,7 +420,10 @@ /* */ case TROUBLE_PUNISHED: +/*JP Your("chain disappears."); +*/ + Your("鎖は消えた."); unpunish(); break; case TROUBLE_FUMBLING: @@ -393,18 +445,31 @@ } uncurse(otmp); if (!Blind) { +#if 0 /*JP*/ Your("%s %s.", what ? what : (const char *)aobjnam(otmp, "softly glow"), hcolor(NH_AMBER)); +#else + Your("%sは%sやわらかく輝いた.", + what ? what : + (const char *)xname(otmp), + jconj_adj(hcolor(NH_AMBER))); +#endif otmp->bknown = TRUE; } update_inventory(); break; case TROUBLE_POISONED: if (Hallucination) +/*JP pline("There's a tiger in your tank."); +*/ + pline("あなたのタンクの中にトラがいる."); else +/*JP You_feel("in good health again."); +*/ + You("また健康になったような気がした."); for(i=0; ibknown = TRUE; } break; @@ -466,42 +544,81 @@ aligntyp resp_god; { if (u.uswallow) { +/*JP pline("Suddenly a bolt of lightning comes down at you from the heavens!"); +*/ + pline("突然空から稲妻が落ちてきた!"); +/*JP pline("It strikes %s!", mon_nam(u.ustuck)); +*/ + pline("稲妻は%sに命中した!", mon_nam(u.ustuck)); if (!resists_elec(u.ustuck)) { +/*JP pline("%s fries to a crisp!", Monnam(u.ustuck)); +*/ + pline("%sはパリパリになった!", Monnam(u.ustuck)); /* Yup, you get experience. It takes guts to successfully * pull off this trick on your god, anyway. */ xkilled(u.ustuck, 0); } else +/*JP pline("%s seems unaffected.", Monnam(u.ustuck)); +*/ + pline("%sは影響を受けない.", Monnam(u.ustuck)); } else { +/*JP pline("Suddenly, a bolt of lightning strikes you!"); +*/ + pline("突然,稲妻があなたに命中した!"); if (Reflecting) { shieldeff(u.ux, u.uy); if (Blind) +/*JP pline("For some reason you're unaffected."); +*/ + pline("なぜかあなたは影響を受けない."); else +/*JP (void) ureflects("%s reflects from your %s.", "It"); +*/ + (void) ureflects("%sは%sによって反射された.", "何か"); } else if (Shock_resistance) { shieldeff(u.ux, u.uy); +/*JP pline("It seems not to affect you."); +*/ + pline("稲妻は影響を与えない."); } else fry_by_god(resp_god); } +/*JP pline("%s is not deterred...", align_gname(resp_god)); +*/ + pline("%sはあきらめなかった...", align_gname(resp_god)); if (u.uswallow) { +/*JP pline("A wide-angle disintegration beam aimed at you hits %s!", +*/ + pline("あなたを狙った粉砕の光線が%sに命中した!", mon_nam(u.ustuck)); if (!resists_disint(u.ustuck)) { +/*JP pline("%s fries to a crisp!", Monnam(u.ustuck)); +*/ + pline("%sはパリパリになった!", Monnam(u.ustuck)); xkilled(u.ustuck, 2); /* no corpse */ } else +/*JP pline("%s seems unaffected.", Monnam(u.ustuck)); +*/ + pline("%sは影響を受けない.", Monnam(u.ustuck)); } else { +/*JP pline("A wide-angle disintegration beam hits you!"); +*/ + pline("粉砕の光線があなたに命中した!"); /* disintegrate shield and body armor before disintegrating * the impudent mortal, like black dragon breath -3. @@ -521,16 +638,28 @@ if (!Disint_resistance) fry_by_god(resp_god); else { +/*JP You("bask in its %s glow for a minute...", NH_BLACK); +*/ + You("しばらく,その%s輝きで暖まった...", NH_BLACK); +/*JP godvoice(resp_god, "I believe it not!"); +*/ + godvoice(resp_god, "信じられぬ!"); } if (Is_astralevel(&u.uz) || Is_sanctum(&u.uz)) { /* one more try for high altars */ +/*JP verbalize("Thou cannot escape my wrath, mortal!"); +*/ + verbalize("定命の者よ,汝我が怒りから逃がれることならん!"); summon_minion(resp_god, FALSE); summon_minion(resp_god, FALSE); summon_minion(resp_god, FALSE); +/*JP verbalize("Destroy %s, my servants!", uhim()); +*/ + verbalize("%sを殺せ,わが下僕よ!", uhim()); } } } @@ -541,9 +670,15 @@ { char killerbuf[64]; +/*JP You("fry to a crisp."); +*/ + You("パリパリになった."); killer_format = KILLED_BY; +/*JP Sprintf(killerbuf, "the wrath of %s", align_gname(resp_god)); +*/ + Sprintf(killerbuf, "%sの怒りに触れ", align_gname(resp_god)); killer = killerbuf; done(DIED); } @@ -569,18 +704,34 @@ switch (rn2(maxanger)) { case 0: +#if 0 /*JP*/ case 1: You_feel("that %s is %s.", align_gname(resp_god), Hallucination ? "bummed" : "displeased"); +#else + case 1: You("%sが%sいるような気がした.", align_gname(resp_god), + Hallucination ? "ねだって" : "立腹して"); +#endif break; case 2: case 3: godvoice(resp_god,(char *)0); +#if 0 /*JP*/ pline("\"Thou %s, %s.\"", (ugod_is_angry() && resp_god == u.ualign.type) ? "hast strayed from the path" : "art arrogant", youmonst.data->mlet == S_HUMAN ? "mortal" : "creature"); +#else + pline("「汝%s,%sよ.」", + (ugod_is_angry() && resp_god == u.ualign.type) + ? "その道から踏み出ておる": + "傲慢なり", + youmonst.data->mlet == S_HUMAN ? "定命のもの" : "生物"); +#endif +/*JP verbalize("Thou must relearn thy lessons!"); +*/ + verbalize("汝いま一度学ぶべし!"); (void) adjattrib(A_WIS, -1, FALSE); losexp((char *)0); break; @@ -592,18 +743,30 @@ case 4: case 5: gods_angry(resp_god); if (!Blind && !Antimagic) +/*JP pline("%s glow surrounds you.", +*/ + pline("%s光があなたを取り巻いた.", An(hcolor(NH_BLACK))); rndcurse(); break; case 7: case 8: godvoice(resp_god,(char *)0); +#if 0 /*JP*/ verbalize("Thou durst %s me?", (on_altar() && (a_align(u.ux,u.uy) != resp_god)) ? "scorn":"call upon"); pline("\"Then die, %s!\"", youmonst.data->mlet == S_HUMAN ? "mortal" : "creature"); +#else + verbalize("汝,我%s?", + (on_altar() && + (a_align(u.ux,u.uy) != resp_god)) ? + "をさげすむか?" : "に祈りを求めしか?"); + pline("「死ね,%sよ!」", + youmonst.data->mlet == S_HUMAN ? "定命のもの" : "生物"); +#endif summon_minion(resp_god, FALSE); break; @@ -623,13 +786,24 @@ if (Blind) str = Something; if (u.uswallow) { /* barrier between you and the floor */ +#if 0 /*JP*/ pline("%s %s into %s %s.", str, vtense(str, "drop"), s_suffix(mon_nam(u.ustuck)), mbodypart(u.ustuck, STOMACH)); +#else + pline("%sが%sの%sに落ちた.", str, + mon_nam(u.ustuck), mbodypart(u.ustuck, STOMACH)); +#endif } else { +#if 0 /*JP*/ pline("%s %s %s your %s!", str, Blind ? "lands" : vtense(str, "appear"), Levitation ? "beneath" : "at", makeplural(body_part(FOOT))); +#else + pline("%sがあなたの%sに%s!", str, + Levitation ? "の下方に" : "足元", + Blind ? "着地した" : "現われた"); +#endif } } @@ -656,20 +830,32 @@ switch (u.ualign.type) { case A_LAWFUL: u.uevent.uhand_of_elbereth = 1; +/*JP verbalize("I crown thee... The Hand of Elbereth!"); +*/ + verbalize("汝にさずけよう...エルベレスの御手を!"); break; case A_NEUTRAL: u.uevent.uhand_of_elbereth = 2; in_hand = (uwep && uwep->oartifact == ART_VORPAL_BLADE); already_exists = exist_artifact(LONG_SWORD, artiname(ART_VORPAL_BLADE)); +/*JP verbalize("Thou shalt be my Envoy of Balance!"); +*/ + verbalize("汝,我が調和の使者なり!"); break; case A_CHAOTIC: u.uevent.uhand_of_elbereth = 3; in_hand = (uwep && uwep->oartifact == ART_STORMBRINGER); already_exists = exist_artifact(RUNESWORD, artiname(ART_STORMBRINGER)); +#if 0 /*JP*/ verbalize("Thou art chosen to %s for My Glory!", already_exists && !in_hand ? "take lives" : "steal souls"); +#else + verbalize("汝,我が栄光のため%sとして選ばれん!", + already_exists && !in_hand ? + "生きながらえん者" : "魂を奪いしためる者"); +#endif break; } @@ -685,7 +871,10 @@ obj = mksobj(class_gift, TRUE, FALSE); bless(obj); obj->bknown = TRUE; +/*JP at_your_feet("A spellbook"); +*/ + at_your_feet("魔法書"); dropy(obj); u.ugifts++; /* when getting a new book for known spell, enhance @@ -708,7 +897,10 @@ if (class_gift != STRANGE_OBJECT) { ; /* already got bonus above */ } else if (obj && obj->otyp == LONG_SWORD && !obj->oartifact) { +/*JP if (!Blind) Your("sword shines brightly for a moment."); +*/ + if (!Blind) Your("剣はしばらくの間明るく輝いた."); obj = oname(obj, artiname(ART_EXCALIBUR)); if (obj && obj->oartifact == ART_EXCALIBUR) u.ugifts++; } @@ -721,13 +913,19 @@ if (class_gift != STRANGE_OBJECT) { ; /* already got bonus above */ } else if (in_hand) { +/*JP Your("%s goes snicker-snack!", xname(obj)); +*/ + Your("%sは軽くなった!", xname(obj)); obj->dknown = TRUE; } else if (!already_exists) { obj = mksobj(LONG_SWORD, FALSE, FALSE); obj = oname(obj, artiname(ART_VORPAL_BLADE)); obj->spe = 1; +/*JP at_your_feet("A sword"); +*/ + at_your_feet("剣"); dropy(obj); u.ugifts++; } @@ -740,11 +938,18 @@ { char swordbuf[BUFSZ]; +/*JP Sprintf(swordbuf, "%s sword", hcolor(NH_BLACK)); +*/ + Sprintf(swordbuf, "%s剣", hcolor(NH_BLACK)); if (class_gift != STRANGE_OBJECT) { ; /* already got bonus above */ } else if (in_hand) { +#if 0 /*JP*/ Your("%s hums ominously!", swordbuf); +#else + Your("%sは気味の悪い音を立てた!", swordbuf); +#endif obj->dknown = TRUE; } else if (!already_exists) { obj = mksobj(RUNESWORD, FALSE, FALSE); @@ -776,7 +981,10 @@ unrestrict_weapon_skill(weapon_type(obj)); } else if (class_gift == STRANGE_OBJECT) { /* opportunity knocked, but there was nobody home... */ +/*JP You_feel("unworthy."); +*/ + You("価値がないと思った."); } update_inventory(); return; @@ -791,12 +999,21 @@ int trouble = in_trouble(); /* what's your worst difficulty? */ int pat_on_head = 0, kick_on_butt; +#if 0 /*JP*/ You_feel("that %s is %s.", align_gname(g_align), u.ualign.record >= DEVOUT ? Hallucination ? "pleased as punch" : "well-pleased" : u.ualign.record >= STRIDENT ? Hallucination ? "ticklish" : "pleased" : Hallucination ? "full" : "satisfied"); +#else + pline("%sが%sような気がした.", align_gname(g_align), + u.ualign.record >= DEVOUT ? + Hallucination ? "くそ機嫌いい" : "ご機嫌麗しい" : + u.ualign.record >= STRIDENT ? + Hallucination ? "くすぐったがっている" : "上機嫌である" : + Hallucination ? "腹いっぱいである" : "満足している"); +#endif /* not your deity */ if (on_altar() && p_aligntyp != u.ualign.type) { @@ -856,26 +1073,47 @@ *repair_buf = '\0'; if (uwep->oeroded || uwep->oeroded2) +#if 0 /*JP*/ Sprintf(repair_buf, " and %s now as good as new", otense(uwep, "are")); +#else + Sprintf(repair_buf, "さらに新品同様になった."); +#endif if (uwep->cursed) { uncurse(uwep); uwep->bknown = TRUE; if (!Blind) +#if 0 /*JP*/ Your("%s %s%s.", aobjnam(uwep, "softly glow"), hcolor(NH_AMBER), repair_buf); +#else + Your("%sは%sやわらかく輝いた.%s", xname(uwep), + jconj_adj(hcolor(NH_AMBER)), repair_buf); +#endif +/*JP else You_feel("the power of %s over your %s.", +*/ + else pline("%sの力が%sに注がれているのを感じた.", u_gname(), xname(uwep)); *repair_buf = '\0'; } else if (!uwep->blessed) { bless(uwep); uwep->bknown = TRUE; if (!Blind) +#if 0 /*JP*/ Your("%s with %s aura%s.", aobjnam(uwep, "softly glow"), an(hcolor(NH_LIGHT_BLUE)), repair_buf); +#else + Your("%sは%sやわらかなオーラにつつまれた.%s", + xname(uwep), + an(hcolor(NH_LIGHT_BLUE)), repair_buf); +#endif +/*JP else You_feel("the blessing of %s over your %s.", +*/ + else pline("%sの祝福が%sに注がれているのを感じた.", u_gname(), xname(uwep)); *repair_buf = '\0'; } @@ -887,8 +1125,14 @@ /* only give this message if we didn't just bless or uncurse (which has already given a message) */ if (*repair_buf) +#if 0 /*JP*/ Your("%s as good as new!", aobjnam(uwep, Blind ? "feel" : "look")); +#else + Your("%sは新品同様になった%s!", + xname(uwep), + Blind ? "ような気がする" : ""); +#endif } update_inventory(); } @@ -898,15 +1142,31 @@ if (!u.uevent.uopened_dbridge) { if (u.uevent.uheard_tune < 1) { godvoice(g_align,(char *)0); +#if 0 /*JP*/ verbalize("Hark, %s!", youmonst.data->mlet == S_HUMAN ? "mortal" : "creature"); +#else + verbalize("%sよ,聞け!", + youmonst.data->mlet == S_HUMAN ? "人間" : "生物"); +#endif +#if 0 /*JP*/ verbalize( "To enter the castle, thou must play the right tune!"); +#else + verbalize( + "汝城に入らんと欲するならば,正しき調べを奏でるべし!"); +#endif u.uevent.uheard_tune++; break; } else if (u.uevent.uheard_tune < 2) { +/*JP You_hear("a divine music..."); +*/ + You_hear("神の音楽を聞いた..."); +/*JP pline("It sounds like: \"%s\".", tune); +*/ + pline("それは次のように聞こえた: 「%s」", tune); u.uevent.uheard_tune++; break; } @@ -914,7 +1174,10 @@ /* Otherwise, falls into next case */ case 2: if (!Blind) +/*JP You("are surrounded by %s glow.", an(hcolor(NH_GOLDEN))); +*/ + You("%s輝きにつつまれた.", hcolor(NH_GOLDEN)); /* if any levels have been lost (and not yet regained), treat this effect like blessed full healing */ if (u.ulevel < u.ulevelmax) { @@ -937,15 +1200,26 @@ int any = 0; if (Blind) +/*JP You_feel("the power of %s.", u_gname()); +*/ + You("%sの力を感じた.", u_gname()); +/*JP else You("are surrounded by %s aura.", +*/ + else You("%sオーラにつつまれた.", an(hcolor(NH_LIGHT_BLUE))); for(otmp=invent; otmp; otmp=otmp->nobj) { if (otmp->cursed) { uncurse(otmp); if (!Blind) { +#if 0 /*JP*/ Your("%s %s.", aobjnam(otmp, "softly glow"), hcolor(NH_AMBER)); +#else + Your("%sは%sやわらかく輝いた.", xname(otmp), + jconj_adj(hcolor(NH_AMBER))); +#endif otmp->bknown = TRUE; ++any; } @@ -955,26 +1229,47 @@ break; } case 5: { +/*JP const char *msg="\"and thus I grant thee the gift of %s!\""; +*/ + const char *msg="「さらに汝に%sをさずけよう!」"; +/*JP godvoice(u.ualign.type, "Thou hast pleased me with thy progress,"); +*/ + godvoice(u.ualign.type, "汝の成長は非常に望ましい,"); if (!(HTelepat & INTRINSIC)) { HTelepat |= FROMOUTSIDE; +/*JP pline(msg, "Telepathy"); +*/ + pline(msg, "テレパシー"); if (Blind) see_monsters(); } else if (!(HFast & INTRINSIC)) { HFast |= FROMOUTSIDE; +/*JP pline(msg, "Speed"); +*/ + pline(msg, "速さ"); } else if (!(HStealth & INTRINSIC)) { HStealth |= FROMOUTSIDE; +/*JP pline(msg, "Stealth"); +*/ + pline(msg, "忍の力"); } else { if (!(HProtection & INTRINSIC)) { HProtection |= FROMOUTSIDE; if (!u.ublessed) u.ublessed = rn1(3, 2); } else u.ublessed++; +/*JP pline(msg, "my protection"); +*/ + pline(msg, "我が護り"); } +/*JP verbalize("Use it wisely in my name!"); +*/ + verbalize("我が名に於いて有効に使うがよい!"); break; } case 7: @@ -990,7 +1285,10 @@ struct obj *otmp; int sp_no, trycnt = u.ulevel + 1; +/*JP at_your_feet("An object"); +*/ + at_your_feet("何か"); /* not yet known spells given preference over already known ones */ /* Also, try to grant a spell for which there is a skill slot */ otmp = mkobj(SPBOOK_CLASS, TRUE); @@ -1048,11 +1346,17 @@ other = TRUE; } if(!Blind && changed) { +#if 0 /*JP*/ pline("%s potion%s on the altar glow%s %s for a moment.", ((other && changed > 1L) ? "Some of the" : (other ? "One of the" : "The")), ((other || changed > 1L) ? "s" : ""), (changed > 1L ? "" : "s"), (bless_water ? hcolor(NH_LIGHT_BLUE) : hcolor(NH_BLACK))); +#else + pline("%s祭壇の薬は一瞬%s輝いた.", + (other && changed > 1L) ? "いくつかの" : "", + jconj_adj(bless_water ? hcolor(NH_LIGHT_BLUE) : hcolor(NH_BLACK))); +#endif } return((boolean)(changed > 0L)); } @@ -1062,6 +1366,7 @@ aligntyp g_align; const char *words; { +#if 0 /*JP*/ const char *quot = ""; if(words) quot = "\""; @@ -1070,13 +1375,24 @@ pline_The("voice of %s %s: %s%s%s", align_gname(g_align), godvoices[rn2(SIZE(godvoices))], quot, words, quot); +#else + if(words) + pline("%sの声が%s: 「%s」", align_gname(g_align), + godvoices[rn2(SIZE(godvoices))], words); + else + pline("%sの声が%s:", align_gname(g_align), + godvoices[rn2(SIZE(godvoices))]); +#endif } STATIC_OVL void gods_angry(g_align) aligntyp g_align; { +/*JP godvoice(g_align, "Thou hast angered me."); +*/ + godvoice(g_align, "汝,我を怒りしめた."); } /* The g_align god is upset with you. */ @@ -1098,19 +1414,36 @@ if (Hallucination) switch (rn2(3)) { case 0: +/*JP Your("sacrifice sprouts wings and a propeller and roars away!"); +*/ + Your("献上物は羽をはやし,プロペラがまわり,飛んでった!"); break; case 1: +/*JP Your("sacrifice puffs up, swelling bigger and bigger, and pops!"); +*/ + Your("献上物は噴煙をあげ,どんどん膨れ,そしてはじけた!"); break; case 2: +/*JP Your("sacrifice collapses into a cloud of dancing particles and fades away!"); +*/ + Your("献上物は細かく砕け,踊り出し,どこかに行ってしまった!"); break; } else if (Blind && u.ualign.type == A_LAWFUL) +/*JP Your("sacrifice disappears!"); +*/ + Your("献上物は消えた!"); +#if 0 /*JP*/ else Your("sacrifice is consumed in a %s!", u.ualign.type == A_LAWFUL ? "flash of light" : "burst of flame"); +#else + else Your("献上物は%s消えさった!", + u.ualign.type == A_LAWFUL ? "まばゆい光を放ち" : "炎を上げ"); +#endif if (carried(otmp)) useup(otmp); else useupf(otmp, 1L); exercise(A_WIS, TRUE); @@ -1125,7 +1458,10 @@ aligntyp altaralign = a_align(u.ux,u.uy); if (!on_altar() || u.uswallow) { +/*JP You("are not standing on an altar."); +*/ + You("祭壇の上に立っていない."); return 0; } @@ -1166,16 +1502,25 @@ if (your_race(ptr)) { if (is_demon(youmonst.data)) { +/*JP You("find the idea very satisfying."); +*/ + You("その考えは素晴しいと思った."); exercise(A_WIS, TRUE); } else if (u.ualign.type != A_CHAOTIC) { +/*JP pline("You'll regret this infamous offense!"); +*/ + pline("汝,この侮辱の行ないを後悔するべし!"); exercise(A_WIS, FALSE); } if (altaralign != A_CHAOTIC && altaralign != A_NONE) { /* curse the lawful/neutral altar */ +/*JP pline_The("altar is stained with %s blood.", urace.adj); +*/ + pline("祭壇は%sの血で汚れている.", urace.j); if(!Is_astralevel(&u.uz)) levl[u.ux][u.uy].altarmask = AM_CHAOTIC; angry_priest(); @@ -1187,27 +1532,48 @@ /* is equivalent to demon summoning */ if (altaralign == A_CHAOTIC && u.ualign.type != A_CHAOTIC) { pline( +/*JP "The blood floods the altar, which vanishes in %s cloud!", +*/ + "血が祭壇からあふれ,祭壇は%s雲となり消えた!", an(hcolor(NH_BLACK))); levl[u.ux][u.uy].typ = ROOM; levl[u.ux][u.uy].altarmask = 0; newsym(u.ux, u.uy); angry_priest(); +/*JP demonless_msg = "cloud dissipates"; +*/ + demonless_msg = "雲は消えた."; } else { /* either you're chaotic or altar is Moloch's or both */ +/*JP pline_The("blood covers the altar!"); +*/ + pline("血が祭壇を覆った!"); change_luck(altaralign == A_NONE ? -2 : 2); +/*JP demonless_msg = "blood coagulates"; +*/ + demonless_msg = "血がこびりついた"; } if ((pm = dlord(altaralign)) != NON_PM && (dmon = makemon(&mons[pm], u.ux, u.uy, NO_MM_FLAGS))) { +/*JP You("have summoned %s!", a_monnam(dmon)); +*/ + You("%sを召喚した!", a_monnam(dmon)); if (sgn(u.ualign.type) == sgn(dmon->data->maligntyp)) dmon->mpeaceful = TRUE; +/*JP You("are terrified, and unable to move."); +*/ + You("恐怖で動けなくなった."); nomul(-3); +/*JP } else pline_The("%s.", demonless_msg); +*/ + } else pline("%s.", demonless_msg); } if (u.ualign.type != A_CHAOTIC) { @@ -1225,7 +1591,10 @@ && mtmp->mtame) { /* mtmp is a temporary pointer to a tame monster's attributes, * not a real monster */ +/*JP pline("So this is how you repay loyalty?"); +*/ + pline("それでこれがあなたの忠義に報いるものか?"); adjalign(-3); value = -1; HAggravate_monster |= FROMOUTSIDE; @@ -1237,17 +1606,29 @@ /* If same as altar, always a very bad action. */ if (unicalign == altaralign) { +#if 0 /*JP*/ pline("Such an action is an insult to %s!", (unicalign == A_CHAOTIC) ? "chaos" : unicalign ? "law" : "balance"); +#else + pline("そのような行動は『%s』に反する!", + (unicalign == A_CHAOTIC) + ? "混沌" : unicalign ? "秩序" : "調和"); +#endif (void) adjattrib(A_WIS, -1, TRUE); value = -5; } else if (u.ualign.type == altaralign) { /* If different from altar, and altar is same as yours, */ /* it's a very good action */ if (u.ualign.record < ALIGNLIM) +/*JP You_feel("appropriately %s.", align_str(u.ualign.type)); +*/ + You("%sにふさわしいと感じた.", align_str(u.ualign.type)); +/*JP else You_feel("you are thoroughly on the right path."); +*/ + else You("完全に正しい道を歩んでいるのを感じた."); adjalign(5); value += 3; } else @@ -1263,9 +1644,15 @@ if (otmp->otyp == AMULET_OF_YENDOR) { if (!Is_astralevel(&u.uz)) { if (Hallucination) +/*JP You_feel("homesick."); +*/ + You("故郷が恋しくなった."); else +/*JP You_feel("an urge to return to the surface."); +*/ + You("地上に帰りたい気持に駆り立てられた."); return 1; } else { /* The final Test. Did you win? */ @@ -1273,26 +1660,59 @@ u.uevent.ascended = 1; if(carried(otmp)) useup(otmp); /* well, it's gone now */ else useupf(otmp, 1L); +/*JP You("offer the Amulet of Yendor to %s...", a_gname()); +*/ + You("イェンダーの魔除けを%sに献上した...",a_gname()); if (u.ualign.type != altaralign) { /* And the opposing team picks you up and carries you off on their shoulders */ adjalign(-99); +#if 0 /*JP*/ pline("%s accepts your gift, and gains dominion over %s...", a_gname(), u_gname()); +#else + pline("%sはあなたの送り物を受けとり,%sの権力を得た...", + a_gname(), u_gname()); +#endif +/*JP pline("%s is enraged...", u_gname()); +*/ + pline("%sは激怒した...", u_gname()); +/*JP pline("Fortunately, %s permits you to live...", a_gname()); +*/ + pline("幸運にも,%sはあなたの存在を許している...",a_gname()); +#if 0 /*JP*/ pline("A cloud of %s smoke surrounds you...", hcolor((const char *)"orange")); +#else + pline("%s煙があなたを取り囲んだ...", + hcolor((const char *)"オレンジ色の")); +#endif done(ESCAPED); } else { /* super big win */ adjalign(10); +/*JP pline("An invisible choir sings, and you are bathed in radiance..."); +*/ +pline("どこからともなく聖歌隊の歌が聞こえ,あなたは光に包まれた..."); +/*JP godvoice(altaralign, "Congratulations, mortal!"); +*/ + godvoice(altaralign, "よくやった!人間よ!"); display_nhwindow(WIN_MESSAGE, FALSE); +/*JP verbalize("In return for thy service, I grant thee the gift of Immortality!"); +*/ + verbalize("汝の偉業に対し,不死の体を捧げようぞ!"); +#if 0 /*JP*/ You("ascend to the status of Demigod%s...", flags.female ? "dess" : ""); +#else + You("昇天し,%s神となった...", + flags.female ? "女" : ""); +#endif done(ASCENDED); } } @@ -1300,10 +1720,18 @@ if (otmp->otyp == FAKE_AMULET_OF_YENDOR) { if (flags.soundok) +/*JP You_hear("a nearby thunderclap."); +*/ + You("近くに雷が落ちた音を聞いた."); if (!otmp->known) { +#if 0 /*JP*/ You("realize you have made a %s.", Hallucination ? "boo-boo" : "mistake"); +#else + You("%sことに気がついた.", + Hallucination ? "「ハズレ」だった" : "間違いを犯した"); +#endif otmp->known = TRUE; change_luck(-1); return 1; @@ -1327,9 +1755,18 @@ * REAL BAD NEWS!!! High altars cannot be converted. Even an attempt * gets the god who owns it truely pissed off. */ +/*JP You_feel("the air around you grow charged..."); +*/ + You("回りの空気にエネルギーが満ちていくような気がした..."); +/*JP pline("Suddenly, you realize that %s has noticed you...", a_gname()); +*/ + pline("突然,%sがあなたをじっと見ているのに気がついた...",a_gname()); +/*JP godvoice(altaralign, "So, mortal! You dare desecrate my High Temple!"); +*/ + godvoice(altaralign, "人間よ!おまえは我が神聖なる寺院を汚すのか!"); /* Throw everything we have at the player */ god_zaps_you(altaralign); } else if (value < 0) { /* I don't think the gods are gonna like this... */ @@ -1346,9 +1783,15 @@ if (ugod_is_angry() || (altaralign == A_NONE && Inhell)) { if(u.ualignbase[A_CURRENT] == u.ualignbase[A_ORIGINAL] && altaralign != A_NONE) { +/*JP You("have a strong feeling that %s is angry...", u_gname()); +*/ + You("%sが怒っているのを確信した...", u_gname()); consume_offering(otmp); +/*JP pline("%s accepts your allegiance.", a_gname()); +*/ + pline("%sはあなたの属性を受けいれた.", a_gname()); /* The player wears a helm of opposite alignment? */ if (uarmh && uarmh->otyp == HELM_OF_OPPOSITE_ALIGNMENT) @@ -1358,7 +1801,10 @@ u.ublessed = 0; flags.botl = 1; +/*JP You("have a sudden sense of a new direction."); +*/ + You("突然,別の感覚にめざめた."); /* Beware, Conversion is costly */ change_luck(-3); u.ublesscnt += 300; @@ -1366,8 +1812,14 @@ } else { u.ugangr += 3; adjalign(-5); +/*JP pline("%s rejects your sacrifice!", a_gname()); +*/ + pline("%sはあなたの献上物を受けいれない!", a_gname()); +/*JP godvoice(altaralign, "Suffer, infidel!"); +*/ + godvoice(altaralign, "異端者よ!失せろ!!"); change_luck(-5); (void) adjattrib(A_WIS, -2, TRUE); if (!Inhell) angrygods(u.ualign.type); @@ -1375,11 +1827,17 @@ return(1); } else { consume_offering(otmp); +/*JP You("sense a conflict between %s and %s.", +*/ + You("%sと%s間の争いを感じた.", u_gname(), a_gname()); if (rn2(8 + u.ulevel) > 5) { struct monst *pri; +/*JP You_feel("the power of %s increase.", u_gname()); +*/ + You("%sの力が増大したような気がした.", u_gname()); exercise(A_WIS, TRUE); change_luck(1); /* Yes, this is supposed to be &=, not |= */ @@ -1388,10 +1846,17 @@ levl[u.ux][u.uy].altarmask = levl[u.ux][u.uy].altarmask | (Align2amask(u.ualign.type)); if (!Blind) +#if 0 /*JP*/ pline_The("altar glows %s.", hcolor( u.ualign.type == A_LAWFUL ? NH_WHITE : u.ualign.type ? NH_BLACK : (const char *)"gray")); +#else + pline("祭壇は%s輝いた.", + jconj_adj(hcolor( + u.ualign.type == A_LAWFUL ? NH_WHITE : + u.ualign.type ? NH_BLACK : (const char *)"灰色の"))); +#endif if (rnl(u.ulevel) > 6 && u.ualign.record > 0 && rnd(u.ualign.record) > (3*ALIGNLIM)/4) @@ -1401,7 +1866,10 @@ !p_coaligned(pri)) angry_priest(); } else { +/*JP pline("Unluckily, you feel the power of %s decrease.", +*/ + pline("不幸にも,%sの力が減少したのを感じた.", u_gname()); change_luck(-1); exercise(A_WIS, FALSE); @@ -1421,26 +1889,45 @@ if(u.ugangr < 0) u.ugangr = 0; if(u.ugangr != saved_anger) { if (u.ugangr) { +#if 0 /*JP*/ pline("%s seems %s.", u_gname(), Hallucination ? "groovy" : "slightly mollified"); +#else + pline("%sは%sに見える.", u_gname(), + Hallucination ? "素敵" : "ちょっと和らいだよう"); +#endif if ((int)u.uluck < 0) change_luck(1); } else { +#if 0 /*JP*/ pline("%s seems %s.", u_gname(), Hallucination ? "cosmic (not a new fact)" : "mollified"); +#else + pline("%sは%sに見える.", u_gname(), Hallucination ? + "虹色(新事実ではない)" : "軽蔑したよう"); +#endif if ((int)u.uluck < 0) u.uluck = 0; } } else { /* not satisfied yet */ if (Hallucination) +/*JP pline_The("gods seem tall."); +*/ + pline("神はお高くとまっているように見える."); +/*JP else You("have a feeling of inadequacy."); +*/ + else You("まだまだだと感じた."); } } else if(ugod_is_angry()) { if(value > MAXVALUE) value = MAXVALUE; if(value > -u.ualign.record) value = -u.ualign.record; adjalign(value); +/*JP You_feel("partially absolved."); +*/ + You("少しだけゆるしてもらえたような気がした."); } else if (u.ublesscnt > 0) { u.ublesscnt -= ((value * (u.ualign.type == A_CHAOTIC ? 500 : 300)) / MAXVALUE); @@ -1448,15 +1935,27 @@ if(u.ublesscnt != saved_cnt) { if (u.ublesscnt) { if (Hallucination) +/*JP You("realize that the gods are not like you and I."); +*/ + You("神のツーカーの仲ではないことを悟った."); else +/*JP You("have a hopeful feeling."); +*/ + pline("希望が見えてきたような気がした."); if ((int)u.uluck < 0) change_luck(1); } else { if (Hallucination) +/*JP pline("Overall, there is a smell of fried onions."); +*/ + pline("たまねぎを揚げた匂いがした."); else +/*JP You("have a feeling of reconciliation."); +*/ + You("許された気がした."); if ((int)u.uluck < 0) u.uluck = 0; } } @@ -1474,8 +1973,14 @@ if (otmp->cursed) uncurse(otmp); otmp->oerodeproof = TRUE; dropy(otmp); +/*JP at_your_feet("An object"); +*/ + at_your_feet("何か"); +/*JP godvoice(u.ualign.type, "Use my gift wisely!"); +*/ + godvoice(u.ualign.type, "我が与えしもの賢く使うべし!"); u.ugifts++; u.ublesscnt = rnz(300 + (50 * nartifacts)); exercise(A_WIS, TRUE); @@ -1489,10 +1994,18 @@ if ((int)u.uluck < 0) u.uluck = 0; if (u.uluck != saved_luck) { if (Blind) +/*JP You("think %s brushed your %s.",something, body_part(FOOT)); +*/ + pline("%sがあなたの%sをくすぐった.", something, body_part(FOOT)); else You(Hallucination ? +#if 0 /*JP*/ "see crabgrass at your %s. A funny thing in a dungeon." : "glimpse a four-leaf clover at your %s.", +#else + "%s元にペンペン草をみつけた.迷宮にしては珍しい.": + "四葉のクローバーを%s元に見つけた.", +#endif makeplural(body_part(FOOT))); } } @@ -1513,13 +2026,21 @@ if (is_demon(youmonst.data) && (p_aligntyp != A_CHAOTIC)) { if (praying) +#if 0 /*JP*/ pline_The("very idea of praying to a %s god is repugnant to you.", p_aligntyp ? "lawful" : "neutral"); +#else + pline("%sの神に祈りをささげるのは常識に背く.", + p_aligntyp ? "秩序" : "中立"); +#endif return FALSE; } if (praying) +/*JP You("begin praying to %s.", align_gname(p_aligntyp)); +*/ + You("%sに祈りを捧げた.", align_gname(p_aligntyp)); if (u.ualign.type && u.ualign.type == -p_aligntyp) alignment = -u.ualign.record; /* Opposite alignment altar */ @@ -1555,7 +2076,10 @@ { /* Confirm accidental slips of Alt-P */ if (flags.prayconfirm) +/*JP if (yn("Are you sure you want to pray?") == 'n') +*/ + if (yn("祈りますか?") == 'n') return 0; u.uconduct.gnostic++; @@ -1570,7 +2094,10 @@ #ifdef WIZARD if (wizard && p_type >= 0) { +/*JP if (yn("Force the gods to be pleased?") == 'y') { +*/ + if (yn("無理矢理神に微笑んでもらいますか?") == 'y') { u.ublesscnt = 0; if (u.uluck < 0) u.uluck = 0; if (u.ualign.record <= 0) u.ualign.record = 1; @@ -1580,13 +2107,19 @@ } #endif nomul(-3); +/*JP nomovemsg = "You finish your prayer."; +*/ + nomovemsg = "祈り終えた."; afternmv = prayer_done; if(p_type == 3 && !Inhell) { /* if you've been true to your god you can't die while you pray */ if (!Blind) +/*JP You("are surrounded by a shimmering light."); +*/ + You("かすかな光につつまれた."); u.uinvulnerable = TRUE; } @@ -1602,17 +2135,31 @@ if(p_type == -1) { godvoice(alignment, alignment == A_LAWFUL ? +#if 0 /*JP*/ "Vile creature, thou durst call upon me?" : "Walk no more, perversion of nature!"); +#else + "卑劣な生物よ,汝,我に祈りを求めたか?" : + "動くな!死にぞこないの生物よ!"); +#endif +/*JP You_feel("like you are falling apart."); +*/ + You("バラバラになったような気がした."); /* KMH -- Gods have mastery over unchanging */ rehumanize(); +/*JP losehp(rnd(20), "residual undead turning effect", KILLED_BY_AN); +*/ + losehp(rnd(20), "不死の生物を元に戻す力で", KILLED_BY_AN); exercise(A_CON, FALSE); return(1); } if (Inhell) { +/*JP pline("Since you are in Gehennom, %s won't help you.", +*/ + pline("ゲヘナに%sの力は届かない.", align_gname(alignment)); /* haltingly aligned is least likely to anger */ if (u.ualign.record <= 0 || rnl(u.ualign.record)) @@ -1666,7 +2213,10 @@ return spelleffects(sp_no, TRUE); } +/*JP You("don't know how to turn undead!"); +*/ + You("不死の生き物を土に戻す方法を知らない!"); return(0); } u.uconduct.gnostic++; @@ -1675,18 +2225,27 @@ (is_demon(youmonst.data) || is_undead(youmonst.data))) || u.ugangr > 6 /* "Die, mortal!" */) { +/*JP pline("For some reason, %s seems to ignore you.", u_gname()); +*/ + pline("なぜか,%sはあなたを無視したようだ.", u_gname()); aggravate(); exercise(A_WIS, FALSE); return(0); } if (Inhell) { +/*JP pline("Since you are in Gehennom, %s won't help you.", u_gname()); +*/ + pline("ゲヘナに%sの力は届かない.", u_gname()); aggravate(); return(0); } +/*JP pline("Calling upon %s, you chant an arcane formula.", u_gname()); +*/ + pline("%sに祈りを求めると,あなたは不可思議な言葉の聖歌を聞いた.", u_gname()); exercise(A_WIS, TRUE); /* note: does not perform unturn_dead() on victims' inventories */ @@ -1706,7 +2265,10 @@ mtmp->msleeping = 0; if (Confusion) { if (!once++) +/*JP pline("Unfortunately, your voice falters."); +*/ + pline("残念ながら,あなたの声はどもってしまった."); mtmp->mflee = 0; mtmp->mfrozen = 0; mtmp->mcanmove = 1; @@ -1776,10 +2338,16 @@ case A_NEUTRAL: gnam = urole.ngod; break; case A_CHAOTIC: gnam = urole.cgod; break; default: impossible("unknown alignment."); +/*JP gnam = "someone"; break; +*/ + return "誰か"; } if (*gnam == '_') ++gnam; +/*JP return gnam; +*/ + return jtrns_mon(gnam); } /* hallucination handling for priest/minion names: select a random god @@ -1802,7 +2370,10 @@ } if (!gnam) gnam = Moloch; if (*gnam == '_') ++gnam; +/*JP return gnam; +*/ + return jtrns_mon(gnam); } /* deity's title */ @@ -1810,7 +2381,10 @@ align_gtitle(alignment) aligntyp alignment; { +/*JP const char *gnam, *result = "god"; +*/ + const char *gnam, *result = "主神"; switch (alignment) { case A_LAWFUL: gnam = urole.lgod; break; @@ -1818,7 +2392,10 @@ case A_CHAOTIC: gnam = urole.cgod; break; default: gnam = 0; break; } +/*JP if (gnam && *gnam == '_') result = "goddess"; +*/ + if (gnam && *gnam == '_') result = "女神"; return result; } @@ -1829,12 +2406,21 @@ aligntyp altaralign = a_align(x,y); if(!strcmp(align_gname(altaralign), u_gname())) { +/*JP godvoice(altaralign, "How darest thou desecrate my altar!"); +*/ + godvoice(altaralign, "汝,我が祭壇を汚すか!"); (void) adjattrib(A_WIS, -1, FALSE); } else { +/*JP pline("A voice (could it be %s?) whispers:", +*/ + pline("ささやき声が聞こえる(たぶん%s?):", align_gname(altaralign)); +/*JP verbalize("Thou shalt pay, infidel!"); +*/ + verbalize("異端者よ!報いを受けよ!"); change_luck(-1); } } diff -aurbN -xCVS -xXTAGS nethack/src/priest.c jnethack/src/priest.c --- nethack/src/priest.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/priest.c 2005-01-02 02:44:35.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Izchak Miller, Steve Linhart, 1989. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "mfndpos.h" #include "eshk.h" @@ -99,7 +106,10 @@ check_special_room(FALSE); if(ib) { if (cansee(mtmp->mx,mtmp->my)) +/*JP pline("%s picks up %s.", Monnam(mtmp), +*/ + pline("%sは%sを拾った.", Monnam(mtmp), distant_name(ib,doname)); obj_extract_self(ib); (void) mpickobj(mtmp, ib); @@ -165,7 +175,10 @@ (Conflict && !resist(priest, RING_CLASS, 0, 0))) { if(monnear(priest, u.ux, u.uy)) { if(Displaced) +/*JP Your("displaced image doesn't fool %s!", +*/ + Your("幻影は%sをだませなかった!", mon_nam(priest)); (void) mattacku(priest); return(0); @@ -247,40 +260,89 @@ register struct monst *mon; char *pname; /* caller-supplied output buffer */ { +#if 0 /*JP*/ const char *what = Hallucination ? rndmonnam() : mon->data->mname; +#else + const char *what = Hallucination ? rndmonnam() : + jtrns_mon_gen(mon->data->mname, mon->female); +#endif +/*JP Strcpy(pname, "the "); +*/ + Strcpy(pname, ""); +/*JP if (mon->minvis) Strcat(pname, "invisible "); +*/ + if (mon->minvis) Strcat(pname, "透明な"); if (mon->ispriest || mon->data == &mons[PM_ALIGNED_PRIEST] || mon->data == &mons[PM_ANGEL]) { /* use epri */ +#if 1 /*JP*/ + Strcat(pname, halu_gname((int)EPRI(mon)->shralign)); + Strcat(pname, "の"); +#endif if (mon->mtame && mon->data == &mons[PM_ANGEL]) +/*JP Strcat(pname, "guardian "); +*/ + Strcat(pname, "警護の"); if (mon->data != &mons[PM_ALIGNED_PRIEST] && mon->data != &mons[PM_HIGH_PRIEST]) { Strcat(pname, what); +#if 0 /*JP*/ Strcat(pname, " "); +#endif } if (mon->data != &mons[PM_ANGEL]) { if (!mon->ispriest && EPRI(mon)->renegade) +/*JP Strcat(pname, "renegade "); +*/ + Strcat(pname, "裏切り者の"); if (mon->data == &mons[PM_HIGH_PRIEST]) +#if 0 /*JP*/ Strcat(pname, "high "); +#else if (Hallucination) + Strcat(pname, "無能高級官僚"); + else + Strcat(pname, "法王"); + else /* 上記で完成させて、以下のコードは通らなくする */ +#endif + if (Hallucination) +/*JP Strcat(pname, "poohbah "); +*/ + Strcat(pname, "無能官僚"); else if (mon->female) +/*JP Strcat(pname, "priestess "); +*/ + Strcat(pname, "尼僧"); else +/*JP Strcat(pname, "priest "); +*/ + Strcat(pname, "僧侶"); } +#if 0 /*JP*/ Strcat(pname, "of "); Strcat(pname, halu_gname((int)EPRI(mon)->shralign)); +#endif return(pname); } /* use emin instead of epri */ +#if 0 /*JP*/ Strcat(pname, what); Strcat(pname, " of "); Strcat(pname, halu_gname(EMIN(mon)->min_align)); +#else + Strcat(pname, halu_gname(EMIN(mon)->min_align)); + Strcat(pname, "の"); + Strcat(pname, what); +#endif + return(pname); } @@ -344,22 +406,41 @@ the endgame; for the Sanctum, the next message names Moloch so suppress the "of Moloch" for him here too */ if (sanctum && !Hallucination) priest->ispriest = 0; +#if 0 /*JP*/ pline("%s intones:", canseemon(priest) ? Monnam(priest) : "A nearby voice"); +#else + pline("%sが詠唱した:", + canseemon(priest) ? Monnam(priest) : "近くで誰か"); +#endif priest->ispriest = save_priest; } msg2 = 0; if(sanctum && Is_sanctum(&u.uz)) { if(priest->mpeaceful) { +/*JP msg1 = "Infidel, you have entered Moloch's Sanctum!"; +*/ + msg1 = "異端者よ!ここは,モーロックの聖域だ!"; +/*JP msg2 = "Be gone!"; +*/ + msg2 = "立ちされ!"; priest->mpeaceful = 0; set_malign(priest); } else +/*JP msg1 = "You desecrate this place by your presence!"; +*/ + msg1 = "おまえはこの神聖な場所を汚している!"; } else { +#if 0 /*JP*/ Sprintf(buf, "Pilgrim, you enter a %s place!", !shrined ? "desecrated" : "sacred"); +#else + Sprintf(buf, "巡礼者よ,おまえは%s地にいる!", + !shrined ? "不浄の" : "神聖なる"); +#endif msg1 = buf; } if (can_speak) { @@ -370,16 +451,31 @@ /* !tended -> !shrined */ if (!shrined || !p_coaligned(priest) || u.ualign.record <= ALGN_SINNED) +#if 0 /*JP*/ You("have a%s forbidding feeling...", (!shrined) ? "" : " strange"); +#else + You("%s近づきがたい気持がした...", + (!shrined) ? "" : "奇妙な"); +#endif +/*JP else You("experience a strange sense of peace."); +*/ + else You("奇妙な満ち足りた気持ちになった."); } } else { switch(rn2(3)) { +#if 0 /*JP*/ case 0: You("have an eerie feeling..."); break; case 1: You_feel("like you are being watched."); break; default: pline("A shiver runs down your %s.", body_part(SPINE)); break; +#else + case 0: You("ぞっとした..."); break; + case 1: You("見つめられているような気がした."); break; + default: pline("あなたの%sを震えが走った.", + body_part(SPINE)); break; +#endif } if(!rn2(5)) { struct monst *mtmp; @@ -387,14 +483,26 @@ if(!(mtmp = makemon(&mons[PM_GHOST],u.ux,u.uy,NO_MM_FLAGS))) return; if (!Blind || sensemon(mtmp)) +/*JP pline("An enormous ghost appears next to you!"); +*/ + pline("巨大な幽霊があなたのすぐそばに現われた!"); +/*JP else You("sense a presence close by!"); +*/ + else You("すぐそばに何かがいるのを感じた!"); mtmp->mpeaceful = 0; set_malign(mtmp); if(flags.verbose) +/*JP You("are frightened to death, and unable to move."); +*/ + You("まっさおになって驚き,動けなくなった."); nomul(-3); +/*JP nomovemsg = "You regain your composure."; +*/ + nomovemsg = "あなたは平静を取り戻した."; } } } @@ -411,7 +519,10 @@ u.uconduct.gnostic++; if(priest->mflee || (!priest->ispriest && coaligned && strayed)) { +/*JP pline("%s doesn't want anything to do with you!", +*/ + pline("%sはあなたにかまいたくないようだ!", Monnam(priest)); priest->mpeaceful = 0; return; @@ -421,13 +532,22 @@ if(!histemple_at(priest,priest->mx,priest->my) || !priest->mpeaceful || !priest->mcanmove || priest->msleeping) { static const char *cranky_msg[3] = { +#if 0 /*JP*/ "Thou wouldst have words, eh? I'll give thee a word or two!", "Talk? Here is what I have to say!", "Pilgrim, I would speak no longer with thee." +#else + "汝言葉を望むのか?", + "話す?何を言えばよいのだ!", + "巡礼者よ,汝に語ることなどない." +#endif }; if(!priest->mcanmove || priest->msleeping) { +/*JP pline("%s breaks out of %s reverie!", +*/ + pline("%sは%sの瞑想を中断した!", Monnam(priest), mhis(priest)); priest->mfrozen = priest->msleeping = 0; priest->mcanmove = 1; @@ -440,7 +560,10 @@ /* you desecrated the temple and now you want to chat? */ if(priest->mpeaceful && *in_rooms(priest->mx, priest->my, TEMPLE) && !has_shrine(priest)) { +/*JP verbalize("Begone! Thou desecratest this holy place with thy presence."); +*/ + verbalize("立ち去れ!汝はこの神聖なる場所を汚している."); priest->mpeaceful = 0; return; } @@ -449,8 +572,13 @@ if(coaligned && !strayed) { if (priest->mgold > 0L) { /* Note: two bits is actually 25 cents. Hmm. */ +#if 0 /*JP*/ pline("%s gives you %s for an ale.", Monnam(priest), (priest->mgold == 1L) ? "one bit" : "two bits"); +#else + pline("%sはあなたがエール酒を飲めるように,%sを与えた.", Monnam(priest), + (priest->mgold == 1L) ? "金貨1枚" : "金貨2枚"); +#endif if (priest->mgold > 1L) u.ugold = 2L; else @@ -463,37 +591,66 @@ long pmoney = money_cnt(priest->minvent); if (pmoney > 0L) { /* Note: two bits is actually 25 cents. Hmm. */ +#if 0 /*JP*/ pline("%s gives you %s for an ale.", Monnam(priest), (pmoney == 1L) ? "one bit" : "two bits"); +#else + pline("%sはあなたがエール酒を飲めるように,%sを与えた.", Monnam(priest), + (priest->mgold == 1L) ? "金貨1枚" : "金貨2枚"); +#endif money2u(priest, pmoney > 1L ? 2 : 1); #endif } else +/*JP pline("%s preaches the virtues of poverty.", Monnam(priest)); +*/ + pline("%sは貧困の美徳について説教した.", Monnam(priest)); exercise(A_WIS, TRUE); } else +/*JP pline("%s is not interested.", Monnam(priest)); +*/ + pline("%sは興味を示さない.", Monnam(priest)); return; } else { long offer; +/*JP pline("%s asks you for a contribution for the temple.", +*/ + pline("%sはあなたに寺院への寄贈を求めた.", Monnam(priest)); if((offer = bribe(priest)) == 0) { +/*JP verbalize("Thou shalt regret thine action!"); +*/ + verbalize("汝の行為は神を冒涜するものなり!"); if(coaligned) adjalign(-1); } else if(offer < (u.ulevel * 200)) { #ifndef GOLDOBJ +/*JP if(u.ugold > (offer * 2L)) verbalize("Cheapskate."); +*/ + if(u.ugold > (offer * 2L)) verbalize("ケチめ."); #else +/*JP if(money_cnt(invent) > (offer * 2L)) verbalize("Cheapskate."); +*/ + if(money_cnt(invent) > (offer * 2L)) verbalize("ケチめ."); #endif else { +/*JP verbalize("I thank thee for thy contribution."); +*/ + verbalize("汝の寄贈に報いようぞ."); /* give player some token */ exercise(A_WIS, TRUE); } } else if(offer < (u.ulevel * 400)) { +/*JP verbalize("Thou art indeed a pious individual."); +*/ + verbalize("汝,まさに敬虔なり."); #ifndef GOLDOBJ if(u.ugold < (offer * 2L)) { #else @@ -501,19 +658,28 @@ #endif if (coaligned && u.ualign.record <= ALGN_SINNED) adjalign(1); +/*JP verbalize("I bestow upon thee a blessing."); +*/ + verbalize("汝に祝福を."); incr_itimeout(&HClairvoyant, rn1(500,500)); } } else if(offer < (u.ulevel * 600) && u.ublessed < 20 && (u.ublessed < 9 || !rn2(u.ublessed))) { +/*JP verbalize("Thy devotion has been rewarded."); +*/ + verbalize("汝が献身に報わん."); if (!(HProtection & INTRINSIC)) { HProtection |= FROMOUTSIDE; if (!u.ublessed) u.ublessed = rn1(3, 2); } else u.ublessed++; } else { +/*JP verbalize("Thy selfless generosity is deeply appreciated."); +*/ + verbalize("汝自身の真価は大いに認められた."); #ifndef GOLDOBJ if(u.ugold < (offer * 2L) && coaligned) { #else @@ -644,15 +810,24 @@ switch(rn2(3)) { case 0: +/*JP pline("%s roars in anger: \"Thou shalt suffer!\"", +*/ + pline("%sは怒りの声をあげた:「汝,苦しむがよい!」", a_gname_at(ax, ay)); break; case 1: +/*JP pline("%s voice booms: \"How darest thou harm my servant!\"", +*/ + pline("%sの声が響いた:「わが下僕に苦しむがよい!」", s_suffix(a_gname_at(ax, ay))); break; default: +/*JP pline("%s roars: \"Thou dost profane my shrine!\"", +*/ + pline("%sの声が聞こえる:「汝,我が聖堂を汚したり!」", a_gname_at(ax, ay)); break; } diff -aurbN -xCVS -xXTAGS nethack/src/quest.c jnethack/src/quest.c --- nethack/src/quest.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/quest.c 2003-12-10 03:31:54.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright 1991, M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" /* quest dungeon branch routines. */ @@ -115,14 +122,28 @@ #ifdef WIZARD if (wizard && talk) { if (u.ualign.type != original_alignment) { +#if 0 /*JP*/ You("are currently %s instead of %s.", align_str(u.ualign.type), align_str(original_alignment)); +#else + You("%sではなく%sの属性である.", + align_str(original_alignment), align_str(u.ualign.type)); +#endif } else if (u.ualignbase[A_CURRENT] != original_alignment) { +/*JP You("have converted."); +*/ + You("変更されている."); } else if (u.ualign.record < MIN_QUEST_ALIGN) { +/*JP You("are currently %d and require %d.", +*/ + Your("属性値は現在%dで%d必要だ.", u.ualign.record, MIN_QUEST_ALIGN); +/*JP if (yn_function("adjust?", (char *)0, 'y') == 'y') +*/ + if (yn_function("直す?", (char *)0, 'y') == 'y') u.ualign.record = MIN_QUEST_ALIGN; } } @@ -329,9 +350,14 @@ if (mtmp->data == &mons[PM_PRISONER] && (mtmp->mstrategy & STRAT_WAITMASK)) { /* Awaken the prisoner */ +#if 0 /*JP*/ if (canseemon(mtmp)) pline("%s speaks:", Monnam(mtmp)); verbalize("I'm finally free!"); +#else + pline("%sは話した:", Monnam(mtmp)); + verbalize("ついに自由だ!"); +#endif mtmp->mstrategy &= ~STRAT_WAITMASK; mtmp->mpeaceful = 1; diff -aurbN -xCVS -xXTAGS nethack/src/questpgr.c jnethack/src/questpgr.c --- nethack/src/questpgr.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/questpgr.c 2004-06-25 02:22:58.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright 1991, M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "dlb.h" @@ -29,7 +36,9 @@ static struct qtlists qt_list; static dlb *msg_file; /* used by ldrname() and neminame(), then copied into cvt_buf */ +#if 0 /*JP*/ static char nambuf[sizeof cvt_buf]; +#endif #ifdef DEBUG static void NDECL(dump_qtlist); @@ -165,10 +174,14 @@ { int i = urole.ldrnum; +#if 0 /*JP*/ Sprintf(nambuf, "%s%s", type_is_pname(&mons[i]) ? "" : "the ", mons[i].mname); return nambuf; +#else + return(jtrns_mon(mons[i].mname)); +#endif } STATIC_OVL const char * @@ -189,10 +202,14 @@ { int i = urole.neminum; +#if 0 /*JP*/ Sprintf(nambuf, "%s%s", type_is_pname(&mons[i]) ? "" : "the ", mons[i].mname); return nambuf; +#else + return(jtrns_mon(mons[i].mname)); +#endif } STATIC_OVL const char * @@ -200,7 +217,10 @@ { int i = urole.guardnum; +/*JP return(mons[i].mname); +*/ + return(jtrns_mon(mons[i].mname)); } STATIC_OVL const char * @@ -232,23 +252,37 @@ case 'p': str = plname; break; +#if 0 /*JP*/ case 'c': str = (flags.female && urole.name.f) ? urole.name.f : urole.name.m; +#else + case 'c': str = (flags.female && urole.jname.f) ? + urole.jname.f : urole.jname.m; +#endif break; case 'r': str = rank_of(u.ulevel, Role_switch, flags.female); break; case 'R': str = rank_of(MIN_QUEST_LEVEL, Role_switch, flags.female); break; +/*JP case 's': str = (flags.female) ? "sister" : "brother"; +*/ + case 's': str = (flags.female) ? "妹" : "弟"; break; +/*JP case 'S': str = (flags.female) ? "daughter" : "son"; +*/ + case 'S': str = (flags.female) ? "娘" : "息子"; break; case 'l': str = ldrname(); break; case 'i': str = intermed(); break; +/*JP case 'o': str = the(artiname(urole.questarti)); +*/ + case 'o': str = jtrns_obj('A', (artiname(urole.questarti))); break; case 'n': str = neminame(); break; @@ -262,19 +296,40 @@ break; case 'A': str = align_str(u.ualign.type); break; +/*JP case 'd': str = align_gname(u.ualignbase[A_ORIGINAL]); +*/ + case 'd': str = jtrns_mon(align_gname(u.ualignbase[A_ORIGINAL])); break; +/*JP case 'D': str = align_gname(A_LAWFUL); +*/ + case 'D': str = jtrns_mon(align_gname(A_LAWFUL)); break; +/*JP case 'C': str = "chaotic"; +*/ + case 'C': str = "混沌"; break; +/*JP case 'N': str = "neutral"; +*/ + case 'N': str = "中立"; break; +/*JP case 'L': str = "lawful"; +*/ + case 'L': str = "秩序"; break; +/*JP case 'x': str = Blind ? "sense" : "see"; +*/ + case 'x': str = Blind ? "感じ" : "見"; break; +/*JP case 'Z': str = dungeons[0].dname; +*/ + case 'Z': str = jtrns_obj('d',dungeons[0].dname); break; case '%': str = "%"; break; diff -aurbN -xCVS -xXTAGS nethack/src/read.c jnethack/src/read.c --- nethack/src/read.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/read.c 2005-04-26 18:35:41.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" /* KMH -- Copied from pray.c; this really belongs in a header file */ @@ -49,7 +56,10 @@ /* outrumor has its own blindness check */ if(scroll->otyp == FORTUNE_COOKIE) { if(flags.verbose) +/*JP You("break up the cookie and throw away the pieces."); +*/ + You("クッキーを割り,かけらを投げすてた."); outrumor(bcsign(scroll), BY_COOKIE); if (!Blind) u.uconduct.literate++; useup(scroll); @@ -57,6 +67,7 @@ #ifdef TOURIST } else if (scroll->otyp == T_SHIRT) { static const char *shirt_msgs[] = { /* Scott Bigham */ +#if 0 /*JP*/ "I explored the Dungeons of Doom and all I got was this lousy T-shirt!", "Is that Mjollnir in your pocket or are you just happy to see me?", "It's not the size of your sword, it's how #enhance'd you are with it.", @@ -73,38 +84,77 @@ "Don't Panic", /* HHGTTG */ "Furinkan High School Athletic Dept.", /* Ranma 1/2 */ "Hel-LOOO, Nurse!", /* Animaniacs */ +#else + "私は運命の迷宮を調査していたが,手に入れたのはきたないTシャツだけだった!", + "ポケットにミュルニールが入っているの?それとも私に会えてうれしい?", + "剣の大きさが問題なのではない.それが如何に#enhanceされているかなのだ.", + "マダム・エルバイラのサキュバス館 永久顧客", + "マダム・エルバイラのサキュバス館 今月の最優秀功労者", + "ローディオス金庫の番人,それは暗く小さい部屋の中", + "イェンダー軍兵士,それは巨大な団体の中", + "私はイェンダー軍の新兵訓練所を乗り越えました", + "ローディオス会計学校 室内ラクロスチーム", + "Oracle(TM) の泉 第10回濡れTシャツコンテスト", + "おい,黒ドラゴン!こいつを分解しろ!", + "馬鹿と一緒にいます → ", + "私は悪くない!Izchakに投票したもの!", + "あ わ て る な", /* 銀河ヒッチハイクガイド */ + "風林館高校陸上部", /* Ranma 1/2 */ + "Hel−LOOO,Nurse!", /* Animaniacs */ +#endif }; char buf[BUFSZ]; int erosion; if (Blind) { +/*JP You_cant("feel any Braille writing."); +*/ + You("点字はどうも書いてないようだ."); return 0; } u.uconduct.literate++; if(flags.verbose) +/*JP pline("It reads:"); +*/ + pline("それを読んだ:"); Strcpy(buf, shirt_msgs[scroll->o_id % SIZE(shirt_msgs)]); erosion = greatest_erosion(scroll); if (erosion) wipeout_text(buf, (int)(strlen(buf) * erosion / (2*MAX_ERODE)), scroll->o_id ^ (unsigned)u.ubirthday); +/*JP pline("\"%s\"", buf); +*/ + pline("「%s」", buf); return 1; #endif /* TOURIST */ } else if (scroll->oclass != SCROLL_CLASS && scroll->oclass != SPBOOK_CLASS) { +/*JP pline(silly_thing_to, "read"); +*/ + pline(silly_thing_to, "読む"); return(0); } else if (Blind) { const char *what = 0; if (scroll->oclass == SPBOOK_CLASS) +/*JP what = "mystic runes"; +*/ + what = "神秘的なルーン文字"; else if (!scroll->dknown) +/*JP what = "formula on the scroll"; +*/ + what = "巻物の呪文"; if (what) { +/*JP pline("Being blind, you cannot read the %s.", what); +*/ + pline("目が見えないので,あなたは%sを読むことができない.", what); return(0); } } @@ -125,16 +175,30 @@ scroll->in_use = TRUE; /* scroll, not spellbook, now being read */ if(scroll->otyp != SCR_BLANK_PAPER) { if(Blind) +#if 0 /*JP*/ pline("As you %s the formula on it, the scroll disappears.", is_silent(youmonst.data) ? "cogitate" : "pronounce"); +#else + pline("呪文を唱えると,巻物は消えた."); +#endif else +/*JP pline("As you read the scroll, it disappears."); +*/ + pline("巻物を読むと,それは消えた."); if(confused) { if (Hallucination) +/*JP pline("Being so trippy, you screw up..."); +*/ + pline("とてもへろへろなので,くしゃくしゃにしてしまった..."); else +#if 0 /*JP*/ pline("Being confused, you mis%s the magic words...", is_silent(youmonst.data) ? "understand" : "pronounce"); +#else + pline("混乱しているので,呪文を間違ってしまった..."); +#endif } } if(!seffects(scroll)) { @@ -162,7 +226,10 @@ obj->spe = 0; if (obj->otyp == OIL_LAMP || obj->otyp == BRASS_LANTERN) obj->age = 0; +/*JP Your("%s %s briefly.",xname(obj), otense(obj, "vibrate")); +*/ + Your("%sは小刻みに振動した.",xname(obj)); } else pline(nothing_happens); } } @@ -171,8 +238,13 @@ p_glow1(otmp) register struct obj *otmp; { +#if 0 /*JP*/ Your("%s %s briefly.", xname(otmp), otense(otmp, Blind ? "vibrate" : "glow")); +#else + Your("%sは小刻みに%s.", xname(otmp), + Blind ? "振動した" : "輝いた"); +#endif } static void @@ -180,11 +252,18 @@ register struct obj *otmp; register const char *color; { +#if 0 /*JP*/ Your("%s %s%s%s for a moment.", xname(otmp), otense(otmp, Blind ? "vibrate" : "glow"), Blind ? "" : " ", Blind ? nul : hcolor(color)); +#else + Your("%sは一瞬%s%s.", + xname(otmp), + Blind ? (const char *)"" : jconj_adj(hcolor(color)), + Blind ? "振動した" : "輝いた"); +#endif } /* Is the object chargeable? For purposes of inventory display; it is */ @@ -275,17 +354,30 @@ /* destruction depends on current state, not adjustment */ if (obj->spe > rn2(7) || obj->spe <= -5) { +#if 0 /*JP*/ Your("%s %s momentarily, then %s!", xname(obj), otense(obj,"pulsate"), otense(obj,"explode")); +#else + Your("%sは一瞬脈動し,爆発した!", + xname(obj)); +#endif if (is_on) Ring_gone(obj); s = rnd(3 * abs(obj->spe)); /* amount of damage */ useup(obj); +/*JP losehp(s, "exploding ring", KILLED_BY_AN); +*/ + losehp(s, "指輪の爆発で", KILLED_BY_AN); } else { long mask = is_on ? (obj == uleft ? LEFT_RING : RIGHT_RING) : 0L; +#if 0 /*JP*/ Your("%s spins %sclockwise for a moment.", xname(obj), s < 0 ? "counter" : ""); +#else + Your("%sは一瞬%s時計回りに回転した.", + xname(obj), s < 0 ? "反" : ""); +#endif /* cause attributes and/or properties to be updated */ if (is_on) Ring_off(obj); obj->spe += s; /* update the ring while it's off */ @@ -318,7 +410,10 @@ else if (rechrg && obj->otyp == MAGIC_MARKER) { /* previously recharged */ obj->recharged = 1; /* override increment done above */ if (obj->spe < 3) +/*JP Your("marker seems permanently dried out."); +*/ + Your("マーカは完全に乾ききってしまった."); else pline(nothing_happens); } else if (is_blessed) { @@ -355,7 +450,11 @@ stripspe(obj); if (obj->lamplit) { if (!Blind) +#if 0 /*JP*/ pline("%s out!", Tobjnam(obj, "go")); +#else + pline("%sは消えた!", xname(obj)); +#endif end_burn(obj, TRUE); } } else if (is_blessed) { @@ -422,7 +521,10 @@ } else { not_chargable: +/*JP You("have a feeling of loss."); +*/ + You("なにか損した気分になった."); } } @@ -658,7 +760,10 @@ case SCR_MAIL: known = TRUE; if (sobj->spe) +/*JP pline("This seems to be junk mail addressed to the finder of the Eye of Larn."); +*/ + pline("Eye of Larnのファインダーに宛てられたゴミメイルのようだ."); /* note to the puzzled: the game Larn actually sends you junk * mail if you win! */ @@ -674,8 +779,14 @@ otmp = some_armor(&youmonst); if(!otmp) { strange_feeling(sobj, +/*JP !Blind ? "Your skin glows then fades." : +*/ + !Blind ? "あなたの体は一瞬輝いた." : +/*JP "Your skin feels warm for a moment."); +*/ + "あなたの体は一瞬暖かくなった."); exercise(A_CON, !sobj->cursed); exercise(A_STR, !sobj->cursed); return(1); @@ -684,23 +795,42 @@ otmp->oerodeproof = !(sobj->cursed); if(Blind) { otmp->rknown = FALSE; +#if 0 /*JP*/ Your("%s %s warm for a moment.", xname(otmp), otense(otmp, "feel")); +#else + Your("%sは一瞬暖かくなった.", + xname(otmp)); +#endif } else { otmp->rknown = TRUE; +#if 0 /*JP*/ Your("%s %s covered by a %s %s %s!", xname(otmp), otense(otmp, "are"), sobj->cursed ? "mottled" : "shimmering", hcolor(sobj->cursed ? NH_BLACK : NH_GOLDEN), sobj->cursed ? "glow" : (is_shield(otmp) ? "layer" : "shield")); +#else + Your("%sは%s%s%sで覆われた!", + xname(otmp), + jconj_adj(hcolor(sobj->cursed ? NH_BLACK : NH_GOLDEN)), + sobj->cursed ? "光るまだらの" : "ゆらめく", + sobj->cursed ? "輝き" : + (is_shield(otmp) ? "バリア" : "バリア")); +#endif } if (otmp->oerodeproof && (otmp->oeroded || otmp->oeroded2)) { otmp->oeroded = otmp->oeroded2 = 0; +#if 0 /*JP*/ Your("%s %s as good as new!", xname(otmp), otense(otmp, Blind ? "feel" : "look")); +#else + Your("%sは新品同様になったように%s!", + xname(otmp), Blind ? "感じた" : "見えた"); +#endif } break; } @@ -721,6 +851,7 @@ /* KMH -- catch underflow */ s = sobj->cursed ? -otmp->spe : otmp->spe; if (s > (special_armor ? 5 : 3) && rn2(s)) { +#if 0 /*JP*/ Your("%s violently %s%s%s for a while, then %s.", xname(otmp), otense(otmp, Blind ? "vibrate" : "glow"), @@ -728,6 +859,12 @@ (Blind || same_color) ? nul : hcolor(sobj->cursed ? NH_BLACK : NH_SILVER), otense(otmp, "evaporate")); +#else + Your("%sはしばらくの間激しく%s%s,蒸発した.", + xname(otmp), + Blind ? nul : jconj_adj(hcolor(sobj->cursed ? NH_BLACK : NH_SILVER)), + Blind ? "振動し" : "輝き"); +#endif if(is_cloak(otmp)) (void) Cloak_off(); if(is_boots(otmp)) (void) Boots_off(); if(is_helmet(otmp)) (void) Helmet_off(); @@ -743,7 +880,10 @@ if (s >= 0 && otmp->otyp >= GRAY_DRAGON_SCALES && otmp->otyp <= YELLOW_DRAGON_SCALES) { /* dragon scales get turned into dragon scale mail */ +/*JP Your("%s merges and hardens!", xname(otmp)); +*/ + Your("%sは融合し固くなった!", xname(otmp)); setworn((struct obj *)0, W_ARM); /* assumes same order */ otmp->otyp = GRAY_DRAGON_SCALE_MAIL + @@ -757,6 +897,7 @@ setworn(otmp, W_ARM); break; } +#if 0 /*JP*/ Your("%s %s%s%s%s for a %s.", xname(otmp), s == 0 ? "violently " : nul, @@ -764,6 +905,15 @@ (!Blind && !same_color) ? " " : nul, (Blind || same_color) ? nul : hcolor(sobj->cursed ? NH_BLACK : NH_SILVER), (s*s>1) ? "while" : "moment"); +#else + Your("%sは%s%s%s%s.", + xname(otmp), + (s*s>1) ? "しばらくの間" : "一瞬", + s == 0 ? "激しく" : nul, + Blind ? nul : + jconj_adj(hcolor(sobj->cursed ? NH_BLACK : NH_SILVER)), + Blind ? "振動した" : "輝いた"); +#endif otmp->cursed = sobj->cursed; if (!otmp->blessed || sobj->cursed) otmp->blessed = sobj->blessed; @@ -775,9 +925,15 @@ if ((otmp->spe > (special_armor ? 5 : 3)) && (special_armor || !rn2(7))) +#if 0 /*JP*/ Your("%s suddenly %s %s.", xname(otmp), otense(otmp, "vibrate"), Blind ? "again" : "unexpectedly"); +#else + Your("%sは突然%s振動した.", + xname(otmp), + Blind ? "また" : "思いもよらず"); +#endif break; } case SCR_DESTROY_ARMOR: @@ -785,7 +941,10 @@ otmp = some_armor(&youmonst); if(confused) { if(!otmp) { +/*JP strange_feeling(sobj,"Your bones itch."); +*/ + strange_feeling(sobj,"骨がムズムズする."); exercise(A_STR, FALSE); exercise(A_CON, FALSE); return(1); @@ -796,14 +955,20 @@ } if(!sobj->cursed || !otmp || !otmp->cursed) { if(!destroy_arm(otmp)) { +/*JP strange_feeling(sobj,"Your skin itches."); +*/ + strange_feeling(sobj,"皮膚がムズムズする."); exercise(A_STR, FALSE); exercise(A_CON, FALSE); return(1); } else known = TRUE; } else { /* armor and scroll both cursed */ +/*JP Your("%s %s.", xname(otmp), otense(otmp, "vibrate")); +*/ + Your("%sは振動した.", xname(otmp)); if (otmp->spe >= -6) otmp->spe--; make_stunned(HStun + rn1(10, 10), TRUE); } @@ -812,40 +977,79 @@ case SCR_CONFUSE_MONSTER: case SPE_CONFUSE_MONSTER: if(youmonst.data->mlet != S_HUMAN || sobj->cursed) { +/*JP if(!HConfusion) You_feel("confused."); +*/ + if(!HConfusion) You("混乱した."); make_confused(HConfusion + rnd(100),FALSE); } else if(confused) { if(!sobj->blessed) { +#if 0 /*JP*/ Your("%s begin to %s%s.", makeplural(body_part(HAND)), Blind ? "tingle" : "glow ", Blind ? nul : hcolor(NH_PURPLE)); +#else + Your("%sは%s%sはじめた.", + makeplural(body_part(HAND)), + Blind ? nul : jconj_adj(hcolor(NH_PURPLE)), + Blind ? "ヒリヒリし" : "輝き"); +#endif make_confused(HConfusion + rnd(100),FALSE); } else { +#if 0 /*JP*/ pline("A %s%s surrounds your %s.", Blind ? nul : hcolor(NH_RED), Blind ? "faint buzz" : " glow", body_part(HEAD)); +#else + pline("%s%sがあなたの%sを取り巻いた.", + Blind ? nul : jconj_adj(hcolor(NH_RED)), + Blind ? "かすかにブーンと鳴るもの" : "輝くもの", + body_part(HEAD)); +#endif make_confused(0L,TRUE); } } else { if (!sobj->blessed) { +#if 0 /*JP*/ Your("%s%s %s%s.", makeplural(body_part(HAND)), Blind ? "" : " begin to glow", Blind ? (const char *)"tingle" : hcolor(NH_RED), u.umconf ? " even more" : ""); +#else + Your("%sは%s%s%s.", + makeplural(body_part(HAND)), + u.umconf ? "少し" : "", + Blind ? (const char *)"ヒリヒリした" : + jconj_adj(hcolor(NH_RED)), + Blind ? "" : "輝きはじめた"); +#endif u.umconf++; } else { if (Blind) +#if 0 /*JP*/ Your("%s tingle %s sharply.", makeplural(body_part(HAND)), u.umconf ? "even more" : "very"); +#else + Your("%sは%sピリピリする.", + makeplural(body_part(HAND)), + u.umconf ? "少し" : "とても"); +#endif else +#if 0 /*JP*/ Your("%s glow a%s brilliant %s.", makeplural(body_part(HAND)), u.umconf ? "n even more" : "", hcolor(NH_RED)); +#else + Your("%sは%s%s明るく輝いた.", + makeplural(body_part(HAND)), + u.umconf ? "少し" : "", + jconj_adj(hcolor(NH_RED))); +#endif /* after a while, repeated uses become less effective */ if (u.umconf >= 40) u.umconf++; @@ -872,20 +1076,38 @@ } } if(!ct) +#if 0 /*JP*/ You_hear("%s in the distance.", (confused || sobj->cursed) ? "sad wailing" : "maniacal laughter"); +#else + You_hear("遠くで%sを聞いた.", + (confused || sobj->cursed) ? "悲しく泣き叫ぶ声" : + "狂ったように笑う声"); +#endif else if(sobj->otyp == SCR_SCARE_MONSTER) +#if 0 /*JP*/ You_hear("%s close by.", (confused || sobj->cursed) ? "sad wailing" : "maniacal laughter"); +#else + You_hear("近くで%sを聞いた.", + (confused || sobj->cursed) ? "悲しく泣き叫ぶ声" : + "狂ったように笑う声"); +#endif break; } case SCR_BLANK_PAPER: if (Blind) +/*JP You("don't remember there being any magic words on this scroll."); +*/ + You("巻物に呪文が書いてなかったことを思いだした."); else +/*JP pline("This scroll seems to be blank."); +*/ + pline("この巻物には何も書いてないように見える."); known = TRUE; break; case SCR_REMOVE_CURSE: @@ -893,17 +1115,32 @@ { register struct obj *obj; if(confused) if (Hallucination) +/*JP You_feel("the power of the Force against you!"); +*/ + You("フォースの力があなたにはむかっているように感じた!"); else +/*JP You_feel("like you need some help."); +*/ + You("自分が助けを必要としているような気がした."); else if (Hallucination) +/*JP You_feel("in touch with the Universal Oneness."); +*/ + You("宇宙原理の調和に触れているような気がした."); else +/*JP You_feel("like someone is helping you."); +*/ + pline("誰かがあなたを助けているような気がした."); if (sobj->cursed) { +/*JP pline_The("scroll disintegrates."); +*/ + pline("巻物は粉々になった."); } else { for (obj = invent; obj; obj = obj->nobj) { long wornmask; @@ -964,19 +1201,36 @@ uwep->oerodeproof = !(sobj->cursed); if (Blind) { uwep->rknown = FALSE; +/*JP Your("weapon feels warm for a moment."); +*/ + pline("武器が一瞬暖かくなったような気がした."); } else { uwep->rknown = TRUE; +#if 0 /*JP*/ Your("%s covered by a %s %s %s!", aobjnam(uwep, "are"), sobj->cursed ? "mottled" : "shimmering", hcolor(sobj->cursed ? NH_PURPLE : NH_GOLDEN), sobj->cursed ? "glow" : "shield"); +#else + Your("%sは%s%s%sで覆われた!", + xname(uwep), + jconj_adj(hcolor( + sobj->cursed ? NH_PURPLE : NH_GOLDEN)), + sobj->cursed ? "光るまだらの" : "ゆらめく", + sobj->cursed ? "輝き" : "バリア"); +#endif } if (uwep->oerodeproof && (uwep->oeroded || uwep->oeroded2)) { uwep->oeroded = uwep->oeroded2 = 0; +#if 0 /*JP*/ Your("%s as good as new!", aobjnam(uwep, Blind ? "feel" : "look")); +#else + pline("%sは新品同様になったように%s!", + xname(uwep), Blind ? "感じた" : "見えた"); +#endif } } else return !chwepon(sobj, sobj->cursed ? -1 : @@ -1000,7 +1254,10 @@ } break; case SCR_GENOCIDE: +/*JP You("have found a scroll of genocide!"); +*/ + pline("これは虐殺の巻物だ!"); known = TRUE; if (sobj->blessed) do_class_genocide(); else do_genocide(!sobj->cursed | (2 * !!Confusion)); @@ -1014,7 +1271,10 @@ else { if (sobj->blessed && !Teleport_control) { known = TRUE; +/*JP if (yn("Do you wish to teleport?")=='n') +*/ + if (yn("瞬間移動しますか?")=='n') break; } tele(); @@ -1037,9 +1297,15 @@ case SCR_IDENTIFY: /* known = TRUE; */ if(confused) +/*JP You("identify this as an identify scroll."); +*/ + You("これは識別の巻物だと識別した."); else +/*JP pline("This is an identify scroll."); +*/ + pline("これは識別の巻物だ."); if (sobj->blessed || (!sobj->cursed && !rn2(5))) { cval = rn2(5); /* Note: if rn2(5)==0, identify all items */ @@ -1055,7 +1321,10 @@ return(1); case SCR_CHARGING: if (confused) { +/*JP You_feel("charged up!"); +*/ + You_feel("充填されたような気がする!"); if (u.uen < u.uenmax) u.uen = u.uenmax; else @@ -1064,18 +1333,30 @@ break; } known = TRUE; +/*JP pline("This is a charging scroll."); +*/ + pline("これは充填の巻物だ!"); otmp = getobj(all_count, "charge"); if (!otmp) break; recharge(otmp, sobj->cursed ? -1 : (sobj->blessed ? 1 : 0)); break; case SCR_MAGIC_MAPPING: if (level.flags.nommap) { +/*JP Your("mind is filled with crazy lines!"); +*/ + Your("心にただならぬ線!線!線!が浮びあがった!"); if (Hallucination) +/*JP pline("Wow! Modern art."); +*/ + pline("ワォ!モダンアートだ!"); else +/*JP Your("%s spins in bewilderment.", body_part(HEAD)); +*/ + You("当惑して目がまわった."); make_confused(HConfusion + rnd(30), FALSE); break; } @@ -1091,17 +1372,26 @@ known = TRUE; case SPE_MAGIC_MAPPING: if (level.flags.nommap) { +/*JP Your("%s spins as %s blocks the spell!", body_part(HEAD), something); +*/ + You("何かが呪文をさえぎり,目がまわった!"); make_confused(HConfusion + rnd(30), FALSE); break; } +/*JP pline("A map coalesces in your mind!"); +*/ + pline("地図があなたの心に融合した!"); cval = (sobj->cursed && !confused); if(cval) HConfusion = 1; /* to screw up map */ do_mapping(); if(cval) { HConfusion = 0; /* restore */ +/*JP pline("Unfortunately, you can't grasp the details."); +*/ + pline("残念ながら,あなたは詳細を得ることができなかった."); } break; case SCR_AMNESIA: @@ -1109,13 +1399,25 @@ forget( (!sobj->blessed ? ALL_SPELLS : 0) | (!confused || sobj->cursed ? ALL_MAP : 0) ); if (Hallucination) /* Ommmmmm! */ +/*JP Your("mind releases itself from mundane concerns."); +*/ + Your("心は平凡な利害関係から解放された."); else if (!strncmpi(plname, "Maud", 4)) +/*JP pline("As your mind turns inward on itself, you forget everything else."); +*/ + pline("あなたの心は内側に向き,全てを忘れてしまった."); else if (rn2(2)) +/*JP pline("Who was that Maud person anyway?"); +*/ + pline("Maudって娘はいったい誰だい?"); else +/*JP pline("Thinking of Maud you forget everything else."); +*/ + pline("Maudを考えること以外,あなたは全てを忘れてしまった."); exercise(A_WIS, FALSE); break; case SCR_FIRE: @@ -1131,21 +1433,41 @@ if(Fire_resistance) { shieldeff(u.ux, u.uy); if(!Blind) +/*JP pline("Oh, look, what a pretty fire in your %s.", +*/ + pline("わぁごらん.小さな火が%sにある.", makeplural(body_part(HAND))); +/*JP else You_feel("a pleasant warmth in your %s.", +*/ + else You_feel("%sの中に快適な暖かさを感じた.", makeplural(body_part(HAND))); } else { +#if 0 /*JP:T*/ pline_The("scroll catches fire and you burn your %s.", makeplural(body_part(HAND))); +#else + pline("巻物に火が燃えうつり,あなたの%sを焼いた.", + makeplural(body_part(HAND))); +#endif +/*JP losehp(1, "scroll of fire", KILLED_BY_AN); +*/ + losehp(1, "炎の巻物で", KILLED_BY_AN); } return(1); } if (Underwater) +/*JP pline_The("water around you vaporizes violently!"); +*/ + pline("あなたの回りの水は沸騰した!"); else { +/*JP pline_The("scroll erupts in a tower of flame!"); +*/ + pline("巻物から火柱が立ち昇った!"); burn_away_slime(); } explode(u.ux, u.uy, 11, (2*(rn1(3, 3) + 2 * cval) + 1)/3, @@ -1161,8 +1483,14 @@ register int x, y; /* Identify the scroll */ +#if 0 /*JP*/ pline_The("%s rumbles %s you!", ceiling(u.ux,u.uy), sobj->blessed ? "around" : "above"); +#else + pline("あなたの%sの%sからゴロゴロと音が聞こえてきた!", + sobj->blessed ? "まわり" : "真上", + ceiling(u.ux,u.uy)); +#endif known = 1; if (In_sokoban(&u.uz)) change_luck(-1); /* Sokoban guilt */ @@ -1196,8 +1524,13 @@ int mdmg; if (cansee(mtmp->mx, mtmp->my)) { +#if 0 /*JP*/ pline("%s is hit by %s!", Monnam(mtmp), doname(otmp2)); +#else + pline("%sが%sに命中した!", + doname(otmp2), Monnam(mtmp)); +#endif if (mtmp->minvis && !canspotmon(mtmp)) map_invisible(mtmp->mx, mtmp->my); } @@ -1205,15 +1538,26 @@ if (helmet) { if(is_metallic(helmet)) { if (canspotmon(mtmp)) +/*JP pline("Fortunately, %s is wearing a hard helmet.", mon_nam(mtmp)); +*/ + pline("幸運にも,%sは固い兜を身につけている.", mon_nam(mtmp)); else if (flags.soundok) +/*JP You_hear("a clanging sound."); +*/ + You_hear("ガランガランという音を聞いた."); if (mdmg > 2) mdmg = 2; } else { if (canspotmon(mtmp)) +#if 0 /*JP*/ pline("%s's %s does not protect %s.", Monnam(mtmp), xname(helmet), mhim(mtmp)); +#else + pline("%sの%sでは守れない.", + Monnam(mtmp), xname(helmet)); +#endif } } mtmp->mhp -= mdmg; @@ -1221,7 +1565,10 @@ xkilled(mtmp, 1); } /* Drop the rock/boulder to the floor */ +/*JP if (!flooreffects(otmp2, x, y, "fall")) { +*/ + if (!flooreffects(otmp2, x, y, "落ちる")) { place_object(otmp2, x, y); stackobj(otmp2); newsym(x, y); /* map the rock */ @@ -1244,33 +1591,53 @@ !Passes_walls && !noncorporeal(youmonst.data) && !unsolid(youmonst.data)) { +/*JP You("are hit by %s!", doname(otmp2)); +*/ + pline("%sが命中した!", doname(otmp2)); dmg = dmgval(otmp2, &youmonst) * otmp2->quan; if (uarmh && !sobj->cursed) { if(is_metallic(uarmh)) { +/*JP pline("Fortunately, you are wearing a hard helmet."); +*/ + pline("幸運にも,あなたは固い兜を身につけている."); if (dmg > 2) dmg = 2; } else if (flags.verbose) { +#if 0 /*JP*/ Your("%s does not protect you.", xname(uarmh)); +#else + Your("%sでは守れない.", + xname(uarmh)); +#endif } } } else dmg = 0; /* Must be before the losehp(), for bones files */ +/*JP if (!flooreffects(otmp2, u.ux, u.uy, "fall")) { +*/ + if (!flooreffects(otmp2, u.ux, u.uy, "落ちる")) { place_object(otmp2, u.ux, u.uy); stackobj(otmp2); newsym(u.ux, u.uy); } +/*JP if (dmg) losehp(dmg, "scroll of earth", KILLED_BY_AN); +*/ + if (dmg) losehp(dmg, "大地の巻物で", KILLED_BY_AN); } } break; case SCR_PUNISHMENT: known = TRUE; if(confused || sobj->blessed) { +/*JP You_feel("guilty."); +*/ + You("罪を感じた."); break; } punish(sobj); @@ -1278,17 +1645,29 @@ case SCR_STINKING_CLOUD: { coord cc; +/*JP You("have found a scroll of stinking cloud!"); +*/ + You("悪臭雲の巻物を発見した!"); known = TRUE; +/*JP pline("Where do you want to center the cloud?"); +*/ + pline("雲の中心をどこにしますか?"); cc.x = u.ux; cc.y = u.uy; +/*JP if (getpos(&cc, TRUE, "the desired position") < 0) { +*/ + if (getpos(&cc, TRUE, "狙う場所") < 0) { pline(Never_mind); return 0; } if (!cansee(cc.x, cc.y) || distu(cc.x, cc.y) >= 32) { +/*JP You("smell rotten eggs."); +*/ + pline("くさった卵のにおいがした."); return 0; } (void) create_gas_cloud(cc.x, cc.y, 3+bcsign(sobj), @@ -1306,9 +1685,15 @@ register struct obj *obj; { obj->in_use = TRUE; /* in case losehp() is fatal */ +/*JP Your("%s vibrates violently, and explodes!",xname(obj)); +*/ + Your("%sは激しく振動し,爆発した!",xname(obj)); nhbell(); +/*JP losehp(rnd(2*(u.uhpmax+1)/3), "exploding wand", KILLED_BY_AN); +*/ + losehp(rnd(2*(u.uhpmax+1)/3), "杖の爆発で", KILLED_BY_AN); useup(obj); exercise(A_STR, FALSE); } @@ -1343,14 +1728,23 @@ if (!Blind) { if(u.uswallow) { +/*JP pline("It seems even darker in here than before."); +*/ + pline("前より暗くなったように見える."); return; } if (uwep && artifact_light(uwep) && uwep->lamplit) +/*JP pline("Suddenly, the only light left comes from %s!", +*/ + pline("突然,明かりが%sだけになった!", the(xname(uwep))); else +/*JP You("are surrounded by darkness!"); +*/ + You("暗闇に覆われた!"); } /* the magic douses lamps, et al, too */ @@ -1362,18 +1756,33 @@ if (Blind) goto do_it; if(u.uswallow){ if (is_animal(u.ustuck->data)) +#if 0 /*JP*/ pline("%s %s is lit.", s_suffix(Monnam(u.ustuck)), mbodypart(u.ustuck, STOMACH)); +#else + pline("%sの%sは明るくなった.", + Monnam(u.ustuck), + mbodypart(u.ustuck, STOMACH)); +#endif else if (is_whirly(u.ustuck->data)) +/*JP pline("%s shines briefly.", +*/ + pline("%sはちょっと輝いた.", Monnam(u.ustuck)); else +/*JP pline("%s glistens.", Monnam(u.ustuck)); +*/ + pline("%sはきらきら輝いた.", Monnam(u.ustuck)); return; } +/*JP pline("A lit field surrounds you!"); +*/ + pline("灯りがあなたを取り囲んだ!"); } do_it: @@ -1437,13 +1846,22 @@ return; } do { +/*JP getlin("What class of monsters do you wish to genocide?", +*/ + getlin("どのクラスに属する怪物を虐殺しますか?[文字を入れてね]", buf); (void)mungspaces(buf); } while (buf[0]=='\033' || !buf[0]); /* choosing "none" preserves genocideless conduct */ +#if 0 /*JP*/ if (!strcmpi(buf, "none") || !strcmpi(buf, "nothing")) return; +#else + if (!strcmpi(buf, "none") || + !strcmpi(buf, "なし") || + !strcmpi(buf, "nothing")) return; +#endif if (strlen(buf) == 1) { if (buf[0] == ILLOBJ_SYM) @@ -1474,10 +1892,16 @@ if (!goodcnt && class != mons[urole.malenum].mlet && class != mons[urace.malenum].mlet) { if (gonecnt) +/*JP pline("All such monsters are already nonexistent."); +*/ + pline("その怪物はもういない."); else if (immunecnt || (buf[0] == DEF_INVISIBLE && buf[1] == '\0')) +/*JP You("aren't permitted to genocide such monsters."); +*/ + You("その怪物を虐殺することはできない."); else #ifdef WIZARD /* to aid in topology testing; remove pesky monsters */ if (wizard && buf[0] == '*') { @@ -1490,11 +1914,17 @@ mongone(mtmp); gonecnt++; } +/*JP pline("Eliminated %d monster%s.", gonecnt, plur(gonecnt)); +*/ + pline("%dの怪物を除いた.", gonecnt); return; } else #endif +/*JP pline("That symbol does not represent any monster."); +*/ + pline("その記号の怪物はいない."); continue; } @@ -1516,11 +1946,17 @@ reset_rndmonst(i); kill_genocided_monsters(); update_inventory(); /* eggs & tins */ +/*JP pline("Wiped out all %s.", nam); +*/ + pline("%sを全て排除した.", jtrns_mon(nam)); if (Upolyd && i == u.umonnum) { u.mh = -1; if (Unchanging) { +/*JP if (!feel_dead++) You("die."); +*/ + if (!feel_dead++) You("死にました..."); /* finish genociding this class of monsters before ultimately dying */ gameover = TRUE; @@ -1533,15 +1969,24 @@ if (i == urole.malenum || i == urace.malenum) { u.uhp = -1; if (Upolyd) { +/*JP if (!feel_dead++) You_feel("dead inside."); +*/ + if (!feel_dead++) You("魂が死んだような気がした."); } else { +/*JP if (!feel_dead++) You("die."); +*/ + if (!feel_dead++) You("死にました..."); gameover = TRUE; } } } else if (mvitals[i].mvflags & G_GENOD) { if (!gameover) +/*JP pline("All %s are already nonexistent.", nam); +*/ + pline("%sは既にいない.", jtrns_mon(nam)); } else if (!gameover) { /* suppress feedback about quest beings except for those applicable to our own role */ @@ -1561,16 +2006,24 @@ /* one special case */ if (i == PM_HIGH_PRIEST) uniq = FALSE; +#if 0 /*JP*/ You("aren't permitted to genocide %s%s.", (uniq && !named) ? "the " : "", (uniq || named) ? mons[i].mname : nam); +#else + You("%sを虐殺できない.", + jtrns_mon((uniq || named) ? mons[i].mname : nam)); +#endif } } } } if (gameover || u.uhp == -1) { killer_format = KILLED_BY_AN; +/*JP killer = "scroll of genocide"; +*/ + killer = "虐殺の巻物で"; if (gameover) done(GENOCIDED); } return; @@ -1605,11 +2058,27 @@ pline(thats_enough_tries); return; } +/*JP getlin("What monster do you want to genocide? [type the name]", +*/ + getlin("どの怪物を虐殺しますか?", buf); (void)mungspaces(buf); +#if 1 /*JP*/ + { + const char *p; + p = etrns_mon(buf); + if(p) strcpy(buf, p); + } +#endif + /* choosing "none" preserves genocideless conduct */ +#if 0 /*JP*/ if (!strcmpi(buf, "none") || !strcmpi(buf, "nothing")) { +#else + if (!strcmpi(buf, "none") || !strcmpi(buf, "nothing") + || !strcmpi(buf, "なし")){ +#endif /* ... but no free pass if cursed */ if (!(how & REALLY)) { ptr = rndmonst(); @@ -1621,8 +2090,13 @@ mndx = name_to_mon(buf); if (mndx == NON_PM || (mvitals[mndx].mvflags & G_GENOD)) { +#if 0 /*JP*/ pline("Such creatures %s exist in this world.", (mndx == NON_PM) ? "do not" : "no longer"); +#else + pline("そのような生き物は%sこの世界に存在しない.", + (mndx == NON_PM) ? "" : "もはや"); +#endif continue; } ptr = &mons[mndx]; @@ -1640,8 +2114,14 @@ if(flags.soundok) { /* fixme: unconditional "caverns" will be silly in some circumstances */ if(flags.verbose) +/*JP pline("A thunderous voice booms through the caverns:"); +*/ + pline("雷のような声が洞窟に響いた:"); +/*JP verbalize("No, mortal! That will not be done."); +*/ + pline("「定命の者よ!その望みはかなうまい.」"); } continue; } @@ -1652,7 +2132,10 @@ } } +/*JP which = "all "; +*/ + which = "全て"; if (Hallucination) { if (Upolyd) Strcpy(buf,youmonst.data->mname); @@ -1664,13 +2147,20 @@ } else { Strcpy(buf, ptr->mname); /* make sure we have standard singular */ if ((ptr->geno & G_UNIQ) && ptr != &mons[PM_HIGH_PRIEST]) +/*JP which = !type_is_pname(ptr) ? "the " : ""; +*/ + which = !type_is_pname(ptr) ? "" : ""; } if (how & REALLY) { /* setting no-corpse affects wishing and random tin generation */ mvitals[mndx].mvflags |= (G_GENOD | G_NOCORPSE); +#if 0 /*JP*/ pline("Wiped out %s%s.", which, (*which != 'a') ? buf : makeplural(buf)); +#else + pline("%sを%s一掃した.", jtrns_mon(buf), which); +#endif if (killplayer) { /* might need to wipe out dual role */ @@ -1686,14 +2176,23 @@ u.uhp = -1; if (how & PLAYER) { killer_format = KILLED_BY; +/*JP killer = "genocidal confusion"; +*/ + killer = "混乱による自虐的虐殺で"; } else if (how & ONTHRONE) { /* player selected while on a throne */ killer_format = KILLED_BY_AN; +/*JP killer = "imperious order"; +*/ + killer = "傲慢な命令で"; } else { /* selected player deliberately, not confused */ killer_format = KILLED_BY_AN; +/*JP killer = "scroll of genocide"; +*/ + killer = "虐殺の巻物で"; } /* Polymorphed characters will die as soon as they're rehumanized. */ @@ -1701,7 +2200,10 @@ if (Upolyd && ptr != youmonst.data) { delayed_killer = killer; killer = 0; +/*JP You_feel("dead inside."); +*/ + You("魂が死んだような気がした."); } else done(GENOCIDED); } else if (ptr == youmonst.data) { @@ -1723,7 +2225,10 @@ break; /* just made last one */ } if (cnt) +/*JP pline("Sent in some %s.", makeplural(buf)); +*/ + pline("%sが送られてきた.", jtrns_mon(buf)); else pline(nothing_happens); } @@ -1734,14 +2239,23 @@ register struct obj *sobj; { /* KMH -- Punishment is still okay when you are riding */ +/*JP You("are being punished for your misbehavior!"); +*/ + You("不作法のため罰を受けた!"); if(Punished){ +/*JP Your("iron ball gets heavier."); +*/ + Your("鉄球はさらに重くなった."); uball->owt += 160 * (1 + sobj->cursed); return; } if (amorphous(youmonst.data) || is_whirly(youmonst.data) || unsolid(youmonst.data)) { +/*JP pline("A ball and chain appears, then falls away."); +*/ + pline("鉄球と鎖が現われたが,するっと抜けた."); dropy(mkobj(BALL_CLASS, TRUE)); return; } @@ -1817,9 +2331,19 @@ do { which = urole.malenum; /* an arbitrary index into mons[] */ maketame = makepeaceful = makehostile = FALSE; +/*JP getlin("Create what kind of monster? [type the name or symbol]", +*/ + getlin("どの種の怪物を作りますか?[名前を入れてね]", buf); bufp = mungspaces(buf); +#if 1 /*JP*/ + { + const char *p; + p = etrns_mon(buf); + if(p) strcpy(buf, p); + } +#endif if (*bufp == '\033') return FALSE; /* allow the initial disposition to be specified */ if (!strncmpi(bufp, "tame ", 5)) { @@ -1841,7 +2365,10 @@ if (which >= LOW_PM) break; /* got one */ } /* no good; try again... */ +/*JP pline("I've never heard of such monsters."); +*/ + pline("そのような怪物は聞いたことがない."); } while (++tries < 5); if (tries == 5) { diff -aurbN -xCVS -xXTAGS nethack/src/region.c jnethack/src/region.c --- nethack/src/region.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/region.c 2003-12-25 20:23:10.000000000 +0900 @@ -910,12 +910,24 @@ if (!Blind) make_blinded(1L, FALSE); if (!Poison_resistance) { +/*JP pline("%s is burning your %s!", Something, makeplural(body_part(LUNG))); +*/ + pline("何か妙なものを吸いこんだ!"); +/*JP You("cough and spit blood!"); +*/ + You("咳きこみ,血を吐いた!"); +/*JP losehp(rnd(dam) + 5, "gas cloud", KILLED_BY_AN); +*/ + losehp(rnd(dam) + 5, "ガス雲で", KILLED_BY_AN); return FALSE; } else { +/*JP You("cough!"); +*/ + You("咳きこんだ!"); return FALSE; } } else { /* A monster is inside the cloud */ @@ -924,7 +936,10 @@ /* Non living and non breathing monsters are not concerned */ if (!nonliving(mtmp->data) && !breathless(mtmp->data)) { if (cansee(mtmp->mx, mtmp->my)) +/*JP pline("%s coughs!", Monnam(mtmp)); +*/ + pline("%sは咳きこんだ!", Monnam(mtmp)); setmangry(mtmp); if (haseyes(mtmp->data) && mtmp->mcansee) { mtmp->mblinded = 1; @@ -937,7 +952,10 @@ if (heros_fault(reg)) killed(mtmp); else +/*JP monkilled(mtmp, "gas cloud", AD_DRST); +*/ + monkilled(mtmp, "ガス雲", AD_DRST); if (mtmp->mhp <= 0) { /* not lifesaved */ return TRUE; } diff -aurbN -xCVS -xXTAGS nethack/src/restore.c jnethack/src/restore.c --- nethack/src/restore.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/restore.c 2003-12-10 03:31:57.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "lev.h" #include "tcap.h" /* for TERMLIB and ASCIIGRAPH */ @@ -118,7 +125,11 @@ } else #endif /* GOLDOBJ */ if (otmp->in_use) { +#if 0 /*JP*/ if (!quietly) pline("Finishing off %s...", xname(otmp)); +#else + if (!quietly) pline("%sを使い終えた...", xname(otmp)); +#endif useup(otmp); } } @@ -367,7 +378,11 @@ if (uid != getuid()) { /* strange ... */ /* for wizard mode, issue a reminder; for others, treat it as an attempt to cheat and refuse to restore this file */ +#if 0 /*JP*/ pline("Saved game was not yours."); +#else + pline("セーブされたゲームはあなたのものではない."); +#endif #ifdef WIZARD if (!wizard) #endif @@ -389,7 +404,11 @@ #endif if(u.uhp <= 0 && (!Upolyd || u.mh <= 0)) { u.ux = u.uy = 0; /* affects pline() [hence You()] */ +#if 0 /*JP*/ You("were not healthy enough to survive restoration."); +#else + You("再開できるほど健康ではなかった."); +#endif /* wiz1_level.dlevel is used by mklev.c to see if lots of stuff is * uninitialized, so we only have to set it and not the other stuff. */ @@ -501,7 +520,11 @@ /* The savelev can't proceed because the size required * is greater than the available disk space. */ +#if 0 /*JP*/ pline("Not enough space on `%s' to restore your game.", +#else + pline("ゲームを再開するための`%s'のためのスペースがない.", +#endif levels); /* Remove levels and bones that may have been created. @@ -527,7 +550,11 @@ return dorecover(fd); /* 0 or 1 */ } else { # endif +#if 0 /*JP*/ pline("Be seeing you..."); +#else + pline("また会いましょう..."); +#endif terminate(EXIT_SUCCESS); # ifndef AMIGA } @@ -593,10 +620,17 @@ clear_nhwindow(WIN_MAP); # endif clear_nhwindow(WIN_MESSAGE); +#if 0 /*JP*/ You("return to level %d in %s%s.", depth(&u.uz), dungeons[u.uz.dnum].dname, flags.debug ? " while in debug mode" : flags.explore ? " while in explore mode" : ""); +#else + You("%s%sの地下%d階に戻ってきた.", + flags.debug ? "ウィザードモード中の" : + flags.explore ? "探検モード中の" : "", + jtrns_obj('d',dungeons[u.uz.dnum].dname), depth(&u.uz)); +#endif curs(WIN_MAP, 1, 1); dotcnt = 0; dotrow = 2; @@ -685,9 +719,15 @@ trickery(reason) char *reason; { +#if 0 /*JP*/ pline("Strange, this map is not as I remember it."); pline("Somebody is trying some trickery here..."); pline("This game is void."); +#else + pline("妙だ,この地図は私が覚えていたものと違う..."); + pline("だれかがここでいかさまをしようとしたようだ..."); + pline("このゲームは無効となる."); +#endif killer = reason; done(TRICKED); } diff -aurbN -xCVS -xXTAGS nethack/src/rip.c jnethack/src/rip.c --- nethack/src/rip.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/rip.c 2003-12-10 03:31:57.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" STATIC_DCL void FDECL(center, (int, char *)); @@ -120,28 +127,78 @@ switch (killer_format) { default: impossible("bad killer format?"); case KILLED_BY_AN: +#if 0 /*JP*/ Strcpy(buf, killed_by_prefix[how]); Strcat(buf, an(killer)); +#else + Strcpy(buf, an(killer)); + Strcat(buf, killed_by_prefix[how]); +#endif break; case KILLED_BY: +#if 0 /*JP*/ Strcpy(buf, killed_by_prefix[how]); Strcat(buf, killer); +#else + Strcpy(buf, killer); + Strcat(buf, killed_by_prefix[how]); +#endif break; case NO_KILLER_PREFIX: Strcpy(buf, killer); break; +#if 1 /*JP*/ + case KILLED_SUFFIX: + Strcpy(buf, killer); + Strcat(buf, "に殺された"); +#endif } /* Put death type on stone */ for (line=DEATH_LINE, dpx = buf; line STONE_LINE_LEN) { for(i = STONE_LINE_LEN; ((i0 > STONE_LINE_LEN) && i); i--) +#else + if ( i0 > jstone_line) { + for(i = jstone_line; + ((i0 > jstone_line) && i); i--) +#endif if(dpx[i] == ' ') i0 = i; +#if 0 /*JP*/ if(!i) i0 = STONE_LINE_LEN; +#else + if(!i){ + i0=0; +/* + while(i0 1 && post_attribs < num_post_attribs && post_attribs > 1) @@ -1064,6 +1284,12 @@ Strcat(buf, " "); --post_attribs; if (!post_attribs && num_post_attribs > 1) Strcat(buf, conj); +#else + if(num_post_attribs > post_attribs){ + Strcat(buf, ","); + } + --post_attribs; +#endif return buf; } @@ -1100,7 +1326,10 @@ { int k, gendercount = 0, aligncount = 0; char buf[BUFSZ]; +/*JP static char err_ret[] = " character's"; +*/ + static char err_ret[] = "キャラクターの"; boolean donefirst = FALSE; if (!suppliedbuf || buflen < 1) return err_ret; @@ -1119,12 +1348,22 @@ if (alignnum != ROLE_NONE && alignnum != ROLE_RANDOM) { /* if race specified, and multiple choice of alignments for it */ if ((racenum >= 0) && (aligncount > 1)) { +#if 0 /*JP*/ if (donefirst) Strcat(buf, " "); Strcat(buf, aligns[alignnum].adj); +#else + if (donefirst) Strcat(buf, "の"); + Strcat(buf, aligns[alignnum].j); +#endif donefirst = TRUE; } else { +#if 0 /*JP*/ if (donefirst) Strcat(buf, " "); Strcat(buf, aligns[alignnum].adj); +#else + if (donefirst) Strcat(buf, "の"); + Strcat(buf, aligns[alignnum].j); +#endif donefirst = TRUE; } } else { @@ -1151,13 +1390,23 @@ and name of role itself does not distinguish gender */ if ((rolenum != ROLE_NONE) && (gendercount > 1) && !roles[rolenum].name.f) { +#if 0 /*JP*/ if (donefirst) Strcat(buf, " "); Strcat(buf, genders[gendnum].adj); +#else + if (donefirst) Strcat(buf, "の"); + Strcat(buf, genders[gendnum].j); +#endif donefirst = TRUE; } } else { +#if 0 /*JP*/ if (donefirst) Strcat(buf, " "); Strcat(buf, genders[gendnum].adj); +#else + if (donefirst) Strcat(buf, "の"); + Strcat(buf, genders[gendnum].j); +#endif donefirst = TRUE; } } else { @@ -1173,14 +1422,24 @@ if (racenum != ROLE_NONE && racenum != ROLE_RANDOM) { if (validrole(rolenum) && ok_race(rolenum, racenum, gendnum, alignnum)) { +#if 0 /*JP*/ if (donefirst) Strcat(buf, " "); Strcat(buf, (rolenum == ROLE_NONE) ? races[racenum].noun : races[racenum].adj); +#else + if (donefirst) Strcat(buf, "の"); + Strcat(buf, races[racenum].j); +#endif donefirst = TRUE; } else if (!validrole(rolenum)) { +#if 0 /*JP*/ if (donefirst) Strcat(buf, " "); Strcat(buf, races[racenum].noun); +#else + if (donefirst) Strcat(buf, "の"); + Strcat(buf, races[racenum].j); +#endif donefirst = TRUE; } else { pa[BP_RACE] = 1; @@ -1193,19 +1452,38 @@ /* || */ if (validrole(rolenum)) { +/*JP if (donefirst) Strcat(buf, " "); +*/ + if (donefirst) Strcat(buf, "の"); if (gendnum != ROLE_NONE) { +#if 0 /*JP*/ if (gendnum == 1 && roles[rolenum].name.f) Strcat(buf, roles[rolenum].name.f); else Strcat(buf, roles[rolenum].name.m); +#else + if (gendnum == 1 && roles[rolenum].jname.f) + Strcat(buf, roles[rolenum].jname.f); + else + Strcat(buf, roles[rolenum].jname.m); +#endif } else { +#if 0 /*JP*/ if (roles[rolenum].name.f) { Strcat(buf, roles[rolenum].name.m); Strcat(buf, "/"); Strcat(buf, roles[rolenum].name.f); } else Strcat(buf, roles[rolenum].name.m); +#else + if (roles[rolenum].jname.f) { + Strcat(buf, roles[rolenum].jname.m); + Strcat(buf, "/"); + Strcat(buf, roles[rolenum].jname.f); + } else + Strcat(buf, roles[rolenum].jname.m); +#endif } donefirst = TRUE; } else if (rolenum == ROLE_NONE) { @@ -1214,10 +1492,18 @@ } if ((racenum == ROLE_NONE || racenum == ROLE_RANDOM) && !validrole(rolenum)) { +#if 0 /*JP*/ if (donefirst) Strcat(buf, " "); Strcat(buf, "character"); +#else + if (donefirst) Strcat(buf, "の"); + Strcat(buf, "キャラクター"); +#endif donefirst = TRUE; } +#if 1 /*JP*/ + Strcat(buf, "の"); +#endif /* || * || */ @@ -1233,19 +1519,26 @@ char *buf; int buflen, rolenum, racenum, gendnum, alignnum; { +/*JP const char *defprompt = "Shall I pick a character for you? [ynq] "; +*/ + const char *defprompt = "適当にキャラクターを選んでよいですか?[ynq] "; int num_post_attribs = 0; char tmpbuf[BUFSZ]; if (buflen < QBUFSZ) return (char *)defprompt; +#if 0 /*JP*/ Strcpy(tmpbuf, "Shall I pick "); if (racenum != ROLE_NONE || validrole(rolenum)) Strcat(tmpbuf, "your "); else { Strcat(tmpbuf, "a "); } +#else + Strcpy(tmpbuf, ""); +#endif /* */ (void) root_plselection_prompt(eos(tmpbuf), buflen - strlen(tmpbuf), @@ -1263,22 +1556,37 @@ if (post_attribs) { if (pa[BP_RACE]) { (void) promptsep(eos(buf), num_post_attribs); +/*JP Strcat(buf, "race"); +*/ + Strcat(buf, "種族"); } if (pa[BP_ROLE]) { (void) promptsep(eos(buf), num_post_attribs); +/*JP Strcat(buf, "role"); +*/ + Strcat(buf, "職業"); } if (pa[BP_GEND]) { (void) promptsep(eos(buf), num_post_attribs); +/*JP Strcat(buf, "gender"); +*/ + Strcat(buf, "性別"); } if (pa[BP_ALIGN]) { (void) promptsep(eos(buf), num_post_attribs); +/*JP Strcat(buf, "alignment"); +*/ + Strcat(buf, "属性"); } } +/*JP Strcat(buf, " for you? [ynq] "); +*/ + Strcat(buf, "を適当に選んでよろしいですか?[ynq] "); return buf; } @@ -1444,6 +1752,10 @@ return; } +#if 0 /*JP*/ +/* + あいさつは日本語として自然になるよう大きく仕様を変更 + */ const char * Hello(mtmp) struct monst *mtmp; @@ -1456,14 +1768,22 @@ "Irasshaimase" : "Konnichi wa"); /* Japanese */ #ifdef TOURIST case PM_TOURIST: +# if 0 /*JP*/ return ("Aloha"); /* Hawaiian */ +# else + return ("アローハ"); /* Hawaiian */ +# endif #endif case PM_VALKYRIE: return ( #ifdef MAIL mtmp && mtmp->data == &mons[PM_MAIL_DAEMON] ? "Hallo" : #endif +#if 0 /*JP*/ "Velkommen"); /* Norse */ +#else + "ようこそ"); +#endif default: return ("Hello"); } @@ -1487,5 +1807,94 @@ return ("Goodbye"); } } +#else +const char * +Hello(mtmp, nameflg) +struct monst *mtmp; +int nameflg; +{ + static char helo_buf[BUFSZ]; + + + switch (Role_switch) { + case PM_KNIGHT: + if(nameflg) + Sprintf(helo_buf, "よくぞ參った%sよ", plname); + else + Sprintf(helo_buf, "よくぞ參った"); + break; + case PM_SAMURAI: + if(nameflg) + Sprintf(helo_buf, "よくぞ参られた%sよ", plname); + else + Sprintf(helo_buf, "よくぞ参られた"); + break; +#ifdef TOURIST + case PM_TOURIST: + if(nameflg) + Sprintf(helo_buf, "アローハ%s", plname); + else + Sprintf(helo_buf, "アローハ"); + break; +#endif + case PM_VALKYRIE: + if(nameflg) + Sprintf(helo_buf, "魂の守護者%sよ", plname); + else + Sprintf(helo_buf, "魂の守護者"); + break; + default: + if(nameflg) + Sprintf(helo_buf, "ようこそ%s", plname); + else + Sprintf(helo_buf, "ようこそ"); + break; + } + + return helo_buf; +} +const char * +Goodbye(int nameflg) +{ + static char helo_buf[BUFSZ]; + + switch (Role_switch) { + case PM_KNIGHT: + if(nameflg) + Sprintf(helo_buf, "さらば敬虔なる騎士の%sよ", plname); + else + Sprintf(helo_buf, "さらば敬虔なる"); + break; + case PM_SAMURAI: + if(nameflg) + Sprintf(helo_buf, "さらば武士道を志す%sよ", plname); + else + Sprintf(helo_buf, "さらば武士道を志す"); + break; +#ifdef TOURIST + case PM_TOURIST: + if(nameflg) + Sprintf(helo_buf, "アローハ%s", plname); + else + Sprintf(helo_buf, "アローハ"); + break; +#endif + case PM_VALKYRIE: + if(nameflg) + Sprintf(helo_buf, "さらば魂の守護者%sよ", plname); + else + Sprintf(helo_buf, "さらば魂の守護者"); + break; + default: + if(nameflg) + Sprintf(helo_buf, "さようなら%s", plname); + else + Sprintf(helo_buf, "さようなら"); + break; + } + + return helo_buf; +} +#endif /* role.c */ diff -aurbN -xCVS -xXTAGS nethack/src/rumors.c jnethack/src/rumors.c --- nethack/src/rumors.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/rumors.c 2003-12-10 03:31:57.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "lev.h" #include "dlb.h" @@ -28,6 +35,12 @@ * and placed there by 'makedefs'. */ +#if defined(_MSC_VER) && !defined(WIN32) +#include "../japanese/emalloc.h" +#define alloc(s) emalloc(s) +#endif + + STATIC_DCL void FDECL(init_rumors, (dlb *)); STATIC_DCL void FDECL(init_oracles, (dlb *)); @@ -128,7 +141,10 @@ else exercise(A_WIS, (adjtruth > 0)); } else { +/*JP pline("Can't open rumors file!"); +*/ + pline("rumorsファイルが開けない!"); true_rumor_size = -1; /* don't try to open it again */ } return rumor_buf; @@ -140,7 +156,10 @@ int mechanism; { static const char fortune_msg[] = +/*JP "This cookie has a scrap of paper inside."; +*/ + "このクッキーには紙切が入っている."; const char *line; char buf[BUFSZ]; boolean reading = (mechanism == BY_COOKIE || @@ -153,19 +172,31 @@ else if (Blind) { if (mechanism == BY_COOKIE) pline(fortune_msg); +/*JP pline("What a pity that you cannot read it!"); +*/ + pline("それを読めないなんて気の毒な!"); return; } } line = getrumor(truth, buf, reading ? FALSE : TRUE); if (!*line) +/*JP line = "NetHack rumors file closed for renovation."; +*/ + line = "噂の真相は刷新のため休刊している."; switch (mechanism) { case BY_ORACLE: /* Oracle delivers the rumor */ +#if 0 /*JP*/ pline("True to her word, the Oracle %ssays: ", (!rn2(4) ? "offhandedly " : (!rn2(3) ? "casually " : (rn2(2) ? "nonchalantly " : "")))); +#else + pline("約束どおりに,賢者は%s述べた:", + (!rn2(4) ? "無造作に" : (!rn2(3) ? "何気なく" : + (rn2(2) ? "無頓着に" : "")))); +#endif verbalize("%s", line); exercise(A_WIS, TRUE); return; @@ -173,7 +204,10 @@ pline(fortune_msg); /* FALLTHRU */ case BY_PAPER: +/*JP pline("It reads:"); +*/ + pline("それを読んだ:"); break; } pline("%s", line); @@ -264,10 +298,18 @@ tmpwin = create_nhwindow(NHW_TEXT); if (delphi) putstr(tmpwin, 0, special ? +#if 0 /*JP*/ "The Oracle scornfully takes all your money and says:" : "The Oracle meditates for a moment and then intones:"); +#else + "賢者は軽蔑したようにあなたの全てのお金を受けとり,述べた:" : + "賢者はしばらく冥想し,詠唱した:"); +#endif else +/*JP putstr(tmpwin, 0, "The message reads:"); +*/ + putstr(tmpwin, 0, "メッセージ:"); putstr(tmpwin, 0, ""); while(dlb_fgets(line, COLNO, oracles) && strcmp(line,"---\n")) { @@ -278,7 +320,10 @@ destroy_nhwindow(tmpwin); (void) dlb_fclose(oracles); } else { +/*JP pline("Can't open oracles file!"); +*/ + pline("oraclesファイルを開けない!"); oracle_flg = -1; /* don't try to open it again */ } } @@ -297,22 +342,34 @@ multi = 0; if (!oracl) { +/*JP There("is no one here to consult."); +*/ + pline("ここには神託を述べる人はいない."); return 0; } else if (!oracl->mpeaceful) { +/*JP pline("%s is in no mood for consultations.", Monnam(oracl)); +*/ + pline("賢者は神託を告げてくれる雰囲気ではない."); return 0; #ifndef GOLDOBJ } else if (!u.ugold) { #else } else if (!umoney) { #endif +/*JP You("have no money."); +*/ + You("お金がない."); return 0; } Sprintf(qbuf, +/*JP "\"Wilt thou settle for a minor consultation?\" (%d %s)", +*/ + "「汝,低位の神託を受けるか?」(%d%s)", minor_cost, currency((long)minor_cost)); switch (ynq(qbuf)) { default: @@ -324,7 +381,10 @@ #else if (umoney < (long)minor_cost) { #endif +/*JP You("don't even have enough money for that!"); +*/ + You("これに払えるだけのお金すら持っていない!"); return 0; } u_pay = minor_cost; @@ -337,7 +397,10 @@ #endif (oracle_cnt == 1 || oracle_flg < 0)) return 0; Sprintf(qbuf, +/*JP "\"Then dost thou desire a major one?\" (%d %s)", +*/ + "「ならば汝,高位の神託を受けるか?」(%d%s)", major_cost, currency((long)major_cost)); if (yn(qbuf) != 'y') return 0; #ifndef GOLDOBJ diff -aurbN -xCVS -xXTAGS nethack/src/save.c jnethack/src/save.c --- nethack/src/save.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/save.c 2003-12-10 03:31:58.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "lev.h" #include "quest.h" @@ -55,12 +62,18 @@ dosave() { clear_nhwindow(WIN_MESSAGE); +/*JP if(yn("Really save?") == 'n') { +*/ + if(yn("本当に保存する?") == 'n') { clear_nhwindow(WIN_MESSAGE); if(multi > 0) nomul(0); } else { clear_nhwindow(WIN_MESSAGE); +/*JP pline("Saving..."); +*/ + pline("保存中..."); #if defined(UNIX) || defined(VMS) || defined(__EMX__) program_state.done_hup = 0; #endif @@ -69,7 +82,10 @@ u.uhp = -1; /* universal game's over indicator */ /* make sure they see the Saving message */ display_nhwindow(WIN_MESSAGE, TRUE); +/*JP exit_nhwindows("Be seeing you..."); +*/ + exit_nhwindows("また会いましょう..."); terminate(EXIT_SUCCESS); } else (void)doredraw(); } @@ -139,8 +155,14 @@ if (fd > 0) { (void) close(fd); clear_nhwindow(WIN_MESSAGE); +/*JP There("seems to be an old save file."); +*/ + pline("前にセーブしたファイルがあります."); +/*JP if (yn("Overwrite the old file?") == 'n') { +*/ + if (yn("古いファイルに上書きしますか?") == 'n') { compress(fq_save); return 0; } diff -aurbN -xCVS -xXTAGS nethack/src/shk.c jnethack/src/shk.c --- nethack/src/shk.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/shk.c 2005-04-26 02:36:37.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "eshk.h" @@ -143,7 +150,11 @@ obj_extract_self(mongold); if (!merge_choice(invent, mongold) && inv_cnt() >= 52) { +#if 0 /*JP*/ You("have no room for the money!"); +#else + You("お金を持つ余裕がない!"); +#endif dropy(mongold); } else { addinv(mongold); @@ -335,7 +346,10 @@ if(!shkp) return; if (flags.soundok) +/*JP pline("An alarm sounds!"); +*/ + pline("警報が鳴りひびいた!"); nokops = ((mvitals[PM_KEYSTONE_KOP].mvflags & G_GONE) && (mvitals[PM_KOP_SERGEANT].mvflags & G_GONE) && @@ -344,7 +358,10 @@ if(!angry_guards(!flags.soundok) && nokops) { if(flags.verbose && flags.soundok) +/*JP pline("But no one seems to respond to it."); +*/ + pline("しかし誰も応答しなかった."); return; } @@ -356,14 +373,20 @@ if (nearshop) { /* Create swarm around you, if you merely "stepped out" */ if (flags.verbose) +/*JP pline_The("Keystone Kops appear!"); +*/ + pline("警備員が現われた!"); mm.x = u.ux; mm.y = u.uy; makekops(&mm); return; } if (flags.verbose) +/*JP pline_The("Keystone Kops are after you!"); +*/ + pline("警備員がいる!"); /* Create swarm near down staircase (hinders return to level) */ mm.x = xdnstair; mm.y = ydnstair; @@ -423,8 +446,13 @@ * Try to intimidate him into paying his bill */ verbalize(NOTANGRY(shkp) ? +#if 0 /*JP*/ "%s! Please pay before leaving." : "%s! Don't you leave without paying!", +#else + "%sさん!帰る前に,お金を払っていただけませんか." : + "%s!帰る前に,金を払え!", +#endif plname); return; } @@ -477,11 +505,18 @@ rouse_shk(shkp, TRUE); total = (addupbill(shkp) + eshkp->debit); if (eshkp->credit >= total) { +#if 0 /*JP*/ Your("credit of %ld %s is used to cover your shopping bill.", +#else + Your("預け金から%ld%sが勘定の支払いに使われた.", +#endif eshkp->credit, currency(eshkp->credit)); total = 0L; /* credit gets cleared by setpaid() */ } else { +/*JP You("escaped the shop without paying!"); +*/ + You("金を払わずに店から逃げた!"); total -= eshkp->credit; } setpaid(shkp); @@ -489,7 +524,11 @@ /* by this point, we know an actual robbery has taken place */ eshkp->robbed += total; +#if 0 /*JP*/ You("stole %ld %s worth of merchandise.", +#else + You("雑貨を%ld%s分盗んだ.", +#endif total, currency(total)); if (!Role_if(PM_ROGUE)) /* stealing is unlawful */ adjalign(-sgn(u.ualign.type)); @@ -506,7 +545,10 @@ register int rt; register struct monst *shkp; register struct eshk *eshkp; +/*JP static const char no_shk[] = "This shop appears to be deserted."; +*/ + static const char no_shk[] = "店は廃虚と化している."; static char empty_shops[5]; if(!*enterstring) @@ -549,26 +591,46 @@ return; /* no dialog */ if (Invis) { +/*JP pline("%s senses your presence.", shkname(shkp)); +*/ + pline("%sはあなたの存在に気がついた.", shkname(shkp)); +/*JP verbalize("Invisible customers are not welcome!"); +*/ + verbalize("透明なお客さんとは感心しないな!"); return; } rt = rooms[*enterstring - ROOMOFFSET].rtype; if (ANGRY(shkp)) { +/*JP verbalize("So, %s, you dare return to %s %s?!", +*/ + verbalize("%s!わざわざ%sの%sに戻ってきたのか?!", plname, s_suffix(shkname(shkp)), shtypes[rt - SHOPBASE].name); } else if (eshkp->robbed) { +/*JP pline("%s mutters imprecations against shoplifters.", shkname(shkp)); +*/ + pline("%sは泥棒をののしった.", shkname(shkp)); } else { +#if 0 /*JP*/ verbalize("%s, %s! Welcome%s to %s %s!", Hello(shkp), plname, eshkp->visitct++ ? " again" : "", s_suffix(shkname(shkp)), shtypes[rt - SHOPBASE].name); +#else + verbalize("%s!%sの%sに%s!", + Hello(shkp, TRUE), + shkname(shkp), + shtypes[rt - SHOPBASE].name, + eshkp->visitct++ ? "また来ましたね" : "ようこそ"); +#endif } /* can't do anything about blocking if teleported in */ if (!inside_shop(u.ux, u.uy)) { @@ -581,30 +643,50 @@ if (pick || mattock) { cnt = 1; /* so far */ if (pick && mattock) { /* carrying both types */ +/*JP tool = "digging tool"; +*/ + tool = "掘る道具"; cnt = 2; /* `more than 1' is all that matters */ } else if (pick) { +/*JP tool = "pick-axe"; +*/ + tool = "つるはし"; /* hack: `pick' already points somewhere into inventory */ while ((pick = pick->nobj) != 0) if (pick->otyp == PICK_AXE) ++cnt; } else { /* assert(mattock != 0) */ +/*JP tool = "mattock"; +*/ + tool = "つるはし"; while ((mattock = mattock->nobj) != 0) if (mattock->otyp == DWARVISH_MATTOCK) ++cnt; /* [ALI] Shopkeeper identifies mattock(s) */ if (!Blind) makeknown(DWARVISH_MATTOCK); } verbalize(NOTANGRY(shkp) ? +#if 0 /*JP*/ "Will you please leave your %s%s outside?" : "Leave the %s%s outside.", tool, plur(cnt)); +#else + "%sを外に置いてきていただけませんか?" : + "%sを外へ置いてこい!", + tool); +#endif should_block = TRUE; #ifdef STEED } else if (u.usteed) { verbalize(NOTANGRY(shkp) ? +#if 0 /*JP*/ "Will you please leave %s outside?" : "Leave %s outside.", y_monnam(u.usteed)); +#else + "%sを外に置いてきていただけませんか?" : + "%sを外へ置いてこい!", y_monnam(u.usteed)); +#endif should_block = TRUE; #endif } else { @@ -677,7 +759,10 @@ if (this_shkp && !(ESHK(this_shkp)->credit || shop_debt(ESHK(this_shkp)))) { +/*JP You("have no credit or debt in here."); +*/ + You("預け金も借金もない."); this_shkp = 0; /* skip first pass */ } @@ -689,16 +774,30 @@ if ((shkp != this_shkp) ^ pass) continue; eshkp = ESHK(shkp); if ((amt = eshkp->credit) != 0) +#if 0 /*JP*/ You("have %ld %s credit at %s %s.", +#else + You("%ld%sの預け金が%sの%sにある.", +#endif amt, currency(amt), s_suffix(shkname(shkp)), shtypes[eshkp->shoptype - SHOPBASE].name); else if (shkp == this_shkp) +/*JP You("have no credit in here."); +*/ + You("預け金はない."); if ((amt = shop_debt(eshkp)) != 0) +#if 0 /*JP*/ You("owe %s %ld %s.", +#else + You("%sに%ld%sの借りがある.", +#endif shkname(shkp), amt, currency(amt)); else if (shkp == this_shkp) +/*JP You("don't owe any money here."); +*/ + pline("この店に借りはない."); } } @@ -755,11 +854,17 @@ while (--ct >= 0) if (bp->bo_id == obj->o_id) { +/*JP if (!obj->unpaid) pline("onbill: paid obj on bill?"); +*/ + if (!obj->unpaid) pline("勘定:払う?"); return bp; } else bp++; } +/*JP if(obj->unpaid & !silent) pline("onbill: unpaid obj not on bill?"); +*/ + if(obj->unpaid & !silent) pline("勘定:払わない?"); return (struct bill_x *)0; } @@ -847,11 +952,17 @@ if(credit == 0L) return(tmp); if(credit >= tmp) { +/*JP pline_The("price is deducted from your credit."); +*/ + pline("代金は預け金から差し引かれた."); ESHK(shkp)->credit -=tmp; tmp = 0L; } else { +/*JP pline_The("price is partially covered by your credit."); +*/ + pline("代金の一部はあなたの預け金で補われた."); ESHK(shkp)->credit = 0L; tmp -= credit; } @@ -897,7 +1008,10 @@ #ifdef KOPS kops_gone(TRUE); #else +/*JP You_feel("vaguely apprehensive."); +*/ + You("なんとなく不安に思った."); #endif pacify_guards(); } @@ -962,8 +1076,13 @@ if (!shkp->mcanmove || shkp->msleeping) { /* greed induced recovery... */ if (verbosely && canspotmon(shkp)) +#if 0 /*JP*/ pline("%s %s.", Monnam(shkp), shkp->msleeping ? "wakes up" : "can move again"); +#else + pline("%sは%s.", Monnam(shkp), + shkp->msleeping ? "目が覚めた" : "ふたたび動けるようになった"); +#endif shkp->msleeping = 0; shkp->mfrozen = 0; shkp->mcanmove = 1; @@ -1003,9 +1122,15 @@ MIGR_APPROX_XY, &eshkp->shd); } if (vanished) +/*JP pline("Satisfied, %s suddenly disappears!", shk_nam); +*/ + pline("%sは満足すると,突然消えた!", shk_nam); } else if(wasmad) +/*JP pline("%s calms down.", Monnam(shkp)); +*/ + pline("%sは落着いた.", Monnam(shkp)); if(!angry_shk_exists()) { #ifdef KOPS @@ -1055,15 +1180,28 @@ sx = shkp->mx, sy = shkp->my; if (isok(ox, oy) && cansee(ox, oy) && !cansee(sx, sy)) shkp->mx = ox, shkp->my = oy; +#if 0 /*JP*/ pline("%s %s!", Monnam(shkp), !ANGRY(shkp) ? "gets angry" : "is furious"); +#else + pline("%sは%s!", Monnam(shkp), + !ANGRY(shkp) ? "怒った" : "怒り狂った"); +#endif shkp->mx = sx, shkp->my = sy; hot_pursuit(shkp); } +/*JP STATIC_VAR const char no_money[] = "Moreover, you%s have no money."; +*/ +STATIC_VAR const char no_money[] = "しかしあなたはお金がない%s."; +#if 0 /*JP:T*/ STATIC_VAR const char not_enough_money[] = "Besides, you don't have enough to interest %s."; +#else +STATIC_VAR const char not_enough_money[] = + "しかも,あなたは%sが興味を持つほどお金を持っていない!"; +#endif #else STATIC_VAR const char no_money[]; @@ -1123,12 +1261,18 @@ } if ((!sk && (!Blind || Blind_telepat)) || (!Blind && !seensk)) { +/*JP There("appears to be no shopkeeper here to receive your payment."); +*/ + pline("支払いを受けとる店主はここにはいないようだ."); return(0); } if(!seensk) { +/*JP You_cant("see..."); +*/ + You("見ることができない..."); return(0); } @@ -1144,7 +1288,10 @@ shkp; shkp = next_shkp(shkp->nmon, FALSE)) if (canspotmon(shkp)) break; if (shkp != resident && distu(shkp->mx, shkp->my) > 2) { +/*JP pline("%s is not near enough to receive your payment.", +*/ + pline("%sは遠くにいるので支払えない.", Monnam(shkp)); return(0); } @@ -1153,33 +1300,54 @@ coord cc; int cx, cy; +/*JP pline("Pay whom?"); +*/ + pline("誰に払う?"); cc.x = u.ux; cc.y = u.uy; +/*JP if (getpos(&cc, TRUE, "the creature you want to pay") < 0) +*/ + if (getpos(&cc, TRUE, "支払いたい相手") < 0) return 0; /* player pressed ESC */ cx = cc.x; cy = cc.y; if(cx < 0) { +/*JP pline("Try again..."); +*/ + pline("もう一度..."); return(0); } if(u.ux == cx && u.uy == cy) { +/*JP You("are generous to yourself."); +*/ + pline("自分自身になんて気前のいいこと!"); return(0); } mtmp = m_at(cx, cy); if(!mtmp) { +/*JP There("is no one there to receive your payment."); +*/ + pline("支払いを受けとれる相手はいない."); return(0); } if(!mtmp->isshk) { +/*JP pline("%s is not interested in your payment.", +*/ + pline("%sは支払いに興味を示さない.", Monnam(mtmp)); return(0); } if (mtmp != resident && distu(mtmp->mx, mtmp->my) > 2) { +/*JP pline("%s is too far to receive your payment.", +*/ + pline("%sは支払いを受けとるには遠すぎる.", Monnam(mtmp)); return(0); } @@ -1201,8 +1369,13 @@ rouse_shk(shkp, TRUE); if (!shkp->mcanmove || shkp->msleeping) { /* still asleep/paralyzed */ +#if 0 /*JP:T*/ pline("%s %s.", Monnam(shkp), rn2(2) ? "seems to be napping" : "doesn't respond"); +#else + pline("%sは%s.", Monnam(shkp), + rn2(2) ? "居眠りをしているようだ" : "反応がない"); +#endif return 0; } @@ -1211,15 +1384,24 @@ umoney = money_cnt(invent); #endif if(!ltmp) +/*JP You("do not owe %s anything.", mon_nam(shkp)); +*/ + You("%sに借りはない.", mon_nam(shkp)); #ifndef GOLDOBJ else if(!u.ugold) { #else else if(!umoney) { #endif +/*JP You("%shave no money.", stashed_gold ? "seem to " : ""); +*/ + You("お金がない%s.", stashed_gold ? "ようだ" : ""); if(stashed_gold) +/*JP pline("But you have some gold stashed away."); +*/ + pline("しかし,あなたにはちょっっとしたヘソクリがある."); } else { #ifndef GOLDOBJ long ugold = u.ugold; @@ -1227,25 +1409,41 @@ #else if(umoney > ltmp) { #endif +#if 0 /*JP*/ You("give %s the %ld gold piece%s %s asked for.", mon_nam(shkp), ltmp, plur(ltmp), mhe(shkp)); +#else + You("%sに望み通り%ld枚の金貨を与えた.", + mon_nam(shkp), ltmp); +#endif pay(ltmp, shkp); } else { +#if 0 /*JP*/ You("give %s all your%s gold.", mon_nam(shkp), stashed_gold ? " openly kept" : ""); +#else + You("%sに%sお金全部を与えた.", mon_nam(shkp), + stashed_gold ? "手持ちの" : ""); +#endif #ifndef GOLDOBJ pay(u.ugold, shkp); #else pay(umoney, shkp); #endif +/*JP if (stashed_gold) pline("But you have hidden gold!"); +*/ + if (stashed_gold) pline("しかし,あなたはヘソクリがある!"); } #ifndef GOLDOBJ if((ugold < ltmp/2L) || (ugold < ltmp && stashed_gold)) #else if((umoney < ltmp/2L) || (umoney < ltmp && stashed_gold)) #endif +/*JP pline("Unfortunately, %s doesn't look satisfied.", +*/ + pline("残念ながら,%sは満足してないようだ.", mhe(shkp)); else make_happy_shk(shkp, FALSE); @@ -1259,15 +1457,24 @@ umoney = money_cnt(invent); #endif if(!ltmp && NOTANGRY(shkp)) { +/*JP You("do not owe %s anything.", mon_nam(shkp)); +*/ + You("%sに借りはない.", mon_nam(shkp)); #ifndef GOLDOBJ if (!u.ugold) #else if (!umoney) #endif +/*JP pline(no_money, stashed_gold ? " seem to" : ""); +*/ + pline(no_money, stashed_gold ? "ようだ" : ""); } else if(ltmp) { +/*JP pline("%s is after blood, not money!", Monnam(shkp)); +*/ + pline("%sは血まみれだ.お金どころじゃない!", Monnam(shkp)); #ifndef GOLDOBJ if(u.ugold < ltmp/2L || (u.ugold < ltmp && stashed_gold)) { @@ -1277,20 +1484,34 @@ (umoney < ltmp && stashed_gold)) { if (!umoney) #endif +/*JP pline(no_money, stashed_gold ? " seem to" : ""); +*/ + pline(no_money, stashed_gold ? "ようだ" : ""); else pline(not_enough_money, mhim(shkp)); return(1); } +/*JP pline("But since %s shop has been robbed recently,", +*/ + pline("しかし,%sの店は最近盗みにあったので,", mhis(shkp)); +#if 0 /*JP*/ pline("you %scompensate %s for %s losses.", +#else + You("%sの損失%sを補填した.", mon_nam(shkp), +#endif #ifndef GOLDOBJ (u.ugold < ltmp) ? #else (umoney < ltmp) ? #endif +#if 0 /*JP*/ "partially " : "", mon_nam(shkp), mhis(shkp)); +#else + "の一部" : ""); +#endif #ifndef GOLDOBJ pay(u.ugold < ltmp ? u.ugold : ltmp, shkp); #else @@ -1300,7 +1521,10 @@ } else { /* shopkeeper is angry, but has not been robbed -- * door broken, attacked, etc. */ +/*JP pline("%s is after your hide, not your money!", +*/ + pline("%sはあなたの命を狙っている,お金どころじゃない!", Monnam(shkp)); #ifndef GOLDOBJ if(u.ugold < 1000L) { @@ -1309,18 +1533,29 @@ if(umoney < 1000L) { if (!umoney) #endif +/*JP pline(no_money, stashed_gold ? " seem to" : ""); +*/ + pline(no_money, stashed_gold ? "ようだ" : ""); else pline(not_enough_money, mhim(shkp)); return(1); } +#if 0 /*JP*/ You("try to appease %s by giving %s 1000 gold pieces.", x_monnam(shkp, ARTICLE_THE, "angry", 0, FALSE), mhim(shkp)); +#else + You("金貨1000枚を%sに手渡してなだめようとした.", + x_monnam(shkp, ARTICLE_THE, "怒った", 0, FALSE)); +#endif pay(1000L,shkp); if (strncmp(eshkp->customer, plname, PL_NSIZ) || rn2(3)) make_happy_shk(shkp, FALSE); else +/*JP pline("But %s is as angry as ever.", mon_nam(shkp)); +*/ + pline("しかし%sはまだ怒っている.", mon_nam(shkp)); } return(1); } @@ -1337,30 +1572,55 @@ #ifdef GOLDOBJ umoney = money_cnt(invent); #endif +#if 0 /*JP*/ Sprintf(sbuf, "You owe %s %ld %s ", shkname(shkp), dtmp, currency(dtmp)); +#endif if(loan) { if(loan == dtmp) +/*JP Strcat(sbuf, "you picked up in the store."); +*/ + Strcpy(sbuf, "店の中で拾ったものに対して,"); +#if 0 /*JP*/ else Strcat(sbuf, "for gold picked up and the use of merchandise."); +#else + else Strcpy(sbuf,"拾ったお金や使った雑貨に対して,"); +#endif +/*JP } else Strcat(sbuf, "for the use of merchandise."); +*/ + } else Strcpy(sbuf, "使った雑貨に対して,"); +#if 1 /*JP*/ + Sprintf(eos(sbuf), "%sに%ld%sの借りがある.", + shkname(shkp), dtmp, currency(dtmp)); +#endif pline(sbuf); #ifndef GOLDOBJ if (u.ugold + eshkp->credit < dtmp) { #else if (umoney + eshkp->credit < dtmp) { #endif +#if 0 /*JP*/ pline("But you don't%s have enough gold%s.", stashed_gold ? " seem to" : "", eshkp->credit ? " or credit" : ""); +#else + pline("しかし,お金%s足りない%s.", + eshkp->credit ? "も預け金も" : "が", + stashed_gold ? "ようだ" : ""); +#endif return(1); } else { if (eshkp->credit >= dtmp) { eshkp->credit -= dtmp; eshkp->debit = 0L; eshkp->loan = 0L; +/*JP Your("debt is covered by your credit."); +*/ + Your("借金は預け金で補われた."); } else if (!eshkp->credit) { #ifndef GOLDOBJ u.ugold -= dtmp; @@ -1370,7 +1630,10 @@ #endif eshkp->debit = 0L; eshkp->loan = 0L; +/*JP You("pay that debt."); +*/ + You("借金を払った."); flags.botl = 1; } else { dtmp -= eshkp->credit; @@ -1383,8 +1646,14 @@ #endif eshkp->debit = 0L; eshkp->loan = 0L; +/*JP pline("That debt is partially offset by your credit."); +*/ + pline("その借金は一部預け金で相殺された."); +/*JP You("pay the remainder."); +*/ + You("残りを払った."); flags.botl = 1; } paid = TRUE; @@ -1399,9 +1668,15 @@ umoney = money_cnt(invent); if (!umoney && !eshkp->credit) { #endif +#if 0 /*JP*/ You("%shave no money or credit%s.", stashed_gold ? "seem to " : "", paid ? " left" : ""); +#else + You("%sお金も預け金も持ってない%s.", + paid ? "もう" : "", + stashed_gold ? "ようだ" : ""); +#endif return(0); } #ifndef GOLDOBJ @@ -1409,16 +1684,26 @@ #else if ((umoney + eshkp->credit) < cheapest_item(shkp)) { #endif +#if 0 /*JP*/ You("don't have enough money to buy%s the item%s you picked.", eshkp->billct > 1 ? " any of" : "", plur(eshkp->billct)); +#else + pline("拾った品物を買うにはお金が足りない."); +#endif if(stashed_gold) +/*JP pline("Maybe you have some gold stashed away?"); +*/ + You("どこかにお金を隠しているのかも?"); return(0); } /* this isn't quite right; it itemizes without asking if the * single item on the bill is partly used up and partly unpaid */ +/*JP itemize = (eshkp->billct > 1 ? yn("Itemized billing?") == 'y' : 1); +*/ + itemize = (eshkp->billct > 1 ? yn("個別に勘定しますか?") == 'y' : 1); for (pass = 0; pass <= 1; pass++) { tmp = 0; @@ -1471,7 +1756,10 @@ update_inventory(); /* Done in dopayobj() if itemize. */ } if(!ANGRY(shkp) && paid) +/*JP verbalize("Thank you for shopping in %s %s!", +*/ + verbalize("%sの%sへまたどうぞ!", s_suffix(shkname(shkp)), shtypes[eshkp->shoptype - SHOPBASE].name); return(1); @@ -1510,8 +1798,13 @@ #else if(itemize && umoney + ESHK(shkp)->credit == 0L){ #endif +#if 0 /*JP*/ You("%shave no money or credit left.", stashed_gold ? "seem to " : ""); +#else + You("もうお金も預け金もない%s.", + stashed_gold ? "ようだ" : ""); +#endif return PAY_BROKE; } /* we may need to temporarily adjust the object, if part of the @@ -1533,15 +1826,25 @@ if (itemize) { char qbuf[BUFSZ]; +#if 0 /*JP*/ Sprintf(qbuf,"%s for %ld %s. Pay?", quan == 1L ? +#else + Sprintf(qbuf,"%sは%ld%sです.買いますか?", quan == 1L ? +#endif Doname2(obj) : doname(obj), ltmp, currency(ltmp)); if (yn(qbuf) == 'n') { buy = PAY_SKIP; /* don't want to buy */ } else if (quan < bp->bquan && !consumed) { /* partly used goods */ obj->quan = bp->bquan - save_quan; /* used up amount */ +#if 0 /*JP*/ verbalize("%s for the other %s before buying %s.", ANGRY(shkp) ? "Pay" : "Please pay", xname(obj), save_quan > 1L ? "these" : "this one"); +#else + verbalize("それを買うまえに他の%sを%s", + xname(obj), + ANGRY(shkp) ? "払え!" : "払ってください."); +#endif buy = PAY_SKIP; /* shk won't sell */ } } @@ -1550,10 +1853,17 @@ #else if (buy == PAY_BUY && umoney + ESHK(shkp)->credit < ltmp) { #endif +#if 0 /*JP*/ You("don't%s have gold%s enough to pay for %s.", stashed_gold ? " seem to" : "", (ESHK(shkp)->credit > 0L) ? " or credit" : "", doname(obj)); +#else + You("%sの代金を支払うだけのお金%s持ってない%s.", + doname(obj), + (ESHK(shkp)->credit > 0L) ? "も預け金も" : "を", + stashed_gold ? "ようだ" : ""); +#endif buy = itemize ? PAY_SKIP : PAY_CANT; } @@ -1565,9 +1875,15 @@ } pay(ltmp, shkp); +#if 0 /*JP*/ shk_names_obj(shkp, obj, consumed ? "paid for %s at a cost of %ld gold piece%s.%s" : "bought %s for %ld gold piece%s.%s", ltmp, ""); +#else + shk_names_obj(shkp, obj, consumed ? + "%sに金貨%ld枚%sを支払った.%s" : + "%sを金貨%ld枚%sで買った.%s", ltmp, ""); +#endif obj->quan = save_quan; /* restore original count */ /* quan => amount just bought, save_quan => remaining unpaid count */ if (consumed) { @@ -1651,12 +1967,20 @@ /* already took everything you had. */ if (numsk > 1) { if (cansee(shkp->mx, shkp->my && croaked)) +#if 0 /*JP*/ pline("%s %slooks at your corpse%s and %s.", Monnam(shkp), (!shkp->mcanmove || shkp->msleeping) ? "wakes up, " : "", !rn2(2) ? (shkp->female ? ", shakes her head," : ", shakes his head,") : "", !inhishop(shkp) ? "disappears" : "sighs"); +#else + pline("%sは%sあなたの死体を見て%s%s.", + Monnam(shkp), + (!shkp->mcanmove || shkp->msleeping) ? "目をさますと" : "", + !rn2(2) ? "首を振り," : "", + !inhishop(shkp) ? "姿を消した" : "溜息をついた"); +#endif rouse_shk(shkp, FALSE); /* wake shk for bones */ taken = (roomno == eshkp->shoproom); goto skip; @@ -1668,7 +1992,10 @@ !eshkp->billct && !eshkp->robbed && !eshkp->debit && NOTANGRY(shkp) && !eshkp->following) { if (invent) +/*JP pline("%s gratefully inherits all your possessions.", +*/ + pline("%sはあなたの持ち物をありがたく受けとった.", shkname(shkp)); set_repo_loc(eshkp); goto clear; @@ -1690,10 +2017,18 @@ #endif takes[0] = '\0'; if (!shkp->mcanmove || shkp->msleeping) +/*JP Strcat(takes, "wakes up and "); +*/ + Strcat(takes, "目がさめると,"); if (distu(shkp->mx, shkp->my) > 2) +/*JP Strcat(takes, "comes and "); +*/ + Strcat(takes, "近づき,"); +#if 0 /*JP*/ Strcat(takes, "takes"); +#endif #ifndef GOLDOBJ if (loss > u.ugold || !loss || roomno == eshkp->shoproom) { @@ -1708,7 +2043,10 @@ if (umoney > 0) money2mon(shkp, umoney); #endif flags.botl = 1; +/*JP pline("%s %s all your possessions.", +*/ + pline("%sは%sあなたの持ち物すべてをもらった.", shkname(shkp), takes); taken = TRUE; /* where to put player's invent (after disclosure) */ @@ -1721,12 +2059,20 @@ money2mon(shkp, loss); #endif flags.botl = 1; +#if 0 /*JP*/ pline("%s %s the %ld %s %sowed %s.", Monnam(shkp), takes, loss, currency(loss), strncmp(eshkp->customer, plname, PL_NSIZ) ? "" : "you ", shkp->female ? "her" : "him"); +#else + pline("%sは%s%s借りている%ld%sを受けとった.", + Monnam(shkp), takes, + strncmp(eshkp->customer, plname, PL_NSIZ) ? + "" : "あなたが", + loss, currency(loss)); +#endif /* shopkeeper has now been paid in full */ pacify_shk(shkp); eshkp->following = 0; @@ -2091,7 +2437,10 @@ return; if (ESHK(shkp)->billct == BILLSZ) { +/*JP You("got that for free!"); +*/ + You("それをただで手に入れた!"); return; } @@ -2177,12 +2526,23 @@ obj_name = doname(obj); /* Use an alternate message when extra information is being provided */ if (was_unknown) { +/*JP Sprintf(fmtbuf, "%%s; you %s", fmt); +*/ + Sprintf(fmtbuf, "%s", fmt); obj_name[0] = highc(obj_name[0]); +#if 0 /*JP*/ pline(fmtbuf, obj_name, (obj->quan > 1) ? "them" : "it", amt, plur(amt), arg); +#else + pline(fmtbuf, obj_name, + amt, "", arg); +#endif } else { +/*JP You(fmt, obj_name, amt, plur(amt), arg); +*/ + You(fmt, obj_name, amt, "", arg); } } @@ -2208,7 +2568,10 @@ ) return; if(ESHK(shkp)->billct == BILLSZ) { +/*JP You("got that for free!"); +*/ + You("それをただで手に入れた!"); return; } @@ -2260,37 +2623,74 @@ char buf[BUFSZ]; if(!ltmp) { +/*JP pline("%s has no interest in %s.", Monnam(shkp), +*/ + pline("%sは%sに興味を示さない.", Monnam(shkp), the(xname(obj))); return; } +#if 0 /*JP*/ Strcpy(buf, "\"For you, "); if (ANGRY(shkp)) Strcat(buf, "scum "); +#else + Strcpy(buf, "「"); + if (ANGRY(shkp)) Strcat(buf, "このクソったれ"); +#endif else { static const char *honored[5] = { +#if 0 /*JP*/ "good", "honored", "most gracious", "esteemed", "most renowned and sacred" +#else + "やぁ", "やぁ,名誉ある", "やぁ,上品な", "やぁ,尊敬する", + "やぁ,高名で神聖な" +#endif }; Strcat(buf, honored[rn2(4) + u.uevent.udemigod]); +/*JP if (!is_human(youmonst.data)) Strcat(buf, " creature"); +*/ + if (!is_human(youmonst.data)) Strcat(buf, "生物さん"); else +/*JP Strcat(buf, (flags.female) ? " lady" : " sir"); +*/ + Strcat(buf, (flags.female) ? "お嬢さん" : "旦那さん"); } if(ininv) { long quan = obj->quan; obj->quan = 1L; /* fool xname() into giving singular */ +#if 0 /*JP*/ pline("%s; only %ld %s %s.\"", buf, ltmp, (quan > 1L) ? "per" : "for this", xname(obj)); +#else + pline("%s.%sは%sたったの金貨%ld枚だ.」", buf, xname(obj), + (quan > 1L) ? "1つ" : "", ltmp); +#endif obj->quan = quan; } else +#if 0 /*JP*/ pline("%s will cost you %ld %s%s.", The(xname(obj)), ltmp, currency(ltmp), (obj->quan > 1L) ? " each" : ""); +#else + pline("%sは%s%ld%sだ", + The(xname(obj)), + (obj->quan > 1L) ? "それぞれ" : "", ltmp, currency(ltmp)); +#endif } else if(!silent) { +#if 0 /*JP*/ if(ltmp) pline_The("list price of %s is %ld %s%s.", the(xname(obj)), ltmp, currency(ltmp), (obj->quan > 1L) ? " each" : ""); else pline("%s does not notice.", Monnam(shkp)); +#else + if(ltmp) pline("%sの値段は%s%ld%sだ.", + the(xname(obj)), + (obj->quan > 1L) ? "それぞれ" : "", ltmp, currency(ltmp)); + else pline("%sは気がついていない.", Monnam(shkp)); +#endif } } @@ -2483,31 +2883,59 @@ if (credit_use) { if (ESHK(shkp)->credit) { +#if 0 /*JP*/ You("have %ld %s credit remaining.", +#else + You("%ld%sの預け金が残っている.", +#endif ESHK(shkp)->credit, currency(ESHK(shkp)->credit)); return value; } else if (!value) { +/*JP You("have no credit remaining."); +*/ + pline("預け金はなくなった."); return 0; } +#if 0 /*JP*/ still = "still "; +#else + still = "さらに"; +#endif } if(obj->oclass == COIN_CLASS) +#if 0 /*JP*/ You("%sowe %s %ld %s!", still, +#else + You("%s%sに%ld%sの借りをつくった!", still, +#endif mon_nam(shkp), value, currency(value)); else +#if 0 /*JP*/ You("%sowe %s %ld %s for %s!", still, mon_nam(shkp), value, currency(value), obj->quan > 1L ? "them" : "it"); +#else + You("%s%sに%ld%sの借りをつくった!", still, + mon_nam(shkp), value, currency(value)); +#endif } } else { ESHK(shkp)->robbed += value; if(!silent) { if(cansee(shkp->mx, shkp->my)) { +#if 0 /*JP*/ Norep("%s booms: \"%s, you are a thief!\"", Monnam(shkp), plname); +#else + Norep("%sは叫んだ:「%s,待て!このどろぼうめ!」", + Monnam(shkp), plname); +#endif +/*JP } else Norep("You hear a scream, \"Thief!\""); +*/ + } else Norep("金切り声を聞いた,「待て!このどろぼうめ!」"); } hot_pursuit(shkp); (void) angry_guards(FALSE); @@ -2587,7 +3015,10 @@ } else obj->no_charge = 1; if(!unpaid && (sell_how != SELL_DONTSELL)) +/*JP pline("%s seems uninterested.", Monnam(shkp)); +*/ + pline("%sは興味がないようだ.", Monnam(shkp)); return; } @@ -2596,7 +3027,10 @@ eshkp = ESHK(shkp); if (ANGRY(shkp)) { /* they become shop-objects, no pay */ +/*JP pline("Thank you, scum!"); +*/ + pline("ありがとよ,このクソったれ!"); subfrombill(obj, shkp); return; } @@ -2607,7 +3041,10 @@ if((eshkp->robbed -= offer < 0L)) eshkp->robbed = 0L; if(offer) verbalize( +/*JP "Thank you for your contribution to restock this recently plundered shop."); +*/ + "寄贈をどうもありがとう.最近盗みにあって参ってたんだ."); subfrombill(obj, shkp); return; } @@ -2622,8 +3059,14 @@ else eshkp->loan = 0L; } eshkp->debit -= gltmp; +/*JP Your("debt is %spaid off.", +*/ + Your("借金は%s支払われた.", +/*JP eshkp->debit ? "partially " : ""); +*/ + eshkp->debit ? "一部" : ""); } else { long delta = gltmp - eshkp->debit; @@ -2631,10 +3074,18 @@ if(eshkp->debit) { eshkp->debit = 0L; eshkp->loan = 0L; +/*JP Your("debt is paid off."); +*/ + Your("借金は支払われた."); } +#if 0 /*JP*/ pline("%ld %s %s added to your credit.", delta, currency(delta), delta > 1L ? "are" : "is"); +#else + pline("%ld%sを預けた.", + delta, currency(delta)); +#endif } if(offer) goto move_on; else { @@ -2655,8 +3106,13 @@ || (obj->oclass == FOOD_CLASS && obj->oeaten) || (Is_candle(obj) && obj->age < 20L * (long)objects[obj->otyp].oc_cost)) { +#if 0 /*JP*/ pline("%s seems uninterested%s.", Monnam(shkp), cgold ? " in the rest" : ""); +#else + pline("%sは%s興味がないようだ.", Monnam(shkp), + cgold ? "残り物には" : ""); +#endif if (container) dropped_container(obj, shkp, FALSE); obj->no_charge = 1; @@ -2674,10 +3130,18 @@ if (sell_how == SELL_NORMAL || auto_credit) { c = sell_response = 'y'; } else if (sell_response != 'n') { +/*JP pline("%s cannot pay you at present.", Monnam(shkp)); +*/ + pline("%sは今のところは支払えない.", Monnam(shkp)); Sprintf(qbuf, +#if 0 /*JP*/ "Will you accept %ld %s in credit for %s?", tmpcr, currency(tmpcr), doname(obj)); +#else + "%sについて%ld%sの預け金を受けいれますか?", + doname(obj), tmpcr, currency(tmpcr)); +#endif /* won't accept 'a' response here */ /* KLY - 3/2000 yes, we will, it's a damn nuisance to have to constantly hit 'y' to sell for credit */ @@ -2690,11 +3154,18 @@ c = 'n'; if (c == 'y') { +#if 0 /*JP*/ shk_names_obj(shkp, obj, (sell_how != SELL_NORMAL) ? "traded %s for %ld zorkmid%s in %scredit." : "relinquish %s and acquire %ld zorkmid%s in %scredit.", tmpcr, (eshkp->credit > 0L) ? "additional " : ""); +#else + shk_names_obj(shkp, obj, (sell_how != SELL_NORMAL) ? + "%sを金貨%ld枚分の預け金で受けとった%s." : + "%sを渡し,金貨%ld枚分の預け金を得た%s.", + tmpcr, ""); +#endif eshkp->credit += tmpcr; subfrombill(obj, shkp); } else { @@ -2718,6 +3189,7 @@ only_partially_your_contents = (contained_cost(obj, shkp, 0L, FALSE, FALSE) != contained_cost(obj, shkp, 0L, FALSE, TRUE)); +#if 0 /*JP*/ Sprintf(qbuf, "%s offers%s %ld gold piece%s for%s %s %s. Sell %s?", Monnam(shkp), short_funds ? " only" : "", @@ -2728,6 +3200,14 @@ (obj->quan == 1L && !(!ltmp && cltmp && only_partially_your_contents)) ? "it" : "them"); +#else + Sprintf(qbuf, + "%sはあなたの%s%sに%ldの値%s.売りますか?", + Monnam(shkp), cxname(obj), + (!ltmp && cltmp) ? "の中身" : "", + offer, + short_funds ? "しかつけなかった" : "をつけた"); +#endif } else qbuf[0] = '\0'; /* just to pacify lint */ switch (sell_response ? sell_response : ynaq(qbuf)) { @@ -2745,9 +3225,15 @@ pay(-offer, shkp); shk_names_obj(shkp, obj, (sell_how != SELL_NORMAL) ? (!ltmp && cltmp && only_partially_your_contents) ? +#if 0 /*JP*/ "sold some items inside %s for %ld gold pieces%s.%s" : "sold %s for %ld gold piece%s.%s" : "relinquish %s and receive %ld gold piece%s in compensation.%s", +#else + "%sの中身を金貨%ld枚で売った%s.%s" : + "%sを金貨%ld枚で売った%s.%s" : + "%sを渡し,金貨%ld枚の代償を受けとった%s.%s", +#endif offer, ""); break; default: impossible("invalid sell response"); @@ -2791,7 +3277,10 @@ } datawin = create_nhwindow(NHW_MENU); +/*JP putstr(datawin, 0, "Unpaid articles already used up:"); +*/ + putstr(datawin, 0, "すでに使ってしまった未払の品目:"); putstr(datawin, 0, ""); totused = 0L; @@ -2827,12 +3316,21 @@ /* additional shop debt which has no itemization available */ if (totused) putstr(datawin, 0, ""); totused += eshkp->debit; +#if 0 /*JP*/ buf_p = xprname((struct obj *)0, "usage charges and/or other fees", GOLD_SYM, FALSE, eshkp->debit, 0L); +#else + buf_p = xprname((struct obj *)0, + "使用料または他の手数料", + GOLD_SYM, FALSE, eshkp->debit, 0L); +#endif putstr(datawin, 0, buf_p); } +/*JP buf_p = xprname((struct obj *)0, "Total:", '*', FALSE, totused, 0L); +*/ + buf_p = xprname((struct obj *)0, "合計:", '*', FALSE, totused, 0L); putstr(datawin, 0, ""); putstr(datawin, 0, buf_p); display_nhwindow(datawin, FALSE); @@ -2897,12 +3395,22 @@ /* if it is the shk's pos, you hit and anger him */ (shkp->mx != x || shkp->my != y)) { if (mnearto(shkp, x, y, TRUE)) +/*JP verbalize("Out of my way, scum!"); +*/ + verbalize("どけ,クソったれ!"); if (cansee(x, y)) { +#if 0 /*JP*/ pline("%s nimbly%s catches %s.", Monnam(shkp), (x == shkp->mx && y == shkp->my) ? "" : " reaches over and", the(xname(obj))); +#else + pline("%sはすばやく%s%sをつかまえた.", + Monnam(shkp), + (x == shkp->mx && y == shkp->my) ? "" : "近づいて", + the(xname(obj))); +#endif if (!canspotmon(shkp)) map_invisible(x, y); delay_output(); @@ -3030,25 +3538,52 @@ if (!did_repair) return; if (saw_walls) { +#if 0 /*JP*/ pline("Suddenly, %s section%s of wall close%s up!", (saw_walls == 1) ? "a" : (saw_walls <= 3) ? "some" : "several", (saw_walls == 1) ? "" : "s", (saw_walls == 1) ? "s" : ""); +#else + pline("突然,壁が%s閉まった!", + (saw_walls == 1) ? "一箇所" : (saw_walls <= 3) ? + "何箇所か" : "あちこちで"); +#endif if (saw_door) +/*JP pline_The("shop door reappears!"); +*/ + pline("店の扉がまた現われた!"); if (saw_floor) +/*JP pline_The("floor is repaired!"); +*/ + pline("床は修復された!"); } else { if (saw_door) +/*JP pline("Suddenly, the shop door reappears!"); +*/ + pline("突然,店の扉がまた現われた!"); else if (saw_floor) +/*JP pline("Suddenly, the floor damage is gone!"); +*/ + pline("突然,床の傷がなくなった!"); else if (saw_untrap) +/*JP pline("Suddenly, the trap is removed from the floor!"); +*/ + pline("突然罠が床から消えた!"); else if (inside_shop(u.ux, u.uy) == ESHK(shkp)->shoproom) +/*JP You_feel("more claustrophobic than before."); +*/ + You("前より閉所恐怖症気味になった."); else if (flags.soundok && !rn2(10)) +/*JP Norep("The dungeon acoustics noticeably change."); +*/ + Norep("迷宮の音響はいちじるしく変った."); } if (stop_picking) stop_occupation(); @@ -3141,7 +3676,10 @@ * * Take the easy way out and put ball&chain under hero. */ +/*JP verbalize("Get your junk out of my wall!"); +*/ + verbalize("そのガラクタを外に持って行きな!"); unplacebc(); /* pick 'em up */ placebc(); /* put 'em down */ } @@ -3212,24 +3750,40 @@ if(ANGRY(shkp) || (Conflict && !resist(shkp, RING_CLASS, 0, 0))) { if(Displaced) +/*JP Your("displaced image doesn't fool %s!", +*/ + pline("%sはあなたの幻影にだまされなかった!", mon_nam(shkp)); (void) mattacku(shkp); return(0); } if(eshkp->following) { if(strncmp(eshkp->customer, plname, PL_NSIZ)) { +#if 0 /*JP*/ verbalize("%s, %s! I was looking for %s.", Hello(shkp), plname, eshkp->customer); +#else + verbalize("%s!わたしは%sを探しています.", + Hello(shkp, TRUE), eshkp->customer); +#endif eshkp->following = 0; return(0); } if(moves > followmsg+4) { +#if 0 /*JP*/ verbalize("%s, %s! Didn't you forget to pay?", Hello(shkp), plname); +#else + verbalize("%s!支払いを忘れていませんか?", + Hello(shkp, TRUE)); +#endif followmsg = moves; if (!rn2(9)) { +/*JP pline("%s doesn't like customers who don't pay.", +*/ + pline ("%sは金を払わない客が嫌いみたいだ.", Monnam(shkp)); rile_shk(shkp); } @@ -3332,7 +3886,10 @@ { register struct monst *shkp = shop_keeper(*u.ushops); int lang; +/*JP const char *grabs = "grabs"; +*/ + const char *grabs = "つかんだ"; if(!shkp) return; @@ -3347,7 +3904,10 @@ if(!inhishop(shkp)) { if (Role_if(PM_KNIGHT)) { +/*JP You_feel("like a common thief."); +*/ + You("泥棒同然な気がした."); adjalign(-sgn(u.ualign.type)); } return; @@ -3356,15 +3916,29 @@ if(!fall) { if (lang == 2) { if(u.utraptype == TT_PIT) +#if 0 /*JP*/ verbalize( "Be careful, %s, or you might fall through the floor.", flags.female ? "madam" : "sir"); +#else + verbalize("注意してください%s,床から落ちますよ.", + flags.female ? "お嬢さん" : "お客さん"); +#endif else +#if 0 /*JP*/ verbalize("%s, do not damage the floor here!", flags.female ? "Madam" : "Sir"); +#else + verbalize("%s,床に傷をつけないでください!", + flags.female ? "お嬢さん" : "お客さん"); +#endif } if (Role_if(PM_KNIGHT)) { +#if 0 /*JP*/ You_feel("like a common thief."); +#else + You("泥棒同然な気がした."); +#endif adjalign(-sgn(u.ualign.type)); } } else if(!um_dist(shkp->mx, shkp->my, 5) && @@ -3372,7 +3946,10 @@ (ESHK(shkp)->billct || ESHK(shkp)->debit)) { register struct obj *obj, *obj2; if (nolimbs(shkp->data)) { +/*JP grabs = "knocks off"; +*/ + grabs = "叩き落した"; #if 0 /* This is what should happen, but for balance * reasons, it isn't currently. @@ -3389,16 +3966,27 @@ /* for some reason the shopkeeper can't come next to you */ if (distu(shkp->mx, shkp->my) > 2) { if (lang == 2) +/*JP pline("%s curses you in anger and frustration!", +*/ + pline("怒りで不満のたまっている%sはあなたを呪った!", shkname(shkp)); rile_shk(shkp); return; } else +#if 0 /*JP*/ pline("%s %s, and %s your backpack!", shkname(shkp), makeplural(locomotion(shkp->data,"leap")), grabs); +#else + pline("%sは飛びついて,あなたの背負い袋を%s!", + shkname(shkp), grabs); +#endif } else +/*JP pline("%s %s your backpack!", shkname(shkp), grabs); +*/ + pline("%sはあなたの背負い袋を%s!", shkname(shkp), grabs); for(obj = invent; obj; obj = obj2) { obj2 = obj->nobj; @@ -3451,8 +4039,13 @@ register boolean uinshp = (*u.ushops != '\0'); char qbuf[80]; register xchar x, y; +#if 0 /*JP*/ boolean dugwall = !strcmp(dmgstr, "dig into") || /* wand */ !strcmp(dmgstr, "damage"); /* pick-axe */ +#else + boolean ni_wo = !strcmp(dmgstr, "穴をあける"); /* wand */ + boolean dugwall = (ni_wo || !strcmp(dmgstr, "傷つける")); /* pick-axe */ +#endif struct damage *tmp_dam, *appear_here = 0; /* any number >= (80*80)+(24*24) would do, actually */ long cost_of_damage = 0L; @@ -3527,7 +4120,10 @@ if(uinshp) { if(um_dist(shkp->mx, shkp->my, 1) && !um_dist(shkp->mx, shkp->my, 3)) { +/*JP pline("%s leaps towards you!", shkname(shkp)); +*/ + pline("%sはあなたに飛びかかった!", shkname(shkp)); mnexto(shkp); } if(um_dist(shkp->mx, shkp->my, 1)) goto getcad; @@ -3540,8 +4136,14 @@ */ if (MON_AT(x, y)) { if(flags.soundok) { +/*JP You_hear("an angry voice:"); +*/ + You("怒りの声を聞いた:"); +/*JP verbalize("Out of my way, scum!"); +*/ + verbalize("どけ!クソったれ!"); wait_synch(); #if defined(UNIX) || defined(VMS) # if defined(SYSV) || defined(ULTRIX) || defined(VMS) @@ -3562,20 +4164,44 @@ #endif || !rn2(50)) { if(um_dist(x, y, 1) && !uinshp) { +/*JP pline("%s shouts:", shkname(shkp)); +*/ + pline("%sはさけんだ:", shkname(shkp)); +#if 0 /*JP*/ verbalize("Who dared %s my %s?", dmgstr, dugwall ? "shop" : "door"); +#else + verbalize("誰が%s%s%sりしたんだろう?", + dugwall ? "店" : "扉", + ni_wo ? "に" : "を", + jpast(dmgstr)); +#endif } else { getcad: +#if 0 /*JP*/ verbalize("How dare you %s my %s?", dmgstr, dugwall ? "shop" : "door"); +#else + verbalize("どうして%s%s%sりしたんだ?", + dugwall ? "店" : "扉", + ni_wo ? "に" : "を", + jpast(dmgstr)); +#endif } hot_pursuit(shkp); return; } +/*JP if (Invis) Your("invisibility does not fool %s!", shkname(shkp)); +*/ + if(Invis) pline("%sは透明なあなたにだまされなかった!", shkname(shkp)); +#if 0 /*JP*/ Sprintf(qbuf,"\"Cad! You did %ld %s worth of damage!\" Pay? ", +#else + Sprintf(qbuf,"「おい!%ld%sの損害だ!」払いますか?", +#endif cost_of_damage, currency(cost_of_damage)); if(yn(qbuf) != 'n') { cost_of_damage = check_credit(cost_of_damage, shkp); @@ -3586,13 +4212,19 @@ money2mon(shkp, cost_of_damage); #endif flags.botl = 1; +/*JP pline("Mollified, %s accepts your restitution.", +*/ + pline("%sは,感情をやわらげ賠償金を受けとった.", shkname(shkp)); /* move shk back to his home loc */ home_shk(shkp, FALSE); pacify_shk(shkp); } else { +/*JP verbalize("Oh, yes! You'll pay!"); +*/ + verbalize("さあ,払うんだ!"); hot_pursuit(shkp); adjalign(-sgn(u.ualign.type)); } @@ -3651,7 +4283,10 @@ struct monst *shkp = shop_keeper(inside_shop(u.ux, u.uy)); tmpwin = create_nhwindow(NHW_MENU); +/*JP putstr(tmpwin, 0, "Fine goods for sale:"); +*/ + putstr(tmpwin, 0, "売りにでているすばらしい商品:"); putstr(tmpwin, 0, ""); for (otmp = first_obj; otmp; otmp = otmp->nexthere) { if (otmp->oclass == COIN_CLASS) continue; @@ -3660,27 +4295,51 @@ if (Has_contents(otmp)) cost += contained_cost(otmp, shkp, 0L, FALSE, FALSE); if (!cost) { +/*JP Strcpy(price, "no charge"); +*/ + Strcpy(price, "無料"); } else { +#if 0 /*JP*/ Sprintf(price, "%ld %s%s", cost, currency(cost), otmp->quan > 1L ? " each" : ""); +#else + Sprintf(price, "%s%ld%s", + otmp->quan > 1L ? "それぞれ" : "", cost, currency(cost)); +#endif } +#if 0 /*JP*/ Sprintf(buf, "%s, %s", doname(otmp), price); +#else + Sprintf(buf, "%s,%s", doname(otmp), price); +#endif putstr(tmpwin, 0, buf), cnt++; } if (cnt > 1) { display_nhwindow(tmpwin, TRUE); } else if (cnt == 1) { if (first_obj->no_charge || first_obj == uball || first_obj == uchain){ +#if 0 /*JP*/ pline("%s!", buf); /* buf still contains the string */ +#else + pline("%s!", buf); /* buf still contains the string */ +#endif } else { /* print cost in slightly different format, so can't reuse buf */ cost = get_cost(first_obj, (struct monst *)0); if (Has_contents(first_obj)) cost += contained_cost(first_obj, shkp, 0L, FALSE, FALSE); +#if 0 /*JP*/ pline("%s, price %ld %s%s%s", doname(first_obj), cost, currency(cost), first_obj->quan > 1L ? " each" : "", shk_embellish(first_obj, cost)); +#else + pline("%s%sは%s%ld%sだ.", + shk_embellish(first_obj, cost), + doname(first_obj), + first_obj->quan > 1L ? "それぞれ" : "", + cost, currency(cost)); +#endif } } destroy_nhwindow(tmpwin); @@ -3699,29 +4358,51 @@ switch (choice) { case 4: if (cost < 10L) break; else o = itm->oclass; +/*JP if (o == FOOD_CLASS) return ", gourmets' delight!"; +*/ + if (o == FOOD_CLASS) return "グルメが泣いて喜ぶ"; if (objects[itm->otyp].oc_name_known ? objects[itm->otyp].oc_magic : (o == AMULET_CLASS || o == RING_CLASS || o == WAND_CLASS || o == POTION_CLASS || o == SCROLL_CLASS || o == SPBOOK_CLASS)) +/*JP return ", painstakingly developed!"; +*/ + return "一級の魔力を秘めた"; +/*JP return ", superb craftsmanship!"; +*/ + return "一流職人の作った"; +#if 0 /*JP*/ case 3: return ", finest quality."; case 2: return ", an excellent choice."; case 1: return ", a real bargain."; +#else + case 3: return "最高の品質を誇る"; + case 2: return "さすがお客さん目が高い!"; + case 1: return "本日の目玉商品!"; +#endif default: break; } } else if (itm->oartifact) { +/*JP return ", one of a kind!"; +*/ + return "これは世界にまたとない!"; } +/*JP return "."; +*/ + return ""; } #endif /*OVL3*/ #ifdef OVLB /* First 4 supplied by Ronen and Tamar, remainder by development team */ const char *Izchak_speaks[]={ +#if 0 /*JP*/ "%s says: 'These shopping malls give me a headache.'", "%s says: 'Slow down. Think clearly.'", "%s says: 'You need to take things one at a time.'", @@ -3731,6 +4412,17 @@ "%s says: 'Don't try to steal from me - I have friends in high places!'", "%s says: 'You may well need something from this shop in the future.'", "%s comments about the Valley of the Dead as being a gateway." +#else + "%s曰く『これらショッピング街は頭痛のタネだ.』", + "%s曰く『落ち着いて,明晰に考えよ.』", + "%s曰く『一度に一個ずつ取る必要がある.』", + "%s曰く『ホモっぽいコーヒは好きじゃない...コロンビアン・スプレモをたのむ.』", + "開発チームに何らかの協定を求めることは困難だと%sは述べた.", + "%sは神に仕えるやつは金を儲けていると述べた.", + "%s曰く『私から盗もうなんて思わないことだ.上の方に知り合いがいるんだから.』", + "%s曰く『将来この店の何かが必要となるだろう』", + "%sは死の谷はゲートウェイだろうとコメントを述べた." +#endif }; void @@ -3746,7 +4438,11 @@ not actually a shk, which could happen if someone wishes for a shopkeeper statue and then animates it. (Note: shkname() would be "" in a case like this.) */ +#if 0 /*JP*/ pline("%s asks whether you've seen any untended shops recently.", +#else + pline("%sは最近どこかに店員のいない店はないかとたずねた.", +#endif Monnam(shkp)); /* [Perhaps we ought to check whether this conversation is taking place inside an untended shop, but a shopless @@ -3756,47 +4452,90 @@ eshk = ESHK(shkp); if (ANGRY(shkp)) +#if 0 /*JP*/ pline("%s mentions how much %s dislikes %s customers.", shkname(shkp), mhe(shkp), eshk->robbed ? "non-paying" : "rude"); +#else + pline("%sは%s客は大嫌いだと言った.", + shkname(shkp), + eshk->robbed ? "金を支払わない" : "無礼な"); +#endif else if (eshk->following) { if (strncmp(eshk->customer, plname, PL_NSIZ)) { +#if 0 /*JP*/ verbalize("%s %s! I was looking for %s.", Hello(shkp), plname, eshk->customer); +#else + verbalize("%s!私は%sを探しています.", + Hello(shkp, TRUE), eshk->customer); +#endif eshk->following = 0; } else { +#if 0 /*JP*/ verbalize("%s %s! Didn't you forget to pay?", Hello(shkp), plname); +#else + verbalize("%s!支払いを忘れていませんか?", + Hello(shkp, TRUE)); +#endif } } else if (eshk->billct) { register long total = addupbill(shkp) + eshk->debit; +#if 0 /*JP*/ pline("%s says that your bill comes to %ld %s.", +#else + pline("%sは勘定が%ld%sになると言った.", +#endif shkname(shkp), total, currency(total)); } else if (eshk->debit) +#if 0 /*JP*/ pline("%s reminds you that you owe %s %ld %s.", shkname(shkp), mhim(shkp), eshk->debit, currency(eshk->debit)); +#else + pline("あなたは%sに%ld%sの借りがあることを思いだした.", + shkname(shkp), + eshk->debit, currency(eshk->debit)); +#endif else if (eshk->credit) +#if 0 /*JP*/ pline("%s encourages you to use your %ld %s of credit.", +#else + pline("%sはクレジットで%ld%s使うよう勧めた.", +#endif shkname(shkp), eshk->credit, currency(eshk->credit)); else if (eshk->robbed) +#if 0 /*JP*/ pline("%s complains about a recent robbery.", shkname(shkp)); +#else + pline("%s最近の強盗について愚痴をこぼした.", shkname(shkp)); +#endif #ifndef GOLDOBJ else if (shkp->mgold < 50) #else else if ((shkmoney = money_cnt(shkp->minvent)) < 50) #endif +/*JP pline("%s complains that business is bad.", shkname(shkp)); +*/ + pline("%sは商売が旨くいってないと愚痴をこぼした.", shkname(shkp)); #ifndef GOLDOBJ else if (shkp->mgold > 4000) #else else if (shkmoney > 4000) #endif +/*JP pline("%s says that business is good.", shkname(shkp)); +*/ + pline("%sは商売が旨くいっていると言った.", shkname(shkp)); else if (strcmp(shkname(shkp), "Izchak") == 0) pline(Izchak_speaks[rn2(SIZE(Izchak_speaks))],shkname(shkp)); else +/*JP pline("%s talks about the problem of shoplifters.",shkname(shkp)); +*/ + pline("%sは万引の問題について話した.", shkname(shkp)); } #ifdef KOPS @@ -3815,8 +4554,12 @@ } } if (cnt && !silent) +#if 0 /*JP*/ pline_The("Kop%s (disappointed) vanish%s into thin air.", plur(cnt), cnt == 1 ? "es" : ""); +#else + pline("がっかりした警官は空気にとけて消えた."); +#endif } #endif /* KOPS */ @@ -3902,15 +4645,34 @@ arg1 = arg2 = ""; if (otmp->oclass == SPBOOK_CLASS) { +/*JP fmt = "%sYou owe%s %ld %s."; +*/ + fmt = "%s%s%ld%sの借りだ."; +#if 0 /*JP*/ arg1 = rn2(2) ? "This is no free library, cad! " : ""; arg2 = ESHK(shkp)->debit > 0L ? " an additional" : ""; +#else + arg1 = rn2(2) ? "おい!ここは図書館じゃない!" : ""; + arg2 = ESHK(shkp)->debit > 0L ? "さらに言えば" : ""; +#endif } else if (otmp->otyp == POT_OIL) { +/*JP fmt = "%s%sThat will cost you %ld %s (Yendorian Fuel Tax)."; +*/ + fmt = "%s%s値段は%ld%s(イェンダー燃料税)だ."; } else { +/*JP fmt = "%s%sUsage fee, %ld %s."; +*/ + fmt = "%s%s使用料は,%ld%sだ."; +#if 0 /*JP*/ if (!rn2(3)) arg1 = "Hey! "; if (!rn2(3)) arg2 = "Ahem. "; +#else + if (!rn2(3)) arg1 = "おい!"; + if (!rn2(3)) arg2 = "ゴホン."; +#endif } if (shkp->mcanmove || !shkp->msleeping) @@ -3943,18 +4705,37 @@ eshkp = ESHK(shkp); if(eshkp->credit >= amount) { if(eshkp->credit > amount) +#if 0 /*JP*/ Your("credit is reduced by %ld %s.", +#else + Your("預け金は%ld%s減った.", +#endif amount, currency(amount)); +#if 0 /*JP*/ else Your("credit is erased."); +#else + else Your("預け金は帳消しになった."); +#endif eshkp->credit -= amount; } else { delta = amount - eshkp->credit; if(eshkp->credit) +/*JP Your("credit is erased."); +*/ + Your("預け金は帳消しになった."); if(eshkp->debit) +#if 0 /*JP*/ Your("debt increases by %ld %s.", +#else + Your("借金は%ld%s増えた.", +#endif delta, currency(delta)); +#if 0 /*JP*/ else You("owe %s %ld %s.", +#else + else You("%sに%ld%sの借りをつくった.", +#endif shkname(shkp), delta, currency(delta)); eshkp->debit += delta; eshkp->loan += delta; @@ -3987,8 +4768,13 @@ && shkp->mcanmove && !shkp->msleeping && (ESHK(shkp)->debit || ESHK(shkp)->billct || ESHK(shkp)->robbed)) { +#if 0 /*JP*/ pline("%s%s blocks your way!", shkname(shkp), Invis ? " senses your motion and" : ""); +#else + pline("%sは%sあなたの前に立ちふさがった!", shkname(shkp), + Invis ? "動きを感じとり," : ""); +#endif return(TRUE); } return(FALSE); @@ -4026,8 +4812,13 @@ || u.usteed #endif )) { +#if 0 /*JP*/ pline("%s%s blocks your way!", shkname(shkp), Invis ? " senses your motion and" : ""); +#else + pline("%s%sあなたの前に立ちふさがった!", shkname(shkp), + Invis ? "動きを感じとり," : ""); +#endif return(TRUE); } return(FALSE); @@ -4042,7 +4833,11 @@ struct obj *obj; { if (!shk_owns(buf, obj) && !mon_owns(buf, obj)) +#if 0 /*JP*/ Strcpy(buf, carried(obj) ? "your" : "the"); +#else + Strcpy(buf, ""); +#endif return buf; } @@ -4052,7 +4847,9 @@ struct obj *obj; { (void) shk_your(buf, obj); +#if 0 /*JP*/ *buf = highc(*buf); +#endif return buf; } @@ -4068,7 +4865,17 @@ (obj->unpaid || (obj->where==OBJ_FLOOR && !obj->no_charge && costly_spot(x,y)))) { shkp = shop_keeper(inside_shop(x, y)); +#if 0 /*JP*/ return strcpy(buf, shkp ? s_suffix(shkname(shkp)) : "the"); +#else + if (shkp) { + strcpy(buf, shkname(shkp)); + strcat(buf, "の"); + } else { + strcpy(buf, ""); + } + return buf; +#endif } return (char *)0; } @@ -4079,7 +4886,15 @@ struct obj *obj; { if (obj->where == OBJ_MINVENT) +#if 0 /*JP*/ return strcpy(buf, s_suffix(mon_nam(obj->ocarry))); +#else + { + strcpy(buf, mon_nam(obj->ocarry)); + strcat(buf, "の"); + return buf; + } +#endif return (char *)0; } diff -aurbN -xCVS -xXTAGS nethack/src/shknam.c jnethack/src/shknam.c --- nethack/src/shknam.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/shknam.c 2003-12-10 03:32:01.000000000 +0900 @@ -4,6 +4,13 @@ /* shknam.c -- initialize a shop */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "eshk.h" @@ -183,39 +190,72 @@ */ const struct shclass shtypes[] = { +/*JP {"general store", RANDOM_CLASS, 44, +*/ + {"雑貨屋", RANDOM_CLASS, 44, D_SHOP, {{100, RANDOM_CLASS}, {0, 0}, {0, 0}}, shkgeneral}, +/*JP {"used armor dealership", ARMOR_CLASS, 14, +*/ + {"中古鎧商会", ARMOR_CLASS, 14, D_SHOP, {{90, ARMOR_CLASS}, {10, WEAPON_CLASS}, {0, 0}}, shkarmors}, +/*JP {"second-hand bookstore", SCROLL_CLASS, 10, D_SHOP, +*/ + {"古書店", SCROLL_CLASS, 10, D_SHOP, {{90, SCROLL_CLASS}, {10, SPBOOK_CLASS}, {0, 0}}, shkbooks}, +/*JP {"liquor emporium", POTION_CLASS, 10, D_SHOP, +*/ + {"お酒の百貨店", POTION_CLASS, 10, D_SHOP, {{100, POTION_CLASS}, {0, 0}, {0, 0}}, shkliquors}, +/*JP {"antique weapons outlet", WEAPON_CLASS, 5, D_SHOP, +*/ + {"古武器専門小売店", WEAPON_CLASS, 5, D_SHOP, {{90, WEAPON_CLASS}, {10, ARMOR_CLASS}, {0, 0}}, shkweapons}, +/*JP {"delicatessen", FOOD_CLASS, 5, D_SHOP, +*/ + {"食品店", FOOD_CLASS, 5, D_SHOP, {{83, FOOD_CLASS}, {5, -POT_FRUIT_JUICE}, {4, -POT_BOOZE}, {5, -POT_WATER}, {3, -ICE_BOX}}, shkfoods}, +/*JP {"jewelers", RING_CLASS, 3, D_SHOP, +*/ + {"宝石店", RING_CLASS, 3, D_SHOP, {{85, RING_CLASS}, {10, GEM_CLASS}, {5, AMULET_CLASS}, {0, 0}}, shkrings}, +/*JP {"quality apparel and accessories", WAND_CLASS, 3, D_SHOP, +*/ + {"おシャレな洋品店", WAND_CLASS, 3, D_SHOP, {{90, WAND_CLASS}, {5, -LEATHER_GLOVES}, {5, -ELVEN_CLOAK}, {0, 0}}, shkwands}, +/*JP {"hardware store", TOOL_CLASS, 3, D_SHOP, +*/ + {"道具屋", TOOL_CLASS, 3, D_SHOP, {{100, TOOL_CLASS}, {0, 0}, {0, 0}}, shktools}, /* Actually shktools is ignored; the code specifically chooses a * random implementor name (along with candle shops having * random shopkeepers) */ +/*JP {"rare books", SPBOOK_CLASS, 3, D_SHOP, +*/ + {"幻の本屋", SPBOOK_CLASS, 3, D_SHOP, {{90, SPBOOK_CLASS}, {10, SCROLL_CLASS}, {0, 0}}, shkbooks}, /* Shops below this point are "unique". That is they must all have a * probability of zero. They are only created via the special level * loader. */ +/*JP {"lighting store", TOOL_CLASS, 0, D_SHOP, +*/ + {"照明店", TOOL_CLASS, 0, D_SHOP, {{32, -WAX_CANDLE}, {50, -TALLOW_CANDLE}, {5, -BRASS_LANTERN}, {10, -OIL_LAMP}, {3, -MAGIC_LAMP}}, shklight}, {(char *)0, 0, 0, 0, {{0, 0}, {0, 0}, {0, 0}}, 0} @@ -275,7 +315,11 @@ struct monst *shk; const char * const *nlp; { +#if 0 /*JP*/ int i, trycnt, names_avail; +#else + int trycnt, names_avail; +#endif const char *shname = 0; struct monst *mtmp; int name_wanted; @@ -287,6 +331,32 @@ shname = "Izchak"; shk->female = FALSE; } else { +#if 1 /*JP*/ + /* We decide to use simple way */ + for (names_avail = 0; nlp[names_avail]; names_avail++) + ; + + for (trycnt = 0; trycnt < 50; trycnt++) { + name_wanted = rn2(names_avail); + shk->female = name_wanted & 1; + shname = nlp[name_wanted]; + if(shname[0] & 0x80){ + shk->female = 0; + } + else if(shname[0] == '_'){ + ++shname; + shk->female = 1; + } + for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { + if (mtmp == shk) continue; + if (!mtmp->isshk) continue; + if (strcmp(ESHK(mtmp)->shknam, shname)) continue; + break; + } + if(!mtmp) + break; + } +#else /* We want variation from game to game, without needing the save and restore support which would be necessary for randomization; try not to make too many assumptions about time_t's internals; @@ -326,6 +396,7 @@ } if (!mtmp) break; /* new name */ } +#endif } (void) strncpy(ESHK(shk)->shknam, shname, PL_NSIZ); ESHK(shk)->shknam[PL_NSIZ-1] = 0; @@ -464,7 +535,10 @@ else if(inside_shop(sx-1,sy)) m++; if(inside_shop(sx,sy+1)) n--; else if(inside_shop(sx,sy-1)) n++; +/*JP Sprintf(buf, "Closed for inventory"); +*/ + Sprintf(buf, "棚卸しのため閉店"); make_engr_at(m, n, buf, 0L, DUST); } diff -aurbN -xCVS -xXTAGS nethack/src/sit.c jnethack/src/sit.c --- nethack/src/sit.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/sit.c 2004-10-09 02:21:01.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "artifact.h" @@ -10,9 +17,15 @@ { #ifndef GOLDOBJ if (u.ugold <= 0) { +/*JP You_feel("a strange sensation."); +*/ + You("奇妙な感覚を覚えた."); } else { +/*JP You("notice you have no gold!"); +*/ + You("お金を持ってないことに気がついた!"); u.ugold = 0; flags.botl = 1; } @@ -27,9 +40,15 @@ } } if (!lost_money) { +/*JP You_feel("a strange sensation."); +*/ + You("奇妙な感覚を覚えた."); } else { +/*JP You("notice you have no money!"); +*/ + You("お金を持ってないことに気がついた!"); flags.botl = 1; } #endif @@ -38,23 +57,35 @@ int dosit() { +/*JP static const char sit_message[] = "sit on the %s."; +*/ + static const char sit_message[] = "%sに座った."; register struct trap *trap; register int typ = levl[u.ux][u.uy].typ; #ifdef STEED if (u.usteed) { +/*JP You("are already sitting on %s.", mon_nam(u.usteed)); +*/ + You("もう%sに座っている.", mon_nam(u.usteed)); return (0); } #endif if(!can_reach_floor()) { if (Levitation) +/*JP You("tumble in place."); +*/ + You("その場で宙返りした."); else +/*JP You("are sitting on air."); +*/ + You("空中に座った."); return 0; } else if (is_pool(u.ux, u.uy) && !Underwater) { /* water walking */ goto in_water; @@ -64,9 +95,15 @@ register struct obj *obj; obj = level.objects[u.ux][u.uy]; +/*JP You("sit on %s.", the(xname(obj))); +*/ + You("%sに座った.", the(xname(obj))); if (!(Is_box(obj) || objects[obj->otyp].oc_material == CLOTH)) +/*JP pline("It's not very comfortable..."); +*/ + pline("あまり座りごこちがよくない..."); } else if ((trap = t_at(u.ux, u.uy)) != 0 || (u.utrap && (u.utraptype >= TT_LAVA))) { @@ -74,110 +111,207 @@ if (u.utrap) { exercise(A_WIS, FALSE); /* you're getting stuck longer */ if(u.utraptype == TT_BEARTRAP) { +/*JP You_cant("sit down with your %s in the bear trap.", body_part(FOOT)); +*/ + pline("%sが熊の罠にはさまっているので座れない.", body_part(FOOT)); u.utrap++; } else if(u.utraptype == TT_PIT) { if(trap->ttyp == SPIKED_PIT) { +/*JP You("sit down on a spike. Ouch!"); +*/ + You("トゲの上に座った.いてっ!"); +/*JP losehp(1, "sitting on an iron spike", KILLED_BY); +*/ + losehp(1, "鉄のトゲの上に座って", KILLED_BY); exercise(A_STR, FALSE); } else +/*JP You("sit down in the pit."); +*/ + You("落し穴の中で座った."); u.utrap += rn2(5); } else if(u.utraptype == TT_WEB) { +/*JP You("sit in the spider web and get entangled further!"); +*/ + You("くもの巣の中で座ったら,より絡まった!"); u.utrap += rn1(10, 5); } else if(u.utraptype == TT_LAVA) { /* Must have fire resistance or they'd be dead already */ +/*JP You("sit in the lava!"); +*/ + You("溶岩の中に座った!"); u.utrap += rnd(4); +/*JP losehp(d(2,10), "sitting in lava", KILLED_BY); +*/ + losehp(d(2,10), "溶岩の中に座って", KILLED_BY); } else if(u.utraptype == TT_INFLOOR) { +/*JP You_cant("maneuver to sit!"); +*/ + You("座るような動作ができない!"); u.utrap++; } } else { +/*JP You("sit down."); +*/ + You("座った."); dotrap(trap, 0); } } else if(Underwater || Is_waterlevel(&u.uz)) { if (Is_waterlevel(&u.uz)) +/*JP There("are no cushions floating nearby."); +*/ + pline("近くに浮いているクッションはない."); else +/*JP You("sit down on the muddy bottom."); +*/ + You("どろどろした底に座った."); } else if(is_pool(u.ux, u.uy)) { in_water: +/*JP You("sit in the water."); +*/ + You("水の中で座った."); if (!rn2(10) && uarm) +/*JP (void) rust_dmg(uarm, "armor", 1, TRUE, &youmonst); +*/ + (void) rust_dmg(uarm, "鎧", 1, TRUE, &youmonst); if (!rn2(10) && uarmf && uarmf->otyp != WATER_WALKING_BOOTS) +/*JP (void) rust_dmg(uarm, "armor", 1, TRUE, &youmonst); +*/ + (void) rust_dmg(uarm, "鎧", 1, TRUE, &youmonst); #ifdef SINKS } else if(IS_SINK(typ)) { +/*JP You(sit_message, defsyms[S_sink].explanation); +*/ + You(sit_message, jtrns_obj('S', defsyms[S_sink].explanation)); +/*JP Your("%s gets wet.", humanoid(youmonst.data) ? "rump" : "underside"); +*/ + Your("%sは濡れた.", humanoid(youmonst.data) ? "尻" : "下部"); #endif } else if(IS_ALTAR(typ)) { +/*JP You(sit_message, defsyms[S_altar].explanation); +*/ + You(sit_message, jtrns_obj('S', defsyms[S_altar].explanation)); altar_wrath(u.ux, u.uy); } else if(IS_GRAVE(typ)) { +/*JP You(sit_message, defsyms[S_grave].explanation); +*/ + You(sit_message, jtrns_obj('S', defsyms[S_grave].explanation)); } else if(typ == STAIRS) { +/*JP You(sit_message, "stairs"); +*/ + You(sit_message, "階段"); } else if(typ == LADDER) { +/*JP You(sit_message, "ladder"); +*/ + You(sit_message, "はしご"); } else if (is_lava(u.ux, u.uy)) { /* must be WWalking */ +/*JP You(sit_message, "lava"); +*/ + You(sit_message, "溶岩"); burn_away_slime(); if (likes_lava(youmonst.data)) { +/*JP pline_The("lava feels warm."); +*/ + pline("溶岩は暖かい."); return 1; } +#if 0 /*JP*/ pline_The("lava burns you!"); losehp(d((Fire_resistance ? 2 : 10), 10), "sitting on lava", KILLED_BY); +#else + You("溶岩で燃えた!"); + losehp(d((Fire_resistance ? 2 : 10), 10), + "溶岩に座って", KILLED_BY); +#endif } else if (is_ice(u.ux, u.uy)) { +/*JP You(sit_message, defsyms[S_ice].explanation); +*/ + You(sit_message, jtrns_obj('S', defsyms[S_ice].explanation)); +/*JP if (!Cold_resistance) pline_The("ice feels cold."); +*/ + if (!Cold_resistance) pline("氷は冷たく感じた."); } else if (typ == DRAWBRIDGE_DOWN) { +/*JP You(sit_message, "drawbridge"); +*/ + You(sit_message, "跳ね橋"); } else if(IS_THRONE(typ)) { +/*JP You(sit_message, defsyms[S_throne].explanation); +*/ + You(sit_message, jtrns_obj('S', defsyms[S_throne].explanation)); if (rnd(6) > 4) { switch (rnd(13)) { case 1: (void) adjattrib(rn2(A_MAX), -rn1(4,3), FALSE); +/*JP losehp(rnd(10), "cursed throne", KILLED_BY_AN); +*/ + losehp(rnd(10), "呪われた玉座で", KILLED_BY_AN); break; case 2: (void) adjattrib(rn2(A_MAX), 1, FALSE); break; case 3: +#if 0 /*JP*/ pline("A%s electric shock shoots through your body!", (Shock_resistance) ? "n" : " massive"); losehp(Shock_resistance ? rnd(6) : rnd(30), "electric chair", KILLED_BY_AN); +#else + pline("%s電気があなたの体を走り抜けた!", + (Shock_resistance) ? "" : "激しい"); + losehp(Shock_resistance ? rnd(6) : rnd(30), + "電気椅子で", KILLED_BY_AN); +#endif exercise(A_CON, FALSE); break; case 4: +/*JP You_feel("much, much better!"); +*/ + You_feel("とても,とても元気になったような気がした!"); if (Upolyd) { if (u.mh >= (u.mhmax - 5)) u.mhmax += 4; u.mh = u.mhmax; @@ -194,7 +328,10 @@ break; case 6: if(u.uluck + rn2(5) < 0) { +/*JP You_feel("your luck is changing."); +*/ + pline("運がよくなったような気がする."); change_luck(1); } else makewish(); break; @@ -202,22 +339,39 @@ { register int cnt = rnd(10); +#if 0 /*JP*/ pline("A voice echoes:"); verbalize("Thy audience hath been summoned, %s!", flags.female ? "Dame" : "Sire"); +#else + pline("声が響いた:"); + verbalize("%sよ!汝の聴衆召喚されし.", + flags.female ? "女" : "男"); +#endif while(cnt--) (void) makemon(courtmon(), u.ux, u.uy, NO_MM_FLAGS); break; } case 8: +#if 0 /*JP*/ pline("A voice echoes:"); verbalize("By thy Imperious order, %s...", flags.female ? "Dame" : "Sire"); +#else + pline("声が響いた:"); + verbalize("%sよ!汝の傲慢聞きいれようぞ.", + flags.female ? "女" : "男"); +#endif do_genocide(5); /* REALLY|ONTHRONE, see do_genocide() */ break; case 9: +#if 0 /*JP*/ pline("A voice echoes:"); verbalize("A curse upon thee for sitting upon this most holy throne!"); +#else + pline("声が響いた:"); + verbalize("聖なる玉座に座りし汝に呪いあれ!"); +#endif if (Luck > 0) { make_blinded(Blinded + rn1(100,250),TRUE); } else rndcurse(); @@ -226,38 +380,59 @@ if (Luck < 0 || (HSee_invisible & INTRINSIC)) { if (level.flags.nommap) { pline( +/*JP "A terrible drone fills your head!"); +*/ + "恐しいブンブンという音が頭に響いた!"); make_confused(HConfusion + rnd(30), FALSE); } else { +/*JP pline("An image forms in your mind."); +*/ + pline("あるイメージが頭に浮んだ."); do_mapping(); } } else { +/*JP Your("vision becomes clear."); +*/ + Your("視界は冴え渡った."); HSee_invisible |= FROMOUTSIDE; newsym(u.ux, u.uy); } break; case 11: if (Luck < 0) { +/*JP You_feel("threatened."); +*/ + You("脅迫されているような気がした."); aggravate(); } else { +/*JP You_feel("a wrenching sensation."); +*/ + You("ねじられたような感覚を感じた."); tele(); /* teleport him */ } break; case 12: +/*JP You("are granted an insight!"); +*/ + You("洞察力を得た!"); if (invent) { /* rn2(5) agrees w/seffects() */ identify_pack(rn2(5)); } break; case 13: +/*JP Your("mind turns into a pretzel!"); +*/ + Your("心はクネクネになった!"); make_confused(HConfusion + rn1(7,16),FALSE); break; default: impossible("throne effect"); @@ -265,15 +440,24 @@ } } else { if (is_prince(youmonst.data)) +/*JP You_feel("very comfortable here."); +*/ + You("ここはとても落ち着く."); else +/*JP You_feel("somehow out of place..."); +*/ + You("何故か場違いの気がした..."); } if (!rn2(3) && IS_THRONE(levl[u.ux][u.uy].typ)) { /* may have teleported */ levl[u.ux][u.uy].typ = ROOM; +/*JP pline_The("throne vanishes in a puff of logic."); +*/ + pline("玉座はふっと消えた."); newsym(u.ux,u.uy); } @@ -281,12 +465,18 @@ struct obj *uegg; if (!flags.female) { +/*JP pline("Males can't lay eggs!"); +*/ + pline("雄は卵を産めない!"); return 0; } if (u.uhunger < (int)objects[EGG].oc_nutrition) { +/*JP You("don't have enough energy to lay an egg."); +*/ + You("卵を産むだけのエネルギーがない."); return 0; } @@ -297,14 +487,23 @@ uegg->corpsenm = egg_type_from_parent(u.umonnum, FALSE); uegg->known = uegg->dknown = 1; attach_egg_hatch_timeout(uegg); +/*JP You("lay an egg."); +*/ + You("卵を産んだ."); dropy(uegg); stackobj(uegg); morehungry((int)objects[EGG].oc_nutrition); } else if (u.uswallow) +/*JP There("are no seats in here!"); +*/ + pline("ここには椅子はない!"); else +/*JP pline("Having fun sitting on the %s?", surface(u.ux,u.uy)); +*/ + pline("%sに座って楽しいかい?", surface(u.ux,u.uy)); return(1); } @@ -314,16 +513,25 @@ int nobj = 0; int cnt, onum; struct obj *otmp; +/*JP static const char mal_aura[] = "feel a malignant aura surround %s."; +*/ + static const char mal_aura[] = "邪悪なオーラを%sの回りに感じた."; if (uwep && (uwep->oartifact == ART_MAGICBANE) && rn2(20)) { +/*JP You(mal_aura, "the magic-absorbing blade"); +*/ + You(mal_aura, "魔力を吸いとる刀"); return; } if(Antimagic) { shieldeff(u.ux, u.uy); +/*JP You(mal_aura, "you"); +*/ + You(mal_aura, "あなた"); } for (otmp = invent; otmp; otmp = otmp->nobj) { @@ -350,7 +558,10 @@ if(otmp->oartifact && spec_ability(otmp, SPFX_INTEL) && rn2(10) < 8) { +/*JP pline("%s!", Tobjnam(otmp, "resist")); +*/ + pline("%sは影響を受けない!", xname(otmp)); continue; } @@ -372,10 +583,16 @@ else curse(otmp); if (!Blind) { +#if 0 /*JP*/ pline("%s %s %s.", s_suffix(upstart(y_monnam(u.usteed))), aobjnam(otmp, "glow"), hcolor(otmp->cursed ? NH_BLACK : (const char *)"brown")); +#else + pline("%sは%sに輝いた.", + upstart(y_monnam(u.usteed)), + hcolor(otmp->cursed ? NH_BLACK : (const char *)"茶色の")); +#endif otmp->bknown = TRUE; } } @@ -388,60 +605,97 @@ switch(rnd(11)) { case 1 : if (HFire_resistance & INTRINSIC) { HFire_resistance &= ~INTRINSIC; +/*JP You_feel("warmer."); +*/ + You("暖かさを感じた."); break; } case 2 : if (HTeleportation & INTRINSIC) { HTeleportation &= ~INTRINSIC; +/*JP You_feel("less jumpy."); +*/ + You("ちょっと落ちついた."); break; } case 3 : if (HPoison_resistance & INTRINSIC) { HPoison_resistance &= ~INTRINSIC; +/*JP You_feel("a little sick!"); +*/ + You("少し気分が悪くなった!"); break; } case 4 : if (HTelepat & INTRINSIC) { HTelepat &= ~INTRINSIC; if (Blind && !Blind_telepat) see_monsters(); /* Can't sense mons anymore! */ +/*JP Your("senses fail!"); +*/ + Your("五感は麻痺した!"); break; } case 5 : if (HCold_resistance & INTRINSIC) { HCold_resistance &= ~INTRINSIC; +/*JP You_feel("cooler."); +*/ + You("涼しさを感じた."); break; } case 6 : if (HInvis & INTRINSIC) { HInvis &= ~INTRINSIC; +/*JP You_feel("paranoid."); +*/ + You("妄想を抱いた."); break; } case 7 : if (HSee_invisible & INTRINSIC) { HSee_invisible &= ~INTRINSIC; +#if 0 /*JP*/ You("%s!", Hallucination ? "tawt you taw a puttie tat" : "thought you saw something"); +#else + if(Hallucination) + You("だれ蟹みら,れている."); + else + You("誰かに見られているような気がした!"); +#endif break; } case 8 : if (HFast & INTRINSIC) { HFast &= ~INTRINSIC; +/*JP You_feel("slower."); +*/ + You("遅くなったような気がした."); break; } case 9 : if (HStealth & INTRINSIC) { HStealth &= ~INTRINSIC; +/*JP You_feel("clumsy."); +*/ + You("不器用になったような気がした."); break; } case 10: if (HProtection & INTRINSIC) { HProtection &= ~INTRINSIC; +/*JP You_feel("vulnerable."); +*/ + You("無防備になった気がした."); break; } case 11: if (HAggravate_monster & INTRINSIC) { HAggravate_monster &= ~INTRINSIC; +/*JP You_feel("less attractive."); +*/ + You("魅力が失せたような気がした."); break; } default: break; diff -aurbN -xCVS -xXTAGS nethack/src/sounds.c jnethack/src/sounds.c --- nethack/src/sounds.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/sounds.c 2005-03-03 23:11:29.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) 1989 Janet Walz, Mike Threepoint */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "edog.h" #ifdef USER_SOUNDS @@ -48,29 +55,62 @@ if (level.flags.nfountains && !rn2(400)) { static const char * const fountain_msg[4] = { +/*JP "bubbling water.", +*/ + "ゴボゴボという音を聞いた.", +/*JP "water falling on coins.", +*/ + "ピチャピチャという音を聞いた.", +/*JP "the splashing of a naiad.", +*/ + "バシャバシャという音を聞いた.", +/*JP "a soda fountain!", +*/ + "炭酸飲料のシューという音を聞いた." }; You_hear(fountain_msg[rn2(3)+hallu]); } #ifdef SINK if (level.flags.nsinks && !rn2(300)) { static const char * const sink_msg[3] = { +/*JP "a slow drip.", +*/ + "水がぽたぽたと落ちる音を聞いた.", +/*JP "a gurgling noise.", +*/ + "がらがらという音を聞いた.", +/*JP "dishes being washed!", +*/ + "皿を洗う音を聞いた.", }; You_hear(sink_msg[rn2(2)+hallu]); } #endif if (level.flags.has_court && !rn2(200)) { static const char * const throne_msg[4] = { +/*JP "the tones of courtly conversation.", +*/ + "上品な話し声を聞いた.", +/*JP "a sceptre pounded in judgment.", +*/ + "裁判で笏を突く音を聞いた.", +/*JP "Someone shouts \"Off with %s head!\"", +*/ + "だれかが「そのものの首を跳ねよ」と叫ぶ声を聞いた.", +/*JP "Queen Beruthiel's cats!", +*/ + "ベルサイユ女王の猫の声を聞いた.", }; for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; @@ -89,11 +129,29 @@ } if (level.flags.has_swamp && !rn2(200)) { static const char * const swamp_msg[3] = { +#if 0 /*JP*/ "hear mosquitoes!", "smell marsh gas!", /* so it's a smell...*/ "hear Donald Duck!", +#else + "蚊の羽音を聞いた.", + "腐った匂いがした!", /* so it's a smell...*/ + "ドナルドダックの声を聞いた!", +#endif }; +#if 0 /*JP*/ You(swamp_msg[rn2(2)+hallu]); +#else + { + int c; + c = rn2(2)+hallu; + if(c == 1){ + pline(swamp_msg[c]); + } else { + You_hear(swamp_msg[c]); + } + } +#endif return; } if (level.flags.has_vault && !rn2(200)) { @@ -122,19 +180,33 @@ #endif /* AZTEC_C_WORKAROUND */ { if (gold_in_vault) +#if 0 /*JP*/ You_hear(!hallu ? "someone counting money." : "the quarterback calling the play."); +#else + You_hear(!hallu ? "誰かがお金を数えている音を聞いた." : + "クォータバックが指示をする声を聞いた."); +#endif else +/*JP You_hear("someone searching."); +*/ + You_hear("誰かが捜索している音を聞いた."); break; } /* fall into... (yes, even for hallucination) */ } case 0: +/*JP You_hear("the footsteps of a guard on patrol."); +*/ + You_hear("警備員のパトロールする音を聞いた."); break; case 2: +/*JP You_hear("Ebenezer Scrooge!"); +*/ + You_hear("こち亀の両さんの声を聞いた!"); break; } return; @@ -146,14 +218,25 @@ mon_in_room(mtmp, BEEHIVE)) { switch (rn2(2)+hallu) { case 0: +/*JP You_hear("a low buzzing."); +*/ + You_hear("ぶーんという音を聞いた."); break; case 1: +/*JP You_hear("an angry drone."); +*/ + You_hear("興奮した雄バチの音を聞いた."); break; case 2: +#if 0 /*JP*/ You_hear("bees in your %sbonnet!", uarmh ? "" : "(nonexistent) "); +#else + You_hear("ハチがあなたの帽子%sの中にいる音を聞いた!", + uarmh ? "" : "(被ってないけど)"); +#endif break; } return; @@ -167,15 +250,28 @@ mon_in_room(mtmp, MORGUE)) { switch (rn2(2)+hallu) { case 0: +/*JP You("suddenly realize it is unnaturally quiet."); +*/ + You("不自然なくらい静かなのに気づいた."); break; case 1: +#if 0 /*JP*/ pline_The("%s on the back of your %s stands up.", body_part(HAIR), body_part(NECK)); +#else + pline("あなたの%sのうしろの%sが逆立った.", + body_part(NECK), body_part(HAIR)); +#endif break; case 2: +#if 0 /*JP*/ pline_The("%s on your %s seems to stand up.", body_part(HAIR), body_part(HEAD)); +#else + pline("あなたの%sの%sは逆立った.", + body_part(HEAD), body_part(HAIR)); +#endif break; } return; @@ -184,10 +280,17 @@ } if (level.flags.has_barracks && !rn2(200)) { static const char * const barracks_msg[4] = { +#if 0 /*JP*/ "blades being honed.", "loud snoring.", "dice being thrown.", "General MacArthur!", +#else + "刃物を研ぐ音を聞いた.", + "大きないびきを聞いた.", + "ダイスが振られる音を聞いた.", + "マッカーサー将軍の声を聞いた.", +#endif }; int count = 0; @@ -208,9 +311,15 @@ } if (level.flags.has_zoo && !rn2(200)) { static const char * const zoo_msg[3] = { +#if 0 /*JP*/ "a sound reminiscent of an elephant stepping on a peanut.", "a sound reminiscent of a seal barking.", "Doctor Doolittle!", +#else + "象がピーナッツの上で踊るような音を聞いた.", + "アシカが吠えるような音を聞いた.", + "ドリトル先生の声を聞いた.", +#endif }; for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; @@ -230,9 +339,15 @@ if (tended_shop(sroom) && !index(u.ushops, ROOM_INDEX(sroom) + ROOMOFFSET)) { static const char * const shop_msg[3] = { +#if 0 /*JP*/ "someone cursing shoplifters.", "the chime of a cash register.", "Neiman and Marcus arguing!", +#else + "誰かが泥棒をののしる声を聞いた.", + "レジのチーンという音を聞いた.", + "イトーとヨーカドーの議論を聞いた!", +#endif }; You_hear(shop_msg[rn2(2)+hallu]); } @@ -246,11 +361,19 @@ /* and don't produce silly effects when she's clearly visible */ if (mtmp && (hallu || !canseemon(mtmp))) { static const char * const ora_msg[5] = { +#if 0 /*JP*/ "a strange wind.", /* Jupiter at Dodona */ "convulsive ravings.", /* Apollo at Delphi */ "snoring snakes.", /* AEsculapius at Epidaurus */ "someone say \"No more woodchucks!\"", "a loud ZOT!" /* both rec.humor.oracle */ +#else + "奇妙な風の音を聞いた.", + "半狂乱の声を聞いた.", + "蛇の咆哮を聞いた.", + "誰かが「もうウッドチャックはいらない」と言っている声を聞いた.", + "大きなZOTを聞いた!" +#endif }; You_hear(ora_msg[rn2(3)+hallu*2]); } @@ -262,8 +385,15 @@ #ifdef OVLB static const char * const h_sounds[] = { +#if 0 /*JP*/ "beep", "boing", "sing", "belche", "creak", "cough", "rattle", "ululate", "pop", "jingle", "sniffle", "tinkle", "eep" +#else + "ピーッと鳴いた","騒ぎたてた","歌った","キーキーと鳴いた", + "せき込んだ","ゴロゴロ鳴った","ホーホー鳴いた","ポンと鳴いた", + "ガランガランと鳴いた","クンクン鳴いた","チリンチリンと鳴いた", + "イーッと鳴いた" +#endif }; const char * @@ -275,35 +405,65 @@ switch (mtmp->data->msound) { case MS_MEW: case MS_HISS: +/*JP ret = "hiss"; +*/ + ret = "シーッと鳴いた"; break; case MS_BARK: case MS_GROWL: +/*JP ret = "growl"; +*/ + ret = "はげしく吠えた"; break; case MS_ROAR: +/*JP ret = "roar"; +*/ + ret = "吠えた"; break; case MS_BUZZ: +/*JP ret = "buzz"; +*/ + ret = "ブーッと鳴いた"; break; case MS_SQEEK: +/*JP ret = "squeal"; +*/ + ret = "キーキー鳴いた"; break; case MS_SQAWK: +/*JP ret = "screech"; +*/ + ret = "金切り声を立てた"; break; case MS_NEIGH: +/*JP ret = "neigh"; +*/ + ret = "いなないた"; break; case MS_WAIL: +/*JP ret = "wail"; +*/ + ret = "悲しく鳴いた"; break; case MS_SILENT: +/*JP ret = "commotion"; +*/ + ret = "興奮した"; break; default: +/*JP ret = "scream"; +*/ + ret = "金切り声をあげた"; } return ret; } @@ -324,7 +484,10 @@ else growl_verb = growl_sound(mtmp); if (growl_verb) { +/*JP pline("%s %s!", Monnam(mtmp), vtense((char *)0, growl_verb)); +*/ + pline("%sは%s!", Monnam(mtmp), makeplural(growl_verb)); if(flags.run) nomul(0); wake_nearto(mtmp->mx, mtmp->my, mtmp->data->mlevel * 18); } @@ -345,27 +508,48 @@ yelp_verb = h_sounds[rn2(SIZE(h_sounds))]; else switch (mtmp->data->msound) { case MS_MEW: +/*JP yelp_verb = "yowl"; +*/ + yelp_verb = "悲しく鳴いた"; break; case MS_BARK: case MS_GROWL: +/*JP yelp_verb = "yelp"; +*/ + yelp_verb = "キャンキャン鳴いた"; break; case MS_ROAR: +/*JP yelp_verb = "snarl"; +*/ + yelp_verb = "うなった"; break; case MS_SQEEK: +/*JP yelp_verb = "squeal"; +*/ + yelp_verb = "キーキー鳴いた"; break; case MS_SQAWK: +/*JP yelp_verb = "screak"; +*/ + yelp_verb = "金切り声を立てた"; break; case MS_WAIL: +/*JP yelp_verb = "wail"; +*/ + yelp_verb = "悲しく鳴いた"; break; } if (yelp_verb) { +/*JP pline("%s %s!", Monnam(mtmp), vtense((char *)0, yelp_verb)); +*/ + pline("%sは%s!", Monnam(mtmp), yelp_verb); if(flags.run) nomul(0); wake_nearto(mtmp->mx, mtmp->my, mtmp->data->mlevel * 12); } @@ -387,17 +571,29 @@ else switch (mtmp->data->msound) { case MS_MEW: case MS_GROWL: +/*JP whimper_verb = "whimper"; +*/ + whimper_verb = "クンクン鳴いた"; break; case MS_BARK: +/*JP whimper_verb = "whine"; +*/ + whimper_verb = "クーンと鳴いた"; break; case MS_SQEEK: +/*JP whimper_verb = "squeal"; +*/ + whimper_verb = "キーキー鳴いた"; break; } if (whimper_verb) { +/*JP pline("%s %s.", Monnam(mtmp), vtense((char *)0, whimper_verb)); +*/ + pline("%sは%s.", Monnam(mtmp), whimper_verb); if(flags.run) nomul(0); wake_nearto(mtmp->mx, mtmp->my, mtmp->data->mlevel * 6); } @@ -418,7 +614,10 @@ else if (mtmp->data->msound >= MS_HUMANOID) { if (!canspotmon(mtmp)) map_invisible(mtmp->mx, mtmp->my); +/*JP verbalize("I'm hungry."); +*/ + verbalize("はらぺこだ."); } } @@ -470,17 +669,28 @@ boolean nightchild = (Upolyd && (u.umonnum == PM_WOLF || u.umonnum == PM_WINTER_WOLF || u.umonnum == PM_WINTER_WOLF_CUB)); +#if 0 /*JP*/ const char *racenoun = (flags.female && urace.individual.f) ? urace.individual.f : (urace.individual.m) ? urace.individual.m : urace.noun; +#else + const char *racenoun = (flags.female) ? "あなた" : "おまえ" ; +#endif if (mtmp->mtame) { if (kindred) { +#if 0 /*JP*/ Sprintf(verbuf, "Good %s to you Master%s", isnight ? "evening" : "day", isnight ? "!" : ". Why do we not rest?"); +#else + Sprintf(verbuf, "ご主人様,%s%s", + isnight ? "こんばんは" : "こんにちは", + isnight ? "!" : ".お休みになりませんか?"); +#endif verbl_msg = verbuf; } else { +#if 0 /*JP*/ Sprintf(verbuf,"%s%s", nightchild ? "Child of the night, " : "", midnight() ? @@ -488,36 +698,70 @@ isnight ? "I beg you, help me satisfy this growing craving!" : "I find myself growing a little weary."); +#else + Sprintf(verbuf,"%s%s", + nightchild ? "夜の仔よ," : "", + midnight() ? + "私はこれ以上渇望を抑えられない!" : + isnight ? + "ふくれあがる渇望を満たすのを助けてくれないか?頼む!" : + "私は少々疲れたようだ."); +#endif verbl_msg = verbuf; } } else if (mtmp->mpeaceful) { if (kindred && isnight) { +#if 0 /*JP*/ Sprintf(verbuf, "Good feeding %s!", flags.female ? "sister" : "brother"); +#else + Sprintf(verbuf, "よう兄弟!"); +#endif verbl_msg = verbuf; } else if (nightchild && isnight) { +#if 0 /*JP*/ Sprintf(verbuf, "How nice to hear you, child of the night!"); +#else + Sprintf(verbuf, + "夜の仔よ,元気そうだな!"); +#endif verbl_msg = verbuf; } else +/*JP verbl_msg = "I only drink... potions."; +*/ + verbl_msg = "私は薬..しか飲まない"; } else { int vampindex; static const char * const vampmsg[] = { /* These first two (0 and 1) are specially handled below */ +#if 0 /*JP*/ "I vant to suck your %s!", "I vill come after %s without regret!", +#else + "お前の%sをよこせ!", + "存分に%sを追撃させてもらおう!", +#endif /* other famous vampire quotes can follow here if desired */ }; if (kindred) +#if 0 /*JP*/ verbl_msg = "This is my hunting ground that you dare to prowl!"; +#else + verbl_msg = "おまえがうろついているこのあたりは私の狩場だ!"; +#endif else if (youmonst.data == &mons[PM_SILVER_DRAGON] || youmonst.data == &mons[PM_BABY_SILVER_DRAGON]) { /* Silver dragons are silver in color, not made of silver */ +#if 0 /*JP*/ Sprintf(verbuf, "%s! Your silver sheen does not frighten me!", youmonst.data == &mons[PM_SILVER_DRAGON] ? "Fool" : "Young Fool"); verbl_msg = verbuf; +#else + verbl_msg = "ばかめ!おまえの銀の輝きなど怖くないぞ!"; +#endif } else { vampindex = rn2(SIZE(vampmsg)); if (vampindex == 0) { @@ -525,7 +769,10 @@ verbl_msg = verbuf; } else if (vampindex == 1) { Sprintf(verbuf, vampmsg[vampindex], +/*JP Upolyd ? an(mons[u.umonnum].mname) : an(racenoun)); +*/ + Upolyd ? jtrns_mon(mons[u.umonnum].mname) : racenoun); verbl_msg = verbuf; } else verbl_msg = vampmsg[vampindex]; @@ -535,130 +782,249 @@ break; case MS_WERE: if (flags.moonphase == FULL_MOON && (night() ^ !rn2(13))) { +#if 0 /*JP*/ pline("%s throws back %s head and lets out a blood curdling %s!", Monnam(mtmp), mhis(mtmp), ptr == &mons[PM_HUMAN_WERERAT] ? "shriek" : "howl"); +#else + pline("%sは頭をのけぞらし背筋が凍るような%sをあげた!", + Monnam(mtmp), + ptr == &mons[PM_HUMAN_WERERAT] ? "金切り声" : "咆哮"); +#endif wake_nearto(mtmp->mx, mtmp->my, 11*11); } else pline_msg = +/*JP "whispers inaudibly. All you can make out is \"moon\"."; +*/ + "聞きとれないような声でささやいた.かろうじて『月』という言葉だけが聞きとれた."; break; case MS_BARK: if (flags.moonphase == FULL_MOON && night()) { +/*JP pline_msg = "howls."; +*/ + pline_msg = "吠えた."; } else if (mtmp->mpeaceful) { if (mtmp->mtame && (mtmp->mconf || mtmp->mflee || mtmp->mtrapped || moves > EDOG(mtmp)->hungrytime || mtmp->mtame < 5)) +/*JP pline_msg = "whines."; +*/ + pline_msg = "クンクン鳴いた."; else if (mtmp->mtame && EDOG(mtmp)->hungrytime > moves + 1000) +/*JP pline_msg = "yips."; +*/ + pline_msg = "キャンキャン鳴いた."; else { if (mtmp->data != &mons[PM_DINGO]) /* dingos do not actually bark */ +/*JP pline_msg = "barks."; +*/ + pline_msg = "ワンワン吠えた."; } } else { +/*JP pline_msg = "growls."; +*/ + pline_msg = "激しく吠えた."; } break; case MS_MEW: if (mtmp->mtame) { if (mtmp->mconf || mtmp->mflee || mtmp->mtrapped || mtmp->mtame < 5) +/*JP pline_msg = "yowls."; +*/ + pline_msg = "悲しく鳴いた."; else if (moves > EDOG(mtmp)->hungrytime) +/*JP pline_msg = "meows."; +*/ + pline_msg = "ニャーンと鳴いた."; else if (EDOG(mtmp)->hungrytime > moves + 1000) +/*JP pline_msg = "purrs."; +*/ + pline_msg = "ゴロゴロと鳴いた."; else +/*JP pline_msg = "mews."; +*/ + pline_msg = "ニャーニャー鳴いた."; break; } /* else FALLTHRU */ case MS_GROWL: +/*JP pline_msg = mtmp->mpeaceful ? "snarls." : "growls!"; +*/ + pline_msg = mtmp->mpeaceful ? "うなった." : "激しく吠えた."; break; case MS_ROAR: +/*JP pline_msg = mtmp->mpeaceful ? "snarls." : "roars!"; +*/ + pline_msg = mtmp->mpeaceful ? "うなった." : "とても激しく吠えた."; break; case MS_SQEEK: +/*JP pline_msg = "squeaks."; +*/ + pline_msg = "キーキー鳴いた."; break; case MS_SQAWK: if (ptr == &mons[PM_RAVEN] && !mtmp->mpeaceful) +/*JP verbl_msg = "Nevermore!"; +*/ + verbl_msg = "くたばれ!"; else +/*JP pline_msg = "squawks."; +*/ + pline_msg = "キーキー鳴いた."; break; case MS_HISS: if (!mtmp->mpeaceful) +/*JP pline_msg = "hisses!"; +*/ + pline_msg = "シーッと鳴いた!"; else return 0; /* no sound */ break; case MS_BUZZ: +/*JP pline_msg = mtmp->mpeaceful ? "drones." : "buzzes angrily."; +*/ + pline_msg = mtmp->mpeaceful ? "ぶーんと鳴った." : "ぶんぶん鳴った."; break; case MS_GRUNT: +/*JP pline_msg = "grunts."; +*/ + pline_msg = "ぶーぶー鳴いた."; break; case MS_NEIGH: if (mtmp->mtame < 5) +/*JP pline_msg = "neighs."; +*/ + pline_msg = "いなないた."; else if (moves > EDOG(mtmp)->hungrytime) +/*JP pline_msg = "whinnies."; +*/ + pline_msg = "ヒヒーンと鳴いた."; else +/*JP pline_msg = "whickers."; +*/ + pline_msg = "ヒヒヒーンと鳴いた."; break; case MS_WAIL: +/*JP pline_msg = "wails mournfully."; +*/ + pline_msg = "悲しげに鳴いた."; break; case MS_GURGLE: +/*JP pline_msg = "gurgles."; +*/ + pline_msg = "ごろごろ喉を鳴らした."; break; case MS_BURBLE: +/*JP pline_msg = "burbles."; +*/ + pline_msg = "ぺちゃくちゃしゃべった."; break; case MS_SHRIEK: +/*JP pline_msg = "shrieks."; +*/ + pline_msg = "金切り声をあげた."; aggravate(); break; case MS_IMITATE: +/*JP pline_msg = "imitates you."; +*/ + pline_msg = "あなたの真似をした."; break; case MS_BONES: +/*JP pline("%s rattles noisily.", Monnam(mtmp)); +*/ + pline("%sはガタガタと騒ぎだした.",Monnam(mtmp)); +/*JP You("freeze for a moment."); +*/ + You("しばらく動けない."); nomul(-2); break; case MS_LAUGH: { static const char * const laugh_msg[4] = { +/*JP "giggles.", "chuckles.", "snickers.", "laughs.", +*/ + "くすくす笑った.", "くすっすと笑った.", "ばかにしたように笑った.", "笑った.", }; pline_msg = laugh_msg[rn2(4)]; } break; case MS_MUMBLE: +/*JP pline_msg = "mumbles incomprehensibly."; +*/ + pline_msg = "不可解な言葉をつぶやいた."; break; case MS_DJINNI: if (mtmp->mtame) { +/*JP verbl_msg = "Sorry, I'm all out of wishes."; +*/ + verbl_msg = "私を助けてくれたことを感謝する!"; } else if (mtmp->mpeaceful) { if (ptr == &mons[PM_WATER_DEMON]) +/*JP pline_msg = "gurgles."; +*/ + pline_msg = "ゴボゴボゴボゴボ."; else +/*JP verbl_msg = "I'm free!"; +*/ + verbl_msg = "やっと自由になった!"; +/*JP } else verbl_msg = "This will teach you not to disturb me!"; +*/ + } else verbl_msg = "じゃまをしないでくれ!"; break; case MS_BOAST: /* giants */ if (!mtmp->mpeaceful) { switch (rn2(4)) { +#if 0 /*JP*/ case 0: pline("%s boasts about %s gem collection.", Monnam(mtmp), mhis(mtmp)); +#else + case 0: pline("%sは自分の宝石のコレクションを自慢した.", + Monnam(mtmp)); +#endif break; +/*JP case 1: pline_msg = "complains about a diet of mutton."; +*/ + case 1: pline_msg = "羊の食事についての不満を述べた."; break; +/*JP default: pline_msg = "shouts \"Fee Fie Foe Foo!\" and guffaws."; +*/ + default: pline_msg = "『わっはっはっは!』とばか笑いした."; wake_nearto(mtmp->mx, mtmp->my, 7*7); break; } @@ -674,48 +1040,95 @@ } /* Generic peaceful humanoid behaviour. */ if (mtmp->mflee) +/*JP pline_msg = "wants nothing to do with you."; +*/ + pline_msg = "あなたと関係を持ちたくないようだ."; else if (mtmp->mhp < mtmp->mhpmax/4) +/*JP pline_msg = "moans."; +*/ + pline_msg = "うめき声をあげた."; else if (mtmp->mconf || mtmp->mstun) +/*JP verbl_msg = !rn2(3) ? "Huh?" : rn2(2) ? "What?" : "Eh?"; +*/ + verbl_msg = !rn2(3) ? "へ?" : rn2(2) ? "何?" : "え?"; else if (!mtmp->mcansee) +/*JP verbl_msg = "I can't see!"; +*/ + verbl_msg = "何も見えない!"; else if (mtmp->mtrapped) { struct trap *t = t_at(mtmp->mx, mtmp->my); if (t) t->tseen = 1; +/*JP verbl_msg = "I'm trapped!"; +*/ + verbl_msg = "罠にはまってしまった!"; } else if (mtmp->mhp < mtmp->mhpmax/2) +/*JP pline_msg = "asks for a potion of healing."; +*/ + pline_msg = "回復の薬を持ってないか尋ねた."; else if (mtmp->mtame && !mtmp->isminion && moves > EDOG(mtmp)->hungrytime) +/*JP verbl_msg = "I'm hungry."; +*/ + verbl_msg = "腹が減ったな."; /* Specific monsters' interests */ else if (is_elf(ptr)) +/*JP pline_msg = "curses orcs."; +*/ + pline_msg = "オークを呪った."; else if (is_dwarf(ptr)) +/*JP pline_msg = "talks about mining."; +*/ + pline_msg = "採掘について話した."; else if (likes_magic(ptr)) +/*JP pline_msg = "talks about spellcraft."; +*/ + pline_msg = "魔力について話した."; else if (ptr->mlet == S_CENTAUR) +/*JP pline_msg = "discusses hunting."; +*/ + pline_msg = "猟について議論した."; else switch (monsndx(ptr)) { case PM_HOBBIT: pline_msg = (mtmp->mhpmax - mtmp->mhp >= 10) ? +#if 0 /*JP*/ "complains about unpleasant dungeon conditions." : "asks you about the One Ring."; +#else + "不愉快な迷宮の状態について不満を述べた." + : "「一つの指輪」について尋ねた."; +#endif break; case PM_ARCHEOLOGIST: +/*JP pline_msg = "describes a recent article in \"Spelunker Today\" magazine."; +*/ + pline_msg = "「日刊洞窟」の最新の記事を執筆している."; break; #ifdef TOURIST case PM_TOURIST: +/*JP verbl_msg = "Aloha."; +*/ + verbl_msg = "アローハ."; break; #endif default: +/*JP pline_msg = "discusses dungeon exploration."; +*/ + pline_msg = "迷宮探検について議論した."; break; } break; @@ -732,25 +1145,56 @@ #endif { case 2: +#if 0 /*JP*/ verbl_msg = "Hello, sailor."; +#else + switch(poly_gender()){ + case 0: + verbl_msg = "こんにちは.あらいい男ね."; break; case 1: + verbl_msg = "こんにちは,お嬢さん."; + break; + default: + verbl_msg = "こんにちは."; + break; + } +#endif + break; + case 1: +/*JP pline_msg = "comes on to you."; +*/ + pline_msg = "あなたのほうへやってきた."; break; default: +/*JP pline_msg = "cajoles you."; +*/ + pline_msg = "あなたをおだてた."; } break; #ifdef KOPS case MS_ARREST: if (mtmp->mpeaceful) +#if 0 /*JP*/ verbalize("Just the facts, %s.", flags.female ? "Ma'am" : "Sir"); +#else + verbalize("これが現実だよ%s.", + flags.female ? "お嬢さん" : "きみ"); +#endif else { static const char * const arrest_msg[3] = { +#if 0 /*JP*/ "Anything you say can be used against you.", "You're under arrest!", "Stop in the name of the Law!", +#else + "おまえの言うことはおまえにとって不利な証拠となることがある!", + "おまえを逮捕する!", + "法の名のもと直ちに中止せよ!", +#endif }; verbl_msg = arrest_msg[rn2(3)]; } @@ -768,20 +1212,37 @@ break; case MS_SPELL: /* deliberately vague, since it's not actually casting any spell */ +/*JP pline_msg = "seems to mutter a cantrip."; +*/ + pline_msg = "ぶつぶつとつぶやいている."; break; case MS_NURSE: if (uwep && (uwep->oclass == WEAPON_CLASS || is_weptool(uwep))) +/*JP verbl_msg = "Put that weapon away before you hurt someone!"; +*/ + verbl_msg = "武器をおさめなさい!それは人を傷つけるものよ!"; else if (uarmc || uarm || uarmh || uarms || uarmg || uarmf) verbl_msg = Role_if(PM_HEALER) ? +#if 0 /*JP*/ "Doc, I can't help you unless you cooperate." : "Please undress so I can examine you."; +#else + "先生,あなたの協力なしではどうしようもありませんわ." : + "服を脱いでください.あなたを診察しますわ."; +#endif #ifdef TOURIST else if (uarmu) +/*JP verbl_msg = "Take off your shirt, please."; +*/ + verbl_msg = "シャツを脱いでください."; #endif +/*JP else verbl_msg = "Relax, this won't hurt a bit."; +*/ + else verbl_msg = "おちついて.ちっとも痛くないわよ."; break; case MS_GUARD: #ifndef GOLDOBJ @@ -789,20 +1250,38 @@ #else if (money_cnt(invent)) #endif +/*JP verbl_msg = "Please drop that gold and follow me."; +*/ + verbl_msg = "金を置いてついてきてください."; else +/*JP verbl_msg = "Please follow me."; +*/ + verbl_msg = "ついてきてください."; break; case MS_SOLDIER: { static const char * const soldier_foe_msg[3] = { +#if 0 /*JP*/ "Resistance is useless!", "You're dog meat!", "Surrender!", +#else + "抵抗しても無駄だ!", + "犬に喰われちまえ!", + "降伏しろ!", +#endif }, * const soldier_pax_msg[3] = { +#if 0 /*JP*/ "What lousy pay we're getting here!", "The food's not fit for Orcs!", "My feet hurt, I've been on them all day!", +#else + "なんて金払いが悪いんだ!", + "なんだい?オークでも喰えねぇぜ!", + "足を怪我した,ずっとこの調子だ!", +#endif }; verbl_msg = mtmp->mpeaceful ? soldier_pax_msg[rn2(3)] : soldier_foe_msg[rn2(3)]; @@ -810,12 +1289,21 @@ break; case MS_RIDER: if (ptr == &mons[PM_DEATH] && !rn2(10)) +/*JP pline_msg = "is busy reading a copy of Sandman #8."; +*/ + pline_msg = "Sandmanの8章を読むのに忙しい."; +/*JP else verbl_msg = "Who do you think you are, War?"; +*/ + else verbl_msg = "自分が何者か考えたことがあるか?"; break; } +/*JP if (pline_msg) pline("%s %s", Monnam(mtmp), pline_msg); +*/ + if (pline_msg) pline("%sは%s", Monnam(mtmp), pline_msg); else if (verbl_msg) verbalize(verbl_msg); return(1); } @@ -840,19 +1328,31 @@ struct obj *otmp; if (is_silent(youmonst.data)) { +/*JP pline("As %s, you cannot speak.", an(youmonst.data->mname)); +*/ + pline("あなたは%sなので,話すことができない.", jtrns_mon_gen(youmonst.data->mname, flags.female)); return(0); } if (Strangled) { +/*JP You_cant("speak. You're choking!"); +*/ + You("話せない.あなたは首を絞められている!"); return(0); } if (u.uswallow) { +/*JP pline("They won't hear you out there."); +*/ + You("外へ向って話をしたが,誰も聞きいれなかった."); return(0); } if (Underwater) { +/*JP Your("speech is unintelligible underwater."); +*/ + pline("水面下では,あなたの話はろくに理解されない."); return(0); } @@ -868,7 +1368,10 @@ return(1); } +/*JP if (!getdir("Talk to whom? (in what direction)")) { +*/ + if (!getdir("誰と話しますか?[方向を入れてね]")) { /* decided not to chat */ return(0); } @@ -878,7 +1381,10 @@ return (domonnoise(u.usteed)); #endif if (u.dz) { +/*JP pline("They won't hear you %s there.", u.dz < 0 ? "up" : "down"); +*/ + pline("%s向って話をしても意味がない.", u.dz < 0 ? "上へ" : "下へ"); return(0); } @@ -892,7 +1398,10 @@ return(1); } */ +/*JP pline("Talking to yourself is a bad habit for a dungeoneer."); +*/ + pline("迷宮探検者にとって一人言は悪い癖だ."); return(0); } @@ -909,7 +1418,10 @@ /* If it is unseen, the player can't tell the difference between not noticing him and just not existing, so skip the message. */ if (canspotmon(mtmp)) +/*JP pline("%s seems not to notice you.", Monnam(mtmp)); +*/ + pline("%sはあなたに気がついていないようだ.", Monnam(mtmp)); return(0); } @@ -919,7 +1431,10 @@ if (mtmp->mtame && mtmp->meating) { if (!canspotmon(mtmp)) map_invisible(mtmp->mx, mtmp->my); +/*JP pline("%s is eating noisily.", Monnam(mtmp)); +*/ + pline("%sはバリバリと物を食べている.", Monnam(mtmp)); return (0); } diff -aurbN -xCVS -xXTAGS nethack/src/spell.c jnethack/src/spell.c --- nethack/src/spell.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/spell.c 2005-01-05 05:08:02.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) M. Stephenson 1988 */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" static NEARDATA schar delay; /* moves left for this spell */ @@ -88,7 +95,9 @@ #define uarmfbon 2 /* All metal interferes to some degree */ /* since the spellbook itself doesn't blow up, don't say just "explodes" */ +#if 0 /*JP*/ static const char explodes[] = "radiates explosive energy"; +#endif /* convert a letter into a number in the range 0..51, or -1 if not a letter */ STATIC_OVL int @@ -113,11 +122,17 @@ switch(rn2(lev)) { case 0: +/*JP You_feel("a wrenching sensation."); +*/ + You("ねじられたような感覚を感じた."); tele(); /* teleport him */ break; case 1: +/*JP You_feel("threatened."); +*/ + You("おどされているような気がした."); aggravate(); break; case 2: @@ -127,44 +142,82 @@ take_gold(); break; case 4: +/*JP pline("These runes were just too much to comprehend."); +*/ + pline("このルーン文字を理解するのは困難だ."); make_confused(HConfusion + rn1(7,16),FALSE); break; case 5: +/*JP pline_The("book was coated with contact poison!"); +*/ + pline("この本は接触型の毒で覆われている!"); if (uarmg) { if (uarmg->oerodeproof || !is_corrodeable(uarmg)) { +/*JP Your("gloves seem unaffected."); +*/ + pline("小手は影響を受けなかったようだ."); } else if (uarmg->oeroded2 < MAX_ERODE) { if (uarmg->greased) { +/*JP grease_protect(uarmg, "gloves", &youmonst); +*/ + grease_protect(uarmg, "小手", &youmonst); } else { +#if 0 /*JP*/ Your("gloves corrode%s!", uarmg->oeroded2+1 == MAX_ERODE ? " completely" : uarmg->oeroded2 ? " further" : ""); +#else + pline("小手は%s腐食した!", + uarmg->oeroded2+1 == MAX_ERODE ? + "完全に" : uarmg->oeroded2 ? + "さらに" : ""); +#endif uarmg->oeroded2++; } } else +#if 0 /*JP*/ Your("gloves %s completely corroded.", Blind ? "feel" : "look"); +#else + pline("小手は完全に腐食した%s.", + Blind ? "ようだ" : "ように見える"); +#endif break; } /* temp disable in_use; death should not destroy the book */ bp->in_use = FALSE; losestr(Poison_resistance ? rn1(2,1) : rn1(4,3)); losehp(rnd(Poison_resistance ? 6 : 10), +/*JP "contact-poisoned spellbook", KILLED_BY_AN); +*/ + "接触毒の魔法書で", KILLED_BY_AN); bp->in_use = TRUE; break; case 6: if(Antimagic) { shieldeff(u.ux, u.uy); +/*JP pline_The("book %s, but you are unharmed!", explodes); +*/ + pline("本は強力なエネルギーを放出した,しかしあなたは傷つかない!"); } else { +#if 0 /*JP*/ pline("As you read the book, it %s in your %s!", explodes, body_part(FACE)); +#else + pline("本は強力なエネルギーをあなたの%sに放出した!", + body_part(FACE)); +#endif +/*JP losehp(2*rnd(10)+5, "exploding rune", KILLED_BY_AN); +*/ + losehp(2*rnd(10)+5, "強力なルーン文字のエネルギーで", KILLED_BY_AN); } return TRUE; default: @@ -184,17 +237,28 @@ if (!rn2(3) && spellbook->otyp != SPE_BOOK_OF_THE_DEAD) { spellbook->in_use = TRUE; /* in case called from learn */ pline( +/*JP "Being confused you have difficulties in controlling your actions."); +*/ + "混乱しているので,そういうことをするのは難しい."); display_nhwindow(WIN_MESSAGE, FALSE); +/*JP You("accidentally tear the spellbook to pieces."); +*/ + You("うっかり,魔法書を引きさいてしまった."); if (!objects[spellbook->otyp].oc_name_known && !objects[spellbook->otyp].oc_uname) docall(spellbook); useup(spellbook); gone = TRUE; } else { +#if 0 /*JP*/ You("find yourself reading the %s line over and over again.", spellbook == book ? "next" : "first"); +#else + You("%sの行を何度も繰り返して読んでいたことに気付いた.", + spellbook == book ? "次" : "最初"); +#endif } return gone; } @@ -207,7 +271,10 @@ struct monst *mtmp, *mtmp2; coord mm; +/*JP You("turn the pages of the Book of the Dead..."); +*/ + You("死者の書のページをめくった..."); makeknown(SPE_BOOK_OF_THE_DEAD); /* KMH -- Need ->known to avoid "_a_ Book of the Dead" */ book2->known = 1; @@ -217,14 +284,26 @@ arti_cursed = FALSE; if(book2->cursed) { +/*JP pline_The("runes appear scrambled. You can't read them!"); +*/ + pline("ルーン文字はごちゃまぜになっており,読むことができなかった!"); return; } if(!u.uhave.bell || !u.uhave.menorah) { +/*JP pline("A chill runs down your %s.", body_part(SPINE)); +*/ + Your("%sに寒けが走った.", body_part(SPINE)); +/*JP if(!u.uhave.bell) You_hear("a faint chime..."); +*/ + if(!u.uhave.bell) You_hear("かすかなベルの音を聞いた..."); +/*JP if(!u.uhave.menorah) pline("Vlad's doppelganger is amused."); +*/ + if(!u.uhave.menorah) pline("ヴラドの生霊は笑った."); return; } @@ -242,8 +321,14 @@ } if(arti_cursed) { +/*JP pline_The("invocation fails!"); +*/ + pline("特殊能力は発揮されなかった!"); +/*JP pline("At least one of your artifacts is cursed..."); +*/ + pline("少なくともあなたの聖器のひとつが呪われている..."); } else if(arti1_primed && arti2_primed) { unsigned soon = (unsigned) d(2,6); /* time til next intervene() */ @@ -255,7 +340,10 @@ u.uevent.udemigod = 1; /* wizdead() */ if (!u.udg_cnt || u.udg_cnt > soon) u.udg_cnt = soon; } else { /* at least one artifact not prepared properly */ +/*JP You("have a feeling that %s is amiss...", something); +*/ + You("何かが間違っているような気がした..."); goto raise_dead; } return; @@ -265,7 +353,10 @@ if (book2->cursed) { raise_dead: +/*JP You("raised the dead!"); +*/ + You("死者を蘇らせた!"); /* first maybe place a dangerous adversary */ if (!rn2(3) && ((mtmp = makemon(&mons[PM_MASTER_LICH], u.ux, u.uy, NO_MINVENT)) != 0 || @@ -300,13 +391,22 @@ } else { switch(rn2(3)) { case 0: +/*JP Your("ancestors are annoyed with you!"); +*/ + Your("先祖はあなたが嫌いなようだ!"); break; case 1: +/*JP pline_The("headstones in the cemetery begin to move!"); +*/ + pline("墓地の墓石が動きはじめた!"); break; default: +/*JP pline("Oh my! Your name appears in the book!"); +*/ + pline("なんてこったい!あなたの名前が本に書いてある!"); } } return; @@ -340,21 +440,36 @@ return(0); } +#if 0 /*JP*/ Sprintf(splname, objects[booktype].oc_name_known ? "\"%s\"" : "the \"%s\" spell", OBJ_NAME(objects[booktype])); +#else + Sprintf(splname, objects[booktype].oc_name_known ? + "\"%s\"" : "\"%s\"", + jtrns_obj('+', OBJ_NAME(objects[booktype]))); +#endif for (i = 0; i < MAXSPELL; i++) { if (spellid(i) == booktype) { if (book->spestudied > MAX_SPELL_STUDY) { +/*JP pline("This spellbook is too faint to be read any more."); +*/ + pline("この魔法書の文字は薄すぎてこれ以上読めない."); book->otyp = booktype = SPE_BLANK_PAPER; } else if (spellknow(i) <= 1000) { +/*JP Your("knowledge of %s is keener.", splname); +*/ + Your("%sに対する知識はさらに研ぎすまされた.", splname); incrnknow(i); book->spestudied++; exercise(A_WIS,TRUE); /* extra study */ } else { /* 1000 < spellknow(i) <= MAX_SPELL_STUDY */ +/*JP You("know %s quite well already.", splname); +*/ + You("すでに%sを熟知している.", splname); costly = FALSE; } /* make book become known even when spell is already @@ -366,8 +481,12 @@ spl_book[i].sp_lev = objects[booktype].oc_level; incrnknow(i); book->spestudied++; +#if 0 /*JP*/ You(i > 0 ? "add %s to your repertoire." : "learn %s.", splname); +#else + You(i > 0 ? "%sをレパートリーに加えた." : "%sを習得した.", splname); +#endif makeknown((int)booktype); break; } @@ -398,11 +517,17 @@ /* handle the sequence: start reading, get interrupted, have book become erased somehow, resume reading it */ booktype != SPE_BLANK_PAPER) { +/*JP You("continue your efforts to memorize the spell."); +*/ + You("魔法の学習を再開した."); } else { /* KMH -- Simplified this code */ if (booktype == SPE_BLANK_PAPER) { +/*JP pline("This spellbook is all blank."); +*/ + pline("この魔法書は真っ白だ."); makeknown(booktype); return(1); } @@ -446,8 +571,13 @@ !confused) { char qbuf[QBUFSZ]; Sprintf(qbuf, +#if 0 /*JP*/ "This spellbook is %sdifficult to comprehend. Continue?", (read_ability < 12 ? "very " : "")); +#else + "この魔法書を理解するのは%s困難だ.続けますか?", + (read_ability < 12 ? "とても" : "")); +#endif if (yn(qbuf) != 'y') { spellbook->in_use = FALSE; return(1); @@ -466,7 +596,10 @@ nomul(delay); /* study time */ delay = 0; if(gone || !rn2(3)) { +/*JP if (!gone) pline_The("spellbook crumbles to dust!"); +*/ + if (!gone) pline("魔法書は塵となった!"); if (!objects[spellbook->otyp].oc_name_known && !objects[spellbook->otyp].oc_uname) docall(spellbook); @@ -484,13 +617,22 @@ } spellbook->in_use = FALSE; +#if 0 /*JP*/ You("begin to %s the runes.", spellbook->otyp == SPE_BOOK_OF_THE_DEAD ? "recite" : "memorize"); +#else + You("ルーン文字を%sしはじめた.", + spellbook->otyp == SPE_BOOK_OF_THE_DEAD ? "暗唱" : + "記憶"); +#endif } book = spellbook; +/*JP set_occupation(learn, "studying", 0); +*/ + set_occupation(learn, "学ぶ", 0); return(1); } @@ -542,7 +684,10 @@ char ilet, lets[BUFSZ], qbuf[QBUFSZ]; if (spellid(0) == NO_SPELL) { +/*JP You("don't know any spells right now."); +*/ + You("今のところ何の魔法も知らない."); return FALSE; } if (flags.menu_style == MENU_TRADITIONAL) { @@ -557,7 +702,10 @@ else Sprintf(lets, "a-zA-%c", 'A' + nspells - 27); for(;;) { +/*JP Sprintf(qbuf, "Cast which spell? [%s ?]", lets); +*/ + Sprintf(qbuf, "どの魔法を唱える?[%s ?]", lets); if ((ilet = yn_function(qbuf, (char *)0, '\0')) == '?') break; @@ -569,11 +717,19 @@ *spell_no = idx; return TRUE; } else +/*JP You("don't know that spell."); +*/ + You("そんな魔法は知らない."); } } +#if 0 /*JP*/ return dospellmenu("Choose which spell to cast", SPELLMENU_CAST, spell_no); +#else + return dospellmenu("どの魔法を唱える?", + SPELLMENU_CAST, spell_no); +#endif } /* the 'Z' command -- cast a spell */ @@ -593,19 +749,40 @@ { switch (skill) { case P_ATTACK_SPELL: +/*JP return "attack"; +*/ + return "攻撃"; case P_HEALING_SPELL: +/*JP return "healing"; +*/ + return "治癒"; case P_DIVINATION_SPELL: +/*JP return "divination"; +*/ + return "予知"; case P_ENCHANTMENT_SPELL: +/*JP return "enchantment"; +*/ + return "補助"; case P_CLERIC_SPELL: +/*JP return "clerical"; +*/ + return "僧侶"; case P_ESCAPE_SPELL: +/*JP return "escape"; +*/ + return "脱出"; case P_MATTER_SPELL: +/*JP return "matter"; +*/ + return "物質"; default: impossible("Unknown spell skill, %d;", skill); return ""; @@ -661,13 +838,21 @@ const char *hgolden = hcolor(NH_GOLDEN); if (u.uspellprot) +/*JP pline_The("%s haze around you becomes more dense.", +*/ + pline("あなたのまわりの%s霞が濃くなった.", hgolden); else +#if 0 /*JP*/ pline_The("%s around you begins to shimmer with %s haze.", /*[ what about being inside solid rock while polyd? ]*/ (Underwater || Is_waterlevel(&u.uz)) ? "water" : "air", an(hgolden)); +#else + pline("あなたのまわりに%s霧があらわれてキラキラと光った.", + hgolden); +#endif } u.uspellprot += gain; u.uspmtime = @@ -676,7 +861,10 @@ u.usptime = u.uspmtime; find_ac(); } else { +/*JP Your("skin feels warm for a moment."); +*/ + Your("肌は一瞬ポカポカした."); } } @@ -725,37 +913,67 @@ * decrement of spell knowledge is done every turn. */ if (spellknow(spell) <= 0) { +/*JP Your("knowledge of this spell is twisted."); +*/ + Your("この魔法に関する知識はよじれた."); +/*JP pline("It invokes nightmarish images in your mind..."); +*/ + pline("それは悪夢を心に浮ばせた..."); spell_backfire(spell); return(0); } else if (spellknow(spell) <= 100) { +/*JP You("strain to recall the spell."); +*/ + You("魔法を思いだそうとした."); } else if (spellknow(spell) <= 1000) { +/*JP Your("knowledge of this spell is growing faint."); +*/ + Your("この魔法に関する知識が消えてゆく."); } energy = (spellev(spell) * 5); /* 5 <= energy <= 35 */ if (u.uhunger <= 10 && spellid(spell) != SPE_DETECT_FOOD) { +/*JP You("are too hungry to cast that spell."); +*/ + pline("腹が減りすぎて魔法を唱えられない."); return(0); } else if (ACURR(A_STR) < 4) { +/*JP You("lack the strength to cast spells."); +*/ + pline("強さが少なすぎて魔法を唱えられない."); return(0); } else if(check_capacity( +/*JP "Your concentration falters while carrying so much stuff.")) { +*/ + "たくさんものを持ちすぎて集中できない.")){ return (1); } else if (!freehand()) { +/*JP Your("arms are not free to cast!"); +*/ + pline("魔法を唱えようにも腕の自由が効かない!"); return (0); } if (u.uhave.amulet) { +/*JP You_feel("the amulet draining your energy away."); +*/ + pline("魔除けがあなたのエネルギーを吸いとっているような気がした."); energy += rnd(2*energy); } if(energy > u.uen) { +/*JP You("don't have enough energy to cast that spell."); +*/ + pline("魔法を唱えるだけの十分なエネルギーを持っていない."); return(0); } else { if (spellid(spell) != SPE_DETECT_FOOD) { @@ -797,7 +1015,10 @@ chance = percent_success(spell); if (confused || (rnd(100) > chance)) { +/*JP You("fail to cast the spell correctly."); +*/ + You("魔法を正しく唱えることができなかった."); u.uen -= energy / 2; flags.botl = 1; return(1); @@ -833,9 +1054,14 @@ while(n--) { if(!u.dx && !u.dy && !u.dz) { if ((damage = zapyourself(pseudo, TRUE)) != 0) { +#if 0 /*JP*/ char buf[BUFSZ]; Sprintf(buf, "zapped %sself with a spell", uhim()); losehp(damage, buf, NO_KILLER_PREFIX); +#else + losehp(damage, "自分自身の魔法を浴びて", + KILLED_BY); +#endif } } else { explode(u.dx, u.dy, @@ -879,13 +1105,22 @@ if (atme) u.dx = u.dy = u.dz = 0; else if (!getdir((char *)0)) { /* getdir cancelled, re-use previous direction */ +/*JP pline_The("magical energy is released!"); +*/ + pline("魔法のエネルギーが解放された!"); } if(!u.dx && !u.dy && !u.dz) { if ((damage = zapyourself(pseudo, TRUE)) != 0) { +#if 0 /*JP*/ char buf[BUFSZ]; Sprintf(buf, "zapped %sself with a spell", uhim()); losehp(damage, buf, NO_KILLER_PREFIX); +#else + losehp(damage, + "自分自身の魔法を浴びて", + KILLED_BY); +#endif } } else weffects(pseudo); } else weffects(pseudo); @@ -924,9 +1159,15 @@ healup(0, 0, FALSE, TRUE); break; case SPE_CURE_SICKNESS: +/*JP if (Sick) You("are no longer ill."); +*/ + if (Sick) Your("病気は直った."); if (Slimed) { +/*JP pline_The("slime disappears!"); +*/ + pline("スライムは消えた!"); Slimed = 0; /* flags.botl = 1; -- healup() handles this */ } @@ -940,7 +1181,10 @@ do_vicinity_map(); /* at present, only one thing blocks clairvoyance */ else if (uarmh && uarmh->otyp == CORNUTHAUM) +/*JP You("sense a pointy hat on top of your %s.", +*/ + You("とがった帽子を%sの上に発見した.", body_part(HEAD)); break; case SPE_PROTECTION: @@ -970,28 +1214,49 @@ coord cc; if (u.uinwater) { +/*JP pline("You're joking! In this weather?"); return 0; +*/ + pline("水中で何をしようっていうんだい?"); return 0; } else if (Is_waterlevel(&u.uz)) { +/*JP You("had better wait for the sun to come out."); return 0; +*/ + You("太陽が見えるまで待ったほうがよいだろう."); return 0; } +/*JP pline("Where do you want to cast the spell?"); +*/ + pline("どこに向かって魔法を唱える?"); cc.x = u.ux; cc.y = u.uy; +/*JP if (getpos(&cc, TRUE, "the desired position") < 0) +*/ + if (getpos(&cc, TRUE, "望みの場所") < 0) return 0; /* user pressed ESC */ /* The number of moves from hero to where the spell drops.*/ if (distmin(u.ux, u.uy, cc.x, cc.y) > 10) { +/*JP pline_The("spell dissipates over the distance!"); +*/ + pline("遠すぎる!"); return 0; } else if (u.uswallow) { +/*JP pline_The("spell is cut short!"); +*/ + pline("だめだ!近すぎる!"); exercise(A_WIS, FALSE); /* What were you THINKING! */ u.dx = 0; u.dy = 0; return 1; } else if (!cansee(cc.x, cc.y) || IS_STWALL(levl[cc.x][cc.y].typ)) { +/*JP Your("mind fails to lock onto that location!"); +*/ + You("そこに向かって集中したが失敗した!"); return 0; } else { u.dx=cc.x; @@ -1028,11 +1293,20 @@ struct spell spl_tmp; if (spellid(0) == NO_SPELL) +/*JP You("don't know any spells right now."); +*/ + You("魔法を知らない."); else { +#if 0 /*JP*/ while (dospellmenu("Currently known spells", SPELLMENU_VIEW, &splnum)) { Sprintf(qbuf, "Reordering spells; swap '%c' with", +#else + while (dospellmenu("現在知っている魔法一覧", + SPELLMENU_VIEW, &splnum)) { + Sprintf(qbuf, "'%c'と並び変える魔法は?", +#endif spellet(splnum)); if (!dospellmenu(qbuf, splnum, &othnum)) break; @@ -1070,17 +1344,30 @@ * in the window-ports (say via a tab character). */ if (!iflags.menu_tab_sep) +/*JP Sprintf(buf, "%-20s Level %-12s Fail", " Name", "Category"); +*/ + Sprintf(buf, "%-20s Level %-12s 成功率", " Name", "分類"); else +/*JP Sprintf(buf, "Name\tLevel\tCategory\tFail"); +*/ + Sprintf(buf, "Name\tLevel\t分類\t成功率"); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_BOLD, buf, MENU_UNSELECTED); for (i = 0; i < MAXSPELL && spellid(i) != NO_SPELL; i++) { Sprintf(buf, iflags.menu_tab_sep ? "%s\t%-d%s\t%s\t%-d%%" : "%-20s %2d%s %-12s %3d%%", +#if 0 /*JP*/ spellname(i), spellev(i), spellknow(i) ? " " : "*", spelltypemnemonic(spell_skilltype(spellid(i))), 100 - percent_success(i)); +#else + jtrns_obj('+', spellname(i)), spellev(i), + spellknow(i) ? " " : "*", + spelltypemnemonic(spell_skilltype(spellid(i))), + percent_success(i)); +#endif any.a_int = i+1; /* must be non-zero */ add_menu(tmpwin, NO_GLYPH, &any, diff -aurbN -xCVS -xXTAGS nethack/src/steal.c jnethack/src/steal.c --- nethack/src/steal.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/steal.c 2005-01-24 06:39:41.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" STATIC_PTR int NDECL(stealarm); @@ -16,13 +23,28 @@ { return ( #ifdef TOURIST +/*JP (otmp == uarmu) ? "shirt" : +*/ + (otmp == uarmu) ? "シャツ" : #endif +/*JP (otmp == uarmf) ? "boots" : +*/ + (otmp == uarmf) ? "靴" : +/*JP (otmp == uarms) ? "shield" : +*/ + (otmp == uarms) ? "盾" : +/*JP (otmp == uarmg) ? "gloves" : +*/ + (otmp == uarmg) ? "小手" : (otmp == uarmc) ? cloak_simple_name(otmp) : +/*JP (otmp == uarmh) ? "helmet" : "armor"); +*/ + (otmp == uarmh) ? "兜" : "鎧"); } #ifndef GOLDOBJ @@ -48,7 +70,10 @@ mtmp->mgold += gold->quan; delobj(gold); newsym(u.ux, u.uy); +/*JP pline("%s quickly snatches some gold from between your %s!", +*/ + pline("%sは素早くあなたの%s元から金をひったくった!", Monnam(mtmp), makeplural(body_part(FOOT))); if(!u.ugold || !rn2(5)) { if (!tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); @@ -57,7 +82,10 @@ } } else if(u.ugold) { u.ugold -= (tmp = somegold()); +/*JP Your("purse feels lighter."); +*/ + Your("財布は軽くなった."); mtmp->mgold += tmp; if (!tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); mtmp->mavenge = 1; @@ -117,7 +145,10 @@ obj_extract_self(fgold); add_to_minv(mtmp, fgold); newsym(u.ux, u.uy); +/*JP pline("%s quickly snatches some gold from between your %s!", +*/ + pline("%sは素早くあなたの%s元から金をひったくった!", Monnam(mtmp), makeplural(body_part(FOOT))); if(!ygold || !rn2(5)) { if (!tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); @@ -130,7 +161,10 @@ if (tmp < ygold->quan) ygold = splitobj(ygold, tmp); freeinv(ygold); add_to_minv(mtmp, ygold); +/*JP Your("purse feels lighter."); +*/ + Your("財布は軽くなった."); if (!tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); monflee(mtmp, 0, FALSE, FALSE); flags.botl = 1; @@ -158,7 +192,10 @@ if(otmp->unpaid) subfrombill(otmp, shop_keeper(*u.ushops)); freeinv(otmp); +/*JP pline("%s steals %s!", Monnam(mtmp), doname(otmp)); +*/ + pline("%sは%sを盗んだ!", Monnam(mtmp), doname(otmp)); (void) mpickobj(mtmp,otmp); /* may free otmp */ /* Implies seduction, "you gladly hand over ..." so we don't set mavenge bit here. */ @@ -251,9 +288,15 @@ nothing_to_steal: /* Not even a thousand men in armor can strip a naked man. */ if(Blind) +/*JP pline("Somebody tries to rob you, but finds nothing to steal."); +*/ + pline("誰かがあなたから盗もうとしたが,盗むものがないことに気がついた."); else +/*JP pline("%s tries to rob you, but there is nothing to steal!", +*/ + pline("%sはあなたから盗もうとしたが,盗むものがないことに気がついた!", Monnam(mtmp)); return(1); /* let her flee */ } @@ -318,12 +361,20 @@ ostuck = (otmp->cursed && otmp->owornmask); if (ostuck || !can_carry(mtmp, otmp)) { +#if 0 /*JP*/ static const char * const how[] = { "steal","snatch","grab","take" }; cant_take: pline("%s tries to %s your %s but gives up.", Monnam(mtmp), how[rn2(SIZE(how))], (otmp->owornmask & W_ARMOR) ? equipname(otmp) : cxname(otmp)); +#else + cant_take: + pline("%sは%sを盗もうとしたが諦めた.", + Monnam(mtmp), + (otmp->owornmask & W_ARMOR) ? equipname(otmp) : + cxname(otmp)); +#endif /* the fewer items you have, the less likely the thief is going to stick around to try again (0) instead of running away (1) */ @@ -369,17 +420,39 @@ if (multi < 0 && is_fainted()) unmul((char *)0); slowly = (armordelay >= 1 || multi < 0); if(flags.female) +#if 0 /*JP*/ pline("%s charms you. You gladly %s your %s.", !seen ? "She" : Monnam(mtmp), curssv ? "let her take" : slowly ? "start removing" : "hand over", equipname(otmp)); +#else + pline("%sはあなたを魅了した.あなたはよろこんで%sを%s%s.", + !seen ? "彼女" : Monnam(mtmp), + equipname(otmp), + slowly ? "はずし始め" : "はずして", + curssv ? "あげた" : "手渡した"); +#endif else +#if 0 /*JP*/ pline("%s seduces you and %s off your %s.", !seen ? "She" : Adjmonnam(mtmp, "beautiful"), curssv ? "helps you to take" : slowly ? "you start taking" : "you take", equipname(otmp)); +#else + if(curssv){ + pline("%sはあなたを誘惑して,あなたが%sをはずすのを%s.", + !seen ? "何者か" : Adjmonnam(mtmp, "美しい"), + equipname(otmp), + slowly ? "手伝い始めた" : "手伝った"); + } else { + pline("%sはあなたを誘惑した.あなたは%sを%s.", + !seen ? "何者か" : Adjmonnam(mtmp, "美しい"), + equipname(otmp), + slowly ? "はずし始めた" : "はずした"); + } +#endif named++; /* the following is to set multi for later on */ nomul(-armordelay); @@ -414,7 +487,10 @@ mtmp->mavenge = 1; freeinv(otmp); +/*JP pline("%s stole %s.", named ? "She" : Monnam(mtmp), doname(otmp)); +*/ + pline("%sは%sを盗んだ.", named ? "彼女" : Monnam(mtmp), doname(otmp)); could_petrify = (otmp->otyp == CORPSE && touch_petrifies(&mons[otmp->corpsenm])); (void) mpickobj(mtmp,otmp); /* may free otmp */ @@ -452,7 +528,10 @@ attacktype(mtmp->data, AT_ENGL)) { /* this is probably a burning object that you dropped or threw */ if (u.uswallow && mtmp == u.ustuck && !Blind) +/*JP pline("%s out.", Tobjnam(otmp, "go")); +*/ + pline("%sは飛びだした.", xname(otmp)); snuff_otmp = TRUE; } /* Must do carrying effects on object prior to add_to_minv() */ @@ -509,7 +588,10 @@ /* mpickobj wont merge otmp because none of the above things to steal are mergable */ (void) mpickobj(mtmp,otmp); /* may merge and free otmp */ +/*JP pline("%s stole %s!", Monnam(mtmp), doname(otmp)); +*/ + pline("%sは%sを盗んだ!", Monnam(mtmp), doname(otmp)); if (can_teleport(mtmp->data) && !tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); } @@ -544,8 +626,14 @@ obj->owornmask = 0L; } if (verbosely && cansee(omx, omy)) +/*JP pline("%s drops %s.", Monnam(mon), distant_name(obj, doname)); +*/ + pline("%sは%sを置いた.", Monnam(mon), distant_name(obj, doname)); +/*JP if (!flooreffects(obj, omx, omy, "fall")) { +*/ + if (!flooreffects(obj, omx, omy, "落ちる")) { place_object(obj, omx, omy); stackobj(obj); } @@ -620,8 +708,12 @@ register long g = mtmp->mgold; (void) mkgold(g, omx, omy); if (is_pet && cansee(omx, omy) && flags.verbose) +#if 0 /*JP*/ pline("%s drops %ld gold piece%s.", Monnam(mtmp), g, plur(g)); +#else + pline("%sは%ld枚の金貨を置いた.", Monnam(mtmp), g); +#endif mtmp->mgold = 0L; } #endif diff -aurbN -xCVS -xXTAGS nethack/src/steed.c jnethack/src/steed.c --- nethack/src/steed.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/steed.c 2004-10-09 02:21:01.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Kevin Hugo, 1998-1999. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" @@ -18,7 +25,10 @@ void rider_cant_reach() { +/*JP You("aren't skilled enough to reach from %s.", y_monnam(u.usteed)); +*/ + You("まだ十分に技量を積んでいないので,%sから届かない.", y_monnam(u.usteed)); } /*** Putting the saddle on ***/ @@ -49,10 +59,17 @@ /* Can you use it? */ if (nohands(youmonst.data)) { +#if 0 /*JP*/ You("have no hands!"); /* not `body_part(HAND)' */ +#else + pline("あなたには手がない!"); /* not `body_part(HAND)' */ +#endif return 0; } else if (!freehand()) { +/*JP You("have no free %s.", body_part(HAND)); +*/ + You("%sの自由が効かない.", body_part(HAND)); return 0; } @@ -62,44 +79,69 @@ return 0; } if (!u.dx && !u.dy) { +#if 0 /*JP*/ pline("Saddle yourself? Very funny..."); +#else + pline("自分自身に鞍?おもしろい..."); +#endif return 0; } if (!isok(u.ux+u.dx, u.uy+u.dy) || !(mtmp = m_at(u.ux+u.dx, u.uy+u.dy)) || !canspotmon(mtmp)) { +/*JP pline("I see nobody there."); +*/ + pline("そこには誰もいないように見える."); return 1; } /* Is this a valid monster? */ if (mtmp->misc_worn_check & W_SADDLE || which_armor(mtmp, W_SADDLE)) { +/*JP pline("%s doesn't need another one.", Monnam(mtmp)); +*/ + pline("%sはもう鞍が取りつけられている.", Monnam(mtmp)); return 1; } ptr = mtmp->data; if (touch_petrifies(ptr) && !uarmg && !Stone_resistance) { char kbuf[BUFSZ]; +/*JP You("touch %s.", mon_nam(mtmp)); +*/ + You("%sに触れた.", mon_nam(mtmp)); if (!(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))) { +/*JP Sprintf(kbuf, "attempting to saddle %s", an(mtmp->data->mname)); +*/ + Sprintf(kbuf, "%sに鞍を取りつけようとして", a_monnam(mtmp)); instapetrify(kbuf); } } if (ptr == &mons[PM_INCUBUS] || ptr == &mons[PM_SUCCUBUS]) { +/*JP pline("Shame on you!"); +*/ + pline("みっともないぞ!"); exercise(A_WIS, FALSE); return 1; } if (mtmp->isminion || mtmp->isshk || mtmp->ispriest || mtmp->isgd || mtmp->iswiz) { +/*JP pline("I think %s would mind.", mon_nam(mtmp)); +*/ + pline("%sは鞍をつけられることを気にしているようだ.", mon_nam(mtmp)); return 1; } if (!can_saddle(mtmp)) { +/*JP You_cant("saddle such a creature."); +*/ + You("その生き物に鞍はとりつけられない."); return 1; } @@ -138,7 +180,10 @@ /* Make the attempt */ if (rn2(100) < chance) { +/*JP You("put the saddle on %s.", mon_nam(mtmp)); +*/ + You("鞍を%sに取りつけた.", mon_nam(mtmp)); if (otmp->owornmask) remove_worn_item(otmp, FALSE); freeinv(otmp); /* mpickobj may free otmp it if merges, but we have already @@ -149,7 +194,10 @@ otmp->leashmon = mtmp->m_id; update_mon_intrinsics(mtmp, otmp, TRUE, FALSE); } else +/*JP pline("%s resists!", Monnam(mtmp)); +*/ + pline("%sは拒否した!", Monnam(mtmp)); return 1; } @@ -176,7 +224,10 @@ dismount_steed(DISMOUNT_BYCHOICE); else if (getdir((char *)0) && isok(u.ux+u.dx, u.uy+u.dy)) { #ifdef WIZARD +/*JP if (wizard && yn("Force the mount to succeed?") == 'y') +*/ + if (wizard && yn("無理矢理成功させますか?") == 'y') forcemount = TRUE; #endif return (mount_steed(m_at(u.ux+u.dx, u.uy+u.dy), forcemount)); @@ -198,13 +249,20 @@ /* Sanity checks */ if (u.usteed) { +/*JP You("are already riding %s.", mon_nam(u.usteed)); +*/ + You("もう%sに乗っている.", mon_nam(u.usteed)); return (FALSE); } /* Is the player in the right form? */ if (Hallucination && !force) { +#if 0 /*JP*/ pline("Maybe you should find a designated driver."); +#else + pline("おそらくあなたは指定ドライバーを探すべきだろう."); +#endif return (FALSE); } /* While riding Wounded_legs refers to the steed's, @@ -218,7 +276,11 @@ * minimized, if not eliminated altogether. */ if (Wounded_legs) { +#if 0 /*JP*/ Your("%s are in no shape for riding.", makeplural(body_part(LEG))); +#else + pline("%sを怪我しているので乗れない.", makeplural(body_part(LEG))); +#endif #ifdef WIZARD if (force && wizard && yn("Heal your legs?") == 'y') HWounded_legs = EWounded_legs = 0; @@ -229,11 +291,17 @@ if (Upolyd && (!humanoid(youmonst.data) || verysmall(youmonst.data) || bigmonst(youmonst.data) || slithy(youmonst.data))) { +/*JP You("won't fit on a saddle."); +*/ + You("鞍に合わない."); return (FALSE); } if(!force && (near_capacity() > SLT_ENCUMBER)) { +/*JP You_cant("do that while carrying so much stuff."); +*/ + You("沢山物を持ちすぎており出来ない."); return (FALSE); } @@ -242,89 +310,148 @@ mtmp->mundetected || mtmp->m_ap_type == M_AP_FURNITURE || mtmp->m_ap_type == M_AP_OBJECT))) { +/*JP pline("I see nobody there."); +*/ + pline("そこには何も見えない."); return (FALSE); } if (u.uswallow || u.ustuck || u.utrap || Punished || !test_move(u.ux, u.uy, mtmp->mx-u.ux, mtmp->my-u.uy, TEST_MOVE)) { if (Punished || !(u.uswallow || u.ustuck || u.utrap)) +/*JP You("are unable to swing your %s over.", body_part(LEG)); +*/ + You("鞍をまたぐことができない."); else +/*JP You("are stuck here for now."); +*/ + You("はまっているので出来ない."); return (FALSE); } /* Is this a valid monster? */ otmp = which_armor(mtmp, W_SADDLE); if (!otmp) { +/*JP pline("%s is not saddled.", Monnam(mtmp)); +*/ + pline("%sには鞍が取りつけられていない.", Monnam(mtmp)); return (FALSE); } ptr = mtmp->data; if (touch_petrifies(ptr) && !Stone_resistance) { char kbuf[BUFSZ]; +/*JP You("touch %s.", mon_nam(mtmp)); +*/ + You("%sに触れた.", mon_nam(mtmp)); +/*JP Sprintf(kbuf, "attempting to ride %s", an(mtmp->data->mname)); +*/ + Sprintf(kbuf, "%sに乗ろうとして", a_monnam(mtmp)); instapetrify(kbuf); } if (!mtmp->mtame || mtmp->isminion) { +/*JP pline("I think %s would mind.", mon_nam(mtmp)); +*/ + pline("%sは鞍をつけられることを気にしているようだ.", mon_nam(mtmp)); return (FALSE); } if (mtmp->mtrapped) { struct trap *t = t_at(mtmp->mx, mtmp->my); +#if 0 /*JP*/ You_cant("mount %s while %s's trapped in %s.", mon_nam(mtmp), mhe(mtmp), an(defsyms[trap_to_defsym(t->ttyp)].explanation)); +#else + You("%sに捕まっている%sには乗れない.", + jtrns_obj('^', defsyms[trap_to_defsym(t->ttyp)].explanation), + mon_nam(mtmp)); +#endif return (FALSE); } if (!force && !Role_if(PM_KNIGHT) && !(--mtmp->mtame)) { /* no longer tame */ newsym(mtmp->mx, mtmp->my); +#if 0 /*JP*/ pline("%s resists%s!", Monnam(mtmp), mtmp->mleashed ? " and its leash comes off" : ""); +#else + pline("%sは拒否%s!", Monnam(mtmp), + mtmp->mleashed ? "して,紐をはずした" : "した"); +#endif if (mtmp->mleashed) m_unleash(mtmp, FALSE); return (FALSE); } if (!force && Underwater && !is_swimmer(ptr)) { +/*JP You_cant("ride that creature while under water."); +*/ + You("水中で乗ることはできない."); return (FALSE); } if (!can_saddle(mtmp) || !can_ride(mtmp)) { +/*JP You_cant("ride such a creature."); +*/ + You("その生き物に乗ることはできない."); return (0); } /* Is the player impaired? */ if (!force && !is_floater(ptr) && !is_flyer(ptr) && Levitation && !Lev_at_will) { +/*JP You("cannot reach %s.", mon_nam(mtmp)); +*/ + You("%sに届かない.", mon_nam(mtmp)); return (FALSE); } if (!force && uarm && is_metallic(uarm) && greatest_erosion(uarm)) { +#if 0 /*JP*/ Your("%s armor is too stiff to be able to mount %s.", uarm->oeroded ? "rusty" : "corroded", mon_nam(mtmp)); +#else + Your("%s鎧はギシギシいっており%sに乗れない.", + uarm->oeroded ? "錆びた" : "腐食した", + mon_nam(mtmp)); +#endif return (FALSE); } if (!force && (Confusion || Fumbling || Glib || Wounded_legs || otmp->cursed || (u.ulevel+mtmp->mtame < rnd(MAXULEV/2+5)))) { if (Levitation) { +/*JP pline("%s slips away from you.", Monnam(mtmp)); +*/ + pline("%sはあなたからはなれていった.", Monnam(mtmp)); return FALSE; } +/*JP You("slip while trying to get on %s.", mon_nam(mtmp)); +*/ + You("%sに乗ろうとしてすべった.", mon_nam(mtmp)); +#if 0 /*JP*/ Sprintf(buf, "slipped while mounting %s", /* "a saddled mumak" or "a saddled pony called Dobbin" */ x_monnam(mtmp, ARTICLE_A, (char *)0, SUPPRESS_IT|SUPPRESS_INVISIBLE|SUPPRESS_HALLUCINATION, TRUE)); losehp(rn1(5,10), buf, NO_KILLER_PREFIX); +#else + Sprintf(buf, "%sに乗ろうとしてすべり落ちて", + m_monnam(mtmp)); + losehp(rn1(5,10), buf, KILLED_BY); +#endif return (FALSE); } @@ -332,8 +459,14 @@ if (!force) { if (Levitation && !is_floater(ptr) && !is_flyer(ptr)) /* Must have Lev_at_will at this point */ +/*JP pline("%s magically floats up!", Monnam(mtmp)); +*/ + pline("%sは魔法の力で浮いた!", Monnam(mtmp)); +/*JP You("mount %s.", mon_nam(mtmp)); +*/ + You("%sに乗った.", mon_nam(mtmp)); } /* setuwep handles polearms differently when you're mounted */ if (uwep && is_pole(uwep)) unweapon = FALSE; @@ -385,11 +518,23 @@ u.usteed->mcanmove = 1; } if (u.usteed->msleeping || !u.usteed->mcanmove) +#if 0 /*JP*/ pline("%s stirs.", He); +#else + pline("%sは動き出した.", He); +#endif else +#if 0 /*JP*/ pline("%s rouses %sself!", He, mhim(u.usteed)); +#else + pline("%sは奮起した!", He); +#endif } else +#if 0 /*JP*/ pline("%s does not respond.", He); +#else + pline("%sは反応しない.", He); +#endif return; } @@ -402,7 +547,10 @@ return; } +/*JP pline("%s gallops!", Monnam(u.usteed)); +*/ + pline("%sは速足になった!", Monnam(u.usteed)); u.ugallop += rn1(20, 30); return; } @@ -465,7 +613,10 @@ struct monst *mtmp; struct obj *otmp; coord cc; +/*JP const char *verb = "fall"; +*/ + const char *verb = "落ちた"; boolean repair_leg_damage = TRUE; unsigned save_utrap = u.utrap; boolean have_spot = landing_spot(&cc,reason,0); @@ -479,16 +630,28 @@ otmp = which_armor(mtmp, W_SADDLE); switch (reason) { case DISMOUNT_THROWN: +/*JP verb = "are thrown"; +*/ + verb = "ふり落された"; case DISMOUNT_FELL: +/*JP You("%s off of %s!", verb, mon_nam(mtmp)); +*/ + You("%sから%s!", mon_nam(mtmp), verb); if (!have_spot) have_spot = landing_spot(&cc,reason,1); +/*JP losehp(rn1(10,10), "riding accident", KILLED_BY_AN); +*/ + losehp(rn1(10,10), "乗りものから落ちて", KILLED_BY_AN); set_wounded_legs(BOTH_SIDES, (int)HWounded_legs + rn1(5,5)); repair_leg_damage = FALSE; break; case DISMOUNT_POLY: +/*JP You("can no longer ride %s.", mon_nam(u.usteed)); +*/ + You("%sに乗ってられない.", mon_nam(u.usteed)); if (!have_spot) have_spot = landing_spot(&cc,reason,1); break; case DISMOUNT_ENGULFED: @@ -503,22 +666,41 @@ case DISMOUNT_BYCHOICE: default: if (otmp && otmp->cursed) { +#if 0 /*JP*/ You("can't. The saddle %s cursed.", otmp->bknown ? "is" : "seems to be"); +#else + You("降りられない.鞍は呪われている%s.", + otmp->bknown ? "" : "ようだ"); +#endif otmp->bknown = TRUE; return; } if (!have_spot) { +/*JP You("can't. There isn't anywhere for you to stand."); +*/ + pline("あなたの立つ場所がないので降りられない."); return; } if (!mtmp->mnamelth) { +#if 0 /*JP*/ pline("You've been through the dungeon on %s with no name.", an(mtmp->data->mname)); +#else + pline("あなたは名無しの%sと共に迷宮内にいる.", + jtrns_mon(mtmp->data->mname)); +#endif if (Hallucination) +/*JP pline("It felt good to get out of the rain."); +*/ + pline("雨のなかから抜け出るのによいと思った."); } else +/*JP You("dismount %s.", mon_nam(mtmp)); +*/ + You("%sから降りた.", mon_nam(mtmp)); } /* While riding these refer to the steed's legs * so after dismounting they refer to the player's @@ -549,14 +731,20 @@ if (!is_flyer(mdat) && !is_floater(mdat) && !is_clinger(mdat)) { if (is_pool(u.ux, u.uy)) { if (!Underwater) +/*JP pline("%s falls into the %s!", Monnam(mtmp), +*/ + pline("%sは%sに落ちた!", Monnam(mtmp), surface(u.ux, u.uy)); if (!is_swimmer(mdat) && !amphibious(mdat)) { killed(mtmp); adjalign(-1); } } else if (is_lava(u.ux, u.uy)) { +/*JP pline("%s is pulled into the lava!", Monnam(mtmp)); +*/ + pline("%sは溶岩の中にひっぱられた!", Monnam(mtmp)); if (!likes_lava(mdat)) { killed(mtmp); adjalign(-1); diff -aurbN -xCVS -xXTAGS nethack/src/teleport.c jnethack/src/teleport.c --- nethack/src/teleport.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/teleport.c 2005-04-26 02:36:57.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" STATIC_DCL boolean FDECL(tele_jump_ok, (int,int,int,int)); @@ -385,7 +392,10 @@ yelp(mtmp); return FALSE; } else { +/*JP Your("leash goes slack."); +*/ + Your("紐はたるんだ."); release_it: m_unleash(mtmp, FALSE); return TRUE; @@ -404,7 +414,10 @@ #ifdef WIZARD if (!wizard) { #endif +/*JP pline("A mysterious force prevents you from teleporting!"); +*/ + pline("奇妙な力が瞬間移動を防いだ!"); return; #ifdef WIZARD } @@ -415,7 +428,10 @@ if (!Blinded) make_blinded(0L,FALSE); if ((u.uhave.amulet || On_W_tower_level(&u.uz)) && !rn2(3)) { +/*JP You_feel("disoriented for a moment."); +*/ + You("一瞬方向感覚を失ったような気がした."); return; } if ((Teleport_control && !Stunned) @@ -424,8 +440,12 @@ #endif ) { if (unconscious()) { +/*JP pline("Being unconscious, you cannot control your teleport."); +*/ + pline("意識がないので,あなたは瞬間移動を制御できない."); } else { +#if 0 /*JP*/ #ifdef STEED char buf[BUFSZ]; if (u.usteed) Sprintf(buf," and %s", mon_nam(u.usteed)); @@ -435,9 +455,15 @@ u.usteed ? buf : #endif ""); +#else /*JP*/ + pline("どの位置に瞬間移動しますか?"); +#endif /*JP*/ cc.x = u.ux; cc.y = u.uy; +/*JP if (getpos(&cc, TRUE, "the desired position") < 0) +*/ + if (getpos(&cc, TRUE, "移動したい場所") < 0) return; /* abort */ /* possible extensions: introduce a small error if magic power is low; allow transfer to solid rock */ @@ -445,7 +471,10 @@ teleds(cc.x, cc.y, FALSE); return; } +/*JP pline("Sorry..."); +*/ + pline("おっと..."); } } @@ -463,8 +492,14 @@ if (trap) { if (trap->once) { +/*JP pline("This is a vault teleport, usable once only."); +*/ + pline("一度かぎりの倉庫への瞬間移動の罠だ."); +/*JP if (yn("Jump in?") == 'n') +*/ + if (yn("飛び込む?") == 'n') trap = 0; else { deltrap(trap); @@ -472,8 +507,12 @@ } } if (trap) +#if 0 /*JP*/ You("%s onto the teleportation trap.", locomotion(youmonst.data, "jump")); +#else + You("瞬間移動の罠に飛びこんだ."); +#endif } if (!trap) { boolean castit = FALSE; @@ -493,8 +532,14 @@ #endif if (!castit) { if (!Teleportation) +/*JP You("don't know that spell."); +*/ + You("そんな魔法は知らない."); +/*JP else You("are not able to teleport at will."); +*/ + else You("自分の意思で瞬間移動できない."); return(0); } #ifdef WIZARD @@ -506,8 +551,13 @@ #ifdef WIZARD if (!wizard) { #endif +#if 0 /*JP*/ You("lack the strength %s.", castit ? "for a teleport spell" : "to teleport"); +#else + You("%sだけの力がない.", + castit ? "瞬間移動の魔法を唱える" : "瞬間移動する"); +#endif return 1; #ifdef WIZARD } @@ -522,14 +572,22 @@ else #endif { +#if 0 /*JP*/ You("lack the energy %s.", castit ? "for a teleport spell" : "to teleport"); +#else + You("%sだけのエネルギーがない.", + castit ? "瞬間移動の魔法を唱える" : "瞬間移動する"); +#endif return 1; } } if (check_capacity( +/*JP "Your concentration falters from carrying so much.")) +*/ + "沢山ものを持ちすぎて集中できない.")) return 1; if (castit) { @@ -574,7 +632,10 @@ && !wizard #endif ) { +/*JP You_feel("very disoriented for a moment."); +*/ + You("一瞬方向感覚を大きく失ったような気がした."); return; } if ((Teleport_control && !Stunned) @@ -585,26 +646,38 @@ char qbuf[BUFSZ]; int trycnt = 0; +/*JP Strcpy(qbuf, "To what level do you want to teleport?"); +*/ + Strcpy(qbuf, "何階に移動しますか?"); do { if (++trycnt == 2) { #ifdef WIZARD if (wizard) Strcat(qbuf, " [type a number or ? for a menu]"); else #endif +/*JP Strcat(qbuf, " [type a number]"); +*/ + Strcat(qbuf, " [数字をいれてね]"); } getlin(qbuf, buf); if (!strcmp(buf,"\033")) { /* cancelled */ if (Confusion && rnl(5)) { +/*JP pline("Oops..."); +*/ + pline("おっと..."); goto random_levtport; } return; } else if (!strcmp(buf,"*")) { goto random_levtport; } else if (Confusion && rnl(5)) { +/*JP pline("Oops..."); +*/ + pline("おっと..."); goto random_levtport; } #ifdef WIZARD @@ -643,19 +716,48 @@ if (newlev == 0) { if (trycnt >= 10) goto random_levtport; +/*JP if (ynq("Go to Nowhere. Are you sure?") != 'y') return; +*/ + if(ynq("どことも知れぬ場所に行きます?よろしいですか?") != 'y') return; +#if 0 /*JP*/ You("%s in agony as your body begins to warp...", is_silent(youmonst.data) ? "writhe" : "scream"); +#else + You("体が移動しはじめると,苦しみ%s...", + is_silent(youmonst.data) ? "で身もだえした" : "のあえぎ声を出した"); +#endif display_nhwindow(WIN_MESSAGE, FALSE); +/*JP You("cease to exist."); +*/ + You("存在が消滅した."); +#if 0 /*JP:T*/ if (invent) Your("possessions land on the %s with a thud.", surface(u.ux, u.uy)); +#else + if (invent) Your("持ちものはドサッと%sに落ちた.", + surface(u.ux, u.uy)); +#endif +#if 0 /*JP*/ killer_format = NO_KILLER_PREFIX; killer = "committed suicide"; +#else + killer_format = KILLED_BY; + killer = "自殺行為で"; +#endif done(DIED); +/*JP pline("An energized cloud of dust begins to coalesce."); +*/ + pline("エネルギーをもったほこりの渦が結合しはじめた."); +#if 0 /*JP:T*/ Your("body rematerializes%s.", invent ? ", and you gather up all your possessions" : ""); +#else + Your("体は再び実体化した.%s", invent ? + "そして全ての持ち物を拾い上げた." : ""); +#endif return; } @@ -694,7 +796,10 @@ int llimit = dunlevs_in_dungeon(&u.uz); if (newlev >= 0 || newlev <= -llimit) { +/*JP You_cant("get there from here."); +*/ + You("そこには行けない."); return; } newlevel.dnum = u.uz.dnum; @@ -716,31 +821,68 @@ in_mklev = FALSE; } if (newlev <= -10) { +/*JP You("arrive in heaven."); +*/ + You("天国に辿りついた."); +/*JP verbalize("Thou art early, but we'll admit thee."); +*/ + verbalize("汝,死ぬには早すぎるがそれもよかろう."); +#if 0 /*JP*/ killer_format = NO_KILLER_PREFIX; killer = "went to heaven prematurely"; +#else + killer_format = KILLED_BY; + killer = "若くして天国に行き"; +#endif } else if (newlev == -9) { +/*JP You_feel("deliriously happy. "); +*/ + You("狂ったような幸せを感じた."); +/*JP pline("(In fact, you're on Cloud 9!) "); +*/ + pline("(本当に苦を乗り越えた場所にいる!) "); display_nhwindow(WIN_MESSAGE, FALSE); } else +/*JP You("are now high above the clouds..."); +*/ + You("雲の遥か上にいる..."); if (killer) { ; /* arrival in heaven is pending */ } else if (Levitation) { +/*JP escape_by_flying = "float gently down to earth"; +*/ + escape_by_flying = "ゆっくり地面に降りた."; } else if (Flying) { +/*JP escape_by_flying = "fly down to the ground"; +*/ + escape_by_flying = "ゆっくり地面に降りた."; } else { +/*JP pline("Unfortunately, you don't know how to fly."); +*/ + pline("不幸にも,あなたは飛びかたを知らない."); +/*JP You("plummet a few thousand feet to your death."); +*/ + pline("数千フィートの死のダイビングだ!"); +#if 0 /*JP:T*/ Sprintf(buf, "teleported out of the dungeon and fell to %s death", uhis()); killer = buf; killer_format = NO_KILLER_PREFIX; +#else + killer = "迷宮を飛びだしダイビングして"; + killer_format = KILLED_BY; +#endif } } @@ -754,13 +896,19 @@ done(DIED); /* can only get here via life-saving (or declining to die in explore|debug mode); the hero has now left the dungeon... */ +/*JP escape_by_flying = "find yourself back on the surface"; +*/ + escape_by_flying = "気がついたら地上に戻っていた"; u.uz = lsav; /* restore u.uz so escape code works */ } /* calls done(ESCAPED) if newlevel==0 */ if (escape_by_flying) { +/*JP You("%s.", escape_by_flying); +*/ + You("%s.", escape_by_flying); newlevel.dnum = 0; /* specify main dungeon */ newlevel.dlevel = 0; /* escape the dungeon */ /* [dlevel used to be set to 1, but it doesn't make sense to @@ -785,7 +933,10 @@ dunlevs_in_dungeon(&u.uz) - 1)) { newlev = dungeons[u.uz.dnum].depth_start + dunlevs_in_dungeon(&u.uz) - 2; +/*JP pline("Sorry..."); +*/ + pline("おっと..."); } /* no teleporting out of quest dungeon */ if (In_quest(&u.uz) && newlev < depth(&qstart_level)) @@ -820,20 +971,29 @@ /* problem: level teleport landing escapes the check */ if (!on_level(&u.uz, &u.uz0)) return; +/*JP You("activated a magic portal!"); +*/ + pline("魔法の入口が作動した!"); /* prevent the poor shnook, whose amulet was stolen while in * the endgame, from accidently triggering the portal to the * next level, and thus losing the game */ if (In_endgame(&u.uz) && !u.uhave.amulet) { +/*JP You_feel("dizzy for a moment, but nothing happens..."); +*/ + You("一瞬めまいを感じた,しかし何も起きなかった..."); return; } target_level = ttmp->dst; schedule_goto(&target_level, FALSE, FALSE, 1, +/*JP "You feel dizzy for a moment, but the sensation passes.", +*/ + "一瞬めまいを感じた,しかしその感覚は消えた.", (char *)0); } @@ -844,7 +1004,10 @@ if (In_endgame(&u.uz) || Antimagic) { if (Antimagic) shieldeff(u.ux, u.uy); +/*JP You_feel("a wrenching sensation."); +*/ + You("ねじられたような感覚を感じた."); } else if (!next_to_u()) { You(shudder_for_moment); } else if (trap->once) { @@ -859,20 +1022,35 @@ level_tele_trap(trap) struct trap *trap; { +#if 0 /*JP*/ You("%s onto a level teleport trap!", Levitation ? (const char *)"float" : locomotion(youmonst.data, "step")); +#else + You("別の階への瞬間移動の罠を%s!", + Levitation ? (const char *)"見下ろした" : + jpast(locomotion(youmonst.data, "踏む"))); +#endif if (Antimagic) { shieldeff(u.ux, u.uy); } if (Antimagic || In_endgame(&u.uz)) { +/*JP You_feel("a wrenching sensation."); +*/ + You("ねじられたような感覚を感じた."); return; } if (!Blind) +/*JP You("are momentarily blinded by a flash of light."); +*/ + You("まばゆい光で一瞬目がくらんだ."); else +/*JP You("are momentarily disoriented."); +*/ + You("一瞬方向感覚を失った."); deltrap(trap); newsym(u.ux,u.uy); /* get rid of trap symbol */ level_tele(); @@ -1050,8 +1228,13 @@ { if (level.flags.noteleport) { if (canseemon(mon)) +#if 0 /*JP*/ pline("A mysterious force prevents %s from teleporting!", mon_nam(mon)); +#else + pline("奇妙な力が%sの瞬間移動を防いだ!", + mon_nam(mon)); +#endif return TRUE; } return FALSE; @@ -1079,9 +1262,15 @@ if (in_sight) { if (canseemon(mtmp)) +/*JP pline("%s seems disoriented.", monname); +*/ + pline("%sは一瞬方向感覚を失ったようだ.", monname); else +/*JP pline("%s suddenly disappears!", monname); +*/ + pline("%sは突然消えた!", monname); seetrap(trap); } } @@ -1109,8 +1298,13 @@ assign_level(&tolevel, &valley_level); } else if (Is_botlevel(&u.uz)) { if (in_sight && trap->tseen) +#if 0 /*JP*/ pline("%s avoids the %s.", Monnam(mtmp), (tt == HOLE) ? "hole" : "trap"); +#else + pline("%sは%sを回避した.", Monnam(mtmp), + (tt == HOLE) ? "穴" : "罠"); +#endif return 0; } else { get_level(&tolevel, depth(&u.uz) + 1); @@ -1119,7 +1313,10 @@ if (In_endgame(&u.uz) && (mon_has_amulet(mtmp) || is_home_elemental(mptr))) { if (in_sight && mptr->mlet != S_ELEMENTAL) { +/*JP pline("%s seems to shimmer for a moment.", +*/ + pline("%sが一瞬輝いたように見えた.", Monnam(mtmp)); seetrap(trap); } @@ -1133,21 +1330,30 @@ if (mon_has_amulet(mtmp) || In_endgame(&u.uz)) { if (in_sight) +/*JP pline("%s seems very disoriented for a moment.", +*/ + pline("%sは一瞬方向感覚を大きく失ったようだ.", Monnam(mtmp)); return 0; } nlev = random_teleport_level(); if (nlev == depth(&u.uz)) { if (in_sight) +/*JP pline("%s shudders for a moment.", Monnam(mtmp)); +*/ + pline("%sは一瞬震えた.", Monnam(mtmp)); return 0; } get_level(&tolevel, nlev); } if (in_sight) { +/*JP pline("Suddenly, %s disappears out of sight.", mon_nam(mtmp)); +*/ + pline("突然%sが視界から消えた.", mon_nam(mtmp)); seetrap(trap); } migrate_to_level(mtmp, ledger_no(&tolevel), @@ -1187,7 +1393,10 @@ within_bounded_area(tx, ty, dndest.nlx, dndest.nly, dndest.nhx, dndest.nhy))))); +/*JP if (flooreffects(obj, tx, ty, "fall")) { +*/ + if (flooreffects(obj, tx, ty, "落ちる")) { return; } else if (otx == 0 && oty == 0) { ; /* fell through a trap door; no update of old loc needed */ @@ -1273,11 +1482,17 @@ if (mtmp->ispriest && *in_rooms(mtmp->mx, mtmp->my, TEMPLE)) { if (give_feedback) +/*JP pline("%s resists your magic!", Monnam(mtmp)); +*/ + pline("%sは魔法を防いだ!", Monnam(mtmp)); return FALSE; } else if (level.flags.noteleport && u.uswallow && mtmp == u.ustuck) { if (give_feedback) +/*JP You("are no longer inside %s!", mon_nam(mtmp)); +*/ + You("%sの内部から脱出した!", mon_nam(mtmp)); unstuck(mtmp); (void) rloc(mtmp, FALSE); } else if (is_rider(mtmp->data) && rn2(13) && diff -aurbN -xCVS -xXTAGS nethack/src/timeout.c jnethack/src/timeout.c --- nethack/src/timeout.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/timeout.c 2005-06-21 19:25:24.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "lev.h" /* for checking save modes */ @@ -18,11 +25,19 @@ /* He is being petrified - dialogue by inmet!tower */ static NEARDATA const char * const stoned_texts[] = { +#if 0 /*JP*/ "You are slowing down.", /* 5 */ "Your limbs are stiffening.", /* 4 */ "Your limbs have turned to stone.", /* 3 */ "You have turned to stone.", /* 2 */ "You are a statue." /* 1 */ +#else + "あなたはのろくなった.", /* 5 */ + "あなたの手足は硬直した.", /* 4 */ + "あなたの手足は石化した.", /* 3 */ + "あなたは石になった.", /* 2 */ + "あなたは彫像になった." /* 1 */ +#endif }; STATIC_OVL void @@ -41,11 +56,19 @@ /* He is getting sicker and sicker prior to vomiting */ static NEARDATA const char * const vomiting_texts[] = { +#if 0 /*JP*/ "are feeling mildly nauseated.", /* 14 */ "feel slightly confused.", /* 11 */ "can't seem to think straight.", /* 8 */ "feel incredibly sick.", /* 5 */ "suddenly vomit!" /* 2 */ +#else + "ちょっと吐き気がした.", /* 14 */ + "少し混乱した.", /* 11 */ + "まともに思考できなくなった.", /* 8 */ + "とても気分が悪くなった.", /* 5 */ + "突然嘔吐した!" /* 2 */ +#endif }; STATIC_OVL void @@ -73,19 +96,35 @@ } static NEARDATA const char * const choke_texts[] = { +#if 0 /*JP*/ "You find it hard to breathe.", "You're gasping for air.", "You can no longer breathe.", "You're turning %s.", "You suffocate." +#else + "あなたは呼吸が困難になった.", + "あなたは苦しくてあえいだ.", + "あなたはもう呼吸ができない.", + "あなたは%sなった.", + "あなたは窒息した." +#endif }; static NEARDATA const char * const choke_texts2[] = { +#if 0 /*JP*/ "Your %s is becoming constricted.", "Your blood is having trouble reaching your brain.", "The pressure on your %s increases.", "Your consciousness is fading.", "You suffocate." +#else + "あなたの%sは絞めつけられた.", + "血液のめぐりが悪くなった.", + "%sの圧力が高くなった.", + "意識が遠くなってきた.", + "あなたは窒息した." +#endif }; STATIC_OVL void @@ -100,7 +139,10 @@ const char *str = choke_texts[SIZE(choke_texts)-i]; if (index(str, '%')) +/*JP pline(str, hcolor(NH_BLUE)); +*/ + pline(str, jconj_adj(hcolor(NH_BLUE))); else pline(str); } @@ -109,11 +151,19 @@ } static NEARDATA const char * const slime_texts[] = { +#if 0 /*JP*/ "You are turning a little %s.", /* 5 */ "Your limbs are getting oozy.", /* 4 */ "Your skin begins to peel away.", /* 3 */ "You are turning into %s.", /* 2 */ "You have become %s." /* 1 */ +#else + "少し%sなった.", /* 5 */ + "手足が溶けはじめた.", /* 4 */ + "肌がどろどろになってきた.", /* 3 */ + "%sになりはじめた.", /* 2 */ + "%sになってしまった.", /* 1 */ +#endif }; STATIC_OVL void @@ -128,9 +178,15 @@ if (index(str, '%')) { if (i == 4L) { /* "you are turning green" */ if (!Blind) /* [what if you're already green?] */ +/*JP pline(str, hcolor(NH_GREEN)); +*/ + pline(str, jconj_adj(hcolor(NH_GREEN))); } else +/*JP pline(str, an(Hallucination ? rndmonnam() : "green slime")); +*/ + pline(str, jtrns_mon(Hallucination ? rndmonnam() : "green slime")); } else pline(str); } @@ -146,7 +202,10 @@ burn_away_slime() { if (Slimed) { +/*JP pline_The("slime that covers you is burned away!"); +*/ + pline("あなたを覆っていたスライムは焼け落ちた!"); Slimed = 0L; flags.botl = 1; } @@ -162,7 +221,9 @@ { register struct prop *upp; int sleeptime; +#if 0 /*JP*/ int m_idx; +#endif int baseluck = (flags.moonphase == FULL_MOON) ? 1 : 0; if (flags.friday13) baseluck -= 1; @@ -202,15 +263,23 @@ u.uspellprot--; find_ac(); if (!Blind) +#if 0 /*JP*/ Norep("The %s haze around you %s.", hcolor(NH_GOLDEN), u.uspellprot ? "becomes less dense" : "disappears"); +#else + Norep("あなたの回りの%s霧は%s.", hcolor(NH_GOLDEN), + u.uspellprot ? "消えはじめた" : "消えた"); +#endif } } #ifdef STEED if (u.ugallop) { if (--u.ugallop == 0L && u.usteed) +/*JP pline("%s stops galloping.", Monnam(u.usteed)); +*/ + pline("%sは速駆けをやめた.", Monnam(u.usteed)); } #endif @@ -219,14 +288,25 @@ switch(upp - u.uprops){ case STONED: if (delayed_killer && !killer) { +#if 0 /*JP*/ killer = delayed_killer; +#else + char buf[BUFSZ]; + Sprintf(buf, "%sの攻撃で", delayed_killer); + killer = buf; +#endif delayed_killer = 0; } if (!killer) { /* leaving killer_format would make it "petrified by petrification" */ +#if 0 /*JP*/ killer_format = NO_KILLER_PREFIX; killer = "killed by petrification"; +#else + killer_format = KILLED_BY; + killer = "石化攻撃で"; +#endif } done(STONING); break; @@ -237,7 +317,10 @@ } if (!killer) { killer_format = NO_KILLER_PREFIX; +/*JP killer = "turned into green slime"; +*/ + killer = "緑スライムになった"; } done(TURNED_SLIME); break; @@ -245,7 +328,11 @@ make_vomiting(0L, TRUE); break; case SICK: +/*JP You("die from your illness."); +*/ + You("病気で死んだ."); +#if 0 /*JP*/ killer_format = KILLED_BY_AN; killer = u.usick_cause; if ((m_idx = name_to_mon(killer)) >= LOW_PM) { @@ -257,13 +344,31 @@ killer_format = KILLED_BY; } } +#else + { + static char jbuf[BUFSZ]; + Strcpy(jbuf, u.usick_cause); + if (u.usick_type & SICK_VOMITABLE) { + Strcat(jbuf, "による食あたりで死んだ"); + } else { + Strcat(jbuf, "によって病死した"); + } + killer_format = NO_KILLER_PREFIX; + killer = jbuf; + } +#endif u.usick_type = 0; done(POISONING); break; case FAST: if (!Very_fast) +#if 0 /*JP*/ You_feel("yourself slowing down%s.", Fast ? " a bit" : ""); +#else + You("%s遅くなったような気がした.", + Fast ? "ちょっと" : ""); +#endif break; case CONFUSION: HConfusion = 1; /* So make_confused works properly */ @@ -283,9 +388,15 @@ case INVIS: newsym(u.ux,u.uy); if (!Invis && !BInvis && !Blind) { +#if 0 /*JP*/ You(!See_invisible ? "are no longer invisible." : "can no longer see through yourself."); +#else + You(!See_invisible ? + "もう透明ではない." : + "透きとおっていない."); +#endif stop_occupation(); } break; @@ -299,6 +410,13 @@ heal_legs(); stop_occupation(); break; +#ifdef JPEXTENSION + case TOTTER: + Totter = 0; + make_totter(0L, TRUE); + stop_occupation(); + break; +#endif case HALLUC: HHallucination = 1; (void) make_hallucinated(0L, TRUE, 0L); @@ -308,7 +426,10 @@ if (unconscious() || Sleep_resistance) HSleeping += rnd(100); else if (Sleeping) { +/*JP You("fall asleep."); +*/ + You("眠りに落ちた."); sleeptime = rnd(20); fall_asleep(-sleeptime, TRUE); HSleeping += sleeptime + rnd(100); @@ -319,7 +440,10 @@ break; case STRANGLED: killer_format = KILLED_BY; +/*JP killer = (u.uburied) ? "suffocation" : "strangulation"; +*/ + killer = (u.uburied) ? "窒息して" : "首を絞められて"; done(DIED); break; case FUMBLING: @@ -334,7 +458,10 @@ * to this number must be thoroughly play tested. */ if ((inv_weight() > -500)) { +/*JP You("make a lot of noise!"); +*/ + You("大きな音をたてた!"); wake_nearby(); } } @@ -372,7 +499,10 @@ } /* early wakeup from combat won't be possible until next monster turn */ u.usleep = monstermoves; +/*JP nomovemsg = wakeup_msg ? "You wake up." : You_can_move_again; +*/ + nomovemsg = wakeup_msg ? "目を覚ました." : You_can_move_again; } /* Attach an egg hatch timeout to the given egg. */ @@ -495,10 +625,16 @@ boolean siblings = (hatchcount > 1), redraw = FALSE; if (cansee_hatchspot) { +#if 0 /*JP*/ Sprintf(monnambuf, "%s%s", siblings ? "some " : "", siblings ? makeplural(m_monnam(mon)) : an(m_monnam(mon))); +#else + Sprintf(monnambuf, "%s%s", + siblings ? "いくつかの" : "", + a_monnam(mon)); +#endif /* we don't learn the egg type here because learning an egg type requires either seeing the egg hatch or being familiar with the egg already, @@ -510,25 +646,49 @@ case OBJ_INVENT: knows_egg = TRUE; /* true even if you are blind */ if (!cansee_hatchspot) +#if 0 /*JP*/ You_feel("%s %s from your pack!", something, locomotion(mon->data, "drop")); +#else + pline("何かがあなたの背負い袋から%sような気がした.", + jpast(locomotion(mon->data, "落ちる"))); +#endif else +#if 0 /*JP*/ You("see %s %s out of your pack!", monnambuf, locomotion(mon->data, "drop")); +#else + pline("%sがあなたの背負い袋から%s.", + monnambuf, + jpast(locomotion(mon->data, "落ちる"))); +#endif if (yours) { +#if 0 /*JP*/ pline("%s cries sound like \"%s%s\"", siblings ? "Their" : "Its", flags.female ? "mommy" : "daddy", egg->spe ? "." : "?"); +#else + pline("それは『%s%s』と鳴いているようだ.", + flags.female ? "ママ" : "パパ", + egg->spe ? "" : "?"); +#endif } else if (mon->data->mlet == S_DRAGON) { +#if 0 /*JP*/ verbalize("Gleep!"); /* Mything eggs :-) */ +#else + verbalize("ブォー!"); /* Mything eggs :-) */ +#endif } break; case OBJ_FLOOR: if (cansee_hatchspot) { knows_egg = TRUE; +/*JP You("see %s hatch.", monnambuf); +*/ + You("%sが卵から孵化するのを見た.", monnambuf); redraw = TRUE; /* update egg's map location */ } break; @@ -537,16 +697,31 @@ if (cansee_hatchspot) { /* egg carring monster might be invisible */ if (canseemon(egg->ocarry)) { +/*JP Sprintf(carriedby, "%s pack", +*/ + Sprintf(carriedby, "%sの背負い袋から", s_suffix(a_monnam(egg->ocarry))); knows_egg = TRUE; } else if (is_pool(mon->mx, mon->my)) +/*JP Strcpy(carriedby, "empty water"); +*/ + Strcpy(carriedby, "何もない水中から"); else +/*JP Strcpy(carriedby, "thin air"); +*/ + Strcpy(carriedby, "何もない空間から"); +#if 0 /*JP*/ You("see %s %s out of %s!", monnambuf, locomotion(mon->data, "drop"), carriedby); +#else + You("%sが%s%sのを見た.", monnambuf, + carriedby, + locomotion(mon->data, "落ちる")); +#endif } break; #if 0 @@ -634,44 +809,80 @@ name; if not, look for rocks to trip over; trip over anonymous "something" if there aren't any rocks. */ +/*JP pronoun = otmp->quan == 1L ? "it" : Hallucination ? "they" : "them"; +*/ + pronoun = "何か"; what = !otmp->nexthere ? pronoun : (otmp->dknown || !Blind) ? doname(otmp) : ((otmp = sobj_at(ROCK, u.ux, u.uy)) == 0 ? something : +/*JP (otmp->quan == 1L ? "a rock" : "some rocks")); +*/ + "石"); if (Hallucination) { what = strcpy(buf, what); buf[0] = highc(buf[0]); +#if 0 /*JP*/ pline("Egads! %s bite%s your %s!", what, (!otmp || otmp->quan == 1L) ? "s" : "", body_part(FOOT)); +#else + pline("ぐわぁ!%sが%sに噛みついた!", + what, body_part(FOOT)); +#endif } else { +/*JP You("trip over %s.", what); +*/ + You("%sにつまづいた.", what); } } else if (rn2(3) && is_ice(u.ux, u.uy)) { +/*JP pline("%s %s%s on the ice.", +*/ + pline("%sは氷の上で滑った.", #ifdef STEED u.usteed ? upstart(x_monnam(u.usteed, u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, (char *)0, SUPPRESS_SADDLE, FALSE)) : #endif +/*JP "You", rn2(2) ? "slip" : "slide", on_foot ? "" : "s"); +*/ + "あなた"); } else { if (on_foot) { switch (rn2(4)) { case 1: +#if 0 /*JP*/ You("trip over your own %s.", Hallucination ? "elbow" : makeplural(body_part(FOOT))); +#else + You("自分の%sを踏んでつまづいた.", Hallucination ? + "肘" : makeplural(body_part(FOOT))); +#endif break; case 2: +#if 0 /*JP*/ You("slip %s.", Hallucination ? "on a banana peel" : "and nearly fall"); +#else + You("%s.", Hallucination ? + "バナナの皮で滑った" : "滑って転びそうになった"); +#endif break; case 3: +/*JP You("flounder."); +*/ + You("じたばたした."); break; default: +/*JP You("stumble."); +*/ + You("よろめいた."); break; } } @@ -679,16 +890,28 @@ else { switch (rn2(4)) { case 1: +/*JP Your("%s slip out of the stirrups.", makeplural(body_part(FOOT))); +*/ + You("あぶみを踏み外してしまった."); break; case 2: +/*JP You("let go of the reins."); +*/ + You("手綱を放してしまった."); break; case 3: +/*JP You("bang into the saddle-horn."); +*/ + You("サドルホーンにぶつかってしまった."); break; default: +/*JP You("slide to one side of the saddle."); +*/ + You("鞍の片側に滑ってしまった."); break; } dismount_steed(DISMOUNT_FELL); @@ -706,10 +929,16 @@ switch (obj->where) { case OBJ_INVENT: case OBJ_MINVENT: +/*JP pline("%s flickers%s.", Yname2(obj), tailer); +*/ + pline("%sは%s点滅した.", Yname2(obj), tailer); break; case OBJ_FLOOR: +/*JP You("see %s flicker%s.", an(xname(obj)), tailer); +*/ + You("%sが%s点滅するのが見えた.", an(xname(obj)), tailer); break; } } @@ -722,15 +951,27 @@ /* from adventure */ switch (obj->where) { case OBJ_INVENT: +/*JP Your("lantern is getting dim."); +*/ + Your("ランタンは暗くなった."); if (Hallucination) +/*JP pline("Batteries have not been invented yet."); +*/ + pline("電池はまだ発明されてないんだっけ."); break; case OBJ_FLOOR: +/*JP You("see a lantern getting dim."); +*/ + pline("ランタンが暗くなったのが見えた."); break; case OBJ_MINVENT: +/*JP pline("%s lantern is getting dim.", +*/ + pline("%sのランタンは暗くなった.", s_suffix(Monnam(obj->ocarry))); break; } @@ -795,11 +1036,17 @@ switch (obj->where) { case OBJ_INVENT: case OBJ_MINVENT: +/*JP pline("%s potion of oil has burnt away.", +*/ + pline("%sオイルは燃えつきた.", whose); break; case OBJ_FLOOR: +/*JP You("see a burning potion of oil go out."); +*/ + You("オイルの火が消えたのが見えた."); need_newsym = TRUE; break; } @@ -821,7 +1068,10 @@ lantern_message(obj); else see_lamp_flicker(obj, +/*JP obj->age == 50L ? " considerably" : ""); +*/ + obj->age == 50L ? "激しく" : ""); } break; @@ -833,11 +1083,17 @@ switch (obj->where) { case OBJ_INVENT: case OBJ_MINVENT: +/*JP pline("%s %s seems about to go out.", +*/ + pline("%s%sは今にも消えそうだ.", whose, xname(obj)); break; case OBJ_FLOOR: +/*JP You("see %s about to go out.", +*/ + pline("%sが消えかけているのが見えた.", an(xname(obj))); break; } @@ -852,17 +1108,29 @@ case OBJ_INVENT: case OBJ_MINVENT: if (obj->otyp == BRASS_LANTERN) +/*JP pline("%s lantern has run out of power.", +*/ + pline("%sランタンの力を使い切った.", whose); else +/*JP pline("%s %s has gone out.", +*/ + pline("%s%sは消えた.", whose, xname(obj)); break; case OBJ_FLOOR: if (obj->otyp == BRASS_LANTERN) +/*JP You("see a lantern run out of power."); +*/ + You("ランタンが消えるのが見えた."); else +/*JP You("see %s go out.", +*/ + You("%sが消えるのが見えた.", an(xname(obj))); break; } @@ -893,16 +1161,27 @@ switch (obj->where) { case OBJ_INVENT: case OBJ_MINVENT: +#if 0 /*JP*/ pline("%s %scandle%s getting short.", whose, menorah ? "candelabrum's " : "", many ? "s are" : " is"); +#else + pline("%s%sろうそくは短くなった.", + whose, + menorah ? "燭台の" : ""); +#endif break; case OBJ_FLOOR: +#if 0 /*JP*/ You("see %scandle%s getting short.", menorah ? "a candelabrum's " : many ? "some " : "a ", many ? "s" : ""); +#else + You("%sろうそくが短くなるのが見えた.", + menorah ? "燭台の" : ""); +#endif break; } break; @@ -913,19 +1192,30 @@ case OBJ_INVENT: case OBJ_MINVENT: pline( +#if 0 /*JP*/ "%s %scandle%s flame%s flicker%s low!", whose, menorah ? "candelabrum's " : "", many ? "s'" : "'s", many ? "s" : "", many ? "" : "s"); +#else + "%s%sろうそくの炎は点滅し,暗くなった!", + whose, + menorah ? "燭台の" : ""); +#endif break; case OBJ_FLOOR: +#if 0 /*JP*/ You("see %scandle%s flame%s flicker low!", menorah ? "a candelabrum's " : many ? "some " : "a ", many ? "s'" : "'s", many ? "s" : ""); +#else + You("%sろうそくの炎が点滅し,暗くなるのが見えた!", + menorah ? "燭台の" : ""); +#endif break; } break; @@ -937,43 +1227,68 @@ switch (obj->where) { case OBJ_INVENT: case OBJ_MINVENT: +#if 0 /*JP*/ pline("%s candelabrum's flame%s.", whose, many ? "s die" : " dies"); +#else + pline("%s燭台の炎は消えた.", + whose); +#endif break; case OBJ_FLOOR: +#if 0 /*JP*/ You("see a candelabrum's flame%s die.", many ? "s" : ""); +#else + You("燭台の炎が消えるのが見えた."); +#endif break; } } else { switch (obj->where) { case OBJ_INVENT: case OBJ_MINVENT: +#if 0 /*JP*/ pline("%s %s %s consumed!", whose, xname(obj), many ? "are" : "is"); +#else + pline("%s%sは燃えつきた!", + whose, + xname(obj)); +#endif break; case OBJ_FLOOR: /* You see some wax candles consumed! You see a wax candle consumed! */ +#if 0 /*JP*/ You("see %s%s consumed!", many ? "some " : "", many ? xname(obj):an(xname(obj))); +#else + You("%sが燃えつきるのが見えた!", + xname(obj)); +#endif need_newsym = TRUE; break; } /* post message */ pline(Hallucination ? +#if 0 /*JP*/ (many ? "They shriek!" : "It shrieks!") : Blind ? "" : (many ? "Their flames die." : "Its flame dies.")); +#else + "それは震えた." : + "炎は消えた."); +#endif } } end_burn(obj, FALSE); @@ -1217,13 +1532,19 @@ if(levl[u.ux][u.uy].typ == CLOUD) { /* inside a cloud during a thunder storm is deafening */ +/*JP pline("Kaboom!!! Boom!! Boom!!"); +*/ + pline("ピカッ!!ゴロゴロゴロゴロ!!ドーン!"); if(!u.uinvulnerable) { stop_occupation(); nomul(-3); } } else +/*JP You_hear("a rumbling noise."); +*/ + You_hear("雷の音を聞いた."); } #endif /* OVL1 */ diff -aurbN -xCVS -xXTAGS nethack/src/topten.c jnethack/src/topten.c --- nethack/src/topten.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/topten.c 2003-12-10 03:32:06.000000000 +0900 @@ -77,9 +77,15 @@ /* must fit with end.c; used in rip.c */ NEARDATA const char * const killed_by_prefix[] = { +#if 0 /*JP*/ "killed by ", "choked on ", "poisoned by ", "died of ", "drowned in ", "burned by ", "dissolved in ", "crushed to death by ", "petrified by ", "turned to slime by ", "killed by ", "", "", "", "", "" +#else + "死んだ", "で窒息した", "の毒で死んだ", "", "溺死した", + "焼死した", "溶岩に溶けた", "押し潰された", "石になった", + "にスライムにされた", "虐殺された", "", "", "", "", "" +#endif }; static winid toptenwin = WIN_ERR; @@ -318,18 +324,35 @@ switch (killer_format) { default: impossible("bad killer format?"); case KILLED_BY_AN: +#if 0 /*JP*/ Strcat(t0->death, killed_by_prefix[how]); (void) strncat(t0->death, an(killer), DTHSZ-strlen(t0->death)); +#else + (void) strncat(t0->death, an(killer), + DTHSZ-strlen(t0->death)); + Strcat(t0->death, killed_by_prefix[how]); +#endif break; case KILLED_BY: +#if 0 /*JP*/ Strcat(t0->death, killed_by_prefix[how]); (void) strncat(t0->death, killer, DTHSZ-strlen(t0->death)); +#else + (void) strncat(t0->death, killer, + DTHSZ-strlen(t0->death)); + Strcat(t0->death, killed_by_prefix[how]); +#endif break; case NO_KILLER_PREFIX: (void) strncat(t0->death, killer, DTHSZ); break; +#if 1 /*JP*/ + case KILLED_SUFFIX: + (void) strncat(t0->death, killer, DTHSZ); + Strcat(t0->death, "に殺された"); +#endif } t0->birthdate = yyyymmdd(u.ubirthday); t0->deathdate = yyyymmdd((time_t)0L); @@ -355,8 +378,13 @@ char pbuf[BUFSZ]; topten_print(""); Sprintf(pbuf, +#if 0 /*JP*/ "Since you were in %s mode, the score list will not be checked.", wizard ? "wizard" : "discover"); +#else + "%sモードでプレイしたのでスコアリストには載らない.", + wizard ? "ウィザード" : "発見"); +#endif topten_print(pbuf); } goto showwin; @@ -418,7 +446,10 @@ HUP { char pbuf[BUFSZ]; Sprintf(pbuf, +/*JP "You didn't beat your previous score of %ld points.", +*/ + "あなたは以前の%ldポイントのスコアに届かなかった.", t1->points); topten_print(pbuf); topten_print(""); @@ -454,12 +485,20 @@ #endif /* UPDATE_RECORD_IN_PLACE */ if(!done_stopprint) if(rank0 > 0){ if(rank0 <= 10) +/*JP topten_print("You made the top ten list!"); +*/ + topten_print("あなたはトップ10リストに載った!"); else { char pbuf[BUFSZ]; Sprintf(pbuf, +#if 0 /*JP*/ "You reached the %d%s place on the top %d list.", rank0, ordin(rank0), ENTRYMAX); +#else + "あなたは,トップ%dリストの%d位に載った!", + ENTRYMAX, rank0 ); +#endif topten_print(pbuf); } topten_print(""); @@ -558,10 +597,26 @@ { boolean second_line = TRUE; char linebuf[BUFSZ]; +#if 0 /*JP*/ char *bp, hpbuf[24], linebuf3[BUFSZ]; +#else + char *bp, hpbuf[24]; + char who[BUFSZ]; + char where[BUFSZ]; + char action[BUFSZ]; + char car[BUFSZ]; + char cdr[BUFSZ]; + const char *jdeath; +#endif int hppos, lngr; +#if 1 /*JP*/ + linebuf[0] = '\0'; + who[0] = '\0'; + where[0] = '\0'; + action[0] = '\0'; +#endif linebuf[0] = '\0'; if (rank) Sprintf(eos(linebuf), "%3d", rank); else Strcat(linebuf, " "); @@ -576,9 +631,27 @@ */ Sprintf(eos(linebuf), "-%s", t1->plgend); if (t1->plalign[0] != '?') +/*JP Sprintf(eos(linebuf), "-%s ", t1->plalign); +*/ + Sprintf(eos(linebuf), "-%s", t1->plalign); else +/*JP Strcat(linebuf, " "); +*/ + Strcat(linebuf, ""); +#if 1 /*JP*/ + Strcat(linebuf, "は"); +/*JP: 日本語では「○○を手に」を先に追加しないと不自然 */ + jdeath = t1->death; + if (!strncmp(jdeath, "魔除けを手に", 12)) + jdeath += 12; + else if (!strncmp(jdeath, "天上で恥辱を受け", 16)) + jdeath += 16; + else if (!strncmp(jdeath, "偽物の魔除けを掴まされ", 24)) + jdeath += 24; +#endif +#if 0 /*JP*/ if (!strncmp("escaped", t1->death, 7)) { Sprintf(eos(linebuf), "escaped the dungeon %s[max level %d]", !strncmp(" (", t1->death + 7, 2) ? t1->death + 7 + 2 : "", @@ -586,15 +659,44 @@ /* fixup for closing paren in "escaped... with...Amulet)[max..." */ if ((bp = index(linebuf, ')')) != 0) *bp = (t1->deathdnum == astral_level.dnum) ? '\0' : ' '; +#else + if (!strncmp("脱出した", jdeath, 8) + || !strncmp("escaped", jdeath, 7)) { + char jbuf[BUFSZ]; + strncpy(jbuf, t1->death, jdeath - t1->death); + jbuf[jdeath - t1->death] = '\0'; + Sprintf(action, "%s迷宮から脱出した[最大地下%d階]", + jbuf, t1->maxlvl); +#endif second_line = FALSE; +#if 0 /*JP*/ } else if (!strncmp("ascended", t1->death, 8)) { +#else + } else if (!strncmp("昇天した", jdeath, 8) + || !strncmp("ascended", jdeath, 8)) { +#endif +#if 0 /*JP:T*/ Sprintf(eos(linebuf), "ascended to demigod%s-hood", (t1->plgend[0] == 'F') ? "dess" : ""); +#else + Sprintf(action, "昇天し%s神となった", + (t1->plgend[0] == 'F') ? "女" : ""); +#endif second_line = FALSE; } else { +/*JP if (!strncmp(t1->death, "quit", 4)) { +*/ + if (!strncmp(jdeath, "抜けた", 4)) { +#if 0 /*JP*/ Strcat(linebuf, "quit"); +#else + Strcat(action, t1->death); +#endif second_line = FALSE; +#if 1 /*JP*/ + } +#else } else if (!strncmp(t1->death, "died of st", 10)) { Strcat(linebuf, "starved to death"); second_line = FALSE; @@ -608,49 +710,115 @@ } else if (!strncmp(t1->death, "petrified by ", 13)) { Strcat(linebuf, "turned to stone"); } else Strcat(linebuf, "died"); +#endif /*JP*/ if (t1->deathdnum == astral_level.dnum) { +#if 0 /*JP*/ const char *arg, *fmt = " on the Plane of %s"; +#else + const char *arg; +#endif switch (t1->deathlev) { case -5: +#if 0 /*JP*/ fmt = " on the %s Plane"; arg = "Astral"; break; +#else + arg = "命の精霊界"; break; +#endif case -4: +/*JP arg = "Water"; break; +*/ + arg = "水の精霊界"; break; case -3: +/*JP arg = "Fire"; break; +*/ + arg = "火の精霊界"; break; case -2: +/*JP arg = "Air"; break; +*/ + arg = "風の精霊界"; break; case -1: +/*JP arg = "Earth"; break; +*/ + arg = "地の精霊界"; break; default: arg = "Void"; break; } +/*JP Sprintf(eos(linebuf), fmt, arg); +*/ + Sprintf(where, "%sにて", arg); } else { +/*JP Sprintf(eos(linebuf), " in %s", dungeons[t1->deathdnum].dname); +*/ + Sprintf(eos(linebuf), "%s", jtrns_obj('d', dungeons[t1->deathdnum].dname)); if (t1->deathdnum != knox_level.dnum) +/*JP Sprintf(eos(linebuf), " on level %d", t1->deathlev); +*/ + Sprintf(eos(linebuf), "の地下%d階にて", t1->deathlev); if (t1->deathlev != t1->maxlvl) +/*JP Sprintf(eos(linebuf), " [max %d]", t1->maxlvl); +*/ + Sprintf(eos(where), "[最大地下%d階]", t1->maxlvl); } /* kludge for "quit while already on Charon's boat" */ if (!strncmp(t1->death, "quit ", 5)) Strcat(linebuf, t1->death + 4); } +#if 0 /*JP*/ Strcat(linebuf, "."); +#endif /* Quit, starved, ascended, and escaped contain no second line */ if (second_line) +/*JP Sprintf(eos(linebuf), " %c%s.", highc(*(t1->death)), t1->death+1); +*/ + Sprintf(action, "%s", t1->death); +#if 1 /*JP*/ + Sprintf(eos(linebuf), "%s%s%s.", who, where, action); +#endif lngr = (int)strlen(linebuf); if (t1->hp <= 0) hpbuf[0] = '-', hpbuf[1] = '\0'; else Sprintf(hpbuf, "%d", t1->hp); /* beginning of hp column after padding (not actually padded yet) */ hppos = COLNO - (sizeof(" Hp [max]")-1); /* sizeof(str) includes \0 */ +#if 1 /*JP*/ + while(lngr >= hppos ){ +/* +** hpposより前の適当な位置で分割する. +*/ + car[0] = '\0'; + cdr[0] = '\0'; + split_japanese(linebuf, car, cdr, hppos); + + bp = eos(car); + if (so) { + while (bp < car + (COLNO-1)) *bp++ = ' '; + *bp = 0; + topten_print_bold(car); + } else + topten_print(car); + + Sprintf(linebuf, "%15s %s", "", cdr); + lngr = (int)strlen(linebuf); + } +/* + 日本語が入ると文字列を後から見ていくことはできないため + コメントアウト +*/ +#else while (lngr >= hppos) { for(bp = eos(linebuf); !(*bp == ' ' && (bp-linebuf < hppos)); @@ -670,6 +838,7 @@ Sprintf(linebuf, "%15s %s", "", linebuf3); lngr = strlen(linebuf); } +#endif /*JP*/ /* beginning of hp column not including padding */ hppos = COLNO - 7 - (int)strlen(hpbuf); bp = eos(linebuf); diff -aurbN -xCVS -xXTAGS nethack/src/trap.c jnethack/src/trap.c --- nethack/src/trap.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/trap.c 2005-06-10 16:04:45.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" extern const char * const destroy_strings[]; /* from zap.c */ @@ -36,15 +43,28 @@ STATIC_VAR const char tower_of_flame[]; STATIC_VAR const char *A_gush_of_water_hits; STATIC_VAR const char * const blindgas[6]; +#if 1 /*JP*/ +STATIC_VAR const char *dig_you[2]; +STATIC_VAR const char *web_you[2]; +STATIC_VAR const char * const blindgas[6]; +#endif #else +#if 0 /*JP*/ STATIC_VAR const char * const a_your[2] = { "a", "your" }; STATIC_VAR const char * const A_Your[2] = { "A", "Your" }; STATIC_VAR const char tower_of_flame[] = "tower of flame"; STATIC_VAR const char * const A_gush_of_water_hits = "A gush of water hits"; STATIC_VAR const char * const blindgas[6] = {"humid", "odorless", "pungent", "chilling", "acrid", "biting"}; +#else +const char *set_you[2] = { "", "あなたの仕掛けた" }; +STATIC_VAR const char *dig_you[2] = { "", "あなたが掘った" }; +STATIC_VAR const char *web_you[2] = { "", "あなたが張った" }; +STATIC_VAR const char * const blindgas[6] = + {"むしむしする", "無臭の", "刺激臭のする", "冷たい", "ツンとしたにおいの", "ひりひりする"}; +#endif #endif /* OVLB */ @@ -67,9 +87,15 @@ item = (victim == &youmonst) ? uarmh : which_armor(victim, W_ARMH); if (item) { mat_idx = objects[item->otyp].oc_material; +/*JP Sprintf(buf,"%s helmet", materialnm[mat_idx] ); +*/ + Sprintf(buf,"%sの兜", materialnm[mat_idx] ); } +/*JP if (!burn_dmg(item, item ? buf : "helmet")) continue; +*/ + if (!burn_dmg(item, item ? buf : "兜")) continue; break; case 1: item = (victim == &youmonst) ? uarmc : which_armor(victim, W_ARMC); @@ -85,20 +111,32 @@ #ifdef TOURIST item = (victim == &youmonst) ? uarmu : which_armor(victim, W_ARMU); if (item) +/*JP (void) burn_dmg(item, "shirt"); +*/ + (void) burn_dmg(item, "シャツ"); #endif return TRUE; case 2: item = (victim == &youmonst) ? uarms : which_armor(victim, W_ARMS); +/*JP if (!burn_dmg(item, "wooden shield")) continue; +*/ + if (!burn_dmg(item, "木の盾")) continue; break; case 3: item = (victim == &youmonst) ? uarmg : which_armor(victim, W_ARMG); +/*JP if (!burn_dmg(item, "gloves")) continue; +*/ + if (!burn_dmg(item, "小手")) continue; break; case 4: item = (victim == &youmonst) ? uarmf : which_armor(victim, W_ARMF); +/*JP if (!burn_dmg(item, "boots")) continue; +*/ + if (!burn_dmg(item, "靴")) continue; break; } break; /* Out of while loop */ @@ -120,8 +158,14 @@ boolean print; struct monst *victim; { +/*JP static NEARDATA const char * const action[] = { "smoulder", "rust", "rot", "corrode" }; +*/ + static NEARDATA const char * const action[] = { "くすぶった","錆びた","腐った","腐食した" }; +/*JP static NEARDATA const char * const msg[] = { "burnt", "rusted", "rotten", "corroded" }; +*/ + static NEARDATA const char * const msg[] = { "焦げた", "錆びた", "腐った", "腐食した" }; boolean vulnerable = FALSE; boolean grprot = FALSE; boolean is_primary = TRUE; @@ -151,10 +195,17 @@ if (!vulnerable) { if (flags.verbose) { if (victim == &youmonst) +/*JP Your("%s %s not affected.", ostr, vtense(ostr, "are")); +*/ + Your("%sは影響を受けなかった.",ostr); else if (vismon) +#if 0 /*JP*/ pline("%s's %s %s not affected.", Monnam(victim), ostr, vtense(ostr, "are")); +#else + pline("%sの%sは影響を受けなかった.", Monnam(victim), ostr); +#endif } } else if (erosion < MAX_ERODE) { if (grprot && otmp->greased) { @@ -162,23 +213,46 @@ } else if (otmp->oerodeproof || (otmp->blessed && !rnl(4))) { if (flags.verbose) { if (victim == &youmonst) +#if 0 /*JP*/ pline("Somehow, your %s %s not affected.", ostr, vtense(ostr, "are")); +#else + pline("なぜか,%sは影響を受けなかった.",ostr); +#endif else if (vismon) +#if 0 /*JP*/ pline("Somehow, %s's %s %s not affected.", mon_nam(victim), ostr, vtense(ostr, "are")); +#else + pline("なぜか,%sの%sは影響を受けなかった.", + mon_nam(victim), ostr); +#endif } } else { if (victim == &youmonst) +#if 0 /*JP*/ Your("%s %s%s!", ostr, vtense(ostr, action[type]), erosion+1 == MAX_ERODE ? " completely" : erosion ? " further" : ""); +#else + Your("%sは%s%s!", ostr, + otmp->oeroded+1 == MAX_ERODE ? "完全に" : + otmp->oeroded ? "さらに" : "", + action[type]); +#endif else if (vismon) +#if 0 /*JP*/ pline("%s's %s %s%s!", Monnam(victim), ostr, vtense(ostr, action[type]), erosion+1 == MAX_ERODE ? " completely" : erosion ? " further" : ""); +#else + pline("%sの%sは%s%s!", Monnam(victim), ostr, + otmp->oeroded+1 == MAX_ERODE ? "完全に" : + otmp->oeroded ? "さらに" : "", + action[type]); +#endif if (is_primary) otmp->oeroded++; else @@ -188,13 +262,24 @@ } else { if (flags.verbose) { if (victim == &youmonst) +#if 0 /*JP*/ Your("%s %s completely %s.", ostr, vtense(ostr, Blind ? "feel" : "look"), msg[type]); +#else + Your("%sは完全に%s%s.", ostr, msg[type], + Blind ? "ようだ" : ""); +#endif else if (vismon) +#if 0 /*JP*/ pline("%s's %s %s completely %s.", Monnam(victim), ostr, vtense(ostr, "look"), msg[type]); +#else + pline("%sの%sは完全に%s%s.", + Monnam(victim), ostr, msg[type], + Blind ? "ようだ" : ""); +#endif } } return(TRUE); @@ -206,25 +291,44 @@ register const char *ostr; struct monst *victim; { +/*JP static const char txt[] = "protected by the layer of grease!"; +*/ + static const char txt[] = "油の塗りこみによって守られている!"; boolean vismon = victim && (victim != &youmonst) && canseemon(victim); if (ostr) { if (victim == &youmonst) +/*JP Your("%s %s %s", ostr, vtense(ostr, "are"), txt); +*/ + Your("%sは%s", ostr, txt); else if (vismon) +#if 0 /*JP*/ pline("%s's %s %s %s", Monnam(victim), ostr, vtense(ostr, "are"), txt); +#else + pline("%sの%sは%s", Monnam(victim), ostr, txt); +#endif } else { if (victim == &youmonst) +/*JP Your("%s %s",aobjnam(otmp,"are"), txt); +*/ + Your("%sは%s",xname(otmp),txt); else if (vismon) +/*JP pline("%s's %s %s", Monnam(victim), aobjnam(otmp,"are"), txt); +*/ + pline("%sの%sは%s",Monnam(victim), xname(otmp), txt); } if (!rn2(2)) { otmp->greased = 0; if (carried(otmp)) { +/*JP pline_The("grease dissolves."); +*/ + pline("油ははげてしまった."); update_inventory(); } } @@ -339,11 +443,20 @@ seetrap(t); if (!In_sokoban(&u.uz)) { if (t->ttyp == TRAPDOOR) +/*JP pline("A trap door opens up under you!"); +*/ + pline("落し扉があなたの足元に開いた!"); else +/*JP pline("There's a gaping hole under you!"); +*/ + pline("あなたの足下にぽっかりと穴が開いている!"); } +/*JP } else pline_The("%s opens up under you!", surface(u.ux,u.uy)); +*/ + } else pline("足元の%sに穴が開いた!", surface(u.ux,u.uy)); if (In_sokoban(&u.uz) && Can_fall_thru(&u.uz)) ; /* KMH -- You can't escape the Sokoban level traps */ @@ -352,19 +465,34 @@ || (Inhell && !u.uevent.invoked && newlevel == dunlevs_in_dungeon(&u.uz)) ) { +/*JP dont_fall = "don't fall in."; +*/ + dont_fall = "しかしあなたは落ちなかった."; } else if (youmonst.data->msize >= MZ_HUGE) { +/*JP dont_fall = "don't fit through."; +*/ + dont_fall = "通り抜けるにはサイズが合わない."; } else if (!next_to_u()) { +/*JP dont_fall = "are jerked back by your pet!"; +*/ + dont_fall = "あなたはペットによって引っぱりもどされた!"; } if (dont_fall) { +/*JP You(dont_fall); +*/ + pline(dont_fall); /* hero didn't fall through, but any objects here might */ impact_drop((struct obj *)0, u.ux, u.uy, 0); if (!td) { display_nhwindow(WIN_MESSAGE, FALSE); +/*JP pline_The("opening under you closes up."); +*/ + pline_The("足下に開いていたものは閉じた."); } return; } @@ -377,7 +505,10 @@ dtmp.dlevel = newlevel; } if (!td) +/*JP Sprintf(msgbuf, "The hole in the %s above you closes up.", +*/ + Sprintf(msgbuf, "%sに開いた穴は閉じた.", ceiling(u.ux,u.uy)); schedule_goto(&dtmp, FALSE, TRUE, 0, (char *)0, !td ? msgbuf : (char *)0); @@ -485,24 +616,52 @@ if (mon->m_ap_type) seemimic(mon); else mon->mundetected = FALSE; if ((x == u.ux && y == u.uy) || cause == ANIMATE_SPELL) { +#if 0 /*JP*/ const char *comes_to_life = nonliving(mon->data) ? "moves" : "comes to life"; +#else + const char *comes_to_life = nonliving(mon->data) ? + "動い" : "生命を帯び"; +#endif if (cause == ANIMATE_SPELL) +#if 0 /*JP*/ pline("%s %s!", upstart(statuename), canspotmon(mon) ? comes_to_life : "disappears"); +#else + pline("%sは%sた!", upstart(statuename), + canspotmon(mon) ? comes_to_life : "消え"); +#endif else +#if 0 /*JP*/ pline_The("statue %s!", canspotmon(mon) ? comes_to_life : "disappears"); +#else + pline("彫像は%sた!", + canspotmon(mon) ? comes_to_life : "消え"); +#endif if (historic) { +/*JP You_feel("guilty that the historic statue is now gone."); +*/ + You("歴史的な彫像がなくなってしまったことに罪を感じた."); adjalign(-1); } } else if (cause == ANIMATE_SHATTER) +#if 0 /*JP*/ pline("Instead of shattering, the statue suddenly %s!", canspotmon(mon) ? "comes to life" : "disappears"); +#else + pline("砕けるかわりに,彫像は%sた!", + canspotmon(mon) ? "生命を帯び" : "消え"); +#endif else { /* cause == ANIMATE_NORMAL */ +#if 0 /*JP*/ You("find %s posing as a statue.", canspotmon(mon) ? a_monnam(mon) : something); +#else + You("%sが彫像のふりをしているのを見つけた.", + canspotmon(mon) ? a_monnam(mon) : something); +#endif stop_occupation(); } /* avoid hiding under nothing */ @@ -602,28 +761,46 @@ * reason why the player cannot escape the trap with a dexterity * check, clinging to the ceiling, etc. */ +#if 0 /*JP:T*/ pline("Air currents pull you down into %s %s!", a_your[trap->madeby_u], defsyms[trap_to_defsym(ttype)].explanation); +#else + pline("空気の流れがあなたを%sに引き戻した!", + jtrns_obj('^', defsyms[trap_to_defsym(ttype)].explanation)); +#endif /* then proceed to normal trap effect */ } else if (already_seen) { if ((Levitation || Flying) && (ttype == PIT || ttype == SPIKED_PIT || ttype == HOLE || ttype == BEAR_TRAP)) { +#if 0 /*JP:T*/ You("%s over %s %s.", Levitation ? "float" : "fly", a_your[trap->madeby_u], defsyms[trap_to_defsym(ttype)].explanation); +#else + You("%s%sの上%s.", + set_you[trap->madeby_u], + jtrns_obj('^', defsyms[trap_to_defsym(ttype)].explanation), + Levitation ? "を見下ろした" : "を飛んでいる"); +#endif return; } if(!Fumbling && ttype != MAGIC_PORTAL && ttype != ANTI_MAGIC && !forcebungle && (!rn2(5) || ((ttype == PIT || ttype == SPIKED_PIT) && is_clinger(youmonst.data)))) { +#if 0 /*JP:T*/ You("escape %s %s.", (ttype == ARROW_TRAP && !trap->madeby_u) ? "an" : a_your[trap->madeby_u], defsyms[trap_to_defsym(ttype)].explanation); +#else + You("%s%sをするりと避けた.", + set_you[trap->madeby_u], + jtrns_obj('^', defsyms[trap_to_defsym(ttype)].explanation)); +#endif return; } } @@ -635,14 +812,20 @@ switch(ttype) { case ARROW_TRAP: if (trap->once && trap->tseen && !rn2(15)) { +/*JP You_hear("a loud click!"); +*/ + You_hear("ガチャッという大きな音を聞いた!"); deltrap(trap); newsym(u.ux,u.uy); break; } trap->once = 1; seetrap(trap); +/*JP pline("An arrow shoots out at you!"); +*/ + pline("矢が飛んできた!"); otmp = mksobj(ARROW, TRUE, FALSE); otmp->quan = 1L; otmp->owt = weight(otmp); @@ -651,7 +834,10 @@ if (u.usteed && !rn2(2) && steedintrap(trap, otmp)) /* nothing */; else #endif +/*JP if (thitu(8, dmgval(otmp, &youmonst), otmp, "arrow")) { +*/ + if (thitu(8, dmgval(otmp, &youmonst), otmp, "矢")) { obfree(otmp, (struct obj *)0); } else { place_object(otmp, u.ux, u.uy); @@ -662,14 +848,19 @@ break; case DART_TRAP: if (trap->once && trap->tseen && !rn2(15)) { +/*JP You_hear("a soft click."); +*/ + You_hear("プチッという音を聞いた."); deltrap(trap); newsym(u.ux,u.uy); break; } trap->once = 1; seetrap(trap); +/*JP pline("A little dart shoots out at you!"); +*/ otmp = mksobj(DART, TRUE, FALSE); otmp->quan = 1L; otmp->owt = weight(otmp); @@ -678,9 +869,15 @@ if (u.usteed && !rn2(2) && steedintrap(trap, otmp)) /* nothing */; else #endif +/*JP if (thitu(7, dmgval(otmp, &youmonst), otmp, "little dart")) { +*/ + if (thitu(7, dmgval(otmp, &youmonst), otmp, "投げ矢")) { if (otmp->opoisoned) +/*JP poisoned("dart", A_CON, "little dart", -10); +*/ + poisoned("投げ矢", A_CON, "小さな投げ矢", -10); obfree(otmp, (struct obj *)0); } else { place_object(otmp, u.ux, u.uy); @@ -691,8 +888,13 @@ break; case ROCKTRAP: if (trap->once && trap->tseen && !rn2(15)) { +#if 0 /*JP*/ pline("A trap door in %s opens, but nothing falls out!", the(ceiling(u.ux,u.uy))); +#else + pline("落し扉が%sに開いたが,何も落ちてこなかった!", + ceiling(u.ux,u.uy)); +#endif deltrap(trap); newsym(u.ux,u.uy); } else { @@ -704,17 +906,26 @@ otmp->quan = 1L; otmp->owt = weight(otmp); +/*JP pline("A trap door in %s opens and %s falls on your %s!", +*/ + pline("落し扉が%sに開き,%sがあなたの%sに落ちてきた!", the(ceiling(u.ux,u.uy)), an(xname(otmp)), body_part(HEAD)); if (uarmh) { if(is_metallic(uarmh)) { +/*JP pline("Fortunately, you are wearing a hard helmet."); +*/ + pline("幸運にも,あなたは固い兜を身につけていた."); dmg = 2; } else if (flags.verbose) { +/*JP Your("%s does not protect you.", xname(uarmh)); +*/ + Your("%sでは防げない.", xname(uarmh)); } } @@ -722,7 +933,10 @@ stackobj(otmp); newsym(u.ux,u.uy); /* map the rock */ +/*JP losehp(dmg, "falling rock", KILLED_BY_AN); +*/ + losehp(dmg, "落岩で", KILLED_BY_AN); exercise(A_STR, FALSE); } break; @@ -732,13 +946,22 @@ if (!Blind) { seetrap(trap); if (Hallucination) +/*JP You("notice a crease in the linoleum."); +*/ + You("床の仕上材のしわに気がついた."); else +/*JP You("notice a loose board below you."); +*/ + You("足元の緩んだ板に気がついた."); } } else { seetrap(trap); +/*JP pline("A board beneath you squeaks loudly."); +*/ + pline("足元の板が大きくきしんだ."); wake_nearby(); } break; @@ -748,8 +971,13 @@ seetrap(trap); if(amorphous(youmonst.data) || is_whirly(youmonst.data) || unsolid(youmonst.data)) { +#if 0 /*JP*/ pline("%s bear trap closes harmlessly through you.", A_Your[trap->madeby_u]); +#else + pline("%s熊の罠は噛みついたが,するっと通り抜けた.", + set_you[trap->madeby_u]); +#endif break; } if( @@ -757,24 +985,43 @@ !u.usteed && #endif youmonst.data->msize <= MZ_SMALL) { +#if 0 /*JP*/ pline("%s bear trap closes harmlessly over you.", A_Your[trap->madeby_u]); +#else + pline("%s熊の罠は噛みついたが,遥か上方だった.", + set_you[trap->madeby_u]); +#endif break; } u.utrap = rn1(4, 4); u.utraptype = TT_BEARTRAP; #ifdef STEED if (u.usteed) { +#if 0 /*JP*/ pline("%s bear trap closes on %s %s!", A_Your[trap->madeby_u], s_suffix(mon_nam(u.usteed)), mbodypart(u.usteed, FOOT)); +#else + pline("%s熊の罠は%sの%sに噛みついた!", + set_you[trap->madeby_u], mon_nam(u.usteed), + mbodypart(u.usteed, FOOT)); +#endif } else #endif { +#if 0 /*JP*/ pline("%s bear trap closes on your %s!", A_Your[trap->madeby_u], body_part(FOOT)); +#else + pline("%s熊の罠があなたの%sに噛みついた!", + set_you[trap->madeby_u], body_part(FOOT)); +#endif if(u.umonnum == PM_OWLBEAR || u.umonnum == PM_BUGBEAR) +/*JP You("howl in anger!"); +*/ + You("怒りの咆哮をあげた!"); } exercise(A_DEX, FALSE); break; @@ -782,10 +1029,16 @@ case SLP_GAS_TRAP: seetrap(trap); if(Sleep_resistance || breathless(youmonst.data)) { +/*JP You("are enveloped in a cloud of gas!"); +*/ + You("ガス雲につつまれた!"); break; } +/*JP pline("A cloud of gas puts you to sleep!"); +*/ + pline("あなたはガス雲で眠ってしまった!"); fall_asleep(-rnd(25), TRUE); #ifdef STEED (void) steedintrap(trap, (struct obj *)0); @@ -797,13 +1050,25 @@ if (u.umonnum == PM_IRON_GOLEM) { int dam = u.mhmax; +/*JP pline("%s you!", A_gush_of_water_hits); +*/ + pline("水が噴出してあなたに命中した!"); +/*JP You("are covered with rust!"); +*/ + You("錆に覆われた!"); if (Half_physical_damage) dam = (dam+1) / 2; +/*JP losehp(dam, "rusting away", KILLED_BY); +*/ + losehp(dam, "完全に錆びて" , KILLED_BY); break; } else if (u.umonnum == PM_GREMLIN && rn2(3)) { +/*JP pline("%s you!", A_gush_of_water_hits); +*/ + pline("水が噴出してあなたに命中した!"); (void)split_mon(&youmonst, (struct monst *)0); break; } @@ -815,39 +1080,66 @@ */ switch (rn2(5)) { case 0: +/*JP pline("%s you on the %s!", A_gush_of_water_hits, +*/ + pline("水が噴出してあなたの%sに命中した!", body_part(HEAD)); +/*JP (void) rust_dmg(uarmh, "helmet", 1, TRUE, &youmonst); +*/ + (void) rust_dmg(uarmh, "兜", 1, TRUE, &youmonst); break; case 1: +/*JP pline("%s your left %s!", A_gush_of_water_hits, +*/ + pline("水が噴出してあなたの左%sに命中した!", body_part(ARM)); +/*JP if (rust_dmg(uarms, "shield", 1, TRUE, &youmonst)) +*/ + if (rust_dmg(uarms, "盾", 1, TRUE, &youmonst)) break; if (u.twoweap || (uwep && bimanual(uwep))) erode_obj(u.twoweap ? uswapwep : uwep, FALSE, TRUE); +/*JP glovecheck: (void) rust_dmg(uarmg, "gauntlets", 1, TRUE, &youmonst); +*/ +glovecheck: (void) rust_dmg(uarmg, "小手", 1, TRUE, &youmonst); /* Not "metal gauntlets" since it gets called * even if it's leather for the message */ break; case 2: +/*JP pline("%s your right %s!", A_gush_of_water_hits, +*/ + pline("水が噴出してあなたの右%sに命中した!", body_part(ARM)); erode_obj(uwep, FALSE, TRUE); goto glovecheck; default: +/*JP pline("%s you!", A_gush_of_water_hits); +*/ + pline("水が噴出してあなたに命中した!"); for (otmp=invent; otmp; otmp = otmp->nobj) (void) snuff_lit(otmp); if (uarmc) (void) rust_dmg(uarmc, cloak_simple_name(uarmc), 1, TRUE, &youmonst); else if (uarm) +/*JP (void) rust_dmg(uarm, "armor", 1, TRUE, &youmonst); +*/ + (void) rust_dmg(uarm, "鎧", 1, TRUE, &youmonst); #ifdef TOURIST else if (uarmu) +/*JP (void) rust_dmg(uarmu, "shirt", 1, TRUE, &youmonst); +*/ + (void) rust_dmg(uarmu, "シャツ", 1, TRUE, &youmonst); #endif } update_inventory(); @@ -865,13 +1157,28 @@ seetrap(trap); if (!In_sokoban(&u.uz) && is_clinger(youmonst.data)) { if(trap->tseen) { +#if 0 /*JP:T*/ You("see %s %spit below you.", a_your[trap->madeby_u], ttype == SPIKED_PIT ? "spiked " : ""); +#else + pline("足元に%s%s落し穴を発見した.", + dig_you[trap->madeby_u], + ttype == SPIKED_PIT ? "トゲだらけの" : ""); +#endif } else { +#if 0 /*JP:T*/ pline("%s pit %sopens up under you!", A_Your[trap->madeby_u], ttype == SPIKED_PIT ? "full of spikes " : ""); +#else + pline("%s%s落し穴が足元に開いた!", + dig_you[trap->madeby_u], + ttype == SPIKED_PIT ? "トゲだらけの" : ""); +#endif +/*JP You("don't fall in!"); +*/ + pline("しかし,あなたは落ちなかった!"); } break; } @@ -885,35 +1192,68 @@ u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, (char *)0, SUPPRESS_SADDLE, FALSE)); else +#if 0 /*JP*/ Sprintf(verbbuf,"lead %s", x_monnam(u.usteed, u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, "poor", SUPPRESS_SADDLE, FALSE)); +#else + Sprintf(verbbuf,"と%s", + x_monnam(u.usteed, + u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, + "かわいそうな", SUPPRESS_SADDLE, FALSE)); +#endif } else #endif +/*JP Strcpy(verbbuf,"fall"); +*/ + Strcpy(verbbuf,""); +/*JP You("%s into %s pit!", verbbuf, a_your[trap->madeby_u]); +*/ + pline("あなた%sは%s落し穴に落ちた!", verbbuf, dig_you[trap->madeby_u]); } /* wumpus reference */ if (Role_if(PM_RANGER) && !trap->madeby_u && !trap->once && In_quest(&u.uz) && Is_qlocate(&u.uz)) { +/*JP pline("Fortunately it has a bottom after all..."); +*/ + pline("幸い,結局は底があった..."); trap->once = 1; } else if (u.umonnum == PM_PIT_VIPER || u.umonnum == PM_PIT_FIEND) +/*JP pline("How pitiful. Isn't that the pits?"); +*/ + pline("この落し穴はいい仕事をしている."); if (ttype == SPIKED_PIT) { +/*JP const char *predicament = "on a set of sharp iron spikes"; +*/ + const char *predicament = "鋭い鉄のトゲトゲの上に落ちた"; #ifdef STEED if (u.usteed) { +#if 0 /*JP:T*/ pline("%s lands %s!", upstart(x_monnam(u.usteed, u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, "poor", SUPPRESS_SADDLE, FALSE)), predicament); +#else + pline("%sは%s!", + upstart(x_monnam(u.usteed, + u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, + "かわいそうな", SUPPRESS_SADDLE, FALSE)), + predicament); +#endif } else #endif +/*JP You("land %s!", predicament); +*/ + You("%s!", predicament); } if (!Passes_walls) u.utrap = rn1(6,2); @@ -922,18 +1262,32 @@ if (!steedintrap(trap, (struct obj *)0)) { #endif if (ttype == SPIKED_PIT) { +#if 0 /*JP:T*/ losehp(rnd(10),"fell into a pit of iron spikes", NO_KILLER_PREFIX); +#else + losehp(rnd(10),"トゲだらけの落し穴に落ちて", + KILLED_BY); +#endif if (!rn2(6)) +/*JP poisoned("spikes", A_STR, "fall onto poison spikes", 8); +*/ + poisoned("トゲ", A_STR, "落し穴のトゲ", 8); } else +/*JP losehp(rnd(6),"fell into a pit", NO_KILLER_PREFIX); +*/ + losehp(rnd(6),"落し穴に落ちて", KILLED_BY); if (Punished && !carried(uball)) { unplacebc(); ballfall(); placebc(); } +/*JP selftouch("Falling, you"); +*/ + selftouch("落下中,あなたは"); vision_full_recalc = 1; /* vision limits change */ exercise(A_STR, FALSE); exercise(A_DEX, FALSE); @@ -968,21 +1322,37 @@ if (acidic(youmonst.data) || u.umonnum == PM_GELATINOUS_CUBE || u.umonnum == PM_FIRE_ELEMENTAL) { if (webmsgok) +#if 0 /*JP*/ You("%s %s spider web!", (u.umonnum == PM_FIRE_ELEMENTAL) ? "burn" : "dissolve", a_your[trap->madeby_u]); +#else + You("%sくもの巣を%s!", + web_you[trap->madeby_u], + (u.umonnum == PM_FIRE_ELEMENTAL) ? "焼いた" : "こなごなにした"); +#endif deltrap(trap); newsym(u.ux,u.uy); break; } +#if 0 /*JP:T*/ if (webmsgok) You("flow through %s spider web.", a_your[trap->madeby_u]); +#else + if (webmsgok) You("%sくもの巣をするりと通り抜けた.", + web_you[trap->madeby_u]); +#endif break; } if (webmaker(youmonst.data)) { if (webmsgok) +#if 0 /*JP:T*/ pline(trap->madeby_u ? "You take a walk on your web." : "There is a spider web here."); +#else + pline(trap->madeby_u ? "自分で張ったくもの巣の上を歩いた." + : "ここにはくもの巣がある."); +#endif break; } if (webmsgok) { @@ -990,17 +1360,34 @@ verbbuf[0] = '\0'; #ifdef STEED if (u.usteed) +#if 0 /*JP*/ Sprintf(verbbuf,"lead %s", x_monnam(u.usteed, u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, "poor", SUPPRESS_SADDLE, FALSE)); +#else + Sprintf(verbbuf, "あなたと%s", + x_monnam(u.usteed, + u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, + "かわいそうな", SUPPRESS_SADDLE, FALSE)); +#endif else #endif +#if 0 /*JP*/ Sprintf(verbbuf, "%s", Levitation ? (const char *)"float" : locomotion(youmonst.data, "stumble")); +#else + Sprintf(verbbuf, "%s", Levitation ? (const char *)"浮きながら" : + jpast(locomotion(youmonst.data, "つまずく"))); +#endif +#if 0 /*JP*/ You("%s into %s spider web!", verbbuf, a_your[trap->madeby_u]); +#else + You("%s%sくもの巣にひっかかった!", + verbbuf, web_you[trap->madeby_u]); +#endif } u.utraptype = TT_WEB; @@ -1044,7 +1431,10 @@ else { u.utrap = 0; if (webmsgok) +/*JP You("tear through %s web!", a_your[trap->madeby_u]); +*/ + You("%sくもの巣を切り裂いた!", web_you[trap->madeby_u]); deltrap(trap); newsym(u.ux,u.uy); /* get rid of trap symbol */ } @@ -1060,9 +1450,18 @@ if (!rn2(30)) { deltrap(trap); newsym(u.ux,u.uy); /* update position */ +/*JP You("are caught in a magical explosion!"); +*/ + You("魔法の爆発を浴びた!"); +/*JP losehp(rnd(10), "magical explosion", KILLED_BY_AN); +*/ + losehp(rnd(10), "魔法の爆発を浴びて", KILLED_BY_AN); +/*JP Your("body absorbs some of the magical energy!"); +*/ + Your("体は魔法のエネルギーを少し吸いとった!"); u.uen = (u.uenmax += 2); } else domagictrap(); #ifdef STEED @@ -1074,7 +1473,10 @@ seetrap(trap); if(Antimagic) { shieldeff(u.ux, u.uy); +/*JP You_feel("momentarily lethargic."); +*/ + You("一瞬無気力感を感じた."); } else drain_en(rnd(u.ulevel) + 1); break; @@ -1083,19 +1485,34 @@ seetrap(trap); #ifdef STEED if (u.usteed) +/*JP Sprintf(verbbuf, "lead %s", +*/ + Sprintf(verbbuf, "%sとともに飛び込んだ", x_monnam(u.usteed, u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, (char *)0, SUPPRESS_SADDLE, FALSE)); else #endif +#if 0 /*JP*/ Sprintf(verbbuf,"%s", Levitation ? (const char *)"float" : locomotion(youmonst.data, "step")); +#else + Sprintf(verbbuf,"%s", + jpast(Levitation ? (const char *)"浮きながら飛びこむ" : + locomotion(youmonst.data, "踏み込む"))); +#endif +/*JP You("%s onto a polymorph trap!", verbbuf); +*/ + You("変化の罠に%s!", verbbuf); if(Antimagic || Unchanging) { shieldeff(u.ux, u.uy); +/*JP You_feel("momentarily different."); +*/ + You("一瞬違った感じがした."); /* Trap did nothing; don't remove it --KAA */ } else { #ifdef STEED @@ -1103,7 +1520,10 @@ #endif deltrap(trap); /* delete trap before polymorph */ newsym(u.ux,u.uy); /* get rid of trap symbol */ +/*JP You_feel("a change coming over you."); +*/ + You("変化が訪れたような気がした."); polyself(FALSE); } break; @@ -1116,16 +1536,32 @@ if (Levitation || Flying) { if (!already_seen && rn2(3)) break; seetrap(trap); +#if 0 /*JP*/ pline("%s %s in a pile of soil below you.", already_seen ? "There is" : "You discover", trap->madeby_u ? "the trigger of your mine" : "a trigger"); +#else + if(already_seen) + pline("ここには%s地雷の起爆スイッチがある.", + set_you[trap->madeby_u]); + else + You("足下の土の山に%s地雷の起爆スイッチをみつけた.", + set_you[trap->madeby_u]); +#endif if (already_seen && rn2(3)) break; +#if 0 /*JP*/ pline("KAABLAMM!!! %s %s%s off!", forcebungle ? "Your inept attempt sets" : "The air currents set", already_seen ? a_your[trap->madeby_u] : "", already_seen ? " land mine" : "it"); +#else + pline("ちゅどーん!!%s%s地雷の起爆スイッチが発動した!", + forcebungle ? "不器用なせいで" : + "空気の流れで", + set_you[trap->madeby_u]); +#endif } else { #ifdef STEED /* prevent landmine from killing steed, throwing you to @@ -1137,8 +1573,13 @@ if (recursive_mine) break; #endif seetrap(trap); +#if 0 /*JP*/ pline("KAABLAMM!!! You triggered %s land mine!", a_your[trap->madeby_u]); +#else + pline("ちゅどーん!!%s地雷の起爆スイッチを踏んだ!", + set_you[trap->madeby_u]); +#endif #ifdef STEED if (u.usteed) steed_mid = u.usteed->m_id; recursive_mine = TRUE; @@ -1156,7 +1597,10 @@ (void)keep_saddle_with_steedcorpse(steed_mid, fobj, saddle); #endif newsym(u.ux,u.uy); /* update trap symbol */ +/*JP losehp(rnd(16), "land mine", KILLED_BY_AN); +*/ + losehp(rnd(16), "地雷を踏んで", KILLED_BY_AN); /* fall recursively into the pit... */ if ((trap = t_at(u.ux, u.uy)) != 0) dotrap(trap, RECURSIVETRAP); fill_pit(u.ux, u.uy); @@ -1166,12 +1610,20 @@ int style = ROLL | (trap->tseen ? LAUNCH_KNOWN : 0); seetrap(trap); +#if 0 /*JP*/ pline("Click! You trigger a rolling boulder trap!"); +#else + pline("カチッ!あなたは%sのスイッチを踏んだ!", + jtrns_obj('^', "rolling boulder trap")); +#endif if(!launch_obj(BOULDER, trap->launch.x, trap->launch.y, trap->launch2.x, trap->launch2.y, style)) { deltrap(trap); newsym(u.ux,u.uy); /* get rid of trap symbol */ +/*JP pline("Fortunately for you, no boulder was released."); +*/ + pline("運のよいことに岩は転がってこなかった."); } break; } @@ -1229,7 +1681,10 @@ mtmp->mcanmove = 0; mtmp->mfrozen = rnd(25); if (in_sight) { +/*JP pline("%s suddenly falls asleep!", +*/ + pline("%sはとつぜん眠ってしまった!", Monnam(mtmp)); } } @@ -1256,7 +1711,10 @@ if (!can_saddle(mtmp) || !can_ride(mtmp)) { dismount_steed(DISMOUNT_POLY); } else { +/*JP You("have to adjust yourself in the saddle on %s.", +*/ + You("%sの鞍の上で座りなおした.", x_monnam(mtmp, mtmp->mnamelth ? ARTICLE_NONE : ARTICLE_A, (char *)0, SUPPRESS_SADDLE, FALSE)); @@ -1362,9 +1820,15 @@ switch (style) { case ROLL|LAUNCH_UNSEEN: if (otyp == BOULDER) { +#if 0 /*JP:T*/ You_hear(Hallucination ? "someone bowling." : "rumbling in the distance."); +#else + You_hear(Hallucination ? + "誰かがボーリングをしている音を聞いた." : + "遠くのゴロゴロという音を聞いた."); +#endif } style &= ~LAUNCH_UNSEEN; goto roll; @@ -1401,7 +1865,10 @@ if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != 0) { if (otyp == BOULDER && throws_rocks(mtmp->data)) { if (rn2(3)) { +/*JP pline("%s snatches the boulder.", +*/ + pline("%sは岩をもぎとった.", Monnam(mtmp)); singleobj->otrapped = 0; (void) mpickobj(mtmp, singleobj); @@ -1432,10 +1899,17 @@ switch(t->ttyp) { case LANDMINE: if (rn2(10) > 2) { +#if 0 /*JP*/ pline( "KAABLAMM!!!%s", cansee(bhitpos.x, bhitpos.y) ? " The rolling boulder triggers a land mine." : ""); +#else + pline( + "ちゅどーん!!%s", + cansee(bhitpos.x, bhitpos.y) ? + "転がってきた岩が地雷の起爆スイッチを踏んだ." : ""); +#endif deltrap(t); del_engr_at(bhitpos.x,bhitpos.y); place_object(singleobj, bhitpos.x, bhitpos.y); @@ -1452,9 +1926,15 @@ case LEVEL_TELEP: case TELEP_TRAP: if (cansee(bhitpos.x, bhitpos.y)) +/*JP pline("Suddenly the rolling boulder disappears!"); +*/ + pline("転がってきた岩がとつぜん消えた!"); else +/*JP You_hear("a rumbling stop abruptly."); +*/ + pline("ゴロゴロという音が突然止まった."); singleobj->otrapped = 0; if (t->ttyp == TELEP_TRAP) rloco(singleobj); @@ -1480,27 +1960,42 @@ /* the boulder won't be used up if there is a monster in the trap; stop rolling anyway */ x2 = bhitpos.x, y2 = bhitpos.y; /* stops here */ +/*JP if (flooreffects(singleobj, x2, y2, "fall")) +*/ + if (flooreffects(singleobj, x2, y2, "落ちる")) used_up = TRUE; dist = -1; /* stop rolling immediately */ break; } if (used_up || dist == -1) break; } +/*JP if (flooreffects(singleobj, bhitpos.x, bhitpos.y, "fall")) { +*/ + if (flooreffects(singleobj, bhitpos.x, bhitpos.y, "落ちる")) { used_up = TRUE; break; } if (otyp == BOULDER && (otmp2 = sobj_at(BOULDER, bhitpos.x, bhitpos.y)) != 0) { const char *bmsg = +/*JP " as one boulder sets another in motion"; +*/ + "ひとつの岩が他の岩を動かしたかのような,"; if (!isok(bhitpos.x + dx, bhitpos.y + dy) || !dist || IS_ROCK(levl[bhitpos.x + dx][bhitpos.y + dy].typ)) +/*JP bmsg = " as one boulder hits another"; +*/ + bmsg = "ひとつの岩が他の岩に当たったような"; +/*JP You_hear("a loud crash%s!", +*/ + You_hear("%s大きなゴンという音を聞いた!", cansee(bhitpos.x, bhitpos.y) ? bmsg : ""); obj_extract_self(otmp2); /* pass off the otrapped flag to the next boulder */ @@ -1514,7 +2009,10 @@ } if (otyp == BOULDER && closed_door(bhitpos.x,bhitpos.y)) { if (cansee(bhitpos.x, bhitpos.y)) +/*JP pline_The("boulder crashes through a door."); +*/ + pline("岩は扉を破壊した."); levl[bhitpos.x][bhitpos.y].doormask = D_BROKEN; if (dist) unblock_point(bhitpos.x, bhitpos.y); } @@ -1671,7 +2169,10 @@ if (!rn2(2)) { mtmp->mtrapped = 0; if (canseemon(mtmp)) +/*JP pline("%s pulls free...", Monnam(mtmp)); +*/ + pline("%sは助け上げられた.", Monnam(mtmp)); fill_pit(mtmp->mx, mtmp->my); } } else { @@ -1680,13 +2181,19 @@ } else if (metallivorous(mptr)) { if (trap->ttyp == BEAR_TRAP) { if (canseemon(mtmp)) +/*JP pline("%s eats a bear trap!", Monnam(mtmp)); +*/ + pline("%sは熊の罠を食べた!", Monnam(mtmp)); deltrap(trap); mtmp->meating = 5; mtmp->mtrapped = 0; } else if (trap->ttyp == SPIKED_PIT) { if (canseemon(mtmp)) +/*JP pline("%s munches on some spikes!", Monnam(mtmp)); +*/ + pline("%sはトゲトゲを食べた!", Monnam(mtmp)); trap->ttyp = PIT; mtmp->meating = 5; } @@ -1725,8 +2232,13 @@ case ARROW_TRAP: if (trap->once && trap->tseen && !rn2(15)) { if (in_sight && see_it) +#if 0 /*JP:T*/ pline("%s triggers a trap but nothing happens.", Monnam(mtmp)); +#else + pline("%sがわなを起動させたが何も起こらなかった.", + Monnam(mtmp)); +#endif deltrap(trap); newsym(mtmp->mx, mtmp->my); break; @@ -1742,8 +2254,13 @@ case DART_TRAP: if (trap->once && trap->tseen && !rn2(15)) { if (in_sight && see_it) +#if 0 /*JP:T*/ pline("%s triggers a trap but nothing happens.", Monnam(mtmp)); +#else + pline("%sがわなを起動させたが何も起こらなかった.", + Monnam(mtmp)); +#endif deltrap(trap); newsym(mtmp->mx, mtmp->my); break; @@ -1759,8 +2276,13 @@ case ROCKTRAP: if (trap->once && trap->tseen && !rn2(15)) { if (in_sight && see_it) +#if 0 /*JP:T*/ pline("A trap door above %s opens, but nothing falls out!", mon_nam(mtmp)); +#else + pline("%sの上の扉が開いたが,何も落ちてこなかった!", + mon_nam(mtmp)); +#endif deltrap(trap); newsym(mtmp->mx, mtmp->my); break; @@ -1778,10 +2300,16 @@ if(is_flyer(mptr)) break; /* stepped on a squeaky board */ if (in_sight) { +/*JP pline("A board beneath %s squeaks loudly.", mon_nam(mtmp)); +*/ + pline("%sの足元の板が大きくきしんだ.", mon_nam(mtmp)); seetrap(trap); } else +/*JP You_hear("a distant squeak."); +*/ + You_hear("遠くできしむ音を聞いた."); /* wake up nearby monsters */ wake_nearto(mtmp->mx, mtmp->my, 40); break; @@ -1792,14 +2320,22 @@ !is_whirly(mptr) && !unsolid(mptr)) { mtmp->mtrapped = 1; if(in_sight) { +#if 0 /*JP*/ pline("%s is caught in %s bear trap!", Monnam(mtmp), a_your[trap->madeby_u]); +#else + pline("%sは%s熊の罠につかまった!", + Monnam(mtmp), set_you[trap->madeby_u]); +#endif seetrap(trap); } else { if((mptr == &mons[PM_OWLBEAR] || mptr == &mons[PM_BUGBEAR]) && flags.soundok) +/*JP You_hear("the roaring of an angry bear!"); +*/ + You_hear("怒りの咆哮を聞いた!"); } } break; @@ -1810,7 +2346,10 @@ mtmp->mcanmove = 0; mtmp->mfrozen = rnd(25); if (in_sight) { +/*JP pline("%s suddenly falls asleep!", +*/ + pline("%sは突然眠りに落ちた!", Monnam(mtmp)); seetrap(trap); } @@ -1826,33 +2365,56 @@ switch (rn2(5)) { case 0: if (in_sight) +#if 0 /*JP*/ pline("%s %s on the %s!", A_gush_of_water_hits, mon_nam(mtmp), mbodypart(mtmp, HEAD)); +#else + pline("水が噴出して,%sの%sに命中した!", + mon_nam(mtmp), mbodypart(mtmp, HEAD)); +#endif target = which_armor(mtmp, W_ARMH); +/*JP (void) rust_dmg(target, "helmet", 1, TRUE, mtmp); +*/ + (void) rust_dmg(target, "兜", 1, TRUE, mtmp); break; case 1: if (in_sight) +/*JP pline("%s %s's left %s!", A_gush_of_water_hits, +*/ + pline("水が噴出して,%sの左%sに命中した!", mon_nam(mtmp), mbodypart(mtmp, ARM)); target = which_armor(mtmp, W_ARMS); +/*JP if (rust_dmg(target, "shield", 1, TRUE, mtmp)) +*/ + if (rust_dmg(target, "盾", 1, TRUE, mtmp)) break; target = MON_WEP(mtmp); if (target && bimanual(target)) erode_obj(target, FALSE, TRUE); glovecheck: target = which_armor(mtmp, W_ARMG); +/*JP (void) rust_dmg(target, "gauntlets", 1, TRUE, mtmp); +*/ + (void) rust_dmg(target, "小手", 1, TRUE, mtmp); break; case 2: if (in_sight) +/*JP pline("%s %s's right %s!", A_gush_of_water_hits, +*/ + pline("水が噴出して,%sの右%sに命中した!", mon_nam(mtmp), mbodypart(mtmp, ARM)); erode_obj(MON_WEP(mtmp), FALSE, TRUE); goto glovecheck; default: if (in_sight) +/*JP pline("%s %s!", A_gush_of_water_hits, +*/ + pline("水が噴出して,%sに命中した!", mon_nam(mtmp)); for (otmp=mtmp->minvent; otmp; otmp = otmp->nobj) (void) snuff_lit(otmp); @@ -1863,20 +2425,32 @@ else { target = which_armor(mtmp, W_ARM); if (target) +/*JP (void) rust_dmg(target, "armor", 1, TRUE, mtmp); +*/ + (void) rust_dmg(target, "鎧", 1, TRUE, mtmp); #ifdef TOURIST else { target = which_armor(mtmp, W_ARMU); +/*JP (void) rust_dmg(target, "shirt", 1, TRUE, mtmp); +*/ + (void) rust_dmg(target, "シャツ", 1, TRUE, mtmp); } #endif } } if (mptr == &mons[PM_IRON_GOLEM]) { if (in_sight) +/*JP pline("%s falls to pieces!", Monnam(mtmp)); +*/ + pline("%sはくだけちった!", Monnam(mtmp)); else if(mtmp->mtame) +/*JP pline("May %s rust in peace.", +*/ + pline("%sよ,安らかに錆びん事を.", mon_nam(mtmp)); mondied(mtmp); if (mtmp->mhp <= 0) @@ -1889,17 +2463,30 @@ case FIRE_TRAP: mfiretrap: if (in_sight) +#if 0 /*JP*/ pline("A %s erupts from the %s under %s!", tower_of_flame, surface(mtmp->mx,mtmp->my), mon_nam(mtmp)); +#else + pline("火柱が%sの足元の%sから立ちのぼった!", + mon_nam(mtmp), surface(mtmp->mx,mtmp->my)); +#endif else if (see_it) /* evidently `mtmp' is invisible */ +#if 0 /*JP*/ You("see a %s erupt from the %s!", tower_of_flame, surface(mtmp->mx,mtmp->my)); +#else + You("火柱が%sから生じるのを見た!", + surface(mtmp->mx,mtmp->my)); +#endif if (resists_fire(mtmp)) { if (in_sight) { shieldeff(mtmp->mx,mtmp->my); +/*JP pline("%s is uninjured.", Monnam(mtmp)); +*/ + pline("が,%sは傷つかない.", Monnam(mtmp)); } } else { int num = d(2,4), alt; @@ -1931,7 +2518,10 @@ } if (burn_floor_paper(mtmp->mx, mtmp->my, see_it, FALSE) && !see_it && distu(mtmp->mx, mtmp->my) <= 3*3) +/*JP You("smell smoke."); +*/ + pline("煙の匂いがした."); if (is_ice(mtmp->mx,mtmp->my)) melt_ice(mtmp->mx,mtmp->my); if (see_it) seetrap(trap); @@ -1939,24 +2529,43 @@ case PIT: case SPIKED_PIT: +/*JP fallverb = "falls"; +*/ + fallverb = "落ちる"; if (is_flyer(mptr) || is_floater(mptr) || (mtmp->wormno && count_wsegs(mtmp) > 5) || is_clinger(mptr)) { if (!inescapable) break; /* avoids trap */ +#if 0 /*JP*/ fallverb = "is dragged"; /* sokoban pit */ +#else + fallverb = "ずり落ちる"; /* sokoban pit */ +#endif } if (!passes_walls(mptr)) mtmp->mtrapped = 1; if (in_sight) { +#if 0 /*JP*/ pline("%s %s into %s pit!", Monnam(mtmp), fallverb, a_your[trap->madeby_u]); +#else + pline("%sは%s落し穴に%s!", + Monnam(mtmp), set_you[trap->madeby_u], + jpast(fallverb)); +#endif if (mptr == &mons[PM_PIT_VIPER] || mptr == &mons[PM_PIT_FIEND]) +/*JP pline("How pitiful. Isn't that the pits?"); +*/ + pline("この落し穴はいい仕事をしている."); seetrap(trap); } +/*JP mselftouch(mtmp, "Falling, ", FALSE); +*/ + mselftouch(mtmp, "落下中,", FALSE); if (mtmp->mhp <= 0 || thitm(0, mtmp, (struct obj *)0, rnd((tt == PIT) ? 6 : 10), FALSE)) @@ -1975,7 +2584,10 @@ mptr->msize >= MZ_HUGE) { if (inescapable) { /* sokoban hole */ if (in_sight) { +/*JP pline("%s seems to be yanked down!", +*/ + pline("%sは引き落されたようだ!", Monnam(mtmp)); /* suppress message in mlevel_tele_trap() */ in_sight = FALSE; @@ -2007,19 +2619,33 @@ mptr == &mons[PM_GELATINOUS_CUBE] || mptr == &mons[PM_FIRE_ELEMENTAL]) { if (in_sight) +#if 0 /*JP*/ pline("%s %s %s spider web!", Monnam(mtmp), (mptr == &mons[PM_FIRE_ELEMENTAL]) ? "burns" : "dissolves", a_your[trap->madeby_u]); +#else + pline("%s%sくもの巣を%s!", + Monnam(mtmp), + web_you[trap->madeby_u], + (mptr == &mons[PM_FIRE_ELEMENTAL]) ? + "焼いた" : "こなごなにした"); +#endif deltrap(trap); newsym(mtmp->mx, mtmp->my); break; } if (in_sight) { +#if 0 /*JP*/ pline("%s flows through %s spider web.", Monnam(mtmp), a_your[trap->madeby_u]); +#else + pline("%sは%sくもの巣をするりと通り抜けた.", + Monnam(mtmp), + web_you[trap->madeby_u]); +#endif seetrap(trap); } break; @@ -2029,7 +2655,10 @@ case PM_OWLBEAR: /* Eric Backus */ case PM_BUGBEAR: if (!in_sight) { +/*JP You_hear("the roaring of a confused bear!"); +*/ + You_hear("混乱の咆哮を聞いた!"); mtmp->mtrapped = 1; break; } @@ -2041,9 +2670,15 @@ (mtmp->wormno && count_wsegs(mtmp) > 5)) { tear_web = TRUE; } else if (in_sight) { +#if 0 /*JP*/ pline("%s is caught in %s spider web.", Monnam(mtmp), a_your[trap->madeby_u]); +#else + pline("%sは%sくもの巣につかまった.", + Monnam(mtmp), + web_you[trap->madeby_u]); +#endif seetrap(trap); } mtmp->mtrapped = tear_web ? 0 : 1; @@ -2063,8 +2698,13 @@ } if (tear_web) { if (in_sight) +#if 0 /*JP*/ pline("%s tears through %s spider web!", Monnam(mtmp), a_your[trap->madeby_u]); +#else + pline("%sは%sくもの巣を引き裂いた!", + Monnam(mtmp), web_you[trap->madeby_u]); +#endif deltrap(trap); newsym(mtmp->mx, mtmp->my); } @@ -2086,22 +2726,37 @@ if(is_flyer(mptr)) { boolean already_seen = trap->tseen; if (in_sight && !already_seen) { +/*JP pline("A trigger appears in a pile of soil below %s.", mon_nam(mtmp)); +*/ + pline("%sの足元の土の山に起爆スイッチが現われた.", mon_nam(mtmp)); seetrap(trap); } if (rn2(3)) break; if (in_sight) { newsym(mtmp->mx, mtmp->my); +#if 0 /*JP*/ pline_The("air currents set %s off!", already_seen ? "a land mine" : "it"); +#else + pline("空気の流れでスイッチが入った!"); +#endif } } else if(in_sight) { newsym(mtmp->mx, mtmp->my); +#if 0 /*JP*/ pline("KAABLAMM!!! %s triggers %s land mine!", Monnam(mtmp), a_your[trap->madeby_u]); +#else + pline("ちゅどーん!!%sは%s地雷の起爆スイッチを踏んだ!", + Monnam(mtmp), set_you[trap->madeby_u]); +#endif } if (!in_sight) +/*JP pline("Kaablamm! You hear an explosion in the distance!"); +*/ + pline("ちゅどーん!あなたは遠方の爆発音を聞いた!"); blow_up_landmine(trap); if (thitm(0, mtmp, (struct obj *)0, rnd(16), FALSE)) trapkilled = TRUE; @@ -2114,7 +2769,10 @@ if (mtmp->mhp <= 0) trapkilled = TRUE; if (unconscious()) { multi = -1; +/*JP nomovemsg="The explosion awakens you!"; +*/ + nomovemsg="爆発であなたは起きた!"; } break; @@ -2134,10 +2792,16 @@ newsym(mtmp->mx,mtmp->my); if (in_sight) +#if 0 /*JP*/ pline("Click! %s triggers %s.", Monnam(mtmp), trap->tseen ? "a rolling boulder trap" : something); +#else + pline("カチッ!%sは%sのスイッチを踏んだ!", Monnam(mtmp), + trap->tseen ? + jtrns_obj('^', "rolling boulder trap") : "何か"); +#endif if (launch_obj(BOULDER, trap->launch.x, trap->launch.y, trap->launch2.x, trap->launch2.y, style)) { if (in_sight) trap->tseen = TRUE; @@ -2168,7 +2832,10 @@ if (Stone_resistance) return; if (poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM)) return; +/*JP You("turn to stone..."); +*/ + You("石になった..."); killer_format = KILLED_BY; killer = str; done(STONING); @@ -2190,7 +2857,10 @@ mon_adjust_speed(mon, -3, (struct obj *)0); if (cansee(mon->mx, mon->my)) +/*JP pline("%s turns to stone.", Monnam(mon)); +*/ + pline("%sは石になった.", Monnam(mon)); if (byplayer) { stoned = TRUE; xkilled(mon,0); @@ -2205,17 +2875,31 @@ if(uwep && uwep->otyp == CORPSE && touch_petrifies(&mons[uwep->corpsenm]) && !Stone_resistance) { +#if 0 /*JP*/ pline("%s touch the %s corpse.", arg, mons[uwep->corpsenm].mname); Sprintf(kbuf, "%s corpse", an(mons[uwep->corpsenm].mname)); +#else + pline("%s%sの死体に触った.", arg, + jtrns_mon(mons[uwep->corpsenm].mname)); + Sprintf(kbuf, "%sの死体で", jtrns_mon(mons[uwep->corpsenm].mname)); +#endif instapetrify(kbuf); } /* Or your secondary weapon, if wielded */ if(u.twoweap && uswapwep && uswapwep->otyp == CORPSE && touch_petrifies(&mons[uswapwep->corpsenm]) && !Stone_resistance){ +#if 0 /*JP:T*/ pline("%s touch the %s corpse.", arg, mons[uswapwep->corpsenm].mname); +#else + pline("%s%sの死体に触った.", arg, + jtrns_mon(mons[uswapwep->corpsenm].mname)); +#endif +/*JP Sprintf(kbuf, "%s corpse", an(mons[uswapwep->corpsenm].mname)); +*/ + Sprintf(kbuf, "%sの死体で", jtrns_mon(mons[uswapwep->corpsenm].mname)); instapetrify(kbuf); } } @@ -2230,9 +2914,15 @@ if (mwep && mwep->otyp == CORPSE && touch_petrifies(&mons[mwep->corpsenm])) { if (cansee(mon->mx, mon->my)) { +#if 0 /*JP*/ pline("%s%s touches the %s corpse.", arg ? arg : "", arg ? mon_nam(mon) : Monnam(mon), mons[mwep->corpsenm].mname); +#else + pline("%s%sは%sの死体に触った.", + arg ? arg : "", arg ? mon_nam(mon) : Monnam(mon), + jtrns_mon(mons[mwep->corpsenm].mname)); +#endif } minstapetrify(mon, byplayer); } @@ -2244,41 +2934,73 @@ if(u.utrap) { if(u.utraptype == TT_PIT) { u.utrap = 0; +/*JP You("float up, out of the pit!"); +*/ + You("浮き上がって,落し穴から出た!"); vision_full_recalc = 1; /* vision limits change */ fill_pit(u.ux, u.uy); } else if (u.utraptype == TT_INFLOOR) { +/*JP Your("body pulls upward, but your %s are still stuck.", +*/ + Your("体は引き上げられた.しかし%sはまだはまっている.", makeplural(body_part(LEG))); } else { +/*JP You("float up, only your %s is still stuck.", +*/ + You("浮き出た.%sだけがはまっている.", body_part(LEG)); } } else if(Is_waterlevel(&u.uz)) +/*JP pline("It feels as though you've lost some weight."); +*/ + You("まるで体重が減ったように感じた."); else if(u.uinwater) spoteffects(TRUE); else if(u.uswallow) You(is_animal(u.ustuck->data) ? +#if 0 /*JP*/ "float away from the %s." : "spiral up into %s.", +#else + "%sの中で浮いた." : + "%sの中でぐるぐる回転した.", +#endif is_animal(u.ustuck->data) ? surface(u.ux, u.uy) : mon_nam(u.ustuck)); else if (Hallucination) +/*JP pline("Up, up, and awaaaay! You're walking on air!"); +*/ + pline("上れ,上れ,上れぇぇぇぇ!あなたは空中を歩いている!"); else if(Is_airlevel(&u.uz)) +/*JP You("gain control over your movements."); +*/ + You("うまく歩けるようになった."); else +/*JP You("start to float in the air!"); +*/ + You("空中に浮きはじめた!"); #ifdef STEED if (u.usteed && !is_floater(u.usteed->data) && !is_flyer(u.usteed->data)) { if (Lev_at_will) +/*JP pline("%s magically floats up!", Monnam(u.usteed)); +*/ + pline("%sは魔法の力で浮いた!", Monnam(u.usteed)); else { +/*JP You("cannot stay on %s.", mon_nam(u.usteed)); +*/ + You("%sの上に乗っていられない.", mon_nam(u.usteed)); dismount_steed(DISMOUNT_GENERIC); } } @@ -2297,7 +3019,10 @@ ((t->ttyp == PIT) || (t->ttyp == SPIKED_PIT)) && (otmp = sobj_at(BOULDER, x, y))) { obj_extract_self(otmp); +/*JP (void) flooreffects(otmp, x, y, "settle"); +*/ + (void) flooreffects(otmp, x, y, "はまる"); } } @@ -2313,8 +3038,12 @@ ELevitation &= ~emask; if(Levitation) return(0); /* maybe another ring/potion/boots */ if(u.uswallow) { +#if 0 /*JP*/ You("float down, but you are still %s.", is_animal(u.ustuck->data) ? "swallowed" : "engulfed"); +#else + You("着地したが,まだ飲み込まれたままだ."); +#endif return(1); } @@ -2335,11 +3064,21 @@ if(!Flying) { if (!u.uswallow && u.ustuck) { if (sticks(youmonst.data)) +#if 0 /*JP:T*/ You("aren't able to maintain your hold on %s.", mon_nam(u.ustuck)); +#else + You("%sをつかまえ続けていられなくなった.", + mon_nam(u.ustuck)); +#endif else +#if 0 /*JP:T*/ pline("Startled, %s can no longer hold you!", mon_nam(u.ustuck)); +#else + pline("%sは驚いてあなたを放してしまった!", + mon_nam(u.ustuck)); +#endif u.ustuck = 0; } /* kludge alert: @@ -2361,9 +3100,15 @@ if (!trap) { trap = t_at(u.ux,u.uy); if(Is_airlevel(&u.uz)) +/*JP You("begin to tumble in place."); +*/ + You("その場でひっくり返りはじめた."); else if (Is_waterlevel(&u.uz) && !no_msg) +/*JP You_feel("heavier."); +*/ + You("重くなったような気がした."); /* u.uinwater msgs already in spoteffects()/drown() */ else if (!u.uinwater && !no_msg) { #ifdef STEED @@ -2372,13 +3117,22 @@ { boolean sokoban_trap = (In_sokoban(&u.uz) && trap); if (Hallucination) +#if 0 /*JP*/ pline("Bummer! You've %s.", is_pool(u.ux,u.uy) ? "splashed down" : sokoban_trap ? "crashed" : "hit the ground"); +#else + pline("やめてぇ!あなたは%s.", + is_pool(u.ux,u.uy) ? + "ザブンと落ちた" : "地面にたたきつけられた"); +#endif else { if (!sokoban_trap) +/*JP You("float gently to the %s.", +*/ + You("静かに%sまで辿りついた.", surface(u.ux, u.uy)); else { /* Justification elsewhere for Sokoban traps @@ -2388,12 +3142,21 @@ * air currents once leviation * ceases knocks you off your feet. */ +/*JP You("fall over."); +*/ + You("つまづいた."); +/*JP losehp(rnd(2), "dangerous winds", KILLED_BY); +*/ + losehp(rnd(2), "危険な風で", KILLED_BY); #ifdef STEED if (u.usteed) dismount_steed(DISMOUNT_FELL); #endif +/*JP selftouch("As you fall, you"); +*/ + selftouch("落ちながら,あなたは"); } } } @@ -2438,15 +3201,32 @@ */ if ((box && !carried(box)) ? is_pool(box->ox, box->oy) : Underwater) { +#if 0 /*JP*/ pline("A cascade of steamy bubbles erupts from %s!", the(box ? xname(box) : surface(u.ux,u.uy))); +#else + pline("蒸気の泡が%sからしゅーっと発生した!", + box ? xname(box) : surface(u.ux,u.uy)); +#endif +/*JP if (Fire_resistance) You("are uninjured."); +*/ + if (Fire_resistance) You("傷つかない."); +/*JP else losehp(rnd(3), "boiling water", KILLED_BY); +*/ + else losehp(rnd(3), "沸騰した水で", KILLED_BY); return; } +#if 0 /*JP*/ pline("A %s %s from %s!", tower_of_flame, box ? "bursts" : "erupts", the(box ? xname(box) : surface(u.ux,u.uy))); +#else + pline("火柱が%sから%s!", + box ? xname(box) : surface(u.ux,u.uy), + box ? "吹き出した" : "立ちのぼった"); +#endif if (Fire_resistance) { shieldeff(u.ux, u.uy); num = rn2(2); @@ -2468,9 +3248,15 @@ u.uhpmax -= rn2(min(u.uhpmax,num + 1)), flags.botl = 1; } if (!num) +/*JP You("are uninjured."); +*/ + You("傷つかない."); else +/*JP losehp(num, tower_of_flame, KILLED_BY_AN); +*/ + losehp(num, "火柱で", KILLED_BY_AN); burn_away_slime(); if (burnarmor(&youmonst) || rn2(3)) { @@ -2479,7 +3265,10 @@ destroy_item(POTION_CLASS, AD_FIRE); } if (!box && burn_floor_paper(u.ux, u.uy, see_it, TRUE) && !see_it) +/*JP You("smell paper burning."); +*/ + You("紙のこげる匂いがした."); if (is_ice(u.ux, u.uy)) melt_ice(u.ux, u.uy); } @@ -2496,13 +3285,22 @@ register int cnt = rnd(4); if (!resists_blnd(&youmonst)) { +/*JP You("are momentarily blinded by a flash of light!"); +*/ + You("まばゆい光で一瞬目がくらんだ!"); make_blinded((long)rn1(5,10),FALSE); if (!Blind) Your(vision_clears); } else if (!Blind) { +/*JP You("see a flash of light!"); +*/ + You("まばゆい光を浴びた!"); } else +/*JP You_hear("a deafening roar!"); +*/ + You_hear("耳をつんざくような咆哮を聞いた!"); while(cnt--) (void) makemon((struct permonst *) 0, u.ux, u.uy, NO_MM_FLAGS); } @@ -2518,31 +3316,68 @@ break; /* odd feelings */ +/*JP case 13: pline("A shiver runs up and down your %s!", +*/ + case 13: pline("震えがあなたの%sを走った!", body_part(SPINE)); break; +#if 0 /*JP*/ case 14: You_hear(Hallucination ? "the moon howling at you." : "distant howling."); +#else + case 14: if (Hallucination) + pline("ふにゃ?月が吠えている.") ; + else + You_hear("遠方の遠吠を聞いた."); +#endif break; case 15: if (on_level(&u.uz, &qstart_level)) +#if 0 /*JP*/ You_feel("%slike the prodigal son.", (flags.female || (Upolyd && is_neuter(youmonst.data))) ? "oddly " : ""); +#else +/*JP 訳注 prodigal sonは聖書のルカ伝かららしい.よーわからん */ + You("%s放蕩息子を好きになったような気がした.", + (flags.female || (Upolyd && is_neuter(youmonst.data))) ? + "異常に" : ""); +#endif else +#if 0 /*JP*/ You("suddenly yearn for %s.", Hallucination ? "Cleveland" : (In_quest(&u.uz) || at_dgn_entrance("The Quest")) ? "your nearby homeland" : "your distant homeland"); +#else + You("突然%sが恋しくなった.", + Hallucination ? "青森" : + (In_quest(&u.uz) || at_dgn_entrance("The Quest")) ? + "すぐそこにある故郷" : + "はるかかなたの故郷"); +#endif break; +/*JP case 16: Your("pack shakes violently!"); +*/ + case 16: Your("袋は激しく揺れた!"); break; case 17: You(Hallucination ? +/*JP "smell hamburgers." : +*/ + "ハンバーガーの匂いがした." : +/*JP "smell charred flesh."); +*/ + "黒焦げの肉の匂いがした."); break; +/*JP case 18: You_feel("tired."); +*/ + case 18: You("疲れを感じた."); break; /* very occasionally something nice happens. */ @@ -2622,9 +3457,15 @@ if (!force && (Luck + 5) > rn2(chance)) continue; /* Container is burnt up - dump contents out */ +/*JP if (in_sight) pline("%s catches fire and burns.", Yname2(obj)); +*/ + if (in_sight) pline("%sは火がついて燃えた.", Yname2(obj)); if (Has_contents(obj)) { +/*JP if (in_sight) pline("Its contents fall out."); +*/ + if (in_sight) pline("中身が出てきた."); for (otmp = obj->cobj; otmp; otmp = ncobj) { ncobj = otmp->nobj; obj_extract_self(otmp); @@ -2646,35 +3487,55 @@ if (obj->otyp == SCR_FIRE || obj->otyp == SPE_FIREBALL) continue; if (obj->otyp == SPE_BOOK_OF_THE_DEAD) { +/*JP if (in_sight) pline("Smoke rises from %s.", the(xname(obj))); +*/ + if (in_sight) pline("%sから煙があがった.", the(xname(obj))); continue; } dindx = (obj->oclass == SCROLL_CLASS) ? 2 : 3; if (in_sight) +#if 0 /*JP*/ pline("%s %s.", Yname2(obj), (obj->quan > 1) ? destroy_strings[dindx*3 + 1] : destroy_strings[dindx*3]); +#else + pline("%sは%s.", Yname2(obj), destroy_strings[dindx*3]); +#endif delobj(obj); retval++; } else if (obj->oclass == POTION_CLASS) { dindx = 1; if (in_sight) +#if 0 /*JP*/ pline("%s %s.", Yname2(obj), (obj->quan > 1) ? destroy_strings[dindx*3 + 1] : destroy_strings[dindx*3]); +#else + pline("%sは%s.", Yname2(obj), destroy_strings[dindx*3]); +#endif delobj(obj); retval++; } else if (is_flammable(obj) && obj->oeroded < MAX_ERODE && !(obj->oerodeproof || (obj->blessed && !rnl(4)))) { if (in_sight) { +#if 0 /*JP*/ pline("%s %s%s.", Yname2(obj), otense(obj, "burn"), obj->oeroded+1 == MAX_ERODE ? " completely" : obj->oeroded ? " further" : ""); +#else + pline("%sは%s燃えた.", Yname2(obj), + obj->oeroded+1 == MAX_ERODE ? "完全に" : + obj->oeroded ? "さらに" : ""); +#endif } obj->oeroded++; } } if (retval && !in_sight) +/*JP You("smell smoke."); +*/ + You("煙のにおいがした."); return retval; } @@ -2717,12 +3578,18 @@ } } else if (obj->oclass == SPBOOK_CLASS) { if (obj->otyp == SPE_BOOK_OF_THE_DEAD) +/*JP pline("Steam rises from %s.", the(xname(obj))); +*/ + pline("蒸気が%sから立ちのぼった.", xname(obj)); else obj->otyp = SPE_BLANK_PAPER; } else if (obj->oclass == POTION_CLASS) { if (obj->otyp == POT_ACID) { /* damage player/monster? */ +/*JP pline("A potion explodes!"); +*/ + pline("薬瓶が爆発した!"); delobj(obj); continue; } else if (obj->odiluted) { @@ -2789,7 +3656,10 @@ if (!otmp) { /* Nothing available left to drop; try gold */ if (u.ugold) { +/*JP pline("In desperation, you drop your purse."); +*/ + You("やけくそで財布を落した."); /* Hack: gold is not in the inventory, so make a gold object * and put it at the head of the inventory list. */ @@ -2835,12 +3705,21 @@ } if (!u.uinwater) { +#if 0 /*JP*/ You("%s into the water%c", Is_waterlevel(&u.uz) ? "plunge" : "fall", Amphibious || Swimming ? '.' : '!'); if (!Swimming && !Is_waterlevel(&u.uz)) You("sink like %s.", Hallucination ? "the Titanic" : "a rock"); +#else + You("水の中に%s%s", + Is_waterlevel(&u.uz) ? "飛びこんだ" : "落ちた", + Amphibious ? "." : "!"); + if (!Swimming && !Is_waterlevel(&u.uz)) + You("%sのように沈んだ.", + Hallucination ? "タイタニック号" : "岩"); +#endif } water_damage(invent, FALSE, FALSE); @@ -2848,29 +3727,48 @@ if (u.umonnum == PM_GREMLIN && rn2(3)) (void)split_mon(&youmonst, (struct monst *)0); else if (u.umonnum == PM_IRON_GOLEM) { +/*JP You("rust!"); +*/ + You("錆びた!"); i = d(2,6); if (u.mhmax > i) u.mhmax -= i; +/*JP losehp(i, "rusting away", KILLED_BY); +*/ + losehp(i, "完全に錆びて", KILLED_BY); } if (inpool_ok) return(FALSE); if ((i = number_leashed()) > 0) { +#if 0 /*JP*/ pline_The("leash%s slip%s loose.", (i > 1) ? "es" : "", (i > 1) ? "" : "s"); +#else + pline("紐がゆるんだ."); +#endif unleash_all(); } if (Amphibious || Swimming) { if (Amphibious) { if (flags.verbose) +/*JP pline("But you aren't drowning."); +*/ + pline("しかし,あなたは溺れなかった."); if (!Is_waterlevel(&u.uz)) { if (Hallucination) +/*JP Your("keel hits the bottom."); +*/ + You("底にニードロップを決めた."); else +/*JP You("touch bottom."); +*/ + You("底についた."); } } if (Punished) { @@ -2885,12 +3783,19 @@ } if ((Teleportation || can_teleport(youmonst.data)) && !u.usleep && (Teleport_control || rn2(3) < Luck+2)) { +#if 0 /*JP:T*/ You("attempt a teleport spell."); /* utcsri!carroll */ +#else + You("瞬間移動の呪文を唱えてみた."); +#endif if (!level.flags.noteleport) { (void) dotele(); if(!is_pool(u.ux,u.uy)) return(TRUE); +/*JP } else pline_The("attempted teleport spell fails."); +*/ + } else pline("瞬間移動の呪文は失敗した."); } #ifdef STEED if (u.usteed) { @@ -2904,7 +3809,10 @@ /* if sleeping, wake up now so that we don't crawl out of water while still asleep; we can't do that the same way that waking due to combat is handled; note unmul() clears u.usleep */ +/*JP if (u.usleep) unmul("Suddenly you wake up!"); +*/ + if (u.usleep) unmul("突然あなたは目が覚めた!"); /* can't crawl if unable to move (crawl_ok flag stays false) */ if (multi < 0 || (Upolyd && !youmonst.data->mmove)) goto crawl; /* look around for a place to crawl to */ @@ -2930,32 +3838,58 @@ boolean succ = Is_waterlevel(&u.uz) ? TRUE : emergency_disrobe(&lost); +/*JP You("try to crawl out of the water."); +*/ + You("水からはいあがろうとした."); if (lost) +/*JP You("dump some of your gear to lose weight..."); +*/ + You("体を軽くするためいくつか物を投げすてた..."); if (succ) { +/*JP pline("Pheew! That was close."); +*/ + pline("ハァハァ!よかった."); teleds(x,y,TRUE); return(TRUE); } /* still too much weight */ +/*JP pline("But in vain."); +*/ + pline("が,無駄だった."); } u.uinwater = 1; +/*JP You("drown."); +*/ + You("溺れた."); killer_format = KILLED_BY_AN; killer = (levl[u.ux][u.uy].typ == POOL || Is_medusa_level(&u.uz)) ? +/*JP "pool of water" : "moat"; +*/ + "水たまりで" : "堀で"; done(DROWNING); /* oops, we're still alive. better get out of the water. */ while (!safe_teleds(TRUE)) { +/*JP pline("You're still drowning."); +*/ + You("溺れている."); done(DROWNING); } if (u.uinwater) { u.uinwater = 0; +#if 0 /*JP*/ You("find yourself back %s.", Is_waterlevel(&u.uz) ? "in an air bubble" : "on land"); +#else + You("いつのまにか%sにいるのに気がついた.", Is_waterlevel(&u.uz) ? + "空気の泡の中" : "地面"); +#endif } return(TRUE); } @@ -2965,7 +3899,10 @@ register int n; { if (!u.uenmax) return; +/*JP You_feel("your magical energy drain away!"); +*/ + You("魔法のエネルギーが吸いとられたような気がした!"); u.uen -= n; if(u.uen < 0) { u.uenmax += u.uen; @@ -2979,19 +3916,32 @@ dountrap() /* disarm a trap */ { if (near_capacity() >= HVY_ENCUMBER) { +/*JP pline("You're too strained to do that."); +*/ + pline("罠を解除しようにも物を持ちすぎている."); return 0; } if ((nohands(youmonst.data) && !webmaker(youmonst.data)) || !youmonst.data->mmove) { +/*JP pline("And just how do you expect to do that?"); +*/ + pline("いったい何を期待しているんだい?"); return 0; } else if (u.ustuck && sticks(youmonst.data)) { +/*JP pline("You'll have to let go of %s first.", mon_nam(u.ustuck)); +*/ + pline("%sを手離さないことにはできない.", mon_nam(u.ustuck)); return 0; } if (u.ustuck || (welded(uwep) && bimanual(uwep))) { +#if 0 /*JP*/ Your("%s seem to be too busy for that.", makeplural(body_part(HAND))); +#else + Your("そんなことをする余裕なんてない."); +#endif return 0; } return untrap(FALSE); @@ -3083,13 +4033,19 @@ /* Test for monster first, monsters are displayed instead of trap. */ if (mtmp && (!mtmp->mtrapped || !holdingtrap)) { +/*JP pline("%s is in the way.", Monnam(mtmp)); +*/ + pline("そこには%sがいる.", Monnam(mtmp)); return 0; } /* We might be forced to move onto the trap's location. */ if (sobj_at(BOULDER, ttmp->tx, ttmp->ty) && !Passes_walls && !under_u) { +/*JP There("is a boulder in your way."); +*/ + pline("そこには岩がある."); return 0; } /* duplicate tight-space checks from test_move */ @@ -3099,8 +4055,13 @@ if ((invent && (inv_weight() + weight_cap() > 600)) || bigmonst(youmonst.data)) { /* don't allow untrap if they can't get thru to it */ +#if 0 /*JP*/ You("are unable to reach the %s!", defsyms[trap_to_defsym(ttype)].explanation); +#else + You("%sに届かない!", + jtrns_obj('^', defsyms[trap_to_defsym(ttype)].explanation)); +#endif return 0; } } @@ -3108,19 +4069,30 @@ if (!can_reach_floor()) { #ifdef STEED if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) +/*JP You("aren't skilled enough to reach from %s.", +*/ + You("まだ十分に技量を積んでいないので,%sから届かない.", mon_nam(u.usteed)); else #endif +#if 0 /*JP*/ You("are unable to reach the %s!", defsyms[trap_to_defsym(ttype)].explanation); +#else + You("%sに届かない!", + jtrns_obj('^', defsyms[trap_to_defsym(ttype)].explanation)); +#endif return 0; } /* Will our hero succeed? */ if (force_failure || untrap_prob(ttmp)) { if (rnl(5)) { +/*JP pline("Whoops..."); +*/ + pline("うわっ..."); if (mtmp) { /* must be a trap that holds monsters */ if (ttype == BEAR_TRAP) { if (mtmp->mtame) abuse_dog(mtmp); @@ -3129,7 +4101,10 @@ if (!webmaker(youmonst.data)) { struct trap *ttmp2 = maketrap(u.ux, u.uy, WEB); if (ttmp2) { +/*JP pline_The("webbing sticks to you. You're caught too!"); +*/ + pline_The("くもの巣があなたにからんできた.ますます捕まってしまった!"); dotrap(ttmp2, NOWEBMSG); #ifdef STEED if (u.usteed && u.utrap) { @@ -3139,7 +4114,10 @@ #endif } } else +/*JP pline("%s remains entangled.", Monnam(mtmp)); +*/ + pline("%sはからまったままだ.", Monnam(mtmp)); } } else if (under_u) { dotrap(ttmp, 0); @@ -3147,10 +4125,16 @@ move_into_trap(ttmp); } } else { +#if 0 /*JP*/ pline("%s %s is difficult to %s.", ttmp->madeby_u ? "Your" : under_u ? "This" : "That", defsyms[trap_to_defsym(ttype)].explanation, (ttype == WEB) ? "remove" : "disarm"); +#else + pline("%s%sを解除するのは困難だ.", + ttmp->madeby_u ? "あなたの仕掛けた" : under_u ? "この" : "その", + jtrns_obj('^', defsyms[trap_to_defsym(ttype)].explanation)); +#endif } return 1; } @@ -3169,13 +4153,19 @@ mtmp->data->mlet != S_HUMAN) { mtmp->mpeaceful = 1; set_malign(mtmp); /* reset alignment */ +/*JP pline("%s is grateful.", Monnam(mtmp)); +*/ + pline("%sは喜んでいる.", Monnam(mtmp)); } /* Helping someone out of a trap is a nice thing to do, * A lawful may be rewarded, but not too often. */ if (!rn2(3) && !rnl(8) && u.ualign.type == A_LAWFUL) { adjalign(1); +/*JP You_feel("that you did the right thing."); +*/ + You("正しいことをしたような気がした."); } } } @@ -3195,16 +4185,28 @@ There's no need for a cockatrice test, only the trap is touched */ if ((mtmp = m_at(ttmp->tx,ttmp->ty)) != 0) { mtmp->mtrapped = 0; +#if 0 /*JP*/ You("remove %s %s from %s.", the_your[ttmp->madeby_u], (ttmp->ttyp == BEAR_TRAP) ? "bear trap" : "webbing", mon_nam(mtmp)); +#else + You("%s%sを%sからはずした.", set_you[ttmp->madeby_u], + (ttmp->ttyp == BEAR_TRAP) ? "熊の罠" : "くもの巣", + mon_nam(mtmp)); +#endif reward_untrap(ttmp, mtmp); } else { if (ttmp->ttyp == BEAR_TRAP) { +/*JP You("disarm %s bear trap.", the_your[ttmp->madeby_u]); +*/ + You("%s熊の罠を解除した.", set_you[ttmp->madeby_u]); cnv_trap_obj(BEARTRAP, 1, ttmp); } else /* if (ttmp->ttyp == WEB) */ { +/*JP You("succeed in removing %s web.", the_your[ttmp->madeby_u]); +*/ + You("%sくもの巣を取り除いた.", set_you[ttmp->madeby_u]); deltrap(ttmp); } } @@ -3219,7 +4221,10 @@ int fails = try_disarm(ttmp, FALSE); if (fails < 2) return fails; +/*JP You("disarm %s land mine.", the_your[ttmp->madeby_u]); +*/ + You("%s地雷を解除した.", set_you[ttmp->madeby_u]); cnv_trap_obj(LAND_MINE, 1, ttmp); return 1; } @@ -3253,7 +4258,11 @@ useup(obj); /* oil */ makeknown(POT_OIL); } +#if 0 /*JP*/ You("repair the squeaky board."); /* no madeby_u */ +#else + You("きしむ板を修理した."); /* no madeby_u */ +#endif deltrap(ttmp); newsym(u.ux + u.dx, u.uy + u.dy); more_experienced(1, 5); @@ -3270,7 +4279,10 @@ int fails = try_disarm(ttmp, FALSE); if (fails < 2) return fails; +/*JP You("disarm %s trap.", the_your[ttmp->madeby_u]); +*/ + pline("%s罠を解除した.", set_you[ttmp->madeby_u]); cnv_trap_obj(otyp, 50-rnl(50), ttmp); return 1; } @@ -3287,14 +4299,22 @@ int wc = weight_cap(); if (((wt * 2) / wc) >= HVY_ENCUMBER) { +#if 0 /*JP*/ pline("%s is %s for you to lift.", Monnam(mtmp), stuff ? "carrying too much" : "too heavy"); +#else + pline("%sは%s持ちあげることができない.", Monnam(mtmp), + stuff ? "物を持ちすぎており" : "重すぎて"); +#endif if (!ttmp->madeby_u && !mtmp->mpeaceful && mtmp->mcanmove && !mindless(mtmp->data) && mtmp->data->mlet != S_HUMAN && rnl(10) < 3) { mtmp->mpeaceful = 1; set_malign(mtmp); /* reset alignment */ +/*JP pline("%s thinks it was nice of you to try.", Monnam(mtmp)); +*/ + pline("%sはあなたの努力に感謝しているようだ.", Monnam(mtmp)); } return 0; } @@ -3321,7 +4341,10 @@ * Test the monster first - monsters are displayed before traps. */ if (!mtmp->mtrapped) { +/*JP pline("%s isn't trapped.", Monnam(mtmp)); +*/ + pline("%sは罠にかかっていない.", Monnam(mtmp)); return 0; } /* Do you have the necessary capacity to lift anything? */ @@ -3329,7 +4352,10 @@ /* Will our hero succeed? */ if ((uprob = untrap_prob(ttmp)) && !mtmp->msleeping && mtmp->mcanmove) { +/*JP You("try to reach out your %s, but %s backs away skeptically.", +*/ + You("%sを差し延べようとしたが%sは警戒している.", makeplural(body_part(ARM)), mon_nam(mtmp)); return 1; @@ -3338,42 +4364,71 @@ /* is it a cockatrice?... */ if (touch_petrifies(mtmp->data) && !uarmg && !Stone_resistance) { +#if 0 /*JP*/ You("grab the trapped %s using your bare %s.", mtmp->data->mname, makeplural(body_part(HAND))); +#else + You("罠にかかっている%sを素%sで掴んだ.", + jtrns_mon_gen(mtmp->data->mname, mtmp->female), body_part(HAND)); +#endif if (poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM)) display_nhwindow(WIN_MESSAGE, FALSE); else { char kbuf[BUFSZ]; +#if 0 /*JP*/ Sprintf(kbuf, "trying to help %s out of a pit", an(mtmp->data->mname)); +#else + Sprintf(kbuf, "罠にかかっている%sを助けようとして", + a_monnam(mtmp)); +#endif instapetrify(kbuf); return 1; } } /* need to do cockatrice check first if sleeping or paralyzed */ if (uprob) { +#if 0 /*JP*/ You("try to grab %s, but cannot get a firm grasp.", mon_nam(mtmp)); +#else + You("%sをつかもうとしたが,しっかりと握れなかった.", + mon_nam(mtmp)); +#endif if (mtmp->msleeping) { mtmp->msleeping = 0; +/*JP pline("%s awakens.", Monnam(mtmp)); +*/ + pline("%sは目を覚ました.", Monnam(mtmp)); } return 1; } +#if 0 /*JP*/ You("reach out your %s and grab %s.", makeplural(body_part(ARM)), mon_nam(mtmp)); +#else + You("%sを伸ばして%sをつかんだ.", + body_part(ARM), mon_nam(mtmp)); +#endif if (mtmp->msleeping) { mtmp->msleeping = 0; +/*JP pline("%s awakens.", Monnam(mtmp)); +*/ + pline("%sは目を覚ました.", Monnam(mtmp)); } else if (mtmp->mfrozen && !rn2(mtmp->mfrozen)) { /* After such manhandling, perhaps the effect wears off */ mtmp->mcanmove = 1; mtmp->mfrozen = 0; +/*JP pline("%s stirs.", Monnam(mtmp)); +*/ + pline("%sは動き始めた.", Monnam(mtmp)); } /* is the monster too heavy? */ @@ -3385,7 +4440,10 @@ wt += otmp->owt; if (!try_lift(mtmp, ttmp, wt, TRUE)) return 1; +/*JP You("pull %s out of the pit.", mon_nam(mtmp)); +*/ + You("%sを落し穴からひっぱった.", mon_nam(mtmp)); mtmp->mtrapped = 0; fill_pit(mtmp->mx, mtmp->my); reward_untrap(ttmp, mtmp); @@ -3422,20 +4480,36 @@ if ((ttmp = t_at(x,y)) && ttmp->tseen) { deal_with_floor_trap = TRUE; +/*JP Strcpy(the_trap, the(defsyms[trap_to_defsym(ttmp->ttyp)].explanation)); +*/ + Strcpy(the_trap, jtrns_obj('^', defsyms[trap_to_defsym(ttmp->ttyp)].explanation)); if (box_here) { if (ttmp->ttyp == PIT || ttmp->ttyp == SPIKED_PIT) { +#if 0 /*JP*/ You_cant("do much about %s%s.", the_trap, u.utrap ? " that you're stuck in" : " while standing on the edge of it"); +#else + pline("%s%sに対してはたいしたことはできない.", + u.utrap ? + "自分がはまっている" : + "すぐそばの", the_trap); +#endif trap_skipped = TRUE; deal_with_floor_trap = FALSE; } else { +#if 0 /*JP*/ Sprintf(qbuf, "There %s and %s here. %s %s?", (containercnt == 1) ? "is a container" : "are containers", an(defsyms[trap_to_defsym(ttmp->ttyp)].explanation), ttmp->ttyp == WEB ? "Remove" : "Disarm", the_trap); +#else + Sprintf(qbuf, "箱と%sがある.%s?", + jtrns_obj('^', an(defsyms[trap_to_defsym(ttmp->ttyp)].explanation)), + ttmp->ttyp == WEB ? "取り除く" : "解除する"); +#endif switch (ynq(qbuf)) { case 'q': return(0); case 'n': trap_skipped = TRUE; @@ -3446,8 +4520,12 @@ } if (deal_with_floor_trap) { if (u.utrap) { +#if 0 /*JP*/ You("cannot deal with %s while trapped%s!", the_trap, (x == u.ux && y == u.uy) ? " in it" : ""); +#else + pline("罠にかかっている間は罠を解除できない!"); +#endif return 1; } switch(ttmp->ttyp) { @@ -3465,16 +4543,25 @@ case PIT: case SPIKED_PIT: if (!u.dx && !u.dy) { +/*JP You("are already on the edge of the pit."); +*/ + You("もう落し穴の端にいる."); return 0; } if (!(mtmp = m_at(x,y))) { +/*JP pline("Try filling the pit instead."); +*/ + pline("なんとか埋めることを考えてみたら?"); return 0; } return help_monster_out(mtmp, ttmp); default: +/*JP You("cannot disable %s trap.", (u.dx || u.dy) ? "that" : "this"); +*/ + pline("%s罠は解除できない.", (u.dx || u.dy) ? "その" : "この"); return 0; } } @@ -3483,16 +4570,25 @@ if(!u.dx && !u.dy) { for(otmp = level.objects[x][y]; otmp; otmp = otmp->nexthere) if(Is_box(otmp)) { +#if 0 /*JP*/ Sprintf(qbuf, "There is %s here. Check it for traps?", safe_qbuf("", sizeof("There is here. Check it for traps?"), doname(otmp), an(simple_typename(otmp->otyp)), "a box")); +#else + Sprintf(qbuf, "%sがある.わなを調べますか?", + safe_qbuf("", sizeof("がある.わなを調べますか?"), + doname(otmp), an(simple_typename(otmp->otyp)), "箱")); +#endif switch (ynq(qbuf)) { case 'q': return(0); case 'n': continue; } #ifdef STEED if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) { +/*JP You("aren't skilled enough to reach from %s.", +*/ + You("まだ十分に技量を積んでいないので,%sから届かない.", mon_nam(u.usteed)); return(0); } @@ -3500,10 +4596,16 @@ if((otmp->otrapped && (force || (!confused && rn2(MAXULEV + 1 - u.ulevel) < 10))) || (!force && confused && !rn2(3))) { +/*JP You("find a trap on %s!", the(xname(otmp))); +*/ + pline("%sに罠を発見した!", the(xname(otmp))); if (!confused) exercise(A_WIS, TRUE); +/*JP switch (ynq("Disarm it?")) { +*/ + switch (ynq("解除しますか?")) { case 'q': return(1); case 'n': trap_skipped = TRUE; continue; } @@ -3516,19 +4618,33 @@ rnd(75+level_difficulty()/2) > ch)) { (void) chest_trap(otmp, FINGER, TRUE); } else { +/*JP You("disarm it!"); +*/ + You("解除した!"); otmp->otrapped = 0; } +/*JP } else pline("That %s was not trapped.", xname(otmp)); +*/ + } else pline("その%sに罠はない.", xname(otmp)); return(1); } else { +/*JP You("find no traps on %s.", the(xname(otmp))); +*/ + pline("罠を発見できなかった."); return(1); } } +#if 0 /*JP*/ You(trap_skipped ? "find no other traps here." : "know of no traps here."); +#else + You(trap_skipped ? "他の罠を見つけられなかった." + : "ここに罠がないことを知っている."); +#endif return(0); } @@ -3544,21 +4660,36 @@ if (!IS_DOOR(levl[x][y].typ)) { if ((ttmp = t_at(x,y)) && ttmp->tseen) +/*JP You("cannot disable that trap."); +*/ + You("罠を解除できなかった."); else +/*JP You("know of no traps there."); +*/ + You("そこに罠がないことを知っている."); return(0); } switch (levl[x][y].doormask) { case D_NODOOR: +/*JP You("%s no door there.", Blind ? "feel" : "see"); +*/ + pline("そこには扉がない%s.", Blind ? "ようだ" : "ように見える"); return(0); case D_ISOPEN: +/*JP pline("This door is safely open."); +*/ + pline("その扉は安全に開いている."); return(0); case D_BROKEN: +/*JP pline("This door is broken."); +*/ + pline("その扉は壊れている."); return(0); } @@ -3566,29 +4697,50 @@ && (force || (!confused && rn2(MAXULEV - u.ulevel + 11) < 10))) || (!force && confused && !rn2(3))) { +/*JP You("find a trap on the door!"); +*/ + pline("扉に罠を発見した!"); exercise(A_WIS, TRUE); +/*JP if (ynq("Disarm it?") != 'y') return(1); +*/ + if (ynq("解除しますか?") != 'y') return(1); if (levl[x][y].doormask & D_TRAPPED) { ch = 15 + (Role_if(PM_ROGUE) ? u.ulevel*3 : u.ulevel); exercise(A_DEX, TRUE); if(!force && (confused || Fumbling || rnd(75+level_difficulty()/2) > ch)) { +/*JP You("set it off!"); +*/ + You("スイッチを入れてしまった!"); +/*JP b_trapped("door", FINGER); +*/ + b_trapped("扉", FINGER); levl[x][y].doormask = D_NODOOR; unblock_point(x, y); newsym(x, y); /* (probably ought to charge for this damage...) */ if (*in_rooms(x, y, SHOPBASE)) add_damage(x, y, 0L); } else { +/*JP You("disarm it!"); +*/ + You("解除した!"); levl[x][y].doormask &= ~D_TRAPPED; } +/*JP } else pline("This door was not trapped."); +*/ + } else pline("扉に罠はなかった."); return(1); } else { +/*JP You("find no traps on the door."); +*/ + pline("扉に罠を発見できなかった."); return(1); } } @@ -3612,28 +4764,49 @@ otmp->otrapped = 0; /* trap is one-shot; clear flag first in case chest kills you and ends up in bones file */ +/*JP You(disarm ? "set it off!" : "trigger a trap!"); +*/ + You(disarm ? "スイッチを入れてしまった!" : "罠にひっかかった!"); display_nhwindow(WIN_MESSAGE, FALSE); if (Luck > -13 && rn2(13+Luck) > 7) { /* saved by luck */ /* trap went off, but good luck prevents damage */ switch (rn2(13)) { case 12: +/*JP case 11: msg = "explosive charge is a dud"; break; +*/ + case 11: msg = "爆発は不発だった"; break; case 10: +/*JP case 9: msg = "electric charge is grounded"; break; +*/ + case 9: msg = "電撃が放出されたがアースされていた"; break; case 8: +/*JP case 7: msg = "flame fizzles out"; break; +*/ + case 7: msg = "炎はシューっと消えた"; break; case 6: case 5: +/*JP case 4: msg = "poisoned needle misses"; break; +*/ + case 4: msg = "毒針は刺さらなかった"; break; case 3: case 2: case 1: +/*JP case 0: msg = "gas cloud blows away"; break; +*/ + case 0: msg = "ガス雲は吹き飛んだ"; break; default: impossible("chest disarm bug"); msg = (char *)0; break; } +/*JP if (msg) pline("But luckily the %s!", msg); +*/ + if (msg) pline("が運のよいことに%s!", msg); } else { switch(rn2(20) ? ((Luck >= 13) ? 0 : rn2(13-Luck)) : rn2(26)) { case 25: @@ -3653,8 +4826,14 @@ insider = (*u.ushops && inside_shop(u.ux, u.uy) && *in_rooms(ox, oy, SHOPBASE) == *u.ushops); +/*JP pline("%s!", Tobjnam(obj, "explode")); +*/ + pline("%sは爆発した!", xname(obj)); +/*JP Sprintf(buf, "exploding %s", xname(obj)); +*/ + Sprintf(buf, "%sの爆発で", xname(obj)); if(costly) loss += stolen_value(obj, ox, oy, @@ -3686,10 +4865,18 @@ exercise(A_STR, FALSE); if(costly && loss) { if(insider) +#if 0 /*JP*/ You("owe %ld %s for objects destroyed.", +#else + You("器物破損で%ld%sの借りをつくった.", +#endif loss, currency(loss)); else { +#if 0 /*JP*/ You("caused %ld %s worth of damage!", +#else + You("%ld%s分の損害を引きおこした!", +#endif loss, currency(loss)); make_angry_shk(shkp, ox, oy); } @@ -3700,17 +4887,29 @@ case 19: case 18: case 17: +/*JP pline("A cloud of noxious gas billows from %s.", +*/ + pline("有毒ガスが%sから渦まいた.", the(xname(obj))); +/*JP poisoned("gas cloud", A_STR, "cloud of poison gas",15); +*/ + poisoned("ガス雲", A_STR, "ガス雲",15); exercise(A_CON, FALSE); break; case 16: case 15: case 14: case 13: +/*JP You_feel("a needle prick your %s.",body_part(bodypart)); +*/ + You("%sチクッという痛みを感じた.", body_part(bodypart)); +/*JP poisoned("needle", A_CON, "poisoned needle",10); +*/ + poisoned("針", A_CON, "毒針",10); exercise(A_CON, FALSE); break; case 12: @@ -3724,43 +4923,75 @@ case 6: { int dmg; +/*JP You("are jolted by a surge of electricity!"); +*/ + You("電気ショックをくらった!"); if(Shock_resistance) { shieldeff(u.ux, u.uy); +/*JP You("don't seem to be affected."); +*/ + pline("しかしあなたは影響を受けない."); dmg = 0; } else dmg = d(4, 4); destroy_item(RING_CLASS, AD_ELEC); destroy_item(WAND_CLASS, AD_ELEC); +/*JP if (dmg) losehp(dmg, "electric shock", KILLED_BY_AN); +*/ + if (dmg) losehp(dmg, "電気ショックで", KILLED_BY_AN); break; } case 5: case 4: case 3: if (!Free_action) { +/*JP pline("Suddenly you are frozen in place!"); +*/ + pline("突然その場で動けなくなった!"); nomul(-d(5, 6)); exercise(A_DEX, FALSE); nomovemsg = You_can_move_again; +/*JP } else You("momentarily stiffen."); +*/ + } else You("一瞬硬直した."); break; case 2: case 1: case 0: +#if 0 /*JP:T*/ pline("A cloud of %s gas billows from %s.", Blind ? blindgas[rn2(SIZE(blindgas))] : rndcolor(), the(xname(obj))); +#else + pline("%sガス雲が%sの底で渦まいた.", + Blind ? blindgas[rn2(SIZE(blindgas))] : + jconj_adj(rndcolor()), the(xname(obj))); +#endif if(!Stunned) { if (Hallucination) +/*JP pline("What a groovy feeling!"); +*/ + pline("なんて素敵なんだ!"); else if (Blind) +#if 0 /*JP:T*/ You("%s and get dizzy...", stagger(youmonst.data, "stagger")); +#else + You("くらくらし,めまいがした..."); +#endif else +#if 0 /*JP:T*/ You("%s and your vision blurs...", stagger(youmonst.data, "stagger")); +#else + You("くらくらし,景色がぼやけてきた..."); +#endif } make_stunned(HStun + rn1(7, 16),FALSE); (void) make_hallucinated(HHallucination + rn1(5, 16),FALSE,0L); @@ -3849,9 +5080,15 @@ register int lvl = level_difficulty(); int dmg = rnd(5 + (lvl < 5 ? lvl : 2+lvl/2)); +/*JP pline("KABOOM!! %s was booby-trapped!", The(item)); +*/ + pline("ちゅどーん!!%sにブービートラップが仕掛けられていた!", The(item)); wake_nearby(); +/*JP losehp(dmg, "explosion", KILLED_BY_AN); +*/ + losehp(dmg, "ブービートラップの爆発で", KILLED_BY_AN); exercise(A_STR, FALSE); if (bodypart) exercise(A_CON, FALSE); make_stunned(HStun + dmg, TRUE); @@ -3879,12 +5116,20 @@ */ if(!strike) { if (obj && cansee(mon->mx, mon->my)) +#if 0 /*JP*/ pline("%s is almost hit by %s!", Monnam(mon), doname(obj)); +#else + pline("もう少しで%sが%sに命中するところだった!", doname(obj), + Monnam(mon)); +#endif } else { int dam = 1; if (obj && cansee(mon->mx, mon->my)) +/*JP pline("%s is hit by %s!", Monnam(mon), doname(obj)); +*/ + pline("%sが%sに命中した!", doname(obj), Monnam(mon)); if (d_override) dam = d_override; else if (obj) { dam = dmgval(obj, mon); @@ -3912,13 +5157,26 @@ boolean unconscious() { +/* +** もう,かんべんしてよー.こんなコーディング...sigh... +** +** You regain con -- eat.c(2), potion.c(1) +** You are consci -- eat.c(2) +*/ return((boolean)(multi < 0 && (!nomovemsg || u.usleep || +#if 1 /*JP*/ + !strncmp(nomovemsg,"あなたは正気づいた", 18) || + !strncmp(nomovemsg,"あなたはまた正気づ", 18) || +#endif !strncmp(nomovemsg,"You regain con", 14) || !strncmp(nomovemsg,"You are consci", 14)))); } +/*JP static const char lava_killer[] = "molten lava"; +*/ +static const char lava_killer[] = "どろどろの溶岩で"; boolean lava_effects() @@ -3933,13 +5191,19 @@ if (!Fire_resistance) { if(Wwalking) { dmg = d(6,6); +/*JP pline_The("lava here burns you!"); +*/ + pline("溶岩があなたを焼きつくした!"); if(dmg < u.uhp) { losehp(dmg, lava_killer, KILLED_BY); goto burn_stuff; } } else +/*JP You("fall into the lava!"); +*/ + You("溶岩に落ちた!"); usurvive = Lifesaved || discover; #ifdef WIZARD @@ -3950,7 +5214,10 @@ if(is_organic(obj) && !obj->oerodeproof) { if(obj->owornmask) { if (usurvive) +/*JP Your("%s into flame!", aobjnam(obj, "burst")); +*/ + Your("%sは燃えた!", xname(obj)); if(obj == uarm) (void) Armor_gone(); else if(obj == uarmc) (void) Cloak_off(); @@ -3977,20 +5244,32 @@ u.uhp = -1; killer_format = KILLED_BY; killer = lava_killer; +/*JP You("burn to a crisp..."); +*/ + You("燃えてパリパリになった..."); done(BURNING); while (!safe_teleds(TRUE)) { +/*JP pline("You're still burning."); +*/ + You("まだ燃えている."); done(BURNING); } +/*JP You("find yourself back on solid %s.", surface(u.ux, u.uy)); +*/ + You("いつのまにか固い%sに戻っていた.", surface(u.ux, u.uy)); return(TRUE); } if (!Wwalking) { u.utrap = rn1(4, 4) + (rn1(4, 12) << 8); u.utraptype = TT_LAVA; +/*JP You("sink into the lava, but it only burns slightly!"); +*/ + You("溶岩に沈んだが,ちょっと焦げただけだ!"); if (u.uhp > 1) losehp(1, lava_killer, KILLED_BY); } @@ -4000,7 +5279,10 @@ if(uarmf && !uarmf->oerodeproof && is_organic(uarmf)) { /* save uarmf value because Boots_off() sets uarmf to null */ obj = uarmf; +/*JP Your("%s bursts into flame!", xname(obj)); +*/ + Your("%sは燃えた!", xname(obj)); (void) Boots_off(); useup(obj); } diff -aurbN -xCVS -xXTAGS nethack/src/uhitm.c jnethack/src/uhitm.c --- nethack/src/uhitm.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/uhitm.c 2005-06-08 02:05:55.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" STATIC_DCL boolean FDECL(known_hitum, (struct monst *,int *,struct attack *)); @@ -132,7 +139,10 @@ !glyph_is_warning(glyph_at(u.ux+u.dx,u.uy+u.dy)) && !glyph_is_invisible(levl[u.ux+u.dx][u.uy+u.dy].glyph) && !(!Blind && mtmp->mundetected && hides_under(mtmp->data))) { +/*JP pline("Wait! There's %s there you can't see!", +*/ + pline("ちょっと待った!姿の見えない%sがいる!", something); map_invisible(u.ux+u.dx, u.uy+u.dy); /* if it was an invisible mimic, treat it as if we stumbled @@ -174,10 +184,18 @@ struct obj *obj; if (Blind || (is_pool(mtmp->mx,mtmp->my) && !Underwater)) +/*JP pline("Wait! There's a hidden monster there!"); +*/ + pline("待て!怪物が隠れている!"); else if ((obj = level.objects[mtmp->mx][mtmp->my]) != 0) +#if 0 /*JP*/ pline("Wait! There's %s hiding under %s!", an(l_monnam(mtmp)), doname(obj)); +#else + pline("待て!%sの下に%sが隠れている!", + doname(obj), l_monnam(mtmp)); +#endif return TRUE; } } @@ -199,7 +217,10 @@ return(FALSE); } if (canspotmon(mtmp)) { +/*JP Sprintf(qbuf, "Really attack %s?", mon_nam(mtmp)); +*/ + Sprintf(qbuf, "本当に%sを攻撃するの?", mon_nam(mtmp)); if (yn(qbuf) != 'y') { flags.move = 0; return(TRUE); @@ -221,7 +242,10 @@ (!mtmp->mcanmove || mtmp->msleeping || (mtmp->mflee && !mtmp->mavenge)) && u.ualign.record > -10) { +/*JP You("caitiff!"); +*/ + pline("やっていることがまるで蛮族だ!"); adjalign(-1); } } @@ -241,7 +265,10 @@ /* attacking peaceful creatures is bad for the samurai's giri */ if (Role_if(PM_SAMURAI) && mtmp->mpeaceful && u.ualign.record > -10) { +/*JP You("dishonorably attack the innocent!"); +*/ + pline("無実の者を攻撃するのは不名誉だ!"); adjalign(-1); } @@ -266,7 +293,10 @@ tmp++; if(Role_if(PM_MONK) && !Upolyd) { if (uarm) { +/*JP Your("armor is rather cumbersome..."); +*/ + pline("鎧が邪魔だ..."); tmp -= urole.spelarmr; } else if (!uwep && !uarms) { tmp += (u.ulevel / 3) + 2; @@ -333,11 +363,17 @@ monflee(mtmp, rnd(6), FALSE, FALSE); Strcpy(buf, y_monnam(mtmp)); buf[0] = highc(buf[0]); +/*JP You("stop. %s is in the way!", buf); +*/ + You("止まった.%sが道にいる!", buf); return(TRUE); } else if ((mtmp->mfrozen || (! mtmp->mcanmove) || (mtmp->data->mmove == 0)) && rn2(6)) { +/*JP pline("%s doesn't seem to move!", Monnam(mtmp)); +*/ + pline("%sは動けないようだ.", Monnam(mtmp)); return(TRUE); } else return(FALSE); } @@ -351,13 +387,19 @@ if (Upolyd) { /* certain "pacifist" monsters don't attack */ if(noattacks(youmonst.data)) { +/*JP You("have no way to attack monsters physically."); +*/ + You("物理的に怪物を攻撃するすべがない."); mtmp->mstrategy &= ~STRAT_WAITMASK; goto atk_done; } } +/*JP if(check_capacity("You cannot fight while so heavily loaded.")) +*/ + if(check_capacity("あなたは物をたくさん持ちすぎて戦えない.")) goto atk_done; if (u.twoweap && !can_twoweapon()) @@ -367,13 +409,22 @@ unweapon = FALSE; if(flags.verbose) { if(uwep) +/*JP You("begin bashing monsters with your %s.", +*/ + You("%sで怪物をなぐりつけた.", aobjnam(uwep, (char *)0)); else if (!cantwield(youmonst.data)) +#if 0 /*JP*/ You("begin %sing monsters with your %s %s.", Role_if(PM_MONK) ? "strik" : "bash", uarmg ? "gloved" : "bare", /* Del Lamb */ makeplural(body_part(HAND))); +#else + You("%sで怪物を%sつけた.", + uarmg ? "グローブ" : "素手", + Role_if(PM_MONK) ? "打ち" : "なぐり"); +#endif } } exercise(A_STR, TRUE); /* you're exercising muscles */ @@ -419,7 +470,10 @@ if (override_confirmation) { /* this may need to be generalized if weapons other than Stormbringer acquire similar anti-social behavior... */ +/*JP if (flags.verbose) Your("bloodthirsty blade attacks!"); +*/ + if (flags.verbose) Your("武器は血に飢えている!"); } if(!*mhit) { @@ -529,10 +583,14 @@ int wtype; struct obj *monwep; char yourbuf[BUFSZ]; +#if 0 /*JP*/ char unconventional[BUFSZ]; /* substituted for word "attack" in msg */ +#endif char saved_oname[BUFSZ]; +#if 0 /*JP*/ unconventional[0] = '\0'; +#endif saved_oname[0] = '\0'; wakeup(mon); @@ -587,9 +645,16 @@ rnl(4) == 4-1) { boolean more_than_1 = (obj->quan > 1L); +#if 0 /*JP*/ pline("As you hit %s, %s%s %s breaks into splinters.", mon_nam(mon), more_than_1 ? "one of " : "", shk_your(yourbuf, obj), xname(obj)); +#else + pline("%sを攻撃すると,%s%s%sはこっぱみじんになった.", + mon_nam(mon), + shk_your(yourbuf, obj), xname(obj), + more_than_1 ? "のひとつ" : ""); +#endif if (!more_than_1) uwepgone(); /* set unweapon */ useup(obj); if (!more_than_1) obj = (struct obj *) 0; @@ -604,7 +669,10 @@ if (!valid_weapon_attack || mon == u.ustuck || u.twoweap) { ; /* no special bonuses */ } else if (mon->mflee && Role_if(PM_ROGUE) && !Upolyd) { +/*JP You("strike %s from behind!", mon_nam(mon)); +*/ + You("%sを背後から攻撃した!", mon_nam(mon)); tmp += rnd(u.ulevel); hittxt = TRUE; } else if (dieroll == 2 && obj == uwep && @@ -627,9 +695,14 @@ setmnotwielded(mon,monwep); MON_NOWEP(mon); mon->weapon_check = NEED_WEAPON; +#if 0 /*JP*/ pline("%s %s %s from the force of your blow!", s_suffix(Monnam(mon)), xname(monwep), otense(monwep, "shatter")); +#else + pline("%sの%sはあなたの一撃で粉々になった!", + Monnam(mon), xname(monwep)); +#endif m_useup(mon, monwep); /* If someone just shattered MY weapon, I'd flee! */ if (rn2(4)) { @@ -689,7 +762,9 @@ } else { if (mdat == &mons[PM_SHADE] && !shade_aware(obj)) { tmp = 0; +#if 0 /*JP*/ Strcpy(unconventional, cxname(obj)); +#endif } else { switch(obj->otyp) { case BOULDER: /* 1d20 */ @@ -699,7 +774,10 @@ break; case MIRROR: if (breaktest(obj)) { +/*JP You("break %s mirror. That's bad luck!", +*/ + You("%s鏡を壊してしまった.こりゃまいった!", shk_your(yourbuf, obj)); change_luck(-2); useup(obj); @@ -712,7 +790,10 @@ break; #ifdef TOURIST case EXPENSIVE_CAMERA: +/*JP You("succeed in destroying %s camera. Congratulations!", +*/ + You("%sカメラを壊すことができた.おめでとう!", shk_your(yourbuf, obj)); useup(obj); return(TRUE); @@ -721,13 +802,20 @@ #endif case CORPSE: /* fixed by polder@cs.vu.nl */ if (touch_petrifies(&mons[obj->corpsenm])) { +#if 0 /*JP*/ static const char withwhat[] = "corpse"; +#endif tmp = 1; hittxt = TRUE; +#if 0 /*JP*/ You("hit %s with %s %s.", mon_nam(mon), obj->dknown ? the(mons[obj->corpsenm].mname) : an(mons[obj->corpsenm].mname), (obj->quan > 1) ? makeplural(withwhat) : withwhat); +#else + You("%sを%sの死体で攻撃した.", mon_nam(mon), + jtrns_mon(mons[obj->corpsenm].mname)); +#endif if (!munstone(mon, TRUE)) minstapetrify(mon, TRUE); if (resists_ston(mon)) break; @@ -746,7 +834,9 @@ #define useup_eggs(o) { if (thrown) obfree(o,(struct obj *)0); \ else useupall(o); \ o = (struct obj *)0; } /* now gone */ +#if 0 /*JP*/ long cnt = obj->quan; +#endif tmp = 1; /* nominal physical damage */ get_dmg_bonus = FALSE; @@ -763,11 +853,17 @@ if (touch_petrifies(&mons[obj->corpsenm])) { /*learn_egg_type(obj->corpsenm);*/ +#if 0 /*JP*/ pline("Splat! You hit %s with %s %s egg%s!", mon_nam(mon), obj->known ? "the" : cnt > 1L ? "some" : "a", obj->known ? mons[obj->corpsenm].mname : "petrifying", plur(cnt)); +#else + pline("ビチャッ!あなたは%sに%sの卵を投げつけた!", + mon_nam(mon), + jtrns_mon(mons[obj->corpsenm].mname)); +#endif obj->known = 1; /* (not much point...) */ useup_eggs(obj); if (!munstone(mon, TRUE)) @@ -776,15 +872,29 @@ return (boolean) (mon->mhp > 0); } else { /* ordinary egg(s) */ const char *eggp = +#if 0 /*JP*/ (obj->corpsenm != NON_PM && obj->known) ? the(mons[obj->corpsenm].mname) : (cnt > 1L) ? "some" : "an"; +#else + (obj->corpsenm != NON_PM && obj->known) ? + jtrns_mon(mons[obj->corpsenm].mname) : ""; +#endif +#if 0 /*JP*/ You("hit %s with %s egg%s.", mon_nam(mon), eggp, plur(cnt)); +#else + You("%sに%s%s卵を投げつけた.", + mon_nam(mon), eggp, *eggp ? "の" : ""); +#endif if (touch_petrifies(mdat) && !stale_egg(obj)) { +#if 0 /*JP*/ pline_The("egg%s %s alive any more...", plur(cnt), (cnt == 1L) ? "isn't" : "aren't"); +#else + pline("もう卵が孵化することはないだろう..."); +#endif if (obj->timed) obj_stop_timers(obj); obj->otyp = ROCK; obj->oclass = GEM_CLASS; @@ -794,7 +904,10 @@ obj->owt = weight(obj); if (thrown) place_object(obj, mon->mx, mon->my); } else { +/*JP pline("Splat!"); +*/ + pline("ビチャッ!"); useup_eggs(obj); exercise(A_WIS, FALSE); } @@ -816,10 +929,18 @@ ? AT_SPIT : AT_WEAP), obj)) { if (Blind) { pline(obj->otyp == CREAM_PIE ? +/*JP "Splat!" : "Splash!"); +*/ + "ビシャッ!" : "ピチャッ!"); } else if (obj->otyp == BLINDING_VENOM) { +#if 0 /*JP*/ pline_The("venom blinds %s%s!", mon_nam(mon), mon->mcansee ? "" : " further"); +#else + pline("毒液で%sは%s目が見えなくなった!", mon_nam(mon), + mon->mcansee ? "" : "さらに"); +#endif } else { char *whom = mon_nam(mon); char *what = The(xname(obj)); @@ -828,10 +949,20 @@ /* note: s_suffix returns a modifiable buffer */ if (haseyes(mdat) && mdat != &mons[PM_FLOATING_EYE]) +#if 0 /*JP*/ whom = strcat(strcat(s_suffix(whom), " "), mbodypart(mon, FACE)); +#else + whom = strcat(strcat(s_suffix(whom), "の"), + mbodypart(mon, FACE)); +#endif +#if 0 /*JP*/ pline("%s %s over %s!", what, vtense(what, "splash"), whom); +#else + pline("%sは%sにぶちまけられた!", + what, whom); +#endif } setmangry(mon); mon->mcansee = 0; @@ -840,7 +971,10 @@ mon->mblinded = 127; else mon->mblinded += tmp; } else { +/*JP pline(obj->otyp==CREAM_PIE ? "Splat!" : "Splash!"); +*/ + pline(obj->otyp==CREAM_PIE ? "ビシャッ!" : "ピチャッ!"); setmangry(mon); } if (thrown) obfree(obj, (struct obj *)0); @@ -851,11 +985,17 @@ break; case ACID_VENOM: /* thrown (or spit) */ if (resists_acid(mon)) { +/*JP Your("venom hits %s harmlessly.", +*/ + pline("毒液は%sには効果がなかった.", mon_nam(mon)); tmp = 0; } else { +/*JP Your("venom burns %s!", mon_nam(mon)); +*/ + Your("毒液は%sを焼いた!", mon_nam(mon)); tmp = dmgval(obj, mon); } if (thrown) obfree(obj, (struct obj *)0); @@ -911,16 +1051,26 @@ int nopoison = (10 - (obj->owt/10)); if(nopoison < 2) nopoison = 2; if Role_if(PM_SAMURAI) { +/*JP You("dishonorably use a poisoned weapon!"); +*/ + You("不名誉にも毒の武器を使用した!"); adjalign(-sgn(u.ualign.type)); } else if ((u.ualign.type == A_LAWFUL) && (u.ualign.record > -10)) { +/*JP You_feel("like an evil coward for using a poisoned weapon."); +*/ + You("毒の武器を使用するのは卑怯だと感じた."); adjalign(-1); } if (obj && !rn2(nopoison)) { obj->opoisoned = FALSE; +#if 0 /*JP*/ Your("%s %s no longer poisoned.", xname(obj), otense(obj, "are")); +#else + Your("%sはもう毒が塗られていない.", xname(obj)); +#endif } if (resists_poison(mon)) needpoismsg = TRUE; @@ -934,10 +1084,15 @@ tmp = 0; if (mdat == &mons[PM_SHADE]) { if (!hittxt) { +#if 0 /*JP*/ const char *what = unconventional[0] ? unconventional : "attack"; Your("%s %s harmlessly through %s.", what, vtense(what, "pass"), mon_nam(mon)); +#else + Your("攻撃は%sを通りぬけた.", + mon_nam(mon)); +#endif hittxt = TRUE; } } else { @@ -948,10 +1103,18 @@ #ifdef STEED if (jousting) { tmp += d(2, (obj == uwep) ? 10 : 2); /* [was in dmgval()] */ +#if 0 /*JP*/ You("joust %s%s", mon_nam(mon), canseemon(mon) ? exclam(tmp) : "."); +#else + You("%sに突撃した%s", + mon_nam(mon), canseemon(mon) ? exclam(tmp) : "."); +#endif if (jousting < 0) { +/*JP Your("%s shatters on impact!", xname(obj)); +*/ + Your("%sは衝撃で壊れた!", xname(obj)); /* (must be either primary or secondary weapon to get here) */ u.twoweap = FALSE; /* untwoweapon() is too verbose here */ if (obj == uwep) uwepgone(); /* set unweapon */ @@ -974,8 +1137,13 @@ if (rnd(100) < P_SKILL(P_BARE_HANDED_COMBAT) && !bigmonst(mdat) && !thick_skinned(mdat)) { if (canspotmon(mon)) +#if 0 /*JP*/ pline("%s %s from your powerful strike!", Monnam(mon), makeplural(stagger(mon->data, "stagger"))); +#else + pline("%sはあなたの会心の一撃でよろめいた!", + Monnam(mon)); +#endif /* avoid migrating a dead monster */ if (mon->mhp > tmp) { mhurtle(mon, u.dx, u.dy, 1); @@ -1002,7 +1170,10 @@ && mon->mhp > 1 && !thrown && !mon->mcan /* && !destroyed -- guaranteed by mhp > 1 */ ) { if (clone_mon(mon, 0, 0)) { +/*JP pline("%s divides as you hit it!", Monnam(mon)); +*/ + pline("あなたの攻撃で%sは分裂した!", Monnam(mon)); hittxt = TRUE; } } @@ -1010,9 +1181,17 @@ if (!hittxt && /*( thrown => obj exists )*/ (!destroyed || (thrown && m_shot.n > 1 && m_shot.o == obj->otyp))) { if (thrown) hit(mshot_xname(obj), mon, exclam(tmp)); +/*JP else if (!flags.verbose) You("hit it."); +*/ + else if(!flags.verbose) pline("攻撃は命中した."); +#if 0 /*JP*/ else You("%s %s%s", Role_if(PM_BARBARIAN) ? "smite" : "hit", mon_nam(mon), canseemon(mon) ? exclam(tmp) : "."); +#else + else Your("%sへの攻撃は命中した%s", mon_nam(mon), canseemon(mon) + ? exclam(tmp) : "."); +#endif } if (silvermsg) { @@ -1022,31 +1201,59 @@ if (canspotmon(mon)) { if (barehand_silver_rings == 1) +/*JP fmt = "Your silver ring sears %s!"; +*/ + fmt = "%sは銀の指輪で焼かれた!"; else if (barehand_silver_rings == 2) +/*JP fmt = "Your silver rings sear %s!"; +*/ + fmt = "%sは銀の指輪で焼かれた!"; else if (silverobj && saved_oname[0]) { +#if 0 /*JP*/ Sprintf(silverobjbuf, "Your %s%s %s %%s!", strstri(saved_oname, "silver") ? "" : "silver ", saved_oname, vtense(saved_oname, "sear")); +#else + Sprintf(silverobjbuf, "%%sは%s%sで焼かれた!", + strstri(saved_oname, "銀") ? + "" : "銀の", + saved_oname); +#endif fmt = silverobjbuf; } else +/*JP fmt = "The silver sears %s!"; +*/ + fmt = "%sは銀で焼かれた!"; } else { *whom = highc(*whom); /* "it" -> "It" */ +/*JP fmt = "%s is seared!"; +*/ + fmt = "%sは焼かれた."; } /* note: s_suffix returns a modifiable buffer */ if (!noncorporeal(mdat)) +/*JP whom = strcat(s_suffix(whom), " flesh"); +*/ + whom = strcat(s_suffix(whom), "の肉"); pline(fmt, whom); } if (needpoismsg) +/*JP pline_The("poison doesn't seem to affect %s.", mon_nam(mon)); +*/ + pline("毒は%sに効かなかったようだ.", mon_nam(mon)); if (poiskilled) { +/*JP pline_The("poison was deadly..."); +*/ + pline("毒は致死量だった..."); if (!already_killed) xkilled(mon, 0); return FALSE; } else if (destroyed) { @@ -1058,7 +1265,10 @@ mon->mconf = 1; if (!mon->mstun && mon->mcanmove && !mon->msleeping && canseemon(mon)) +/*JP pline("%s appears confused.", Monnam(mon)); +*/ + pline("%sは混乱しているようだ.", Monnam(mon)); } } @@ -1111,6 +1321,7 @@ protection might fail (33% chance) when the armor is cursed */ if (obj && (obj->greased || obj->otyp == OILSKIN_CLOAK) && (!obj->cursed || rn2(3))) { +#if 0 /*JP*/ You("%s %s %s %s!", mattk->adtyp == AD_WRAP ? "slip off of" : "grab, but cannot hold onto", @@ -1120,9 +1331,21 @@ for undiscovered oilskin cloak */ (obj->greased || objects[obj->otyp].oc_name_known) ? xname(obj) : cloak_simple_name(obj)); +#else + You("%sの%s%s%s!", + mon_nam(mdef), + obj->greased ? "油の塗られた" : "滑りやすい", + (obj->greased || objects[obj->otyp].oc_name_known) ? + xname(obj) : cloak_simple_name(obj), + mattk->adtyp == AD_WRAP ? + "で滑った" : "をつかまようとした,しかしできなかった"); +#endif if (obj->greased && !rn2(2)) { +/*JP pline_The("grease wears off."); +*/ + pline("油は落ちてしまった."); obj->greased = 0; } return TRUE; @@ -1172,7 +1395,10 @@ struct permonst *pm; struct monst *dtmp; +/*JP pline("Some hell-p has arrived!"); +*/ + pline("地獄の仲間が現われた!"); i = !rn2(6) ? ndemon(u.ualign.type) : NON_PM; pm = i != NON_PM ? &mons[i] : youmonst.data; if ((dtmp = makemon(pm, u.ux, u.uy, NO_MM_FLAGS)) != 0) @@ -1222,11 +1448,19 @@ if (stealoid) { /* we will be taking everything */ if (gender(mdef) == (int) u.mfemale && youmonst.data->mlet == S_NYMPH) +/*JP You("charm %s. She gladly hands over her possessions.", +*/ + You("%sをうっとりさせた.彼女はよろこんで持ち物をさしだした.", mon_nam(mdef)); else +#if 0 /*JP*/ You("seduce %s and %s starts to take off %s clothes.", mon_nam(mdef), mhe(mdef), mhis(mdef)); +#else + You("%sを誘惑した.%sは服を脱ぎはじめた.", + mon_nam(mdef), mhe(mdef)); +#endif } while ((otmp = mdef->minvent) != 0) { @@ -1243,18 +1477,30 @@ update_mon_intrinsics(mdef, otmp, FALSE, FALSE); if (otmp == stealoid) /* special message for final item */ +#if 0 /*JP*/ pline("%s finishes taking off %s suit.", Monnam(mdef), mhis(mdef)); +#else + pline("%sは脱ぎ終えた.", Monnam(mdef)); +#endif } /* give the object to the character */ +#if 0 /*JP*/ otmp = hold_another_object(otmp, "You snatched but dropped %s.", doname(otmp), "You steal: "); +#else + otmp = hold_another_object(otmp, "あなたは%sを盗んだが落とした.", + doname(otmp), "盗んだ物:"); +#endif if (otmp->where != OBJ_INVENT) continue; if (otmp->otyp == CORPSE && touch_petrifies(&mons[otmp->corpsenm]) && !uarmg) { char kbuf[BUFSZ]; +/*JP Sprintf(kbuf, "stolen %s corpse", mons[otmp->corpsenm].mname); +*/ + Sprintf(kbuf, "%sの死体を盗んで", jtrns_mon(mons[otmp->corpsenm].mname)); instapetrify(kbuf); break; /* stop the theft even if hero survives */ } @@ -1294,8 +1540,12 @@ switch(mattk->adtyp) { case AD_STUN: if(!Blind) +#if 0 /*JP*/ pline("%s %s for a moment.", Monnam(mdef), makeplural(stagger(mdef->data, "stagger"))); +#else + pline("%sは一瞬くらくらした.", Monnam(mdef)); +#endif mdef->mstun = 1; goto physical; case AD_LEGS: @@ -1327,12 +1577,20 @@ break; } if (!Blind) +#if 0 /*JP*/ pline("%s is %s!", Monnam(mdef), on_fire(mdef->data, mattk)); +#else + pline("%sは%s!", Monnam(mdef), + on_fire(mdef->data, mattk)); +#endif if (pd == &mons[PM_STRAW_GOLEM] || pd == &mons[PM_PAPER_GOLEM]) { if (!Blind) +/*JP pline("%s burns completely!", Monnam(mdef)); +*/ + pline("%sは灰と化した!", Monnam(mdef)); xkilled(mdef,2); tmp = 0; break; @@ -1342,7 +1600,10 @@ tmp += destroy_mitem(mdef, SPBOOK_CLASS, AD_FIRE); if (resists_fire(mdef)) { if (!Blind) +/*JP pline_The("fire doesn't heat %s!", mon_nam(mdef)); +*/ + pline("炎は%sに影響がない!", mon_nam(mdef)); golemeffects(mdef, AD_FIRE, tmp); shieldeff(mdef->mx, mdef->my); tmp = 0; @@ -1355,11 +1616,17 @@ tmp = 0; break; } +/*JP if (!Blind) pline("%s is covered in frost!", Monnam(mdef)); +*/ + if (!Blind) pline("%sは氷で覆われた!", Monnam(mdef)); if (resists_cold(mdef)) { shieldeff(mdef->mx, mdef->my); if (!Blind) +/*JP pline_The("frost doesn't chill %s!", mon_nam(mdef)); +*/ + pline("氷は%sを凍らすことができない!", mon_nam(mdef)); golemeffects(mdef, AD_COLD, tmp); tmp = 0; } @@ -1370,11 +1637,17 @@ tmp = 0; break; } +/*JP if (!Blind) pline("%s is zapped!", Monnam(mdef)); +*/ + if (!Blind) pline("%sは電撃をくらった!", Monnam(mdef)); tmp += destroy_mitem(mdef, WAND_CLASS, AD_ELEC); if (resists_elec(mdef)) { if (!Blind) +/*JP pline_The("zap doesn't shock %s!", mon_nam(mdef)); +*/ + pline("電撃は%sに影響を与えない!", mon_nam(mdef)); golemeffects(mdef, AD_ELEC, tmp); shieldeff(mdef->mx, mdef->my); tmp = 0; @@ -1403,7 +1676,10 @@ if (mdef->mgold) { u.ugold += mdef->mgold; mdef->mgold = 0; +/*JP Your("purse feels heavier."); +*/ + You("財布が重くなったような気がした."); } #else /* This you as a leprechaun, so steal @@ -1414,9 +1690,15 @@ obj_extract_self(mongold); if (merge_choice(invent, mongold) || inv_cnt() < 52) { addinv(mongold); +/*JP Your("purse feels heavier."); +*/ + You("財布が重くなったような気がした."); } else { +/*JP You("grab %s's gold, but find no room in your knapsack.", mon_nam(mdef)); +*/ + You("%sのお金をつかんだが,持ち物袋に入らなかった.", mon_nam(mdef)); dropy(mongold); } } @@ -1435,13 +1717,19 @@ Strcpy(nambuf, Monnam(mdef)); if (u_teleport_mon(mdef, FALSE) && u_saw_mon && !canseemon(mdef)) +/*JP pline("%s suddenly disappears!", nambuf); +*/ + pline("%sは突然消えた!", nambuf); } break; case AD_BLND: if (can_blnd(&youmonst, mdef, mattk->aatyp, (struct obj*)0)) { if(!Blind && mdef->mcansee) +/*JP pline("%s is blinded.", Monnam(mdef)); +*/ + pline("%sは目が見えなくなった.", Monnam(mdef)); mdef->mcansee = 0; tmp += mdef->mblinded; if (tmp > 127) tmp = 127; @@ -1453,13 +1741,19 @@ if (night() && !rn2(10) && !mdef->mcan) { if (mdef->data == &mons[PM_CLAY_GOLEM]) { if (!Blind) +/*JP pline("Some writing vanishes from %s head!", +*/ + pline("%sの頭に書いてある文字のいくつかが消えた!", s_suffix(mon_nam(mdef))); xkilled(mdef, 0); /* Don't return yet; keep hp<1 and tmp=0 for pet msg */ } else { mdef->mcan = 1; +/*JP You("chuckle."); +*/ + You("くすくす笑った."); } } tmp = 0; @@ -1467,10 +1761,16 @@ case AD_DRLI: if (!negated && !rn2(3) && !resists_drli(mdef)) { int xtmp = d(2,6); +/*JP pline("%s suddenly seems weaker!", Monnam(mdef)); +*/ + pline("%sは突然弱くなったように見えた!", Monnam(mdef)); mdef->mhpmax -= xtmp; if ((mdef->mhp -= xtmp) <= 0 || !mdef->m_lev) { +/*JP pline("%s dies!", Monnam(mdef)); +*/ + pline("%sは死んだ!", Monnam(mdef)); xkilled(mdef,0); } else mdef->m_lev--; @@ -1479,7 +1779,10 @@ break; case AD_RUST: if (pd == &mons[PM_IRON_GOLEM]) { +/*JP pline("%s falls to pieces!", Monnam(mdef)); +*/ + pline("%sはバラバラになった!", Monnam(mdef)); xkilled(mdef,0); } hurtmarmor(mdef, AD_RUST); @@ -1492,7 +1795,10 @@ case AD_DCAY: if (pd == &mons[PM_WOOD_GOLEM] || pd == &mons[PM_LEATHER_GOLEM]) { +/*JP pline("%s falls to pieces!", Monnam(mdef)); +*/ + pline("%sはバラバラになった!", Monnam(mdef)); xkilled(mdef,0); } hurtmarmor(mdef, AD_DCAY); @@ -1502,13 +1808,22 @@ case AD_DRDX: case AD_DRCO: if (!negated && !rn2(8)) { +/*JP Your("%s was poisoned!", mpoisons_subj(&youmonst, mattk)); +*/ + Your("%sは毒されている!", mpoisons_subj(&youmonst, mattk)); if (resists_poison(mdef)) +/*JP pline_The("poison doesn't seem to affect %s.", +*/ + pline("毒は%sに影響を与えない.", mon_nam(mdef)); else { if (!rn2(10)) { +/*JP Your("poison was deadly..."); +*/ + Your("与えた毒は致死量だった..."); tmp = mdef->mhp; } else tmp += rn1(10,6); } @@ -1516,11 +1831,17 @@ break; case AD_DRIN: if (notonhead || !has_head(mdef->data)) { +/*JP pline("%s doesn't seem harmed.", Monnam(mdef)); +*/ + pline("%sは傷ついたようには見えない.", Monnam(mdef)); tmp = 0; if (!Unchanging && mdef->data == &mons[PM_GREEN_SLIME]) { if (!Slimed) { +/*JP You("suck in some slime and don't feel very well."); +*/ + You("スライムを吸い取って,具合が悪くなった."); Slimed = 10L; } } @@ -1529,24 +1850,38 @@ if (m_slips_free(mdef, mattk)) break; if ((mdef->misc_worn_check & W_ARMH) && rn2(8)) { +#if 0 /*JP*/ pline("%s helmet blocks your attack to %s head.", s_suffix(Monnam(mdef)), mhis(mdef)); +#else + pline("%sの兜が頭への攻撃を防いだ.", + Monnam(mdef)); +#endif break; } +/*JP You("eat %s brain!", s_suffix(mon_nam(mdef))); +*/ + You("%sの脳を食べた!", mon_nam(mdef)); u.uconduct.food++; if (touch_petrifies(mdef->data) && !Stone_resistance && !Stoned) { Stoned = 5; killer_format = KILLED_BY_AN; +/*JP delayed_killer = mdef->data->mname; +*/ + delayed_killer = jtrns_mon(mdef->data->mname); } if (!vegan(mdef->data)) u.uconduct.unvegan++; if (!vegetarian(mdef->data)) violated_vegetarian(); if (mindless(mdef->data)) { +/*JP pline("%s doesn't notice.", Monnam(mdef)); +*/ + pline("%sは気付いていない.", Monnam(mdef)); break; } tmp += rnd(10); @@ -1569,7 +1904,10 @@ if (m_slips_free(mdef, mattk)) { tmp = 0; } else { +/*JP You("swing yourself around %s!", +*/ + You("%sに身体を絡みつかせた!", mon_nam(mdef)); u.ustuck = mdef; } @@ -1577,14 +1915,23 @@ /* Monsters don't wear amulets of magical breathing */ if (is_pool(u.ux,u.uy) && !is_swimmer(mdef->data) && !amphibious(mdef->data)) { +/*JP You("drown %s...", mon_nam(mdef)); +*/ + You("%sを溺れさせた...", mon_nam(mdef)); tmp = mdef->mhp; } else if(mattk->aatyp == AT_HUGS) +/*JP pline("%s is being crushed.", Monnam(mdef)); +*/ + pline("%sは押しつぶされた.", Monnam(mdef)); } else { tmp = 0; if (flags.verbose) +/*JP You("brush against %s %s.", +*/ + You("%sの%sに触れた.", s_suffix(mon_nam(mdef)), mbodypart(mdef, LEG)); } @@ -1592,7 +1939,10 @@ break; case AD_PLYS: if (!negated && mdef->mcanmove && !rn2(3) && tmp < mdef->mhp) { +/*JP if (!Blind) pline("%s is frozen by you!", Monnam(mdef)); +*/ + if (!Blind) pline("%sはあなたのにらみで動けなくなった!", Monnam(mdef)); mdef->mcanmove = 0; mdef->mfrozen = rnd(10); } @@ -1601,7 +1951,10 @@ if (!negated && !mdef->msleeping && sleep_monst(mdef, rnd(10), -1)) { if (!Blind) +/*JP pline("%s is put to sleep by you!", Monnam(mdef)); +*/ + pline("%sは突然眠りにおちた!", Monnam(mdef)); slept_monst(mdef); } break; @@ -1609,7 +1962,10 @@ if (negated) break; /* physical damage only */ if (!rn2(4) && !flaming(mdef->data) && mdef->data != &mons[PM_GREEN_SLIME]) { +/*JP You("turn %s into slime.", mon_nam(mdef)); +*/ + pline("%sはスライムになった.", mon_nam(mdef)); (void) newcham(mdef, &mons[PM_GREEN_SLIME], FALSE, FALSE); tmp = 0; } @@ -1624,13 +1980,19 @@ mon_adjust_speed(mdef, -1, (struct obj *)0); if (mdef->mspeed != oldspeed && canseemon(mdef)) +/*JP pline("%s slows down.", Monnam(mdef)); +*/ + pline("%sはのろくなった.", Monnam(mdef)); } break; case AD_CONF: if (!mdef->mconf) { if (canseemon(mdef)) +/*JP pline("%s looks confused.", Monnam(mdef)); +*/ + pline("%sは混乱したようだ.", Monnam(mdef)); mdef->mconf = 1; } break; @@ -1641,10 +2003,16 @@ mdef->mstrategy &= ~STRAT_WAITFORU; /* in case player is very fast */ if((mdef->mhp -= tmp) < 1) { if (mdef->mtame && !cansee(mdef->mx,mdef->my)) { +/*JP You_feel("embarrassed for a moment."); +*/ + You("しばらく困惑した."); if (tmp) xkilled(mdef, 0); /* !tmp but hp<1: already killed */ } else if (!flags.verbose) { +/*JP You("destroy it!"); +*/ + You("倒した!"); if (tmp) xkilled(mdef, 0); } else if (tmp) killed(mdef); @@ -1658,37 +2026,61 @@ register struct monst *mdef; register struct attack *mattk; { +#if 1 /*JP*/ + char *jad = ""; +#endif register int tmp = d((int)mattk->damn, (int)mattk->damd); +/*JP You("explode!"); +*/ + You("爆発した!"); switch(mattk->adtyp) { boolean resistance; /* only for cold/fire/elec */ case AD_BLND: if (!resists_blnd(mdef)) { +/*JP pline("%s is blinded by your flash of light!", Monnam(mdef)); +*/ + pline("%sはまばゆい光で目がくらんだ!", Monnam(mdef)); mdef->mblinded = min((int)mdef->mblinded + tmp, 127); mdef->mcansee = 0; } break; case AD_HALU: if (haseyes(mdef->data) && mdef->mcansee) { +/*JP pline("%s is affected by your flash of light!", +*/ + pline("%sはまばゆい光で影響をうけた!", Monnam(mdef)); mdef->mconf = 1; } break; case AD_COLD: +#if 1 /*JP*/ + jad = "氷"; +#endif resistance = resists_cold(mdef); goto common; case AD_FIRE: +#if 1 /*JP*/ + jad = "炎"; +#endif resistance = resists_fire(mdef); goto common; case AD_ELEC: +#if 1 /*JP*/ + jad = "電撃"; +#endif resistance = resists_elec(mdef); common: if (!resistance) { +/*JP pline("%s gets blasted!", Monnam(mdef)); +*/ + pline("%sは%sを浴びた!", Monnam(mdef), jad); mdef->mhp -= tmp; if (mdef->mhp <= 0) { killed(mdef); @@ -1699,7 +2091,10 @@ if (is_golem(mdef->data)) golemeffects(mdef, (int)mattk->adtyp, tmp); else +/*JP pline_The("blast doesn't seem to affect %s.", +*/ + pline("%sは%sに影響を与えなかったようだ.", jad, mon_nam(mdef)); } break; @@ -1718,7 +2113,10 @@ tmp_at(DISP_ALWAYS, mon_to_glyph(&youmonst)); tmp_at(mdef->mx, mdef->my); } +/*JP You("engulf %s!", mon_nam(mdef)); +*/ + You("%sを飲み込んだ!", mon_nam(mdef)); delay_output(); delay_output(); } @@ -1765,12 +2163,22 @@ case AD_DGST: /* eating a Rider or its corpse is fatal */ if (is_rider(mdef->data)) { +/*JP pline("Unfortunately, digesting any of it is fatal."); +*/ + pline("残念ながら,それを食べるのは致命的な間違いだ."); end_engulf(); +#if 0 /*JP:T*/ Sprintf(msgbuf, "unwisely tried to eat %s", mdef->data->mname); killer = msgbuf; killer_format = NO_KILLER_PREFIX; +#else + Sprintf(msgbuf, "愚かにも%sを食べて", + jtrns_mon(mdef->data->mname)); + killer = msgbuf; + killer_format = KILLED_BY; +#endif done(DIED); return 0; /* lifesaved */ } @@ -1793,7 +2201,10 @@ newuhs(FALSE); xkilled(mdef,2); if (mdef->mhp > 0) { /* monster lifesaved */ +/*JP You("hurriedly regurgitate the sizzling in your %s.", +*/ + You("%sの中でシューシューという音を立てているものを大急ぎで吐き戻した.", body_part(STOMACH)); } else { tmp = 1 + (mdef->data->cwt >> 8); @@ -1803,7 +2214,10 @@ /* nutrition only if there can be a corpse */ u.uhunger += (mdef->data->cnutrit+1) / 2; } else tmp = 0; +/*JP Sprintf(msgbuf, "You totally digest %s.", +*/ + Sprintf(msgbuf, "あなたは%sを完全に消化した.", mon_nam(mdef)); if (tmp != 0) { /* setting afternmv = end_engulf is tempting, @@ -1811,14 +2225,22 @@ * attacked (which uses his real location) or * if his See_invisible wears off */ +/*JP You("digest %s.", mon_nam(mdef)); +*/ + You("%sを消化している.", mon_nam(mdef)); if (Slow_digestion) tmp *= 2; nomul(-tmp); nomovemsg = msgbuf; } else pline("%s", msgbuf); if (mdef->data == &mons[PM_GREEN_SLIME]) { +#if 0 /*JP*/ Sprintf(msgbuf, "%s isn't sitting well with you.", The(mdef->data->mname)); +#else + Sprintf(msgbuf, "%sはあなたとうまく折り合いをつけられないようだ.", + jtrns_mon(mdef->data->mname)); +#endif if (!Unchanging) { Slimed = 5L; flags.botl = 1; @@ -1830,28 +2252,46 @@ return(2); case AD_PHYS: if (youmonst.data == &mons[PM_FOG_CLOUD]) { +/*JP pline("%s is laden with your moisture.", +*/ + pline("%sはあなたの湿気に苦しめられている.", Monnam(mdef)); if (amphibious(mdef->data) && !flaming(mdef->data)) { dam = 0; +/*JP pline("%s seems unharmed.", Monnam(mdef)); +*/ + pline("%sは傷ついていないようだ.", Monnam(mdef)); } } else +/*JP pline("%s is pummeled with your debris!", +*/ + pline("%sは瓦礫で痛めつけられた!", Monnam(mdef)); break; case AD_ACID: +/*JP pline("%s is covered with your goo!", Monnam(mdef)); +*/ + pline("%sはねばつくもので覆われた!", Monnam(mdef)); if (resists_acid(mdef)) { +/*JP pline("It seems harmless to %s.", mon_nam(mdef)); +*/ + pline("しかし,%sはなんともない.", mon_nam(mdef)); dam = 0; } break; case AD_BLND: if (can_blnd(&youmonst, mdef, mattk->aatyp, (struct obj *)0)) { if (mdef->mcansee) +/*JP pline("%s can't see in there!", Monnam(mdef)); +*/ + pline("%sは目が見えなくなった!", mon_nam(mdef)); mdef->mcansee = 0; dam += mdef->mblinded; if (dam > 127) dam = 127; @@ -1861,9 +2301,15 @@ break; case AD_ELEC: if (rn2(2)) { +/*JP pline_The("air around %s crackles with electricity.", mon_nam(mdef)); +*/ + pline("%sの回りの空気は静電気でピリピリしている.", mon_nam(mdef)); if (resists_elec(mdef)) { +/*JP pline("%s seems unhurt.", Monnam(mdef)); +*/ + pline("しかし,%sは平気なようだ.", Monnam(mdef)); dam = 0; } golemeffects(mdef,(int)mattk->adtyp,dam); @@ -1872,20 +2318,32 @@ case AD_COLD: if (rn2(2)) { if (resists_cold(mdef)) { +/*JP pline("%s seems mildly chilly.", Monnam(mdef)); +*/ + pline("%sは冷えたようだ.", Monnam(mdef)); dam = 0; } else +/*JP pline("%s is freezing to death!",Monnam(mdef)); +*/ + pline("%sは凍死しそうだ!",Monnam(mdef)); golemeffects(mdef,(int)mattk->adtyp,dam); } else dam = 0; break; case AD_FIRE: if (rn2(2)) { if (resists_fire(mdef)) { +/*JP pline("%s seems mildly hot.", Monnam(mdef)); +*/ + pline("%sは暖かくなったようだ.", Monnam(mdef)); dam = 0; } else +/*JP pline("%s is burning to a crisp!",Monnam(mdef)); +*/ + pline("%sは燃えてカラカラになった!",Monnam(mdef)); golemeffects(mdef,(int)mattk->adtyp,dam); } else dam = 0; break; @@ -1896,17 +2354,31 @@ if (mdef->mhp <= 0) /* not lifesaved */ return(2); } +#if 0 /*JP*/ You("%s %s!", is_animal(youmonst.data) ? "regurgitate" : "expel", mon_nam(mdef)); +#else + You("%sを%s!", mon_nam(mdef), + is_animal(youmonst.data) ? "吐き戻した" : "排出した"); +#endif if (Slow_digestion || is_animal(youmonst.data)) { +/*JP pline("Obviously, you didn't like %s taste.", +*/ + pline("どうも%sの味は好きになれない.", s_suffix(mon_nam(mdef))); } } else { char kbuf[BUFSZ]; +/*JP You("bite into %s.", mon_nam(mdef)); +*/ + You("%sに噛みついた.", mon_nam(mdef)); +/*JP Sprintf(kbuf, "swallowing %s whole", an(mdef->data->mname)); +*/ + Sprintf(kbuf, "%sを完全に飲み込んで", a_monnam(mdef)); instapetrify(kbuf); } } @@ -1919,11 +2391,20 @@ register struct attack *mattk; { if (could_seduce(&youmonst, mdef, mattk)) +/*JP You("pretend to be friendly to %s.", mon_nam(mdef)); +*/ + You("%sに友好的なふりをした.", mon_nam(mdef)); else if(canspotmon(mdef) && flags.verbose) +/*JP You("miss %s.", mon_nam(mdef)); +*/ + Your("%sへの攻撃は外れた.", mon_nam(mdef)); else +/*JP You("miss it."); +*/ + Your("何者かへの攻撃は外れた."); if (!mdef->msleeping && mdef->mcanmove) wakeup(mdef); } @@ -1997,11 +2478,19 @@ if (!u.uswallow && (compat=could_seduce(&youmonst, mon, mattk))) { +#if 0 /*JP*/ You("%s %s %s.", mon->mcansee && haseyes(mon->data) ? "smile at" : "talk to", mon_nam(mon), compat == 2 ? "engagingly":"seductively"); +#else + You("%sへ%s%s.", + mon_nam(mon), + compat == 2 ? "魅力的に":"誘惑的に", + mon->mcansee && haseyes(mon->data) + ? "微笑みかけた" : "話しかけた"); +#endif /* doesn't anger it; no wakeup() */ sum[i] = damageum(mon, mattk); break; @@ -2011,23 +2500,47 @@ if (mon->data == &mons[PM_SHADE] && !(mattk->aatyp == AT_KICK && uarmf && uarmf->blessed)) { +/*JP Your("attack passes harmlessly through %s.", +*/ + Your("攻撃は%sをすっと通りぬけた.", mon_nam(mon)); break; } if (mattk->aatyp == AT_KICK) +/*JP You("kick %s.", mon_nam(mon)); +*/ + You("%sを蹴った.", mon_nam(mon)); else if (mattk->aatyp == AT_BITE) +/*JP You("bite %s.", mon_nam(mon)); +*/ + You("%sに噛みついた.", mon_nam(mon)); else if (mattk->aatyp == AT_STNG) +/*JP You("sting %s.", mon_nam(mon)); +*/ + You("%sを突きさした.", mon_nam(mon)); else if (mattk->aatyp == AT_BUTT) +/*JP You("butt %s.", mon_nam(mon)); +*/ + You("%sに頭突きをくらわした.", mon_nam(mon)); else if (mattk->aatyp == AT_TUCH) +/*JP You("touch %s.", mon_nam(mon)); +*/ + You("%sに触れた.", mon_nam(mon)); else if (mattk->aatyp == AT_TENT) +/*JP Your("tentacles suck %s.", mon_nam(mon)); +*/ + Your("触手が%sの体液を吸いとった.", mon_nam(mon)); +/*JP else You("hit %s.", mon_nam(mon)); +*/ + else Your("%sへの攻撃は命中した.", mon_nam(mon)); sum[i] = damageum(mon, mattk); } else missum(mon, mattk); @@ -2040,16 +2553,28 @@ dhit = 1; wakeup(mon); if (mon->data == &mons[PM_SHADE]) +/*JP Your("hug passes harmlessly through %s.", +*/ + You("%sを羽交い絞めにしようとしたが失敗した.", mon_nam(mon)); else if (!sticks(mon->data) && !u.uswallow) { if (mon==u.ustuck) { +#if 0 /*JP*/ pline("%s is being %s.", Monnam(mon), u.umonnum==PM_ROPE_GOLEM ? "choked": "crushed"); +#else + pline("%sは%s.", Monnam(mon), + u.umonnum==PM_ROPE_GOLEM ? "首を絞められている": + "押しつぶされている"); +#endif sum[i] = damageum(mon, mattk); } else if(i >= 2 && sum[i-1] && sum[i-2]) { +/*JP You("grab %s!", mon_nam(mon)); +*/ + You("%sをつかまえた!", mon_nam(mon)); u.ustuck = mon; sum[i] = damageum(mon, mattk); } @@ -2066,7 +2591,10 @@ if((dhit = (tmp > rnd(20+i)))) { wakeup(mon); if (mon->data == &mons[PM_SHADE]) +/*JP Your("attempt to surround %s is harmless.", +*/ + You("%sを飲みこもうとしたが失敗した.", mon_nam(mon)); else { sum[i]= gulpum(mon,mattk); @@ -2075,8 +2603,13 @@ mon->data->mlet == S_MUMMY) && rn2(5) && !Sick_resistance) { +#if 0 /*JP*/ You_feel("%ssick.", (Sick) ? "very " : ""); +#else + You_feel("%s気分が悪い.", + (Sick) ? "とても" : ""); +#endif mdamageu(mon, rnd(8)); } } @@ -2157,8 +2690,14 @@ case AD_ACID: if(mhit && rn2(2)) { +/*JP if (Blind || !flags.verbose) You("are splashed!"); +*/ + if (Blind || !flags.verbose) You("何かを浴びせられた!"); +/*JP else You("are splashed by %s acid!", +*/ + else You("%sの酸を浴びせられた!", s_suffix(mon_nam(mon))); if (!Acid_resistance) @@ -2191,7 +2730,10 @@ if (!Stone_resistance && !(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))) { +/*JP You("turn to stone..."); +*/ + You("石になった..."); done_in_by(mon); return 2; } @@ -2222,9 +2764,15 @@ /* wrath of gods for attacking Oracle */ if(Antimagic) { shieldeff(u.ux, u.uy); +/*JP pline("A hail of magic missiles narrowly misses you!"); +*/ + pline("魔法の矢の雨をなんとかかわした!"); } else { +/*JP You("are hit by magic missiles appearing from thin air!"); +*/ + pline("突如空中に現われた魔法の矢が命中した!"); mdamageu(mon, tmp); } break; @@ -2258,26 +2806,46 @@ break; } if(mon->mcansee) { +/*JP if (ureflects("%s gaze is reflected by your %s.", +*/ + if (ureflects("%sのにらみは%sによって反射された.", s_suffix(Monnam(mon)))) ; else if (Free_action) +/*JP You("momentarily stiffen under %s gaze!", +*/ + You("%sのにらみで一瞬硬直した!", s_suffix(mon_nam(mon))); else { +/*JP You("are frozen by %s gaze!", +*/ + You("%sのにらみで動けなくなった!", s_suffix(mon_nam(mon))); nomul((ACURR(A_WIS) > 12 || rn2(4)) ? -tmp : -127); } } else { +#if 0 /*JP*/ pline("%s cannot defend itself.", Adjmonnam(mon,"blind")); +#else + pline("%sは防御できない.", + Adjmonnam(mon,"目の見えない")); +#endif if(!rn2(500)) change_luck(-1); } } else if (Free_action) { +/*JP You("momentarily stiffen."); +*/ + You("一瞬硬直した."); } else { /* gelatinous cube */ +/*JP You("are frozen by %s!", mon_nam(mon)); +*/ + You("%sによって動けなくなった!", mon_nam(mon)); nomovemsg = 0; /* default: "you can move again" */ nomul(-tmp); exercise(A_DEX, FALSE); @@ -2287,11 +2855,17 @@ if(monnear(mon, u.ux, u.uy)) { if(Cold_resistance) { shieldeff(u.ux, u.uy); +/*JP You_feel("a mild chill."); +*/ + You("寒さを感じた."); ugolemeffects(AD_COLD, tmp); break; } +/*JP You("are suddenly very cold!"); +*/ + You("突然,猛烈に寒くなった!"); mdamageu(mon, tmp); /* monster gets stronger with your heat! */ mon->mhp += tmp / 2; @@ -2309,22 +2883,34 @@ if(monnear(mon, u.ux, u.uy)) { if(Fire_resistance) { shieldeff(u.ux, u.uy); +/*JP You_feel("mildly warm."); +*/ + You("暖かさを感じた."); ugolemeffects(AD_FIRE, tmp); break; } +/*JP You("are suddenly very hot!"); +*/ + You("突然,猛烈に熱くなった!"); mdamageu(mon, tmp); } break; case AD_ELEC: if(Shock_resistance) { shieldeff(u.ux, u.uy); +/*JP You_feel("a mild tingle."); +*/ + You("ピリピリと痺れを感じた."); ugolemeffects(AD_ELEC, tmp); break; } +/*JP You("are jolted with electricity!"); +*/ + You("電気ショックをうけた!"); mdamageu(mon, tmp); break; default: @@ -2385,7 +2971,10 @@ if (!mon->mcan) { if (drain_item(obj) && carried(obj) && (obj->known || obj->oclass == ARMOR_CLASS)) { +/*JP Your("%s less effective.", aobjnam(obj, "seem")); +*/ + Your("%sから魔力が消えた.", xname(obj)); } break; } @@ -2401,9 +2990,15 @@ stumble_onto_mimic(mtmp) struct monst *mtmp; { +#if 0 /*JP*/ const char *fmt = "Wait! That's %s!", *generic = "a monster", *what = 0; +#else + const char *fmt = "ちょっとまった!%sだ!", + *generic = "怪物", + *what = 0; +#endif if(!u.ustuck && !mtmp->mflee && dmgtype(mtmp->data,AD_STCK)) u.ustuck = mtmp; @@ -2419,10 +3014,16 @@ if (glyph_is_cmap(glyph) && (glyph_to_cmap(glyph) == S_hcdoor || glyph_to_cmap(glyph) == S_vcdoor)) +/*JP fmt = "The door actually was %s!"; +*/ + fmt = "扉は実際には%sだった!"; else if (glyph_is_object(glyph) && glyph_to_obj(glyph) == GOLD_PIECE) +/*JP fmt = "That gold was %s!"; +*/ + fmt = "金貨は%sだった!"; /* cloned Wiz starts out mimicking some other monster and might make himself invisible before being revealed */ @@ -2445,14 +3046,26 @@ if (!u.umconf || mon->mconf) return; if (u.umconf == 1) { if (Blind) +/*JP Your("%s stop tingling.", hands); +*/ + Your("%sの痺れがとれた.", hands); else +/*JP Your("%s stop glowing %s.", hands, hcolor(NH_RED)); +*/ + Your("%sの%s輝きはなくなった.", hands, hcolor(NH_RED)); } else { if (Blind) +/*JP pline_The("tingling in your %s lessens.", hands); +*/ + pline("%sの痺れがとれてきた.",hands); else +/*JP Your("%s no longer glow so brightly %s.", hands, +*/ + Your("%sの%s輝きがなくなってきた.",hands, hcolor(NH_RED)); } u.umconf--; @@ -2468,22 +3081,33 @@ if (mtmp->msleeping) { mtmp->msleeping = 0; if (useeit) { +/*JP pline_The("flash awakens %s.", mon_nam(mtmp)); +*/ + pline("閃光で%sが目を覚ました.", mon_nam(mtmp)); res = 1; } } else if (mtmp->data->mlet != S_LIGHT) { if (!resists_blnd(mtmp)) { tmp = dist2(otmp->ox, otmp->oy, mtmp->mx, mtmp->my); if (useeit) { +/*JP pline("%s is blinded by the flash!", Monnam(mtmp)); +*/ + pline("%sは閃光で目が見えなくなった!", Monnam(mtmp)); res = 1; } if (mtmp->data == &mons[PM_GREMLIN]) { /* Rule #1: Keep them out of the light. */ amt = otmp->otyp == WAN_LIGHT ? d(1 + otmp->spe, 4) : rn2(min(mtmp->mhp,4)); +#if 0 /*JP*/ pline("%s %s!", Monnam(mtmp), amt > mtmp->mhp / 2 ? "wails in agony" : "cries out in pain"); +#else + pline("%sは%s!", Monnam(mtmp), amt > mtmp->mhp / 2 ? + "苦痛の声をあげた" : "激痛で叫んだ"); +#endif if ((mtmp->mhp -= amt) <= 0) { if (flags.mon_moving) monkilled(mtmp, (char *)0, AD_BLND); diff -aurbN -xCVS -xXTAGS nethack/src/vault.c jnethack/src/vault.c --- nethack/src/vault.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/vault.c 2004-08-02 05:06:58.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "vault.h" @@ -53,8 +60,14 @@ EGD(grd)->fcbeg++; } if(grd->mhp <= 0) { +/*JP pline_The("corridor disappears."); +*/ + pline("通路は消えた."); +/*JP if(IS_ROCK(levl[u.ux][u.uy].typ)) You("are encased in rock."); +*/ + if(IS_ROCK(levl[u.ux][u.uy].typ)) You("石につつまれた."); } return(TRUE); } @@ -236,17 +249,30 @@ reset_faint(); /* if fainted - wake up */ if (canspotmon(guard)) +#if 0 /*JP*/ pline("Suddenly one of the Vault's %s enters!", makeplural(g_monnam(guard))); +#else + pline("突然,倉庫の番兵が入ってきた!"); +#endif else +/*JP pline("Someone else has entered the Vault."); +*/ + pline("誰かが倉庫に入ってきた."); newsym(guard->mx,guard->my); if (youmonst.m_ap_type == M_AP_OBJECT || u.uundetected) { if (youmonst.m_ap_type == M_AP_OBJECT && youmonst.mappearance != GOLD_PIECE) +/*JP verbalize("Hey! Who left that %s in here?", mimic_obj_name(&youmonst)); +*/ + verbalize("おい!だれがこの%sをここに置いて行ったんだ?", mimic_obj_name(&youmonst)); /* You're mimicking some object or you're hidden. */ +/*JP pline("Puzzled, %s turns around and leaves.", mhe(guard)); +*/ + pline("%sは困惑しながら,向き直って去っていった.", mhe(guard)); mongone(guard); return; } @@ -254,7 +280,10 @@ /* [we ought to record whether this this message has already been given in order to vary it upon repeat visits, but discarding the monster and its egd data renders that hard] */ +/*JP verbalize("I'll be back when you're ready to speak to me!"); +*/ + verbalize("話せるようになったら戻ってきてやる!"); mongone(guard); return; } @@ -263,9 +292,16 @@ if (multi > 0) { nomul(0); unmul((char *)0); } trycount = 5; do { +/*JP getlin("\"Hello stranger, who are you?\" -", buf); +*/ + getlin("「見ない顔だな,おまえは誰だ?」-", buf); (void) mungspaces(buf); +#if 0 /*JP*/ } while (!letter(buf[0]) && --trycount > 0); +#else + } while (!letter(buf[0]) && !is_kanji(buf[0]) && --trycount > 0); +#endif if (u.ualign.type == A_LAWFUL && /* ignore trailing text, in case player includes character's rank */ @@ -273,17 +309,31 @@ adjalign(-1); /* Liar! */ } +#if 0 /*JP*/ if (!strcmpi(buf, "Croesus") || !strcmpi(buf, "Kroisos") +#else + if (!strcmpi(buf, "Croesus") || !strcmpi(buf, "Kroisos") || !strcmp(buf, "クロイソス") +#endif #ifdef TOURIST +#if 0 /*JP*/ || !strcmpi(buf, "Creosote") +#else + || !strcmpi(buf, "Creosote") || !strcmp(buf, "クレオソート") +#endif #endif ) { if (!mvitals[PM_CROESUS].died) { +/*JP verbalize("Oh, yes, of course. Sorry to have disturbed you."); +*/ + verbalize("いや,こりゃ,えーと,お騒がせした."); mongone(guard); } else { setmangry(guard); +/*JP verbalize("Back from the dead, are you? I'll remedy that!"); +*/ + verbalize("ほう!死の世界から戻ってきたのか?うそなら上手につけ!"); /* don't want guard to waste next turn wielding a weapon */ if (!MON_WEP(guard)) { guard->weapon_check = NEED_HTH_WEAPON; @@ -292,25 +342,52 @@ } return; } +/*JP verbalize("I don't know you."); +*/ + verbalize("知らんな."); #ifndef GOLDOBJ if (!u.ugold && !hidden_gold()) +/*JP verbalize("Please follow me."); +*/ + verbalize("私の後についてきなさい."); else { if (!u.ugold) +/*JP verbalize("You have hidden gold."); +*/ + verbalize("まだ金貨を隠してるな."); +/*JP verbalize("Most likely all your gold was stolen from this vault."); +*/ + verbalize("倉庫から盗んだ金貨があるだろう."); +/*JP verbalize("Please drop that gold and follow me."); +*/ + verbalize("それをそっくり戻してから,私の後についてきなさい."); } #else umoney = money_cnt(invent); if (!umoney && !hidden_gold()) +/*JP verbalize("Please follow me."); +*/ + verbalize("私の後についてきなさい."); else { if (!umoney) +/*JP verbalize("You have hidden money."); +*/ + verbalize("まだお金を隠してるな."); +/*JP verbalize("Most likely all your money was stolen from this vault."); +*/ + verbalize("倉庫から盗んだお金があるだろう."); +/*JP verbalize("Please drop that money and follow me."); +*/ + verbalize("それをそっくり戻してから,私の後についてきなさい."); } #endif EGD(guard)->gdx = gx; @@ -421,12 +498,24 @@ if(movedgold || fixed) { if(in_fcorridor(grd, grd->mx, grd->my) || cansee(grd->mx, grd->my)) +/*JP pline_The("%s whispers an incantation.", g_monnam(grd)); +*/ + pline("%sは呪文をささやいた.", g_monnam(grd)); +/*JP else You_hear("a distant chant."); +*/ + else You_hear("遠方での呪文を聞いた."); if(movedgold) +/*JP pline("A mysterious force moves the gold into the vault."); +*/ + pline("神秘的な力が金貨を倉庫へ運んだ."); if(fixed) +/*JP pline_The("damaged vault's walls are magically restored!"); +*/ + pline("傷ついた倉庫の壁は魔法で復元された!"); } } @@ -485,21 +574,37 @@ if(u_in_vault && (u_carry_gold || um_dist(grd->mx, grd->my, 1))) { if(egrd->warncnt == 3) +/*JP verbalize("I repeat, %sfollow me!", +*/ + verbalize("繰り返す!%s私についてこい!", u_carry_gold ? ( #ifndef GOLDOBJ !u.ugold ? +#if 0 /*JP*/ "drop that hidden gold and " : "drop that gold and ") : ""); #else + "隠し持ってる金貨を置いて" : + "金貨を置いて") : ""); +#endif +#else !umoney ? +#if 0 /*JP*/ "drop that hidden money and " : "drop that money and ") : ""); +#else + "隠し持ってるお金を置いて" : + "お金を置いて") : ""); +#endif #endif if(egrd->warncnt == 7) { m = grd->mx; n = grd->my; +/*JP verbalize("You've been warned, knave!"); +*/ + verbalize("警告はしたぞ,悪党め!"); mnexto(grd); levl[m][n].typ = egrd->fakecorr[0].ftyp; newsym(m,n); @@ -521,15 +626,26 @@ grd->mpeaceful = 0; letknow: if (!cansee(grd->mx, grd->my) || !mon_visible(grd)) +/*JP You_hear("the shrill sound of a guard's whistle."); +*/ + You_hear("番兵の鋭い笛の音を聞いた."); else You(um_dist(grd->mx, grd->my, 2) ? +#if 0 /*JP*/ "see an angry %s approaching." : "are confronted by an angry %s.", +#else + "怒った%sが近づいてくるのを見た." : + "怒った%sと対峙した.", +#endif g_monnam(grd)); return(-1); } else { +/*JP verbalize("Well, begone."); +*/ + verbalize("立ち去れ."); wallify_vault(grd); egrd->gddone = 1; goto cleanup; @@ -542,7 +658,10 @@ !egrd->gddone && !in_fcorridor(grd, u.ux, u.uy) && levl[egrd->fakecorr[0].fx][egrd->fakecorr[0].fy].typ == egrd->fakecorr[0].ftyp) { +/*JP pline_The("%s, confused, disappears.", g_monnam(grd)); +*/ + pline("%sは混乱し,消えた.", g_monnam(grd)); disappear_msg_seen = TRUE; goto cleanup; } @@ -556,10 +675,16 @@ } if(egrd->warncnt < 6) { egrd->warncnt = 6; +/*JP verbalize("Drop all your gold, scoundrel!"); +*/ + verbalize("金を全部置いてゆけ,ならずもの!"); return(0); } else { +/*JP verbalize("So be it, rogue!"); +*/ + verbalize("盗人め!"); grd->mpeaceful = 0; return(-1); } @@ -590,7 +715,10 @@ } else { /* just for insurance... */ if (MON_AT(m, n) && m != grd->mx && n != grd->my) { +/*JP verbalize("Out of my way, scum!"); +*/ + verbalize("目の前から消えろ,クソったれ!"); (void) rloc(m_at(m, n), FALSE); } remove_monster(grd->mx, grd->my); @@ -599,8 +727,13 @@ mpickgold(grd); /* does a newsym */ } if(cansee(m,n)) +#if 0 /*JP*/ pline("%s%s picks up the gold.", Monnam(grd), grd->mpeaceful ? " calms down and" : ""); +#else + pline("%sは%s金貨を拾った.", Monnam(grd), + grd->mpeaceful ? "怒りを静め" : ""); +#endif if(x != grd->mx || y != grd->my) { remove_monster(grd->mx, grd->my); newsym(grd->mx, grd->my); @@ -614,7 +747,10 @@ } } if(um_dist(grd->mx, grd->my, 1) || egrd->gddone) { +/*JP if(!egrd->gddone && !rn2(10)) verbalize("Move along!"); +*/ + if(!egrd->gddone && !rn2(10)) verbalize("離れるな!"); restfakecorr(grd); return(0); /* didn't move */ } @@ -723,7 +859,10 @@ if(!semi_dead && (in_fcorridor(grd, u.ux, u.uy) || cansee(x, y))) { if (!disappear_msg_seen && see_guard) +/*JP pline("Suddenly, the %s disappears.", g_monnam(grd)); +*/ + pline("突然,%sは消えた.", g_monnam(grd)); return(1); } return(-2); @@ -758,7 +897,10 @@ #endif if (u.uinvault) { +/*JP Your("%ld %s goes into the Magic Memory Vault.", +*/ + Your("%ld%sは魔法記念倉庫に入った.", #ifndef GOLDOBJ u.ugold, currency(u.ugold)); @@ -774,12 +916,20 @@ return; } mnexto(grd); +/*JP pline("%s remits your gold to the vault.", Monnam(grd)); +*/ + pline("%sはあなたの金貨を倉庫に送った.", Monnam(grd)); gx = rooms[EGD(grd)->vroom].lx + rn2(2); gy = rooms[EGD(grd)->vroom].ly + rn2(2); Sprintf(buf, +#if 0 /*JP*/ "To Croesus: here's the gold recovered from %s the %s.", plname, mons[u.umonster].mname); +#else + "クロイソスへ: ここに%sの%sから取り戻した金貨を送る.", + jtrns_mon(mons[u.umonster].mname), plname ); +#endif make_grave(gx, gy, buf); } #ifndef GOLDOBJ diff -aurbN -xCVS -xXTAGS nethack/src/version.c jnethack/src/version.c --- nethack/src/version.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/version.c 2003-12-10 03:32:18.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "date.h" /* @@ -10,8 +17,10 @@ */ #ifdef SHORT_FILENAMES #include "patchlev.h" +#include "../japanese/jpatchle.h" #else #include "patchlevel.h" +#include "../japanese/jpatchlevel.h" #endif /* #define BETA_INFO "" */ /* "[ beta n]" */ @@ -45,6 +54,7 @@ char buf[BUFSZ]; pline("%s", getversionstring(buf)); + pline(JVERSION_ID); return 0; } diff -aurbN -xCVS -xXTAGS nethack/src/weapon.c jnethack/src/weapon.c --- nethack/src/weapon.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/weapon.c 2003-12-16 18:38:36.000000000 +0900 @@ -7,6 +7,15 @@ * bonuses for any given weapon used, as well as weapons selection * code for monsters. */ + +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** changing point is marked `JP' (94/6/7) +** For 3.4.0, Copyright (c) Kentaro Shirakata, 2002 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" /* Categories whose names don't come from OBJ_NAME(objects[type]) @@ -82,6 +91,7 @@ give_may_advance_msg(skill) int skill; { +#if 0 /*JP*/ You_feel("more confident in your %sskills.", skill == P_NONE ? "" : @@ -90,6 +100,16 @@ skill <= P_LAST_SPELL ? "spell casting " : "fighting "); +#else + You("%sスキルを高める自信が湧いてきた.", + skill == P_NONE ? + "" : + skill <= P_LAST_WEAPON ? + "武器の" : + skill <= P_LAST_SPELL ? + "魔法の" : + "戦いの"); +#endif } #endif /* OVLB */ @@ -106,11 +126,20 @@ #endif /* OVL1 */ +#if 0 /*JP*/ #define P_NAME(type) ((skill_names_indices[type] > 0) ? \ OBJ_NAME(objects[skill_names_indices[type]]) : \ (type == P_BARE_HANDED_COMBAT) ? \ barehands_or_martial[martial_bonus()] : \ odd_skill_names[-skill_names_indices[type]]) +#else +#define PP_NAME(type) ((skill_names_indices[type] > 0) ? \ + OBJ_NAME(objects[skill_names_indices[type]]) : \ + (type == P_BARE_HANDED_COMBAT) ? \ + barehands_or_martial[martial_bonus()] : \ + odd_skill_names[-skill_names_indices[type]]) +#define P_NAME(type) jtrns_obj('K', PP_NAME(type)) +#endif #ifdef OVLB static NEARDATA const char kebabable[] = { @@ -544,12 +573,18 @@ mon->weapon_check = NO_WEAPON_WANTED; obj_extract_self(obj); if (cansee(mon->mx, mon->my)) { +/*JP pline("%s drops %s.", Monnam(mon), +*/ + pline("%sは%sを置いた.", Monnam(mon), distant_name(obj, doname)); newsym(mon->mx, mon->my); } /* might be dropping object into water or lava */ +/*JP if (!flooreffects(obj, mon->mx, mon->my, "drop")) { +*/ + if (!flooreffects(obj, mon->mx, mon->my, "落ちる")) { if (polyspot) bypass_obj(obj); place_object(obj, mon->mx, mon->my); stackobj(obj); @@ -632,26 +667,50 @@ */ if (mw_tmp && mw_tmp->cursed && mw_tmp->otyp != CORPSE) { if (canseemon(mon)) { +#if 0 /*JP*/ char welded_buf[BUFSZ]; +#endif const char *mon_hand = mbodypart(mon, HAND); if (bimanual(mw_tmp)) mon_hand = makeplural(mon_hand); +#if 0 /*JP*/ Sprintf(welded_buf, "%s welded to %s %s", otense(mw_tmp, "are"), mhis(mon), mon_hand); +#endif if (obj->otyp == PICK_AXE) { +#if 0 /*JP*/ pline("Since %s weapon%s %s,", s_suffix(mon_nam(mon)), plur(mw_tmp->quan), welded_buf); +#else + pline("%sは武器を手にしようとしたが,", + mon_nam(mon)); +#endif +#if 0 /*JP*/ pline("%s cannot wield that %s.", mon_nam(mon), xname(obj)); +#else + pline("%sは%sを装備できなかった.", + mon_nam(mon), xname(obj)); +#endif } else { +#if 0 /*JP*/ pline("%s tries to wield %s.", Monnam(mon), doname(obj)); +#else + pline("%sは%sを装備しようとした.", Monnam(mon), + doname(obj)); +#endif +#if 0 /*JP*/ pline("%s %s %s!", s_suffix(Monnam(mon)), xname(mw_tmp), welded_buf); +#else + pline("%sは%sを手にした!", + Monnam(mon), xname(mw_tmp)); +#endif } mw_tmp->bknown = 1; } @@ -662,21 +721,36 @@ setmnotwielded(mon, mw_tmp); mon->weapon_check = NEED_WEAPON; if (canseemon(mon)) { +/*JP pline("%s wields %s!", Monnam(mon), doname(obj)); +*/ + pline("%sは%sを装備した!", Monnam(mon), doname(obj)); if (obj->cursed && obj->otyp != CORPSE) { +#if 0 /*JP*/ pline("%s %s to %s %s!", Tobjnam(obj, "weld"), is_plural(obj) ? "themselves" : "itself", s_suffix(mon_nam(mon)), mbodypart(mon,HAND)); +#else + pline("%sは勝手に%sの%sに装備された!", + xname(obj), + mon_nam(mon), mbodypart(mon,HAND)); +#endif obj->bknown = 1; } } if (artifact_light(obj) && !obj->lamplit) { begin_burn(obj, FALSE); if (canseemon(mon)) +#if 0 /*JP*/ pline("%s brilliantly in %s %s!", Tobjnam(obj, "glow"), s_suffix(mon_nam(mon)), mbodypart(mon,HAND)); +#else + pline("%sは%sの%sの中で輝いた!", + xname(obj), + mon_nam(mon), mbodypart(mon,HAND)); +#endif } obj->owornmask = W_WEP; return 1; @@ -739,6 +813,7 @@ const char *ptr; switch (P_SKILL(skill)) { +#if 0 /*JP*/ case P_UNSKILLED: ptr = "Unskilled"; break; case P_BASIC: ptr = "Basic"; break; case P_SKILLED: ptr = "Skilled"; break; @@ -747,6 +822,16 @@ case P_MASTER: ptr = "Master"; break; case P_GRAND_MASTER: ptr = "Grand Master"; break; default: ptr = "Unknown"; break; +#else + case P_UNSKILLED: ptr = "初心者"; break; + case P_BASIC: ptr = "入門者"; break; + case P_SKILLED: ptr = "熟練者"; break; + case P_EXPERT: ptr = "エキスパート"; break; + /* these are for unarmed combat/martial arts only */ + case P_MASTER: ptr = "マスター"; break; + case P_GRAND_MASTER: ptr = "グランドマスター"; break; + default: ptr = "不明"; break; +#endif } Strcpy(buf, ptr); return buf; @@ -827,18 +912,33 @@ P_SKILL(skill)++; u.skill_record[u.skills_advanced++] = skill; /* subtly change the advance message to indicate no more advancement */ +#if 0 /*JP*/ You("are now %s skilled in %s.", P_SKILL(skill) >= P_MAX_SKILL(skill) ? "most" : "more", P_NAME(skill)); +#else + Your("%sのスキルを%s高めた.", + jtrns_obj(')', P_NAME(skill)), + P_SKILL(skill) >= P_MAX_SKILL(skill) ? "最高に" : "さらに"); +#endif } const static struct skill_range { short first, last; const char *name; } skill_ranges[] = { +/*JP { P_FIRST_H_TO_H, P_LAST_H_TO_H, "Fighting Skills" }, +*/ + { P_FIRST_H_TO_H, P_LAST_H_TO_H, "戦いのスキル" }, +/*JP { P_FIRST_WEAPON, P_LAST_WEAPON, "Weapon Skills" }, +*/ + { P_FIRST_WEAPON, P_LAST_WEAPON, "武器のスキル" }, +/*JP { P_FIRST_SPELL, P_LAST_SPELL, "Spellcasting Skills" }, +*/ + { P_FIRST_SPELL, P_LAST_SPELL, "魔法のスキル" }, }; /* @@ -886,19 +986,32 @@ if (eventually_advance > 0 || maxxed_cnt > 0) { any.a_void = 0; if (eventually_advance > 0) { +#if 0 /*JP*/ Sprintf(buf, "(Skill%s flagged by \"*\" may be enhanced %s.)", plur(eventually_advance), (u.ulevel < MAXULEV) ? "when you're more experienced" : "if skill slots become available"); +#else + Sprintf(buf, + "(\"*\"がついているスキルは%s高められる.)", + (u.ulevel < MAXULEV) ? + "もっと経験をつめば" : + "スキルスロットが使えるようになれば"); +#endif add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); } if (maxxed_cnt > 0) { +#if 0 /*JP*/ Sprintf(buf, "(Skill%s flagged by \"#\" cannot be enhanced any further.)", plur(maxxed_cnt)); +#else + Sprintf(buf, + "(\"#\"がついているスキルはこれ以上高められない.)"); +#endif add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); } @@ -964,8 +1077,13 @@ buf, MENU_UNSELECTED); } +#if 0 /*JP*/ Strcpy(buf, (to_advance > 0) ? "Pick a skill to advance:" : "Current skills:"); +#else + Strcpy(buf, (to_advance > 0) ? "スキルを選択してください:" : + "現在のスキル:"); +#endif #ifdef WIZARD if (wizard && !speedy) Sprintf(eos(buf), " (%d slot%s available)", @@ -981,7 +1099,10 @@ /* check for more skills able to advance, if so then .. */ for (n = i = 0; i < P_NUM_SKILLS; i++) { if (can_advance(i, speedy)) { +/*JP if (!speedy) You_feel("you could be more dangerous!"); +*/ + if (!speedy) You("さらにスキルを高めることができそうな気がした!"); n++; break; } @@ -1307,9 +1428,14 @@ if (artifact_light(obj) && obj->lamplit) { end_burn(obj, FALSE); if (canseemon(mon)) +#if 0 /*JP*/ pline("%s in %s %s %s glowing.", The(xname(obj)), s_suffix(mon_nam(mon)), mbodypart(mon,HAND), otense(obj, "stop")); +#else + pline("%sが持つ%sの輝きが消えた.", + mon_nam(mon), xname(obj)); +#endif } obj->owornmask &= ~W_WEP; } diff -aurbN -xCVS -xXTAGS nethack/src/were.c jnethack/src/were.c --- nethack/src/were.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/were.c 2003-12-10 03:32:19.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #ifdef OVL0 @@ -22,12 +29,20 @@ const char *howler; switch (monsndx(mon->data)) { +#if 0 /*JP*/ case PM_WEREWOLF: howler = "wolf"; break; case PM_WEREJACKAL: howler = "jackal"; break; +#else + case PM_WEREWOLF: howler = "狼"; break; + case PM_WEREJACKAL: howler = "ジャッカル";break; +#endif default: howler = (char *)0; break; } if (howler) +/*JP You_hear("a %s howling at the moon.", howler); +*/ + You_hear("月夜に%sが吠える声を聞いた.", howler); } } } else if (!rn2(30) || Protection_from_shape_changers) { @@ -68,9 +83,15 @@ } if(canseemon(mon) && !Hallucination) +#if 0 /*JP*/ pline("%s changes into a %s.", Monnam(mon), is_human(&mons[pm]) ? "human" : mons[pm].mname+4); +#else + pline("%sは%sの姿になった.", Monnam(mon), + is_human(&mons[pm]) ? "人間" : + jtrns_mon(mons[pm].mname + 4)); +#endif set_mon_data(mon, &mons[pm], 0); if (mon->msleeping || !mon->mcanmove) { @@ -140,8 +161,13 @@ if (Unchanging || (u.umonnum == u.ulycn)) return; if (Polymorph_control) { /* `+4' => skip "were" prefix to get name of beast */ +#if 0 /*JP*/ Sprintf(qbuf, "Do you want to change into %s? ", an(mons[u.ulycn].mname+4)); +#else + Sprintf(qbuf,"%sに変化しますか?", + jtrns_mon(mons[u.ulycn].mname + 4)); +#endif if(yn(qbuf) == 'n') return; } (void) polymon(u.ulycn); @@ -152,11 +178,18 @@ boolean purify; { if (purify) { +/*JP You_feel("purified."); +*/ + You("浄められたような気がした."); u.ulycn = NON_PM; /* cure lycanthropy */ } if (!Unchanging && is_were(youmonst.data) && +#if 0 /*JP*/ (!Polymorph_control || yn("Remain in beast form?") == 'n')) +#else + (!Polymorph_control || yn("元の姿に戻る?") == 'n')) +#endif rehumanize(); } diff -aurbN -xCVS -xXTAGS nethack/src/wield.c jnethack/src/wield.c --- nethack/src/wield.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/wield.c 2005-04-26 18:35:41.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" /* KMH -- Differences between the three weapon slots. @@ -93,7 +100,10 @@ setworn(obj, W_WEP); if (uwep == obj && artifact_light(olduwep) && olduwep->lamplit) { end_burn(olduwep, FALSE); +/*JP if (!Blind) pline("%s glowing.", Tobjnam(olduwep, "stop")); +*/ + if (!Blind) pline("%sは輝きを止めた.", xname(olduwep)); } /* Note: Explicitly wielding a pick-axe will not give a "bashing" * message. Wielding one via 'a'pplying it will. @@ -122,39 +132,68 @@ if (!wep) { /* No weapon */ if (uwep) { +/*JP You("are empty %s.", body_part(HANDED)); +*/ + You("%sを空けた.", body_part(HAND)); setuwep((struct obj *) 0); res++; } else +/*JP You("are already empty %s.", body_part(HANDED)); +*/ + You("何も%sにしていない!", body_part(HAND)); } else if (!uarmg && !Stone_resistance && wep->otyp == CORPSE && touch_petrifies(&mons[wep->corpsenm])) { /* Prevent wielding cockatrice when not wearing gloves --KAA */ char kbuf[BUFSZ]; +#if 0 /*JP*/ You("wield the %s corpse in your bare %s.", mons[wep->corpsenm].mname, makeplural(body_part(HAND))); +#else + You("%sの死体を%sにした.", + jtrns_mon(mons[wep->corpsenm].mname), makeplural(body_part(HAND))); +#endif +/*JP Sprintf(kbuf, "%s corpse", an(mons[wep->corpsenm].mname)); +*/ + Sprintf(kbuf, "%sの死体に触れて", jtrns_mon(mons[wep->corpsenm].mname)); instapetrify(kbuf); } else if (uarms && bimanual(wep)) +#if 0 /*JP*/ You("cannot wield a two-handed %s while wearing a shield.", is_sword(wep) ? "sword" : wep->otyp == BATTLE_AXE ? "axe" : "weapon"); +#else + pline("盾を装備しているときに両手持ちの%sを装備できない.", + is_sword(wep) ? "剣" : + wep->otyp == BATTLE_AXE ? "斧" : "武器"); +#endif else if (wep->oartifact && !touch_artifact(wep, &youmonst)) { res++; /* takes a turn even though it doesn't get wielded */ } else { /* Weapon WILL be wielded after this point */ res++; if (will_weld(wep)) { +/*JP const char *tmp = xname(wep), *thestr = "The "; +*/ + const char *tmp = xname(wep), *thestr = ""; if (strncmp(tmp, thestr, 4) && !strncmp(The(tmp),thestr,4)) tmp = thestr; else tmp = ""; +#if 0 /*JP*/ pline("%s%s %s to your %s!", tmp, aobjnam(wep, "weld"), (wep->quan == 1L) ? "itself" : "themselves", /* a3 */ bimanual(wep) ? (const char *)makeplural(body_part(HAND)) : body_part(HAND)); +#else + pline("%sは勝手にあなたの%sに装備された.", + xname(wep), + body_part(HAND)); +#endif wep->bknown = TRUE; } else { /* The message must be printed before setuwep (since @@ -176,7 +215,10 @@ if (artifact_light(wep) && !wep->lamplit) { begin_burn(wep, FALSE); if (!Blind) +/*JP pline("%s to glow brilliantly!", Tobjnam(wep, "begin")); +*/ + pline("%sが光り輝きはじめた!", xname(wep)); } #if 0 @@ -194,7 +236,10 @@ if ((this_shkp = shop_keeper(inside_shop(u.ux, u.uy))) != (struct monst *)0) { +/*JP pline("%s says \"You be careful with my %s!\"", +*/ + pline("%sは述べた「%sの扱いは気をつけてくれよ!」", shkname(this_shkp), xname(wep)); } @@ -238,7 +283,10 @@ /* May we attempt this? */ multi = 0; if (cantwield(youmonst.data)) { +/*JP pline("Don't be ridiculous!"); +*/ + pline("ばかばかしい!"); return(0); } @@ -247,7 +295,10 @@ /* Cancelled */ return (0); else if (wep == uwep) { +/*JP You("are already wielding that!"); +*/ + You("もうそれを%sにしている!", body_part(HAND)); if (is_weptool(wep)) unweapon = FALSE; /* [see setuwep()] */ return (0); } else if (welded(uwep)) { @@ -269,7 +320,10 @@ | W_SADDLE #endif )) { +/*JP You("cannot wield that!"); +*/ + You("それを装備できない!"); return (0); } @@ -293,7 +347,10 @@ /* May we attempt this? */ multi = 0; if (cantwield(youmonst.data)) { +/*JP pline("Don't be ridiculous!"); +*/ + pline("ばかばかしい!"); return(0); } if (welded(uwep)) { @@ -318,7 +375,10 @@ if (uswapwep) prinv((char *)0, uswapwep, 0L); else +/*JP You("have no secondary weapon readied."); +*/ + You("予備の武器の用意をやめた."); } if (u.twoweap && !can_twoweapon()) @@ -341,7 +401,10 @@ /* Because 'Q' used to be quit... */ if (flags.suppress_alert < FEATURE_NOTICE_VER(3,3,0)) +/*JP pline("Note: Please use #quit if you wish to exit the game."); +*/ + pline("注意:ゲームを終了するときは #quitコマンドを使うこと."); /* Prompt for a new quiver */ if (!(newquiver = getobj(quivee_types, "ready"))) @@ -353,26 +416,42 @@ if (newquiver == &zeroobj) { /* Explicitly nothing */ if (uquiver) { +/*JP You("now have no ammunition readied."); +*/ + pline("装填するための矢玉がなくなった."); setuqwep(newquiver = (struct obj *) 0); } else { +/*JP You("already have no ammunition readied!"); +*/ + pline("装填するための矢玉がない."); return(0); } } else if (newquiver == uquiver) { +/*JP pline("That ammunition is already readied!"); +*/ + pline("もう装填されている!"); return(0); } else if (newquiver == uwep) { /* Prevent accidentally readying the main weapon */ +#if 0 /*JP*/ pline("%s already being used as a weapon!", !is_plural(uwep) ? "That is" : "They are"); +#else + pline("もう武器として使われている!"); +#endif return(0); } else if (newquiver->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL #ifdef STEED | W_SADDLE #endif )) { +/*JP You("cannot ready that!"); +*/ + You("それは使えない!"); return (0); } else { long dummy; @@ -404,27 +483,40 @@ struct obj *obj; const char *verb; /* "rub",&c */ { + /*JP 日本語では verb は未使用 */ const char *what; +#if 0 /*JP*/ boolean more_than_1; +#endif if (obj == uwep) return TRUE; /* nothing to do if already wielding it */ +#if 0 /*JP*/ if (!verb) verb = "wield"; +#endif what = xname(obj); +#if 0 /*JP*/ more_than_1 = (obj->quan > 1L || strstri(what, "pair of ") != 0 || strstri(what, "s of ") != 0); +#endif if (obj->owornmask & (W_ARMOR|W_RING|W_AMUL|W_TOOL)) { char yourbuf[BUFSZ]; +#if 0 /*JP:T*/ You_cant("%s %s %s while wearing %s.", verb, shk_your(yourbuf, obj), what, more_than_1 ? "them" : "it"); +#else + pline("身につけたままでは%s%sは使えない.", + shk_your(yourbuf, obj), what); +#endif return FALSE; } if (welded(uwep)) { if (flags.verbose) { +#if 0 /*JP*/ const char *hand = body_part(HAND); if (bimanual(uwep)) hand = makeplural(hand); @@ -432,19 +524,33 @@ pline( "Since your weapon is welded to your %s, you cannot %s %s %s.", hand, verb, more_than_1 ? "those" : "that", xname(obj)); +#else + pline("武器を手にしているので,%sを使えない.", xname(obj)); +#endif } else { +/*JP You_cant("do that."); +*/ + pline("それはできない."); } return FALSE; } if (cantwield(youmonst.data)) { +/*JP You_cant("hold %s strongly enough.", more_than_1 ? "them" : "it"); +*/ + You("それを持つほど力がない."); return FALSE; } /* check shield */ if (uarms && bimanual(obj)) { +#if 0 /*JP*/ You("cannot %s a two-handed %s while wearing a shield.", verb, (obj->oclass == WEAPON_CLASS) ? "weapon" : "tool"); +#else + pline("盾を装備したまま両手持ちの%sを装備できない.", + (obj->oclass == WEAPON_CLASS) ? "武器" : "道具"); +#endif return FALSE; } if (uquiver == obj) setuqwep((struct obj *)0); @@ -453,7 +559,10 @@ /* doswapweapon might fail */ if (uswapwep == obj) return FALSE; } else { +/*JP You("now wield %s.", doname(obj)); +*/ + You("%sを装備した.", doname(obj)); setuwep(obj); } if (uwep != obj) return FALSE; /* rewielded old object after dying */ @@ -473,33 +582,69 @@ #define NOT_WEAPON(obj) (!is_weptool(obj) && obj->oclass != WEAPON_CLASS) if (!could_twoweap(youmonst.data)) { if (Upolyd) +/*JP You_cant("use two weapons in your current form."); +*/ + You("二刀流は通常の姿でのみ使用できる."); else +#if 0 /*JP*/ pline("%s aren't able to use two weapons at once.", makeplural((flags.female && urole.name.f) ? urole.name.f : urole.name.m)); +#else + pline("%sは二つの武器を同時に扱えない.", + makeplural((flags.female && urole.name.f) ? + urole.name.f : urole.name.m)); +#endif } else if (!uwep || !uswapwep) +#if 0 /*JP*/ Your("%s%s%s empty.", uwep ? "left " : uswapwep ? "right " : "", body_part(HAND), (!uwep && !uswapwep) ? "s are" : " is"); +#else + Your("%s%sは空っぽだ.", uwep ? "左の" : uswapwep ? "右の" : "", + body_part(HAND)); +#endif else if (NOT_WEAPON(uwep) || NOT_WEAPON(uswapwep)) { otmp = NOT_WEAPON(uwep) ? uwep : uswapwep; +#if 0 /*JP:T*/ pline("%s %s.", Yname2(otmp), is_plural(otmp) ? "aren't weapons" : "isn't a weapon"); +#else + pline("%sは武器じゃない.", Yname2(otmp)); +#endif } else if (bimanual(uwep) || bimanual(uswapwep)) { otmp = bimanual(uwep) ? uwep : uswapwep; +/*JP pline("%s isn't one-handed.", Yname2(otmp)); +*/ + pline("%sは片手持ちの武器じゃない.", Yname2(otmp)); } else if (uarms) +/*JP You_cant("use two weapons while wearing a shield."); +*/ + You("盾を持っている間は両手持ちできない."); else if (uswapwep->oartifact) +#if 0 /*JP*/ pline("%s %s being held second to another weapon!", Yname2(uswapwep), otense(uswapwep, "resist")); +#else + pline("%sは予備の武器として扱われることを拒んだ!", Yname2(uswapwep)); +#endif else if (!uarmg && !Stone_resistance && (uswapwep->otyp == CORPSE && touch_petrifies(&mons[uswapwep->corpsenm]))) { char kbuf[BUFSZ]; +#if 0 /*JP*/ You("wield the %s corpse with your bare %s.", mons[uswapwep->corpsenm].mname, body_part(HAND)); +#else + You("%sを素%sで掴んだ.", + jtrns_mon(mons[uswapwep->corpsenm].mname), body_part(HAND)); +#endif +/*JP Sprintf(kbuf, "%s corpse", an(mons[uswapwep->corpsenm].mname)); +*/ + Sprintf(kbuf, "%sの死体に触れて", jtrns_mon(mons[uswapwep->corpsenm].mname)); instapetrify(kbuf); } else if (Glib || uswapwep->cursed) { if (!Glib) @@ -518,7 +663,10 @@ /* Avoid trashing makeplural's static buffer */ Strcpy(str, makeplural(body_part(HAND))); +/*JP Your("%s from your %s!", aobjnam(obj, "slip"), str); +*/ + You("%sを落してしまった!", xname(obj)); dropx(obj); } @@ -527,7 +675,10 @@ { /* You can always toggle it off */ if (u.twoweap) { +/*JP You("switch to your primary weapon."); +*/ + You("一つの武器で戦闘することにした."); u.twoweap = 0; update_inventory(); return (0); @@ -536,7 +687,10 @@ /* May we use two weapons? */ if (can_twoweapon()) { /* Success! */ +/*JP You("begin two-weapon combat."); +*/ + You("二刀流で戦闘することにした."); u.twoweap = 1; update_inventory(); return (rnd(20) > ACURR(A_DEX)); @@ -556,7 +710,10 @@ if (uwep) { if (artifact_light(uwep) && uwep->lamplit) { end_burn(uwep, FALSE); +/*JP if (!Blind) pline("%s glowing.", Tobjnam(uwep, "stop")); +*/ + if (!Blind) pline("%sは輝きを止めた.", xname(uwep)); } setworn((struct obj *)0, W_WEP); unweapon = TRUE; @@ -586,7 +743,10 @@ untwoweapon() { if (u.twoweap) { +/*JP You("can no longer use two weapons at once."); +*/ + You("もう2つの武器を同時に使用することはできない."); u.twoweap = FALSE; update_inventory(); } @@ -625,12 +785,25 @@ { if (!Blind) { if (victim == &youmonst) +#if 0 /*JP*/ Your("%s.", aobjnam(target, "fade")); +#else + Your("%sの文字が消えた.", xname(target)); +#endif else if (vismon) +#if 0 /*JP*/ pline("%s's %s.", Monnam(victim), aobjnam(target, "fade")); +#else + pline("%sが持つ%sの文字が消えた.", Monnam(victim), + xname(target)); +#endif else if (visobj) +#if 0 /*JP*/ pline_The("%s.", aobjnam(target, "fade")); +#else + pline("%sの文字が消えた.", xname(target)); +#endif } target->otyp = SCR_BLANK_PAPER; target->spe = 0; @@ -639,28 +812,59 @@ (acid_dmg ? !is_corrodeable(target) : !is_rustprone(target))) { if (flags.verbose || !(target->oerodeproof && target->rknown)) { if (victim == &youmonst) +/*JP Your("%s not affected.", aobjnam(target, "are")); +*/ + Your("%sは影響を受けない.", xname(target)); else if (vismon) +#if 0 /*JP*/ pline("%s's %s not affected.", Monnam(victim), aobjnam(target, "are")); +#else + pline("%sの%sは影響を受けない.", Monnam(victim), + xname(target)); +#endif /* no message if not carried */ } if (target->oerodeproof) target->rknown = TRUE; } else if (erosion < MAX_ERODE) { if (victim == &youmonst) +#if 0 /*JP*/ Your("%s%s!", aobjnam(target, acid_dmg ? "corrode" : "rust"), erosion+1 == MAX_ERODE ? " completely" : erosion ? " further" : ""); +#else + Your("%sは%s%s!", xname(target), + erosion+1 == MAX_ERODE ? "完全に" : + erosion ? "さらに" : "", + acid_dmg ? "腐食した" : "錆びた"); +#endif else if (vismon) +#if 0 /*JP*/ pline("%s's %s%s!", Monnam(victim), aobjnam(target, acid_dmg ? "corrode" : "rust"), erosion+1 == MAX_ERODE ? " completely" : erosion ? " further" : ""); +#else + pline("%sの%sは%s%s!", Monnam(victim), + xname(target), + erosion+1 == MAX_ERODE ? "完全に" : + erosion ? "さらに" : "", + acid_dmg ? "腐食した" : "錆びた"); +#endif else if (visobj) +#if 0 /*JP*/ pline_The("%s%s!", aobjnam(target, acid_dmg ? "corrode" : "rust"), erosion+1 == MAX_ERODE ? " completely" : erosion ? " further" : ""); +#else + pline("%sは%s%s!", + xname(target), + erosion+1 == MAX_ERODE ? "完全に" : + erosion ? "さらに" : "", + acid_dmg ? "腐食した" : "錆びた"); +#endif if (acid_dmg) target->oeroded2++; else @@ -668,17 +872,37 @@ } else { if (flags.verbose) { if (victim == &youmonst) +#if 0 /*JP*/ Your("%s completely %s.", aobjnam(target, Blind ? "feel" : "look"), acid_dmg ? "corroded" : "rusty"); +#else + Your("%sは完全に%s%s.", + xname(target), + acid_dmg ? "腐食した" : "錆びた", + Blind ? "ようだ" : ""); +#endif else if (vismon) +#if 0 /*JP*/ pline("%s's %s completely %s.", Monnam(victim), aobjnam(target, "look"), acid_dmg ? "corroded" : "rusty"); +#else + pline("%sの%sは完全に%s%s.", Monnam(victim), + xname(target), + acid_dmg ? "腐食した" : "錆びた", + Blind ? "ようだ" : ""); +#endif else if (visobj) +#if 0 /*JP*/ pline_The("%s completely %s.", aobjnam(target, "look"), acid_dmg ? "corroded" : "rusty"); +#else + Your("%sは完全に%s.", + xname(target), + acid_dmg ? "腐食した" : "錆びた"); +#endif } } } @@ -695,8 +919,13 @@ if(!uwep || (uwep->oclass != WEAPON_CLASS && !is_weptool(uwep))) { char buf[BUFSZ]; +#if 0 /*JP*/ Sprintf(buf, "Your %s %s.", makeplural(body_part(HAND)), (amount >= 0) ? "twitch" : "itch"); +#else + Sprintf(buf, "あなたの%sは%s.", makeplural(body_part(HAND)), + (amount >= 0) ? "ひきつった" : "ムズムズした"); +#endif strange_feeling(otmp, buf); exercise(A_DEX, (boolean) (amount >= 0)); return(0); @@ -707,7 +936,10 @@ if(uwep->otyp == WORM_TOOTH && amount >= 0) { uwep->otyp = CRYSKNIFE; uwep->oerodeproof = 0; +/*JP Your("weapon seems sharper now."); +*/ + Your("武器はより鋭さを増したようだ."); uwep->cursed = 0; if (otyp != STRANGE_OBJECT) makeknown(otyp); return(1); @@ -716,34 +948,57 @@ if(uwep->otyp == CRYSKNIFE && amount < 0) { uwep->otyp = WORM_TOOTH; uwep->oerodeproof = 0; +/*JP Your("weapon seems duller now."); +*/ + Your("武器はより鈍くなってしまったようだ."); if (otyp != STRANGE_OBJECT && otmp->bknown) makeknown(otyp); return(1); } if (amount < 0 && uwep->oartifact && restrict_name(uwep, ONAME(uwep))) { if (!Blind) +/*JP Your("%s %s.", aobjnam(uwep, "faintly glow"), color); +*/ + Your("%sはわずかに%s輝いた.", xname(uwep),jconj_adj(color)); return(1); } /* there is a (soft) upper and lower limit to uwep->spe */ if(((uwep->spe > 5 && amount >= 0) || (uwep->spe < -5 && amount < 0)) && rn2(3)) { if (!Blind) +#if 0 /*JP*/ Your("%s %s for a while and then %s.", aobjnam(uwep, "violently glow"), color, otense(uwep, "evaporate")); +#else + Your("%sはしばらく激しく%s輝き,蒸発した.", + xname(uwep), jconj_adj(color)); +#endif else +/*JP Your("%s.", aobjnam(uwep, "evaporate")); +*/ + Your("%sは蒸発した.", xname(uwep)); useupall(uwep); /* let all of them disappear */ return(1); } if (!Blind) { +/*JP xtime = (amount*amount == 1) ? "moment" : "while"; +*/ + xtime = (amount*amount == 1) ? "一瞬" : "しばらくの間"; +#if 0 /*JP*/ Your("%s %s for a %s.", aobjnam(uwep, amount == 0 ? "violently glow" : "glow"), color, xtime); +#else + Your("%sは%s%s%s輝いた.", + xname(uwep), xtime, jconj_adj(color), + amount == 0 ? "激しく" : ""); +#endif if (otyp != STRANGE_OBJECT && uwep->known && (amount > 0 || (amount < 0 && otmp->bknown))) makeknown(otyp); @@ -757,17 +1012,28 @@ * spe dependent. Give an obscure clue here. */ if (uwep->oartifact == ART_MAGICBANE && uwep->spe >= 0) { +#if 0 /*JP*/ Your("right %s %sches!", body_part(HAND), (((amount > 1) && (uwep->spe > 1)) ? "flin" : "it")); +#else + Your("右%sは%s!", + body_part(HAND), + (((amount > 1) && (uwep->spe > 1)) ? "ひりひりした" : "ムズムズした")); +#endif } /* an elven magic clue, cookie@keebler */ /* elven weapons vibrate warningly when enchanted beyond a limit */ if ((uwep->spe > 5) && (is_elven_weapon(uwep) || uwep->oartifact || !rn2(7))) +#if 0 /*JP*/ Your("%s unexpectedly.", aobjnam(uwep, "suddenly vibrate")); +#else + Your("%sは突然震えだした.", + xname(uwep)); +#endif return(1); } @@ -790,10 +1056,15 @@ long savewornmask; savewornmask = obj->owornmask; +#if 0 /*JP*/ Your("%s %s welded to your %s!", xname(obj), otense(obj, "are"), bimanual(obj) ? (const char *)makeplural(body_part(HAND)) : body_part(HAND)); +#else + You("%sを%sに構えた!", + xname(obj), body_part(HAND)); +#endif obj->owornmask = savewornmask; } diff -aurbN -xCVS -xXTAGS nethack/src/wizard.c jnethack/src/wizard.c --- nethack/src/wizard.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/wizard.c 2003-12-10 03:32:19.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + /* wizard code - inspired by rogue code from Merlyn Leroy (digi-g!brian) */ /* - heavily modified to give the wiz balls. (genat!mike) */ /* - dewimped and given some maledictions. -3. */ @@ -67,11 +74,20 @@ if(ttmp->ttyp == MAGIC_PORTAL) { int du = distu(ttmp->tx, ttmp->ty); if (du <= 9) +/*JP pline("%s hot!", Tobjnam(amu, "feel")); +*/ + pline("%sは熱く感じた!", xname(amu)); else if (du <= 64) +/*JP pline("%s very warm.", Tobjnam(amu, "feel")); +*/ + pline("%sはとても暖かく感じた.", xname(amu)); else if (du <= 144) +/*JP pline("%s warm.", Tobjnam(amu, "feel")); +*/ + pline("%sは暖かく感じた.", xname(amu)); /* else, the amulet feels normal */ break; } @@ -86,7 +102,10 @@ mtmp->msleeping = 0; if (distu(mtmp->mx,mtmp->my) > 2) You( +/*JP "get the creepy feeling that somebody noticed your taking the Amulet." +*/ + "あなたが魔除けを持っていることが誰かに知られたと感じてぞくぞくした." ); return; } @@ -351,7 +370,10 @@ if ((otmp = on_ground(which_arti(targ))) != 0) { if (cansee(mtmp->mx, mtmp->my)) +/*JP pline("%s picks up %s.", +*/ + pline("%sは%sを拾った.", Monnam(mtmp), (distu(mtmp->mx, mtmp->my) <= 5) ? doname(otmp) : distant_name(otmp, doname)); @@ -478,11 +500,17 @@ if (!flags.no_of_wizards) { /* make a new Wizard */ +/*JP verb = "kill"; +*/ + verb = "を殺せし"; mtmp = makemon(&mons[PM_WIZARD_OF_YENDOR], u.ux, u.uy, MM_NOWAIT); } else { /* look for a migrating Wizard */ +/*JP verb = "elude"; +*/ + verb = "から逃れん"; mmtmp = &migrating_mons; while ((mtmp = *mmtmp) != 0) { if (mtmp->iswiz && @@ -511,8 +539,14 @@ if (mtmp) { mtmp->msleeping = mtmp->mtame = mtmp->mpeaceful = 0; set_malign(mtmp); +/*JP pline("A voice booms out..."); +*/ + pline("声が高く鳴り響いた..."); +/*JP verbalize("So thou thought thou couldst %s me, fool.", verb); +*/ + verbalize("余%sと思いしか,このうつけ者め.", verb); } } @@ -526,10 +560,16 @@ /* cases 0 and 5 don't apply on the Astral level */ switch (which) { case 0: +/*JP case 1: You_feel("vaguely nervous."); +*/ + case 1: You("何となく不安になった."); break; case 2: if (!Blind) +/*JP You("notice a %s glow surrounding you.", +*/ + pline("%s光があなたをとりまいているのに気がついた.", hcolor(NH_BLACK)); rndcurse(); break; @@ -553,6 +593,7 @@ } const char * const random_insult[] = { +#if 0 /*JP*/ "antic", "blackguard", "caitiff", @@ -581,9 +622,40 @@ "wittol", "worm", "wretch", +#else + "ふざけた野郎", + "悪党", + "くそったれ", + "のろま", + "あんぽんたん", + "臆病者", + "白痴", + "ろくでなし", + "うつけ", + "悪魔の餌食", + "うすのろ", + "まぬけ", + "馬鹿", + "おいはぎ", + "愚か者", + "ならず者", + "悪人", + "極悪人", + "馬鹿たれ", + "卑怯者", + "風船頭", + "道楽者", + "厄介者", + "下郎", + "奴隷", /* (sic.) */ + "ふなむし", + "蛆虫", + "人でなし", +#endif }; const char * const random_malediction[] = { +#if 0 /*JP*/ "Hell shall soon claim thy remains,", "I chortle at thee, thou pathetic", "Prepare to die, thou", @@ -595,6 +667,19 @@ "Thou art doomed,", "Thy fate is sealed,", "Verily, thou shalt be one dead" +#else + "地獄はいづれ,汝の亡骸を要求するであろう,", + "哀れなやつよのう.余は満足じゃ", + "汝,死に備えよ", + "抵抗しても無駄じゃ,", + "降参せよ.さもなくば死じゃ.", + "慈悲は無からん", + "汝,ずるを後悔すべし,", + "汝は余にとってノミのようなものじゃ,", + "汝は呪われておる,", + "汝の運命は封印されておる,", + "まことに汝は死にたる者なり" +#endif }; /* Insult or intimidate the player */ @@ -604,20 +689,36 @@ { if (mtmp->iswiz) { if (!rn2(5)) /* typical bad guy action */ +/*JP pline("%s laughs fiendishly.", Monnam(mtmp)); +*/ + pline("%sは悪魔のように笑った.", Monnam(mtmp)); else if (u.uhave.amulet && !rn2(SIZE(random_insult))) +/*JP verbalize("Relinquish the amulet, %s!", +*/ + verbalize("魔よけを手放せ,%s!", random_insult[rn2(SIZE(random_insult))]); else if (u.uhp < 5 && !rn2(2)) /* Panic */ verbalize(rn2(2) ? +#if 0 /*JP*/ "Even now thy life force ebbs, %s!" : "Savor thy breath, %s, it be thy last!", +#else + "今となってもなお汝の命はあえて衰えるのだ,%s!" : + "息を味わっておけ,%s,汝の最期の時だ!", +#endif random_insult[rn2(SIZE(random_insult))]); else if (mtmp->mhp < 5 && !rn2(2)) /* Parthian shot */ verbalize(rn2(2) ? +#if 0 /*JP*/ "I shall return." : "I'll be back."); +#else + "余は必ず帰ってくる." : + "余は戻ってくる."); +#endif else verbalize("%s %s!", random_malediction[rn2(SIZE(random_malediction))], @@ -627,7 +728,10 @@ QT_ANGELIC); } else { if (!rn2(5)) +/*JP pline("%s casts aspersions on your ancestry.", Monnam(mtmp)); +*/ + pline("%sはあなたの家柄を中傷した.", Monnam(mtmp)); else com_pager(rn2(QTN_DEMONIC) + QT_DEMONIC); } diff -aurbN -xCVS -xXTAGS nethack/src/worm.c jnethack/src/worm.c --- nethack/src/worm.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/worm.c 2003-12-10 03:32:19.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #include "lev.h" @@ -371,7 +378,10 @@ if (flags.mon_moving) pline("Part of the tail of %s is cut off.", mon_nam(worm)); else +/*JP You("cut part of the tail off of %s.", mon_nam(worm)); +*/ + You("%sの尻尾の一部分を切った.", mon_nam(worm)); toss_wsegs(new_tail, TRUE); if (worm->mhp > 1) worm->mhp /= 2; return; @@ -405,7 +415,10 @@ if (flags.mon_moving) pline("%s is cut in half.", Monnam(worm)); else +/*JP You("cut %s in half.", mon_nam(worm)); +*/ + You("%sを真っぷたつにした.", mon_nam(worm)); } diff -aurbN -xCVS -xXTAGS nethack/src/worn.c jnethack/src/worn.c --- nethack/src/worn.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/worn.c 2003-12-10 03:32:20.000000000 +0900 @@ -2,6 +2,12 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright (c) Issei Numata 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" STATIC_DCL void FDECL(m_lose_armor, (struct monst *,struct obj *)); @@ -186,17 +192,31 @@ if (give_msg && (mon->mspeed != oldspeed || petrify) && canseemon(mon)) { /* fast to slow (skipping intermediate state) or vice versa */ +#if 0 /*JP*/ const char *howmuch = (mon->mspeed + oldspeed == MFAST + MSLOW) ? "much " : ""; +#else + const char *howmuch = (mon->mspeed + oldspeed == MFAST + MSLOW) ? + "すごく" : ""; +#endif if (petrify) { /* mimic the player's petrification countdown; "slowing down" even if fast movement rate retained via worn speed boots */ +/*JP if (flags.verbose) pline("%s is slowing down.", Monnam(mon)); +*/ + if (flags.verbose) pline("%sはのろくなった.", Monnam(mon)); } else if (adjust > 0 || mon->mspeed == MFAST) +/*JP pline("%s is suddenly moving %sfaster.", Monnam(mon), howmuch); +*/ + pline("%sの動きは突然%sすばやくなった.", Monnam(mon), howmuch); else +/*JP pline("%s seems to be moving %sslower.", Monnam(mon), howmuch); +*/ + pline("%sの動きは%sのろくなったように見える.", Monnam(mon), howmuch); /* might discover an object if we see the speed change happen, but avoid making possibly forgotten book known when casting its spell */ @@ -487,11 +507,19 @@ char buf[BUFSZ]; if (old) +/*JP Sprintf(buf, " removes %s and", distant_name(old, doname)); +*/ + Sprintf(buf, "%sをはずして", distant_name(old, doname)); else buf[0] = '\0'; +#if 0 /*JP*/ pline("%s%s puts on %s.", Monnam(mon), buf, distant_name(best,doname)); +#else + pline("%sは%s%sを身につけた.", Monnam(mon), + buf, distant_name(best,doname)); +#endif } /* can see it */ m_delay += objects[best->otyp].oc_delay; mon->mfrozen = m_delay; @@ -505,7 +533,10 @@ /* if couldn't see it but now can, or vice versa, */ if (!creation && (unseen ^ !canseemon(mon))) { if (mon->minvis && !See_invisible) { +/*JP pline("Suddenly you cannot see %s.", nambuf); +*/ + pline("突然%sが見えなくなった.", nambuf); makeknown(best->otyp); } /* else if (!mon->minvis) pline("%s suddenly appears!", Amonnam(mon)); */ } @@ -599,8 +630,10 @@ struct permonst *mdat = mon->data; boolean vis = cansee(mon->mx, mon->my); boolean handless_or_tiny = (nohands(mdat) || verysmall(mdat)); +#if 0 /*JP*/ const char *pronoun = mhim(mon), *ppronoun = mhis(mon); +#endif if (breakarm(mdat)) { if ((otmp = which_armor(mon, W_ARM)) != 0) { @@ -611,54 +644,97 @@ "the dragon merges with his scaly armor" is odd and the monster's previous form is already gone */ else if (vis) +/*JP pline("%s breaks out of %s armor!", Monnam(mon), ppronoun); +*/ + pline("%sは鎧をやぶり出た!", Monnam(mon)); else +/*JP You_hear("a cracking sound."); +*/ + You_hear("バリバリという音を聞いた."); m_useup(mon, otmp); } if ((otmp = which_armor(mon, W_ARMC)) != 0) { if (otmp->oartifact) { if (vis) +#if 0 /*JP*/ pline("%s %s falls off!", s_suffix(Monnam(mon)), cloak_simple_name(otmp)); +#else + pline("%sの%sは落ちた!", Monnam(mon), + cloak_simple_name(otmp)); +#endif if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); } else { if (vis) +#if 0 /*JP*/ pline("%s %s tears apart!", s_suffix(Monnam(mon)), cloak_simple_name(otmp)); +#else + pline("%sの%sはずたずたになった!", Monnam(mon), + cloak_simple_name(otmp)); +#endif else +/*JP You_hear("a ripping sound."); +*/ + You_hear("ビリッという音を聞いた."); m_useup(mon, otmp); } } #ifdef TOURIST if ((otmp = which_armor(mon, W_ARMU)) != 0) { if (vis) +/*JP pline("%s shirt rips to shreds!", s_suffix(Monnam(mon))); +*/ + pline("%sのシャツはずたずたになった!", Monnam(mon)); else +/*JP You_hear("a ripping sound."); +*/ + You_hear("ビリッという音を聞いた."); m_useup(mon, otmp); } #endif } else if (sliparm(mdat)) { if ((otmp = which_armor(mon, W_ARM)) != 0) { if (vis) +#if 0 /*JP*/ pline("%s armor falls around %s!", s_suffix(Monnam(mon)), pronoun); +#else + pline("%sの鎧が回りに落ちた!", + Monnam(mon)); +#endif else +/*JP You_hear("a thud."); +*/ + You_hear("ドシンという音を聞いた."); if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); } if ((otmp = which_armor(mon, W_ARMC)) != 0) { if (vis) { if (is_whirly(mon->data)) +#if 0 /*JP*/ pline("%s %s falls, unsupported!", s_suffix(Monnam(mon)), cloak_simple_name(otmp)); +#else + pline("%sの%sは支えきれずに落ちた!", + Monnam(mon), cloak_simple_name(otmp)); +#endif else +#if 0 /*JP*/ pline("%s shrinks out of %s %s!", Monnam(mon), ppronoun, cloak_simple_name(otmp)); +#else + pline("%sは%sより縮んだ!", Monnam(mon), + cloak_simple_name(otmp)); +#endif } if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); @@ -667,11 +743,21 @@ if ((otmp = which_armor(mon, W_ARMU)) != 0) { if (vis) { if (sliparm(mon->data)) +#if 0 /*JP*/ pline("%s seeps right through %s shirt!", Monnam(mon), ppronoun); +#else + pline("%sは自分のシャツにしみ込んだ!", + Monnam(mon)); +#endif else +#if 0 /*JP*/ pline("%s becomes much too small for %s shirt!", Monnam(mon), ppronoun); +#else + pline("%sは自分のシャツよりずっと小さくなった!", + Monnam(mon)); +#endif } if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); @@ -682,17 +768,29 @@ /* [caller needs to handle weapon checks] */ if ((otmp = which_armor(mon, W_ARMG)) != 0) { if (vis) +#if 0 /*JP*/ pline("%s drops %s gloves%s!", Monnam(mon), ppronoun, MON_WEP(mon) ? " and weapon" : ""); +#else + pline("%sは小手%sを落した!", Monnam(mon), + MON_WEP(mon) ? "と武器" : ""); +#endif if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); } if ((otmp = which_armor(mon, W_ARMS)) != 0) { if (vis) +#if 0 /*JP*/ pline("%s can no longer hold %s shield!", Monnam(mon), ppronoun); +#else + pline("%sはもはや盾を持つことができない!", Monnam(mon)); +#endif else +/*JP You_hear("a clank."); +*/ + You_hear("ガチャンという音を聞いた."); if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); } @@ -702,10 +800,18 @@ /* flimsy test for horns matches polyself handling */ (handless_or_tiny || !is_flimsy(otmp))) { if (vis) +#if 0 /*JP*/ pline("%s helmet falls to the %s!", s_suffix(Monnam(mon)), surface(mon->mx, mon->my)); +#else + pline("%sの兜は%sへ落ちた!", + Monnam(mon), surface(mon->mx, mon->my)); +#endif else +/*JP You_hear("a clank."); +*/ + You_hear("ガチャンという音を聞いた."); if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); } @@ -714,11 +820,20 @@ if ((otmp = which_armor(mon, W_ARMF)) != 0) { if (vis) { if (is_whirly(mon->data)) +/*JP pline("%s boots fall away!", +*/ + pline("%sの靴はぬげ落ちた!", s_suffix(Monnam(mon))); +#if 0 /*JP*/ else pline("%s boots %s off %s feet!", s_suffix(Monnam(mon)), verysmall(mdat) ? "slide" : "are pushed", ppronoun); +#else + else pline("%sの靴は足から%s!", + Monnam(mon), + verysmall(mdat) ? "滑り落ちた" : "引っぱられた"); +#endif } if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); @@ -730,20 +845,34 @@ if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); if (vis) +/*JP pline("%s saddle falls off.", s_suffix(Monnam(mon))); +*/ + pline("%sから鞍が落ちた.", Monnam(mon)); } if (mon == u.usteed) goto noride; } else if (mon == u.usteed && !can_ride(mon)) { noride: +/*JP You("can no longer ride %s.", mon_nam(mon)); +*/ + You("もう%sに乗っていられない.", mon_nam(mon)); if (touch_petrifies(u.usteed->data) && !Stone_resistance && rnl(3)) { char buf[BUFSZ]; +/*JP You("touch %s.", mon_nam(u.usteed)); +*/ + You("%sに触った.", mon_nam(u.usteed)); +#if 0 /*JP*/ Sprintf(buf, "falling off %s", an(u.usteed->data->mname)); +#else + Sprintf(buf, "%sから落ちて", + a_monnam(u.usteed)); +#endif instapetrify(buf); } dismount_steed(DISMOUNT_FELL); diff -aurbN -xCVS -xXTAGS nethack/src/write.c jnethack/src/write.c --- nethack/src/write.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/write.c 2005-04-26 18:35:41.000000000 +0900 @@ -1,6 +1,13 @@ /* SCCS Id: @(#)write.c 3.4 2001/11/29 */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" STATIC_DCL int FDECL(cost,(struct obj *)); @@ -79,13 +86,24 @@ int first, last, i; boolean by_descr = FALSE; const char *typeword; +#if 1 /*JP*/ + char tmp[BUFSZ]; +#endif if (nohands(youmonst.data)) { +/*JP You("need hands to be able to write!"); +*/ + You("書くためには手が必要だ!"); return 0; } else if (Glib) { +#if 0 /*JP*/ pline("%s from your %s.", Tobjnam(pen, "slip"), makeplural(body_part(FINGER))); +#else + pline("%sが%sから滑りおちた.", xname(pen), + body_part(FINGER)); +#endif dropx(pen); return 1; } @@ -94,21 +112,42 @@ paper = getobj(write_on,"write on"); if(!paper) return(0); +/*JP typeword = (paper->oclass == SPBOOK_CLASS) ? "spellbook" : "scroll"; +*/ + typeword = (paper->oclass == SPBOOK_CLASS) ? "魔法書" : "巻物"; if(Blind && !paper->dknown) { +/*JP You("don't know if that %s is blank or not!", typeword); +*/ + You("%sが白紙かどうかわからない!", typeword); return(1); } paper->dknown = 1; if(paper->otyp != SCR_BLANK_PAPER && paper->otyp != SPE_BLANK_PAPER) { +/*JP pline("That %s is not blank!", typeword); +*/ + pline("%sは白紙じゃない!", typeword); exercise(A_WIS, FALSE); return(1); } /* what to write */ +#if 0 /*JP*/ Sprintf(qbuf, "What type of %s do you want to write?", typeword); getlin(qbuf, namebuf); +#else + Sprintf(qbuf, "どの種の%sの呪文を書きますか?", typeword); + getlin(qbuf, tmp); + + if(paper->oclass == SPBOOK_CLASS){ + Strcpy(namebuf, etrns_obj('+', tmp)); + } + else{ + Strcpy(namebuf, etrns_obj('?', tmp)); + } +#endif (void)mungspaces(namebuf); /* remove any excess whitespace */ if(namebuf[0] == '\033' || !namebuf[0]) return(1); @@ -136,22 +175,36 @@ } } +/*JP There("is no such %s!", typeword); +*/ + pline("そのような%sはない!", typeword); return 1; found: if (i == SCR_BLANK_PAPER || i == SPE_BLANK_PAPER) { +#if 0 /*JP*/ You_cant("write that!"); pline("It's obscene!"); +#else + pline("白紙に白紙を書く?!"); + pline("そういうやりかたはちょっと不愉快だな!"); +#endif return 1; } else if (i == SPE_BOOK_OF_THE_DEAD) { +/*JP pline("No mere dungeon adventurer could write that."); +*/ + pline("一介の迷宮冒険家にはそれは書けない."); return 1; } else if (by_descr && paper->oclass == SPBOOK_CLASS && !objects[i].oc_name_known) { /* can't write unknown spellbooks by description */ pline( +/*JP "Unfortunately you don't have enough information to go on."); +*/ + "残念ながらそれを書くだけの十分な知識がない."); return 1; } @@ -167,7 +220,10 @@ /* see if there's enough ink */ basecost = cost(new_obj); if(pen->spe < basecost/2) { +/*JP Your("marker is too dry to write that!"); +*/ + Your("マーカは乾きすぎておりうまく書けなかった!"); obfree(new_obj, (struct obj *) 0); return(1); } @@ -180,14 +236,23 @@ /* dry out marker */ if (pen->spe < actualcost) { pen->spe = 0; +/*JP Your("marker dries out!"); +*/ + pline("書いている途中でマーカは乾ききった!"); /* scrolls disappear, spellbooks don't */ if (paper->oclass == SPBOOK_CLASS) { pline_The( +/*JP "spellbook is left unfinished and your writing fades."); +*/ + "魔法書には書ききれなかった.そして書いた文字は消えてしまった."); update_inventory(); /* pen charges */ } else { +/*JP pline_The("scroll is now useless and disappears!"); +*/ + pline_The("巻物は使いものにならなくなって消滅した!"); useup(paper); } obfree(new_obj, (struct obj *) 0); @@ -199,19 +264,33 @@ if(!(objects[new_obj->otyp].oc_name_known) && !(objects[new_obj->otyp].oc_uname) && (rnl(Role_if(PM_WIZARD) ? 3 : 15))) { +#if 0 /*JP*/ You("%s to write that!", by_descr ? "fail" : "don't know how"); +#else + You("%s!", by_descr ? "書くのに失敗した" : + "どうやって書くのか知らない"); +#endif /* scrolls disappear, spellbooks don't */ if (paper->oclass == SPBOOK_CLASS) { You( +/*JP "write in your best handwriting: \"My Diary\", but it quickly fades."); +*/ + "丁寧に書いた:「我が日記」.しかしあっと言う間に消えてしまった."); update_inventory(); /* pen charges */ } else { if (by_descr) { Strcpy(namebuf, OBJ_DESCR(objects[new_obj->otyp])); wipeout_text(namebuf, (6+MAXULEV - u.ulevel)/6, 0); } else +/*JP Sprintf(namebuf, "%s was here!", plname); +*/ + Sprintf(namebuf, "%sはここにあり!", plname); +/*JP You("write \"%s\" and the scroll disappears.", namebuf); +*/ + You("「%s」と書いた.すると巻物は消えてしまった.", namebuf); useup(paper); } obfree(new_obj, (struct obj *) 0); @@ -224,17 +303,28 @@ /* success */ if (new_obj->oclass == SPBOOK_CLASS) { /* acknowledge the change in the object's description... */ +#if 0 /*JP*/ pline_The("spellbook warps strangely, then turns %s.", OBJ_DESCR(objects[new_obj->otyp])); +#else + pline("魔法書は妙に反りかえり,そして%sになった.", + jtrns_obj('+', OBJ_DESCR(objects[new_obj->otyp]))); +#endif } new_obj->blessed = (curseval > 0); new_obj->cursed = (curseval < 0); #ifdef MAIL if (new_obj->otyp == SCR_MAIL) new_obj->spe = 1; #endif +#if 0 /*JP*/ new_obj = hold_another_object(new_obj, "Oops! %s out of your grasp!", The(aobjnam(new_obj, "slip")), (const char *)0); +#else + new_obj = hold_another_object(new_obj, "おっと!%sはあなたの手から滑り落ちた!", + xname(new_obj), + (const char *)0); +#endif return(1); } diff -aurbN -xCVS -xXTAGS nethack/src/zap.c jnethack/src/zap.c --- nethack/src/zap.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/src/zap.c 2005-06-05 16:25:20.000000000 +0900 @@ -2,6 +2,13 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" /* Disintegration rays have special treatment; corpses are never left. @@ -60,9 +67,13 @@ STATIC_VAR const char are_blinded_by_the_flash[]; extern const char * const flash_types[]; #else +/*JP STATIC_VAR const char are_blinded_by_the_flash[] = "are blinded by the flash!"; +*/ +STATIC_VAR const char are_blinded_by_the_flash[] = "まばゆい光で目が見えなくなった!"; const char * const flash_types[] = { /* also used in buzzmu(mcastu.c) */ +#if 0 /*JP*/ "magic missile", /* Wands must be 0-9 */ "bolt of fire", "bolt of cold", @@ -95,6 +106,40 @@ "blast of acid", "", "" +#else + "魔法の矢", /* Wands must be 0-9 */ + "火の閃光", + "氷の閃光", + "眠り光線", + "死の光線", + "稲妻の閃光", + "", + "", + "", + "", + + "魔法の矢", /* Spell equivalents must be 10-19 */ + "火の玉", + "冷気", + "眠り光線", + "死の指", + "稲妻の閃光", /* There is no spell, used for retribution */ + "", + "", + "", + "", + + "魔法の矢の息", /* Dragon breath equivalents 20-29*/ + "火の息", + "氷の息", + "睡眠ガスの息", + "分解の息", + "稲妻の息", + "毒ガスの息", + "酸の息", + "", + "" +#endif }; /* Routines for IMMEDIATE wands and spells. */ @@ -108,7 +153,10 @@ boolean reveal_invis = FALSE; boolean dbldam = Role_if(PM_KNIGHT) && u.uhave.questart; int dmg, otyp = otmp->otyp; +/*JP const char *zap_type_text = "spell"; +*/ + const char *zap_type_text = "魔法"; struct obj *obj; boolean disguised_mimic = (mtmp->data->mlet == S_MIMIC && mtmp->m_ap_type != M_AP_NOTHING); @@ -118,7 +166,10 @@ switch(otyp) { case WAN_STRIKING: +/*JP zap_type_text = "wand"; +*/ + zap_type_text = "杖"; /* fall through */ case SPE_FORCE_BOLT: reveal_invis = TRUE; @@ -142,8 +193,14 @@ m_dowear(mtmp, FALSE); /* might want speed boots */ if (u.uswallow && (mtmp == u.ustuck) && is_whirly(mtmp->data)) { +/*JP You("disrupt %s!", mon_nam(mtmp)); +*/ + You("%sをバラバラにした!", mon_nam(mtmp)); +/*JP pline("A huge hole opens up..."); +*/ + pline("脱出できそうな穴が開いた..."); expels(mtmp, mtmp->data, TRUE); } } @@ -184,7 +241,10 @@ with their metabolism...) */ if (mtmp->cham == CHAM_ORDINARY && !rn2(25)) { if (canseemon(mtmp)) { +/*JP pline("%s shudders!", Monnam(mtmp)); +*/ + pline("%sは身震いした!", Monnam(mtmp)); makeknown(otyp); } /* dropped inventory shouldn't be hit by this zap */ @@ -217,7 +277,10 @@ Strcpy(nambuf, Monnam(mtmp)); mon_set_minvis(mtmp); if (!oldinvis && knowninvisible(mtmp)) { +/*JP pline("%s turns transparent!", nambuf); +*/ + pline("%sは透明になった!", nambuf); makeknown(otyp); } break; @@ -238,8 +301,14 @@ wake = FALSE; /* don't want immediate counterattack */ if (u.uswallow && mtmp == u.ustuck) { if (is_animal(mtmp->data)) { +/*JP if (Blind) You_feel("a sudden rush of air!"); +*/ + if (Blind) You("突然空気の激流を感じた!"); +/*JP else pline("%s opens its mouth!", Monnam(mtmp)); +*/ + else pline("%sは口を開いた!", Monnam(mtmp)); } expels(mtmp, mtmp->data, TRUE); #ifdef STEED @@ -275,8 +344,13 @@ newsym(mtmp->mx, mtmp->my); } else mimic_hit_msg(mtmp, otyp); +#if 0 /*JP*/ } else pline("%s looks%s better.", Monnam(mtmp), otyp == SPE_EXTRA_HEALING ? " much" : "" ); +#else + } else pline("%sが%s元気になったように見えた.", Monnam(mtmp), + otyp == SPE_EXTRA_HEALING ? "とても" : "" ); +#endif } if (mtmp->mtame || mtmp->mpeaceful) { adjalign(Role_if(PM_HEALER) ? 1 : sgn(u.ualign.type)); @@ -307,10 +381,16 @@ /* turn into flesh golem */ if (newcham(mtmp, &mons[PM_FLESH_GOLEM], FALSE, FALSE)) { if (canseemon(mtmp)) +/*JP pline("%s turns to flesh!", name); +*/ + pline("%sの石化が解けた!", name); } else { if (canseemon(mtmp)) +/*JP pline("%s looks rather fleshy for a moment.", +*/ + pline("%sは一瞬石化が解けた.", name); } } else @@ -332,7 +412,10 @@ else { mtmp->m_lev--; if (canseemon(mtmp)) +/*JP pline("%s suddenly seems weaker!", Monnam(mtmp)); +*/ + pline("%sはとつぜん弱くなったような気がした!", Monnam(mtmp)); } } break; @@ -378,7 +461,10 @@ otmp->dknown = 1; /* treat as "seen" */ (void) display_minventory(mtmp, MINV_ALL, (char *)0); } else { +/*JP pline("%s is not carrying anything.", noit_Monnam(mtmp)); +*/ + pline("%sは何も持っていない.", Monnam(mtmp)); } } @@ -655,7 +741,11 @@ if (ghost->mtame) savetame = ghost->mtame; if (canseemon(ghost)) +#if 0 /*JP*/ pline("%s is suddenly drawn into its former body!", +#else + pline("%sは突然もとの体に引き込まれた!", +#endif Monnam(ghost)); mondead(ghost); recorporealization = TRUE; @@ -758,12 +848,24 @@ if ((mtmp2 = revive(otmp)) != 0) { ++res; if (youseeit) { +#if 0 /*JP*/ if (!once++) Strcpy(owner, (mon == &youmonst) ? "Your" : s_suffix(Monnam(mon))); +#else + if (!once++) Strcpy(owner, + (mon == &youmonst) ? "あなた" : + Monnam(mon)); +#endif +/*JP pline("%s %s suddenly comes alive!", owner, corpse); +*/ + pline("%sの%sは突然生命を帯びた!", owner, corpse); } else if (canseemon(mtmp2)) +/*JP pline("%s suddenly appears!", Amonnam(mtmp2)); +*/ + pline("%sが突然現われた!", Amonnam(mtmp2)); } } return res; @@ -787,7 +889,10 @@ if (obj->unpaid) { shkp = shop_keeper(*u.ushops); if (!shkp) return; +/*JP Norep("You cancel an unpaid object, you pay for it!"); +*/ + Norep("あなたは未払のものを無力化してしまった.支払いをしなきゃ!"); bill_dummy_object(obj); } break; @@ -796,7 +901,10 @@ shkp = shop_keeper(objroom); if (!shkp || !inhishop(shkp)) return; if (costly_spot(u.ux, u.uy) && objroom == *u.ushops) { +/*JP Norep("You cancel it, you pay for it!"); +*/ + Norep("あなたは無効化してしまった.支払いをしなきゃ!"); bill_dummy_object(obj); } else (void) stolen_value(obj, obj->ox, obj->oy, FALSE, FALSE); @@ -1082,7 +1190,10 @@ case METAL: case MITHRIL: pm_index = PM_IRON_GOLEM; +/*JP material = "metal "; +*/ + material = "金属"; break; case COPPER: case SILVER: @@ -1090,46 +1201,77 @@ case GEMSTONE: case MINERAL: pm_index = rn2(2) ? PM_STONE_GOLEM : PM_CLAY_GOLEM; +/*JP material = "lithic "; +*/ + material = "鉱物"; break; case 0: case FLESH: /* there is no flesh type, but all food is type 0, so we use it */ pm_index = PM_FLESH_GOLEM; +/*JP material = "organic "; +*/ + material = "有機物"; break; case WOOD: pm_index = PM_WOOD_GOLEM; +/*JP material = "wood "; +*/ + material = "木材"; break; case LEATHER: pm_index = PM_LEATHER_GOLEM; +/*JP material = "leather "; +*/ + material = "革"; break; case CLOTH: pm_index = PM_ROPE_GOLEM; +/*JP material = "cloth "; +*/ + material = "布"; break; case BONE: pm_index = PM_SKELETON; /* nearest thing to "bone golem" */ +/*JP material = "bony "; +*/ + material = "骨"; break; case GOLD: pm_index = PM_GOLD_GOLEM; +/*JP material = "gold "; +*/ + material = "金"; break; case GLASS: pm_index = PM_GLASS_GOLEM; +/*JP material = "glassy "; +*/ + material = "ガラス"; break; case PAPER: pm_index = PM_PAPER_GOLEM; +/*JP material = "paper "; +*/ + material = "紙"; break; default: /* if all else fails... */ pm_index = PM_STRAW_GOLEM; +#if 0 /*JP*/ material = ""; +#else + material = "物体"; +#endif break; } @@ -1140,7 +1282,10 @@ polyuse(obj, okind, (int)mons[pm_index].cwt); if(mtmp && cansee(mtmp->mx, mtmp->my)) { +/*JP pline("Some %sobjects meld, and %s arises from the pile!", +*/ + pline("いくつかの%sが溶け,その山から%sが現われた!", material, a_monnam(mtmp)); } } @@ -1427,10 +1572,16 @@ !costly_spot(u.ux, u.uy)) make_angry_shk(shkp, ox, oy); else { +/*JP pline("%s gets angry!", Monnam(shkp)); +*/ + pline("%sは激怒した!", Monnam(shkp)); hot_pursuit(shkp); } +/*JP } else Norep("%s is furious!", Monnam(shkp)); +*/ + } else Norep("%sは怒った!", Monnam(shkp)); } } delobj(obj); @@ -1527,7 +1678,10 @@ obj->dknown = 1; if (Is_container(obj) || obj->otyp == STATUE) { if (!obj->cobj) +/*JP pline("%s empty.", Tobjnam(obj, "are")); +*/ + pline("%sは空っぽだ.", xname(obj)); else { struct obj *o; /* view contents (not recursively) */ @@ -1669,7 +1823,10 @@ if (mon) { delobj(obj); if (cansee(mon->mx, mon->my)) +/*JP pline_The("figurine animates!"); +*/ + pline("人形は動きだした!"); break; } goto makecorpse; @@ -1687,9 +1844,15 @@ if (herbivorous(youmonst.data) && (!carnivorous(youmonst.data) || Role_if(PM_MONK) || !u.uconduct.unvegetarian)) +/*JP Norep("You smell the odor of meat."); +*/ + Norep("肉の悪臭が漂った."); else +/*JP Norep("You smell a delicious smell."); +*/ + Norep("すばらしい香りだ!"); break; case WEAPON_CLASS: /* crysknife */ /* fall through */ @@ -1755,7 +1918,10 @@ if(wand->spe < 0 || (wand->spe == 0 && rn2(121))) return 0; if(wand->spe == 0) +/*JP You("wrest one last charge from the worn-out wand."); +*/ + You("使いきった杖から最後の力をしぼりとった."); wand->spe--; return 1; } @@ -1788,17 +1954,26 @@ case WAN_WISHING: known = TRUE; if(Luck + rn2(5) < 0) { +/*JP pline("Unfortunately, nothing happens."); +*/ + pline("残念ながら,何も起きなかった."); break; } makewish(); break; case WAN_ENLIGHTENMENT: known = TRUE; +/*JP You_feel("self-knowledgeable..."); +*/ + You("自分自身が判るような気がした..."); display_nhwindow(WIN_MESSAGE, FALSE); enlightenment(FALSE); +/*JP pline_The("feeling subsides."); +*/ + pline("その感じはなくなった."); exercise(A_WIS, TRUE); break; } @@ -1815,8 +1990,14 @@ struct obj *otmp; { otmp->in_use = TRUE; /* in case losehp() is fatal */ +/*JP pline("%s suddenly explodes!", The(xname(otmp))); +*/ + pline("%sは突然爆発した!", The(xname(otmp))); +/*JP losehp(d(otmp->spe+2,6), "exploding wand", KILLED_BY_AN); +*/ + losehp(d(otmp->spe+2,6), "杖の爆発で", KILLED_BY_AN); useup(otmp); } @@ -1842,13 +2023,21 @@ return(1); } else if(!(objects[obj->otyp].oc_dir == NODIR) && !getdir((char *)0)) { if (!Blind) +/*JP pline("%s glows and fades.", The(xname(obj))); +*/ + pline("%sは一瞬輝いた.", The(xname(obj))); /* make him pay for knowing !NODIR */ } else if(!u.dx && !u.dy && !u.dz && !(objects[obj->otyp].oc_dir == NODIR)) { if ((damage = zapyourself(obj, TRUE)) != 0) { +#if 0 /*JP:T*/ char buf[BUFSZ]; Sprintf(buf, "zapped %sself with a wand", uhim()); losehp(damage, buf, NO_KILLER_PREFIX); +#else + losehp(damage, "自分自身の杖の力を浴びて", + KILLED_BY); +#endif } } else { @@ -1864,7 +2053,10 @@ current_wand = 0; } if (obj && obj->spe < 0) { +/*JP pline("%s to dust.", Tobjnam(obj, "turn")); +*/ + pline("%sはちりとなった.", xname(obj)); useup(obj); } update_inventory(); /* maybe used a charge */ @@ -1885,10 +2077,16 @@ case SPE_FORCE_BOLT: if(Antimagic) { shieldeff(u.ux, u.uy); +/*JP pline("Boing!"); +*/ + pline("ボイン!"); } else { if (ordinary) { +/*JP You("bash yourself!"); +*/ + You("自分自身を打ちつけた!"); damage = d(2,12); } else damage = d(1 + obj->spe,6); @@ -1899,12 +2097,19 @@ case WAN_LIGHTNING: makeknown(WAN_LIGHTNING); if (!Shock_resistance) { +/*JP You("shock yourself!"); +*/ + You("電撃をうけた!"); damage = d(12,6); exercise(A_CON, FALSE); } else { shieldeff(u.ux, u.uy); +/*JP You("zap yourself, but seem unharmed."); +*/ + You("自分に杖をふりかざしたが,怪我はしなかったようだ."); + ugolemeffects(AD_ELEC, d(12,6)); } destroy_item(WAND_CLASS, AD_ELEC); @@ -1917,7 +2122,10 @@ break; case SPE_FIREBALL: +/*JP You("explode a fireball on top of yourself!"); +*/ + Your("頭上で火の玉が爆発した!"); explode(u.ux, u.uy, 11, d(6,6), WAND_CLASS, EXPL_FIERY); break; case WAN_FIRE: @@ -1925,10 +2133,16 @@ case FIRE_HORN: if (Fire_resistance) { shieldeff(u.ux, u.uy); +/*JP You_feel("rather warm."); +*/ + You("ちょっと暖かく感じた."); ugolemeffects(AD_FIRE, d(12,6)); } else { +/*JP pline("You've set yourself afire!"); +*/ + You("炎につつまれた!"); damage = d(12,6); } burn_away_slime(); @@ -1944,10 +2158,16 @@ case FROST_HORN: if (Cold_resistance) { shieldeff(u.ux, u.uy); +/*JP You_feel("a little chill."); +*/ + You("ちょっと冷たく感じた."); ugolemeffects(AD_COLD, d(12,6)); } else { +/*JP You("imitate a popsicle!"); +*/ + You("アイスキャンデーのようになった!"); damage = d(12,6); } destroy_item(POTION_CLASS, AD_COLD); @@ -1958,10 +2178,16 @@ case SPE_MAGIC_MISSILE: if(Antimagic) { shieldeff(u.ux, u.uy); +/*JP pline_The("missiles bounce!"); +*/ + pline("魔法の矢ははねかえった!"); } else { damage = d(4,6); +/*JP pline("Idiot! You've shot yourself!"); +*/ + pline("何やってんだ!あなたは自分自身を撃った!"); } break; @@ -1980,7 +2206,10 @@ case SPE_DRAIN_LIFE: if (!Drain_resistance) { +/*JP losexp("life drainage"); +*/ + losexp("生命力を吸収されて"); makeknown(obj->otyp); } damage = 0; /* No additional damage */ @@ -1994,7 +2223,10 @@ if (BInvis && uarmc->otyp == MUMMY_WRAPPING) { /* A mummy wrapping absorbs it and protects you */ +/*JP You_feel("rather itchy under your %s.", xname(uarmc)); +*/ + You("%sの下がムズムズした.", xname(uarmc)); break; } if (ordinary || !rn2(10)) { /* permanent */ @@ -2013,9 +2245,15 @@ case WAN_SPEED_MONSTER: if (!(HFast & INTRINSIC)) { if (!Fast) +/*JP You("speed up."); +*/ + You("動きが速くなった."); else +/*JP Your("quickness feels more natural."); +*/ + You("速さに慣れてきた."); makeknown(WAN_SPEED_MONSTER); exercise(A_DEX, TRUE); } @@ -2027,9 +2265,15 @@ case SPE_SLEEP: if(Sleep_resistance) { shieldeff(u.ux, u.uy); +/*JP You("don't feel sleepy!"); +*/ + You("眠くならない!"); } else { +/*JP pline_The("sleep ray hits you!"); +*/ + pline("眠り光線があなたに命中した!"); fall_asleep(-rnd(50), TRUE); } break; @@ -2051,15 +2295,33 @@ case SPE_FINGER_OF_DEATH: if (nonliving(youmonst.data) || is_demon(youmonst.data)) { pline((obj->otyp == WAN_DEATH) ? +#if 0 /*JP*/ "The wand shoots an apparently harmless beam at you." : "You seem no deader than before."); +#else + "杖の光線はどうやらあなたに影響を与えないもののようだ." + : "あなたはこれ以上死ねないようだ."); +#endif break; } +/*JP Sprintf(buf, "shot %sself with a death ray", uhim()); +*/ + Strcpy(buf, "自分が撃った死の光線によって"); killer = buf; +#if 0 /*JP*/ killer_format = NO_KILLER_PREFIX; +#else + killer_format = KILLED_BY; +#endif +/*JP You("irradiate yourself with pure energy!"); +*/ + You("エネルギーを自分自身に照射した."); +/*JP You("die."); +*/ + pline("あなたは死にました."); makeknown(obj->otyp); /* They might survive with an amulet of life saving */ done(DIED); @@ -2069,18 +2331,31 @@ case SPE_TURN_UNDEAD: (void) unturn_dead(&youmonst); if (is_undead(youmonst.data)) { +#if 0 /*JP:T*/ You_feel("frightened and %sstunned.", Stunned ? "even more " : ""); +#else + You("恐怖し%sくらくらした.", + Stunned ? "さらに" : ""); +#endif make_stunned(HStun + rnd(30), FALSE); } else +/*JP You("shudder in dread."); +*/ + You("恐怖で震えた."); break; case SPE_HEALING: case SPE_EXTRA_HEALING: healup(d(6, obj->otyp == SPE_EXTRA_HEALING ? 8 : 4), 0, FALSE, (obj->otyp == SPE_EXTRA_HEALING)); +#if 0 /*JP:T*/ You_feel("%sbetter.", obj->otyp == SPE_EXTRA_HEALING ? "much " : ""); +#else + You("%s気分がよくなった.", + obj->otyp == SPE_EXTRA_HEALING ? "とても" : ""); +#endif break; case WAN_LIGHT: /* (broken wand) */ /* assert( !ordinary ); */ @@ -2100,7 +2375,10 @@ case WAN_OPENING: if (Punished) makeknown(WAN_OPENING); case SPE_KNOCK: +/*JP if (Punished) Your("chain quivers for a moment."); +*/ + if (Punished) Your("鎖は一瞬震えた."); break; case WAN_DIGGING: case SPE_DIG: @@ -2230,8 +2508,15 @@ { boolean youdefend = (mdef == &youmonst); static const char writing_vanishes[] = +/*JP "Some writing vanishes from %s head!"; +*/ + "何かの文字が%sの頭から消えた!"; +#if 0 /*JP:T*/ static const char your[] = "your"; /* should be extern */ +#else + static const char your[] = "あなた"; /* should be extern */ +#endif if (youdefend ? (!youattack && Antimagic) : resist(mdef, obj->oclass, 0, NOTELL)) @@ -2256,7 +2541,10 @@ pline(writing_vanishes, your); if (Unchanging) +/*JP Your("amulet grows hot for a moment, then cools."); +*/ + Your("魔除けはしばらく熱くなり,やがて元に戻った."); else rehumanize(); } @@ -2303,13 +2591,22 @@ case WAN_PROBING: ptmp = 0; if (u.dz < 0) { +/*JP You("probe towards the %s.", ceiling(x,y)); +*/ + You("上方の%sを調べた.", ceiling(x,y)); } else { ptmp += bhitpile(obj, bhito, x, y); +/*JP You("probe beneath the %s.", surface(x,y)); +*/ + You("下方の%sを調べた.", surface(x,y)); ptmp += display_binventory(x, y, TRUE); } +/*JP if (!ptmp) Your("probe reveals nothing."); +*/ + if (!ptmp) pline("調査の結果何もないことがわかった."); return TRUE; /* we've done our own bhitpile */ case WAN_OPENING: case SPE_KNOCK: @@ -2321,7 +2618,10 @@ /* can't use the stairs down to quest level 2 until leader "unlocks" them; give feedback if you try */ on_level(&u.uz, &qstart_level) && !ok_to_quest()) { +/*JP pline_The("stairs seem to ripple momentarily."); +*/ + pline("階段が一瞬揺れたように見えた."); disclose = TRUE; } break; @@ -2344,10 +2644,16 @@ !Is_airlevel(&u.uz) && !Is_waterlevel(&u.uz) && !Underwater && !Is_qstart(&u.uz)) { /* similar to zap_dig() */ +/*JP pline("A rock is dislodged from the %s and falls on your %s.", +*/ + pline("%sから岩が落ちてあなたの%sに命中した.", ceiling(x, y), body_part(HEAD)); losehp(rnd((uarmh && is_metallic(uarmh)) ? 2 : 6), +/*JP "falling rock", KILLED_BY_AN); +*/ + "落岩で", KILLED_BY_AN); if ((otmp = mksobj_at(ROCK, x, y, FALSE, FALSE)) != 0) { (void)xname(otmp); /* set dknown, maybe bknown */ stackobj(otmp); @@ -2356,14 +2662,25 @@ } else if (!striking && ttmp && ttmp->ttyp == TRAPDOOR && u.dz > 0) { if (!Blind) { if (ttmp->tseen) { +/*JP pline("A trap door beneath you closes up then vanishes."); +*/ + pline("あなたの下にある落し扉が閉じて消えた."); disclose = TRUE; } else { +#if 0 /*JP:T*/ You("see a swirl of %s beneath you.", is_ice(x,y) ? "frost" : "dust"); +#else + pline("あなたの下で%sのうずが見えた.", + is_ice(x,y) ? "霜" : "ほこり"); +#endif } } else { +/*JP You_hear("a twang followed by a thud."); +*/ + You_hear("ゴツン,ビーンという音を聞いた."); } deltrap(ttmp); ttmp = (struct trap *)0; @@ -2375,7 +2692,10 @@ Underwater || (Is_qstart(&u.uz) && u.dz < 0)) { pline(nothing_happens); } else if (u.dz < 0) { /* we should do more... */ +/*JP pline("Blood drips on your %s.", body_part(FACE)); +*/ + pline("血があなたの%sへしたたり落ちてきた.", body_part(FACE)); } else if (u.dz > 0 && !OBJ_AT(u.ux, u.uy)) { /* Print this message only if there wasn't an engraving @@ -2386,10 +2706,18 @@ if (is_pool(u.ux, u.uy) || is_ice(u.ux, u.uy)) pline(nothing_happens); else +#if 0 /*JP:T*/ pline("Blood %ss %s your %s.", is_lava(u.ux, u.uy) ? "boil" : "pool", Levitation ? "beneath" : "at", makeplural(body_part(FOOT))); +#else + pline("%s%s%s.", + makeplural(body_part(FOOT)), + Levitation ? "の下" : "元", + is_lava(u.ux, u.uy) ? + "で血が沸騰した" : "に血だまりが出来た"); +#endif } } break; @@ -2421,9 +2749,15 @@ case SPE_STONE_TO_FLESH: if (e->engr_type == ENGRAVE) { /* only affects things in stone */ +#if 0 /*JP:T*/ pline_The(Hallucination ? "floor runs like butter!" : "edges on the floor get smoother."); +#else + pline(Hallucination ? + "床がバターのように走っていった!" : + "床の縁がなめらかになった."); +#endif wipe_engr_at(x, y, d(2,4)); } break; @@ -2471,7 +2805,10 @@ } /* give a clue if obj_zapped */ if (obj_zapped) +/*JP You_feel("shuddering vibrations."); +*/ + You("ぞっとする振動を感じた."); } else if (objects[otyp].oc_dir == NODIR) { zapnodir(obj); @@ -2566,7 +2903,10 @@ /* force == 0 occurs e.g. with sleep ray */ /* note that large force is usual with wands so that !! would require information about hand/weapon/wand */ +/*JP return (const char *)((force < 0) ? "?" : (force <= 4) ? "." : "!"); +*/ + return (const char *)((force < 0) ? "?" : (force <= 4) ? "." : "!"); } void @@ -2575,11 +2915,21 @@ register struct monst *mtmp; register const char *force; /* usually either "." or "!" */ { +#if 1 /*JP*/ + if(*force == '.') force = "."; + if(*force == '!') force = "!"; +#endif if((!cansee(bhitpos.x,bhitpos.y) && !canspotmon(mtmp) && !(u.uswallow && mtmp == u.ustuck)) || !flags.verbose) +/*JP pline("%s %s it.", The(str), vtense(str, "hit")); +*/ + pline("%sは何かに命中した.", The(str)); +/*JP else pline("%s %s %s%s", The(str), vtense(str, "hit"), +*/ + else pline("%sは%sに命中した%s", The(str), mon_nam(mtmp), force); } @@ -2588,10 +2938,17 @@ register const char *str; register struct monst *mtmp; { +#if 0 /*JP:T*/ pline("%s %s %s.", The(str), vtense(str, "miss"), ((cansee(bhitpos.x,bhitpos.y) || canspotmon(mtmp)) && flags.verbose) ? mon_nam(mtmp) : "it"); +#else + pline("%sの%sへの攻撃ははずれた.", The(str), + ((cansee(bhitpos.x,bhitpos.y) || canspotmon(mtmp)) + && flags.verbose) ? + mon_nam(mtmp) : "何者か"); +#endif } #endif /*OVL0*/ #ifdef OVL1 @@ -2806,15 +3163,25 @@ struct trap *t; if ((bobj = sobj_at(BOULDER, x, y)) != 0) { if (cansee(x,y)) +#if 0 /*JP:T*/ pline("%s hits %s.", The(distant_name(obj, xname)), an(xname(bobj))); +#else + pline("%sは%sに命中した.", + The(distant_name(obj, xname)), an(xname(bobj))); +#endif range = 0; } else if (obj == uball) { if (!test_move(x - ddx, y - ddy, ddx, ddy, TEST_MOVE)) { /* nb: it didn't hit anything directly */ if (cansee(x,y)) +#if 0 /*JP:T*/ pline("%s jerks to an abrupt halt.", The(distant_name(obj, xname))); /* lame */ +#else + pline("%sはとつぜんガクンと止まった.", + The(distant_name(obj, xname))); /* lame */ +#endif range = 0; } else if (In_sokoban(&u.uz) && (t = t_at(x, y)) != 0 && (t->ttyp == PIT || t->ttyp == SPIKED_PIT || @@ -2832,7 +3199,10 @@ if (weapon != ZAPPED_WAND && weapon != INVIS_BEAM) tmp_at(DISP_END, 0); if(shopdoor) +/*JP pay_for_damage("destroy", FALSE); +*/ + pay_for_damage("破壊する", FALSE); return (struct monst *)0; } @@ -2874,11 +3244,17 @@ if(Fumbling || rn2(20) >= ACURR(A_DEX)) { /* we hit ourselves */ (void) thitu(10, rnd(10), (struct obj *)0, +/*JP "boomerang"); +*/ + "ブーメラン"); break; } else { /* we catch it */ tmp_at(DISP_END, 0); +/*JP You("skillfully catch the boomerang."); +*/ + You("上手にブーメランを掴まえた."); return(&youmonst); } } @@ -3071,12 +3447,21 @@ xchar sx, sy; { int dam = 0; +#if 1 /*JP*/ + char buf[BUFSZ]; + + Sprintf(buf, "%sによって", fltxt); + fltxt = buf; +#endif switch (abs(type) % 10) { case ZT_MAGIC_MISSILE: if (Antimagic) { shieldeff(sx, sy); +/*JP pline_The("missiles bounce off!"); +*/ + pline("魔法の矢は反射した!"); } else { dam = d(nd,6); exercise(A_STR, FALSE); @@ -3085,7 +3470,10 @@ case ZT_FIRE: if (Fire_resistance) { shieldeff(sx, sy); +/*JP You("don't feel hot!"); +*/ + You("熱さを感じない!"); ugolemeffects(AD_FIRE, d(nd, 6)); } else { dam = d(nd, 6); @@ -3100,7 +3488,10 @@ case ZT_COLD: if (Cold_resistance) { shieldeff(sx, sy); +/*JP You("don't feel cold."); +*/ + You("冷たさを感じない."); ugolemeffects(AD_COLD, d(nd, 6)); } else { dam = d(nd, 6); @@ -3110,7 +3501,10 @@ case ZT_SLEEP: if (Sleep_resistance) { shieldeff(u.ux, u.uy); +/*JP You("don't feel sleepy."); +*/ + You("眠くならない."); } else { fall_asleep(-d(nd,25), TRUE); /* sleep ray */ } @@ -3118,7 +3512,10 @@ case ZT_DEATH: if (abs(type) == ZT_BREATH(ZT_DEATH)) { if (Disint_resistance) { +/*JP You("are not disintegrated."); +*/ + You("分解されない."); break; } else if (uarms) { /* destroy shield; other possessions are safe */ @@ -3138,11 +3535,17 @@ #endif } else if (nonliving(youmonst.data) || is_demon(youmonst.data)) { shieldeff(sx, sy); +/*JP You("seem unaffected."); +*/ + You("影響を受けないようだ."); break; } else if (Antimagic) { shieldeff(sx, sy); +/*JP You("aren't affected."); +*/ + You("影響を受けない."); break; } killer_format = KILLED_BY_AN; @@ -3154,7 +3557,10 @@ case ZT_LIGHTNING: if (Shock_resistance) { shieldeff(sx, sy); +/*JP You("aren't affected."); +*/ + You("影響を受けない."); ugolemeffects(AD_ELEC, d(nd, 6)); } else { dam = d(nd, 6); @@ -3164,13 +3570,19 @@ if (!rn2(3)) destroy_item(RING_CLASS, AD_ELEC); break; case ZT_POISON_GAS: +/*JP poisoned("blast", A_DEX, "poisoned blast", 15); +*/ + poisoned("息", A_DEX, "毒の息", 15); break; case ZT_ACID: if (Acid_resistance) { dam = 0; } else { +/*JP pline_The("acid burns!"); +*/ + pline("酸で焼けた!"); dam = d(nd,6); exercise(A_STR, FALSE); } @@ -3234,9 +3646,19 @@ cnt += delquan; if (give_feedback) { if (delquan > 1) +#if 0 /*JP*/ pline("%ld %s burn.", delquan, buf2); +#else + pline("%ld%sの%sが燃えた.", + delquan, + obj->oclass == SCROLL_CLASS ? "枚" : "冊", + buf2); +#endif else +/*JP pline("%s burns.", An(buf1)); +*/ + pline("%sは燃えた.", buf1); } } } @@ -3295,7 +3717,10 @@ if(type < 0) return; tmp = zhitm(u.ustuck, type, nd, &otmp); if(!u.ustuck) u.uswallow = 0; +/*JP else pline("%s rips into %s%s", +*/ + else pline("%sは%sをひきさいた%s", The(fltxt), mon_nam(u.ustuck), exclam(tmp)); /* Using disintegration from the inside only makes a hole... */ if (tmp == MAGIC_COOKIE) @@ -3347,7 +3772,10 @@ if(cansee(mon->mx,mon->my)) { hit(fltxt, mon, exclam(0)); shieldeff(mon->mx, mon->my); +/*JP (void) mon_reflects(mon, "But it reflects from %s %s!"); +*/ + (void) mon_reflects(mon, "しかしそれは%sの%sで反射した!"); } dx = -dx; dy = -dy; @@ -3358,12 +3786,23 @@ if (is_rider(mon->data) && abs(type) == ZT_BREATH(ZT_DEATH)) { if (canseemon(mon)) { hit(fltxt, mon, "."); +/*JP pline("%s disintegrates.", Monnam(mon)); +*/ + pline("%sはこなごなになった.", Monnam(mon)); +#if 0 /*JP:T*/ pline("%s body reintegrates before your %s!", s_suffix(Monnam(mon)), (eyecount(youmonst.data) == 1) ? body_part(EYE) : makeplural(body_part(EYE))); +#else + pline("%sの体はあなたの目の前で再結合した!", + s_suffix(Monnam(mon))); +#endif +/*JP pline("%s resurrects!", Monnam(mon)); +*/ + pline("%sは蘇った!", Monnam(mon)); } mon->mhp = mon->mhpmax; break; /* Out of while loop */ @@ -3371,10 +3810,19 @@ if (mon->data == &mons[PM_DEATH] && abstype == ZT_DEATH) { if (canseemon(mon)) { hit(fltxt, mon, "."); +#if 0 /*JP:T*/ pline("%s absorbs the deadly %s!", Monnam(mon), type == ZT_BREATH(ZT_DEATH) ? "blast" : "ray"); +#else + pline("%sは死の%sを吸収した!", Monnam(mon), + type == ZT_BREATH(ZT_DEATH) ? + "息" : "光線"); +#endif +/*JP pline("It seems even stronger than before."); +*/ + pline("さらに強くなったような気さえする."); } break; /* Out of while loop */ } @@ -3384,7 +3832,10 @@ if (canseemon(mon)) { if (!m_amulet) +/*JP pline("%s is disintegrated!", Monnam(mon)); +*/ + pline("%sはこなごなになった!", Monnam(mon)); else hit(fltxt, mon, "!"); } @@ -3422,7 +3873,10 @@ } else { /* some armor was destroyed; no damage done */ if (canseemon(mon)) +/*JP pline("%s %s is disintegrated!", +*/ + pline("%sの%sはこなごなになった!", s_suffix(Monnam(mon)), distant_name(otmp, xname)); m_useup(mon, otmp); @@ -3445,12 +3899,21 @@ #endif if (zap_hit((int) u.uac, 0)) { range -= 2; +/*JP pline("%s hits you!", The(fltxt)); +*/ + pline("%sはあなたに命中した!", The(fltxt)); if (Reflecting) { if (!Blind) { +/*JP (void) ureflects("But %s reflects from your %s!", "it"); +*/ + (void) ureflects("しかし,%sはあなたの%sによって反射した.", "それ"); } else +/*JP pline("For some reason you are not affected."); +*/ + pline("なぜかあなたは影響を受けなかった."); dx = -dx; dy = -dy; shieldeff(sx, sy); @@ -3458,7 +3921,10 @@ zhitu(type, nd, fltxt, sx, sy); } } else { +/*JP pline("%s whizzes by you!", The(fltxt)); +*/ + pline("%sはあなたのそばをかすめた!", The(fltxt)); } if (abstype == ZT_LIGHTNING && !resists_blnd(&youmonst)) { You(are_blinded_by_the_flash); @@ -3482,7 +3948,10 @@ bounce = 0; range--; if(range && isok(lsx, lsy) && cansee(lsx,lsy)) +/*JP pline("%s bounces!", The(fltxt)); +*/ + pline("%sは反射した!", The(fltxt)); if(!dx || !dy || !rn2(20)) { dx = -dx; dy = -dy; @@ -3512,9 +3981,15 @@ if (type == ZT_SPELL(ZT_FIRE)) explode(sx, sy, type, d(12,6), 0, EXPL_FIERY); if (shopdamage) +#if 0 /*JP*/ pay_for_damage(abstype == ZT_FIRE ? "burn away" : abstype == ZT_COLD ? "shatter" : abstype == ZT_DEATH ? "disintegrate" : "destroy", FALSE); +#else + pay_for_damage(abstype == ZT_FIRE ? "燃やす" : + abstype == ZT_COLD ? "粉々にする" : + abstype == ZT_DEATH ? "粉砕する" : "破壊する", FALSE); +#endif bhitpos = save_bhitpos; } #endif /*OVLB*/ @@ -3542,9 +4017,15 @@ unearth_objs(x, y); if (Underwater) vision_recalc(1); newsym(x,y); +/*JP if (cansee(x,y)) Norep("The ice crackles and melts."); +*/ + if (cansee(x,y)) Norep("氷はピキピキ鳴り,溶けた."); if ((otmp = sobj_at(BOULDER, x, y)) != 0) { +/*JP if (cansee(x,y)) pline("%s settles...", An(xname(otmp))); +*/ + if (cansee(x,y)) pline("%sははまった...", An(xname(otmp))); do { obj_extract_self(otmp); /* boulder isn't being pushed */ if (!boulder_hits_pool(otmp, x, y, FALSE)) @@ -3578,16 +4059,25 @@ if (t && t->ttyp == WEB) { /* a burning web is too flimsy to notice if you can't see it */ +/*JP if (cansee(x,y)) Norep("A web bursts into flames!"); +*/ + if (cansee(x,y)) Norep("くもの巣は炎に包まれた!"); (void) delfloortrap(t); if (cansee(x,y)) newsym(x,y); } if(is_ice(x, y)) { melt_ice(x, y); } else if(is_pool(x,y)) { +/*JP const char *msgtxt = "You hear hissing gas."; +*/ + const char *msgtxt = "しゅーっというガスの音を聞いた."; if(lev->typ != POOL) { /* MOAT or DRAWBRIDGE_UP */ +/*JP if (cansee(x,y)) msgtxt = "Some water evaporates."; +*/ + if (cansee(x,y)) msgtxt = "すこし水が蒸発した."; } else { register struct trap *ttmp; @@ -3595,13 +4085,19 @@ lev->typ = ROOM; ttmp = maketrap(x, y, PIT); if (ttmp) ttmp->tseen = 1; +/*JP if (cansee(x,y)) msgtxt = "The water evaporates."; +*/ + if (cansee(x,y)) msgtxt = "水が蒸発した."; } Norep(msgtxt); if (lev->typ == ROOM) newsym(x,y); } else if(IS_FOUNTAIN(lev->typ)) { if (cansee(x,y)) +/*JP pline("Steam billows from the fountain."); +*/ + pline("蒸気が泉から立ちのぼった."); rangemod -= 1; dryup(x, y, type > 0); } @@ -3616,9 +4112,15 @@ if (lev->typ == WATER) { /* For now, don't let WATER freeze. */ if (cansee(x,y)) +/*JP pline_The("water freezes for a moment."); +*/ + pline("水は一瞬凍った."); else +/*JP You_hear("a soft crackling."); +*/ + You_hear("ピキ!という音を聞いた."); rangemod -= 1000; /* stop */ } else { rangemod -= 3; @@ -3634,14 +4136,26 @@ bury_objs(x,y); if(cansee(x,y)) { if(moat) +/*JP Norep("The moat is bridged with ice!"); +*/ + Norep("堀に氷の橋がかけられた!"); else if(lava) +/*JP Norep("The lava cools and solidifies."); +*/ + Norep("溶岩は冷え固まった."); else +/*JP Norep("The water freezes."); +*/ + Norep("水は凍った."); newsym(x,y); } else if(flags.soundok && !lava) +/*JP You_hear("a crackling sound."); +*/ + You_hear("ピキピキッという音を聞いた."); if (x == u.ux && y == u.uy) { if (u.uinwater) { /* not just `if (Underwater)' */ @@ -3652,11 +4166,17 @@ vision_full_recalc = 1; } else if (u.utrap && u.utraptype == TT_LAVA) { if (Passes_walls) { +/*JP You("pass through the now-solid rock."); +*/ + You("いま固くなったばかりの石の中をすり抜けた."); } else { u.utrap = rn1(50,20); u.utraptype = TT_INFLOOR; +/*JP You("are firmly stuck in the cooling rock."); +*/ + You("冷えた岩のなかにしっかりと埋まった."); } } } else if ((mon = m_at(x,y)) != 0) { @@ -3678,36 +4198,69 @@ switch(abstype) { case ZT_FIRE: new_doormask = D_NODOOR; +/*JP see_txt = "The door is consumed in flames!"; +*/ + see_txt = "扉は炎で焼きつくされた!"; +/*JP sense_txt = "smell smoke."; +*/ + sense_txt = "煙の匂いがした."; break; case ZT_COLD: new_doormask = D_NODOOR; +/*JP see_txt = "The door freezes and shatters!"; +*/ + see_txt = "扉は凍り,こなごなになった!"; +/*JP sense_txt = "feel cold."; +*/ + sense_txt = "あなたは冷気を感じた."; break; case ZT_DEATH: /* death spells/wands don't disintegrate */ if(abs(type) != ZT_BREATH(ZT_DEATH)) goto def_case; new_doormask = D_NODOOR; +/*JP see_txt = "The door disintegrates!"; +*/ + see_txt = "扉は粉砕された!"; +/*JP hear_txt = "crashing wood."; +*/ + hear_txt = "木の壊れる音を聞いた."; break; case ZT_LIGHTNING: new_doormask = D_BROKEN; +/*JP see_txt = "The door splinters!"; +*/ + see_txt = "扉はずたずたになった!"; +/*JP hear_txt = "crackling."; +*/ + hear_txt = "ピキピキという音を聞いた."; break; default: def_case: if(cansee(x,y)) { +#if 0 /*JP*/ pline_The("door absorbs %s %s!", (type < 0) ? "the" : "your", abs(type) < ZT_SPELL(0) ? "bolt" : abs(type) < ZT_BREATH(0) ? "spell" : "blast"); } else You_feel("vibrations."); +#else + pline("扉は%s%sを吸収した!", + (type < 0) ? "" : "あなたが放った", + abs(type) < ZT_SPELL(0) ? "光線" : + abs(type) < ZT_BREATH(0) ? "魔法" : + "息"); + } else You("振動を感じた."); +#endif break; } if (new_doormask >= 0) { /* door gets broken */ @@ -3724,7 +4277,11 @@ pline(see_txt); newsym(x, y); } else if (sense_txt) { +#if 0 /*JP*/ You(sense_txt); +#else + pline(sense_txt); +#endif } else if (hear_txt) { if (flags.soundok) You_hear(hear_txt); } @@ -3738,8 +4295,13 @@ if(OBJ_AT(x, y) && abstype == ZT_FIRE) if (burn_floor_paper(x, y, FALSE, type > 0) && couldsee(x, y)) { newsym(x,y); +#if 0 /*JP:T*/ You("%s of smoke.", !Blind ? "see a puff" : "smell a whiff"); +#else + pline("%s.", + !Blind ? "ぽわっと煙があがった" : "煙のプンという匂いがした"); +#endif } if ((mon = m_at(x,y)) != 0) { /* Cannot use wakeup() which also angers the monster */ @@ -3803,7 +4365,10 @@ place_object(item, obj->ox, obj->oy); } if (Role_if(PM_ARCHEOLOGIST) && !flags.mon_moving && (obj->spe & STATUE_HISTORIC)) { +/*JP You_feel("guilty about damaging such a historic statue."); +*/ + You_feel("このような歴史的な彫像に傷をつけるのは罪深いことだと思った."); adjalign(-1); } obj->spe = 0; @@ -3812,12 +4377,21 @@ } const char * const destroy_strings[] = { /* also used in trap.c */ +#if 0 /*JP*/ "freezes and shatters", "freeze and shatter", "shattered potion", "boils and explodes", "boil and explode", "boiling potion", "catches fire and burns", "catch fire and burn", "burning scroll", "catches fire and burns", "catch fire and burn", "burning book", "turns to dust and vanishes", "turn to dust and vanish", "", "breaks apart and explodes", "break apart and explode", "exploding wand" +#else + "凍結して砕けた", "凍結して砕けた", "砕けた薬瓶で", + "沸騰して爆発した", "沸騰して爆発した", "沸騰した薬で", + "火がついて燃えた", "火がついて燃えた", "燃えた巻物で", + "火がついて燃えた", "火がついて燃えた", "燃えた魔法書で", + "塵になって消えた", "塵になって消えた", "", + "ばらばらに壊れて爆発した", "ばらばらに壊れて爆発した", "杖の爆発で" +#endif }; void @@ -3856,8 +4430,14 @@ if (obj->otyp == SPE_BOOK_OF_THE_DEAD) { skip++; if (!Blind) +#if 0 /*JP:T*/ pline("%s glows a strange %s, but remains intact.", The(xname(obj)), hcolor("dark red")); +#else + pline("%sは奇妙に%s輝いたが何も変化しなかった.", + xname(obj), jconj_adj(hcolor("暗褐色の"))); +#endif + } quan = obj->quan; switch(osym) { @@ -3911,9 +4491,18 @@ if(!rn2(3)) cnt++; if(!cnt) continue; +/*JP if(cnt == quan) mult = "Your"; +*/ + if(cnt == quan) mult = ""; +/*JP else mult = (cnt == 1L) ? "One of your" : "Some of your"; +*/ + else mult = (cnt == 1L) ? "のひとつ" : "のいくつか"; +/*JP pline("%s %s %s!", mult, xname(obj), +*/ + pline("あなたの%s%sは%s!", xname(obj), mult, (cnt > 1L) ? destroy_strings[dindx*3 + 1] : destroy_strings[dindx*3]); if(osym == POTION_CLASS && dmgtyp != AD_COLD) { @@ -3930,7 +4519,10 @@ for (i = 0; i < cnt; i++) useup(obj); if(dmg) { +/*JP if(xresist) You("aren't hurt!"); +*/ + if(xresist) You("傷つかない!"); else { const char *how = destroy_strings[dindx * 3 + 2]; boolean one = (cnt == 1L); @@ -3983,9 +4575,15 @@ if (obj->otyp == SPE_BOOK_OF_THE_DEAD) { skip++; if (vis) +#if 0 /*JP:T*/ pline("%s glows a strange %s, but remains intact.", The(distant_name(obj, xname)), hcolor("dark red")); +#else + pline("%sは奇妙に%s輝いたが何も変化しなかった.", + The(distant_name(obj, xname)), + jconj_adj(hcolor("暗褐色の"))); +#endif } quan = obj->quan; switch(osym) { @@ -4033,7 +4631,10 @@ if(!rn2(3)) cnt++; if(!cnt) continue; +/*JP if (vis) pline("%s %s %s!", +*/ + if (vis) pline("%sの%sは%s!", s_suffix(Monnam(mtmp)), xname(obj), (cnt > 1L) ? destroy_strings[dindx*3 + 1] : destroy_strings[dindx*3]); @@ -4074,7 +4675,10 @@ if (resisted) { if (tell) { shieldeff(mtmp->mx, mtmp->my); +/*JP pline("%s resists!", Monnam(mtmp)); +*/ + pline("%sは防いだ!", Monnam(mtmp)); } damage = (damage + 1) / 2; } @@ -4097,9 +4701,15 @@ int tries = 0; nothing = zeroobj; /* lint suppression; only its address matters */ +/*JP if (flags.verbose) You("may wish for an object."); +*/ + if (flags.verbose) You("望みのものを手に入れられる!"); retry: +/*JP getlin("For what do you wish?", buf); +*/ + getlin("何をお望み?", buf); if(buf[0] == '\033') buf[0] = 0; /* * Note: if they wished for and got a non-object successfully, @@ -4109,7 +4719,10 @@ */ otmp = readobjnam(buf, ¬hing, TRUE); if (!otmp) { +/*JP pline("Nothing fitting that description exists in the game."); +*/ + pline("うーん.そんなものは存在しないようだ."); if (++tries < 5) goto retry; pline(thats_enough_tries); otmp = readobjnam((char *)0, (struct obj *)0, TRUE); @@ -4125,6 +4738,7 @@ if (otmp != &zeroobj) { /* The(aobjnam()) is safe since otmp is unidentified -dlc */ +#if 0 /*JP*/ (void) hold_another_object(otmp, u.uswallow ? "Oops! %s out of your reach!" : (Is_airlevel(&u.uz) || @@ -4137,6 +4751,17 @@ Is_airlevel(&u.uz) || u.uinwater ? "slip" : "drop")), (const char *)0); +#else + Sprintf(buf, "%sが%s", xname(otmp), + Is_airlevel(&u.uz)||u.uinwater ? "滑り落ちた" : "落ちた"); + (void) hold_another_object(otmp, u.uswallow ? + "おっと,届かないところに%s!" : + Is_airlevel(&u.uz) || u.uinwater ? + "おっと,手から%s!" : + "おっと,床に%s!", + buf, + (const char *)0); +#endif u.ublesscnt += rn1(100,50); /* the gods take notice */ } } diff -aurbN -xCVS -xXTAGS nethack/sys/msdos/Install.dos jnethack/sys/msdos/Install.dos --- nethack/sys/msdos/Install.dos 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/msdos/Install.dos 2003-12-10 00:54:10.000000000 +0900 @@ -7,7 +7,7 @@ NetHack 3.4 on a DOS system ====================================================== (or, How to make PC NetHack 3.4) - Last revision: $Date: 2003/06/13 19:57:52 $ + Last revision: $Date: 2003/09/03 19:05:10 $ Credit for a runnable full PC NetHack 3.4 goes to the PC Development team of Paul Winner, Kevin Smolkowski, Michael Allison, Yitzhak Sapir, Bill Dyer, diff -aurbN -xCVS -xXTAGS nethack/sys/msdos/Makefile.BC jnethack/sys/msdos/Makefile.BC --- nethack/sys/msdos/Makefile.BC 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/msdos/Makefile.BC 2003-12-10 00:54:10.000000000 +0900 @@ -912,10 +912,10 @@ GAMEFILE = $(GAMEDIR)\$(GAME).exe # -# make data.base an 8.3 filename to prevent an nmake warning +# make jdata.base an 8.3 filename to prevent an nmake warning # -DATABASE = $(DAT)\data.bas +DATABASE = $(DAT)\jdata.bas ####################################################################### # @@ -951,7 +951,7 @@ if exist $(GAMEDIR)\makefile del $(GAMEDIR)\makefile ! ENDIF copy $(SYS)\termcap $(GAMEDIR) - if exist $(DOC)\guideb*.txt copy $(DOC)\guideb*.txt $(GAMEDIR) + if exist $(DOC)\jguide*.txt copy $(DOC)\jguide*.txt $(GAMEDIR) if exist $(DOC)\nethack.txt copy $(DOC)\nethack.txt $(GAMEDIR)\NetHack.txt if exist $(DOC)\recover.txt copy $(DOC)\recover.txt $(GAMEDIR) copy $(SYS)\NetHack.cnf $(GAMEDIR)\defaults.nh @@ -1506,7 +1506,7 @@ $(DAT)\rumors: $(U)utility.tag $(DAT)\rumors.tru $(DAT)\rumors.fal $(U)makedefs -r -$(DAT)\quest.dat: $(U)utility.tag $(DAT)\quest.txt +$(DAT)\quest.dat: $(U)utility.tag $(DAT)\jquest.txt $(U)makedefs -q $(DAT)\oracles: $(U)utility.tag $(DAT)\oracles.txt diff -aurbN -xCVS -xXTAGS nethack/sys/msdos/Makefile.GCC jnethack/sys/msdos/Makefile.GCC --- nethack/sys/msdos/Makefile.GCC 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/msdos/Makefile.GCC 2003-12-10 00:54:10.000000000 +0900 @@ -1,4 +1,4 @@ -# SCCS Id: @(#)Makefile.GCC 3.4 $Date: 2003/06/15 15:56:45 $ +# SCCS Id: @(#)Makefile.GCC 3.4 $Date: 2003/09/03 19:05:10 $ # Copyright (c) NetHack PC Development Team 1996-2003. # PC NetHack 3.4 Makefile for djgpp V2 # @@ -21,7 +21,7 @@ # Game Installation Variables # NOTE: Make sure GAMEDIR exists before make is started. -GAME = nethack +GAME = jnethack # The GNU Make has a problem if you include a drive spec below (unfortunately). GAMEDIR =../binary @@ -39,6 +39,7 @@ UTIL = ../util WIN = ../win/tty WSHR = ../win/share +JP = ../japanese # # Executables. @@ -76,7 +77,7 @@ # your tools. # YACC = bison -y -LEX = flex +LEX = flex -8 YTABC = y_tab.c YTABH = y_tab.h #If your tool produces y.tab.c and y.tab.h DOS might require @@ -224,17 +225,17 @@ MAKESRC = makedefs.c -SPLEVSRC = lev_yacc.c lev_$(LEX).c lev_main.c panic.c +SPLEVSRC = lev_yacc.c lev_lex.c lev_main.c panic.c -DGNCOMPSRC = dgn_yacc.c dgn_$(LEX).c dgn_main.c +DGNCOMPSRC = dgn_yacc.c dgn_lex.c dgn_main.c MAKEOBJS = $(O)makedefs.o $(O)monst.o $(O)objects.o -SPLEVOBJS = $(O)lev_yacc.o $(O)lev_$(LEX).o $(O)lev_main.o $(O)alloc.o \ +SPLEVOBJS = $(O)lev_yacc.o $(O)lev_lex.o $(O)lev_main.o $(O)alloc.o \ $(O)monst.o $(O)objects.o $(O)panic.o \ $(O)drawing.o $(O)decl.o $(O)stubvid.o -DGNCOMPOBJS = $(O)dgn_yacc.o $(O)dgn_$(LEX).o $(O)dgn_main.o $(O)alloc.o \ +DGNCOMPOBJS = $(O)dgn_yacc.o $(O)dgn_lex.o $(O)dgn_main.o $(O)alloc.o \ $(O)panic.o RECOVOBJS = $(O)recover.o @@ -322,13 +323,15 @@ VVOBJ = $(O)version.o +JOBJ = jconj.o jlib.o jtrns.o + VOBJ = $(VOBJ01) $(VOBJ02) $(VOBJ03) $(VOBJ04) $(VOBJ05) \ $(VOBJ06) $(VOBJ07) $(VOBJ08) $(VOBJ09) $(VOBJ10) \ $(VOBJ11) $(VOBJ12) $(VOBJ13) $(VOBJ14) $(VOBJ15) \ $(VOBJ16) $(VOBJ17) $(VOBJ18) $(VOBJ19) $(VOBJ20) \ $(VOBJ21) $(VOBJ22) $(VOBJ23) -ALLOBJ = $(VOBJ) $(SOBJ) $(TILOBJ) $(VVOBJ) +ALLOBJ = $(VOBJ) $(SOBJ) $(TILOBJ) $(VVOBJ) $(JOBJ) #========================================== # Header file macros @@ -433,7 +436,9 @@ @$(subst /,\,if exist $(DAT)/*.tib copy $(DAT)/*.tib $(GAMEDIR)) @$(subst /,\,copy $(SSHR)/NetHack.cnf $(GAMEDIR)/defaults.nh) @$(subst /,\,copy $(MSYS)/NHAccess.nh $(GAMEDIR)) - @$(subst /,\,copy $(DOC)/guidebo*.txt $(GAMEDIR)) + @$(subst /,\,copy $(DOC)/jguideb*.txt $(GAMEDIR)) + @$(subst /,\,copy ../Change*.j $(GAMEDIR)/change.j) + @$(subst /,\,copy ../readme.j $(GAMEDIR)) @$(subst /,\,if exist $(DOC)/nethack.txt copy $(DOC)/nethack.txt $(GAMEDIR)) ifdef CWSDPMI @$(subst /,\,if exist $(CWSDPMI) copy $(CWSDPMI) $(GAMEDIR)) @@ -479,6 +484,7 @@ echo $(SOBJ) >> $(subst /,\,$@) echo $(TILOBJ) >> $(subst /,\,$@) echo $(VVOBJ) >> $(subst /,\,$@) + echo $(JOBJ) >> $(subst /,\,$@) #========================================== @@ -526,8 +532,8 @@ $(subst /,\,if exist $(DAT)/rumors del $(DAT)/rumors) $(subst /,\,if exist $(DAT)/dungeon.pdf del $(DAT)/dungeon.pdf) $(subst /,\,if exist $(DAT)/dungeon del $(DAT)/dungeon) - $(subst /,\,if exist $(DAT)/oracles del $(DAT)/oracles) - $(subst /,\,if exist $(DAT)/quest.dat del $(DAT)/quest.dat) + $(subst /,\,if exist $(DAT)/joracles del $(DAT)/joracles) + $(subst /,\,if exist $(DAT)/jquest.dat del $(DAT)/jquest.dat) $(subst /,\,if exist $(DAT)/dlb.lst del $(DAT)/dlb.lst) $(subst /,\,if exist $(DAT)/nhdat del $(DAT)/nhdat) $(subst /,\,if exist $(DAT)/*.lev del $(DAT)/*.lev) @@ -536,6 +542,10 @@ $(subst /,\,if exist $(WSHR)/monthin.txt del $(WSHR)/monthin.txt) $(subst /,\,if exist $(WSHR)/objthin.txt del $(WSHR)/objthin.txt) $(subst /,\,if exist $(WSHR)/oththin.txt del $(WSHR)/oththin.txt) + $(subst /,\,if exist $(SRC)\jlib.c del $(SRC)\jlib.c) + $(subst /,\,if exist $(SRC)\jtrns.c del $(SRC)\jtrns.c) + $(subst /,\,if exist $(SRC)\jconj.c del $(SRC)\jconj.c) + $(subst /,\,if exist $(INCL)\jdata.h del $(INCL)\jdata.h) #========================================== # Create directory for holding object files @@ -609,9 +619,9 @@ endif -$(O)lev_$(LEX).o: $(HACK_H) $(SP_LEV_H) $(INCL)/lev_comp.h \ - $(U)lev_$(LEX).c - $(CC) $(cflags) -o$@ $(U)lev_$(LEX).c +$(O)lev_lex.o: $(HACK_H) $(SP_LEV_H) $(INCL)/lev_comp.h \ + $(U)lev_lex.c + $(CC) $(cflags) -o$@ $(U)lev_lex.c $(O)lev_main.o: $(HACK_H) $(INCL)/sp_lev.h $(INCL)/date.h $(U)lev_main.c @@ -645,7 +655,7 @@ endif -$(U)lev_$(LEX).c: $(U)lev_comp.l +$(U)lev_lex.c: $(U)lev_comp.l ifeq "$(DO_LEX)" "LEX_ACT" @$(subst /,\,chdir $(UTIL)) @$(subst /,\,$(LEX) $(FLEXSKEL) lev_comp.l) @@ -696,7 +706,7 @@ ifeq "$(DO_LEX)" "LEX_ACT" -$(U)dgn_$(LEX).c: $(U)dgn_comp.l $(INCL)/dgn_comp.h +$(U)dgn_lex.c: $(U)dgn_comp.l $(INCL)/dgn_comp.h @$(subst /,\,chdir $(UTIL)) @$(subst /,\,$(LEX) $(FLEXSKEL) dgn_comp.l) @$(subst /,\,if exist $@ del $@) @@ -705,7 +715,7 @@ @$(subst /,\,chdir $(SRC)) else -$(U)dgn_$(LEX).c: $(SSHR)/dgn_lex.c $(INCL)/dgn_comp.h +$(U)dgn_lex.c: $(SSHR)/dgn_lex.c $(INCL)/dgn_comp.h @echo --- @echo For now, we will copy the prebuilt dgn_lex.c @echo from $(SSHR) into $(U) and use it. @@ -825,6 +835,9 @@ $(O)ppmwrit2.o: $(CONFIG_H) $(WSHR)/tile.h ppmwrite.c $(CC) $(cflags) -DTILE_X=8 -o$@ ppmwrite.c +$(INCL)/jdata.h: $(U)makedefs.exe $(DAT)/jtrnsobj.dat $(DAT)/jtrnsmon.dat + -$(subst /,\,$(U)makedefs -j) + # # Optional tile viewer (development sources only) # @@ -861,10 +874,10 @@ $(O)panic.o: $(CONFIG_H) $(U)panic.c #============================================================ -# make data.base an 8.3 filename to prevent an make warning +# make jdata.base an 8.3 filename to prevent an make warning #============================================================ -DATABASE = $(DAT)/data.bas +DATABASE = $(DAT)/jdata.bas $(O)dat.tag: $(DAT)/nhdat @@ -876,12 +889,18 @@ $(DAT)/rumors: $(O)utility.tag $(DAT)/rumors.tru $(DAT)/rumors.fal @$(subst /,\,$(U)makedefs.exe -r) -$(DAT)/quest.dat: $(O)utility.tag $(DAT)/quest.txt +$(DAT)/jrumors: $(O)utility.tag $(DAT)/jrumors.tru $(DAT)/jrumors.fal + @$(subst /,\,$(U)makedefs.exe -r) + +$(DAT)/quest.dat: $(O)utility.tag $(DAT)/jquest.txt @$(subst /,\,$(U)makedefs.exe -q) $(DAT)/oracles: $(O)utility.tag $(DAT)/oracles.txt @$(subst /,\,$(U)makedefs.exe -h) +$(DAT)/joracles: $(O)utility.tag $(DAT)/joracles.txt + @$(subst /,\,$(U)makedefs.exe -h) + $(O)sp_lev.tag: $(O)utility.tag $(DAT)/bigroom.des $(DAT)/castle.des \ $(DAT)/endgame.des $(DAT)/gehennom.des $(DAT)/knox.des \ $(DAT)/medusa.des $(DAT)/oracle.des $(DAT)/tower.des \ @@ -931,22 +950,22 @@ #note that dir below assumes bin/dir.exe from djgpp distribution # $(DAT)/nhdat: $(U)dlb_main.exe $(DAT)/data $(DAT)/rumors $(DAT)/dungeon \ - $(DAT)/oracles $(DAT)/quest.dat $(O)sp_lev.tag + $(DAT)/joracles $(DAT)/quest.dat $(O)sp_lev.tag @$(subst /,\,echo dat done >$(O)dat.tag) @$(subst /,\,cd $(DAT)) @$(subst /,\,copy $(MSYS)/msdoshlp.txt .) @$(subst /,\,echo data >dlb.lst) @$(subst /,\,echo dungeon >>dlb.lst) - @$(subst /,\,echo oracles >>dlb.lst) + @$(subst /,\,echo joracles >>dlb.lst) @$(subst /,\,echo options >>dlb.lst) @$(subst /,\,echo quest.dat >>dlb.lst) - @$(subst /,\,echo rumors >>dlb.lst) - @$(subst /,\,echo help >>dlb.lst) - @$(subst /,\,echo hh >>dlb.lst) - @$(subst /,\,echo cmdhelp >>dlb.lst) - @$(subst /,\,echo history >>dlb.lst) - @$(subst /,\,echo opthelp >>dlb.lst) - @$(subst /,\,echo wizhelp >>dlb.lst) + @$(subst /,\,echo jrumors >>dlb.lst) + @$(subst /,\,echo jhelp >>dlb.lst) + @$(subst /,\,echo jhh >>dlb.lst) + @$(subst /,\,echo jcmdhelp >>dlb.lst) + @$(subst /,\,echo jhistory >>dlb.lst) + @$(subst /,\,echo jopthelp >>dlb.lst) + @$(subst /,\,echo jwizhelp >>dlb.lst) @$(subst /,\,echo license >>dlb.lst) @$(subst /,\,echo msdoshlp.txt >>dlb.lst) $(LS) $(subst /,\,*.lev) >>dlb.lst @@ -976,8 +995,12 @@ $(O)sys.o : $(HACK_H) $(SSHR)/pcsys.c $(CC) $(cflags) -o$@ $(SSHR)/pcsys.c +random.o: $(HACK_H) $(SSHR)/random.c + @$(subst /,\,copy $(SSHR)\random.c .) + $(CC) $(CFLAGS) -D_POSIX_SOURCE -o$@ random.c + # sys/msdos -$(O)msdos.o : $(HACK_H) $(MSYS)/msdos.c +$(O)msdos.o : $(HACK_H) $(MSYS)/msdos.c $(MSYS)/portio.h # $(CC) $(cflags) -o$@ $(MSYS)/msdos.c $(O)pckeys.o : $(HACK_H) $(MSYS)/pckeys.c @@ -989,7 +1012,8 @@ $(O)sound.o : $(HACK_H) $(MSYS)/sound.c $(MSYS)/portio.h # $(CC) $(cflags) -o$@ $(MSYS)/sound.c -$(O)video.o : $(HACK_H) $(MSYS)/pcvideo.h $(MSYS)/portio.h $(MSYS)/video.c +$(O)video.o : $(HACK_H) $(MSYS)/pcvideo.h $(MSYS)/portio.h $(MSYS)/video.c \ + $(MSYS)/pctiles.h # $(CC) $(cflags) -o$@ -I$(MSYS) $(MSYS)/video.c $(O)vidvga.o : $(HACK_H) $(MSYS)/pcvideo.h $(MSYS)/portio.h $(TILE_H) $(MSYS)/vidvga.c @@ -1002,6 +1026,15 @@ $(CC) $(cflags) -I$(MSYS) -DSTUBVIDEO -o$@ $(MSYS)/video.c +jlib.o: $(JP)\jlib.c $(HACK_H) + $(CC) $(cflags) -o$@ $(JP)/jlib.c + +jconj.o: $(JP)\jconj.c $(HACK_H) + $(CC) $(cflags) -o$@ $(JP)/jconj.c + +jtrns.o: $(JP)/jtrns.c $(HACK_H) $(INCL)/jdata.h + $(CC) $(cflags) -o$@ $(JP)/jtrns.c + # src dependencies # @@ -1244,7 +1277,7 @@ $(O)u_init.o: u_init.c $(HACK_H) $(O)uhitm.o: uhitm.c $(HACK_H) $(O)vault.o: vault.c $(HACK_H) $(INCL)/vault.h -$(O)version.o: version.c $(HACK_H) $(INCL)/date.h $(PATCHLEV_H) +$(O)version.o: version.c $(HACK_H) $(INCL)/date.h $(PATCHLEV_H) $(JP)/jpatchle.h $(O)vision.o: vision.c $(HACK_H) $(INCL)/vis_tab.h $(O)weapon.o: weapon.c $(HACK_H) $(O)were.o: were.c $(HACK_H) diff -aurbN -xCVS -xXTAGS nethack/sys/msdos/Makefile.MSC jnethack/sys/msdos/Makefile.MSC --- nethack/sys/msdos/Makefile.MSC 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/msdos/Makefile.MSC 2003-12-10 00:54:10.000000000 +0900 @@ -405,7 +405,7 @@ copy $(SSHR)\NetHack.cnf $(GAMEDIR)\defaults.nh copy $(MSYS)\NHAccess.nh $(GAMEDIR) copy $(U)recover.exe $(GAMEDIR) - if exist $(DOC)\guideb*.txt copy $(DOC)\guideb*.txt $(GAMEDIR) + if exist $(DOC)\jguide*.txt copy $(DOC)\jguide*.txt $(GAMEDIR) if exist $(DOC)\recover.txt copy $(DOC)\recover.txt $(GAMEDIR) if exist $(DOC)\nethack.txt copy $(DOC)\nethack.txt $(GAMEDIR) echo install done > $@ @@ -891,10 +891,10 @@ # -# make data.base an 8.3 filename to prevent an nmake warning +# make jdata.base an 8.3 filename to prevent an nmake warning # -DATABASE = $(DAT)\data.bas +DATABASE = $(DAT)\jdata.bas $(DAT)\data: $(O)utility.tag $(DATABASE) $(U)makedefs -d @@ -902,7 +902,7 @@ $(DAT)\rumors: $(O)utility.tag $(DAT)\rumors.tru $(DAT)\rumors.fal $(U)makedefs -r -$(DAT)\quest.dat: $(O)utility.tag $(DAT)\quest.txt +$(DAT)\quest.dat: $(O)utility.tag $(DAT)\jquest.txt $(U)makedefs -q $(DAT)\oracles: $(O)utility.tag $(DAT)\oracles.txt diff -aurbN -xCVS -xXTAGS nethack/sys/msdos/pcvideo.h jnethack/sys/msdos/pcvideo.h --- nethack/sys/msdos/pcvideo.h 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/msdos/pcvideo.h 2004-01-08 02:11:21.000000000 +0900 @@ -235,6 +235,9 @@ E void FDECL(txt_startup,(int*,int*)); E void FDECL(txt_xputs, (const char *, int, int)); E void FDECL(txt_xputc, (CHAR_P, int)); +#if 1 /*JP*/ +E void FDECL(txt_xputc2, (int, int, int)); +#endif /* ### vidvga.c ### */ @@ -266,9 +269,15 @@ E void NDECL(vga_tty_end_screen); E void FDECL(vga_tty_startup,(int*,int*)); E void FDECL(vga_WriteChar, (int, int, int, int)); +#if 1 /*JP*/ +E void FDECL(vga_WriteChar2, (int, int, int, int, int)); +#endif E void FDECL(vga_WriteStr, (char *, int, int, int, int)); E void FDECL(vga_xputs, (const char *, int, int)); E void FDECL(vga_xputc, (CHAR_P, int)); +#if 1 /*JP*/ +E void FDECL(vga_xputc2, (CHAR_P, CHAR_P, int)); +#endif E void FDECL(vga_xputg, (int, int, unsigned)); E void FDECL(vga_userpan, (BOOLEAN_P)); E void FDECL(vga_overview, (BOOLEAN_P)); diff -aurbN -xCVS -xXTAGS nethack/sys/msdos/setup.bat jnethack/sys/msdos/setup.bat --- nethack/sys/msdos/setup.bat 2003-12-08 08:40:26.000000000 +0900 +++ jnethack/sys/msdos/setup.bat 2003-12-10 00:54:10.000000000 +0900 @@ -25,23 +25,23 @@ if not exist ..\..\binary\* mkdir ..\..\binary if NOT exist ..\..\binary\license copy ..\..\dat\license ..\..\binary\license >nul -if exist ..\..\dat\data.bas goto long1ok -if exist ..\..\dat\data.base goto long1a -if exist ..\..\dat\data~1.bas goto long1b +if exist ..\..\dat\jdata.bas goto long1ok +if exist ..\..\dat\jdata.base goto long1a +if exist ..\..\dat\jdata~1.bas goto long1b goto err_long :long1a echo Changing some long-named distribution file names: -echo "Copying ..\..\dat\data.base -> ..\..\dat\data.bas" -copy ..\..\dat\data.base ..\..\dat\data.bas +echo "Copying ..\..\dat\jdata.base -> ..\..\dat\jdata.bas" +copy ..\..\dat\jdata.base ..\..\dat\jdata.bas if exist ..\..\dat\data.old del /Q ..\..\dat\data.old -ren ..\..\dat\data.base data.old +ren ..\..\dat\jdata.base data.old goto long1ok :long1b echo Changing some long-named distribution file names: -echo "Copying ..\..\dat\data~1.bas -> ..\..\dat\data.bas" -copy ..\..\dat\data~1.bas ..\..\dat\data.bas +echo "Copying ..\..\dat\jdata~1.bas -> ..\..\dat\jdata.bas" +copy ..\..\dat\jdata~1.bas ..\..\dat\jdata.bas if exist ..\..\dat\data.old del /Q ..\..\dat\data.old -ren ..\..\dat\data~1.bas data.old +ren ..\..\dat\jdata~1.bas data.old :long1ok if exist ..\..\include\patchlev.h goto long2ok @@ -53,30 +53,36 @@ copy ..\..\include\patchlevel.h ..\..\include\patchlev.h if exist ..\..\include\patchlev.old del /Q ..\..\include\patchlev.old ren ..\..\include\patchlevel.h patchlev.old +copy ..\..\japanese\jpatchlevel.h ..\..\japanese\jpatchle.h +if exist ..\..\japanese\jpatchle.old del /Q ..\..\japanese\jpatchle.old +ren ..\..\japanese\jpatchlevel.h jpatchle.old goto long2ok :long2b echo "Copying ..\..\include\patchl~1.h -> ..\..\include\patchlev.h" copy ..\..\include\patchl~1.h ..\..\include\patchlev.h if exist ..\..\include\patchlev.old del /Q ..\..\include\patchlev.old ren ..\..\include\patchl~1.h patchlev.old +copy ..\..\japanese\jpatch~1.h ..\..\japanese\jpatchle.h +if exist ..\..\japanese\jpatchle.old del /Q ..\..\japanese\jpatchle.old +ren ..\..\japanese\jpatch~1.h jpatchlevold :long2ok REM Missing guidebook is not fatal to the build process -if exist ..\..\doc\guideboo.txt goto long3ok -if exist ..\..\doc\guidebook.txt goto long3a -if exist ..\..\doc\guideb~1.txt goto long3b +if exist ..\..\doc\jguidebo.txt goto long3ok +if exist ..\..\doc\jguidebook.txt goto long3a +if exist ..\..\doc\jguide~1.txt goto long3b goto warn3long :long3a echo "Copying ..\..\doc\guidebook.txt -> ..\..\doc\guideboo.txt" -copy ..\..\doc\guidebook.txt ..\..\doc\guideboo.txt -if exist ..\..\doc\guideboo.old del /Q ..\..\doc\guideboo.old -ren ..\..\doc\guidebook.txt guideboo.old +copy ..\..\doc\jguidebook.txt ..\..\doc\jguidebo.txt +if exist ..\..\doc\jguidebo.old del /Q ..\..\doc\jguidebo.old +ren ..\..\doc\jguidebook.txt jguidebo.old goto long3ok :long3b echo "Copying ..\..\doc\guideb~1.txt -> ..\..\doc\guideboo.txt" -copy ..\..\doc\guideb~1.txt ..\..\doc\guideboo.txt -if exist ..\..\doc\guideboo.old del /Q ..\..\doc\guideboo.old -ren ..\..\doc\guideb~1.txt guideboo.old +copy ..\..\doc\jguide~1.txt ..\..\doc\jguidebo.txt +if exist ..\..\doc\jguidebo.old del /Q ..\..\doc\jguidebo.old +ren ..\..\doc\jguide~1.txt jguidebo.old goto long3ok :warn3long echo "Warning - There is no NetHack Guidebook (..\..\doc\guideboo.txt)" @@ -125,7 +131,7 @@ echo The following files need to exist under the names on the echo right in order to build NetHack: echo. -echo ..\..\dat\data.base needs to be copied to ..\..\dat\data.bas +echo ..\..\dat\jdata.base needs to be copied to ..\..\dat\jdata.bas echo ..\..\include\patchlevel.h needs to be copied to ..\..\include\patchlev.h echo. echo setup.bat was unable to perform the necessary changes because at least diff -aurbN -xCVS -xXTAGS nethack/sys/msdos/video.c jnethack/sys/msdos/video.c --- nethack/sys/msdos/video.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/msdos/video.c 2004-01-08 04:03:04.000000000 +0900 @@ -585,6 +585,29 @@ } } +/*JP*/ +void +xputc2(ch, ch2) /* write 2 bytes character (and attribute) */ +int ch; +int ch2; +{ + int i; + char attribute; + + i = iflags.grmode ? attrib_gr_normal + : attrib_text_normal; + + attribute = (char)((g_attribute == 0) ? i : g_attribute); + if (!iflags.grmode) { + txt_xputc2(ch, ch2, attribute); +# ifdef SCREEN_VGA + } else if (iflags.usevga) { + vga_xputc2(ch, ch2, attribute); +# endif /*SCREEN_VGA*/ + } +} + + void xputg(glyphnum,ch,special) /* write out a glyph picture at current location */ int glyphnum; diff -aurbN -xCVS -xXTAGS nethack/sys/msdos/vidtxt.c jnethack/sys/msdos/vidtxt.c --- nethack/sys/msdos/vidtxt.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/msdos/vidtxt.c 2005-07-26 03:40:26.000000000 +0900 @@ -296,6 +296,98 @@ */ # ifdef OVL0 +/*JP*/ +void +txt_xputc2(ch, ch2, attr) /* write out 2byte code character */ + int ch; + int ch2; + int attr; +{ +# ifdef PC9800 + unsigned char uc1, uc2; + + uc1 = (unsigned char)ch; + uc2 = (unsigned char)ch2; + + union REGS regs; + + regs.h.dl = attr98[attr]; + regs.h.ah = SETATT; + regs.h.cl = DIRECT_CON_IO; + + (void) int86(DOS_EXT_FUNC, ®s, ®s); + + regs.h.dl = uc1; + regs.h.ah = PUTCHAR; + regs.h.cl = DIRECT_CON_IO; + + (void) int86(DOS_EXT_FUNC, ®s, ®s); + + regs.h.dl = uc2; + regs.h.ah = PUTCHAR; + regs.h.cl = DIRECT_CON_IO; + + (void) int86(DOS_EXT_FUNC, ®s, ®s); +# else +# ifdef SCREEN_BIOS + union REGS regs; +# endif + int col,row; + unsigned char uc1, uc2; + + uc1 = (unsigned char)ch; + uc2 = (unsigned char)ch2; + + txt_get_cursor(&col,&row); +/* + ++col; + txt_gotoxy(col,row); +*/ + +# ifdef SCREEN_DJGPPFAST + ScreenPutChar((int)uc1,attr,col,row); + ScreenPutChar((int)uc2,attr,col,row); +# endif +# ifdef SCREEN_BIOS + regs.h.ah = PUTCHARATT; /* write att & character */ + regs.h.al = uc1; /* character */ + regs.h.bh = 0; /* display page */ + regs.h.bl = (char)attr; /* BL = attribute */ + regs.x.cx = 1; /* one character */ + (void) int86(VIDEO_BIOS, ®s, ®s); + if (col < (CO - 1)) ++col; + txt_gotoxy(col,row); + + regs.h.ah = PUTCHARATT; /* write att & character */ + regs.h.al = uc2; /* character */ + regs.h.bh = 0; /* display page */ + regs.h.bl = (char)attr; /* BL = attribute */ + regs.x.cx = 1; /* one character */ + (void) int86(VIDEO_BIOS, ®s, ®s); +# endif + if (col < (CO - 1 )) ++col; + txt_gotoxy(col,row); +# endif /* PC9800 */ +} + +#if 1 /*JP*/ +void +txt_xputs(s,col,row) +const char *s; +int col,row; +{ + unsigned int buf[2]; + + if(s){ + while(*s){ + txt_gotoxy(col, row); + jbuffer(*s, buf, NULL, xputc, xputc2); + ++col; + ++s; + } + } +} +#else void txt_xputs(s,col,row) const char *s; @@ -313,6 +405,7 @@ } } } +#endif void txt_xputc(ch,attr) /* write out character (and attribute) */ @@ -349,10 +442,15 @@ txt_get_cursor(&col,&row); switch(ch) { case '\n': +#if 0 /*JP*/ #if 0 col = 0; ++row; #endif +#else + col = 0; + ++row; +#endif break; default: # ifdef SCREEN_DJGPPFAST diff -aurbN -xCVS -xXTAGS nethack/sys/msdos/vidvga.c jnethack/sys/msdos/vidvga.c --- nethack/sys/msdos/vidvga.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/msdos/vidvga.c 2004-01-08 04:03:04.000000000 +0900 @@ -356,6 +356,24 @@ } } +#if 1 /*JP*/ +void +vga_xputc2(ch, ch2, attr) +int ch; +int ch2; +int attr; +{ + int col, row; + + col = curcol; + row = currow; + + vga_WriteChar2((unsigned char)ch,(unsigned char)ch2,col,row,attr); + if (col < (CO -2 )) col+=2; + vga_gotoloc(col,row); +} +#endif + void vga_xputc(ch,attr) /* write out character (and attribute) */ char ch; @@ -442,6 +460,9 @@ { curcol = min(col,CO - 1); /* protection from callers */ currow = min(row,LI - 1); +#if 1 /*JP*/ + txt_gotoxy(col, row); +#endif } # if defined(USE_TILES) && defined(CLIPPING) @@ -866,6 +887,40 @@ return 0; } +#if 1 /*JP*/ +void +vga_WriteChar2(chr, chr2, col, row, colour) +int chr, chr2, col, row, colour; +{ + int saved_col, saved_row; + + saved_col = curcol; + saved_row = currow; + + vga_gotoloc(col, row); + txt_xputc2(chr, chr2, 14); + + curcol = saved_col; + currow = saved_row; +} + +void +vga_WriteChar(chr, col, row, colour) +int chr, col, row, colour; +{ + int saved_col, saved_row; + + saved_col = curcol; + saved_row = currow; + + vga_gotoloc(col, row); + txt_xputc(chr, 14); + + curcol = saved_col; + currow = saved_row; +} + +#else /* * Write character 'ch', at (x,y) and * do it using the colour 'colour'. @@ -910,6 +965,7 @@ outportb(0x3ce,8); outportb(0x3cf,255); } +#endif /* * This is the routine that displays a high-res "cell" pointed to by 'gp' @@ -988,6 +1044,20 @@ char *s; int len,col,row,colour; { +#if 1 /*JP*/ + int i = 0; + + g_attribute = 14; + + if(s) + while(*s && i 1) { argc--; argv++; +/*JP (void) strncpy(plname, argv[0], sizeof(plname)-1); +*/ + (void) strncpy(plname, str2ic(argv[0]), sizeof(plname)-1); } else raw_print("Player name expected after -u"); break; diff -aurbN -xCVS -xXTAGS nethack/sys/share/pcsys.c jnethack/sys/share/pcsys.c --- nethack/sys/share/pcsys.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/share/pcsys.c 2005-07-26 03:12:59.000000000 +0900 @@ -411,13 +411,26 @@ #ifndef WIN32CON void msmsg VA_DECL(const char *, fmt) +#if 1 /*JP*/ + char buf[ROWNO * COLNO]; /* worst case scenario */ +#endif VA_START(fmt); VA_INIT(fmt, const char *); # if defined(MSDOS) && defined(NO_TERMS) if (iflags.grmode) gr_finish(); # endif +#if 0 /*JP*/ Vprintf(fmt, VA_ARGS); +#else + Vsprintf(buf, fmt, VA_ARGS); + { + char *str = buf; + while(*str){ + jbuffer(*(str++), NULL, NULL, NULL, NULL); + } + } +#endif flushout(); VA_END(); return; diff -aurbN -xCVS -xXTAGS nethack/sys/share/pcunix.c jnethack/sys/share/pcunix.c --- nethack/sys/share/pcunix.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/share/pcunix.c 2004-01-09 17:26:11.000000000 +0900 @@ -269,9 +269,26 @@ */ register char *s; { +#if 0 /*JP*/ register char *lp; +#else + register unsigned char *lp; +#endif +#if 0 /*JP*/ for (lp = s; *lp; lp++) +#else +#ifdef SJIS_FILESYSTEM + lp = (unsigned char *)ic2str( s ); + strcpy(s, lp); +#endif + + for (lp = s; *lp; lp++){ + if (is_kanji(*lp)){ + lp++; + continue; + } +#endif if (*lp <= ' ' || *lp == '"' || (*lp >= '*' && *lp <= ',') || *lp == '.' || *lp == '/' || (*lp >= ':' && *lp <= '?') || # ifdef OS2 @@ -279,6 +296,9 @@ # endif *lp == '|' || *lp >= 127 || (*lp >= '[' && *lp <= ']')) *lp = '_'; +#if 1 /*JP*/ + } +#endif } # endif /* WIN32 */ #endif /* OVLB */ diff -aurbN -xCVS -xXTAGS nethack/sys/unix/Makefile.dat jnethack/sys/unix/Makefile.dat --- nethack/sys/unix/Makefile.dat 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/unix/Makefile.dat 2003-12-10 00:54:10.000000000 +0900 @@ -5,7 +5,7 @@ # SHELL=E:/GEMINI2/MUPFEL.TTP # UUDECODE=uudecode -VARDAT = data rumors quest.dat oracles options +VARDAT = data jrumors quest.dat joracles options all: $(VARDAT) spec_levs quest_levs dungeon @@ -85,13 +85,16 @@ data: data.base ../util/makedefs ../util/makedefs -d -rumors: rumors.tru rumors.fal ../util/makedefs +#rumors: rumors.tru rumors.fal ../util/makedefs +jrumors: jrumors.tru jrumors.fal ../util/makedefs ../util/makedefs -r quest.dat: quest.txt ../util/makedefs ../util/makedefs -q -oracles: oracles.txt ../util/makedefs +# by issei 1994/2/5 +#oracles: oracles.txt ../util/makedefs +joracles: joracles.txt ../util/makedefs ../util/makedefs -h # note: 'options' should have already been made when include/date.h was created @@ -142,3 +145,4 @@ -rm -f spec_levs quest_levs *.lev $(VARDAT) dungeon dungeon.pdf -rm -f nhdat x11tiles beostiles pet_mark.xbm rip.xpm mapbg.xpm -rm -f rip.img GEM_RSC.RSC title.img nh16.img NetHack.ad + -rm -f ../include/jdata.h diff -aurbN -xCVS -xXTAGS nethack/sys/unix/Makefile.doc jnethack/sys/unix/Makefile.doc --- nethack/sys/unix/Makefile.doc 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/unix/Makefile.doc 2003-12-10 00:54:10.000000000 +0900 @@ -41,7 +41,7 @@ GAME = nethack -MANDIR = /usr/man/man6 +MANDIR = /usr/local/man/man6 MANEXT = 6 # manual installation for most BSD-style systems diff -aurbN -xCVS -xXTAGS nethack/sys/unix/Makefile.src jnethack/sys/unix/Makefile.src --- nethack/sys/unix/Makefile.src 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/unix/Makefile.src 2003-12-10 00:54:10.000000000 +0900 @@ -55,6 +55,9 @@ #SYSSRC = ../sys/be/bemain.c ../sys/share/unixtty.c ../sys/share/ioctl.c #SYSOBJ = bemain.o unixtty.o ioctl.o +#JP by issei(93/11/10) +JSRC = ../japanese/jconj.c ../japanese/jtrns.c ../japanese/jlib.c +JOBJ = jconj.o jtrns.o jlib.o # if you are using gcc as your compiler: # uncomment the CC definition below if it's not in your environment @@ -69,7 +72,7 @@ # # If you are using GCC 2.2.2 or higher on a DPX/2, just use: # -# CC = gcc -ansi +CC = gcc # # For HP/UX 10.20 with GCC: # CC = gcc -D_POSIX_SOURCE @@ -151,7 +154,7 @@ # flags for debugging: # CFLAGS = -g -I../include -CFLAGS = -O -I../include +CFLAGS = -W -g -O -I../include LFLAGS = # The Qt and Be window systems are written in C++, while the rest of @@ -164,6 +167,16 @@ #CXX=arm-linux-g++ #LINK=arm-linux-gcc +# flags for IPv6 support +# for Linux + glibc-2.1.x / Solaris users +# CFLAGS += -DINET6 +# for KAME users +# CFLAGS += -DINET6 +# LFLAGS += -L/usr/local/v6/lib -linet6 +# for Linux libinet users +# CFLAGS = -DINET6 -I/usr/inet6/include $(CFLAGS) +# LFLAGS += -L/usr/inet6/lib -linet6 + # Set the WINSRC, WINOBJ, and WINLIB lines to correspond to your desired # combination of windowing systems. Also set windowing systems in config.h. # Note that if you are including multiple tiled window systems, you don't @@ -230,8 +243,8 @@ # WINTTYLIB = -ltermcap # WINTTYLIB = -lcurses # WINTTYLIB = -lcurses16 -# WINTTYLIB = -lncurses -WINTTYLIB = -ltermlib + WINTTYLIB = -lncurses +# WINTTYLIB = -ltermlib # # libraries for X11 # If USE_XPM is defined in config.h, you will also need -lXpm here. @@ -282,10 +295,14 @@ # IRIX 4.0.x needs -lsun if NIS (YP) is being used for passwd file lookup # LIBS = -lsun # +# FreeBSD-2.2 needs -lxpg4 to use locale +# LIBS = -lxpg4 +# LIBS = # make NetHack -GAME = nethack +#JP by issei(96/5/27) +GAME = jnethack # GAME = nethack.prg # if you defined RANDOM in unixconf.h/tosconf.h since your system did not come @@ -343,10 +360,10 @@ WINCXXSRC = $(WINQTSRC) $(WINBESRC) # .c files for this version (for date.h) -VERSOURCES = $(HACKCSRC) $(SYSSRC) $(WINSRC) $(GENCSRC) +VERSOURCES = $(HACKCSRC) $(JSRC) $(SYSSRC) $(WINSRC) $(GENCSRC) # .c files for all versions using this Makefile (for lint and tags) -CSOURCES = $(HACKCSRC) $(SYSSRC) $(WINCSRC) $(GENCSRC) +CSOURCES = $(HACKCSRC) $(JSRC) $(SYSSRC) $(WINCSRC) $(GENCSRC) # all .h files except date.h, onames.h, pm.h, and vis_tab.h which would @@ -384,7 +401,7 @@ steal.o steed.o teleport.o timeout.o topten.o track.o trap.o u_init.o \ uhitm.o vault.o vision.o vis_tab.o weapon.o were.o wield.o windows.o \ wizard.o worm.o worn.o write.o zap.o \ - $(RANDOBJ) $(SYSOBJ) $(WINOBJ) version.o + $(RANDOBJ) $(JOBJ) $(SYSOBJ) $(WINOBJ) version.o # the .o files from the HACKCSRC, SYSSRC, and WINSRC lists $(GAME): $(SYSTEM) @@ -488,6 +505,9 @@ vis_tab.c: ../include/vis_tab.h tile.c: ../win/share/tilemap.c $(HACK_H) @( cd ../util ; $(MAKE) ../src/tile.c ) +#JP by issei(94/07/13) +../include/jdata.h: $(MAKEDEFS) ../dat/jtrnsobj.dat ../dat/jtrnsmon.dat + @( cd ../util ; $(MAKE) ../include/jdata.h ) ../win/gnome/gn_rip.h: ../win/X11/rip.xpm cp ../win/X11/rip.xpm ../win/gnome/gn_rip.h @@ -684,6 +704,32 @@ gr_rect.o: ../win/gem/gr_rect.c ../include/gr_rect.h $(CC) $(CFLAGS) -c ../win/gem/gr_rect.c tile.o: tile.c $(HACK_H) +jconj.o: ../japanese/jconj.c ../include/hack.h + $(CC) $(CFLAGS) -c ../japanese/jconj.c +jtrns.o: ../japanese/jtrns.c ../include/hack.h ../include/jdata.h + $(CC) $(CFLAGS) -c ../japanese/jtrns.c +jlib.o: ../japanese/jlib.c ../include/hack.h + $(CC) $(CFLAGS) -c ../japanese/jlib.c +gtk.o: ../win/gtk/gtk.c ../include/hack.h ../include/winGTK.h + $(CC) $(CFLAGS) -c ../win/gtk/gtk.c +gtkgetlin.o: ../win/gtk/gtkgetlin.c ../include/hack.h ../include/winGTK.h + $(CC) $(CFLAGS) -c ../win/gtk/gtkgetlin.c +gtkstatus.o: ../win/gtk/gtkstatus.c ../include/hack.h ../include/winGTK.h + $(CC) $(CFLAGS) -c ../win/gtk/gtkstatus.c +gtkmenu.o: ../win/gtk/gtkmenu.c ../include/hack.h ../include/winGTK.h + $(CC) $(CFLAGS) -c ../win/gtk/gtkmenu.c +gtkyn.o: ../win/gtk/gtkyn.c ../include/hack.h ../include/winGTK.h + $(CC) $(CFLAGS) -c ../win/gtk/gtkyn.c +gtkmap.o: ../win/gtk/gtkmap.c ../include/hack.h ../include/winGTK.h + $(CC) $(CFLAGS) -c ../win/gtk/gtkmap.c +gtkmessage.o: ../win/gtk/gtkmessage.c ../include/hack.h ../include/winGTK.h + $(CC) $(CFLAGS) -c ../win/gtk/gtkmessage.c +gtkmisc.o: ../win/gtk/gtkmisc.c ../include/hack.h ../include/winGTK.h + $(CC) $(CFLAGS) -c ../win/gtk/gtkmisc.c +xshmmap.o: ../win/gtk/xshmmap.c ../include/hack.h ../include/winGTK.h + $(CC) $(CFLAGS) -c ../win/gtk/xshmmap.c +xshm.o: ../win/gtk/xshm.c ../include/hack.h ../include/xshm.h + $(CC) $(CFLAGS) -c ../win/gtk/xshm.c qt_win.o: ../win/Qt/qt_win.cpp $(HACK_H) ../include/func_tab.h \ ../include/dlb.h ../include/patchlevel.h ../include/tile2x11.h \ ../include/qt_win.h ../include/qt_clust.h ../include/qt_kde0.h \ diff -aurbN -xCVS -xXTAGS nethack/sys/unix/Makefile.top jnethack/sys/unix/Makefile.top --- nethack/sys/unix/Makefile.top 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/unix/Makefile.top 2003-12-10 00:54:10.000000000 +0900 @@ -15,7 +15,7 @@ # make NetHack PREFIX = /usr -GAME = nethack +GAME = jnethack # GAME = nethack.prg GAMEUID = games GAMEGRP = bin @@ -50,7 +50,7 @@ # for Gnome # VARDATND = x11tiles pet_mark.xbm rip.xpm mapbg.xpm -VARDATD = data oracles options quest.dat rumors +VARDATD = data joracles options quest.dat jrumors VARDAT = $(VARDATD) $(VARDATND) # Some versions of make use the SHELL environment variable as the shell @@ -71,7 +71,9 @@ # end of configuration # -DATHELP = help hh cmdhelp history opthelp wizhelp +# by issei 1994/2/5, 1994/6/25 +#DATHELP = help hh cmdhelp history opthelp wizhelp +DATHELP = jhelp jhh jcmdhelp jhistory jopthelp jwizhelp SPEC_LEVS = asmodeus.lev baalz.lev bigrm-?.lev castle.lev fakewiz?.lev \ juiblex.lev knox.lev medusa-?.lev minend-?.lev minefill.lev \ @@ -102,11 +104,11 @@ data: $(GAME) ( cd dat ; $(MAKE) data ) -rumors: $(GAME) - ( cd dat ; $(MAKE) rumors ) +jrumors: $(GAME) + ( cd dat ; $(MAKE) jrumors ) -oracles: $(GAME) - ( cd dat ; $(MAKE) oracles ) +joracles: $(GAME) + ( cd dat ; $(MAKE) joracles ) # Note: options should have already been made with make, but... options: $(GAME) @@ -201,6 +203,9 @@ dofiles-dlb: check-dlb ( cd dat ; cp nhdat $(DATNODLB) $(GAMEDIR) ) +# ( cd win/X11 ; cp JNetHack.ad $(GAMEDIR)/JNetHack ) +# ( cd win/gtk ; cp GTKRC $(GAMEDIR)/gtkrc ) +# ( bdftopcf win/X11/nh10.bdf > $(GAMEDIR)/nh10.pcf ; mkfontdir $(GAMEDIR)) # set up their permissions -( cd $(GAMEDIR) ; $(CHOWN) $(GAMEUID) nhdat $(DATNODLB) ; \ $(CHGRP) $(GAMEGRP) nhdat $(DATNODLB) ; \ @@ -209,6 +214,9 @@ dofiles-nodlb: # copy over the game files ( cd dat ; cp $(DAT) $(GAMEDIR) ) +# ( cd win/X11 ; cp JNetHack.ad $(GAMEDIR)/JNetHack ) +# ( cd win/gtk ; cp GTKRC $(GAMEDIR)/gtkrc ) +# ( bdftopcf win/X11/nh10.bdf > $(GAMEDIR)/nh10.pcf ; mkfontdir $(GAMEDIR)) # set up their permissions -( cd $(GAMEDIR) ; $(CHOWN) $(GAMEUID) $(DAT) ; \ $(CHGRP) $(GAMEGRP) $(DAT) ; \ @@ -235,7 +243,7 @@ # not all mkdirs have -p; those that don't will create a -p directory -mkdir -p $(SHELLDIR) -rm -rf $(GAMEDIR) $(VARDIR) - -mkdir -p $(GAMEDIR) $(VARDIR) $(VARDIR)/save + -mkdir -p $(SHELLDIR)/lib $(GAMEDIR) $(VARDIR) $(VARDIR)/save -rmdir ./-p -$(CHOWN) $(GAMEUID) $(GAMEDIR) $(VARDIR) $(VARDIR)/save $(CHGRP) $(GAMEGRP) $(GAMEDIR) $(VARDIR) $(VARDIR)/save diff -aurbN -xCVS -xXTAGS nethack/sys/unix/Makefile.utl jnethack/sys/unix/Makefile.utl --- nethack/sys/unix/Makefile.utl 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/unix/Makefile.utl 2003-12-10 00:54:10.000000000 +0900 @@ -15,7 +15,7 @@ # if you are using gcc as your compiler, # uncomment the CC definition below if it's not in your environment -# CC = gcc +CC = gcc # # For Bull DPX/2 systems at B.O.S. 2.0 or higher use the following: # @@ -101,11 +101,11 @@ # yacc/lex programs to use to generate *_comp.h, *_lex.c, and *_yacc.c. # if, instead of yacc/lex you have bison/flex, comment/uncomment the following. -YACC = yacc -LEX = lex -# YACC = bison -y +# YACC = yacc +# LEX = lex +YACC = bison -y # YACC = byacc -# LEX = flex +LEX = flex -8 # these are the names of the output files from YACC/LEX. Under MS-DOS # and similar systems, they may differ @@ -191,6 +191,8 @@ ./makedefs -m ../include/vis_tab.h: makedefs ./makedefs -z +../include/jdata.h: makedefs ../dat/jtrnsmon.dat ../dat/jtrnsobj.dat + ./makedefs -j # makedefs -z makes both vis_tab.h and vis_tab.c, but writes the .h first ../src/vis_tab.c: ../include/vis_tab.h diff -aurbN -xCVS -xXTAGS nethack/sys/unix/nethack.sh jnethack/sys/unix/nethack.sh --- nethack/sys/unix/nethack.sh 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/unix/nethack.sh 2003-12-10 00:54:10.000000000 +0900 @@ -4,7 +4,31 @@ HACKDIR=/usr/games/lib/nethackdir export HACKDIR HACK=$HACKDIR/nethack -MAXNROFPLAYERS=4 +MAXNROFPLAYERS=20 + +# JP +# set LC_ALL, NETHACKOPTIONS etc.. +# +if [ "X$LC_ALL" = "X" -o "X$LC_ALL" = "XC" ] ; then + LC_ALL=ja_JP.eucJP + export LC_ALL +fi +if [ "X$LANG" = "X" -o "X$LANG" = "XC" ] ; then + LANG=ja_JP.eucJP + export LANG +fi +if [ "X$NETHACKOPTIONS" = "X" ] ; then + NEXTHACKOPTIONS= + export NETHACKOPTIONS +fi +if [ "X$USERFILESEARCHPATH" = "X" ] ; then + USERFILESEARCHPATH=$HACKDIR/%L/%N%C%S:$HACKDIR/%N%C%S:$HACKDIR/%N%S + export USERFILESEARCHPATH +fi + +#if [ "X$DISPLAY" ] ; then +# xset fp+ $HACKDIR +#fi # Since Nethack.ad is installed in HACKDIR, add it to XUSERFILESEARCHPATH case "x$XUSERFILESEARCHPATH" in diff -aurbN -xCVS -xXTAGS nethack/sys/unix/unixmain.c jnethack/sys/unix/unixmain.c --- nethack/sys/unix/unixmain.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/unix/unixmain.c 2005-06-16 01:34:45.000000000 +0900 @@ -2,6 +2,12 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright (C) Issei Numata, 1994-1999 +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + /* main.c - Unix NetHack */ #include "hack.h" @@ -14,6 +20,10 @@ #include #endif +#ifdef XI18N +#include +#endif + #if !defined(_BULL_SOURCE) && !defined(__sgi) && !defined(_M_UNIX) # if !defined(SUNOS4) && !(defined(ULTRIX) && defined(__GNUC__)) # if defined(POSIX_TYPES) || defined(SVR4) || defined(HPUX) @@ -55,6 +65,9 @@ #endif boolean exact_username; +#ifdef XI18N + setlocale(LC_ALL, ""); +#endif #if defined(__APPLE__) /* special hack to change working directory to a resource fork when running from finder --sam */ @@ -130,11 +143,20 @@ #ifdef CHDIR chdirx(dir,0); #endif +#if 1 /*JP*/ + setkcode('I'); + initoptions(); + init_jtrns(); prscore(argc, argv); + jputchar('\0'); /* reset */ +#else + prscore(argc, argv); +#endif exit(EXIT_SUCCESS); } } + /* * Change directories before we initialize the window system so * we can find the tile file. @@ -149,6 +171,13 @@ #ifdef __linux__ check_linux_console(); #endif +#if 1 /*JP*/ + /* Line like "OPTIONS=name:foo-@" may exist in config file. + * In this case, need to select random class, + * so must call setrandom() before initoptions(). + */ + setrandom(); +#endif initoptions(); init_nhwindows(&argc,argv); exact_username = whoami(); @@ -253,7 +282,10 @@ iflags.news = FALSE; /* in case dorecover() fails */ } #endif +/*JP pline("Restoring save file..."); +*/ + pline("セーブファイルを復元中..."); mark_synch(); /* flush output */ if(!dorecover(fd)) goto not_recovered; @@ -264,7 +296,10 @@ wd_message(); if (discover || wizard) { +/*JP if(yn("Do you want to keep the save file?") == 'n') +*/ + if(yn("セーブファイルを残しておきますか?") == 'n') (void) delete_savefile(); else { (void) chmod(fq_save,FCMASK); /* back to readable */ @@ -505,17 +540,26 @@ { #ifdef WIZARD if (wiz_error_flag) { +/*JP pline("Only user \"%s\" may access debug (wizard) mode.", +*/ + pline("「%s」のみがデバッグ(wizard)モードを使用できる.", # ifndef KR1ED WIZARD); # else WIZARD_NAME); # endif +/*JP pline("Entering discovery mode instead."); +*/ + pline("かわりに発見モードへ移行する."); } else #endif if (discover) +/*JP You("are in non-scoring discovery mode."); +*/ + You("スコアの載らない発見モードで起動した."); } /* diff -aurbN -xCVS -xXTAGS nethack/sys/unix/unixunix.c jnethack/sys/unix/unixunix.c --- nethack/sys/unix/unixunix.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/unix/unixunix.c 2004-01-09 17:26:07.000000000 +0900 @@ -2,6 +2,12 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + /* This file collects some Unix dependencies */ #include "hack.h" /* mainly for index() which depends on BSD */ @@ -150,10 +156,18 @@ (void) close(fd); if(iflags.window_inited) { +/*JP c = yn("There is already a game in progress under your name. Destroy old game?"); +*/ + c = yn("あなたの名前で不正終了したゲームが残っています.破棄しますか?"); } else { +#if 0 /*JP*/ (void) printf("\nThere is already a game in progress under your name."); (void) printf(" Destroy old game? [yn] "); +#else + (void) printf("\nあなたの名前で不正終了したゲームが残っています."); + (void) printf("破棄しますか?[yn] "); +#endif (void) fflush(stdout); c = getchar(); (void) putchar(c); @@ -193,10 +207,28 @@ regularize(s) /* normalize file name - we don't like .'s, /'s, spaces */ register char *s; { +#if 0 /*JP*/ register char *lp; +#else + register unsigned char *lp; +#endif +#ifdef SJIS_FILESYSTEM + lp = (unsigned char *)ic2str( s ); + strcpy(s, lp); + for (lp = s; *lp; lp++){ + if(is_kanji(*lp)){ + lp++; + continue; + } + if(*lp == '.' || *lp == '/' || *lp == ' '){ + *lp = '_'; + } + } +#else while((lp=index(s, '.')) || (lp=index(s, '/')) || (lp=index(s,' '))) *lp = '_'; +#endif #if defined(SYSV) && !defined(AIX_31) && !defined(SVR4) && !defined(LINUX) && !defined(__APPLE__) /* avoid problems with 14 character file name limit */ # ifdef COMPRESS diff -aurbN -xCVS -xXTAGS nethack/sys/winnt/Makefile.bcc jnethack/sys/winnt/Makefile.bcc --- nethack/sys/winnt/Makefile.bcc 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/winnt/Makefile.bcc 2003-12-10 00:54:10.000000000 +0900 @@ -120,6 +120,7 @@ TTY = ..\win\tty # window port files (tty) WIN32 = ..\win\win32 # window port files (Win32) WSHR = ..\win\share # Tile support files +JP = ..\japanese # # Object directory. @@ -370,6 +371,8 @@ U = $(UTIL)^\ +J = $(JP)^\ + # # Utility Objects. # @@ -453,7 +456,9 @@ VVOBJ = $(O)version.o -ALLOBJ = $(TILOBJ) $(SOBJ) $(DLBOBJ) $(TTYOBJ) $(WOBJ) $(OBJS) $(VVOBJ) +JOBJ = $(O)jconj.o $(O)jlib.o $(O)jtrns.o + +ALLOBJ = $(TILOBJ) $(SOBJ) $(DLBOBJ) $(TTYOBJ) $(WOBJ) $(OBJS) $(VVOBJ) $(JOBJ) !IF "$(GRAPHICAL)" == "Y" @@ -496,7 +501,7 @@ # Miscellaneous #========================================== -DATABASE = $(DAT)\data.base +DATABASE = $(DAT)\jdata.base # # The name of the game. @@ -910,6 +915,8 @@ $(INCL)\win32api.h: $(NTSYS)\win32api.h copy $(NTSYS)\win32api.h $@ +$(INCL)\jdata.h: $(U)makedefs.exe $(DAT)\jtrnsobj.dat $(DAT)\jtrnsmon.dat + $(U)makedefs -j #========================================== @@ -935,19 +942,19 @@ $(DAT)\license $(O)sp_lev.tag cd $(DAT) echo data >dlb.lst - echo oracles >>dlb.lst + echo joracles >>dlb.lst if exist options echo options >>dlb.lst if exist ttyoptions echo ttyoptions >>dlb.lst if exist guioptions echo guioptions >>dlb.lst if exist porthelp echo porthelp >>dlb.lst echo quest.dat >>dlb.lst - echo rumors >>dlb.lst - echo help >>dlb.lst - echo hh >>dlb.lst - echo cmdhelp >>dlb.lst - echo history >>dlb.lst - echo opthelp >>dlb.lst - echo wizhelp >>dlb.lst + echo jrumors >>dlb.lst + echo jhelp >>dlb.lst + echo jhh >>dlb.lst + echo jcmdhelp >>dlb.lst + echo jhistory >>dlb.lst + echo jopthelp >>dlb.lst + echo jwizhelp >>dlb.lst echo dungeon >>dlb.lst echo license >>dlb.lst for %N in (*.lev) do echo %N >>dlb.lst @@ -1102,7 +1109,7 @@ $(DAT)\rumors: $(O)utility.tag $(DAT)\rumors.tru $(DAT)\rumors.fal $(U)makedefs -r -$(DAT)\quest.dat: $(O)utility.tag $(DAT)\quest.txt +$(DAT)\quest.dat: $(O)utility.tag $(DAT)\jquest.txt $(U)makedefs -q $(DAT)\oracles: $(O)utility.tag $(DAT)\oracles.txt @@ -1373,6 +1380,10 @@ $(O)worn.o: worn.c $(HACK_H) $(O)write.o: write.c $(HACK_H) $(O)zap.o: zap.c $(HACK_H) +#JNH +$(O)jlib.o: $(JP)\jlib.c $(HACK_H) +$(O)jconj.o: $(JP)\jconj.c $(HACK_H) +$(O)jtrns.o: $(JP)\jtrns.c $(HACK_H) $(INCL)\jdata.h # end of file diff -aurbN -xCVS -xXTAGS nethack/sys/winnt/Makefile.gcc jnethack/sys/winnt/Makefile.gcc --- nethack/sys/winnt/Makefile.gcc 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/winnt/Makefile.gcc 2003-12-10 00:54:10.000000000 +0900 @@ -41,7 +41,7 @@ # Set to anything else (or undefine) for a "release" version # You can set your debug options below. -DEBUG = Y +DEBUG = N cc = gcc rc = windres @@ -390,6 +390,7 @@ VOBJ25 = $(O)vis_tab.o $(O)vision.o $(O)weapon.o $(O)were.o VOBJ26 = $(O)wield.o $(O)windows.o $(O)wizard.o $(O)worm.o VOBJ27 = $(O)worn.o $(O)write.o $(O)zap.o +JOBJ = $(O)jconj.o $(O)jlib.o $(O)jtrns.o DLBOBJ = $(O)dlb.o @@ -403,7 +404,7 @@ $(VOBJ11) $(VOBJ12) $(VOBJ13) $(VOBJ14) $(VOBJ15) \ $(VOBJ16) $(VOBJ17) $(VOBJ18) $(VOBJ19) $(VOBJ20) \ $(VOBJ21) $(VOBJ22) $(VOBJ23) $(VOBJ24) $(VOBJ25) \ - $(VOBJ26) $(VOBJ27) + $(VOBJ26) $(VOBJ27) $(JOBJ) WINPOBJ = $(WINPORT) @@ -452,7 +453,7 @@ # Miscellaneous #========================================== -DATABASE = $(DAT)/data.base +DATABASE = $(DAT)/jdata.base # # The name of the game. @@ -493,8 +494,8 @@ @echo Done. -$(O)install.tag: $(DAT)/data $(DAT)/rumors $(DAT)/dungeon \ - $(DAT)/oracles $(DAT)/quest.dat $(O)sp_lev.tag $(DLB) +$(O)install.tag: $(DAT)/data $(DAT)/jrumors $(DAT)/dungeon \ + $(DAT)/joracles $(DAT)/quest.dat $(O)sp_lev.tag $(DLB) ifeq "$(USE_DLB)" "Y" $(subst /,\,copy nhdat $(GAMEDIR)) $(subst /,\,copy $(DAT)/license $(GAMEDIR)) @@ -505,7 +506,7 @@ $(subst /,\,copy $(DAT)/*.lev $(GAMEDIR)) $(subst /,\,if exist $(GAMEDIR)/makefile del $(GAMEDIR)/makefile) endif - $(subst /,\,if exist $(DOC)/guidebook.txt copy $(DOC)/guidebook.txt $(GAMEDIR)/Guidebook.txt) + $(subst /,\,if exist $(DOC)/jguidebook.txt copy $(DOC)/jguidebook.txt $(GAMEDIR)/jGuidebook.txt) $(subst /,\,if exist $(DOC)/nethack.txt copy $(DOC)/nethack.txt $(GAMEDIR)/NetHack.txt) $(subst /,\,copy $(NTSYS)/defaults.nh $(GAMEDIR)/defaults.nh) $(subst /,\,echo install done > $@) @@ -675,6 +676,9 @@ $(SRC)/vis_tab.c: $(U)makedefs.exe $(subst /,\,$(U)makedefs -z) +$(INCL)/jdata.h : $(U)makedefs.exe + $(subst /,\,$(U)makedefs -j) + #========================================== # uudecode utility and uuencoded targets #========================================== @@ -869,24 +873,24 @@ $(DAT)/porthelp: $(NTSYS)/porthelp $(subst /,\,@copy $(NTSYS)/porthelp $@ >nul) -nhdat: $(U)dlb_main.exe $(DAT)/data $(DAT)/oracles $(OPTIONS_FILE) \ - $(DAT)/quest.dat $(DAT)/rumors $(DAT)/help $(DAT)/hh $(DAT)/cmdhelp \ - $(DAT)/history $(DAT)/opthelp $(DAT)/wizhelp $(DAT)/dungeon \ +nhdat: $(U)dlb_main.exe $(DAT)/data $(DAT)/joracles $(OPTIONS_FILE) \ + $(DAT)/quest.dat $(DAT)/jrumors $(DAT)/jhelp $(DAT)/jhh $(DAT)/jcmdhelp \ + $(DAT)/jhistory $(DAT)/jopthelp $(DAT)/jwizhelp $(DAT)/dungeon \ $(DAT)/porthelp $(DAT)/license $(O)sp_lev.tag $(subst /,\,echo data >$(DAT)/dlb.lst) - $(subst /,\,echo oracles >>$(DAT)/dlb.lst) + $(subst /,\,echo joracles >>$(DAT)/dlb.lst) $(subst /,\,if exist $(DAT)/options echo options >>$(DAT)/dlb.lst) $(subst /,\,if exist $(DAT)/ttyoptions echo ttyoptions >>$(DAT)/dlb.lst) $(subst /,\,if exist $(DAT)/guioptions echo guioptions >>$(DAT)/dlb.lst) $(subst /,\,if exist $(DAT)/porthelp echo porthelp >>$(DAT)/dlb.lst) $(subst /,\,echo quest.dat >>$(DAT)/dlb.lst) - $(subst /,\,echo rumors >>$(DAT)/dlb.lst) - $(subst /,\,echo help >>$(DAT)/dlb.lst) - $(subst /,\,echo hh >>$(DAT)/dlb.lst) - $(subst /,\,echo cmdhelp >>$(DAT)/dlb.lst) - $(subst /,\,echo history >>$(DAT)/dlb.lst) - $(subst /,\,echo opthelp >>$(DAT)/dlb.lst) - $(subst /,\,echo wizhelp >>$(DAT)/dlb.lst) + $(subst /,\,echo jrumors >>$(DAT)/dlb.lst) + $(subst /,\,echo jhelp >>$(DAT)/dlb.lst) + $(subst /,\,echo jhh >>$(DAT)/dlb.lst) + $(subst /,\,echo jcmdhelp >>$(DAT)/dlb.lst) + $(subst /,\,echo jhistory >>$(DAT)/dlb.lst) + $(subst /,\,echo jopthelp >>$(DAT)/dlb.lst) + $(subst /,\,echo jwizhelp >>$(DAT)/dlb.lst) $(subst /,\,echo dungeon >>$(DAT)/dlb.lst) $(subst /,\,echo license >>$(DAT)/dlb.lst) dir /l /b /-p $(subst /,\,$(DAT)/*.lev >>$(DAT)/dlb.lst) @@ -1066,13 +1070,14 @@ $(DAT)/data: $(O)utility.tag $(DATABASE) $(subst /,\,$(U)makedefs -d) -$(DAT)/rumors: $(O)utility.tag $(DAT)/rumors.tru $(DAT)/rumors.fal +$(DAT)/jrumors: $(O)utility.tag $(DAT)/rumors.tru $(DAT)/rumors.fal $(subst /,\,$(U)makedefs -r) -$(DAT)/quest.dat: $(O)utility.tag $(DAT)/quest.txt +$(DAT)/quest.dat: $(O)utility.tag $(DAT)/jquest.txt $(subst /,\,$(U)makedefs -q) -$(DAT)/oracles: $(O)utility.tag $(DAT)/oracles.txt + +$(DAT)/joracles: $(O)utility.tag $(DAT)/oracles.txt $(subst /,\,$(U)makedefs -h) $(DAT)/dungeon: $(O)utility.tag $(DAT)/dungeon.def @@ -1100,6 +1105,17 @@ $(cc) $(CFLAGS) -o$@ $(U)panic.c # +# Japanese translation +# + +$(O)jconj.o: ../japanese/jconj.c $(HACK_H) + $(cc) $(CFLAGS) -o$@ ../japanese/jconj.c +$(O)jlib.o: ../japanese/jlib.c $(HACK_H) + $(cc) $(CFLAGS) -o$@ ../japanese/jlib.c +$(O)jtrns.o: ../japanese/jtrns.c $(HACK_H) ../include/jdata.h + $(cc) $(CFLAGS) -o$@ ../japanese/jtrns.c + +# # The rest are stolen from sys/unix/Makefile.src, # with the following changes: # * ../include changed to $(INCL) diff -aurbN -xCVS -xXTAGS nethack/sys/winnt/Makefile.msc jnethack/sys/winnt/Makefile.msc --- nethack/sys/winnt/Makefile.msc 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/winnt/Makefile.msc 2003-12-10 00:54:10.000000000 +0900 @@ -41,7 +41,7 @@ !IF "$(GRAPHICAL)" == "Y" GAME = NetHackW # Game Name !ELSE -GAME = NetHack # Game Name +GAME = JNetHack # Game Name !ENDIF GAMEDIR = ..\binary # Game directory @@ -60,6 +60,7 @@ TTY = ..\win\tty # window port files (tty) WIN32 = ..\win\win32 # window port files (Win32) WSHR = ..\win\share # Tile support files +JP = ..\japanese # JP # # Object directory. @@ -277,6 +278,12 @@ {$(TTY)}.c{$(OBJ)}.o: @$(CC) $(CFLAGS) -Fo$@ $< +#========================================== +# Rules for files in japanese +#========================================== + +{$(JP)}.c{$(OBJ)}.o: + @$(CC) $(CFLAGS) -Fo$@ $< #========================================== # Rules for files in win\win32 @@ -370,6 +377,7 @@ VOBJ25 = $(O)vis_tab.o $(O)vision.o $(O)weapon.o $(O)were.o VOBJ26 = $(O)wield.o $(O)windows.o $(O)wizard.o $(O)worm.o VOBJ27 = $(O)worn.o $(O)write.o $(O)zap.o +JOBJ = $(O)jlib.o $(O)jtrns.o $(O)jconj.o DLBOBJ = $(O)dlb.o @@ -389,7 +397,7 @@ VVOBJ = $(O)version.o -ALLOBJ = $(WINPOBJ) $(SOBJ) $(DLBOBJ) $(TTYOBJ) $(WOBJ) $(OBJS) $(VVOBJ) +ALLOBJ = $(WINPOBJ) $(SOBJ) $(DLBOBJ) $(TTYOBJ) $(WOBJ) $(OBJS) $(VVOBJ) $(JOBJ) !IF "$(GRAPHICAL)" == "Y" OPTIONS_FILE = $(DAT)\guioptions @@ -431,7 +439,7 @@ # Miscellaneous #========================================== -DATABASE = $(DAT)\data.base +DATABASE = $(DAT)\jdata.base # # The name of the game. @@ -464,8 +472,8 @@ install: envchk $(GAME) $(O)install.tag @echo Done. -$(O)install.tag: $(DAT)\data $(DAT)\rumors $(DAT)\dungeon \ - $(DAT)\oracles $(DAT)\quest.dat $(O)sp_lev.tag $(DLB) +$(O)install.tag: $(DAT)\data $(DAT)\jrumors $(DAT)\dungeon \ + $(DAT)\joracles $(DAT)\quest.dat $(O)sp_lev.tag $(DLB) ! IF ("$(USE_DLB)"=="Y") copy nhdat $(GAMEDIR) copy $(DAT)\license $(GAMEDIR) @@ -476,7 +484,7 @@ copy $(DAT)\*.lev $(GAMEDIR) if exist $(GAMEDIR)\makefile del $(GAMEDIR)\makefile ! ENDIF - if exist $(DOC)\guidebook.txt copy $(DOC)\guidebook.txt $(GAMEDIR)\Guidebook.txt + if exist $(DOC)\jguidebook.txt copy $(DOC)\jguidebook.txt $(GAMEDIR)\jGuidebook.txt if exist $(DOC)\nethack.txt copy $(DOC)\nethack.txt $(GAMEDIR)\NetHack.txt @if exist $(SRC)\$(GAME).PDB copy $(SRC)\$(GAME).pdb $(GAMEDIR)\$(GAME).pdb @if exist $(GAMEDIR)\$(GAME).PDB echo NOTE: You may want to remove $(GAMEDIR)\$(GAME).pdb to conserve space @@ -653,6 +661,9 @@ @if not exist $(OBJ)\*.* mkdir $(OBJ) @$(CC) $(CFLAGSU) -Fo$@ $(U)makedefs.c +$(INCL)\jdata.h: $(U)makedefs.exe $(DAT)\jtrnsobj.dat $(DAT)\jtrnsmon.dat + $(U)makedefs -j + # # date.h should be remade every time any of the source or include # files is modified. @@ -907,25 +918,25 @@ $(DAT)\porthelp: $(NTSYS)\porthelp @copy $(NTSYS)\porthelp $@ >nul -nhdat: $(U)dlb_main.exe $(DAT)\data $(DAT)\oracles $(OPTIONS_FILE) \ - $(DAT)\quest.dat $(DAT)\rumors $(DAT)\help $(DAT)\hh $(DAT)\cmdhelp \ - $(DAT)\history $(DAT)\opthelp $(DAT)\wizhelp $(DAT)\dungeon $(DAT)\porthelp \ +nhdat: $(U)dlb_main.exe $(DAT)\data $(DAT)\joracles $(OPTIONS_FILE) \ + $(DAT)\quest.dat $(DAT)\jrumors $(DAT)\jhelp $(DAT)\jhh $(DAT)\jcmdhelp \ + $(DAT)\jhistory $(DAT)\jopthelp $(DAT)\jwizhelp $(DAT)\dungeon $(DAT)\porthelp \ $(DAT)\license $(O)sp_lev.tag cd $(DAT) echo data >dlb.lst - echo oracles >>dlb.lst + echo joracles >>dlb.lst if exist options echo options >>dlb.lst if exist ttyoptions echo ttyoptions >>dlb.lst if exist guioptions echo guioptions >>dlb.lst if exist porthelp echo porthelp >>dlb.lst echo quest.dat >>dlb.lst - echo rumors >>dlb.lst - echo help >>dlb.lst - echo hh >>dlb.lst - echo cmdhelp >>dlb.lst - echo history >>dlb.lst - echo opthelp >>dlb.lst - echo wizhelp >>dlb.lst + echo jrumors >>dlb.lst + echo jhelp >>dlb.lst + echo jhh >>dlb.lst + echo jcmdhelp >>dlb.lst + echo jhistory >>dlb.lst + echo jopthelp >>dlb.lst + echo jwizhelp >>dlb.lst echo dungeon >>dlb.lst echo license >>dlb.lst for %%N in (*.lev) do echo %%N >>dlb.lst @@ -1085,9 +1096,9 @@ if exist $(DAT)\ttyoptions del $(DAT)\ttyoptions if exist $(DAT)\guioptions del $(DAT)\guioptions if exist $(DAT)\oracle.lev del $(DAT)\oracle.lev - if exist $(DAT)\oracles del $(DAT)\oracles + if exist $(DAT)\joracles del $(DAT)\joracles if exist $(DAT)\orcus.lev del $(DAT)\orcus.lev - if exist $(DAT)\rumors del $(DAT)\rumors + if exist $(DAT)\jrumors del $(DAT)\jrumors if exist $(DAT)\quest.dat del $(DAT)\quest.dat if exist $(DAT)\sanctum.lev del $(DAT)\sanctum.lev if exist $(DAT)\soko?-?.lev del $(DAT)\soko?-?.lev @@ -1099,6 +1110,7 @@ if exist $(SRC)\monstr.c del $(SRC)\monstr.c if exist $(SRC)\vis_tab.c del $(SRC)\vis_tab.c if exist $(U)recover.exe del $(U)recover.exe + if exist $(INCL)\jdata.h del $(INCL)\jdata.h if exist nhdat. del nhdat. if exist $(O)obj.tag del $(O)obj.tag if exist $(O)gamedir.tag del $(O)gamedir.tag @@ -1130,13 +1142,13 @@ $(DAT)\data: $(O)utility.tag $(DATABASE) $(U)makedefs -d -$(DAT)\rumors: $(O)utility.tag $(DAT)\rumors.tru $(DAT)\rumors.fal +$(DAT)\jrumors: $(O)utility.tag $(DAT)\jrumors.tru $(DAT)\jrumors.fal $(U)makedefs -r -$(DAT)\quest.dat: $(O)utility.tag $(DAT)\quest.txt +$(DAT)\quest.dat: $(O)utility.tag $(DAT)\jquest.txt $(U)makedefs -q -$(DAT)\oracles: $(O)utility.tag $(DAT)\oracles.txt +$(DAT)\joracles: $(O)utility.tag $(DAT)\joracles.txt $(U)makedefs -h $(DAT)\dungeon: $(O)utility.tag $(DAT)\dungeon.def @@ -1416,4 +1428,12 @@ $(O)write.o: write.c $(HACK_H) $(O)zap.o: zap.c $(HACK_H) +# +# from japanese +# + +$(O)jlib.o: $(PCH) $(JP)\jlib.c $(HACK_H) +$(O)jconj.o: $(PCH) $(JP)\jconj.c $(HACK_H) +$(O)jtrns.o: $(PCH) $(JP)\jtrns.c $(HACK_H) $(INCL)\jdata.h + # end of file diff -aurbN -xCVS -xXTAGS nethack/sys/winnt/defaults.nh jnethack/sys/winnt/defaults.nh --- nethack/sys/winnt/defaults.nh 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/winnt/defaults.nh 2003-12-10 00:54:10.000000000 +0900 @@ -63,16 +63,19 @@ OPTIONS=map_mode:tiles,scroll_margin:5 # Message window settings -OPTIONS=font_message:Arial,font_size_message:9,align_message:top +#OPTIONS=font_message:Arial,font_size_message:9,align_message:top # Menu settings -OPTIONS=font_menu:Arial,font_size_menu:9 +#OPTIONS=font_menu:Arial,font_size_menu:9 # Text settings -OPTIONS=font_text:Courier New,font_size_text:9 +#OPTIONS=font_text:Courier New,font_size_text:9 # Status window settings -OPTIONS=font_status:Courier New,font_size_status:9 +#OPTIONS=font_status:Courier New,font_size_status:9 + +# JP: Screen Kanji Code +OPTIONS=kcode:sjis # Other OPTIONS=hilite_pet,!toptenwin diff -aurbN -xCVS -xXTAGS nethack/sys/winnt/nhdefkey.c jnethack/sys/winnt/nhdefkey.c --- nethack/sys/winnt/nhdefkey.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/winnt/nhdefkey.c 2003-12-10 00:54:10.000000000 +0900 @@ -163,6 +163,7 @@ if (vk == 0xBF) ch = M('?'); else ch = M(tolower(keycode)); } +#if 0 /*JP*/ /* Attempt to work better with international keyboards. */ else { WORD chr[2]; @@ -182,6 +183,11 @@ *valid = FALSE; } } +#else + if(ch != 0){ + *valid = TRUE; + } +#endif if (ch == '\r') ch = '\n'; #ifdef PORT_DEBUG if (portdebug) { diff -aurbN -xCVS -xXTAGS nethack/sys/winnt/nhsetup.bat jnethack/sys/winnt/nhsetup.bat --- nethack/sys/winnt/nhsetup.bat 2003-12-08 08:40:26.000000000 +0900 +++ jnethack/sys/winnt/nhsetup.bat 2003-12-10 00:54:10.000000000 +0900 @@ -1,4 +1,4 @@ -@REM SCCS Id: @(#)nhsetup.bat 3.4 $Date: 2002/07/24 08:25:21 $ +@REM SCCS Id: @(#)nhsetup.bat 3.4 $Date: 2003/03/06 07:41:00 $ @REM Copyright (c) NetHack PC Development Team 1993, 1996, 2002 @REM NetHack may be freely redistributed. See license for details. @REM Win32 setup batch file, see Install.nt for details @@ -89,7 +89,7 @@ goto :fini :err_data -echo A required file ..\..\dat\data.bas seems to be missing. +echo A required file ..\..\dat\jdata.bas seems to be missing. echo Check "Files." in the root directory for your NetHack distribution echo and make sure that all required files exist. goto :fini diff -aurbN -xCVS -xXTAGS nethack/sys/winnt/nttty.c jnethack/sys/winnt/nttty.c --- nethack/sys/winnt/nttty.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/sys/winnt/nttty.c 2004-10-18 22:29:31.000000000 +0900 @@ -444,6 +444,42 @@ xputc_core(ch); } +#if 1 /*JP*/ +void +xputc2_core(ch1, ch2) +int ch1; +int ch2; +{ + unsigned char buf[2]; + WORD attrs[2]; + + buf[0] = ch1; + buf[1] = ch2; + + attrs[0] = attrs[1] = attr; + + WriteConsoleOutputAttribute(hConOut,&attrs,2, + cursor,&acount); + WriteConsoleOutputCharacter(hConOut,buf,2, + cursor,&ccount); + cursor.X += 2; +} + +void +xputc2(ch1, ch2) +int ch1; +int ch2; +{ + /* wintty.c では 1 バイト毎に curx を加算するが、ここは + 2 バイトたまってから呼び出されるので、1 文字分先に進んで + しまっている。従って 1 を引く。 */ + cursor.X = ttyDisplay->curx - 1; + cursor.Y = ttyDisplay->cury; + + xputc2_core(ch1, ch2); +} +#endif + void xputs(s) const char *s; @@ -931,7 +967,20 @@ VA_INIT(fmt, const char *); Vsprintf(buf, fmt, VA_ARGS); VA_END(); +#if 0 /*JP*/ xputs(buf); +#else + if(ttyDisplay){ + cursor.X = ttyDisplay->curx; + cursor.Y = ttyDisplay->cury; + } + { + char *str = buf; + while(*str){ + jbuffer(*(str++), NULL, NULL, xputc_core, xputc2_core); + } + } +#endif if (ttyDisplay) curs(BASE_WINDOW, cursor.X+1, cursor.Y); return; } diff -aurbN -xCVS -xXTAGS nethack/util/makedefs.c jnethack/util/makedefs.c --- nethack/util/makedefs.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/util/makedefs.c 2005-03-05 21:58:42.000000000 +0900 @@ -4,6 +4,12 @@ /* Copyright (c) Dean Luick, 1990. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright (c) Issei Numata 1994-1999 +** changing point is marked `JP' (94/1/6) +** JNetHack may be freely redistributed. See license for details. +*/ + #define MAKEDEFS_C /* use to conditionally include file sections */ /* #define DEBUG */ /* uncomment for debugging info */ @@ -22,8 +28,18 @@ /* version information */ #ifdef SHORT_FILENAMES #include "patchlev.h" +#if 1 /*JP*/ +#include "../japanese/jpatchle.h" +#endif #else #include "patchlevel.h" +#if 1 /*JP*/ +#include "../japanese/jpatchlevel.h" +#endif +#endif + +#if 1 /*JP*/ +#include #endif #ifdef MAC @@ -59,16 +75,33 @@ #ifndef OPTIONS_FILE #define OPTIONS_FILE "options" #endif +#if 0 /*JP*/ #define ORACLE_FILE "oracles" +#else +#define ORACLE_FILE "joracles" +#endif #define DATA_FILE "data" +#if 0 /*JP*/ #define RUMOR_FILE "rumors" +#else +#define RUMOR_FILE "jrumors" +#endif #define DGN_I_FILE "dungeon.def" #define DGN_O_FILE "dungeon.pdf" #define MON_STR_C "monstr.c" +#if 0 /*JP*/ #define QTXT_I_FILE "quest.txt" +#else +#define QTXT_I_FILE "jquest.txt" +#endif #define QTXT_O_FILE "quest.dat" #define VIS_TAB_H "vis_tab.h" #define VIS_TAB_C "vis_tab.c" +#if 1 /*JP*/ +#define JOBJ_FILE "jtrnsobj.dat" +#define JMON_FILE "jtrnsmon.dat" +#define JDATA "jdata.h" +#endif /* locations for those files */ #ifdef AMIGA # define FILE_PREFIX @@ -113,6 +146,9 @@ "#\tThis data file is generated by 'makedefs'. Do not edit. \n"; static struct version_info version; +#if 1 /*JP*/ +static struct version_info jversion; +#endif /* definitions used for vision tables */ #define TEST_WIDTH COLNO @@ -157,6 +193,9 @@ void NDECL(do_rumors); void NDECL(do_oracles); void NDECL(do_vision); +#if 1 /*JP*/ +void NDECL(do_japanese); +#endif extern void NDECL(monst_init); /* monst.c */ extern void NDECL(objects_init); /* objects.c */ @@ -164,6 +203,9 @@ static void NDECL(make_version); static char *FDECL(version_string, (char *)); static char *FDECL(version_id_string, (char *,const char *)); +#if 1 /*JP*/ +static char *FDECL(jversion_id_string, (char *,const char *)); +#endif static char *FDECL(xcrypt, (const char *)); static int FDECL(check_control, (char *)); static char *FDECL(without_control, (char *)); @@ -310,6 +352,11 @@ case 'z': case 'Z': do_vision(); break; +#if 1 /*JP*/ + case 'j': + case 'J': do_japanese(); + break; +#endif default: Fprintf(stderr, "Unknown option '%c'.\n", *options); @@ -432,6 +479,12 @@ ((unsigned long)VERSION_MINOR << 16) | ((unsigned long)PATCHLEVEL << 8) | ((unsigned long)EDITLEVEL); +#if 1 /*JP*/ + jversion.incarnation = ((long)JVERSION_MAJOR << 24) | + ((long)JVERSION_MINOR << 16) | + ((long)JPATCHLEVEL << 8) | + ((long)JEDITLEVEL); +#endif /* * encoded feature list * Note: if any of these magic numbers are changed or reassigned, @@ -540,6 +593,39 @@ return outbuf; } +#if 1 /*JP*/ +static char * +jversion_id_string(outbuf, build_date) +char *outbuf; +const char *build_date; +{ + Sprintf(outbuf, +#ifdef BETA +# ifdef PORT_SUB_ID + "%s JNetHack %s Beta Version %d.%d.%d-%d - last build %s.", +# else + "%s JNetHack Beta Version %d.%d.%d-%d - last build %s.", +# endif +#else +# ifdef PORT_SUB_ID + "%s JNetHack %s Version %d.%d.%d - last build %s.", +# else + "%s JNetHack Version %d.%d.%d - last build %s.", +# endif +#endif + PORT_ID, +#ifdef PORT_SUB_ID + PORT_SUB_ID, +#endif + JVERSION_MAJOR, JVERSION_MINOR, JPATCHLEVEL, +#ifdef BETA + JEDITLEVEL, +#endif + build_date); + return outbuf; +} +#endif + void do_date() { @@ -561,6 +647,9 @@ #ifdef KR1ED (void) time(&clocktim); +#if 1 /*JP*/ + Fprintf(ofp,"#define JVERSION_NUMBER 0x%08lxL\n", jversion.incarnation); +#endif Strcpy(cbuf, ctime(&clocktim)); #else (void) time((time_t *)&clocktim); @@ -592,6 +681,10 @@ Fprintf(ofp,"#define VERSION_STRING \"%s\"\n", version_string(buf)); Fprintf(ofp,"#define VERSION_ID \\\n \"%s\"\n", version_id_string(buf, cbuf)); +#if 1 /*JP*/ + Fprintf(ofp,"#define JVERSION_ID \\\n \"%s\"\n", + jversion_id_string(buf, cbuf)); +#endif Fprintf(ofp,"\n"); #ifdef AMIGA { @@ -860,6 +953,17 @@ Fprintf(ofp, ","), length++; } Fprintf(ofp, "\n%swith a default of %s.", indent, DEFAULT_WINDOW_SYS); + +#if 1 /*JP*/ +/* internal kcode */ +/* IC=0 EUC */ +/* IC=1 SJIS */ +#define IC ((unsigned char)("漢"[0])==0x8a) + + Fprintf(ofp,"\n\nInternal Kanji Code:\n\n"); + Fprintf(ofp,"%s%s\n", indent, IC ? "SJIS" : "EUC"); +#endif + Fprintf(ofp,"\n\n"); Fclose(ofp); @@ -911,7 +1015,11 @@ Strcat(filename,file_prefix); #endif Sprintf(eos(filename), DATA_TEMPLATE, DATA_FILE); +#if 0 /*JP*/ Sprintf(infile, DATA_IN_TEMPLATE, DATA_FILE); +#else + Sprintf(infile, DATA_IN_TEMPLATE, "j" DATA_FILE); +#endif Strcat(infile, #ifdef SHORT_FILENAMES ".bas" @@ -942,8 +1050,15 @@ entry_cnt = line_cnt = 0; /* read through the input file and split it into two sections */ while (fgets(in_line, sizeof in_line, ifp)) { +#if 0 /*JP*/ if (d_filter(in_line)) continue; if (*in_line > ' ') { /* got an entry name */ +#else + unsigned char uc; + uc = *((unsigned char *)in_line); + if (d_filter(in_line)) continue; + if (uc > ' ') { /* got an entry name */ +#endif /* first finish previous entry */ if (line_cnt) Fprintf(ofp, "%d\n", line_cnt), line_cnt = 0; /* output the entry name */ @@ -1020,6 +1135,7 @@ } static const char *special_oracle[] = { +#if 0 /*JP*/ "\"...it is rather disconcerting to be confronted with the", "following theorem from [Baker, Gill, and Solovay, 1975].", "", @@ -1030,6 +1146,18 @@ "This provides impressive evidence that the techniques that are", "currently available will not suffice for proving that P != NP or ", "that P == NP.\" [Garey and Johnson, p. 185.]" +#else + "「次の定理[Baker, Gill, and Solovay, 1975]に直面することは", + "むしろ困惑することである.", + "", + "定理 7.18 次のような再帰的言語 A,Bが存在する", + " (1) P(A) == NP(A),かつ", + " (2) P(B) != NP(B)", + "", + "これは現在 P != NPであるかまたは P == NPであるかを証明する", + "有効な手法がないことを強く示している.」", + "[Garey and Johnson, p. 185.]" +#endif }; /* @@ -1646,7 +1774,11 @@ qt_line = 0; in_msg = FALSE; +#if 0 /*JP*/ while (fgets(in_line, 80, ifp) != 0) { +#else + while (fgets(in_line, sizeof in_line, ifp) != 0) { +#endif SpinCursor (3); qt_line++; @@ -1659,7 +1791,11 @@ in_msg = FALSE; adjust_qt_hdrs(); put_qt_hdrs(); +#if 0 /*JP*/ while (fgets(in_line, 80, ifp) != 0) { +#else + while (fgets(in_line, sizeof in_line, ifp) != 0) { +#endif if(qt_control(in_line)) { in_msg = (in_line[1] == 'C'); @@ -2189,6 +2325,154 @@ } #endif /* VISION_TABLES */ +#if 1 /*JP*/ + +#include "../japanese/hash.c" + +static int hash_tab[HASHSIZE]; +static int rhash_tab[HASHSIZE]; + +/* JP +** +*/ +#define WRMODE "w+" +#define RDMODE "r" + +static int +split_string(buf, key, val) +char *buf, *key, *val; +{ + char *p; + + if(buf[0] == '#') return 0; + p = buf; + + while(isspace(*p)) p++; + if(*p == '\0') return 0; + + while(*p!=':'){ + if(!*p) return 0; + else if(*(unsigned char *)p<128) { + *key++ = *p++; + } else { + *key++ = *p++; + *key++ = *p++; + } + } + *key = '\0'; + p++; + + while(isspace(*p)) p++; + if(*p == '\0') return 0; + + while(*p != ':'){ + if(!*p) return 0; + else if(*(unsigned char *)p<128) { + *val++ = *p++; + } else { + *val++ = *p++; + *val++ = *p++; + } + } + + *val = '\0'; + return 1; +} + +void +do_japanese(void) +{ + FILE *fpr, *fpw; + char fnamer[BUFSZ], fnamew[BUFSZ]; + unsigned char buf[BUFSZ], key[BUFSZ], val[BUFSZ]; + int i, hval, rhval; + + for(i = 0 ; i < HASHSIZE; ++i){ + hash_tab[i] = -1; + rhash_tab[i] = -1; + } + + sprintf(fnamew, INCLUDE_TEMPLATE,JDATA); + if((fpw = fopen(fnamew, WRMODE)) == (void *)NULL){ + fprintf(stderr, "Error: Can't create %s\n", fnamew); + return; + } + + fprintf(fpw, Dont_Edit_Code); + + sprintf(fnamer, DATA_TEMPLATE, JMON_FILE); + if((fpr = fopen(fnamer, RDMODE)) == (void *)NULL) + fprintf(stderr, "Warning: Can't open %s\n", fnamer); + else { + fprintf(fpw,"static struct _jtrns_tab {\n"); + fprintf(fpw," const int type;\n"); + fprintf(fpw," const int next;\n"); + fprintf(fpw," const int rev_next;\n"); +/* fprintf(fpw," const int type;\n");*/ + fprintf(fpw," const char *key;\n"); + fprintf(fpw," const char *val;\n"); + fprintf(fpw,"} jtrns_tab[] = {\n"); + + i = 0; + while(fgets((char *)buf, BUFSZ, fpr) != NULL){ + if(split_string(buf, key, val)){ + hval = hash_val(key); + rhval = hash_val(val); + + fprintf(fpw," {'@', %d, %d, \"%s\", \"%s\"},\n", + hash_tab[hval], rhash_tab[rhval], key, val); + + hash_tab[hval] = i; + rhash_tab[rhval] = i; + ++i; + } + } + fclose(fpr); + + sprintf(fnamer, DATA_TEMPLATE, JOBJ_FILE); + if((fpr = fopen(fnamer, RDMODE)) == (void *)NULL) + fprintf(stderr, "Warning: Can't open %s\n", fnamer); + else { + while(fgets((char *)buf, BUFSZ, fpr) != NULL){ + if(split_string(buf, key, val)){ + hval = hash_val(key + 1); + rhval = hash_val(val); + + if(*key == '\'') + fprintf(fpw, " {'\\%c', %d, %d, \"%s\", \"%s\"},\n", + *key, hash_tab[hval], rhash_tab[rhval], + key + 1, val); + else + fprintf(fpw, " {'%c', %d, %d, \"%s\", \"%s\"},\n", + *key, hash_tab[hval], rhash_tab[rhval], + key + 1, val); + + hash_tab[hval] = i; + rhash_tab[rhval] = i; + + ++i; + } + } + } + fclose(fpr); + fprintf(fpw, " {'\\0', -1, -1, (void *)0, (void *)0},\n"); + fprintf(fpw, "};\n"); + + fprintf(fpw, "static int hash_tab[] = {\n"); + for (i = 0; i < HASHSIZE; i++) + fprintf(fpw, "%d, \n", hash_tab[i]); + fprintf(fpw, "};\n"); + + fprintf(fpw, "static int rhash_tab[] = {\n"); + for (i = 0; i < HASHSIZE; i++) + fprintf(fpw, "%d, \n", rhash_tab[i]); + fprintf(fpw, "};\n"); + + fclose(fpw); + } +} +#endif + #ifdef STRICT_REF_DEF NEARDATA struct flag flags; # ifdef ATTRIB_H diff -aurbN -xCVS -xXTAGS nethack/win/Qt/Info.pli jnethack/win/Qt/Info.pli --- nethack/win/Qt/Info.pli 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/win/Qt/Info.pli 2003-08-30 09:08:22.000000000 +0900 @@ -0,0 +1,16 @@ + + + + + CFBundleIconFile + nethack.icns + CFBundlePackageType + APPL + CFBundleGetInfoString + Created by Qt/QMake + CFBundleSignature + ttxt + NOTE + Please, do NOT change this file -- It was generated by Qt/QMake. + + diff -aurbN -xCVS -xXTAGS nethack/win/X11/JNetHack.ad jnethack/win/X11/JNetHack.ad --- nethack/win/X11/JNetHack.ad 1970-01-01 09:00:00.000000000 +0900 +++ jnethack/win/X11/JNetHack.ad 2003-12-10 00:54:10.000000000 +0900 @@ -0,0 +1,175 @@ +! The display_file, tombstone, and menu windows are all formatted assuming +! a fixed width font. Text windows may or may not be formatted as above. +! The rip window applies if the GRAPHIC_TOMBSTONE option is turned on, and +! requires a 12 pixel font for correct appearance. +! +JNetHack*colormap: install +! +JNetHack*font: variable +JNetHack*display_file*font: fixed +JNetHack*tombstone*font: fixed +JNetHack*rip*font: -*-times-medium-r-*-*-12-*-*-*-*-*-*-* +JNetHack*menu*font: fixed +JNetHack*text*font: fixed +!JNetHack*map*font: nh10 +JNetHack*map*font: fixed + +! To use full-color tiles for the map, uncomment the tile file name. +! If you use a 100dpi (or greater) monitor you may wish to double the +! tile size so you can see the figures. If JNetHack was compiled to +! use XPM (USE_XPM in config.h), the tile_file is a standard XPM file. +! Otherwise, it is a custom format. double_tile_size only applies to +! the custom format - to enlarge an XPM file, use processing tools +! such as XV or preferably PBMplus. +! +!JNetHack.tile_file: x11tiles32j +JNetHack.tile_file: t32-1024.xpm +JNetHack.tile_width: 32 +JNetHack.tile_height: 32 +!JNetHack.double_tile_size: True +! +! The annotation of pets. +JNetHack.pet_mark_bitmap: pet_mark.xbm +JNetHack.pet_mark_color: Red + +! Tombstone +! The image file +JNetHack.tombstone: rip.xpm +! Text starts at (tombtext_x, tombtext_y) and subsequent lines +! are displaced by (tombtext_dx, tombtext_dy) pixels. If you +!JNetHack.tombtext_x: 155 +!JNetHack.tombtext_y: 78 +!JNetHack.tombtext_dx: 0 +!JNetHack.tombtext_dy: 13 +! The color to use for the text on the hero's tombstone +JNetHack*rip*foreground: black + +! Translation tables. There are currently several actions in JNetHack, but +! the only one you should be using is "input()", which, with no parameters, +! uses XLookupString to translate your keypress into a command. You +! can optionally give it parameters to change the behavior, see the example +! below. Note that you have to specify the translations in every appropriate +! window. +JNetHack*message*translations: : input() +! +! Example extra translations for the map window. +! +!JNetHack*map*translations: #override \ +! !Left: input(h) \n\ +! !Right: input(l) \n\ +! !Up: input(k) \n\ +! !Down: input(j) +! +! The icon to use; supported values are nh72, nh56, and nh32; nh72 is the +! default. Some window managers may not support the larger icon sizes. +! It is not guaranteed that the window manager will honor the icon selection. +!JNetHack*icon: nh56 +! +! If True, a popup for y/n questions is _not_ used. +!JNetHack*slow: True +! +! The number of lines the message window will show without scrolling. +!JNetHack*message_lines: 12 +! +! If True, the message window has a line that seperates old and new messages. +!JNetHack*message_line: True +! +! If True, force keyboard to attach to popup windows. Some window managers +! enforce a click-to-focus-keyboard policy (e.g. the DECwindows wm). JNetHack +! has a lot of popups and is almost unplayable without some kind of autofocus. +! If your window manager does click-to-focus, you'll probably want this False. +!JNetHack*autofocus: True +! +! Specify the number of rows and columns of the map window. The default +! is the standard 80x21 window. Note: this _does_not_ change JNetHack's +! level size, only what you see of it. +!JNetHack*map*rows: 21 +!JNetHack*map*columns: 80 + +! Parts of the fancy status display. +! +JNetHack*status_condition.borderWidth: 0 +JNetHack*status_info*borderWidth: 0 + +! +! Sample color screen entries. +! +JNetHack*foreground: black +JNetHack*background: white +JNetHack*border: black + +JNetHack*jnethack.background: wheat + +JNetHack*map*yellow: gold +JNetHack*map*brown: tan +JNetHack*map*gray: grey85 +JNetHack*map*foreground: wheat +JNetHack*map*background: grey40 + +JNetHack*fancy_status.skipAdjust: True +JNetHack*fancy_status.background: wheat +JNetHack*status_info*foreground: Sienna +JNetHack*status_info*background: wheat +JNetHack*status_info.background: wheat +JNetHack*status_attributes*foreground: black +JNetHack*status_attributes*background: white +JNetHack*status_condition*foreground: red +JNetHack*status_condition*background: wheat +JNetHack*Scrollbar*foreground: Sienna +JNetHack*Scrollbar*background: wheat +JNetHack*status_info*showGrip: False +JNetHack*status_attributes*showGrip: False + +JNetHack*player_selection*random.borderColor: blue +JNetHack*player_selection*random.borderWidth: 2 +JNetHack*player_selection*random.foreground: blue +JNetHack*player_selection*random.accelerators: #override\n\ + Return: set() notify() unset() +JNetHack*player_selection*quit.borderColor: blue +JNetHack*player_selection*quit.foreground: blue +JNetHack*player_selection*Command.borderColor: red +JNetHack*player_selection*Command.foreground: red +JNetHack*player_selection*quit.accelerators: #override\n\ + Escape: set() notify() unset() + +JNetHack*extended_commands*dismiss.borderColor: blue +JNetHack*extended_commands*dismiss.foreground: blue +JNetHack*extended_commands*help.borderColor: blue +JNetHack*extended_commands*help.foreground: blue +JNetHack*extended_commands*Command.borderColor: red +JNetHack*extended_commands*Command.foreground: red +JNetHack*extended_commands*help.accelerators: #override\n\ + :?: set() notify() unset() +JNetHack*extended_commands*dismiss.accelerators: #override\n\ + Escape: set() notify() unset() +! +! +! The following are the default 15 colors that the JNetHack map uses. +! If they don't look good on your screen, change them. +! +! The foreground color is used as "no color". +! +!JNetHack*map*black: black +!JNetHack*map*red: red +!JNetHack*map*green: pale green +!JNetHack*map*brown: brown +!JNetHack*map*blue: blue +!JNetHack*map*magenta: magenta +!JNetHack*map*cyan: light cyan +!JNetHack*map*gray: gray +!JNetHack*map*orange: orange +!JNetHack*map*bright_green: green +!JNetHack*map*yellow: yellow +!JNetHack*map*bright_blue: royal blue +!JNetHack*map*bright_magenta: violet +!JNetHack*map*bright_cyan: cyan +!JNetHack*map*white: white +! +! +! +!JNetHack*fontSet: -*-fixed-medium-r-normal--14-*-iso8859-1,\ +! -*-fixed-medium-r-normal--14-*-iso8859-1,\ +! -*-fixed-medium-r-*--14-*-jisx0208.1983-* +! -*-fixed-medium-r-*--14-*-jisx0208.1983-* +JNetHack*fontSet: *--14-* +JNetHack*international: True diff -aurbN -xCVS -xXTAGS nethack/win/X11/Window.c jnethack/win/X11/Window.c --- nethack/win/X11/Window.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/win/X11/Window.c 2003-12-10 00:54:10.000000000 +0900 @@ -7,6 +7,13 @@ * drawing canvas with 16 colors and one font. */ +/* +** Japanese version Copyright (C) Issei Numata, 1994-1999 +** changing point is marked `JP' (94/6/7) or XI18N (96/7/19) +** For 3.4.0, Copyright (c) Kentaro Shirakata, 2002 +** JNetHack may be freely redistributed. See license for details. +*/ + #ifndef SYSV #define PRESERVE_NO_SYSV /* X11 include files may define SYSV */ #endif @@ -76,6 +83,10 @@ { XtNfont, XtCFont, XtRFontStruct, sizeof(XFontStruct *), offset(font), XtRString, XtDefaultFont }, +#ifdef XI18N + { XtNfontSet, XtCFontSet, XtRFontSet, sizeof(XFontSet *), + offset(fontset), XtRString, XtDefaultFontSet }, +#endif { XtNexposeCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), offset(expose_callback), XtRCallback, (char *)0 }, { XtNcallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), @@ -110,14 +121,22 @@ Region region; /* unused */ { /* This isn't correct - we need to call the callback with region. */ +#if 0 /*JP*/ XtCallCallbacks(w, XtNexposeCallback, (caddr_t) event); +#else + XtCallCallbacks(w, XtNexposeCallback, (XtPointer) event); +#endif } /* ARGSUSED */ static void Resize(w) Widget w; { +#if 0 /*JP*/ XtCallCallbacks(w, XtNresizeCallback, (caddr_t) 0); +#else + XtCallCallbacks(w, XtNresizeCallback, (XtPointer) 0); +#endif } @@ -168,3 +187,8 @@ XFontStruct * WindowFontStruct(w) Widget w; { return ((WindowWidget)w)->window.font; } + +#ifdef XI18N +XFontSet +WindowFontSet(w) Widget w; { return ((WindowWidget)w)->window.fontset; } +#endif diff -aurbN -xCVS -xXTAGS nethack/win/X11/dialogs.c jnethack/win/X11/dialogs.c --- nethack/win/X11/dialogs.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/win/X11/dialogs.c 2003-12-22 04:49:55.000000000 +0900 @@ -41,6 +41,10 @@ * window itself. Suggestion from David E. Wexelblat, dwex@goblin.org. */ +/* +** marked as XI18N for i18n by issei (1994/1/10) +*/ + #ifndef SYSV #define PRESERVE_NO_SYSV /* X11 include files may define SYSV */ #endif @@ -62,12 +66,23 @@ #endif #include "config.h" /* #define for const for non __STDC__ compilers */ +#if 1 /*JP*/ +#ifdef XAW_I18N +#include +#endif +#endif /* ":" added to both translations below to allow limited redefining of * keysyms before testing for keysym values -- dlc */ static const char okay_accelerators[] = +#if 0 /*JP*/ "#override\n\ :Return: set() notify() unset()\n"; +#else + "#override\n\ + :Return: set() notify() unset()\n\ + :m: set() notify() unset()\n"; +#endif static const char cancel_accelerators[] = "#override\n\ @@ -113,6 +128,10 @@ XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNresizable, True); num_args++; XtSetArg(args[num_args], XtNborderWidth, 0); num_args++; + +#if defined(X11R6) && defined(XI18N) + XtSetArg(args[num_args], XtNinternational, True); num_args++; +#endif prompt = XtCreateManagedWidget("prompt", labelWidgetClass, form, args, num_args); @@ -132,6 +151,9 @@ XtSetArg(args[num_args], XtNeditType, XawtextEdit); num_args++; XtSetArg(args[num_args], XtNresize, XawtextResizeWidth); num_args++; XtSetArg(args[num_args], XtNstring, ""); num_args++; +#if defined(X11R6) && defined(XI18N) + XtSetArg(args[num_args], XtNinternational, True); num_args++; +#endif response = XtCreateManagedWidget("response", asciiTextWidgetClass, form, args, num_args); @@ -150,7 +172,14 @@ XtSetArg(args[num_args], XtNresizable, True); num_args++; XtSetArg(args[num_args], XtNaccelerators, XtParseAcceleratorTable(okay_accelerators)); num_args++; +#if defined(X11R6) && defined(XI18N) + XtSetArg(args[num_args], XtNinternational, True); num_args++; +#endif +#if 0 /*JP*/ okay = XtCreateManagedWidget("okay", commandWidgetClass, +#else + okay = XtCreateManagedWidget("OK", commandWidgetClass, +#endif form, args, num_args); XtAddCallback(okay, XtNcallback, okay_callback, form); @@ -172,7 +201,14 @@ XtSetArg(args[num_args], XtNresizable, True); num_args++; XtSetArg(args[num_args], XtNaccelerators, XtParseAcceleratorTable(cancel_accelerators)); num_args++; +#if defined(X11R6) && defined(XI18N) + XtSetArg(args[num_args], XtNinternational, True); num_args++; +#endif +#if 0 /*JP*/ cancel = XtCreateManagedWidget("cancel", commandWidgetClass, +#else + cancel = XtCreateManagedWidget("キャンセル", commandWidgetClass, +#endif form, args, num_args); XtAddCallback(cancel, XtNcallback, cancel_callback, form); XtInstallAccelerators(response, cancel); @@ -231,26 +267,44 @@ return XtNewString(s); } +#ifndef max #define max(a,b) (((a) > (b)) ? (a) : (b)) +#endif /* set the default reponse */ void SetDialogResponse(w, s) Widget w; String s; { +#ifndef XI18N Arg args[4]; +#else + Arg args[5]; +#endif Widget response; XFontStruct *font; Dimension width, nwidth, leftMargin, rightMargin; +#ifdef XI18N + XFontSet fontset; + XFontSetExtents *extent; +#endif response = XtNameToWidget(w, "response"); XtSetArg(args[0], XtNfont, &font); XtSetArg(args[1], XtNleftMargin, &leftMargin); XtSetArg(args[2], XtNrightMargin, &rightMargin); XtSetArg(args[3], XtNwidth, &width); +#ifndef XI18N XtGetValues(response, args, FOUR); /* width includes margins as per Xaw documentation */ nwidth = (font->max_bounds.width * strlen(s))+leftMargin+rightMargin; +#else + XtSetArg(args[4], XtNfontSet, &fontset); + XtGetValues(response, args, FIVE); + extent = XExtentsOfFontSet(fontset); + nwidth = ((extent->max_logical_extent.width * strlen(s)) + leftMargin + + rightMargin); +#endif if (nwidth < width) nwidth = width; diff -aurbN -xCVS -xXTAGS nethack/win/X11/winX.c jnethack/win/X11/winX.c --- nethack/win/X11/winX.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/win/X11/winX.c 2005-06-16 01:07:43.000000000 +0900 @@ -8,6 +8,13 @@ * interface. */ +/* +** Japanese version Copyright (C) Issei Numata, 1994-1999 +** changing point is marked `JP' (94/6/7) or XI18N (96/7/19) +** For 3.4.0, Copyright (c) Kentaro Shirakata, 2002 +** JNetHack may be freely redistributed. See license for details. +*/ + #ifndef SYSV #define PRESERVE_NO_SYSV /* X11 include files may define SYSV */ #endif @@ -174,6 +181,10 @@ /* in init_windows(). */ static Pixmap icon_pixmap = None; /* Pixmap for icon. */ +#ifdef INSTALLCOLORMAP +Colormap cmap; +#endif + /* * Find the window structure that corresponds to the given widget. Note * that this is not the popup widget, nor the viewport, but the child. @@ -329,6 +340,50 @@ return True; } +#ifdef INSTALLCOLORMAP +Boolean +nhCvtStringToColormap(dpy, args, num_args, fromVal, toVal, data) +Display* dpy; +XrmValuePtr args; +Cardinal *num_args; +XrmValuePtr fromVal; +XrmValuePtr toVal; +XtPointer data; +{ + XColor black, white; + int screen = DefaultScreen(dpy); + Colormap dcmap = DefaultColormap(dpy, screen); + + if(strncmp(fromVal->addr, "install", 7)){ + return False; + } + if(!cmap){ + cmap = XCreateColormap(dpy, + RootWindow(dpy, screen), + DefaultVisual(dpy, screen), + AllocNone); + /* + 手抜き + */ + black.red = 0; + black.green = 0; + black.blue = 0; + + white.red = 0xffff; + white.green = 0xffff; + white.blue = 0xffff; + + XAllocColor(dpy, dcmap, &black); + XAllocColor(dpy, dcmap, &white); + + XAllocColor(dpy, cmap, &black); + XAllocColor(dpy, cmap, &white); + } + + done(Colormap, cmap); +} +#endif /*INSTALLCOLORMAP*/ + Boolean nhCvtStringToPixel(dpy, args, num_args, fromVal, toVal, closure_ret) Display* dpy; @@ -490,14 +545,20 @@ X11_raw_print(str) const char *str; { +/*JP (void) puts(str); +*/ + (void) jputs(str); } void X11_raw_print_bold(str) const char *str; { +/*JP (void) puts(str); +*/ + (void) jputs(str); } void @@ -867,7 +928,11 @@ panic("ripout on non-text window (window type [%d])", wp->type); } +#ifndef XI18N calculate_rip_text(how); +#else + calculate_rip_text(how, wp->Win_info.Text_info->fontset); +#endif } #endif @@ -914,6 +979,12 @@ XtOffset(AppResources *,double_tile_size), XtRString, "False" }, { "tile_file", "Tile_file", XtRString, sizeof(String), XtOffset(AppResources *,tile_file), XtRString, "" }, +#ifdef X11LARGETILE + { "tile_width", "Tile_width", XtRInt, sizeof(int), + XtOffset(AppResources *,tile_width), XtRString, "32" }, + { "tile_height", "Tile_height", XtRInt, sizeof(int), + XtOffset(AppResources *,tile_height), XtRString, "32" }, +#endif { "icon", "Icon", XtRString, sizeof(String), XtOffset(AppResources *,icon), XtRString, "nh72" }, { "message_lines", "Message_lines", XtRInt, sizeof(int), @@ -946,6 +1017,12 @@ COPYRIGHT_BANNER_B, COPYRIGHT_BANNER_C, "", +#if 1 /*JP*/ + JA_COPYRIGHT_BANNER_A, + JA_COPYRIGHT_BANNER_B, + JA_COPYRIGHT_BANNER_C, + JA_COPYRIGHT_BANNER_D, +#endif "", 0 }; @@ -971,11 +1048,26 @@ XSetIOErrorHandler((XIOErrorHandler) hangup); +#ifdef XI18N + XtSetLanguageProc(NULL,NULL,NULL); +#endif +#if 1 /*JP*/ + XSetIOErrorHandler((XIOErrorHandler) hangup); +#endif +#ifdef INSTALLCOLORMAP + XtSetTypeConverter(XtRString, XtRColormap, nhCvtStringToColormap, + 0, 0, XtCacheByDisplay, 0); +#endif + num_args = 0; XtSetArg(args[num_args], XtNallowShellResize, True); num_args++; toplevel = XtAppInitialize( &app_context, +#if 0 /*JP*/ "NetHack", /* application class */ +#else + "JNetHack", /* application class */ +#endif (XrmOptionDescList)0, 0, /* options list */ argcp, (String *)argv, /* command line args */ (String *)0, /* fallback resources */ @@ -1345,13 +1437,19 @@ Cardinal num_args; Widget popup, dispfile; Position top_margin, bottom_margin, left_margin, right_margin; +#if 0 /*JP*/ XFontStruct *fs; +#endif int new_width, new_height; #define LLEN 128 char line[LLEN]; int num_lines; char *textlines; int charcount; +#ifdef XI18N + XFontSet fontset; + XFontSetExtents *extent; +#endif /* Use the port-independent file opener to see if the file exists. */ fp = dlb_fopen(str, RDTMODE); @@ -1414,6 +1512,10 @@ XtSetArg(args[num_args], XtNdisplayCaret, False); num_args++; XtSetArg(args[num_args], XtNtranslations, XtParseTranslationTable(display_translations)); num_args++; +/*JP*/ +#if defined(X11R6) && defined(XI18N) + XtSetArg(args[num_args], XtNinternational, True); num_args++; +#endif dispfile = XtCreateManagedWidget( "text", /* name */ @@ -1424,7 +1526,11 @@ /* Get font and border information. */ num_args = 0; +#ifndef XI18N XtSetArg(args[num_args], XtNfont, &fs); num_args++; +#else + XtSetArg(args[num_args], XtNfontSet, &fontset); num_args++; +#endif XtSetArg(args[num_args], XtNtopMargin, &top_margin); num_args++; XtSetArg(args[num_args], XtNbottomMargin, &bottom_margin); num_args++; XtSetArg(args[num_args], XtNleftMargin, &left_margin); num_args++; @@ -1435,9 +1541,16 @@ * The data files are currently set up assuming an 80 char wide window * and a fixed width font. Soo.. */ +#ifndef XI18N new_height = num_lines * nhFontHeight(dispfile) + top_margin + bottom_margin; new_width = 80 * fs->max_bounds.width + left_margin + right_margin; +#else + extent = XExtentsOfFontSet(fontset); + new_height = num_lines * extent->max_logical_extent.height + + top_margin + bottom_margin; + new_width = 40 * extent->max_logical_extent.width + left_margin + right_margin; +#endif /* Set the new width and height. */ num_args = 0; @@ -1637,6 +1750,10 @@ num_args = 0; XtSetArg(args[num_args], XtNtranslations, XtParseTranslationTable(yn_translations)); num_args++; +/*JP*/ +#if defined(X11R6) && defined(XI18N) + XtSetArg(args[num_args], XtNinternational, True); num_args++; +#endif yn_label = XtCreateManagedWidget("yn_label", labelWidgetClass, yn_popup, @@ -1750,7 +1867,10 @@ num_args = 0; XtSetArg(args[num_args], XtNallowShellResize, True); num_args++; +/*JP form = XtCreateManagedWidget("nethack", +*/ + form = XtCreateManagedWidget("jnethack", panedWidgetClass, toplevel, args, num_args); @@ -1783,6 +1903,10 @@ num_args = 0; XtSetArg(args[num_args], XtNtranslations, XtParseTranslationTable(yn_translations)); num_args++; +/*JP*/ +#if defined(X11R6) && defined(XI18N) + XtSetArg(args[num_args], XtNinternational, True); num_args++; +#endif yn_label = XtCreateManagedWidget("yn_label", labelWidgetClass, form, diff -aurbN -xCVS -xXTAGS nethack/win/X11/winmap.c jnethack/win/X11/winmap.c --- nethack/win/X11/winmap.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/win/X11/winmap.c 2003-12-10 00:54:10.000000000 +0900 @@ -25,7 +25,9 @@ #include #include #include +#include #include +#include #ifdef PRESERVE_NO_SYSV # ifdef SYSV @@ -69,6 +71,17 @@ static void FDECL(get_char_info, (struct xwindow *)); static void FDECL(display_cursor, (struct xwindow *)); +#ifdef X11LARGETILE +struct pxm_slot_t { + int fg; + int bg; + int age; + Pixmap pixmap; +}; +#define MAX_PXM_SLOTS 100 + struct pxm_slot_t pxm_slot[MAX_PXM_SLOTS]; +#endif + /* Global functions ======================================================== */ void @@ -154,10 +167,22 @@ * or just keep it on a per-window basis. */ Pixmap tile_pixmap = None; +#ifdef X11LARGETILE +Pixmap tile_clipmask = None; +GC tile_gc; +/*JP #ifdef USE_XPM*/ +XpmImage tile_image; +/* #endif*/ + +#define TILE_WIDTH appResources.tile_width +#define TILE_HEIGHT appResources.tile_height +int TILE_PER_COL; +#else static int tile_width; static int tile_height; static int tile_count; static XImage *tile_image = 0; +#endif /* * This structure is used for small bitmaps that are used for annotating @@ -204,6 +229,7 @@ post_process_tiles() { Display *dpy = XtDisplay(toplevel); +#if 0 /*JP*/ unsigned int width, height; if (tile_image == 0) return; /* no tiles */ @@ -225,6 +251,46 @@ XDestroyImage(tile_image); /* data bytes free'd also */ tile_image = 0; +#else + Colormap cmap; +# ifdef USE_XPM + XpmAttributes attributes; +# endif + Arg args[16]; + XGCValues val; + +# ifdef USE_XPM + if(tile_image.data){ + XtSetArg(args[0], XtNcolormap, &cmap); + XtGetValues(toplevel, args, ONE); + + attributes.valuemask = XpmCloseness | XpmColormap; + attributes.colormap = cmap; + attributes.closeness = 25000; + + XpmCreatePixmapFromXpmImage( + dpy, + XtWindow(toplevel), + &tile_image, + &tile_pixmap, + &tile_clipmask, + &attributes + ); + + val.function = GXcopy; + val.clip_mask = tile_clipmask; + + tile_gc = XCreateGC( + dpy, + XtWindow(toplevel), + GCFunction | GCClipMask, + &val + ); + + XpmFreeXpmImage(&tile_image); + } +# endif +#endif /*JP*/ init_annotation(&pet_annotation, appResources.pet_mark_bitmap, appResources.pet_mark_color); @@ -276,9 +342,18 @@ attributes.valuemask = XpmCloseness; attributes.closeness = 25000; +# if 0 /*JP*/ errorcode = XpmReadFileToImage(dpy, appResources.tile_file, &tile_image, 0, &attributes); +# else + errorcode = XpmReadFileToXpmImage( + appResources.tile_file, + &tile_image, + NULL + ); +# endif +# if 0 /*JP*/ if (errorcode == XpmColorFailed) { Sprintf(buf, "Insufficient colors available to load %s.", appResources.tile_file); @@ -289,6 +364,7 @@ errorcode = XpmReadFileToImage(dpy, appResources.tile_file, &tile_image, 0, &attributes); } +# endif if (errorcode != XpmSuccess) { if (errorcode == XpmColorFailed) { @@ -305,6 +381,9 @@ goto tiledone; } +# ifdef X11LARGETILE + TILE_PER_COL = tile_image.width / TILE_WIDTH; +# else /* assume a fixed number of tiles per row */ if (tile_image->width % TILES_PER_ROW != 0 || tile_image->width <= TILES_PER_ROW) { @@ -328,6 +407,7 @@ } tile_width = image_width / TILES_PER_ROW; tile_height = image_height / (tile_count / TILES_PER_ROW); +# endif #else /* any less than 16 colours makes tiles useless */ ddepth = DefaultDepthOfScreen(screen); @@ -510,7 +590,13 @@ mask = GCFunction | GCForeground | GCGraphicsExposures; values.graphics_exposures = False; values.foreground = WhitePixelOfScreen(screen) ^ +# ifndef X11LARGETILE XGetPixel(tile_image, 0, tile_height*glyph2tile[cmap_to_glyph(S_corr)]); +# else + XGetPixel(tile_image, + tile_width*(glyph2tile[cmap_to_glyph(S_corr)]%TILE_PER_COL), + tile_height*(glyph2tile[cmap_to_glyph(S_corr)]/TILE_PER_COL)); +# endif values.function = GXxor; tile_info->white_gc = XtGetGC(wp->w, mask, &values); @@ -526,11 +612,20 @@ if (colormap) free((genericptr_t)colormap); if (tile_bytes) free((genericptr_t)tile_bytes); if (colors) free((genericptr_t)colors); +# ifdef X11LARGETILE + {int i; for(i=0;isquare_height = tile_height; map_info->square_width = tile_width; +#else + map_info->square_height = TILE_HEIGHT; + map_info->square_width = TILE_WIDTH; +#endif map_info->square_ascent = 0; map_info->square_lbearing = 0; tile_info->image_width = image_width; @@ -970,6 +1065,9 @@ Cardinal in_nparams = (num_params ? *num_params : 0); char c; char keystring[MAX_KEY_STRING]; +#if 1 /*JP*/ + KeySym keysym = 0; +#endif switch (event->type) { case ButtonPress: @@ -1015,9 +1113,57 @@ */ meta = !!(key->state & Mod1Mask); nbytes = +#if 0 /*JP*/ XLookupString(key, keystring, MAX_KEY_STRING, (KeySym *)0, (XComposeStatus *)0); +#else + XLookupString(key, keystring, MAX_KEY_STRING, + &keysym, (XComposeStatus *)0); +#endif + } +#if 1 /*JP*/ + /* + + */ + if(!iflags.num_pad){ + if(keysym == XK_KP_1 || keysym == XK_KP_End){ + keystring[0] = 'b'; + nbytes = 1; } + else if(keysym == XK_KP_2 || keysym == XK_KP_Down){ + keystring[0] = 'j'; + nbytes = 1; + } + else if(keysym == XK_KP_3 || keysym == XK_KP_Page_Down){ + keystring[0] = 'n'; + nbytes = 1; + } + else if(keysym == XK_KP_4 || keysym == XK_KP_Left){ + keystring[0] = 'h'; + nbytes = 1; + } + else if(keysym == XK_KP_5 || keysym == XK_KP_Begin){ + keystring[0] = '.'; + nbytes = 1; + } + else if(keysym == XK_KP_6 || keysym == XK_KP_Right){ + keystring[0] = 'l'; + nbytes = 1; + } + else if(keysym == XK_KP_7 || keysym == XK_KP_Home){ + keystring[0] = 'y'; + nbytes = 1; + } + else if(keysym == XK_KP_8 || keysym == XK_KP_Up){ + keystring[0] = 'k'; + nbytes = 1; + } + else if(keysym == XK_KP_9 || keysym == XK_KP_Page_Up){ + keystring[0] = 'u'; + nbytes = 1; + } + } +#endif /*JP*/ key_events: /* Modifier keys return a zero length string when pressed. */ if (nbytes) { @@ -1195,8 +1341,18 @@ Display* dpy = XtDisplay(wp->w); Screen* screen = DefaultScreenOfDisplay(dpy); +#ifdef X11LARGETILE + /* each slots ages */ + { + int i; + + for(i=0 ; iglyphs[row][cur_col]; int tile = glyph2tile[glyph]; int src_x, src_y; @@ -1210,6 +1366,91 @@ src_x, src_y, tile_width, tile_height, dest_x, dest_y); +#else + struct rm *lev = &levl[cur_col][row]; + int glyph = tile_map->glyphs[row][cur_col]; + int bg = back_to_glyph(cur_col, row); + int tile = 0; + int bgtile = 0; + int dest_x = 0; + int dest_y = 0; + int src_x; + int src_y; + int bgsrc_x; + int bgsrc_y; + + if(tile_pixmap){ + if(youmonst.data && (Blind || (viz_array && !cansee(cur_col, row)))) + bg = lev->glyph; + + bgtile = glyph2tile[bg]; + tile = glyph2tile[glyph]; + dest_x = cur_col * map_info->square_width; + dest_y = row * map_info->square_height; + bgsrc_x = (bgtile % TILE_PER_COL) * TILE_WIDTH; + bgsrc_y = (bgtile / TILE_PER_COL) * TILE_HEIGHT; + src_x = (tile % TILE_PER_COL) * TILE_WIDTH; + src_y = (tile / TILE_PER_COL) * TILE_HEIGHT; +/*ITA*/ + { + int i, match; + int maxage = 0; + + if(bgtile != -1){ + match = -1; + for(i=0 ; iblack_gc, + bgsrc_x, bgsrc_y, + TILE_WIDTH, TILE_HEIGHT, + 0,0); + + XSetClipOrigin(dpy,tile_gc, 0 - src_x, 0 - src_y); + + XCopyArea(dpy, tile_pixmap, pxm_slot[match].pixmap, + tile_gc, + src_x, src_y, + TILE_WIDTH, TILE_HEIGHT, + 0,0); + pxm_slot[match].fg=tile; + pxm_slot[match].bg=bgtile; + } + /* slot ready */ + pxm_slot[match].age=0; + XCopyArea(dpy, pxm_slot[match].pixmap, XtWindow(wp->w), + tile_map->black_gc, + 0,0, + TILE_WIDTH, TILE_HEIGHT, + dest_x,dest_y); + } + else{ + /* no clip mask */ + XCopyArea(dpy, tile_pixmap, XtWindow(wp->w), + tile_map->black_gc, + src_x, src_y, + TILE_WIDTH, TILE_HEIGHT, + dest_x,dest_y); + } + } +/*ITA*/ + } +#endif /* X11LARGETILE */ if (glyph_is_pet(glyph) && iflags.hilite_pet) { /* draw pet annotation (a heart) */ @@ -1385,7 +1626,11 @@ num_args = 0; XtSetArg(args[num_args], XtNinput, False); num_args++; +#if 0 /*JP*/ wp->popup = parent = XtCreatePopupShell("nethack", +#else + wp->popup = parent = XtCreatePopupShell("jnethack", +#endif topLevelShellWidgetClass, toplevel, args, num_args); /* diff -aurbN -xCVS -xXTAGS nethack/win/X11/winmenu.c jnethack/win/X11/winmenu.c --- nethack/win/X11/winmenu.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/win/X11/winmenu.c 2003-12-22 04:49:55.000000000 +0900 @@ -691,6 +691,10 @@ Boolean *boolp; #endif char gacc[QBUFSZ], *ap; +#ifdef XI18N +/* XFontSet fontset;*/ + XFontSetExtents *extent; +#endif *menu_list = (menu_item *) 0; check_winid(window); @@ -822,7 +826,11 @@ XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; +#if 0 /*JP*/ cancel = XtCreateManagedWidget("cancel", +#else + cancel = XtCreateManagedWidget("キャンセル", +#endif commandWidgetClass, form, args, num_args); @@ -837,7 +845,11 @@ XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; +#if 0 /*JP*/ all = XtCreateManagedWidget("all", +#else + all = XtCreateManagedWidget("すべて選択", +#endif commandWidgetClass, form, args, num_args); @@ -851,7 +863,11 @@ XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; +#if 0 /*JP*/ none = XtCreateManagedWidget("none", +#else + none = XtCreateManagedWidget("すべて解除", +#endif commandWidgetClass, form, args, num_args); @@ -865,7 +881,11 @@ XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; +#if 0 /*JP*/ invert = XtCreateManagedWidget("invert", +#else + invert = XtCreateManagedWidget("反転", +#endif commandWidgetClass, form, args, num_args); @@ -879,7 +899,11 @@ XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; +#if 0 /*JP*/ search = XtCreateManagedWidget("search", +#else + search = XtCreateManagedWidget("検索", +#endif commandWidgetClass, form, args, num_args); @@ -919,6 +943,9 @@ XtSetArg(args[num_args], XtNmaxSelectable, menu_info->curr_menu.count); num_args++; #endif +#if defined(X11R6) && defined(XI18N) + XtSetArg(args[num_args], XtNinternational, True); num_args++; +#endif wp->w = XtCreateManagedWidget( "menu_list", /* name */ #ifdef USE_FWF @@ -934,7 +961,11 @@ /* Get the font and margin information. */ num_args = 0; +#ifndef XI18N XtSetArg(args[num_args], XtNfont, &menu_info->fs); num_args++; +#else + XtSetArg(args[num_args], XtNfontSet, &menu_info->fontset); num_args++; +#endif XtSetArg(args[num_args], XtNinternalHeight, &menu_info->internal_height); num_args++; XtSetArg(args[num_args], XtNinternalWidth, @@ -943,9 +974,15 @@ XtGetValues(wp->w, args, num_args); /* font height is ascent + descent */ +#ifndef XI18N menu_info->line_height = menu_info->fs->max_bounds.ascent + menu_info->fs->max_bounds.descent + row_spacing; +#else + extent = XExtentsOfFontSet(menu_info->fontset); + menu_info->line_height = + extent->max_logical_extent.height + row_spacing; +#endif menu_info->valid_widgets = TRUE; @@ -961,7 +998,11 @@ /* get the longest string on new menu */ v_pixel_width = 0; for (ptr = menu_info->new_menu.list_pointer; *ptr; ptr++) { +#ifndef XI18N len = XTextWidth(menu_info->fs, *ptr, strlen(*ptr)); +#else + len = XmbTextEscapement(menu_info->fontset, *ptr, strlen(*ptr)); +#endif if (len > v_pixel_width) v_pixel_width = len; } diff -aurbN -xCVS -xXTAGS nethack/win/X11/winmesg.c jnethack/win/X11/winmesg.c --- nethack/win/X11/winmesg.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/win/X11/winmesg.c 2003-12-10 00:54:10.000000000 +0900 @@ -37,7 +37,9 @@ static struct line_element *FDECL(get_previous, (struct line_element *)); static void FDECL(set_circle_buf, (struct mesg_info_t *,int)); +#ifndef XI18N static char *FDECL(split, (char *,XFontStruct *,DIMENSION_P)); +#endif static void FDECL(add_line, (struct mesg_info_t *,const char *)); static void FDECL(redraw_message_window, (struct xwindow *)); static void FDECL(mesg_check_size_change, (struct xwindow *)); @@ -77,6 +79,9 @@ Cardinal num_args; Widget viewport; struct mesg_info_t *mesg_info; +#ifdef XI18N + XFontSetExtents *extent; +#endif wp->type = NHW_MESSAGE; @@ -151,14 +156,27 @@ /* Get the font information. */ num_args = 0; XtSetArg(args[num_args], XtNfont, &mesg_info->fs); num_args++; +#ifdef XI18N + XtSetArg(args[num_args], XtNfontSet, &mesg_info->fontset); num_args++; +#endif XtGetValues(wp->w, args, num_args); +#ifdef XI18N + extent = XExtentsOfFontSet(mesg_info->fontset); +#endif /* Save character information for fast use later. */ +#ifndef XI18N mesg_info->char_width = mesg_info->fs->max_bounds.width; mesg_info->char_height = mesg_info->fs->max_bounds.ascent + mesg_info->fs->max_bounds.descent; mesg_info->char_ascent = mesg_info->fs->max_bounds.ascent; mesg_info->char_lbearing = -mesg_info->fs->min_bounds.lbearing; +#else + mesg_info->char_width = extent->max_logical_extent.width; + mesg_info->char_height = extent->max_logical_extent.height; + mesg_info->char_ascent = -extent->max_logical_extent.y; + mesg_info->char_lbearing = extent->max_logical_extent.x; +#endif get_gc(wp->w, mesg_info); @@ -237,6 +255,32 @@ struct xwindow *wp; const char *str; { +#if defined(XI18N) + int len; + XRectangle ink_ext, lgc_ext; + char ss[1024],s1[1024],s2[1024]; /* may be enough */ + + Strcpy(ss, str); + while(1){ + len = strlen(ss); + while(1){ + XmbTextExtents(wp->mesg_information->fontset, ss, len, + &ink_ext,&lgc_ext); + if(lgc_ext.width < wp->pixel_width) + break; + --len; + } + if( len >= strlen(ss)){ + add_line(wp->mesg_information, ss); + break; + } + split_japanese(ss, s1, s2, len); + add_line(wp->mesg_information, s1); + if(!*s2) + break; + Strcpy(ss,s2); + } +#else char *mark, *remainder, buf[BUFSZ]; if (!str) return; @@ -249,6 +293,10 @@ remainder = split(mark, wp->mesg_information->fs, wp->pixel_width); add_line(wp->mesg_information, mark); } while (remainder); +# if 1 /*JP*/ + add_line(wp->mesg_information, buf); +# endif +#endif /*XI18N*/ } /* private functions ======================================================= */ @@ -352,6 +400,7 @@ * Make sure the given string is shorter than the given pixel width. If * not, back up from the end by words until we find a place to split. */ +#ifndef XI18N static char * split(s, fs, pixel_width) char *s; @@ -377,6 +426,7 @@ } return remainder; } +#endif /* * Add a line of text to the window. The first line in the curcular list @@ -471,12 +521,22 @@ row < mesg_info->num_lines; row++, y_base += mesg_info->char_height, curr = curr->next) { +#ifndef XI18N XDrawString(XtDisplay(wp->w), XtWindow(wp->w), mesg_info->gc, mesg_info->char_lbearing, mesg_info->char_ascent + y_base, curr->line, curr->str_length); +#else + XmbDrawString(XtDisplay(wp->w), XtWindow(wp->w), + mesg_info->fontset, + mesg_info->gc, + mesg_info->char_lbearing, + mesg_info->char_ascent + y_base, + curr->line, + curr->str_length); +#endif /* * This draws a line at the _top_ of the line of text pointed to by * mesg_info->last_pause. diff -aurbN -xCVS -xXTAGS nethack/win/X11/winmisc.c jnethack/win/X11/winmisc.c --- nethack/win/X11/winmisc.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/win/X11/winmisc.c 2003-12-22 04:49:55.000000000 +0900 @@ -8,6 +8,13 @@ * + Global functions: player_selection() and get_ext_cmd(). */ +/* +** Japanese version Copyright (C) Issei Numata, 1994-1999 +** changing point is marked `JP' (94/6/7) or XI18N (96/7/19) +** For 3.4.0, Copyright (c) Kentaro Shirakata, 2002 +** JNetHack may be freely redistributed. See license for details. +*/ + #ifndef SYSV #define PRESERVE_NO_SYSV /* X11 include files may define SYSV */ #endif @@ -268,6 +275,11 @@ const char **choices; char qbuf[QBUFSZ], plbuf[QBUFSZ]; +#ifdef XI18N + char **jroles; + char jtmp[256]; +#endif + /* avoid unnecessary prompts further down */ rigid_role_checks(); @@ -302,11 +314,20 @@ else if (flags.initrace >= 0) flags.initrace = -1; else panic("no available ROLE+race+gender+alignment combinations"); } +#if 0 /*JP*/ Sprintf(qbuf, "Choose your %s Role", s_suffix(plbuf)); +#else + Sprintf(qbuf, "%s職業を選択してください.", s_suffix(plbuf)); +#endif popup = make_menu("player_selection", qbuf, player_select_translations, +#if 0 /*JP*/ "quit", ps_quit, "random", ps_random, +#else + "選択せずにゲーム終了", ps_quit, + "ランダム", ps_random, +#endif num_roles, choices, (Widget **)0, ps_select, &player_form); ps_selected = -1; @@ -366,11 +387,20 @@ flags.initrace = availindex; free((genericptr_t)choices), choices = 0; } else { +#if 0 /*JP*/ Sprintf(qbuf, "Pick your %s race", s_suffix(plbuf)); +#else + Sprintf(qbuf, "%s種族を選択してください.", s_suffix(plbuf)); +#endif popup = make_menu("race_selection", qbuf, race_select_translations, +#if 0 /*JP*/ "quit", ps_quit, "random", ps_random, +#else + "選択せずにゲーム終了", ps_quit, + "ランダム", ps_random, +#endif num_races, choices, (Widget **)0, ps_select, &player_form); @@ -431,11 +461,20 @@ flags.initgend = availindex; free((genericptr_t)choices), choices = 0; } else { +#if 0 /*JP*/ Sprintf(qbuf, "Your %s gender?", s_suffix(plbuf)); +#else + Sprintf(qbuf, "%s性別を選んでください.", s_suffix(plbuf)); +#endif popup = make_menu("gender_selection", qbuf, gend_select_translations, +#if 0 /*JP*/ "quit", ps_quit, "random", ps_random, +#else + "選択せずにゲーム終了", ps_quit, + "ランダム", ps_random, +#endif num_gends, choices, (Widget **)0, ps_select, &player_form); @@ -495,11 +534,20 @@ flags.initalign = availindex; free((genericptr_t)choices), choices = 0; } else { +#if 0 /*JP*/ Sprintf(qbuf, "Your %s alignment?", s_suffix(plbuf)); +#else + Sprintf(qbuf, "%s属性を選択してください.", s_suffix(plbuf)); +#endif popup = make_menu("alignment_selection", qbuf, algn_select_translations, +#if 0 /*JP*/ "quit", ps_quit, "random", ps_random, +#else + "選択せずにゲーム終了", ps_quit, + "ランダム", ps_random, +#endif num_algns, choices, (Widget **)0, ps_select, &player_form); @@ -730,10 +778,19 @@ command_list[i] = extcmdlist[i].ef_txt; extended_command_popup = make_menu("extended_commands", +#if 0 /*JP*/ "Extended Commands", +#else + "拡張コマンド", +#endif extended_command_translations, +#if 0 /*JP*/ "dismiss", extend_dismiss, "help", extend_help, +#else + "取消", extend_dismiss, + "へルプ", extend_help, +#endif num_commands, command_list, &extended_commands, extend_select, &extended_command_form); @@ -817,6 +874,9 @@ * Create the label. */ num_args = 0; +#if defined(X11R6) && defined(XI18N) + XtSetArg(args[num_args], XtNinternational, True); num_args++; +#endif XtSetArg(args[num_args], XtNborderWidth, 0); num_args++; label = XtCreateManagedWidget(popup_label, labelWidgetClass, @@ -832,6 +892,9 @@ XtSetArg(args[num_args], XtNshapeStyle, XmuShapeRoundedRectangle); num_args++; */ +#if defined(X11R6) && defined(XI18N) + XtSetArg(args[num_args], XtNinternational, True); num_args++; +#endif left = XtCreateManagedWidget(left_name, commandWidgetClass, form, @@ -850,6 +913,9 @@ XtSetArg(args[num_args], XtNshapeStyle, XmuShapeRoundedRectangle); num_args++; */ +#if defined(X11R6) && defined(XI18N) + XtSetArg(args[num_args], XtNinternational, True); num_args++; +#endif right = XtCreateManagedWidget(right_name, commandWidgetClass, form, @@ -871,6 +937,9 @@ XtSetArg(args[num_args], XtNvertDistance, skip); num_args++; } +#if defined(X11R6) && defined(XI18N) + XtSetArg(args[num_args], XtNinternational, True); num_args++; +#endif *curr = XtCreateManagedWidget(widget_names[i], commandWidgetClass, form, diff -aurbN -xCVS -xXTAGS nethack/win/X11/winstat.c jnethack/win/X11/winstat.c --- nethack/win/X11/winstat.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/win/X11/winstat.c 2003-12-10 00:54:10.000000000 +0900 @@ -10,6 +10,13 @@ * Currently, only one status window (of any type) is _ever_ made. */ +/* +** Japanese version Copyright (C) Issei Numata, 1994-1999 +** changing point is marked `JP' (94/6/7) or XI18N (96/7/19) +** For 3.4.0, Copyright (c) Kentaro Shirakata, 2002 +** JNetHack may be freely redistributed. See license for details. +*/ + #ifndef SYSV #define PRESERVE_NO_SYSV /* X11 include files may define SYSV */ #endif @@ -47,10 +54,16 @@ boolean create_popup; Widget parent; { +#if 0 /*JP*/ XFontStruct *fs; +#endif Arg args[8]; Cardinal num_args; Position top_margin, bottom_margin, left_margin, right_margin; +#ifdef XI18N + XFontSet fontset; + XFontSetExtents *extent; +#endif wp->type = NHW_STATUS; @@ -90,6 +103,10 @@ XtSetArg(args[num_args], XtNscrollVertical, XawtextScrollWhenNeeded); num_args++; +/*JP*/ +#if defined(X11R6) && defined(XI18N) + XtSetArg(args[num_args], XtNinternational, True); num_args++; +#endif wp->w = XtCreateManagedWidget( "status", /* name */ asciiTextWidgetClass, @@ -104,16 +121,28 @@ /* Get the font and margin information. */ num_args = 0; +#ifndef XI18N XtSetArg(args[num_args], XtNfont, &fs); num_args++; +#else + XtSetArg(args[num_args], XtNfontSet, &fontset); num_args++; +#endif XtSetArg(args[num_args], XtNtopMargin, &top_margin); num_args++; XtSetArg(args[num_args], XtNbottomMargin, &bottom_margin); num_args++; XtSetArg(args[num_args], XtNleftMargin, &left_margin); num_args++; XtSetArg(args[num_args], XtNrightMargin, &right_margin); num_args++; XtGetValues(wp->w, args, num_args); +#ifndef XI18N wp->pixel_height = 2 * nhFontHeight(wp->w) + top_margin + bottom_margin; wp->pixel_width = COLNO * fs->max_bounds.width + left_margin + right_margin; +#else + extent = XExtentsOfFontSet(fontset); + wp->pixel_height = 2 * extent->max_logical_extent.height + + top_margin + bottom_margin; + wp->pixel_width = COLNO/2 * extent->max_logical_extent.width + + left_margin + right_margin; +#endif /* Set the new width and height. */ num_args = 0; @@ -245,6 +274,7 @@ * + Blank value is 0 and should never change. */ static struct X_status_value shown_stats[NUM_STATS] = { +#if 0 /*JP*/ { "Strength", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, /* 0*/ { "Dexterity", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, { "Constitution", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, @@ -273,6 +303,36 @@ { "Stunned", SV_NAME, (Widget) 0, 0, 0, FALSE, TRUE }, { "Hallucinating", SV_NAME, (Widget) 0, 0, 0, FALSE, TRUE }, { "", SV_NAME, (Widget) 0, 0, 0, FALSE, TRUE }, /*encumbr*/ +#else /*JP*/ + { "強さ", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, /* 0*/ + { "素早さ", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, + { "耐久力", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, + { "知力", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, + { "賢さ", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, + { "魅力", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, /* 5*/ + + { "", SV_LABEL, (Widget) 0, -1, 0, FALSE, FALSE }, /* name */ + { "", SV_LABEL, (Widget) 0, -1, 0, FALSE, FALSE }, /* dlvl */ + { "金", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, + { "体力", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, + { "最大体力", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, /*10*/ + { "魔力", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, + { "最大魔力", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, + { "鎧", SV_VALUE, (Widget) 0,256, 0, FALSE, FALSE }, + { "レベル", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, + { "経験", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, /*15*/ + { "属性", SV_VALUE, (Widget) 0, -2, 0, FALSE, FALSE }, + { "時間", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, + { "スコア", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, + + { "", SV_NAME, (Widget) 0, -1, 0, FALSE, TRUE }, /* hunger*/ + { " 混乱 ", SV_NAME, (Widget) 0, 0, 0, FALSE, TRUE }, /*20*/ + { " 病気 ", SV_NAME, (Widget) 0, 0, 0, FALSE, TRUE }, + { " 盲目 ", SV_NAME, (Widget) 0, 0, 0, FALSE, TRUE }, + { " 眩暈 ", SV_NAME, (Widget) 0, 0, 0, FALSE, TRUE }, + { " 幻覚 ", SV_NAME, (Widget) 0, 0, 0, FALSE, TRUE }, + { "", SV_NAME, (Widget) 0, 0, 0, FALSE, TRUE }, /*encumbr*/ +#endif /*JP*/ }; @@ -339,26 +399,42 @@ Strcpy(buf, plname); if ('a' <= buf[0] && buf[0] <= 'z') buf[0] += 'A'-'a'; +/*JP Strcat(buf, " the "); +*/ + Strcat(buf, " "); if (u.mtimedone) { char mname[BUFSZ]; +#if 0 /*JP*/ int k = 0; +#endif Strcpy(mname, mons[u.umonnum].mname); +#if 0 /*JP*/ while(mname[k] != 0) { if ((k == 0 || (k > 0 && mname[k-1] == ' ')) && 'a' <= mname[k] && mname[k] <= 'z') mname[k] += 'A' - 'a'; k++; } +#endif +/*JP Strcat(buf, mname); +*/ + Strcat(buf, jtrns_mon_gen(mname, flags.female)); } else Strcat(buf, rank_of(u.ulevel, pl_character[0], flags.female)); } else if (attr_rec == &shown_stats[F_DLEVEL]) { if (!describe_level(buf)) { +/*JP Strcpy(buf, dungeons[u.uz.dnum].dname); +*/ + Strcpy(buf, jtrns_obj('d',dungeons[u.uz.dnum].dname)); +/*JP Sprintf(eos(buf), ", level %d", depth(&u.uz)); +*/ + Sprintf(eos(buf), " 地下%d階", depth(&u.uz)); } } else { impossible("update_val: unknown label type \"%s\"", @@ -388,11 +464,17 @@ buf[0] = 0; if (Sick) { if (u.usick_type & SICK_VOMITABLE) +/*JP Strcat(buf, "FoodPois"); +*/ + Strcat(buf, "食毒"); if (u.usick_type & SICK_NONVOMITABLE) { if (u.usick_type & SICK_VOMITABLE) Strcat(buf, " "); +/*JP Strcat(buf, "Ill"); +*/ + Strcat(buf, "病気"); } } XtSetArg(args[0], XtNlabel, buf); @@ -520,9 +602,15 @@ } } else if (attr_rec == &shown_stats[F_ALIGN]) { +#if 0 /*JP*/ Strcpy(buf, (new_value == A_CHAOTIC) ? "Chaotic" : (new_value == A_NEUTRAL) ? "Neutral" : "Lawful" ); +#else + Strcpy(buf, (new_value == A_CHAOTIC) ? "混沌" : + (new_value == A_NEUTRAL) ? "中立" : + "秩序" ); +#endif } else { Sprintf(buf, "%ld", new_value); } @@ -735,6 +823,10 @@ num_args = 0; XtSetArg(args[num_args], XtNborderWidth, 0); num_args++; XtSetArg(args[num_args], XtNinternalHeight, 0); num_args++; +/*JP*/ +#if defined(X11R6) && defined(XI18N) + XtSetArg(args[num_args], XtNinternational, True); num_args++; +#endif sv->w = XtCreateManagedWidget( sv_index == F_NAME ? "name" : "dlevel", labelWidgetClass, @@ -745,6 +837,10 @@ num_args = 0; XtSetArg(args[num_args], XtNborderWidth, 0); num_args++; XtSetArg(args[num_args], XtNinternalHeight, 0); num_args++; +/*JP*/ +#if defined(X11R6) && defined(XI18N) + XtSetArg(args[num_args], XtNinternational, True); num_args++; +#endif sv->w = XtCreateManagedWidget(sv->name, labelWidgetClass, parent, diff -aurbN -xCVS -xXTAGS nethack/win/X11/wintext.c jnethack/win/X11/wintext.c --- nethack/win/X11/wintext.c 2003-12-08 08:39:13.000000000 +0900 +++ jnethack/win/X11/wintext.c 2003-12-26 18:32:51.000000000 +0900 @@ -8,6 +8,13 @@ * + No global functions. */ +/* +** Japanese version Copyright (C) Issei Numata, 1994-1999 +** changing point is marked `JP' (94/6/7) or XI18N (96/7/19) +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #ifndef SYSV #define PRESERVE_NO_SYSV /* X11 include files may define SYSV */ #endif @@ -36,6 +43,9 @@ #include #endif +#ifdef INSTALLCOLORMAP +extern Colormap cmap; +#endif #define TRANSIENT_TEXT /* text window is a transient window (no positioning) */ @@ -143,7 +153,11 @@ append_text_buffer(&text_info->text, str, FALSE); /* Calculate text width and save longest line */ +#ifndef XI18N width = XTextWidth(text_info->fs, str, (int) strlen(str)); +#else + width = XmbTextEscapement(text_info->fontset, str, (int) strlen(str)); +#endif if (width > text_info->max_width) text_info->max_width = width; } @@ -158,6 +172,10 @@ Cardinal num_args; Dimension width, height, font_height; int nlines; +/*JP*/ +#ifdef XI18N + XFontSetExtents *extent; +#endif text_info = wp->text_information; width = text_info->max_width + text_info->extra_width; @@ -165,6 +183,11 @@ text_info->destroy_on_ack = FALSE; font_height = nhFontHeight(wp->w); +/*JP*/ +#ifdef XI18N + extent = XExtentsOfFontSet(text_info->fontset); +#endif + /* * Calculate the number of lines to use. First, find the number of * lines that would fit on the screen. Next, remove four of these @@ -173,14 +196,26 @@ * _some_ lines. Finally, use the number of lines in the text if * there are fewer than the max. */ +/*JP*/ +#ifndef XI18N nlines = (XtScreen(wp->w)->height - text_info->extra_height) / font_height; +#else + nlines = (XtScreen(wp->w)->height - text_info->extra_height) / + extent->max_logical_extent.height; +#endif nlines -= 4; if (nlines > text_info->text.num_lines) nlines = text_info->text.num_lines; if (nlines <= 0) nlines = 1; +/*JP*/ +#ifndef XI18N height = nlines * font_height + text_info->extra_height; +#else + height = (nlines * extent->max_logical_extent.height) + + text_info->extra_height; +#endif num_args = 0; @@ -288,6 +323,10 @@ XtSetArg(args[num_args], XtNresize, XawtextResizeBoth); num_args++; XtSetArg(args[num_args], XtNtranslations, XtParseTranslationTable(text_translations)); num_args++; +/*JP*/ +#if defined(X11R6) && defined(XI18N) + XtSetArg(args[num_args], XtNinternational, True); num_args++; +#endif wp->w = XtCreateManagedWidget( killer && WIN_MAP == WIN_ERR ? @@ -299,7 +338,11 @@ /* Get the font and margin information. */ num_args = 0; +#ifndef XI18N XtSetArg(args[num_args], XtNfont, &text_info->fs); num_args++; +#else + XtSetArg(args[num_args], XtNfontSet, &text_info->fontset); num_args++; +#endif XtSetArg(args[num_args], XtNtopMargin, &top_margin); num_args++; XtSetArg(args[num_args], XtNbottomMargin, &bottom_margin); num_args++; XtSetArg(args[num_args], XtNleftMargin, &left_margin); num_args++; @@ -308,6 +351,11 @@ text_info->extra_width = left_margin + right_margin; text_info->extra_height = top_margin + bottom_margin; + +#if 1 /*JP*/ + /* Send events to "text" which is where the translations are. */ + XtSetKeyboardFocus (form, wp->w); +#endif } void @@ -455,7 +503,11 @@ extern const char *killed_by_prefix[]; void +#ifndef XI18N calculate_rip_text(int how) +#else +calculate_rip_text(int how, XFontSet fontset) +#endif { /* Follows same algorithm as genl_outrip() */ @@ -477,28 +529,79 @@ switch (killer_format) { default: impossible("bad killer format?"); case KILLED_BY_AN: +#if 0 /*JP*/ Strcpy(buf, killed_by_prefix[how]); Strcat(buf, an(killer)); +#else + Strcpy(buf, an(killer)); + Strcat(buf, killed_by_prefix[how]); +#endif break; case KILLED_BY: +#if 0 /*JP*/ Strcpy(buf, killed_by_prefix[how]); Strcat(buf, killer); +#else + Strcpy(buf, killer); + Strcat(buf, killed_by_prefix[how]); +#endif break; case NO_KILLER_PREFIX: Strcpy(buf, killer); break; +#if 1 /*JP*/ + case KILLED_SUFFIX: + Strcpy(buf, killer); + Strcat(buf, "に殺された"); + break; +#endif } /* Put death type on stone */ for (line=DEATH_LINE, dpx = buf; line STONE_LINE_LEN) { for(i = STONE_LINE_LEN; ((i0 > STONE_LINE_LEN) && i); i--) +#else + if ( i0 > jstone_line) { + for(i = jstone_line; + ((i0 > jstone_line) && i); i--) +#endif if(dpx[i] == ' ') i0 = i; +#if 0 /*JP*/ if(!i) i0 = STONE_LINE_LEN; +#else + if(!i){ + i0=0; +/* + while(i0 +#endif #include "winX.h" #define WNAME "name" @@ -52,6 +56,10 @@ XtSetArg(args[num_args], XtNjustify, XtJustifyRight); num_args++; XtSetArg(args[num_args], XtNborderWidth, 0); num_args++; XtSetArg(args[num_args], XtNlabel, name_value); num_args++; +/*JP*/ +#if defined(X11R6) && defined(XI18N) + XtSetArg(args[num_args], XtNinternational, True); num_args++; +#endif XtSetArg(args[num_args], XtNinternalHeight, 0); num_args++; name = XtCreateManagedWidget(WNAME, labelWidgetClass, @@ -61,6 +69,10 @@ XtSetArg(args[num_args], XtNjustify, XtJustifyRight); num_args++; XtSetArg(args[num_args], XtNborderWidth, 0); num_args++; XtSetArg(args[num_args], XtNfromHoriz, name); num_args++; +/*JP*/ +#if defined(X11R6) && defined(XI18N) + XtSetArg(args[num_args], XtNinternational, True); num_args++; +#endif XtSetArg(args[num_args], XtNinternalHeight, 0); num_args++; (void) XtCreateManagedWidget(WVALUE, labelWidgetClass, diff -aurbN -xCVS -xXTAGS nethack/win/tty/getline.c jnethack/win/tty/getline.c --- nethack/win/tty/getline.c 2003-12-08 08:39:14.000000000 +0900 +++ jnethack/win/tty/getline.c 2003-12-10 00:54:10.000000000 +0900 @@ -2,6 +2,12 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #ifdef TTY_GRAPHICS @@ -42,15 +48,25 @@ } STATIC_OVL void -hooked_tty_getlin(query, bufp, hook) +hooked_tty_getlin(query, bfp, hook) const char *query; -register char *bufp; +register char *bfp; getlin_hook_proc hook; { +#if 1 /*JP*/ + char tmp[BUFSZ]; + char *bufp = tmp; +#endif register char *obufp = bufp; +/*JP register int c; +*/ + int c; struct WinDesc *cw = wins[WIN_MESSAGE]; boolean doprev = 0; +#if 1 /*JP*/ + unsigned int uc; +#endif if(ttyDisplay->toplin == 1 && !(cw->flags & WIN_STOP)) more(); cw->flags &= ~WIN_STOP; @@ -68,6 +84,10 @@ #endif /* not NEWAUTOCOMP */ break; } +#if 1 /*JP*/ + uc = (*((unsigned int *)&c)); + uc &= 0377; +#endif if(c == '\033') { *obufp = c; obufp[1] = 0; @@ -106,6 +126,9 @@ addtopl(obufp); } if(c == erase_char || c == '\b') { +#if 1 /*JP*/ + moreback: +#endif if(bufp != obufp) { #ifdef NEWAUTOCOMP char *i; @@ -121,6 +144,10 @@ *bufp = 0; #endif /* NEWAUTOCOMP */ } else tty_nhbell(); +#if 1 /*JP*/ + if(is_kanji2(tmp, bufp-tmp)) + goto moreback; +#endif #if defined(apollo) } else if(c == '\n' || c == '\r') { #else @@ -130,7 +157,11 @@ *bufp = 0; #endif /* not NEWAUTOCOMP */ break; +#if 0 /*JP*/ } else if(' ' <= (unsigned char) c && c != '\177' && +#else + } else if(' ' <= uc && uc < '\377' && +#endif (bufp-obufp < BUFSZ-1 && bufp-obufp < COLNO)) { /* avoid isprint() - some people don't have it ' ' is not always a printing char */ @@ -140,10 +171,18 @@ #endif /* NEWAUTOCOMP */ *bufp = c; bufp[1] = 0; +#if 0 /*JP*/ putsyms(bufp); +#else + raw_putsyms(bufp); +#endif bufp++; if (hook && (*hook)(obufp)) { +#if 0 /*JP*/ putsyms(bufp); +#else + raw_putsyms(bufp); +#endif #ifndef NEWAUTOCOMP bufp = eos(bufp); #else /* NEWAUTOCOMP */ @@ -175,6 +214,9 @@ ttyDisplay->toplin = 2; /* nonempty, no --More-- required */ ttyDisplay->inread--; clear_nhwindow(WIN_MESSAGE); /* clean up after ourselves */ +#if 1 /*JP*/ + Strcpy(bfp, str2ic(tmp)); +#endif } void @@ -270,7 +312,10 @@ #endif if (extcmdlist[i].ef_txt == (char *)0) { +/*JP pline("%s: unknown extended command.", buf); +*/ + pline("%s:拡張コマンドエラー", buf); i = -1; } diff -aurbN -xCVS -xXTAGS nethack/win/tty/termcap.c jnethack/win/tty/termcap.c --- nethack/win/tty/termcap.c 2003-12-08 08:39:14.000000000 +0900 +++ jnethack/win/tty/termcap.c 2003-12-10 00:54:10.000000000 +0900 @@ -2,6 +2,12 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #if defined (TTY_GRAPHICS) && !defined(NO_TERMS) @@ -61,6 +67,7 @@ STATIC_VAR char tbuf[512]; #endif +#ifdef OVLB #ifdef TEXTCOLOR # ifdef TOS const char *hilites[CLR_MAX]; /* terminal escapes for the various colors */ @@ -68,6 +75,7 @@ char NEARDATA *hilites[CLR_MAX]; /* terminal escapes for the various colors */ # endif #endif +#endif #ifdef OVLB static char *KS = (char *)0, *KE = (char *)0; /* keypad sequences */ @@ -563,7 +571,11 @@ char c; #endif { +#if 0 /*JP*/ (void) putchar(c); +#else + (void) cputchar(c); +#endif } void @@ -571,6 +583,9 @@ const char *s; { # ifndef TERMLIB +#if 1 /*JP*/ + (void) jputchar('\0'); +#endif (void) fputs(s, stdout); # else # if defined(NHSTDC) || defined(ULTRIX_PROTO) @@ -688,7 +703,11 @@ tty_nhbell() { if (flags.silent) return; +#if 0 /*JP*/ (void) putchar('\007'); /* curx does not change */ +#else + (void) cputchar('\007'); /* curx does not change */ +#endif (void) fflush(stdout); } @@ -739,10 +758,17 @@ #endif #if defined(MICRO) /* simulate the delay with "cursor here" */ +#if 1 /*JP*/ + { + register int i; +#endif for (i = 0; i < 3; i++) { cmov(ttyDisplay->curx, ttyDisplay->cury); (void) fflush(stdout); } +#if 1 /*JP*/ + } +#endif #else /* MICRO */ /* BUG: if the padding character is visible, as it is on the 5620 then this looks terrible. */ diff -aurbN -xCVS -xXTAGS nethack/win/tty/topl.c jnethack/win/tty/topl.c --- nethack/win/tty/topl.c 2003-12-08 08:39:14.000000000 +0900 +++ jnethack/win/tty/topl.c 2003-12-17 15:54:33.000000000 +0900 @@ -2,6 +2,12 @@ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ +/* +** Japanese version Copyright (C) Issei Numata, 2000 +** For 3.4, Kentaro Shirakata, 2003 +** JNetHack may be freely redistributed. See license for details. +*/ + #include "hack.h" #ifdef TTY_GRAPHICS @@ -126,12 +132,14 @@ { int otoplin = ttyDisplay->toplin; home(); +#if 0 /*JP*/ if(*str & 0x80) { /* kludge for the / command, the only time we ever want a */ /* graphics character on the top line */ g_putch((int)*str++); ttyDisplay->curx++; } +#endif end_glyphout(); /* in case message printed during graphics output */ putsyms(str); cl_end(); @@ -209,12 +217,37 @@ ttyDisplay->toplin = 0; ttyDisplay->inmore = 0; } +#if 1 /*JP*/ +static char * +folding_japanese( str, pos ) + char *str; + int pos; +{ + char ss[1024],s1[1024],s2[1024]; + static char newstr[1024]; /* may be enough */ + + newstr[0] = '\0'; + Strcpy(ss, str); + while(1){ + split_japanese(ss, s1, s2, pos); + Strcat(newstr, s1); + if(!*s2) + break; + Strcat(newstr, "\n"); + Strcpy(ss,s2); + } + + return newstr; +} +#endif void update_topl(bp) register const char *bp; { +#if 0 /*JP*/ register char *tl, *otl; +#endif register int n0; int notdied = 1; struct WinDesc *cw = wins[WIN_MESSAGE]; @@ -240,6 +273,12 @@ } } remember_topl(); +#if 1 /*JP*/ + if( n0flags &= ~WIN_STOP; if(!(cw->flags & WIN_STOP)) redotoplin(toplines); } @@ -264,6 +304,12 @@ char c; { register struct WinDesc *cw = wins[WIN_MESSAGE]; +#if 0 /*JP*/ + static int kmode; +#endif +#if 1 /*JP*/ + unsigned char uc = *((unsigned char *)(&c)); +#endif if(cw == (struct WinDesc *) 0) panic("Putsym window MESSAGE nonexistant"); @@ -277,26 +323,42 @@ return; case '\n': cl_end(); +#if 1 /*JP*/ + (void) jputchar('\r'); /* raw mode で必要? */ + (void) jputchar('\n'); +#endif ttyDisplay->curx = 0; ttyDisplay->cury++; cw->cury = ttyDisplay->cury; +#if 0 /*JP*/ #ifdef WIN32CON (void) putchar(c); #endif +#endif break; default: if(ttyDisplay->curx == CO-1) topl_putsym('\n'); /* 1 <= curx <= CO; avoid CO */ +#if 0 /*JP*/ #ifdef WIN32CON (void) putchar(c); #endif +#endif +#if 1 /*JP*/ + cw->curx = ttyDisplay->curx; + if(cw->curx == 0) cl_end(); + (void) jputchar((unsigned char)uc); + cw->curx++; ttyDisplay->curx++; +#endif } +#if 0 /*JP*/ cw->curx = ttyDisplay->curx; if(cw->curx == 0) cl_end(); #ifndef WIN32CON (void) putchar(c); #endif +#endif } void @@ -307,6 +369,61 @@ topl_putsym(*str++); } +/* JP +** do not translate kcode this function(see topl_putsym) +*/ +STATIC_OVL +void +raw_topl_putsym(c) + char c; +{ + register struct WinDesc *cw = wins[WIN_MESSAGE]; + + if(cw == (struct WinDesc *) 0) panic("Putsym window MESSAGE nonexistant"); + + switch(c) { + case '\b': + if(ttyDisplay->curx == 0 && ttyDisplay->cury > 0) + tty_curs(BASE_WINDOW, CO, (int)ttyDisplay->cury-1); + backsp(); + ttyDisplay->curx--; + cw->curx = ttyDisplay->curx; + return; + case '\n': + cl_end(); +#if 1 /*JP*/ + (void) cputchar('\r'); /* raw mode で必要? */ + (void) cputchar('\n'); +#endif + ttyDisplay->curx = 0; + ttyDisplay->cury++; + cw->cury = ttyDisplay->cury; + break; + default: + if(ttyDisplay->curx == CO-1) + topl_putsym('\n'); /* 1 <= curx <= CO; avoid CO */ +#if 0 /*JP*/ + ttyDisplay->curx++; +#else + cw->curx = ttyDisplay->curx; + if(cw->curx == 0) cl_end(); + (void) cputchar(c); + ++cw->curx; + ++ttyDisplay->curx; +#endif + } +} +/* JP +** do not translate kcode this function(see putsym) +*/ +void +raw_putsyms(str) + const char *str; +{ + while(*str) + raw_topl_putsym(*str++); +} + STATIC_OVL void removetopl(n) register int n; diff -aurbN -xCVS -xXTAGS nethack/win/tty/wintty.c jnethack/win/tty/wintty.c --- nethack/win/tty/wintty.c 2003-12-08 08:39:14.000000000 +0900 +++ jnethack/win/tty/wintty.c 2005-07-26 03:57:18.000000000 +0900 @@ -3,6 +3,12 @@ /* NetHack may be freely redistributed. See license for details. */ /* +** Japanese version (by Issei Numata) +** For 3.4, Copyright (c) Kentaro Shirakata, 2002-2003 +** JNetHack may be freely redistributed. See license for details. +*/ + +/* * Neither a standard out nor character-based control codes should be * part of the "tty look" windowing implementation. * h+ 930227 @@ -311,6 +317,13 @@ tty_putstr(BASE_WINDOW, 0, COPYRIGHT_BANNER_B); tty_putstr(BASE_WINDOW, 0, COPYRIGHT_BANNER_C); tty_putstr(BASE_WINDOW, 0, ""); +#if 1 /*JP*/ + tty_putstr(BASE_WINDOW, 0, JA_COPYRIGHT_BANNER_A); + tty_putstr(BASE_WINDOW, 0, JA_COPYRIGHT_BANNER_B); + tty_putstr(BASE_WINDOW, 0, JA_COPYRIGHT_BANNER_C); + tty_putstr(BASE_WINDOW, 0, JA_COPYRIGHT_BANNER_D); + tty_putstr(BASE_WINDOW, 0, ""); +#endif tty_display_nhwindow(BASE_WINDOW, FALSE); } @@ -382,7 +395,10 @@ } } else { tty_clear_nhwindow(BASE_WINDOW); +/*JP tty_putstr(BASE_WINDOW, 0, "Choosing Character's Role"); +*/ + tty_putstr(BASE_WINDOW, 0, "職業選択"); /* Prompt for a role */ win = create_nhwindow(NHW_MENU); start_menu(win); @@ -406,8 +422,13 @@ } else Strcpy(rolenamebuf, roles[i].name.m); } +#if 0 /*JP*/ add_menu(win, NO_GLYPH, &any, thisch, 0, ATR_NONE, an(rolenamebuf), MENU_UNSELECTED); +#else + add_menu(win, NO_GLYPH, &any, thisch, + 0, ATR_NONE, jtrns_mon(roles[i].name.m), MENU_UNSELECTED); +#endif lastch = thisch; } } @@ -416,11 +437,20 @@ if (any.a_int == 0) /* must be non-zero */ any.a_int = randrole()+1; add_menu(win, NO_GLYPH, &any , '*', 0, ATR_NONE, +/*JP "Random", MENU_UNSELECTED); +*/ + "適当", MENU_UNSELECTED); any.a_int = i+1; /* must be non-zero */ add_menu(win, NO_GLYPH, &any , 'q', 0, ATR_NONE, +/*JP "Quit", MENU_UNSELECTED); +*/ + "中断", MENU_UNSELECTED); +/*JP Sprintf(pbuf, "Pick a role for your %s", plbuf); +*/ + Sprintf(pbuf, "%s職業を選択してください.", plbuf); end_menu(win, pbuf); n = select_menu(win, PICK_ONE, &selected); destroy_nhwindow(win); @@ -471,7 +501,10 @@ /* Permit the user to pick, if there is more than one */ if (n > 1) { tty_clear_nhwindow(BASE_WINDOW); +/*JP tty_putstr(BASE_WINDOW, 0, "Choosing Race"); +*/ + tty_putstr(BASE_WINDOW, 0, "種族選択"); win = create_nhwindow(NHW_MENU); start_menu(win); any.a_void = 0; /* zero out all bits */ @@ -479,19 +512,33 @@ if (ok_race(flags.initrole, i, flags.initgend, flags.initalign)) { any.a_int = i+1; /* must be non-zero */ +#if 0 /*JP*/ add_menu(win, NO_GLYPH, &any, races[i].noun[0], 0, ATR_NONE, races[i].noun, MENU_UNSELECTED); +#else + add_menu(win, NO_GLYPH, &any, races[i].noun[0], + 0, ATR_NONE, jtrns_mon(races[i].noun), MENU_UNSELECTED); +#endif } any.a_int = pick_race(flags.initrole, flags.initgend, flags.initalign, PICK_RANDOM)+1; if (any.a_int == 0) /* must be non-zero */ any.a_int = randrace(flags.initrole)+1; add_menu(win, NO_GLYPH, &any , '*', 0, ATR_NONE, +/*JP "Random", MENU_UNSELECTED); +*/ + "適当", MENU_UNSELECTED); any.a_int = i+1; /* must be non-zero */ add_menu(win, NO_GLYPH, &any , 'q', 0, ATR_NONE, +/*JP "Quit", MENU_UNSELECTED); +*/ + "中断", MENU_UNSELECTED); +/*JP Sprintf(pbuf, "Pick the race of your %s", plbuf); +*/ + Sprintf(pbuf, "%s種族を選択してください.", plbuf); end_menu(win, pbuf); n = select_menu(win, PICK_ONE, &selected); destroy_nhwindow(win); @@ -543,7 +590,10 @@ /* Permit the user to pick, if there is more than one */ if (n > 1) { tty_clear_nhwindow(BASE_WINDOW); +/*JP tty_putstr(BASE_WINDOW, 0, "Choosing Gender"); +*/ + tty_putstr(BASE_WINDOW, 0, "性別選択"); win = create_nhwindow(NHW_MENU); start_menu(win); any.a_void = 0; /* zero out all bits */ @@ -552,18 +602,30 @@ flags.initalign)) { any.a_int = i+1; add_menu(win, NO_GLYPH, &any, genders[i].adj[0], +/*JP 0, ATR_NONE, genders[i].adj, MENU_UNSELECTED); +*/ + 0, ATR_NONE, genders[i].j, MENU_UNSELECTED); } any.a_int = pick_gend(flags.initrole, flags.initrace, flags.initalign, PICK_RANDOM)+1; if (any.a_int == 0) /* must be non-zero */ any.a_int = randgend(flags.initrole, flags.initrace)+1; add_menu(win, NO_GLYPH, &any , '*', 0, ATR_NONE, +/*JP "Random", MENU_UNSELECTED); +*/ + "適当", MENU_UNSELECTED); any.a_int = i+1; /* must be non-zero */ add_menu(win, NO_GLYPH, &any , 'q', 0, ATR_NONE, +/*JP "Quit", MENU_UNSELECTED); +*/ + "中断", MENU_UNSELECTED); +/*JP Sprintf(pbuf, "Pick the gender of your %s", plbuf); +*/ + Sprintf(pbuf, "%s性別を選んでください", plbuf); end_menu(win, pbuf); n = select_menu(win, PICK_ONE, &selected); destroy_nhwindow(win); @@ -614,7 +676,10 @@ /* Permit the user to pick, if there is more than one */ if (n > 1) { tty_clear_nhwindow(BASE_WINDOW); +/*JP tty_putstr(BASE_WINDOW, 0, "Choosing Alignment"); +*/ + tty_putstr(BASE_WINDOW, 0, "属性選択"); win = create_nhwindow(NHW_MENU); start_menu(win); any.a_void = 0; /* zero out all bits */ @@ -623,18 +688,30 @@ flags.initgend, i)) { any.a_int = i+1; add_menu(win, NO_GLYPH, &any, aligns[i].adj[0], +/*JP 0, ATR_NONE, aligns[i].adj, MENU_UNSELECTED); +*/ + 0, ATR_NONE, aligns[i].j, MENU_UNSELECTED); } any.a_int = pick_align(flags.initrole, flags.initrace, flags.initgend, PICK_RANDOM)+1; if (any.a_int == 0) /* must be non-zero */ any.a_int = randalign(flags.initrole, flags.initrace)+1; add_menu(win, NO_GLYPH, &any , '*', 0, ATR_NONE, +/*JP "Random", MENU_UNSELECTED); +*/ + "適当", MENU_UNSELECTED); any.a_int = i+1; /* must be non-zero */ add_menu(win, NO_GLYPH, &any , 'q', 0, ATR_NONE, +/*JP "Quit", MENU_UNSELECTED); +*/ + "中断", MENU_UNSELECTED); +/*JP Sprintf(pbuf, "Pick the alignment of your %s", plbuf); +*/ + Sprintf(pbuf, "%s属性を選択してください", plbuf); end_menu(win, pbuf); n = select_menu(win, PICK_ONE, &selected); destroy_nhwindow(win); @@ -660,15 +737,24 @@ void tty_askname() { +/*JP static char who_are_you[] = "Who are you? "; +*/ + static char who_are_you[] = "あなたは誰? "; register int c, ct, tryct = 0; +#if 1 /*JP*/ + char ptmpname[PL_NSIZ]; +#endif tty_putstr(BASE_WINDOW, 0, ""); do { if (++tryct > 1) { if (tryct > 10) bail("Giving up after 10 tries.\n"); tty_curs(BASE_WINDOW, 1, wins[BASE_WINDOW]->cury - 1); +/*JP tty_putstr(BASE_WINDOW, 0, "Enter a name for your character..."); +*/ + tty_putstr(BASE_WINDOW, 0, "あなたのキャラクタの名前は?"); /* erase previous prompt (in case of ESC after partial response) */ tty_curs(BASE_WINDOW, 1, wins[BASE_WINDOW]->cury), cl_end(); } @@ -684,6 +770,9 @@ #endif /* some people get confused when their erase char is not ^H */ if (c == '\b' || c == '\177') { +#if 1 /*JP*/ + moreback: +#endif if(ct) { ct--; #ifdef WIN32CON @@ -703,34 +792,62 @@ (void) putchar('\b'); #endif } +#if 1 /*JP*/ + if(is_kanji2(ptmpname, ct)) + goto moreback; +#endif continue; } #if defined(UNIX) || defined(VMS) +# if 0 /*JP*/ if(c != '-' && c != '@') if(c < 'A' || (c > 'Z' && c < 'a') || c > 'z') c = '_'; +# endif /*JP*/ #endif if (ct < (int)(sizeof plname) - 1) { #if defined(MICRO) # if defined(MSDOS) if (iflags.grmode) { +# if 0 /*JP*/ (void) putchar(c); +# else + (void) cputchar(c); +# ifdef NO_TERMS + ttyDisplay->curx++; + wins[BASE_WINDOW]->curx++; +# endif +# endif /*JP*/ } else # endif +/*JP msmsg("%c", c); +*/ + (void) putchar(c); #else (void) putchar(c); #endif +#if 0 /*JP*/ plname[ct++] = c; +#else + ptmpname[ct++] = c; +#endif #ifdef WIN32CON ttyDisplay->curx++; #endif } } +#if 0 /*JP*/ plname[ct] = 0; +#else + ptmpname[ct] = 0; +#endif } while (ct == 0); /* move to next line to simulate echo of user's */ tty_curs(BASE_WINDOW, 1, wins[BASE_WINDOW]->cury + 1); +#if 1 /*JP*/ + Strcpy(plname, str2ic(ptmpname)); +#endif } void @@ -743,6 +860,9 @@ STATIC_OVL void getret() { +#if 1 /*JP*/ + jputchar('\0'); +#endif xputs("\n"); if(flags.standout) standoutbeg(); @@ -1021,8 +1141,24 @@ (int)ttyDisplay->curx + offset, (int)ttyDisplay->cury); if(flags.standout) standoutbeg(); +/*JP + xputs(prompt); +*/ + jputchar('\0'); /* reset */ +#if 0 /*JP*/ xputs(prompt); ttyDisplay->curx += strlen(prompt); +#else + { + const char *p; + p = prompt; + while(*p){ + jputchar(*(p++)); + ttyDisplay->curx++; + } + } +/* jputs(prompt);*/ +#endif if(flags.standout) standoutend(); @@ -1038,7 +1174,10 @@ char ch = item->selected ? (item->count == -1L ? '+' : '#') : '-'; tty_curs(window, 4, lineno); term_start_attr(item->attr); +/*JP (void) putchar(ch); +*/ + (void) jputchar(ch); ttyDisplay->curx++; term_end_attr(item->attr); } @@ -1210,7 +1349,11 @@ tty_curs(window, 1, page_lines); if (cw->offx) cl_end(); +#if 0 /*JP*/ (void) putchar(' '); +#else + (void) jputchar(' '); +#endif ++ttyDisplay->curx; /* * Don't use xputs() because (1) under unix it calls @@ -1231,11 +1374,23 @@ if (n == 2 && curr->identifier.a_void != 0 && curr->selected) { if (curr->count == -1L) +#if 0 /*JP*/ (void) putchar('+'); /* all selected */ +#else + (void) jputchar('+'); /* all selected */ +#endif else +#if 0 /*JP*/ (void) putchar('#'); /* count selected */ +#else + (void) jputchar('#'); /* count selected */ +#endif } else +#if 0 /*JP*/ (void) putchar(*cp); +#else + (void) jputchar(*cp); +#endif term_end_attr(curr->attr); } } else { @@ -1260,7 +1415,11 @@ Strcat(resp, mapped_menu_cmds); if (cw->npages > 1) +#if 0 /*JP*/ Sprintf(cw->morestr, "(%d of %d)", +#else + Sprintf(cw->morestr, "(%d/%d)", +#endif curr_page + 1, (int) cw->npages); else if (msave) Strcpy(cw->morestr, msave); @@ -1459,7 +1618,11 @@ if (cw->data[i]) { attr = cw->data[i][0] - 1; if (cw->offx) { +#if 0 /*JP*/ (void) putchar(' '); ++ttyDisplay->curx; +#else + (void) jputchar(' '); ++ttyDisplay->curx; +#endif } term_start_attr(attr); for (cp = &cw->data[i][1]; @@ -1470,7 +1633,11 @@ *cp && (int) ttyDisplay->curx < (int) ttyDisplay->cols; cp++, ttyDisplay->curx++) #endif +#if 0 /*JP*/ (void) putchar(*cp); +#else + (void) jputchar(*cp); +#endif term_end_attr(attr); } } @@ -1680,7 +1847,11 @@ nocmov(x, y); #ifndef NO_TERMS } else if ((x <= 3 && cy <= 3) || (!nh_CM && x < cx)) { +# if 0 /*JP*/ (void) putchar('\r'); +# else + (void) cputchar('\r'); +# endif ttyDisplay->curx = 0; nocmov(x, y); } else if (!nh_CM) { @@ -1700,6 +1871,9 @@ char ch; { register struct WinDesc *cw = 0; +#if 1 /*JP*/ + static int prev_win; +#endif if(window == WIN_ERR || (cw = wins[window]) == (struct WinDesc *) 0) panic(winpanicstr, window); @@ -1709,7 +1883,15 @@ case NHW_MAP: case NHW_BASE: tty_curs(window, x, y); +#if 0 /*JP*/ (void) putchar(ch); +#else + if(cw->type!=NHW_MAP) + (void) jputchar(ch); + else { + (void) cputchar(ch); + } +#endif ttyDisplay->curx++; cw->curx++; break; @@ -1719,6 +1901,9 @@ impossible("Can't putsym to window type %d", cw->type); break; } +#if 1 /*JP*/ + prev_win = cw->type; +#endif } @@ -1755,10 +1940,17 @@ register char *ob; register const char *nb; register int i, j, n0; +#if 1 /*JP*/ + int kchar2 = 0; /* if 1, kanji 2nd byte */ +#endif /* Assume there's a real problem if the window is missing -- * probably a panic message */ +#if 1 /*JP*/ + jputchar('\0'); /* RESET */ +#endif + if(window == WIN_ERR || (cw = wins[window]) == (struct WinDesc *) 0) { tty_raw_print(str); return; @@ -1800,7 +1992,47 @@ } break; } +#if 0 /*JP*/ if(*ob != *nb) +#else /* this code updates all status line at any time */ +# if 0 +/* check 2-bytes character for Japanese */ +/* by issei 93/12/2 */ + uc = *((unsigned char *)nb); + if((!(uc & 0x80) && *ob != *nb) || kflg){ + tty_putsym(WIN_STATUS, i, cw->cury, *nb); + } + else{ + if(*ob != *nb || *(ob+1)!= *(nb+1)){ + tty_putsym(WIN_STATUS, i, cw->cury, *nb); + kflg = 1; + } + } +# endif /* 0 */ +#define ismbchar(c) (((unsigned char)(c)) & 0x80) +#define KANJI2 1 +#define KUPDATE 2 + if (kchar2) /* kanji 2nd byte */ + { + if (kchar2 & KUPDATE) + tty_putsym(WIN_STATUS, i, cw->cury, *nb); + kchar2 = 0; + } + else if (ismbchar(*nb)) /* kanji 1st byte */ + { + kchar2 = KANJI2; + /* Kanji char must be checked as 2-bytes pair. */ + /* check i to prevent putting only kanji 1st byte at last. */ + if ((*nb != *ob || *(nb+1) != *(ob+1)) && i < n0-1) + { + tty_putsym(WIN_STATUS, i, cw->cury, *nb); + kchar2 |= KUPDATE; /* must do update */ + } + /* else nb is the same char as old, so need not to update */ + } + /* not kanji char */ + else if (*nb != *ob) +#endif tty_putsym(WIN_STATUS, i, cw->cury, *nb); if(*ob) ob++; } @@ -1814,7 +2046,11 @@ tty_curs(window, cw->curx+1, cw->cury); term_start_attr(attr); while(*str && (int) ttyDisplay->curx < (int) ttyDisplay->cols-1) { +#if 0 /*JP*/ (void) putchar(*str); +#else + (void) cputchar(*str); +#endif str++; ttyDisplay->curx++; } @@ -1831,7 +2067,11 @@ cw->cury++; tty_curs(window, cw->curx+1, cw->cury); } +#if 0 /*JP*/ (void) putchar(*str); +#else + (void) jputchar(*str); +#endif str++; ttyDisplay->curx++; } @@ -1890,6 +2130,9 @@ } break; } +#if 1 /*JP*/ + jputchar('\0'); /* RESET */ +#endif } void @@ -2329,24 +2572,54 @@ # if defined(ASCIIGRAPH) && !defined(NO_TERMS) if (iflags.IBMgraphics || iflags.eight_bit_tty) { +# ifdef PC9800 + { + if (!GFlag) { + graph_on(); + GFlag = TRUE; + } +# if 0 /*JP*/ + (void) putchar(ch); +# else + (void) cputchar(ch); +# endif + } +# else /* IBM-compatible displays don't need other stuff */ +# if 0 /*JP*/ (void) putchar(ch); +# else + (void) cputchar(ch); +# endif +#endif } else if (ch & 0x80) { if (!GFlag || HE_resets_AS) { graph_on(); GFlag = TRUE; } +# if 0 /*JP*/ (void) putchar((ch ^ 0x80)); /* Strip 8th bit */ +# else + (void) cputchar((ch ^ 0x80)); /* Strip 8th bit */ +# endif } else { if (GFlag) { graph_off(); GFlag = FALSE; } +# if 0 /*JP*/ (void) putchar(ch); +# else + (void) jputchar(ch); +# endif } #else +# if 0 /*JP*/ (void) putchar(ch); +# else + (void) jputchar(ch); +# endif #endif /* ASCIIGRAPH && !NO_TERMS */ @@ -2430,7 +2703,11 @@ #ifndef NO_TERMS if (ul_hack && ch == '_') { /* non-destructive underscore */ +# if 0 /*JP*/ (void) putchar((char) ' '); +# else + (void) cputchar((char) ' '); +# endif backsp(); } #endif @@ -2482,7 +2759,11 @@ #if defined(MICRO) || defined(WIN32CON) msmsg("%s\n", str); #else +# if 0 /*JP*/ puts(str); (void) fflush(stdout); +# else + jputs(str); (void) fflush(stdout); +# endif #endif } @@ -2495,13 +2776,19 @@ #if defined(MICRO) || defined(WIN32CON) msmsg("%s", str); #else +# if 0 /*JP*/ (void) fputs(str, stdout); +# else + (void) jputs(str); +# endif #endif term_end_raw_bold(); #if defined(MICRO) || defined(WIN32CON) msmsg("\n"); #else +# if 0 /*JP*/ puts(""); +# endif (void) fflush(stdout); #endif } diff -aurbN -xCVS -xXTAGS nethack/win/win32/dlb_main.dsp jnethack/win/win32/dlb_main.dsp --- nethack/win/win32/dlb_main.dsp 2003-12-08 08:40:26.000000000 +0900 +++ jnethack/win/win32/dlb_main.dsp 2003-12-10 00:54:10.000000000 +0900 @@ -59,20 +59,20 @@ chdir ..\dat \ chdir \ echo data >dlb.lst \ - echo oracles >>dlb.lst \ + echo joracles >>dlb.lst \ if exist options echo options >>dlb.lst \ if exist ttyoptions echo ttyoptions >>dlb.lst \ if exist guioptions echo guioptions >>dlb.lst \ if NOT exist porthelp copy ..\sys\winnt\porthelp porthelp \ if exist porthelp echo porthelp >>dlb.lst \ echo quest.dat >>dlb.lst \ - echo rumors >>dlb.lst \ - echo help >>dlb.lst \ - echo hh >>dlb.lst \ - echo cmdhelp >>dlb.lst \ - echo history >>dlb.lst \ - echo opthelp >>dlb.lst \ - echo wizhelp >>dlb.lst \ + echo jrumors >>dlb.lst \ + echo jhelp >>dlb.lst \ + echo jhh >>dlb.lst \ + echo jcmdhelp >>dlb.lst \ + echo jhistory >>dlb.lst \ + echo jopthelp >>dlb.lst \ + echo jwizhelp >>dlb.lst \ echo dungeon >>dlb.lst \ echo license >>dlb.lst \ for %%N in (*.lev) do echo %%N >>dlb.lst \ @@ -113,20 +113,20 @@ chdir ..\dat \ chdir \ echo data >dlb.lst \ - echo oracles >>dlb.lst \ + echo joracles >>dlb.lst \ if exist options echo options >>dlb.lst \ if exist ttyoptions echo ttyoptions >>dlb.lst \ if exist guioptions echo guioptions >>dlb.lst \ if NOT exist porthelp copy ..\sys\winnt\porthelp porthelp \ if exist porthelp echo porthelp >>dlb.lst \ echo quest.dat >>dlb.lst \ - echo rumors >>dlb.lst \ - echo help >>dlb.lst \ - echo hh >>dlb.lst \ - echo cmdhelp >>dlb.lst \ - echo history >>dlb.lst \ - echo opthelp >>dlb.lst \ - echo wizhelp >>dlb.lst \ + echo jrumors >>dlb.lst \ + echo jhelp >>dlb.lst \ + echo jhh >>dlb.lst \ + echo jcmdhelp >>dlb.lst \ + echo jhistory >>dlb.lst \ + echo jopthelp >>dlb.lst \ + echo jwizhelp >>dlb.lst \ echo dungeon >>dlb.lst \ echo license >>dlb.lst \ for %%N in (*.lev) do echo %%N >>dlb.lst \ diff -aurbN -xCVS -xXTAGS nethack/win/win32/makedefs.dsp jnethack/win/win32/makedefs.dsp --- nethack/win/win32/makedefs.dsp 2003-12-08 08:40:26.000000000 +0900 +++ jnethack/win/win32/makedefs.dsp 2003-12-10 00:54:10.000000000 +0900 @@ -60,6 +60,7 @@ echo makedefs.exe -p makedefs.exe -p \ echo makedefs.exe -m makedefs.exe -m \ echo makedefs.exe -z makedefs.exe -z \ +echo makedefs.exe -j makedefs.exe -j \ echo chdir ..\dat chdir ..\dat chdir \ echo Generating NetHack database echo ..\util\makedefs.exe -d ..\util\makedefs.exe -d \ echo Generating rumors echo ..\util\makedefs.exe -r ..\util\makedefs.exe -r \ @@ -102,6 +103,7 @@ echo makedefs.exe -p makedefs.exe -p \ echo makedefs.exe -m makedefs.exe -m \ echo makedefs.exe -z makedefs.exe -z \ +echo makedefs.exe -j makedefs.exe -j \ echo chdir ..\dat chdir ..\dat chdir \ echo Generating NetHack database echo ..\util\makedefs.exe -d ..\util\makedefs.exe -d \ echo Generating rumors echo ..\util\makedefs.exe -r ..\util\makedefs.exe -r \ diff -aurbN -xCVS -xXTAGS nethack/win/win32/mhmain.c jnethack/win/win32/mhmain.c --- nethack/win/win32/mhmain.c 2003-12-08 08:39:14.000000000 +0900 +++ jnethack/win/win32/mhmain.c 2004-07-09 02:53:16.000000000 +0900 @@ -480,7 +480,10 @@ } else { +/*JP switch (NHMessageBox(hWnd, TEXT("Save?"), MB_YESNOCANCEL | MB_ICONQUESTION)) { +*/ + switch (NHMessageBox(hWnd, TEXT("保存して終了しますか?"), MB_YESNOCANCEL | MB_ICONQUESTION)) { case IDYES: NHEVENT_KBD('y'); dosave(); break; case IDNO: NHEVENT_KBD('q'); done(QUIT); break; case IDCANCEL: break; diff -aurbN -xCVS -xXTAGS nethack/win/win32/mswproc.c jnethack/win/win32/mswproc.c --- nethack/win/win32/mswproc.c 2003-12-08 08:39:14.000000000 +0900 +++ jnethack/win/win32/mswproc.c 2003-12-25 20:15:19.000000000 +0900 @@ -2,6 +2,12 @@ /* NetHack may be freely redistributed. See license for details. */ /* +** Japanese version +** For 3.4, Copyright (c) Kentaro Shirakata, 2003 +** JNetHack may be freely redistributed. See license for details. +*/ + +/* * This file implements the interface between the window port specific * code in the mswin port and the rest of the nethack game engine. */ @@ -1775,16 +1781,32 @@ switch (killer_format) { default: impossible("bad killer format?"); case KILLED_BY_AN: +#if 0 /*JP*/ Strcpy(buf, killed_by_prefix[how]); Strcat(buf, an(killer)); +#else + Strcpy(buf, an(killer)); + Strcat(buf, killed_by_prefix[how]); +#endif break; case KILLED_BY: +#if 0 /*JP*/ Strcpy(buf, killed_by_prefix[how]); Strcat(buf, killer); +#else + Strcpy(buf, killer); + Strcat(buf, killed_by_prefix[how]); +#endif break; case NO_KILLER_PREFIX: Strcpy(buf, killer); break; +#if 1 /*JP*/ + case KILLED_SUFFIX: + Strcpy(buf, killer); + Strcat(buf, "に殺された"); + break; +#endif } /* Put death type on stone */ diff -aurbN -xCVS -xXTAGS nethack/win/win32/nethackw.dsp jnethack/win/win32/nethackw.dsp --- nethack/win/win32/nethackw.dsp 2003-12-08 08:40:26.000000000 +0900 +++ jnethack/win/win32/nethackw.dsp 2003-12-10 00:54:10.000000000 +0900 @@ -64,7 +64,7 @@ copy ..\dat\nhdat ..\binary \ copy ..\dat\license ..\binary \ if exist tiles.bmp copy tiles.bmp ..\binary \ -if exist ..\doc\Guidebook.txt copy ..\doc\Guidebook.txt ..\binary\Guidebook.txt \ +if exist ..\doc\jGuidebook.txt copy ..\doc\jGuidebook.txt ..\binary\jGuidebook.txt \ if exist ..\doc\nethack.txt copy ..\doc\nethack.txt ..\binary\NetHack.txt \ copy ..\sys\winnt\defaults.nh ..\binary\defaults.nh # End Special Build Tool @@ -104,7 +104,7 @@ copy ..\dat\nhdat ..\binary \ copy ..\dat\license ..\binary \ if exist tiles.bmp copy tiles.bmp ..\binary \ -if exist ..\doc\Guidebook.txt copy ..\doc\Guidebook.txt ..\binary\Guidebook.txt \ +if exist ..\doc\jGuidebook.txt copy ..\doc\jGuidebook.txt ..\binary\jGuidebook.txt \ if exist ..\doc\nethack.txt copy ..\doc\nethack.txt ..\binary\NetHack.txt \ copy ..\sys\winnt\defaults.nh ..\binary\defaults.nh # End Special Build Tool @@ -264,6 +264,18 @@ # End Source File # Begin Source File +SOURCE=..\japanese\jconj.c +# End Source File +# Begin Source File + +SOURCE=..\japanese\jlib.c +# End Source File +# Begin Source File + +SOURCE=..\japanese\jtrns.c +# End Source File +# Begin Source File + SOURCE=..\src\light.c # End Source File # Begin Source File diff -aurbN -xCVS -xXTAGS nethack/win/win32/winMS.h jnethack/win/win32/winMS.h --- nethack/win/win32/winMS.h 2003-12-08 08:39:14.000000000 +0900 +++ jnethack/win/win32/winMS.h 2003-12-10 00:54:10.000000000 +0900 @@ -29,7 +29,11 @@ #define TILE_BK_COLOR RGB(71, 108, 108) /* minimum/maximum font size (in points - 1/72 inch) */ +#if 0 /*JP*/ #define NHFONT_DEFAULT_SIZE 9 +#else +#define NHFONT_DEFAULT_SIZE 10 +#endif #define NHFONT_SIZE_MIN 3 #define NHFONT_SIZE_MAX 20 diff -aurbN -xCVS -xXTAGS nethack/win/win32/winhack.rc jnethack/win/win32/winhack.rc --- nethack/win/win32/winhack.rc 2003-12-08 08:39:14.000000000 +0900 +++ jnethack/win/win32/winhack.rc 2003-12-10 00:54:10.000000000 +0900 @@ -23,8 +23,8 @@ #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +#pragma code_page(932) #endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// @@ -41,6 +41,7 @@ // Menu // +#if 0 /*JP*/ IDC_NETHACKW MENU DISCARDABLE BEGIN POPUP "&File" @@ -85,7 +86,52 @@ MENUITEM "NetHack for &Windows help", IDM_HELP_PORTHELP END END - +#else +IDC_NETHACKW MENU DISCARDABLE +BEGIN + POPUP "ファイル(&F)" + BEGIN + MENUITEM "保存して終了(&S)", IDM_SAVE + MENUITEM SEPARATOR + MENUITEM "NetHackの終了(&Q)", IDM_EXIT + END + POPUP "表示(&M)" + BEGIN + MENUITEM "&0 - タイルを使用する", IDM_MAP_TILES + MENUITEM "&1 - ASCII (4x6)", IDM_MAP_ASCII4X6 + MENUITEM "&2 - ASCII (6x8)", IDM_MAP_ASCII6X8 + MENUITEM "&3 - ASCII (8x8)", IDM_MAP_ASCII8X8 + MENUITEM "&4 - ASCII (16x8)", IDM_MAP_ASCII16X8 + MENUITEM "&5 - ASCII (7x12)", IDM_MAP_ASCII7X12 + MENUITEM "&6 - ASCII (8x12)", IDM_MAP_ASCII8X12 + MENUITEM "&7 - ASCII (16x12)", IDM_MAP_ASCII16X12 + MENUITEM "&8 - ASCII (12x16)", IDM_MAP_ASCII12X16 + MENUITEM "&9 - ASCII (10x18)", IDM_MAP_ASCII10X18 + MENUITEM SEPARATOR + MENUITEM "ウインドウに合わせる(&F)", IDM_MAP_FIT_TO_SCREEN + END + POPUP "設定(&S)" + BEGIN + MENUITEM "NetHackモード(&N)", IDM_NHMODE + MENUITEM SEPARATOR + MENUITEM "すべての設定をクリア(&C)", IDM_CLEARSETTINGS + END + POPUP "ヘルプ(&H)" + BEGIN + MENUITEM "NetHackについて(&A)...", IDM_ABOUT + MENUITEM "ゲームおよびコマンドの解説(長文)(&L)", IDM_HELP_LONG + MENUITEM "コマンド一覧(&C)", IDM_HELP_COMMANDS + MENUITEM "NetHackの簡単な歴史(&H)", IDM_HELP_HISTORY + MENUITEM "画面に表示される文字の説明(&I)", IDM_HELP_INFO_CHAR + MENUITEM "このキーが何を意味するかの説明(&K)", IDM_HELP_INFO_KEY + MENUITEM "ゲームのオプション一覧(&O)", IDM_HELP_OPTIONS + MENUITEM "ゲームのオプション一覧(長文)(&U)", IDM_HELP_OPTIONS_LONG + MENUITEM "拡張コマンド一覧(&X)", IDM_HELP_EXTCMD + MENUITEM "NetHackのライセンス(&N)", IDM_HELP_LICENSE + MENUITEM "Windowsに特有のヘルプおよびコマンド(&W)", IDM_HELP_PORTHELP + END +END +#endif ///////////////////////////////////////////////////////////////////////////// // @@ -107,7 +153,11 @@ IDD_ABOUTBOX DIALOG DISCARDABLE 22, 17, 230, 75 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "About" +#if 0 /*JP*/ FONT 8, "System" +#else +FONT 10, "MS Pゴシック" +#endif BEGIN LTEXT "NetHack",IDC_ABOUT_VERSION,10,10,170,15,SS_NOPREFIX LTEXT "Copyright",IDC_ABOUT_COPYRIGHT,10,30,210,40 @@ -117,7 +167,11 @@ IDD_NHTEXT DIALOGEX 0, 0, 172, 178 STYLE DS_SETFOREGROUND | WS_CHILD | WS_THICKFRAME EXSTYLE WS_EX_STATICEDGE +#if 0 /*JP*/ FONT 8, "MS Sans Serif" +#else +FONT 10, "MS Pゴシック" +#endif BEGIN DEFPUSHBUTTON "OK",IDOK,54,163,50,14 EDITTEXT IDC_TEXT_CONTROL,0,0,170,160,ES_MULTILINE | @@ -127,7 +181,11 @@ IDD_MENU DIALOGEX 0, 0, 187, 153 STYLE WS_CHILD | WS_CLIPSIBLINGS | WS_THICKFRAME EXSTYLE WS_EX_CLIENTEDGE | WS_EX_CONTROLPARENT | WS_EX_STATICEDGE +#if 0 /*JP*/ FONT 8, "MS Sans Serif" +#else +FONT 10, "MS Pゴシック" +#endif BEGIN DEFPUSHBUTTON "OK",IDOK,7,132,50,14,BS_FLAT PUSHBUTTON "Cancel",IDCANCEL,130,132,50,14,BS_FLAT @@ -139,7 +197,11 @@ IDD_GETLIN DIALOG DISCARDABLE 0, 0, 131, 29 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Question?" +#if 0 /*JP*/ FONT 8, "MS Sans Serif" +#else +FONT 10, "MS Pゴシック" +#endif BEGIN DEFPUSHBUTTON "OK",IDOK,0,15,65,14 PUSHBUTTON "Cancel",IDCANCEL,65,15,65,14 @@ -148,8 +210,13 @@ IDD_EXTCMD DIALOG DISCARDABLE 0, 0, 137, 117 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +#if 0 /*JP*/ CAPTION "Extended Commands" FONT 8, "MS Sans Serif" +#else +CAPTION "拡張コマンド" +FONT 10, "MS Pゴシック" +#endif BEGIN DEFPUSHBUTTON "OK",IDOK,80,7,50,14 PUSHBUTTON "Cancel",IDCANCEL,80,24,50,14 @@ -160,30 +227,60 @@ IDD_PLAYER_SELECTOR DIALOG DISCARDABLE 0, 0, 152, 169 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "What are you?" +#if 0 /*JP*/ FONT 8, "MS Sans Serif" +#else +FONT 10, "MS Pゴシック" +#endif BEGIN +#if 0 /*JP*/ DEFPUSHBUTTON "Play",IDOK,7,148,66,14 PUSHBUTTON "Quit",IDCANCEL,79,148,66,14 LTEXT "Name:",IDC_STATIC,7,8,25,10 +#else + DEFPUSHBUTTON "OK",IDOK,7,148,66,14 + PUSHBUTTON "Quit",IDCANCEL,79,148,66,14 + LTEXT "名前:",IDC_STATIC,7,8,25,10 +#endif EDITTEXT IDC_PLSEL_NAME,40,7,105,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP +#if 0 /*JP*/ GROUPBOX "Role",IDC_STATIC,7,21,138,30 CONTROL "Random",IDC_PLSEL_ROLE_RANDOM,"Button",BS_AUTOCHECKBOX | +#else + GROUPBOX "職業",IDC_STATIC,7,21,138,30 + CONTROL "ランダム",IDC_PLSEL_ROLE_RANDOM,"Button",BS_AUTOCHECKBOX | +#endif WS_TABSTOP,14,34,40,10 COMBOBOX IDC_PLSEL_ROLE_LIST,63,33,75,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP +#if 0 /*JP*/ GROUPBOX "Race",IDC_STATIC,7,51,138,30 CONTROL "Random",IDC_PLSEL_RACE_RANDOM,"Button",BS_AUTOCHECKBOX | +#else + GROUPBOX "種族",IDC_STATIC,7,51,138,30 + CONTROL "ランダム",IDC_PLSEL_RACE_RANDOM,"Button",BS_AUTOCHECKBOX | +#endif WS_TABSTOP,14,63,40,10 COMBOBOX IDC_PLSEL_RACE_LIST,63,62,75,45,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP +#if 0 /*JP*/ GROUPBOX "Gender",IDC_STATIC,7,81,138,30 CONTROL "Random",IDC_PLSEL_GENDER_RANDOM,"Button", +#else + GROUPBOX "性別",IDC_STATIC,7,81,138,30 + CONTROL "ランダム",IDC_PLSEL_GENDER_RANDOM,"Button", +#endif BS_AUTOCHECKBOX | WS_TABSTOP,14,93,40,10 COMBOBOX IDC_PLSEL_GENDER_LIST,63,92,75,40,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP +#if 0 /*JP*/ GROUPBOX "Alignment",IDC_STATIC,7,111,138,30 CONTROL "Random",IDC_PLSEL_ALIGN_RANDOM,"Button",BS_AUTOCHECKBOX | +#else + GROUPBOX "属性",IDC_STATIC,7,111,138,30 + CONTROL "ランダム",IDC_PLSEL_ALIGN_RANDOM,"Button",BS_AUTOCHECKBOX | +#endif WS_TABSTOP,13,123,40,10 COMBOBOX IDC_PLSEL_ALIGN_LIST,63,122,75,45,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP @@ -192,7 +289,11 @@ IDD_NHRIP DIALOGEX 0, 0, 281, 209 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Here lies..." +#if 0 /*JP*/ FONT 8, "MS Sans Serif" +#else +FONT 10, "MS Pゴシック" +#endif BEGIN DEFPUSHBUTTON "OK",IDOK,82,188,50,14 END @@ -200,7 +301,11 @@ IDD_SPLASH DIALOG DISCARDABLE 0, 0, 281, 257 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Welcome to NetHack" +#if 0 /*JP*/ FONT 8, "MS Sans Serif" +#else +FONT 10, "MS Pゴシック" +#endif BEGIN DEFPUSHBUTTON "OK",IDOK,224,236,50,14 EDITTEXT IDC_EXTRAINFO,7,176,267,52,ES_MULTILINE | ES_READONLY | @@ -358,7 +463,11 @@ STRINGTABLE DISCARDABLE BEGIN +#if 0 /*JP*/ IDS_APP_TITLE "NetHack for Windows - Graphical Interface" +#else + IDS_APP_TITLE "JNetHack for Windows - Graphical Interface" +#endif IDC_NETHACKW "NETHACKW" IDS_APP_TITLE_SHORT "NetHack for Windows" END