diff -aurN jnethack-3.4.0-0.9/default.css jnethack-3.4.0-0.9-puthtml-b05/default.css
--- jnethack-3.4.0-0.9/default.css	Thu Jan 01 09:00:00 1970
+++ jnethack-3.4.0-0.9-puthtml-b05/default.css	Mon Dec 16 23:34:54 2002
@@ -0,0 +1,48 @@
+/*********************************/
+/**  CSS for NetHack HTML Dump  **/
+/*********************************/
+
+/* dump html body style */
+.nhBody {
+	color:white ;
+	background-color:#202020 ;
+}
+
+/* version display style */
+.nhVer {
+	color:#A8A854;
+	text-align:left;
+}
+
+/* screen dump style */
+.nhScreen {
+	background-color:black;
+}
+
+/* pet style on the screen dump */
+.nhPet {
+	background-color:#A8A8A8;
+}
+
+/* player style on the screen dump */
+.nhPlayer {
+	border-bottom:2px solid white;	/* 2px white underline */
+}
+
+/* NetHack color style */
+.nh0 { color:#A8A8A8; }  /* CLR_BLACK          */
+.nh1 { color:#A80000; }  /* CLR_RED            */
+.nh2 { color:#00A800; }  /* CLR_GREEN          */
+.nh3 { color:#A8A800; }  /* CLR_BROWN          */
+.nh4 { color:#5454FC; }  /* CLR_BLUE           */
+.nh5 { color:#A800A8; }  /* CLR_MAGENTA        */
+.nh6 { color:#00A8A8; }  /* CLR_CYAN           */
+.nh7 { color:#A8A8A8; }  /* CLR_GRAY           */
+.nh8 { color:#A8A8A8; }  /* NO_COLOR           */
+.nh9 { color:#FC5454; }  /* CLR_ORANGE         */
+.nh10 { color:#54FC54; } /* CLR_BRIGHT_GREEN   */
+.nh11 { color:#FCFC54; } /* CLR_YELLOW         */
+.nh12 { color:#0000FC; } /* CLR_BRIGHT_BLUE    */
+.nh13 { color:#FC00FC; } /* CLR_BRIGHT_MAGENTA */
+.nh14 { color:#00FCFC; } /* CLR_BRIGHT_CYAN    */
+.nh15 { color:#FCFCFC; } /* CLR_WHITE          */
diff -aurN jnethack-3.4.0-0.9/include/config.h jnethack-3.4.0-0.9-puthtml-b05/include/config.h
--- jnethack-3.4.0-0.9/include/config.h	Sat Dec 21 00:25:32 2002
+++ jnethack-3.4.0-0.9-puthtml-b05/include/config.h	Fri Dec 20 09:57:50 2002
@@ -395,6 +395,10 @@
 
 /*#define GOLDOBJ */	/* Gold is kept on obj chains - Helge Hafting */
 
+/*
+ * OUTPUT SCREEN & STATES DUMP of HTML
+ */
+#define PUTHTML
 /* End of Section 5 */
 
 #include "global.h"	/* Define everything else according to choices above */
diff -aurN jnethack-3.4.0-0.9/include/extern.h jnethack-3.4.0-0.9-puthtml-b05/include/extern.h
--- jnethack-3.4.0-0.9/include/extern.h	Sat Dec 21 00:25:32 2002
+++ jnethack-3.4.0-0.9-puthtml-b05/include/extern.h	Fri Dec 20 13:59:14 2002
@@ -130,6 +130,9 @@
 E int FDECL(describe_level, (char *));
 E const char *FDECL(rank_of, (int,SHORT_P,BOOLEAN_P));
 E void NDECL(bot);
+#ifdef PUTHTML
+E int FDECL(output_html_bot, (FILE *));
+#endif /*PUTHTML*/
 
 /* ### cmd.c ### */
 
@@ -176,6 +179,15 @@
 #ifdef WIZARD
 E void NDECL(sanity_check);
 #endif
+#ifdef PUTHTML
+E int NDECL(output_screen_html);
+E int NDECL(output_normal_dump_html);
+E int FDECL(output_final_dump_html_start, (int));
+E int FDECL(output_final_dump_html_mesg, (const char *));
+E int FDECL(output_final_dump_html_title, (const char *));
+E int FDECL(output_final_dump_html_end, (int));
+E void FDECL(set_dump_css, (char *));
+#endif /*PUTHTML*/
 
 /* ### dbridge.c ### */
 
@@ -282,6 +294,9 @@
 E int FDECL(zapdir_to_glyph, (int,int,int));
 E int FDECL(glyph_at, (XCHAR_P,XCHAR_P));
 E void NDECL(set_wall_state);
+#ifdef PUTHTML
+E int FDECL(output_html_screen, (FILE *));
+#endif /*PUTHTML*/
 
 /* ### do.c ### */
 
@@ -1358,6 +1373,10 @@
 E void FDECL(set_duplicate_opt_detection, (int));
 E void FDECL(set_wc_option_mod_status, (unsigned long, int));
 E void FDECL(set_option_mod_status, (char *, int));
+#ifdef PUTHTML
+E void NDECL(disablegraphics);
+E void NDECL(restoregraphics);
+#endif /*PUTHTML*/
 
 /* ### pager.c ### */
 
@@ -1844,6 +1863,9 @@
 E void NDECL(losespells);
 E int NDECL(dovspell);
 E void FDECL(initialspell, (struct obj *));
+#ifdef PUTHTML
+E int FDECL(output_dump_html_spells, (FILE *, int)) ;
+#endif /*PUTHTML*/
 
 /* ### steal.c ### */
 
@@ -2055,6 +2077,9 @@
 /* ### version.c ### */
 
 E char *FDECL(getversionstring, (char *));
+#ifdef PUTHTML
+E char *FDECL(getjversionstring, (char *));
+#endif
 E int NDECL(doversion);
 E int NDECL(doextversion);
 #ifdef MICRO
diff -aurN jnethack-3.4.0-0.9/include/flag.h jnethack-3.4.0-0.9-puthtml-b05/include/flag.h
--- jnethack-3.4.0-0.9/include/flag.h	Sat Dec 21 00:25:32 2002
+++ jnethack-3.4.0-0.9-puthtml-b05/include/flag.h	Fri Dec 20 09:57:12 2002
@@ -106,7 +106,11 @@
 	int	 pickup_burden;		/* maximum burden before prompt */
 	char	 inv_order[MAXOCLASSES];
 	char	 pickup_types[MAXOCLASSES];
+#ifdef PUTHTML
+#define NUM_DISCLOSURE_OPTIONS		6
+#else
 #define NUM_DISCLOSURE_OPTIONS		5
+#endif /*PUTHTML*/
 #define DISCLOSE_PROMPT_DEFAULT_YES	'y'
 #define DISCLOSE_PROMPT_DEFAULT_NO	'n'
 #define DISCLOSE_YES_WITHOUT_PROMPT	'+'
@@ -261,6 +265,9 @@
 	boolean wc_large_font;		/* draw in larger fonts (say, 12pt instead
 				   		of 9pt) */
 	boolean wc_eight_bit_input;	/* allow eight bit input               */
+#ifdef PUTHTML
+	boolean	 puthtml_dump_htmlname_is_auto; /* automatical setting filename for dump html */
+#endif
 };
 
 /*
diff -aurN jnethack-3.4.0-0.9/puthtml.readme jnethack-3.4.0-0.9-puthtml-b05/puthtml.readme
--- jnethack-3.4.0-0.9/puthtml.readme	Thu Jan 01 09:00:00 1970
+++ jnethack-3.4.0-0.9-puthtml-b05/puthtml.readme	Tue Feb 11 12:03:42 2003
@@ -0,0 +1,97 @@
+HTML出力機能追加パッチ(JNetHaack3.4.0-0.9用)
+version β0.5(2003/02/11登録)
+
+
+JNetHackに画面HTML出力、キャラDUMP HTML出力、ゲームオーバー時のDUMP HTML
+出力を追加するパッチです。
+
+使い方
+  ゲーム中に、"#html screen"と入力すると画面HTML出力を行います。
+  ゲーム中に、"#html status"と入力するとキャラDUMP HTML出力を行います。
+  ゲーム終了後、「DUMPを出力しますか？」という問いに'y'と入力するとキャラ
+  DUMP HTML出力を行います。
+
+  いずれの場合もファイル名の入力を求めるのでファイル名を入力してください。
+
+  discloseオプションに変更が入っています。このオプションでは従来'i', 'a', 
+  'v', 'g', 'c'を使用することができましたが、それに追加して'h'が使用できる
+  ようになっています。'h'の前に'y', 'n', '+', '-'を指定することにより最終
+  結果DUMPを制御できます。
+  例：
+     disclose:+i +a -v yg yc yh
+
+  dump_cssオプションにてCascading Style-Sheetファイルを指定することができ
+  ます。これを指定するとそのスタイルシートを外部ファイル指定するHTMLを
+  出力するようになります。デフォルトは指定なしで、その場合は内部スタイル
+  シートによるスタイル指定となります。
+  例：
+     dump_css:default.css
+
+  dump_autonameオプションを指定するとダンプなどを保存する際、ファイル名を
+  自動でつけて保存するようになります。基本的にsave時と同様なファイル名と
+  なります。保存名は次のようになります。
+    Windows系  [USER名]-[PLAYER名]???.html
+    UNIX系     [USERID]-[PLAYER名]???.html
+  ???は000〜999の値を順にとります。同じファイル名があった場合はこの部分を
+  変更して重ならないファイル名を探します。もし000〜999が全て埋まっていた
+  場合はファイル名の入力を求めます。
+  なお、DOSやAMIGAやVMSでは正常に動作するかわかりません。
+
+
+注意事項
+  このパッチはもともとRubissh JNetHack用に作成したものをJNetHack3.4.0用に
+  書きなおし、さらに3.4.0用に拡張、改造して、その差分を取ったものです。
+  一部、綾波使いさんが手直しされた部分が含まれています。
+  綾波使いさんありがとうございます。
+  このパッチは他のNetHack系ヴァリアントなど、別のプログラムに流用してもか
+  まいません。
+  まだコードをイロイロいじっている最中ですので、動かない場合があるかもし
+  れません。
+
+
+known bugs：
+  end.cにてかなり強引にメッセージ取得を行ったため、非常に汚いコードとなっ
+  ています。
+
+  死の直前のメッセージが、ttyモードのみしか表示されません。
+
+  Windows2000のコンソール版、Windows98SEでのコンソール版、タイル版でのみ
+  動作確認を行っております。
+  それ以外の、UNIX系等での動作確認はとっておりません。
+
+
+履歴
+  β0.5  2003/02/11
+    騎乗しているのに騎乗モンスターが画面に表示されていなかったバグを修正。
+    ダンプ出力に現在階のペット一覧を追加。
+
+  β0.4  2003/01/15
+    骨ファイル生成時に所持アイテム一覧が出力されていなかったバグを修正。
+    これに伴い、直前のメッセージ、最終メッセージの出力がDUMPの最後に
+    移動されました。
+    死因(墓に刻まれているメッセージ)が最終メッセージに出力されるように
+    しました。
+
+  2003/01/13
+     http://nethack-users.sourceforge.jp/ にて配布されるようになりました。
+
+  β0.3 2002/12/20
+    ステータスダンプ中に使用可能な魔法とその成功率の出力を追加しました。
+    「直前のメッセージ」にHTML出力の有無等を尋ねるメッセージが出ないよ
+    うにしました。
+
+  β0.2 2002/12/17
+    「直前のメッセージ」関係のバグフィックス。
+
+  β0.1 2002/12/15
+     出力ファイル名の自動設定機能を付加しました。
+    「直前のメッセージ」関係のバグフィックス。
+
+  α0.7 2002/12/10
+     ネットハックのバージョン情報を出力するようにしました。
+     スタイルシートの外部ファイル指定出力に対応。
+     細かいバグフィックス。
+
+mail-to:so-miya@mma.gr.jp
+URL:http://plaza8.mbn.or.jp/~so_miya/
+URL(Windows binary):http://nethack-users.sourceforge.jp/
diff -aurN jnethack-3.4.0-0.9/src/botl.c jnethack-3.4.0-0.9-puthtml-b05/src/botl.c
--- jnethack-3.4.0-0.9/src/botl.c	Sat Dec 21 00:25:34 2002
+++ jnethack-3.4.0-0.9-puthtml-b05/src/botl.c	Fri Dec 20 09:54:16 2002
@@ -33,8 +33,13 @@
 #endif
 };
 
+#ifdef PUTHTML
+STATIC_DCL void FDECL(bot1, (FILE *));
+STATIC_DCL void FDECL(bot2, (FILE *));
+#else /*PUTHTML*/
 STATIC_DCL void NDECL(bot1);
 STATIC_DCL void NDECL(bot2);
+#endif /*PUTHTML*/
 #endif /* OVL0 */
 
 /* MAXCO must hold longest uncompressed status line, and must be larger
@@ -180,8 +185,14 @@
 }
 #endif
 
+#ifdef PUTHTML
+STATIC_OVL void
+bot1(fp)
+FILE *fp ;
+#else /*PUTHTML*/
 STATIC_OVL void
 bot1()
+#endif /*PUTHTML*/
 {
 	char newbot1[MAXCO];
 	register char *nb;
@@ -262,6 +273,12 @@
 */
 	    Sprintf(nb = eos(nb), "%ld点", botl_score());
 #endif
+#ifdef PUTHTML
+	if ( fp ) {
+		fputs(newbot1, fp) ;
+		return ;
+	}
+#endif /*PUTHTML*/
 	curs(WIN_STATUS, 1, 0);
 	putstr(WIN_STATUS, 0, newbot1);
 }
@@ -301,8 +318,14 @@
 	return ret;
 }
 
+#ifdef PUTHTML
+STATIC_OVL void
+bot2(fp)
+FILE *fp ;
+#else /*PUTHTML*/
 STATIC_OVL void
 bot2()
+#endif /*PUTHTML*/
 {
 	char  newbot2[MAXCO];
 	register char *nb;
@@ -378,6 +401,12 @@
 
 	if(cap > UNENCUMBERED)
 		Sprintf(nb = eos(nb), " %s", enc_stat[cap]);
+#ifdef PUTHTML
+	if ( fp ) {
+		fputs(newbot2, fp) ;
+		return ;
+	}
+#endif /*PUTHTML*/
 	curs(WIN_STATUS, 1, 1);
 	putstr(WIN_STATUS, 0, newbot2);
 }
@@ -385,11 +414,28 @@
 void
 bot()
 {
+#ifdef PUTHTML
+	bot1((FILE *)0);
+	bot2((FILE *)0);
+#else /*PUTHTML*/
 	bot1();
 	bot2();
+#endif /*PUTHTML*/
 
 	flags.botl = flags.botlx = 0;
 }
+
+#ifdef PUTHTML
+int
+output_html_bot(FILE *fp)
+{
+	bot1(fp);
+	if ( fputs("\n", fp) < 0 ) return 1;
+
+	bot2(fp);
+	return 0;
+}
+#endif /*PUTHTML*/
 
 #endif /* OVL0 */
 
diff -aurN jnethack-3.4.0-0.9/src/cmd.c jnethack-3.4.0-0.9-puthtml-b05/src/cmd.c
--- jnethack-3.4.0-0.9/src/cmd.c	Sat Dec 21 00:25:34 2002
+++ jnethack-3.4.0-0.9-puthtml-b05/src/cmd.c	Tue Feb 11 13:07:56 2003
@@ -14,6 +14,13 @@
 #include "func_tab.h"
 /* #define DEBUG */	/* uncomment for debugging */
 
+#if defined(PUTHTML) && defined(UNIX)
+#include <pwd.h>
+#endif /*PUTHTML&&UNIX*/
+#if defined(PUTHTML) && defined(TTY_GRAPHICS)
+#include "wintty.h"
+#endif /*PUTHTML&&TTY_GRAPHICS*/
+
 /*
  * Some systems may have getchar() return EOF for various reasons, and
  * we should not quit before seeing at least NR_OF_EOFS consecutive EOFs.
@@ -813,6 +820,9 @@
 	*have_been  = "have been ",
 	*have_never = "have never ", *never = "never ";
 #endif
+#ifdef PUTHTML
+	static FILE *html_fp = (FILE *)0 ;
+#endif
 
 #if 0 /*JP*/
 #define enl_msg(prefix,present,past,suffix) \
@@ -838,6 +848,16 @@
 {
 	char buf[BUFSZ];
 
+#ifdef PUTHTML
+	if ( html_fp ) {
+#if 0 /*JP*/
+		fprintf(html_fp, "<DD>%s%s%s.</DD>", start, middle, end) ;
+#else
+		fprintf(html_fp, "<DD>%s%s%s．</DD>", start, middle, end) ;
+#endif
+		return ;
+	}
+#endif /*PUTHTML*/
 #if 0 /*JP*/
 	Sprintf(buf, "%s%s%s.", start, middle, end);
 #else
@@ -853,12 +873,20 @@
 	int ltmp;
 	char buf[BUFSZ];
 
+#ifdef PUTHTML
+	if ( html_fp ) {
+		en_win = 0 ;
+	} else {
+#endif /*PUTHTML*/
 	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 PUTHTML
+	}
+#endif /*PUTHTML*/
 
 #ifdef ELBERETH
 	if (u.uevent.uhand_of_elbereth) {
@@ -1395,11 +1423,23 @@
 	if (p) enl_msg(You_, "死んでいる", p, buf);
     }
 
+#ifdef PUTHTML
+	if ( html_fp ) return ;
+#endif
 	display_nhwindow(en_win, TRUE);
 	destroy_nhwindow(en_win);
 	return;
 }
 
+#ifndef PUTHTML
+#define add_menu_view_normal(str)	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, (str), FALSE)
+#define add_menu_view_bold(str)		add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_BOLD, (str), FALSE)
+#else
+#define add_menu_view_normal(str)	if ( html_fp ) { fprintf(html_fp, "<DD>%s</DD>\n", (str)) ; \
+					} else { add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, (str), FALSE) ; }
+#define add_menu_view_bold(str)		if ( html_fp ) { fprintf(html_fp, "<DT>%s</DT>\n", (str)) ; \
+					} else { add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_BOLD, (str), FALSE) ; }
+#endif /*PUTHTML*/
 /*
  * Courtesy function for non-debug, non-explorer mode players
  * to help refresh them about who/what they are.
@@ -1416,12 +1456,20 @@
 
 	any.a_void = 0;
 	buf[0] = buf2[0] = '\0';
+#ifdef PUTHTML
+	if ( html_fp )
+		fputs("<DL>\n", html_fp) ;
+	else {
+#endif /*PUTHTML*/
 	tmpwin = create_nhwindow(NHW_MENU);
 	start_menu(tmpwin);
+#ifdef PUTHTML
+	}
+#endif /*PUTHTML*/
 #if 0 /*JP*/
-	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_BOLD, "Starting", FALSE);
+	add_menu_view_bold("Starting");
 #else
-	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_BOLD, "開始", FALSE);
+	add_menu_view_bold("開始");
 #endif
 
 	/* Starting name, race, role, gender */
@@ -1430,13 +1478,13 @@
 #else
 	Sprintf(buf, fmtstr, "名前", plname);
 #endif
-	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE);
+	add_menu_view_normal(buf);
 #if 0 /*JP*/
 	Sprintf(buf, fmtstr, "race", urace.noun);
 #else
 	Sprintf(buf, fmtstr, "種族", urace.noun);
 #endif
-	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE);
+	add_menu_view_normal(buf);
 #if 0 /*JP*/
 	Sprintf(buf, fmtstr, "role",
 		(flags.initgend && urole.name.f) ? urole.name.f : urole.name.m);
@@ -1444,13 +1492,13 @@
 	Sprintf(buf, fmtstr, "職業",
 		(flags.initgend && urole.name.f) ? urole.name.f : urole.name.m);
 #endif
-	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE);
+	add_menu_view_normal(buf);
 #if 0 /*JP*/
 	Sprintf(buf, fmtstr, "gender", genders[flags.initgend].adj);
 #else
 	Sprintf(buf, fmtstr, "性別", genders[flags.initgend].adj);
 #endif
-	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE);
+	add_menu_view_normal(buf);
 
 	/* Starting alignment */
 #if 0 /*JP*/
@@ -1458,18 +1506,21 @@
 #else
 	Sprintf(buf, fmtstr, "属性", align_str(u.ualignbase[A_ORIGINAL]));
 #endif
-	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE);
+	add_menu_view_normal(buf);
 
 	/* Current name, race, role, gender */
-	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", FALSE);
+#ifdef PUTHTML
+	if ( !html_fp )
+#endif /*PUTHTML*/
+	add_menu_view_normal("");
 #if 0 /*JP*/
-	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_BOLD, "Current", FALSE);
+	add_menu_view_bold("Current");
 	Sprintf(buf, fmtstr, "race", Upolyd ? youmonst.data->mname : urace.noun);
 #else
-	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_BOLD, "現在", FALSE);
+	add_menu_view_bold("現在");
 	Sprintf(buf, fmtstr, "種族", Upolyd ? youmonst.data->mname : urace.noun);
 #endif
