--- /dev/null
+diff -aur -xCVS jnethack/include/config.h new/include/config.h
+--- jnethack/include/config.h Thu Jan 2 14:04:48 2003
++++ new/include/config.h Thu Jan 2 14:30:17 2003
+@@ -133,6 +133,7 @@
+ # ifdef USE_XPM
+ # define GRAPHIC_TOMBSTONE /* Use graphical tombstone (rip.xpm) */
+ # endif
++#define RADAR /* Display radar */
+ #endif
+
+
+diff -aur -xCVS jnethack/include/flag.h new/include/flag.h
+--- jnethack/include/flag.h Thu Jan 2 14:05:23 2003
++++ new/include/flag.h Mon Apr 29 04:33:43 2002
+@@ -68,6 +68,9 @@
+ boolean pickup; /* whether you pickup or move and look */
+
+ boolean pushweapon; /* When wielding, push old weapon into second slot */
++#ifdef RADAR
++ boolean radar;
++#endif
+ boolean rest_on_space; /* space means rest */
+ boolean safe_dog; /* give complete protection to the dog */
+ #ifdef EXP_ON_BOTL
+diff -aur -xCVS jnethack/include/winX.h new/include/winX.h
+--- jnethack/include/winX.h Thu Jan 2 14:05:54 2003
++++ new/include/winX.h Mon Apr 29 04:33:44 2002
+@@ -281,6 +281,9 @@
+ int tombtext_dx; /* x-displacement between tombstone line */
+ int tombtext_dy; /* y-displacement between tombstone line */
+ #endif
++#ifdef RADAR
++ Boolean radar;
++#endif
+ Boolean center_popups; /* to centre popups over the main window */
+ } AppResources;
+
+@@ -333,6 +336,9 @@
+ E void FDECL(create_map_window,(struct xwindow*, BOOLEAN_P, Widget));
+ E void FDECL(destroy_map_window,(struct xwindow*));
+ E int FDECL(x_event,(int));
++#ifdef RADAR
++E void FDECL(dismiss_radar,(Widget, XEvent*, String*, Cardinal*));
++#endif
+
+ /* ### winmenu.c ### */
+ E void FDECL(menu_delete, (Widget, XEvent*, String*, Cardinal*));
+diff -aur -xCVS jnethack/src/options.c new/src/options.c
+--- jnethack/src/options.c Thu Jan 2 14:08:33 2003
++++ new/src/options.c Thu Jan 2 14:04:40 2003
+@@ -144,6 +144,9 @@
+ {"prayconfirm", &flags.prayconfirm, TRUE, SET_IN_GAME},
+ {"preload_tiles", &iflags.wc_preload_tiles, TRUE, DISP_IN_GAME}, /*WC*/
+ {"pushweapon", &flags.pushweapon, FALSE, SET_IN_GAME},
++#ifdef RADAR
++ { "radar", &flags.radar, FALSE, SET_IN_GAME},
++#endif
+ #if defined(MICRO) && !defined(AMIGA) && !defined(MSWIN_GRAPHICS)
+ {"rawio", &iflags.rawio, FALSE, DISP_IN_GAME},
+ #else
+diff -aur -xCVS jnethack/win/X11/winX.c new/win/X11/winX.c
+--- jnethack/win/X11/winX.c Thu Jan 2 14:31:36 2003
++++ new/win/X11/winX.c Mon Dec 23 04:47:01 2002
+@@ -950,6 +950,9 @@
+ #ifdef GRAPHIC_TOMBSTONE
+ {"rip_dismiss_text",rip_dismiss_text},/* action for rip in text widget */
+ #endif
++#ifdef RADAR
++ {"dismiss_radar", dismiss_radar},
++#endif
+ {"menu_key", menu_key}, /* action for menu accelerators */
+ {"yn_key", yn_key}, /* action for yn accelerators */
+ {"yn_delete", yn_delete}, /* action for yn delete-window */
+@@ -1003,6 +1006,10 @@
+ XtOffset(AppResources *,tombtext_dx), XtRString, "0" },
+ { "tombtext_dy", "Tombtext_dy", XtRInt, sizeof(int),
+ XtOffset(AppResources *,tombtext_dy), XtRString, "13" },
++# ifdef RADAR /* µ¡Ç½¤·¤Æ¤Þ¤»¤ó */
++ { "radar", "Radar", XtRBoolean, sizeof(Boolean),
++ XtOffset(AppResources *, radar), XtRString, "True" },
++# endif
+ #endif
+ #if 1 /*JP*/
+ { "centerPopups", "CenterPopups", XtRBoolean, sizeof(Boolean),
+@@ -2136,6 +2143,9 @@
+
+ direction=atoi(params[0]);
+
++#ifdef RADAR
++ viewport = XtNameToWidget(toplevel, "*map_viewport");
++#endif
+ horiz_sb = XtNameToWidget(viewport, "*horizontal");
+ vert_sb = XtNameToWidget(viewport, "*vertical");
+
+diff -aur -xCVS jnethack/win/X11/winmap.c new/win/X11/winmap.c
+--- jnethack/win/X11/winmap.c Thu Jan 2 14:34:07 2003
++++ new/win/X11/winmap.c Mon Dec 23 04:55:51 2002
+@@ -71,6 +71,56 @@
+ static void FDECL(get_char_info, (struct xwindow *));
+ static void FDECL(display_cursor, (struct xwindow *));
+
++#ifdef RADAR
++
++#define RADAR_WIDTH (80 * 4)
++#define RADAR_HEIGHT (24 * 4)
++
++#define USE_RADAR (map_info->is_tile)
++static int radar_is_popuped;
++static int radar_is_initialized;
++
++static Widget radar;
++static int radar_x, radar_y;
++static int radar_w, radar_h;
++
++static Widget radar_popup;
++static Window radar_window;
++static Pixmap radar_pixmap;
++static Pixmap radar_pixmap2;
++static GC radar_gc_black;
++static GC radar_gc_white;
++static GC radar_gc[16];
++
++static XColor radar_color[16] = {
++ {0, 0x0000, 0x0000, 0x0000,}, /* black */
++ {0, 0xffff, 0xffff, 0xffff,}, /* white */
++ {0, 0xffff, 0x0000, 0x0000,}, /* red */
++ {0, 0x0000, 0xffff, 0x0000,}, /* green */
++ {0, 0x0000, 0x0000, 0xffff,}, /* blue */
++ {0, 0xffff, 0xffff, 0x0000,}, /* yellow */
++ {0, 0xffff, 0x0000, 0xffff,}, /* magenta */
++ {0, 0x8000, 0x8000, 0x8000,}, /* gray */
++ {0, 0xffff, 0x8000, 0x0000,}, /* orange */
++ {0, 0x0000, 0x8000, 0x0000,}, /* dark green */
++ {0, 0x0000, 0xffff, 0xffff,}, /* cyan */
++};
++enum {
++ RADAR_BLACK,
++ RADAR_WHITE,
++ RADAR_RED,
++ RADAR_GREEN,
++ RADAR_BLUE,
++ RADAR_YELLOW,
++ RADAR_MAGENTA,
++ RADAR_GRAY,
++ RADAR_ORANGE,
++ RADAR_DARKGREEN,
++ RADAR_CYAN,
++};
++
++#endif /*RADAR*/
++
+ #if 1 /*JP*/
+ struct pxm_slot_t {
+ int fg;
+@@ -367,6 +417,9 @@
+ #endif
+
+ if (errorcode != XpmSuccess) {
++#ifdef RADAR
++ USE_RADAR = 0;
++#endif
+ if (errorcode == XpmColorFailed) {
+ Sprintf(buf, "Insufficient colors available to load %s.",
+ appResources.tile_file);
+@@ -641,6 +694,34 @@
+ return result;
+ }
+
++#ifdef RADAR
++void
++check_sb(struct xwindow *wp)
++{
++ Arg arg[2];
++ Widget viewport, horiz_sb, vert_sb;
++ float top, shown;
++
++ viewport = XtParent(wp->w);
++ horiz_sb = XtNameToWidget(viewport, "horizontal");
++ vert_sb = XtNameToWidget(viewport, "vertical");
++
++ if (horiz_sb) {
++ XtSetArg(arg[0], XtNshown, &shown);
++ XtSetArg(arg[1], XtNtopOfThumb, &top);
++ XtGetValues(horiz_sb, arg, TWO);
++ radar_x = top * RADAR_WIDTH;
++ radar_w = shown * RADAR_WIDTH;
++ }
++ if (vert_sb) {
++ XtSetArg(arg[0], XtNshown, &shown);
++ XtSetArg(arg[1], XtNtopOfThumb, &top);
++ XtGetValues(vert_sb, arg, TWO);
++ radar_y = top * RADAR_HEIGHT;
++ radar_h = shown * RADAR_HEIGHT;
++ }
++}
++#endif
+
+ /*
+ * Make sure the map's cursor is always visible.
+@@ -673,6 +754,10 @@
+ XtSetArg(arg[0], XtNshown, &shown);
+ XtSetArg(arg[1], XtNtopOfThumb, &top);
+ XtGetValues(horiz_sb, arg, TWO);
++#ifdef RADAR
++ radar_x = top * RADAR_WIDTH;
++ radar_w = shown * RADAR_WIDTH;
++#endif
+
+ /* [ALI] Don't assume map widget is the same size as actual map */
+ cursor_middle = (wp->cursx + 0.5) * wp->map_information->square_width /
+@@ -721,6 +806,10 @@
+ XtSetArg(arg[0], XtNshown, &shown);
+ XtSetArg(arg[1], XtNtopOfThumb, &top);
+ XtGetValues(vert_sb, arg, TWO);
++#ifdef RADAR
++ radar_y = top * RADAR_HEIGHT;
++ radar_h = shown * RADAR_HEIGHT;
++#endif
+
+ cursor_middle = (wp->cursy + 0.5) * wp->map_information->square_height /
+ wp->pixel_height;
+@@ -1323,6 +1412,74 @@
+ int row;
+ register int count;
+
++#ifdef RADAR
++ Arg args[16];
++ Cardinal num_args;
++ Dimension width, height;
++ int depth;
++ Display *dpy;
++ XGCValues gcval;
++ Colormap cmap;
++
++ dpy = XtDisplay(radar);
++
++ if(USE_RADAR){
++ int i;
++
++ if(flags.radar && !radar_is_popuped){
++ XtPopup(radar_popup, XtGrabNone);
++ radar_is_popuped = TRUE;
++ }
++ if(!flags.radar && radar_is_popuped){
++ XtPopdown(radar_popup);
++ radar_is_popuped = FALSE;
++ }
++
++ if(!radar_is_initialized){
++ radar_is_initialized = TRUE;
++
++ XtRealizeWidget(radar_popup);
++
++ num_args = 0;
++ XtSetArg(args[num_args], XtNwidth, &width); ++num_args;
++ XtSetArg(args[num_args], XtNheight, &height); ++num_args;
++
++ XtGetValues(radar, args, num_args);
++ depth = DefaultDepth(dpy, DefaultScreen(dpy));
++ radar_window = XtWindow(radar);
++ radar_pixmap = XCreatePixmap(dpy, radar_window,
++ width, height, depth);
++ radar_pixmap2 = XCreatePixmap(dpy, radar_window,
++ width, height, depth);
++
++ num_args = 0;
++ XtSetArg(args[num_args], XtNbackgroundPixmap, radar_pixmap); num_args++;
++ XtSetValues(radar, args, num_args);
++
++ num_args = 0;
++ XtSetArg(args[num_args], XtNcolormap, &cmap); num_args++;
++ XtGetValues(radar, args, num_args);
++
++ gcval.function = GXcopy;
++ for(i=0 ; i<16 ; ++i){
++ XAllocColor(dpy, cmap, &radar_color[i]);
++
++ gcval.foreground = radar_color[i].pixel;
++ radar_gc[i] = XCreateGC(dpy, radar_window,
++ GCFunction | GCForeground,
++ &gcval);
++ }
++ radar_gc_black = radar_gc[RADAR_BLACK];
++ radar_gc_white = radar_gc[RADAR_WHITE];
++
++ XFillRectangle(dpy, radar_pixmap,
++ radar_gc_black, 0, 0, width, height);
++ XFillRectangle(dpy, radar_pixmap2,
++ radar_gc_black, 0, 0, width, height);
++ }
++ }
++#endif /*RADAR*/
++
+ if (start_row < 0 || stop_row >= ROWNO) {
+ impossible("map_update: bad row range %d-%d\n", start_row, stop_row);
+ return;
+@@ -1454,6 +1611,60 @@
+ }
+ /*ITA*/
+ }
++# ifdef RADAR
++ if(tile_pixmap && USE_RADAR){
++# define RADAR_MONSTER RADAR_YELLOW
++# define RADAR_HUMAN RADAR_WHITE
++# define RADAR_OBJECT RADAR_BLUE
++
++# define RADAR_WALL RADAR_GRAY
++# define RADAR_FLOOR RADAR_DARKGREEN
++# define RADAR_DOOR RADAR_ORANGE
++# define RADAR_LADDER RADAR_MAGENTA
++# define RADAR_WATER RADAR_BLUE
++# define RADAR_TRAP RADAR_RED
++
++ int c;
++ c = RADAR_BLACK;
++ if(tile < 290)
++ c = RADAR_MONSTER;
++ else if(tile < 345)
++ c = RADAR_HUMAN;
++ else if(tile < 345 + 394)
++ c = RADAR_OBJECT;
++ else if(tile < 345 + 394 + 1)
++ ;
++ else if(tile < 345 + 394 + 12)
++ c = RADAR_WALL;
++ else if(tile < 345 + 394 + 15)
++ c = RADAR_FLOOR;
++ else if(tile < 345 + 394 + 17)
++ c = RADAR_DOOR;
++ else if(tile < 345 + 394 + 20)
++ c = RADAR_FLOOR;
++ else if(tile < 345 + 394 + 24)
++ c = RADAR_LADDER;
++ else if(tile < 345 + 394 + 29)
++ c = RADAR_WATER;
++ else if(tile < 345 + 394 + 30)
++ c = RADAR_GRAY;
++ else if(tile < 345 + 394 + 31)
++ c = RADAR_ORANGE;
++ else if(tile < 345 + 394 + 35)
++ c = RADAR_ORANGE;
++ else if(tile < 345 + 394 + 38)
++ c = RADAR_CYAN;
++ else if(tile < 345 + 394 + 60)
++ c = RADAR_TRAP;
++ else if(tile < 345 + 394 + 121)
++ c = RADAR_YELLOW;
++ else
++ c = RADAR_WALL;
++
++ XFillRectangle(dpy, radar_pixmap2, radar_gc[c],
++ cur_col * 4, row * 4, 4, 4);
++ }
++# endif /*RADAR*/
+ #endif /*JP*/
+
+ if (glyph_is_pet(glyph) && iflags.hilite_pet) {
+@@ -1493,6 +1704,19 @@
+ map_info->square_width-1,
+ map_info->square_height-1);
+ }
++#ifdef RADAR
++ if(USE_RADAR){
++ XCopyArea(dpy, radar_pixmap2, radar_pixmap, radar_gc_black,
++ 0, 0, RADAR_WIDTH, RADAR_HEIGHT, 0, 0);
++ check_sb(wp);
++ XDrawRectangle(dpy, radar_pixmap, radar_gc_white,
++ radar_x, radar_y,
++ radar_w, radar_h);
++ XCopyArea(dpy, radar_pixmap, radar_window, radar_gc_black,
++ 0, 0, RADAR_WIDTH, RADAR_HEIGHT, 0, 0);
++ XRaiseWindow(dpy, XtWindow(radar_popup));
++ }
++#endif
+ } else {
+ struct text_map_info_t *text_map = map_info->mtype.text_map;
+
+@@ -1603,6 +1827,28 @@
+ <Key>: input() \
+ ";
+
++#ifdef RADAR
++static char radar_translations[] =
++"#override\n\
++ <Key>Left: scroll(4)\n\
++ <Key>Right: scroll(6)\n\
++ <Key>Up: scroll(8)\n\
++ <Key>Down: scroll(2)\n\
++ <Key>Escape: dismiss_radar()\n\
++ <Key>: input()\
++";
++#endif
++
++#ifdef RADAR
++void
++dismiss_radar(Widget w, XEvent*ev , String *s, Cardinal*n)
++{
++ XtPopdown(radar_popup);
++ flags.radar = FALSE;
++ radar_is_popuped = FALSE;
++}
++#endif
++
+ /*
+ * The map window creation routine.
+ */
+@@ -1619,6 +1865,33 @@
+ Dimension rows, columns;
+ #if 0
+ int screen_width, screen_height;
++#endif
++
++#ifdef RADAR
++ num_args = 0;
++ XtSetArg(args[num_args], XtNwidth, RADAR_WIDTH); num_args++;
++ XtSetArg(args[num_args], XtNheight, RADAR_HEIGHT); num_args++;
++
++ radar_popup = XtCreatePopupShell("radar",
++ /*
++ trainsientShellWidgetClass,
++ */
++ topLevelShellWidgetClass,
++ toplevel, args, num_args);
++
++ num_args = 0;
++ /*
++ XtSetArg(args[num_args], XtNsensitive, False); num_args++;
++ */
++ XtSetArg(args[num_args], XtNlabel, ""); num_args++;
++ XtSetArg(args[num_args], XtNtranslations,
++ XtParseTranslationTable(radar_translations)); num_args++;
++
++ radar = XtCreateManagedWidget("radar",
++ labelWidgetClass,
++ radar_popup,
++ args,
++ num_args);
+ #endif
+
+ wp->type = NHW_MAP;