diff -urN nethack-3.4.3/include/config.h nethack-3.4.3_hppwbar-1.0/include/config.h
--- nethack-3.4.3/include/config.h	2003-12-08 08:39:13.000000000 +0900
+++ nethack-3.4.3_hppwbar-1.0/include/config.h	2011-03-28 01:42:25.000000000 +0900
@@ -340,6 +340,10 @@
 #define EXP_ON_BOTL	/* Show experience on bottom line */
 /* #define SCORE_ON_BOTL */	/* added by Gary Erickson (erickson@ucivax) */
 
+#ifdef TTY_GRAPHICS
+# define HPPWBAR	/* HP and Pw status bar */
+#endif
+
 /*
  * Section 5:  EXPERIMENTAL STUFF
  *
diff -urN nethack-3.4.3/src/botl.c nethack-3.4.3_hppwbar-1.0/src/botl.c
--- nethack-3.4.3/src/botl.c	2003-12-08 08:39:13.000000000 +0900
+++ nethack-3.4.3_hppwbar-1.0/src/botl.c	2011-03-28 01:42:57.000000000 +0900
@@ -165,6 +165,74 @@
 }
 #endif
 
+#ifdef HPPWBAR
+static void
+hppwbar(bot, barmax)
+char *bot;
+int barmax;
+{
+  int hp, hpmax;
+  int hpbar, pwbar;
+  char c;
+
+  if (Upolyd)
+    hp = u.mh, hpmax = u.mhmax;
+  else
+    hp = u.uhp, hpmax = u.uhpmax;
+  if (hp <= 0)
+    hpbar = 0;
+  else if (hp >= hpmax)
+    hpbar = barmax;
+  else
+    hpbar = hp * barmax / hpmax;
+  if (u.uen <= 0)
+    pwbar = 0;
+  else if (u.uen >= u.uenmax)
+    pwbar = barmax;
+  else
+    pwbar = u.uen * barmax / u.uenmax;
+#ifdef JNETHACK
+  if (is_kanji2(bot, hpbar))
+    --hpbar;
+  if (is_kanji2(bot, pwbar))
+    --pwbar;
+#endif
+  curs(WIN_STATUS, 1, 0), putstr(WIN_STATUS, 0, "");
+  if (pwbar < hpbar) {
+    term_start_attr(ATR_INVERSE);
+    if (pwbar > 0) {
+      c = bot[pwbar], bot[pwbar] = 0;
+      curs(WIN_STATUS, 1, 0), putstr(WIN_STATUS, ATR_INVERSE, bot);
+      bot[pwbar] = c;
+    }
+    term_start_attr(ATR_ULINE);
+    c = bot[hpbar], bot[hpbar] = 0;
+    curs(WIN_STATUS, 1 + pwbar, 0), putstr(WIN_STATUS, ATR_INVERSE, bot + pwbar);
+    bot[hpbar] = c;
+    term_end_attr(ATR_ULINE);
+    term_end_attr(ATR_INVERSE);
+    curs(WIN_STATUS, 1 + hpbar, 0), putstr(WIN_STATUS, 0, bot + hpbar);
+  }
+  else {
+    if (hpbar > 0) {
+      term_start_attr(ATR_INVERSE);
+      c = bot[hpbar], bot[hpbar] = 0;
+      curs(WIN_STATUS, 1, 0), putstr(WIN_STATUS, ATR_INVERSE, bot);
+      bot[hpbar] = c;
+      term_end_attr(ATR_INVERSE);
+    }
+    if (hpbar < pwbar) {
+      term_start_attr(ATR_ULINE);
+      c = bot[pwbar], bot[pwbar] = 0;
+      curs(WIN_STATUS, 1 + hpbar, 0), putstr(WIN_STATUS, 0, bot + hpbar);
+      bot[pwbar] = c;
+      term_end_attr(ATR_ULINE);
+    }
+    curs(WIN_STATUS, 1 + pwbar, 0), putstr(WIN_STATUS, 0, bot + pwbar);
+  }
+}
+#endif
+
 STATIC_OVL void
 bot1()
 {
@@ -215,8 +283,12 @@
 	if (flags.showscore)
 	    Sprintf(nb = eos(nb), " S:%ld", botl_score());
 #endif
+#ifdef HPPWBAR
+	hppwbar(newbot1, j - 2);
+#else
 	curs(WIN_STATUS, 1, 0);
 	putstr(WIN_STATUS, 0, newbot1);
+#endif
 }
 
 /* provide the name of the current level for display by various ports */