-	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE);
+	add_menu_view_normal(buf);
 	if (Upolyd) {
 #if 0 /*JP*/
 	    Sprintf(buf, fmtstr, "role (base)",
@@ -1478,7 +1529,7 @@
 	    Sprintf(buf, fmtstr, "職業(基本)",
 		(u.mfemale && urole.name.f) ? urole.name.f : urole.name.m);
 #endif
-	    add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE);
+	    add_menu_view_normal(buf);
 	} else {
 #if 0 /*JP*/
 	    Sprintf(buf, fmtstr, "role",
@@ -1487,14 +1538,14 @@
 	    Sprintf(buf, fmtstr, "職業",
 		(flags.female && urole.name.f) ? urole.name.f : urole.name.m);
 #endif
-	    add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE);
+	    add_menu_view_normal(buf);
 	}
 #if 0 /*JP*/
 	Sprintf(buf, fmtstr, "gender", genders[poly_gender()].adj);
 #else
 	Sprintf(buf, fmtstr, "性別", genders[poly_gender()].adj);
 #endif
-	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE);
+	add_menu_view_normal(buf);
 
 	if (Upolyd) {
 #if 0 /*JP*/
@@ -1502,7 +1553,7 @@
 #else
 	    Sprintf(buf, fmtstr, "性別(基本)", genders[u.mfemale].adj);
 #endif
-	    add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE);
+	    add_menu_view_normal(buf);
 	}
 
 	/* Current alignment */
@@ -1511,14 +1562,17 @@
 #else
 	Sprintf(buf, fmtstr, "属性", align_str(u.ualign.type));
 #endif
-	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE);
+	add_menu_view_normal(buf);
 
 	/* Deity list */
-	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", FALSE);
+#ifdef PUTHTML
+	if ( !html_fp )
+#endif /*PUTHTML*/
+	add_menu_view_bold("");
 #if 0 /*JP*/
-	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_BOLD, "Deities", FALSE);
+	add_menu_view_bold("Deities");
 #else
-	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_BOLD, "神", FALSE);
+	add_menu_view_bold("神");
 #endif
 	Sprintf(buf2, deity_fmtstr, align_gname(A_CHAOTIC),
 	    (u.ualignbase[A_ORIGINAL] == u.ualign.type
@@ -1530,7 +1584,7 @@
 #else
     	Sprintf(buf, fmtstr, "混沌の神", buf2);
 #endif
-	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE);
+	add_menu_view_normal(buf);
 
 	Sprintf(buf2, deity_fmtstr, align_gname(A_NEUTRAL),
 	    (u.ualignbase[A_ORIGINAL] == u.ualign.type
@@ -1542,7 +1596,7 @@
 #else
     	Sprintf(buf, fmtstr, "中立の神", buf2);
 #endif
-	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE);
+	add_menu_view_normal(buf);
 
 	Sprintf(buf2, deity_fmtstr, align_gname(A_LAWFUL),
 	    (u.ualignbase[A_ORIGINAL] == u.ualign.type && u.ualign.type == A_LAWFUL)  ? " (s,c)" :
@@ -1553,8 +1607,14 @@
 #else
     	Sprintf(buf, fmtstr, "秩序の神", buf2);
 #endif
-	add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE);
+	add_menu_view_normal(buf);
 
+#ifdef PUTHTML
+	if ( html_fp ) {
+		fprintf(html_fp, "</DL>\n") ;
+		return ;
+	}
+#endif /*PUTHTML*/
 #if 0 /*JP*/
 	end_menu(tmpwin, "Base Attributes");
 #else
@@ -1564,6 +1624,9 @@
 	destroy_nhwindow(tmpwin);
 }
 
+#undef add_menu_view_normal
+#undef add_menu_view_bold
+
 STATIC_PTR int
 doattributes()
 {
@@ -1590,6 +1653,9 @@
 	char buf[BUFSZ];
 	int ngenocided;
 
+#ifdef PUTHTML
+	if ( !html_fp ) {
+#endif /*PUTHTML*/
 	/* Create the conduct window */
 	en_win = create_nhwindow(NHW_MENU);
 /*JP
@@ -1597,6 +1663,9 @@
 */
 	putstr(en_win, 0, "自発的挑戦:");
 	putstr(en_win, 0, "");
+#ifdef PUTHTML
+	}
+#endif /*PUTHTML*/
 
 	if (!u.uconduct.food)
 /*JP
@@ -1748,6 +1817,9 @@
 #endif
 	}
 
+#ifdef PUTHTML
+	if ( html_fp ) return ;
+#endif /*PUTHTML*/
 	/* Pop up the window and wait for a key */
 	display_nhwindow(en_win, TRUE);
 	destroy_nhwindow(en_win);
@@ -1904,6 +1976,10 @@
 	{"enhance", "advance or check weapons skills", enhance_weapon_skill,
 							TRUE},
 	{"force", "force a lock", doforce, FALSE},
+#ifdef PUTHTML
+	{"html screen", "dump screen to HTML", output_screen_html, TRUE},
+	{"html status", "dump status to HTML", output_normal_dump_html, TRUE},
+#endif /*PUTHTML*/
 	{"invoke", "invoke an object's powers", doinvoke, TRUE},
 	{"jump", "jump to a location", dojump, FALSE},
 	{"loot", "loot a box on the floor", doloot, FALSE},
@@ -1931,6 +2007,10 @@
 	{"dip", "何かに物を浸す", dodip, FALSE},
 	{"enhance", "武器熟練度を高める", enhance_weapon_skill, TRUE},
 	{"force", "鍵をこじあける", doforce, FALSE},
+#ifdef PUTHTML
+	{"html screen", "画面を HTML ファイルにダンプする", output_screen_html, TRUE},
+	{"html status", "状況を HTML ファイルにダンプする", output_normal_dump_html, TRUE},
+#endif /*PUTHTML*/
 	{"invoke", "物の特別な力を使う", doinvoke, TRUE},
 	{"jump", "他の位置に飛びうつる", dojump, FALSE},
 	{"loot", "床の上の箱を開ける", doloot, TRUE},
@@ -2787,6 +2867,699 @@
 	readchar_queue = cmd;
 	return 0;
 }
+
+#ifdef PUTHTML
+extern const char *killed_by_prefix[];
+static int output_final_dump_html_puts(const char *) ;
+static int output_dump_html_status(int) ;
+static void set_htmlfile_name(const char *) ;
+static void set_auto_htmlfile_name() ;
+static int output_html_header(FILE *) ;
+static int output_html_footer(FILE *) ;
+static int output_html_objectlist(FILE *, struct obj *, boolean) ;
+static int output_html_container(FILE *,  struct obj *, boolean, boolean) ;
+static int output_html_pets(FILE *) ;
+static char htmlname_buf[BUFSZ] ;
+static char htmlbuf[6000] ;
+static char *html_css_name = (char*)0 ;
+static int html_counter = 0 ;
+
+int
+output_screen_html()
+{
+	FILE *fp = 0;
+	int  ret = 0;
+#ifdef UNIX
+	int  status;
+#endif /* UNIX */
+
+#if 0 /*JP*/
+	set_htmlfile_name("Please input HTML file name for screen dump:") ;
+#else
+	set_htmlfile_name("HTMLで画面を保存します．ファイル名を入力してください:") ;
+#endif
+	if ( !*htmlname_buf ) return 0;
+
+#ifdef UNIX
+
+	if (fork()) {
+
+		wait(&status);
+		ret = WEXITSTATUS(status);
+
+	} else {
+		struct passwd *pwd;
+
+		seteuid(getuid());
+		setegid(getgid());
+
+		pwd = getpwuid(getuid());
+		if (pwd && pwd->pw_dir) chdir(pwd->pw_dir);
+
+#endif /* UNIX */
+
+	fp = fopen(htmlname_buf, "w") ;
+
+	if (fp) {
+
+		disablegraphics();
+
+		if (!ret) ret = output_html_header(fp);
+		if (!ret) ret = output_html_screen(fp);
+		if (!ret) ret = output_html_footer(fp);
+
+		restoregraphics();
+
+	} else {
+
+		ret = 1;
+
+	}
+
+#ifdef UNIX
+
+		exit(ret);
+
+	} /* if (fork()) */
+
+	if (!ret) docrt();
+
+#endif /* UNIX */
+
+	if (fp) fclose(fp);
+
+	if (ret)
+		pline("画面の HTML ファイルへの保存に失敗した．");
+	else
+		pline("HTML ファイルを保存しました．");
+
+	return ret;
+}
+
+
+
+int
+output_normal_dump_html()
+{
+	FILE *fp = 0;
+	int  ret = 0;
+#ifdef UNIX
+	int  status;
+#endif /* UNIX */
+#if 0 /*JP*/
+	set_htmlfile_name("Please input HTML file name for status dump:") ;
+#else
+	set_htmlfile_name("HTMLで状況を保存します．ファイル名を入力してください:") ;
+#endif
+	if ( !*htmlname_buf ) return 0;
+
+#ifdef UNIX
+	if (fork()) {
+		wait(&status);
+		ret = WEXITSTATUS(status);
+	} else {
+		struct passwd *pwd;
+
+		seteuid(getuid());
+		setegid(getgid());
+		pwd = getpwuid(getuid());
+		if (pwd && pwd->pw_dir) chdir(pwd->pw_dir);
+#endif /* UNIX */
+
+	html_fp = fopen(htmlname_buf, "w") ;
+	if ( !html_fp ) return 1;
+
+	if (!ret) ret = output_html_header(html_fp) ;
+
+	if (!ret) {
+		ret = fputs("<DL><DT>画面：</DT>\n<DD>\n", html_fp) ;
+		if ( ret >= 0 ) ret = 0 ;
+	}
+	disablegraphics();
+	if (!ret) ret = output_html_screen(html_fp) ;
+	restoregraphics();
+	if (!ret) {
+		ret = fputs("<BR><BR></DD>\n", html_fp) ;
+		if ( ret >= 0 ) ret = 0 ;
+	}
+
+	if (!ret) ret = output_dump_html_status(0);
+
+	if (!ret) ret = fputs("</DL>", html_fp) ;
+	if (!ret) ret = output_html_footer(html_fp) ;
+
+#ifdef UNIX
+		exit(ret);
+	} /* if (fork()) */
+	if (!ret) docrt();
+#endif /* UNIX */
+
+	if ( html_fp ) fclose(html_fp) ;
+	html_fp = (FILE *)0 ;
+
+	if ( ret )
+		pline("HTML ファイルへの保存に失敗した．") ;
+	else
+		pline("HTML ファイルを保存しました．");
+
+	return ret;
+}
+
+
+
+int
+output_final_dump_html_start(how)
+int how;
+{
+	FILE *fp = 0;
+	int  ret = 0;
+	int final = (how >= PANICKED ? 1 : 2) ;
+#ifdef UNIX
+	int  status;
+#endif /* UNIX */
+
+	*htmlbuf = '\0' ;
+#ifdef TTY_GRAPHICS
+	/* 直前のメッセージをhtmlbufに格納・・・
+	 * set_htmlfile_nameの出力結果をメッセージに含めないため！
+	 */
+	{
+		int i ;
+		struct WinDesc *cw = wins[WIN_MESSAGE];
+		i = cw->maxcol ;
+		do {
+			if ( cw->data[i] && strlen(htmlbuf) + strlen(cw->data[i]) + 10 > sizeof(htmlbuf) ) break ;
+			if ( cw->data[i] && strcmp(cw->data[i], "") ) {
+				strcat(htmlbuf, "<DD>") ;
+				strcat(htmlbuf, cw->data[i]) ;
+				strcat(htmlbuf, "</DD>\n") ;
+			}
+			i = (i + 1) % cw->rows;
+		} while ( i != cw->maxcol) ;
+	}
+#endif /*TTY_GRAPHICS*/
+
+	*htmlname_buf = '\0' ;
+#if 0 /*JP*/
+	set_htmlfile_name("Please input HTML file name for result dump:") ;
+#else
+	set_htmlfile_name("HTMLで結果を保存します．ファイル名を入力してください:") ;
+#endif
+	if ( !*htmlname_buf ) return 0;
+
+#ifdef UNIX
+	if (fork()) {
+		wait(&status);
+		ret = WEXITSTATUS(status);
+	} else {
+		struct passwd *pwd;
+
+		seteuid(getuid());
+		setegid(getgid());
+		pwd = getpwuid(getuid());
+		if (pwd && pwd->pw_dir) chdir(pwd->pw_dir);
+#endif /* UNIX */
+
+	html_fp = fopen(htmlname_buf, "w") ;
+	if ( !html_fp ) return 1;
+
+	ret = output_html_header(html_fp) ;
+
+	if (!ret) {
+		ret = fputs("<DL><DT>画面：</DT>\n<DD>\n", html_fp) ;
+		if ( ret >= 0 ) ret = 0 ;
+	}
+	disablegraphics();
+	display_self() ;
+	if (!ret) ret = output_html_screen(html_fp) ;
+	restoregraphics();
+	if (!ret) {
+		ret = fputs("<BR><BR></DD>\n", html_fp) ;
+		if ( ret >= 0 ) ret = 0 ;
+	}
+
+	if (!ret) ret = output_dump_html_status(final);
+
+	if ( htmlbuf && *htmlbuf ) {
+		if (!ret) ret = fputs("<DT>直前のメッセージ：</DT>\n", html_fp) ;
+		if (ret>=0) ret = fputs(htmlbuf, html_fp) ;
+		if (ret>=0) ret = fputs("<DD><BR><BR></DD>\n", html_fp) ;
+		if (ret>=0) ret = 0 ;
+	}
+
+#ifdef UNIX
+		exit(ret);
+	} /* if (fork()) */
+	if (!ret) docrt();
+#endif /* UNIX */
+
+	if ( ret )
+		pline("HTML ファイルへの保存に失敗した．") ;
+
+	if ( html_fp ) fclose(html_fp) ;
+	html_fp = (FILE *)0 ;
+	*htmlbuf = '\0' ;
+
+	/* 死因 */
+	output_final_dump_html_puts("<DD><B>") ;
+	output_final_dump_html_puts(plname) ;
+#if 0 /*JP*/
+	output_final_dump_html_puts(", ") ;
+	if ( killer_format==KILLED_BY_AN || killer_format== KILLED_BY )
+		output_final_dump_html_puts(killed_by_prefix[how]);
+#else
+	output_final_dump_html_puts("は") ;
+#endif
+	if ( killer_format==KILLED_BY_AN )
+		output_final_dump_html_puts(an(killer));
+	else if ( killer_format==NO_KILLER_PREFIX || killer_format== KILLED_BY )
+		output_final_dump_html_puts(killer);
+#if 1 /*JP*/
+	if ( killer_format==KILLED_BY_AN || killer_format== KILLED_BY )
+		output_final_dump_html_puts(killed_by_prefix[how]);
+	output_final_dump_html_puts("．</B><BR><BR></DD>\n") ;
+#else
+	output_final_dump_html_puts(".</B><BR><BR></DD>\n") ;
+#endif
+
+	return ret ;
+}
+
+int
+output_final_dump_html_title(title)
+const char *title;
+{
+	if ( !output_final_dump_html_puts("<DD><BR><BR></DD>\n<DT>") )
+	    if ( !output_final_dump_html_puts(title) )
+		return output_final_dump_html_puts("</DT>\n") ;
+	return 1 ;
+}
+
+int
+output_final_dump_html_mesg(mesg)
+const char *mesg;
+{
+	if ( !output_final_dump_html_puts("<DD>") )
+	    if ( !output_final_dump_html_puts(mesg) )
+		return output_final_dump_html_puts("</DD>\n") ;
+	return 1 ;
+}
+
+int
+output_final_dump_html_puts(str)
+const char *str ;
+{
+	int ret = 0 ;
+
+	if ( *htmlname_buf && htmlbuf ) {
+		int slen = strlen(str) ;
+		if ( strlen(htmlbuf) + slen > sizeof(htmlbuf) ) {
+			/* ゲームオーバーメッセージのオーバーフローエラー
+			 * びっしり3画面分(80×25×3=6000byte)以上
+			 * のデータがないと起きないはず。
+			 */
+			ret = -1 ;
+		} else
+			strcat(htmlbuf, str) ;
+	}
+
+	return ret ;
+}
+
+int
+output_final_dump_html_end(how)
+int how;
+{
+	int ret = 0;
+	int final = (how >= PANICKED ? 1 : 2) ;
+#ifdef UNIX
+	int  status;
+#endif /* UNIX */
+
+	html_fp = (FILE*)0 ;
+	if ( !*htmlname_buf ) return 0 ;
+
+#ifdef UNIX
+	if (fork()) {
+		wait(&status);
+		ret = WEXITSTATUS(status);
+	} else {
+		struct passwd *pwd;
+
+		seteuid(getuid());
+		setegid(getgid());
+		pwd = getpwuid(getuid());
+		if (pwd && pwd->pw_dir) chdir(pwd->pw_dir);
+#endif /* UNIX */
+
+	html_fp = fopen(htmlname_buf, "a") ;
+	if ( !html_fp ) return 1;
+
+	if ( *htmlbuf ) {
+		ret = fputs("<DT>最終メッセージ</DT>\n", html_fp) ;
+		if ( ret>=0 ) ret = fputs(htmlbuf, html_fp) ;
+		if ( ret>=0 ) ret = fputs("<DD><BR><BR></DD>\n", html_fp) ;
+	}
+
+	/* 饒舌すぎるかもしれない
+	fputs("<BR><BR></DD>\n<DT>倒したモンスター：</DT>\n<DD>", fp) ;
+	list_vanquished();
+	*/
+	/* 饒舌すぎるかもしれない
+	fputs("<BR><BR></DD>\n<DT>虐殺した種別：</DT>\n<DD>", fp) ;
+	list_genocided();
+	*/
+
+	if (!ret) ret = fputs("</DL>", html_fp) ;
+	if (ret>=0) ret = output_html_footer(html_fp) ;
+
+#ifdef UNIX
+		exit(ret);
+	} /* if (fork()) */
+#endif /* UNIX */
+
+	if ( html_fp ) fclose(html_fp) ;
+	html_fp = (FILE *)0 ;
+	*htmlname_buf = '\0' ;
+
+	if ( ret ) pline("HTML ファイルへの保存に失敗した．") ;
+	return ret ;
+}
+
+
+
+void
+set_dump_css(op)
+char *op;
+{
+	static char buf[40] ;
+
+	if ( op && *op && strlen(op) < 40 ) {
+		strcpy(buf, op) ;
+		html_css_name = buf ;
+	} else {
+		html_css_name = (char *)0 ;
+	}
+}
+
+
+
+void
+set_htmlfile_name(mesg)
+const char *mesg;
+{
+	if ( iflags.puthtml_dump_htmlname_is_auto ) {
+		int i = 0 ;
+		FILE *fp ;
+		do {
+			set_auto_htmlfile_name() ;
+			fp = fopen(htmlname_buf, "r") ;
+			if ( !fp ) break ;
+			fclose(fp) ;
+		} while( ++i < 1000 ) ;
+		if ( !fp ) return ;
+		pline("ファイル名の自動設定に失敗しました．") ;
+	}
+
+	getlin(mesg, htmlname_buf);
+	if( htmlname_buf[0] == '\033' ) htmlname_buf[0] = 0;
+}
+
+
+void
+set_auto_htmlfile_name()
+{
+	htmlname_buf[0] = '\0' ;
+#ifdef VMS
+	Sprintf(htmlname_buf, "[.html]%d%s%03d", getuid(), plnamem, html_counter);
+	regularize(htmlname_buf+7);
+	Strcat(htmlname_buf, ";1");
+#else
+# if defined(MICRO) && !defined(WIN32)
+	Strcpy(htmlname_buf, SAVEP);
+#  ifdef AMIGA
+	strncat(htmlname_buf, bbs_id, PATHLEN);
+#  endif
+	{
+		int i = strlen(SAVEP);
+		char buf[4] ;
+		Sprintf(buf, "%03d", html_counter) ;
+#  ifdef AMIGA
+		(void)strncat(htmlname_buf, plname, FILENAME - i - 7);
+#  else
+		(void)strncat(htmlname_buf, plname, 5);
+#  endif
+		(void)strcat(htmlname_buf, buf);
+		regularize(htmlname_buf+i);
+	}
+	Strcat(htmlname_buf, ".htm");
+# else
+#  if defined(WIN32)
+	Sprintf(htmlname_buf, "%s-%s%03d.html",get_username(0), plname, html_counter);
+#  else
+	Sprintf(htmlname_buf, "%d-%s%03d.html", (int)getuid(), plname, html_counter);
+	regularize(htmlname_buf);	/* avoid . or / in name */
+#  endif /* WIN32 */
+# endif	/* MICRO */
+#endif /* VMS   */
+	html_counter = (html_counter + 1) % 1000 ;
+}
+
+
+
+int
+output_html_header(fp)
+FILE *fp;
+{
+	int ret = 0 ;
+	char buf[BUFSZ];
+
+	if (!fp) return 1;
+
+	ret = fputs("<HTML>\n<HEAD>\n", fp) ;
+	if ( html_css_name ) {
+		if ( ret>=0)
+			ret = fprintf(fp, "<link rel=\"stylesheet\" type=\"text/css\" href=\"%s\">\n", html_css_name) ;
+	} else {
+		if ( ret>=0) ret = fputs("<STYLE>\n"
+			"<!--\n"
+			"	.nhBody { background-color:#202020;color:white; }\n"
+			"	.nhScreen { background-color:black; }\n"
+			"	.nhPet { background-color:#A8A8A8; }\n"
+			"	.nhPlayer { border-bottom:2px solid white; }\n"
+			"	.nhVer { color:#A8A854;text-align:left; }\n"
+			"	.nh0 { color:#A8A8A8; }\n"  /* CLR_BLACK          */
+			"	.nh1 { color:#A80000; }\n"  /* CLR_RED            */
+			"	.nh2 { color:#00A800; }\n"  /* CLR_GREEN          */
+			"	.nh3 { color:#A8A800; }\n"  /* CLR_BROWN          */
+			"	.nh4 { color:#5454FC; }\n"  /* CLR_BLUE           */
+			"	.nh5 { color:#A800A8; }\n"  /* CLR_MAGENTA        */
+			"	.nh6 { color:#00A8A8; }\n"  /* CLR_CYAN           */
+			"	.nh7 { color:#A8A8A8; }\n"  /* CLR_GRAY           */
+			"	.nh8 { color:#A8A8A8; }\n"  /* NO_COLOR           */
+			"	.nh9 { color:#FC5454; }\n"  /* CLR_ORANGE         */
+			"	.nh10 { color:#54FC54; }\n" /* CLR_BRIGHT_GREEN   */
+			"	.nh11 { color:#FCFC54; }\n" /* CLR_YELLOW         */
+			"	.nh12 { color:#0000FC; }\n" /* CLR_BRIGHT_BLUE    */
+			"	.nh13 { color:#FC00FC; }\n" /* CLR_BRIGHT_MAGENTA */
+			"	.nh14 { color:#00FCFC; }\n" /* CLR_BRIGHT_CYAN    */
+			"	.nh15 { color:#FCFCFC; }\n" /* CLR_WHITE          */
+			"-->\n"
+			"</STYLE>\n", fp) ;
+	}
+	if ( ret>=0) ret = fputs("</HEAD>\n<BODY class=\"nhBody\">\n", fp) ;
+
+
+	if ( ret>=0 ) ret = fprintf(fp, "<DIV class=\"nhVer\">[%s]</DIV>\n", getversionstring(buf)) ;
+	if ( ret>=0 ) ret = fprintf(fp, "<DIV class=\"nhVer\">[%s]</DIV>\n", getjversionstring(buf)) ;
+
+	return (ret<0)?1:0;
+}
+
+
+
+int
+output_html_footer(fp)
+FILE *fp;
+{
+	int ret = 0 ;
+
+	if (!fp) return 1;
+
+	ret = fputs("</BODY>\n</HTML>\n", fp) ;
+
+	return (ret<0)?1:0;
+}
+
+
+
+int
+output_dump_html_status(final)
+int final;
+{
+	int ret = 0 ;
+
+	if (!html_fp) return 1;
+
+	ret = fputs("<DT>基本属性：</DT>\n<DD>\n", html_fp) ;
+	if (ret>=0) minimal_enlightenment();
+	if (ret>=0) ret = fputs("<BR><BR></DD>\n", html_fp) ;
+
+	if (final || wizard || discover) {
+		if (ret>=0) ret = fprintf(html_fp, "<DT>%s属性：</DT>\n<DD>\n", (final)?"最終":"現在") ;
+		if (ret>=0) enlightenment(final);
+		if (ret>=0) ret = fputs("<BR><BR></DD>\n", html_fp) ;
+	}
+
+	if (ret>=0) ret = fputs("<DT>自発的挑戦：</DT>\n<DD>\n", html_fp) ;
+	if (ret>=0) show_conduct(final);
+	if (ret>=0) ret = fputs("<BR><BR></DD>\n", html_fp) ;
+
+	if (ret>=0) ret = output_dump_html_spells(html_fp, final);
+
+	if (ret>=0) ret = output_html_pets(html_fp);
+
+	if (ret>=0) ret = fputs("<DT>所持アイテム：</DT>\n<DD>\n", html_fp) ;
+	if (ret>=0) ret = output_html_objectlist(html_fp, invent, (final)?TRUE:FALSE) ;
+	if (ret>=0) ret = fputs("<BR><BR></DD>\n<DD>", html_fp) ;
+	if (ret>=0) ret = output_html_container(html_fp, invent, (final)?TRUE:FALSE, TRUE);
+	if (ret>=0) ret = fputs("<BR><BR></DD>\n", html_fp) ;
+
+	if (ret<0 && html_fp) {
+		fclose(html_fp) ;
+		html_fp = (FILE*)0 ;
+	}
+	return ((ret<0)?1:0) ;
+}
+
+
+
+int
+output_html_objectlist(fp, list, identified)
+FILE *fp;
+struct obj *list;
+boolean identified;
+{
+#ifdef WIZARD
+	static char venom_inv[] = { VENOM_CLASS, 0 };
+#endif
+	struct obj *otmp ;
+	char *invlet = flags.inv_order;
+	int classcount;
+	int ret = 0 ;
+
+	ret = fputs("<DL>", fp) ;
+	if (ret<0) return -1;
+nextclass:
+	classcount = 0;
+	for(otmp = list; otmp; otmp = otmp->nobj) {
+		if (!flags.sortpack || otmp->oclass == *invlet) {
+			if (flags.sortpack && !classcount) {
+				fprintf(fp, "<DT>%s</DT>\n", let_to_name(*invlet, FALSE)) ;
+				classcount++;
+			}
+			if (identified) {
+				makeknown(otmp->otyp);
+				otmp->known = otmp->bknown =
+				otmp->dknown = otmp->rknown = 1;
+			}
+			ret = fputs("<DD>", fp) ;
+			if (ret<0) return -1;
+			if ( otmp->where == OBJ_INVENT )
+				fprintf(fp, "%c - ", otmp->invlet) ;
+			fprintf(fp, "<FONT class=\"nh%d\">%s</FONT></DD>\n"
+				, objects[otmp->otyp].oc_color, doname(otmp)) ;
+		}
+	}
+	if (flags.sortpack) {
+		if (*++invlet) goto nextclass;
+#ifdef WIZARD
+		if (--invlet != venom_inv) {
+			invlet = venom_inv;
+			goto nextclass;
+		}
+#endif
+	}
+	ret = fputs("</DL>\n", fp) ;
+	if (ret<0) return -1;
+
+	return 0;
+}
+
+
+
+int
+output_html_container(fp, list, identified, all_containers)
+FILE *fp;
+struct obj *list;
+boolean identified, all_containers;
+{
+	register struct obj *box ;
+	int ret = 0 ;
+
+	for (box = list; box; box = box->nobj) {
+	    if (Is_container(box) && box->otyp != BAG_OF_TRICKS) {
+		if (identified) {
+		    makeknown(box->otyp);
+		    box->known = box->bknown =
+		    box->dknown = box->rknown = 1;
+		}
+		if (box->cobj) {
+/*JP		    ret = fprintf(fp, "<DL>\n<DT>Contents of %s</DT>\n", the(doname(box)));*/
+		    ret = fprintf(fp, "<DL>\n<DT>%sの中身：</DT>\n<DD>", the(doname(box)));
+		    if (ret<0) return -1;
+		    ret = output_html_objectlist(fp, box->cobj, identified) ;
+		    if (ret) return -1;
+		    if (all_containers)
+			ret = output_html_container(fp, box->cobj, identified, TRUE);
+		    if (ret) return -1;
+		    ret = fputs("</DD>\n</DL>", fp) ;
+		    if (ret<0) return -1;
+		} else {
+/*JP		    ret = fprintf("%s is empty.", The(xname(box)));*/
+		    ret = fprintf(fp, "%sは空っぽだ．", The(xname(box)));
+		    if (ret<0) return -1;
+		}
+	    }
+	    if (!all_containers)
+		break;
+	}
+
+	return 0 ;
+}
+
+
+
+int
+output_html_pets(fp)
+FILE *fp;
+{
+	int ret = 0 ;
+	register struct monst *mtmp;
+	boolean flag = FALSE ;
+
+	for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) if ( mtmp->mtame ) flag = TRUE ;
+
+	if ( flag ) {
+		if (ret>=0) ret = fputs("<DT>ペット：</DT>\n<DD><DL><DD>\n", html_fp) ;
+		ret = fputs("<DL>", fp) ;
+		for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
+			if ( mtmp->mtame ) {
+				fprintf(fp, "<DT><FONT class=\"nh%d\">%s</FONT>%s</DT>\n",
+					mtmp->data->mcolor,
+					(x_monnam(mtmp, ARTICLE_THE, (char*)0, SUPPRESS_IT, TRUE)),
+					(mtmp == u.usteed) ? " (騎乗している)" : "") ;
+			}
+		}
+		ret = fputs("</DL>\n", fp) ;
+		if (ret>=0) ret = fputs("</DD></DL><BR><BR></DD>\n", html_fp) ;
+	}
+
+	if (ret<0) return -1;
+
+	return 0;
+}
+#endif /*PUTHTML*/
 
 #endif /* OVL0 */
 
diff -aurN jnethack-3.4.0-0.9/src/decl.c jnethack-3.4.0-0.9-puthtml-b05/src/decl.c
--- jnethack-3.4.0-0.9/src/decl.c	Sat Dec 21 00:25:34 2002
+++ jnethack-3.4.0-0.9-puthtml-b05/src/decl.c	Fri Dec 20 09:44:40 2002
@@ -83,7 +83,11 @@
 const char ynNaqchars[] = "yn#aq";
 NEARDATA long yn_number = 0L;
 
+#ifdef PUTHTML
+const char disclosure_options[] = "iavgch";
+#else
 const char disclosure_options[] = "iavgc";
+#endif /*PUTHTML*/
 
 #ifdef MICRO
 char hackdir[PATHLEN];		/* where rumors, help, record are */
diff -aurN jnethack-3.4.0-0.9/src/display.c jnethack-3.4.0-0.9-puthtml-b05/src/display.c
--- jnethack-3.4.0-0.9/src/display.c	Sat Dec 21 00:25:34 2002
+++ jnethack-3.4.0-0.9-puthtml-b05/src/display.c	Mon Feb 10 09:46:44 2003
@@ -2173,4 +2173,127 @@
     return idx;
 }
 
+#ifdef PUTHTML
+int
+output_html_screen(fp)
+FILE *fp;
+{
+	register int prev_color, def_color, x, y ;
+	boolean reverse_flag ;
+	int ret = 0 ;
+
+	docrt();
+
+#ifdef TEXTCOLOR
+	prev_color = def_color = 7 ;
+#else
+	prev_color = def_color = NO_COLOR ;
+#endif
+	ret = fprintf(fp, "<TABLE><TR><TD class=\"nhScreen\"><PRE><FONT class=\"nh%d\">", def_color) ;
+	if (ret<0) return 1;
+
+	for (y = 0; y < ROWNO; y++) {
+		register gbuf_entry *gptr = &gbuf[y][(int)gbuf_start[y]];
+		for (x=0; x < gbuf_start[y]; x++) {
+			ret = fputs(" ", fp) ;
+			if (ret<0) return 0;
+		}
+		for (; x <= gbuf_stop[y]; gptr++, x++) {
+			uchar ch;
+			unsigned sp ;
+			int glyph = gptr->glyph ;
+			int color, ochar ;
+
+			mapglyph(glyph, &ochar, &color, &sp, x, y) ;
+			ch = (char)ochar ;
+/*
+	spの値が示すもの
+		define MG_CORPSE	0x01	死体
+		define MG_INVIS		0x02	透明
+		define MG_DETECT	0x04	発見されたモンスター
+		define MG_PET		0x08	ペット
+		define MG_RIDDEN	0x10	乗馬中
+*/
+			if ( x == u.ux && y == u.uy ) {
+				if ( u.usteed ) {
+					ch = monsyms[u.usteed->data->mlet] ;
+#ifdef TEXTCOLOR
+					color = u.usteed->data->mcolor ;
+#endif
+				} else {
+					ch = monsyms[youmonst.data->mlet] ;
+#ifdef TEXTCOLOR
+					color = youmonst.data->mcolor ;
+#endif
+				}
+			}
+			reverse_flag = FALSE ;
+			if ( ( ((sp & MG_PET) && iflags.hilite_pet) || ((sp & MG_DETECT) && iflags.use_inverse) ) ) {
+				reverse_flag = TRUE ;
+				switch(color) {
+				case CLR_WHITE:
+				case CLR_GRAY:
+				case NO_COLOR:
+				case CLR_BLACK:
+					color = -1 ;
+				}
+			}
+			if ( color != prev_color ) {
+				if ( ch == ' ' ) {
+					color = prev_color ;
+				} else if ( color != def_color ) {
+					if ( prev_color != def_color ) ret = fputs("</FONT>", fp) ;
+					if ( color >= 0 )
+						ret = fprintf(fp, "<FONT class=\"nh%d\">", color) ;
+					else
+						ret = fputs("<FONT color=\"black\">", fp) ;
+				} else {
+					ret = fputs("</FONT>", fp) ;
+				}
+				if (ret<0) return 1;
+			}
+			if ( reverse_flag ) {
+				ret = fputs("<SPAN class='nhPet'>", fp) ;
+			} else if ( x == u.ux && y == u.uy ) {
+				ret = fputs("<SPAN class='nhPlayer'>", fp) ;
+			}
+			if (ret<0) return 1;
+			switch( ch ) {
+			case '&':
+				ret = fputs("&amp;", fp) ;
+				break ;
+			case '<':
+				ret = fputs("&lt;", fp) ;
+				break ;
+			case '>':
+				ret = fputs("&gt;", fp) ;
+				break ;
+			case '"':
+				ret = fputs("&quot;", fp) ;
+				break ;
+			default:
+				ret = fprintf(fp, "%c", ch) ;
+			}
+			if (ret<0) return 1;
+			if ( reverse_flag || ( x == u.ux && y == u.uy ) ) {
+				ret = fputs("</SPAN>", fp) ;
+			}
+			if (ret<0) return 1;
+			prev_color = color ;
+		}
+		ret = fputs("\n", fp) ;
+		if (ret<0) return 1;
+	}
+
+	if ( prev_color != def_color ) ret = fputs("</FONT>", fp) ;
+	if (ret<0) return 1;
+	ret = output_html_bot(fp) ;
+	if (ret) return 1;
+
+	ret = fprintf(fp, "\n</FONT></PRE></TD></TR></TABLE>\n") ;
+	if (ret<0) return 1;
+	return 0;
+}
+#endif /*PUTHTML*/
+
 /*display.c*/
diff -aurN jnethack-3.4.0-0.9/src/end.c jnethack-3.4.0-0.9-puthtml-b05/src/end.c
--- jnethack-3.4.0-0.9/src/end.c	Sat Dec 21 00:25:34 2002
+++ jnethack-3.4.0-0.9-puthtml-b05/src/end.c	Wed Jan 15 14:25:00 2003
@@ -99,6 +99,9 @@
 #ifdef NH_EXTENSION_REPORT
 int	report_flag = 0;
 #endif
+#ifdef PUTHTML
+int	puthtml_flag = 0;
+#endif /*PUTHTML*/
 
 #if 0 /*JP*/
 /*
@@ -425,6 +428,20 @@
 	char	qbuf[QBUFSZ];
 	int defquery;
 	boolean ask;
+#ifdef PUTHTML
+	int puthtml_tmpflag = 0 ;
+
+	/* 直前のメッセージ出力に質問が出力されないように先頭で実行 */
+	ask = should_query_disclose_option('h', &defquery);
+	if (!done_stopprint) {
+		if (ask)
+			c = yn_function("DUMPを出力しますか？", ynqchars, defquery) ;
+		if ((!ask && defquery == 'y' ) || (ask && c == 'y'))
+		    (void) output_final_dump_html_start(how) ;
+		if (ask && c == 'q') done_stopprint++;
+		puthtml_tmpflag = 1 ;
+	}
+#endif /*PUTHTML*/
 
 	if (invent) {
 	    if(taken)
@@ -502,6 +519,9 @@
 	  }
 	}
 #endif
+#ifdef PUTHTML
+	puthtml_flag = puthtml_tmpflag ;
+#endif /*PUTHTML*/
 }
 
 /* try to get the player back in a viable state after being killed */
@@ -642,6 +662,11 @@
 		jtrns_obj(' ', OBJ_NAME(objects[otmp->otyp])),
 		arti_cost(otmp), arti_cost(otmp) * 5 / 2);
 #endif
+#ifdef PUTHTML
+	    if ( puthtml_flag )
+	    	output_final_dump_html_mesg(pbuf) ;
+	    if ( !done_stopprint )
+#endif /*PUTHTML*/
 	    putstr(endwin, 0, pbuf);
 	}
 	if (Has_contents(otmp))
@@ -929,7 +954,11 @@
 		/* don't bother counting to see whether it should be plural */
 	}
 
-	if (!done_stopprint) {
+	if (!done_stopprint
+#ifdef PUTHTML
+		|| puthtml_flag
+#endif /*PUTHTML*/
+	) {
 #if 0 /*JP*/
 	    Sprintf(pbuf, "%s %s the %s...", Goodbye(), plname,
 		   how != ASCENDED ?
@@ -944,8 +973,15 @@
 		    (const char *) (flags.female ? "女神" : "神"),
 		    plname);
 #endif
+#ifdef PUTHTML
+	    if ( !done_stopprint ) {
+#endif /*PUTHTML*/
 	    putstr(endwin, 0, pbuf);
 	    putstr(endwin, 0, "");
+#ifdef PUTHTML
+	    }
+	    if ( puthtml_flag ) output_final_dump_html_mesg(pbuf) ;
+#endif /*PUTHTML*/
 	}
 
 	if (how == ESCAPED || how == ASCENDED) {
@@ -990,6 +1026,10 @@
 /*JP*/
 		if (!done_stopprint) Strcat(pbuf, "は");
 		if (!done_stopprint) putstr(endwin, 0, pbuf);
+#ifdef PUTHTML
+		if ( puthtml_flag )
+		    output_final_dump_html_mesg(pbuf) ;
+#endif /*PUTHTML*/
 		pbuf[0] = '\0';
 	    } else {
 /*JP
@@ -997,7 +1037,11 @@
 */
 		if (!done_stopprint) Strcat(pbuf, "は");
 	    }
-	    if (!done_stopprint) {
+	    if (!done_stopprint
+#ifdef PUTHTML
+		|| puthtml_flag
+#endif /*PUTHTML*/
+	    ) {
 #if 0 /*JP*/
 		Sprintf(eos(pbuf), "%s with %ld point%s,",
 			how==ASCENDED ? "went to your reward" :
@@ -1008,10 +1052,19 @@
 			u.urexp,
 			how==ASCENDED ? "昇天した" : "迷宮から脱出した");
 #endif
+#ifdef PUTHTML
+	    if ( puthtml_flag )
+	    	output_final_dump_html_mesg(pbuf) ;
+	    if ( !done_stopprint )
+#endif /*PUTHTML*/
 		putstr(endwin, 0, pbuf);
 	    }
 
-	    if (!done_stopprint)
+	    if (!done_stopprint
+#ifdef PUTHTML
+		|| puthtml_flag
+#endif /*PUTHTML*/
+	    )
 		display_artifact_score(invent,endwin);
 
 	    /* list valuables here */
@@ -1050,10 +1103,18 @@
 #endif
 		    }
 		    putstr(endwin, 0, pbuf);
+#ifdef PUTHTML
+		    if ( puthtml_flag )
+			output_final_dump_html_mesg(pbuf) ;
+#endif /*PUTHTML*/
 		}
 	    }
 
-	} else if (!done_stopprint) {
+	} else if (!done_stopprint
+#ifdef PUTHTML
+		    || puthtml_flag
+#endif /*PUTHTML*/
+	) {
 	    /* did not escape or ascend */
 	    if (u.uz.dnum == 0 && u.uz.dlevel <= 0) {
 		/* level teleported out of the dungeon; `how' is DIED,
@@ -1092,10 +1153,19 @@
 	    Sprintf(eos(pbuf), " %ldポイントをマークし",
 		    u.urexp);
 #endif
+#ifdef PUTHTML
+	    if ( puthtml_flag )
+		output_final_dump_html_mesg(pbuf) ;
+	    if ( !done_stopprint )
+#endif /*PUTHTML*/
 	    putstr(endwin, 0, pbuf);
 	}
 
-	if (!done_stopprint) {
+	if (!done_stopprint
+#ifdef PUTHTML
+		|| puthtml_flag
+#endif /*PUTHTML*/
+	) {
 #if 0 /*JP*/
 	    Sprintf(pbuf, "and %ld piece%s of gold, after %ld move%s.",
 		    umoney, plur(umoney), moves, plur(moves));
@@ -1103,9 +1173,18 @@
 	    Sprintf(pbuf, "%ldゴールドを得，%ld歩動いた．",
 		    u.ugold, moves);
 #endif
+#ifdef PUTHTML
+	    if ( puthtml_flag )
+	    	output_final_dump_html_mesg(pbuf) ;
+	    if ( !done_stopprint )
+#endif /*PUTHTML*/
 	    putstr(endwin, 0, pbuf);
 	}
-	if (!done_stopprint) {
+	if (!done_stopprint
+#ifdef PUTHTML
+		|| puthtml_flag
+#endif /*PUTHTML*/
+	) {
 #if 0 /*JP*/
 	    Sprintf(pbuf,
 	     "You were level %d with a maximum of %d hit point%s when you %s.",
@@ -1115,13 +1194,25 @@
 	     "%sとき，あなたはレベル%uで，最大体力は%dであった．",
 		    ends[how],u.ulevel, u.uhpmax);
 #endif
+#ifdef PUTHTML
+	    if ( puthtml_flag )
+	    	output_final_dump_html_mesg(pbuf) ;
+	    if ( !done_stopprint ) {
+#endif /*PUTHTML*/
 	    putstr(endwin, 0, pbuf);
 	    putstr(endwin, 0, "");
+#ifdef PUTHTML
+	    }
+#endif /*PUTHTML*/
 	}
 	if (!done_stopprint)
 	    display_nhwindow(endwin, TRUE);
 	if (endwin != WIN_ERR)
 	    destroy_nhwindow(endwin);
+#ifdef PUTHTML
+	if ( puthtml_flag )
+	    output_final_dump_html_end(how) ;
+#endif /*PUTHTML*/
 
 	/* "So when I die, the first thing I will see in Heaven is a
 	 * score list?" */
diff -aurN jnethack-3.4.0-0.9/src/options.c jnethack-3.4.0-0.9-puthtml-b05/src/options.c
--- jnethack-3.4.0-0.9/src/options.c	Sat Dec 21 00:25:36 2002
+++ jnethack-3.4.0-0.9-puthtml-b05/src/options.c	Fri Dec 20 09:37:00 2002
@@ -73,6 +73,9 @@
 #else
 	{"DECgraphics", (boolean *)0, FALSE, SET_IN_FILE},
 #endif
+#ifdef PUTHTML
+	{"dump_autoname", &iflags.puthtml_dump_htmlname_is_auto, FALSE, SET_IN_FILE},
+#endif
 	{"eight_bit_tty", &iflags.wc_eight_bit_input, FALSE, SET_IN_GAME},	/*WC*/
 #ifdef TTY_GRAPHICS
 	{"extmenu", &iflags.extmenu, FALSE, SET_IN_GAME},
@@ -222,6 +225,10 @@
 						SET_IN_GAME },
 	{ "dogname",  "the name of your (first) dog (e.g., dogname:Fang)",
 						PL_PSIZ, DISP_IN_GAME },
+#ifdef PUTHTML
+	{ "dump_css",  "the filename of cascading style sheet for dump html files",
+						40, SET_IN_FILE },
+#endif /*PUTHTML*/
 	{ "dungeon",  "the symbols to use in drawing the dungeon map",
 						MAXDCHARS+1, SET_IN_FILE },
 	{ "effects",  "the symbols to use in drawing special effects",
@@ -1731,6 +1738,16 @@
             return;
         }
 #endif
+#ifdef PUTHTML
+        fullname = "dump_css";
+        if (match_optname(opts, fullname, 8, TRUE)) {
+            if (negated) 
+                bad_negation(fullname, FALSE);
+            else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0)
+                set_dump_css(op);
+            return;
+        }
+#endif /*PUTHTML*/
 
 	/* scores:5t[op] 5a[round] o[wn] */
 	if (match_optname(opts, "scores", 4, TRUE)) {
@@ -2461,6 +2478,9 @@
          */
 	static const char *disclosure_names[] = {
 		"inventory", "attributes", "vanquished", "genocides", "conduct"
+#ifdef PUTHTML
+		, "html dump"
+#endif /*PUTHTML*/
 	};
 	int disc_cat[NUM_DISCLOSURE_OPTIONS];
 	const char *disclosure_name;
@@ -3303,6 +3323,82 @@
 	}
 	return 1;
 }
+
+#ifdef PUTHTML
+static int DECgraphics = 0;
+static int IBMgraphics = 0;
+static int MACgraphics = 0;
+
+static enum {DEC = 0x01, IBM = 0x02, MAC = 0x04} graphicsBits;
+
+void
+disablegraphics()
+{
+  int i;
+
+  graphicsBits = 0;
+  DECgraphics = IBMgraphics = MACgraphics = 0;
+  for (i = 0; boolopt[i].name ; i++)
+  {
+    if (graphicsBits & (DEC|IBM|MAC)) break;
+    if (strcmp(boolopt[i].name, "DECgraphics") == 0) {
+      if (boolopt[i].addr && boolopt[i].addr[0]) {
+      	DECgraphics = 1;
+        parseoptions("!DECgraphics", FALSE, FALSE);
+      }
+      graphicsBits |= DEC;
+      continue;
+    }
+    if (strcmp(boolopt[i].name, "IBMgraphics") == 0) {
+      if (boolopt[i].addr && boolopt[i].addr[0]) {
+      	IBMgraphics = 1;
+        parseoptions("!IBMgraphics", FALSE, FALSE);
+      }
+      graphicsBits |= IBM;
+      continue;
+    }
+    if (strcmp(boolopt[i].name, "Macgraphics") == 0) {
+      if (boolopt[i].addr && boolopt[i].addr[0]) {
+      	MACgraphics = 1;
+        parseoptions("!Macgraphics", FALSE, FALSE);
+      }
+      graphicsBits |= MAC;
+      continue;
+    }
+  }
+
+}
+
+void
+restoregraphics()
+{
+  int i;
+
+  if (!(DECgraphics || IBMgraphics || MACgraphics)) goto RET;
+  graphicsBits = 0;
+  for (i = 0; boolopt[i].name ; i++)
+  {
+    if (graphicsBits & (DEC|IBM|MAC)) break;
+    if (strcmp(boolopt[i].name, "DECgraphics") == 0) {
+      if (DECgraphics) parseoptions("DECgraphics", FALSE, FALSE);
+      graphicsBits |= DEC;
+      continue;
+    }
+    if (strcmp(boolopt[i].name, "IBMgraphics") == 0) {
+      if (IBMgraphics) parseoptions("IBMgraphics", FALSE, FALSE);
+      graphicsBits |= IBM;
+      continue;
+    }
+    if (strcmp(boolopt[i].name, "Macgraphics") == 0) {
+      if (MACgraphics) parseoptions("Macgraphics", FALSE, FALSE);
+      graphicsBits |= MAC;
+      continue;
+    }
+  }
+RET:
+  return;
+}
+#endif /*PUTHTML*/
 
 #endif	/* OPTION_LISTS_ONLY */
 
diff -aurN jnethack-3.4.0-0.9/src/spell.c jnethack-3.4.0-0.9-puthtml-b05/src/spell.c
--- jnethack-3.4.0-0.9/src/spell.c	Sat Dec 21 00:25:38 2002
+++ jnethack-3.4.0-0.9-puthtml-b05/src/spell.c	Tue Feb 11 12:06:54 2003
@@ -1471,4 +1471,45 @@
 	return;
 }
 
+
+#ifdef PUTHTML
+int
+output_dump_html_spells(fp, final)
+FILE *fp;
+int final;
+{
+	int ret = 0, i ;
+
+	if (spellid(0) == NO_SPELL) return 0 ;
+
+	if (ret>=0) ret = fputs("<DT>魔法：</DT>\n<DD><DL><DD>\n", fp) ;
+
+	if (ret>=0) ret = fputs("<TABLE><TR>\n"
+#if 0 /*JP*/
+				"<TH align=left>Name</TH><TH align=right>Level</TH><TH align=left>Category</TH><TH align=right>Fail</TH>"
+#else
+				"<TH align=left>Name</TH><TH align=right>Level</TH><TH align=left>分類</TH><TH align=right>成功率</TH>"
+#endif
+				, fp) ;
+
+	for (i = 0; i < MAXSPELL && spellid(i) != NO_SPELL; i++) {
+		if (ret>=0) ret = fprintf(fp,"<TR><TD align=left>%s</TD><TD align=right>%d%s</TD><TD>%s</TD><TD align=right>%d%%</TD></TR>\n",
+#if 0 /*JP*/
+			spellname(i), spellev(i),
+			spellknow(i) ? "&nbsp;" : "*",
+			spelltypemnemonic(spell_skilltype(spellid(i))),
+			100 - percent_success(i)
+#else
+			jtrns_obj('+', spellname(i)), spellev(i),
+			spellknow(i) ? "&nbsp;" : "*",
+			spelltypemnemonic(spell_skilltype(spellid(i))),
+			percent_success(i)
+#endif
+		);
+	}
+	if (ret>=0) ret = fputs("</TR></TABLE>\n</DD></DL><BR><BR></DD>\n", fp) ;
+
+	return ret ;
+}
+#endif /*PUTHTML*/
 /*spell.c*/
diff -aurN jnethack-3.4.0-0.9/src/version.c jnethack-3.4.0-0.9-puthtml-b05/src/version.c
--- jnethack-3.4.0-0.9/src/version.c	Sat Dec 21 00:25:38 2002
+++ jnethack-3.4.0-0.9-puthtml-b05/src/version.c	Fri Dec 20 09:50:00 2002
@@ -32,13 +32,27 @@
 	return strcpy(buf, VERSION_ID);
 }
 
+#ifdef PUTHTML
+/* binary的にJVERSION_IDは一箇所だけにする*/
+char *
+getjversionstring(buf)
+char *buf;
+{
+	return strcpy(buf, JVERSION_ID);
+}
+#endif /*PUTHTML*/
+
 int
 doversion()
 {
 	char buf[BUFSZ];
 
 	pline(getversionstring(buf));
+#ifdef PUTHTML
+	pline(getjversionstring(buf));
+#else
 	pline(JVERSION_ID);
+#endif /*PUTHTML*/
 	return 0;
 }
 
