From 7889eedfa5546f68ad9af924faaefb8feede6884 Mon Sep 17 00:00:00 2001 From: Ray Chason Date: Thu, 9 Jul 2026 23:48:14 -0400 Subject: [PATCH] MS-DOS: Support no-tiles and no-graphics builds In previous versions of NetHack, setting -DUSE_TILES enabled the tile support, while setting -DSUPPRESS_GRAPHICS produced a NetHack that would write its TTY output to standard output, and rely on ANSI.SYS or similar to do screen control. (USE_TILES is now TILES_IN_GLYPHMAP.) This change ensures that the current NetHack can be built the same ways. One twist is that previous NetHacks would drop all support for graphical modes when tiles were not supported. Thus sys/msdos/vid{vga,vesa}.c have very disordered use of TILES_IN_GLYPHMAP. There was no need to check this. But now, the graphical modes also support Unicode. A non-tiled build should have the graphical modes, with only the text functions present, provided that ENHANCED_SYMBOLS is defined. Some unused and locally used symbols were cleaned up along the way. --- include/extern.h | 6 +-- include/optlist.h | 2 +- include/pcconf.h | 6 ++- src/glyphs.c | 6 ++- src/wizcmds.c | 6 +-- sys/msdos/Install.dos | 13 ++++- sys/msdos/msdos.c | 14 +---- sys/msdos/pckeys.c | 16 ++++-- sys/msdos/pcvideo.h | 3 +- sys/msdos/video.c | 26 +++++---- sys/msdos/vidtxt.c | 4 +- sys/msdos/vidvesa.c | 78 +++++++++++++++++++++++++-- sys/msdos/vidvga.c | 46 ++++++++++++++-- sys/share/pctty.c | 7 +++ sys/unix/hints/include/cross-post.500 | 4 +- sys/unix/hints/include/cross-pre2.500 | 48 +++++++++++++---- win/share/bmptiles.c | 5 ++ win/share/giftiles.c | 5 ++ win/share/tileset.c | 5 ++ win/tty/termcap.c | 14 ++--- win/tty/wintty.c | 6 +-- 21 files changed, 248 insertions(+), 72 deletions(-) diff --git a/include/extern.h b/include/extern.h index 5edd7ac7b..761450267 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1986,9 +1986,6 @@ extern void mplayer_talk(struct monst *) NONNULLARG1; #ifndef WIN32 extern int tgetch(void); #endif -#ifndef TOS -extern char switchar(void); -#endif #ifndef __GO32__ extern long freediskspace(char *); #ifdef MSDOS @@ -2424,6 +2421,9 @@ extern void gettty(void); extern void settty(const char *); extern void setftty(void); ATTRNORETURN extern void error(const char *, ...) PRINTF_F(1, 2) NORETURN; +#ifdef ENHANCED_SYMBOLS +extern void tty_utf8graphics_fixup(void); +#endif #if defined(TIMED_DELAY) && defined(_MSC_VER) extern void msleep(unsigned); #endif diff --git a/include/optlist.h b/include/optlist.h index a8c93ecd1..516d93e19 100644 --- a/include/optlist.h +++ b/include/optlist.h @@ -825,7 +825,7 @@ static int optfn_##a(int, int, boolean, char *, char *); (char *)0) NHOPTC(versinfo, Advanced, 80, opt_out, set_in_game, No, Yes, No, Yes, NoAlias, "extra information for 'showvers'") -#ifdef MSDOS +#if defined(MSDOS) && defined(NO_TERMS) NHOPTC(video, Advanced, 20, opt_in, set_in_config, No, Yes, No, No, NoAlias, "method of video updating") #endif diff --git a/include/pcconf.h b/include/pcconf.h index a4adbbd9f..904c250c7 100644 --- a/include/pcconf.h +++ b/include/pcconf.h @@ -75,7 +75,7 @@ */ #ifndef SUPPRESS_GRAPHICS #if (defined(SCREEN_BIOS) || defined(SCREEN_DJGPPFAST)) && !defined(PC9800) -#ifdef TILES_IN_GLYPHMAP +#if defined(TILES_IN_GLYPHMAP) || defined(ENHANCED_SYMBOLS) #define SCREEN_VGA /* Include VGA graphics routines in the build */ #define SCREEN_VESA #endif @@ -288,6 +288,10 @@ #endif #endif /* End of sanity check block */ +#if defined(MSDOS) && defined(SUPPRESS_GRAPHICS) +#define NO_TERMCAP_HEADERS +#endif + #if defined(MSDOS) && defined(DLB) #define FILENAME_CMP stricmp /* case insensitive */ #endif diff --git a/src/glyphs.c b/src/glyphs.c index 8e12da56d..2ef04a3a6 100644 --- a/src/glyphs.c +++ b/src/glyphs.c @@ -711,8 +711,10 @@ apply_customizations( struct customization_detail *details; struct symset_customization *sc; boolean at_least_one = FALSE, - do_colors = ((docustomize & do_custom_colors) != 0), - do_symbols = ((docustomize & do_custom_symbols) != 0); + do_colors = ((docustomize & do_custom_colors) != 0); +#ifdef ENHANCED_SYMBOLS + boolean do_symbols = ((docustomize & do_custom_symbols) != 0); +#endif int custs; for (custs = 0; custs < (int) custom_count; ++custs) { diff --git a/src/wizcmds.c b/src/wizcmds.c index 149607228..2d255c3d3 100644 --- a/src/wizcmds.c +++ b/src/wizcmds.c @@ -1990,10 +1990,8 @@ wizcustom_callback(winid win, int glyphnum, char *id) extern glyph_map glyphmap[MAX_GLYPH]; glyph_map *cgm; int clr = NO_COLOR; - char buf[BUFSZ], bufa[BUFSZ], bufb[BUFSZ], bufc[BUFSZ], bufd[BUFSZ], - bufu[BUFSZ]; + char buf[BUFSZ], bufa[BUFSZ], bufb[BUFSZ], bufc[BUFSZ], bufu[BUFSZ]; anything any; - uint8 *cp; if (win && id) { cgm = &glyphmap[glyphnum]; @@ -2009,9 +2007,11 @@ wizcustom_callback(winid win, int glyphnum, char *id) bufu[0] = '\0'; #ifdef ENHANCED_SYMBOLS if (cgm->u && cgm->u->utf8str) { + uint8 *cp; Sprintf(bufu, "U+%04lx", (unsigned long) cgm->u->utf32ch); cp = cgm->u->utf8str; while (*cp) { + char bufd[BUFSZ]; Sprintf(bufd, " <%d>", (int) *cp); Strcat(bufu, bufd); cp++; diff --git a/sys/msdos/Install.dos b/sys/msdos/Install.dos index a8091e607..7a13938a5 100644 --- a/sys/msdos/Install.dos +++ b/sys/msdos/Install.dos @@ -96,11 +96,22 @@ II. There once was a time when people built NetHack right on their DOS machine. make WANT_WIN_TTY=1 WANT_WIN_CURSES=1 CROSS_TO_MSDOS=1 WANT_DOSVGA=1 package + For the TTY interface, use NO_TILES=1 to drop support for tiles. The + resulting TTY interface can still support Unicode if that is enabled + in include/config.h. + + For the TTY interface, use NO_GRAPHICS=1 to drop all graphics support, and + build a NetHack that outputs through the standard output channel. This + configuration requires ANSI.SYS, or an equivalent driver such as NANSI.SYS. + The curses interface will still use graphics if WANT_DOSVGA=1 is set. + + NO_GRAPHICS=1 takes priority of NO_TILES=1. + Result: The "make package" target will bundle all of the necessary components to run NetHack on msdos into a folder: targets/msdos/pkg and then it zips the contents of that folder into: - targets/msdos/nh370dos.zip + targets/msdos/NH500DOS.ZIP Also note that building the msdos targets using the make command above, does not preclude you from building local linux or macOS diff --git a/sys/msdos/msdos.c b/sys/msdos/msdos.c index e2787b020..a26c86c2c 100644 --- a/sys/msdos/msdos.c +++ b/sys/msdos/msdos.c @@ -57,7 +57,7 @@ unsigned long sys_random_seed(void); static char *getdta(void); #endif static unsigned int dos_ioctl(int, int, unsigned); -#ifdef TILES_IN_GLYPHMAP +#ifdef NO_TERMS extern boolean pckeys(unsigned char, unsigned char); /* pckeys.c */ #endif @@ -280,7 +280,7 @@ BIOSgetch(void) else ch = kpad[scan - KEYPADLO].normal; } -#ifdef TILES_IN_GLYPHMAP +#ifdef NO_TERMS /* Check for special interface manipulation keys */ if (pckeys(scan, shift)) { ch = 0xFF; @@ -349,16 +349,6 @@ DOSgetch(void) return (ch); } -char -switchar(void) -{ - union REGS regs; - - regs.x.ax = GETSWITCHAR; - intdos(®s, ®s); - return regs.h.dl; -} - #if 0 static long freediskspace(char *path) diff --git a/sys/msdos/pckeys.c b/sys/msdos/pckeys.c index b8997f9c3..bc4649308 100644 --- a/sys/msdos/pckeys.c +++ b/sys/msdos/pckeys.c @@ -8,16 +8,17 @@ #include "hack.h" -#ifdef MSDOS -#ifdef TILES_IN_GLYPHMAP +#if defined(MSDOS) && defined(NO_TERMS) #include "wintty.h" #include "pcvideo.h" boolean pckeys(unsigned char, unsigned char); +#ifdef TILES_IN_GLYPHMAP static void userpan(enum vga_pan_direction pan); static void overview(boolean); static void traditional(boolean); static void refresh(void); +#endif extern struct WinDesc *wins[MAXWIN]; /* from wintty.c */ extern boolean inmap; /* from video.c */ @@ -34,9 +35,15 @@ extern boolean inmap; /* from video.c */ boolean pckeys(unsigned char scancode, unsigned char shift) { +#ifdef TILES_IN_GLYPHMAP boolean opening_dialog; opening_dialog = svp.pl_character[0] ? FALSE : TRUE; +#endif + +#ifndef TILES_IN_GLYPHMAP + nhUse(shift); +#endif switch (scancode) { #ifdef SIMULATE_CURSOR case 0x3d: /* F3 = toggle cursor type */ @@ -47,6 +54,7 @@ pckeys(unsigned char scancode, unsigned char shift) DrawCursor(); break; #endif +#ifdef TILES_IN_GLYPHMAP case 0x74: /* Control-right_arrow = scroll horizontal to right */ if ((shift & CTRL) && iflags.tile_view && !opening_dialog) userpan(pan_right); @@ -83,12 +91,14 @@ pckeys(unsigned char scancode, unsigned char shift) refresh(); } break; +#endif /* TILES_IN_GLYPHMAP */ default: return FALSE; } return TRUE; } +#ifdef TILES_IN_GLYPHMAP static void userpan(enum vga_pan_direction pan) { @@ -141,6 +151,6 @@ refresh(void) #endif } #endif /* TILES_IN_GLYPHMAP */ -#endif /* MSDOS */ +#endif /* MSDOS && NO_TERMS */ /*pckeys.c*/ diff --git a/sys/msdos/pcvideo.h b/sys/msdos/pcvideo.h index a9cce2bbb..a3a088058 100644 --- a/sys/msdos/pcvideo.h +++ b/sys/msdos/pcvideo.h @@ -237,12 +237,12 @@ extern void HideCursor(void); /* ### vidtxt.c ### */ +extern void txt_get_scr_size(void); #ifdef NO_TERMS extern void txt_backsp(void); extern void txt_clear_screen(void); extern void txt_cl_end(int, int); extern void txt_cl_eos(void); -extern void txt_get_scr_size(void); extern void txt_gotoxy(int, int); extern int txt_monoadapt_check(void); extern void txt_nhbell(void); @@ -267,7 +267,6 @@ extern void vga_show_cursor(void); extern void vga_DrawCursor(void); #endif extern void vga_Finish(void); -extern char __far *vga_FontPtrs(void); extern void vga_get_scr_size(void); extern void vga_gotoloc(int, int); #ifdef POSITIONBAR diff --git a/sys/msdos/video.c b/sys/msdos/video.c index 7d2a91ef5..ec21aa695 100644 --- a/sys/msdos/video.c +++ b/sys/msdos/video.c @@ -132,17 +132,17 @@ void cmov(int, int); void nocmov(int, int); static void init_ttycolor(void); -int savevmode; /* store the original video mode in here */ +#if defined(SCREEN_VGA) || defined(SCREEN_VESA) int curcol, currow; /* graphics mode current cursor locations */ +#endif int g_attribute; /* Current attribute to use */ -int monoflag; /* 0 = not monochrome, else monochrome */ +static int monoflag; /* 0 = not monochrome, else monochrome */ int inversed; int attrib_text_normal; /* text mode normal attribute */ int attrib_gr_normal; /* graphics mode normal attribute */ int attrib_text_intense; /* text mode intense attribute */ int attrib_gr_intense; /* graphics mode intense attribute */ uint32 curframecolor = NO_COLOR; /* current background text color */ -boolean traditional = FALSE; /* traditional TTY character mode */ boolean inmap = FALSE; /* in the map window */ char ttycolors[CLR_MAX]; /* also used/set in options.c */ @@ -183,8 +183,8 @@ term_curs_set(int visibility) #ifdef SCREEN_VESA } else if (iflags.usevesa) { vesa_hide_cursor(); - } #endif + } } else if (visibility) { if (!iflags.grmode) { txt_show_cursor(); @@ -195,8 +195,8 @@ term_curs_set(int visibility) #ifdef SCREEN_VESA } else if (iflags.usevesa) { vesa_show_cursor(); - } #endif + } } vis = visibility; } @@ -255,16 +255,16 @@ void cl_end(void) /* clear to end of line */ void cl_eos(void) /* clear to end of screen */ { - int cy = (int) ttyDisplay->cury + 1; - if (!iflags.grmode) { txt_cl_eos(); #ifdef SCREEN_VGA } else if (iflags.usevga) { + int cy = (int) ttyDisplay->cury + 1; vga_cl_eos(cy); #endif #ifdef SCREEN_VESA } else if (iflags.usevesa) { + int cy = (int) ttyDisplay->cury + 1; vesa_cl_eos(cy); #endif } @@ -683,6 +683,7 @@ xputc(int ch) /* write out character (and attribute) */ } /* write out a glyph picture at current location */ +#ifdef TILES_IN_GLYPHMAP void xputg(const glyph_info *glyphinfo, const glyph_info *bkglyphinfo) { if (!iflags.grmode || !iflags.tile_view) { @@ -697,6 +698,7 @@ void xputg(const glyph_info *glyphinfo, const glyph_info *bkglyphinfo) #endif } } +#endif /* TILES_IN_GLYPHMAP */ #ifdef POSITIONBAR void @@ -731,6 +733,8 @@ adjust_cursor_flags(struct WinDesc *cw) cursor_flag = 1; } #endif /* 0 */ +#else + nhUse(cw); #endif /* SIMULATE_CURSOR */ } @@ -796,9 +800,9 @@ HideCursor(void) /* assign_videocolors() is prototyped in extern.h */ /* assign_video() is prototyped in extern.h */ -int shadeflag; /* shades are initialized */ -int colorflag; /* colors are initialized */ -const char *schoice[3] = { "dark", "normal", "light" }; +static int shadeflag; /* shades are initialized */ +static int colorflag; /* colors are initialized */ +static const char *schoice[3] = { "dark", "normal", "light" }; const char *shade[3]; #endif /* VIDEOSHADES */ @@ -1068,6 +1072,7 @@ assign_video(char *sopt) return 1; } +#ifdef TILES_IN_GLYPHMAP void tileview(boolean enable) { @@ -1080,6 +1085,7 @@ tileview(boolean enable) vesa_traditional(enable ? FALSE : TRUE); #endif } +#endif /* TILES_IN_GLYPHMAP */ #endif /* NO_TERMS */ #else /* STUBVIDEO */ diff --git a/sys/msdos/vidtxt.c b/sys/msdos/vidtxt.c index f60b1c715..a97b45b24 100644 --- a/sys/msdos/vidtxt.c +++ b/sys/msdos/vidtxt.c @@ -109,7 +109,7 @@ txt_get_scr_size(void) void txt_gotoxy(int, int); #if defined(SCREEN_BIOS) && !defined(PC9800) -void txt_get_cursor(int *, int *); +static void txt_get_cursor(int *, int *); #endif #ifdef SCREEN_DJGPPFAST @@ -401,7 +401,7 @@ void txt_xputc(char ch, int attr) * * This is implemented as a macro under DJGPPFAST. */ -void txt_get_cursor(int *x, int *y) +static void txt_get_cursor(int *x, int *y) { union REGS regs; diff --git a/sys/msdos/vidvesa.c b/sys/msdos/vidvesa.c index 147e21da3..c07fc6877 100644 --- a/sys/msdos/vidvesa.c +++ b/sys/msdos/vidvesa.c @@ -15,12 +15,22 @@ #include "pctiles.h" #include "vesa.h" #include "wintty.h" -#include "tileset.h" #include "font.h" +#ifdef TILES_IN_GLYPHMAP +#include "tileset.h" +#else +/* For the palette */ +struct Pixel { + unsigned char r, g, b, a; +}; +#endif + #define FIRST_TEXT_COLOR 240 +#ifdef TILES_IN_GLYPHMAP extern int total_tiles_used, Tile_corr, Tile_unexplored; /* from tile.c */ +#endif struct VesaCharacter { uint32 colour, bgcolour; uint32 chr; @@ -37,8 +47,10 @@ static unsigned long vesa_MakeColor(struct Pixel); static void vesa_FillRect(unsigned left, unsigned top, unsigned width, unsigned height, unsigned color); +#ifdef TILES_IN_GLYPHMAP static void vesa_redrawmap(void); static void vesa_cliparound(int, int); +#endif #if 0 static void decal_packed(const struct TileImage *tile, unsigned special); #endif @@ -47,7 +59,9 @@ static void vesa_SetViewPort(void); static boolean vesa_SetPalette(const struct Pixel *); static boolean vesa_SetHardPalette(const struct Pixel *); static boolean vesa_SetSoftPalette(const struct Pixel *); +#ifdef TILES_IN_GLYPHMAP static void vesa_DisplayCell(int, int, int); +#endif static unsigned vesa_FindMode(unsigned long mode_addr, unsigned bits); static void vesa_WriteChar(uint32, int, int, uint32); static void vesa_WriteCharXY(uint32, int, int, uint32); @@ -60,8 +74,10 @@ static unsigned long vesa_DoublePixels(unsigned long); static unsigned long vesa_TriplePixels(unsigned long); static void vesa_WriteStr(const char *, int, int, int, int); static unsigned char __far *vesa_FontPtrs(void); +#ifdef TILES_IN_GLYPHMAP static unsigned char *vesa_tile(unsigned); static unsigned char *vesa_oview_tile(unsigned); +#endif /* static void vesa_process_tile(struct TileImage *tile); */ #ifdef POSITIONBAR @@ -84,6 +100,7 @@ extern boolean inmap; /* in the map window */ static unsigned char __far *font; +#ifdef TILES_IN_GLYPHMAP static struct map_struct { int glyph; uint32 ch; @@ -108,10 +125,13 @@ static struct map_struct { map[y][x].inverse = 0; \ } \ } +#endif /* TILES_IN_GLYPHMAP */ #define TOP_MAP_ROW 1 +#ifdef TILES_IN_GLYPHMAP static int viewport_cols = 40; static int viewport_rows = ROWNO; +#endif static const struct Pixel defpalette[] = { /* Colors for text and the position bar */ { 0x00, 0x00, 0x00, 0xff }, /* CLR_BLACK */ @@ -158,8 +178,10 @@ static unsigned char vesa_blue_shift; static unsigned long vesa_palette[256]; static unsigned vesa_char_width = 8, vesa_char_height = 16; static unsigned vesa_oview_width, vesa_oview_height; +#ifdef TILES_IN_GLYPHMAP static unsigned char **vesa_tiles; static unsigned char **vesa_oview_tiles; +#endif static struct BitmapFont *vesa_font; #ifdef SIMULATE_CURSOR @@ -564,8 +586,10 @@ void vesa_clear_screen(int colour) { vesa_FillRect(0, 0, vesa_x_res, vesa_y_res, colour); +#ifdef TILES_IN_GLYPHMAP if (iflags.tile_view) vesa_clearmap(); +#endif vesa_gotoloc(0, 0); /* is this needed? */ } @@ -893,6 +917,7 @@ vesa_redrawmap(void) #endif /* TILES_IN_GLYPHMAP && CLIPPING */ +#ifdef TILES_IN_GLYPHMAP void vesa_userpan(enum vga_pan_direction pan) { @@ -1040,6 +1065,7 @@ decal_packed(const struct TileImage *gp, unsigned special) } } #endif +#endif /* TILES_IN_GLYPHMAP */ DISABLE_WARNING_FORMAT_NONLITERAL @@ -1055,7 +1081,9 @@ vesa_Init(void) { static boolean inited = FALSE; const struct Pixel *paletteptr; +#ifdef TILES_IN_GLYPHMAP const char *tile_file; +#endif const char *font_name; int tilefailure = 0; @@ -1089,11 +1117,16 @@ vesa_Init(void) /* term_clear_screen() */ /* not vesa_clear_screen() */ return; } + paletteptr = get_palette(); +#else + /* This isn't actually used; it just keeps paletteptr from being NULL, + * so an 8 bit color mode will work */ + paletteptr = defpalette; #endif vesa_mode = 0xFFFF; /* might want an 8 bit mode after loading tiles */ vesa_detect(); - if (vesa_mode == 0xFFFF || (vesa_pixel_size == 8 && get_palette() == NULL)) { + if (vesa_mode == 0xFFFF || (vesa_pixel_size == 8 && paletteptr == NULL)) { raw_printf("%s (%d)", "Reverting to TTY mode, no VESA mode available.", tilefailure); wait_synch(); @@ -1108,25 +1141,26 @@ vesa_Init(void) vesa_SwitchMode(vesa_mode); vesa_SetViewPort(); +#ifdef TILES_IN_GLYPHMAP windowprocs.win_cliparound = vesa_cliparound; +#endif if (vesa_pixel_size > 8) { windowprocs.wincap2 |= WC2_EXTRACOLORS; } #ifdef TILES_IN_GLYPHMAP - paletteptr = get_palette(); iflags.tile_view = TRUE; iflags.over_view = FALSE; -#else - paletteptr = defpalette; #endif vesa_SetPalette(paletteptr); g_attribute = attrib_gr_normal; font = vesa_FontPtrs(); term_clear_screen(); +#ifdef TILES_IN_GLYPHMAP clipx = 0; clipxmax = clipx + (viewport_cols - 1); clipy = 0; clipymax = clipy + (viewport_rows - 1); +#endif /* Load a font of size appropriate to the screen size */ if (vesa_x_res >= 1280 && vesa_y_res >= 960) @@ -1185,15 +1219,18 @@ vesa_Init(void) } /* Process tiles for the current video mode */ +#ifdef TILES_IN_GLYPHMAP vesa_tiles = (unsigned char **) alloc(total_tiles_used * sizeof(void *)); memset(vesa_tiles, 0, total_tiles_used * sizeof(void *)); vesa_oview_tiles = (unsigned char **) alloc(total_tiles_used * sizeof(void *)); memset(vesa_oview_tiles, 0, total_tiles_used * sizeof(void *)); set_tile_type(vesa_pixel_size > 8); +#endif } RESTORE_WARNING_FORMAT_NONLITERAL +#ifdef TILES_IN_GLYPHMAP /* Return processed pixels for a normal tile */ static unsigned char * vesa_tile(unsigned index) @@ -1277,11 +1314,13 @@ vesa_oview_tile(unsigned index) return vesa_oview_tiles[index]; } +#endif /* TILES_IN_GLYPHMAP */ /* Set the size of the map viewport */ static void vesa_SetViewPort(void) { +#ifdef TILES_IN_GLYPHMAP unsigned y_reserved = (TOP_MAP_ROW + 5) * vesa_char_height; unsigned y_map = vesa_y_res - y_reserved; @@ -1289,6 +1328,7 @@ vesa_SetViewPort(void) viewport_rows = y_map / iflags.wc_tile_height; if (viewport_cols > COLNO) viewport_cols = COLNO; if (viewport_rows > ROWNO) viewport_rows = ROWNO; +#endif } /* @@ -1340,6 +1380,7 @@ vesa_SwitchMode(unsigned mode) void vesa_Finish(void) { +#ifdef TILES_IN_GLYPHMAP int i; for (i = 0; i < total_tiles_used; ++i) { @@ -1349,6 +1390,7 @@ vesa_Finish(void) free(vesa_tiles); free(vesa_oview_tiles); free_tiles(); +#endif vesa_SwitchMode(MODETEXT); windowprocs.win_cliparound = tty_cliparound; g_attribute = attrib_text_normal; @@ -1897,6 +1939,7 @@ vesa_TriplePixels(unsigned long fnt) * not the x,y pixel location. * */ +#ifdef TILES_IN_GLYPHMAP static void vesa_DisplayCell(int tilenum, int col, int row) { @@ -1932,6 +1975,7 @@ vesa_DisplayCell(int tilenum, int col, int row) tptr += p_row_width; } } +#endif /* TILES_IN_GLYPHMAP */ /* * Write the character string pointed to by 's', whose maximum length @@ -2009,6 +2053,8 @@ vesa_SetHardPalette(const struct Pixel *palette) p2[i*4 + 1] = palette[i].g >> shift; p2[i*4 + 2] = palette[i].r >> shift; } +#else + nhUse(palette); #endif for (i = FIRST_TEXT_COLOR; i < 256; ++i) { p2[i*4 + 0] = defpalette[i-FIRST_TEXT_COLOR].b >> shift; @@ -2077,6 +2123,8 @@ vesa_SetSoftPalette(const struct Pixel *palette) ++p; } } +#else + nhUse(palette); #endif p = defpalette; for (i = FIRST_TEXT_COLOR; i < 256; ++i) { @@ -2199,17 +2247,25 @@ positionbar(void) void vesa_DrawCursor(void) { +#ifdef TILES_IN_GLYPHMAP static boolean last_inmap = FALSE; +#endif unsigned x, y, left, top, right, bottom, width, height; +#ifdef TILES_IN_GLYPHMAP boolean isrogue = Is_rogue_level(&u.uz); boolean halfwidth = (isrogue || iflags.over_view || iflags.traditional_view || !inmap); +#else + const boolean halfwidth = TRUE; +#endif int curtyp; +#ifdef TILES_IN_GLYPHMAP if (inmap && !last_inmap) { vesa_redrawmap(); } last_inmap = inmap; +#endif if (!cursor_type && inmap) return; /* CURSOR_INVIS - nothing to do */ @@ -2232,9 +2288,12 @@ vesa_DrawCursor(void) y -= clipy; } /* convert to pixels */ +#ifdef TILES_IN_GLYPHMAP if (!inmap || iflags.traditional_view) { +#endif width = vesa_char_width; height = vesa_char_height; +#ifdef TILES_IN_GLYPHMAP } else if (iflags.over_view) { width = vesa_oview_width; height = vesa_oview_height; @@ -2242,6 +2301,7 @@ vesa_DrawCursor(void) width = iflags.wc_tile_width; height = iflags.wc_tile_height; } +#endif left = x * width + vesa_x_center; top = y * height + vesa_y_center; if (y >= TOP_MAP_ROW) { @@ -2315,9 +2375,13 @@ void vesa_HideCursor(void) { unsigned x, y, left, top, width, height; +#ifdef TILES_IN_GLYPHMAP boolean isrogue = Is_rogue_level(&u.uz); boolean halfwidth = (isrogue || iflags.over_view || iflags.traditional_view || !inmap); +#else + const boolean halfwidth = TRUE; +#endif if (!cursor_type && inmap) return; /* CURSOR_INVIS - nothing to do */ @@ -2336,9 +2400,12 @@ vesa_HideCursor(void) y -= clipy; } /* convert to pixels */ +#ifdef TILES_IN_GLYPHMAP if (!inmap || iflags.traditional_view) { +#endif width = vesa_char_width; height = vesa_char_height; +#ifdef TILES_IN_GLYPHMAP } else if (iflags.over_view) { width = vesa_oview_width; height = vesa_oview_height; @@ -2346,6 +2413,7 @@ vesa_HideCursor(void) width = iflags.wc_tile_width; height = iflags.wc_tile_height; } +#endif left = x * width + vesa_x_center; top = y * height + vesa_y_center; if (y >= TOP_MAP_ROW) { diff --git a/sys/msdos/vidvga.c b/sys/msdos/vidvga.c index cedc9e6b8..897588889 100644 --- a/sys/msdos/vidvga.c +++ b/sys/msdos/vidvga.c @@ -10,9 +10,17 @@ #ifdef SCREEN_VGA /* this file is for SCREEN_VGA only */ #include "pcvideo.h" #include "tile.h" -#include "tileset.h" #include "font.h" +#ifdef TILES_IN_GLYPHMAP +#include "tileset.h" +#else +/* For the palette */ +struct Pixel { + unsigned char r, g, b, a; +}; +#endif + #include #include "wintty.h" @@ -109,28 +117,35 @@ void vga_backsp(void); #ifdef SCROLLMAP static void vga_scrollmap(boolean); #endif +#ifdef TILES_IN_GLYPHMAP static void vga_redrawmap(boolean); static void vga_cliparound(int, int); static void decal_planar(struct planar_cell_struct *, unsigned); +#endif #ifdef POSITIONBAR static void positionbar(void); static void vga_special(int, int, int); #endif +#ifdef TILES_IN_GLYPHMAP static void vga_DisplayCell(struct planar_cell_struct *, int, int); static void vga_DisplayCell_O(struct overview_planar_cell_struct *, int, int); +#endif static void vga_SwitchMode(unsigned int); static void vga_SetPalette(const struct Pixel *); static void vga_WriteChar(uint32, int, int, int); static void vga_GetBitmap(uint32, unsigned char *); static void vga_WriteStr(char *, int, int, int, int); +static char __far *vga_FontPtrs(void); +#ifdef TILES_IN_GLYPHMAP static void read_planar_tile(unsigned, struct planar_cell_struct *); static void read_planar_tile_O(unsigned, struct overview_planar_cell_struct *); static void read_tile_indexes(unsigned, unsigned char (*)[TILE_X]); +#endif extern int clipx, clipxmax; /* current clipping column from wintty.c */ extern boolean clipping; /* clipping on? from wintty.c */ @@ -156,6 +171,7 @@ static struct BitmapFont *psf_font; static char *screentable[SCREENHEIGHT]; static const struct Pixel *paletteptr; +#ifdef TILES_IN_GLYPHMAP static struct map_struct { int glyph; uint32 ch; @@ -180,11 +196,14 @@ extern int total_tiles_used, Tile_corr, Tile_unexplored; /* from tile.c */ map[y][x].tileidx = Tile_unexplored; \ } \ } +#endif /* TILES_IN_GLYPHMAP */ #define TOP_MAP_ROW 1 +#ifdef TILES_IN_GLYPHMAP static const int vgacmap[CLR_MAX] = { 1, 4, 6, 10, 5, 9, 0, 15, 12, 3, 7, 8, 2, 9, 0, 14 }; +#endif static const int textcmap[CLR_MAX] = { 1, 4, 6, 10, 5, 9, 0, 15, 12, 3, 7, 8, 2, 11, 13, 14 }; @@ -214,12 +233,13 @@ static const struct Pixel text_palette[] = { }; #ifndef ALTERNATE_VIDEO_METHOD -int vp[SCREENPLANES] = { 8, 4, 2, 1 }; +static int vp[SCREENPLANES] = { 8, 4, 2, 1 }; #endif -int vp2[SCREENPLANES] = { 1, 2, 4, 8 }; +#ifdef TILES_IN_GLYPHMAP static struct planar_cell_struct **cell_cache; static struct overview_planar_cell_struct **cell_cache_O; +#endif /* static int g_attribute; */ /* Current attribute to use */ @@ -260,8 +280,10 @@ vga_clear_screen(int colour) WRITE_ABSOLUTE_DWORD(&pch[j], 0x00000000); } egawriteplane(15); +#ifdef TILES_IN_GLYPHMAP if (iflags.tile_view) vga_clearmap(); +#endif vga_gotoloc(0, 0); /* is this needed? */ } @@ -534,6 +556,7 @@ vga_redrawmap(boolean clearfirst) } #endif /* TILES_IN_GLYPHMAP && CLIPPING */ +#ifdef TILES_IN_GLYPHMAP void vga_userpan(enum vga_pan_direction pan) { @@ -774,6 +797,7 @@ decal_planar(struct planar_cell_struct *gpcs UNUSED, unsigned special) } else if (special & MG_RIDDEN) { } } +#endif /* TILES_IN_GLYPHMAP */ /* * Open tile files, @@ -834,7 +858,9 @@ vga_Init(void) } } vga_SwitchMode(MODE640x480); +#ifdef TILES_IN_GLYPHMAP windowprocs.win_cliparound = vga_cliparound; +#endif /* vga_NoBorder(BACKGROUND_VGA_COLOR); */ /* Not needed after palette mod */ #ifdef TILES_IN_GLYPHMAP @@ -904,6 +930,7 @@ vga_SwitchMode(unsigned int mode) void vga_Finish(void) { +#ifdef TILES_IN_GLYPHMAP int i; free_tiles(); @@ -915,6 +942,7 @@ vga_Finish(void) cell_cache = NULL; free(cell_cache_O); cell_cache_O = NULL; +#endif vga_SwitchMode(MODETEXT); windowprocs.win_cliparound = tty_cliparound; g_attribute = attrib_text_normal; @@ -954,7 +982,7 @@ vga_NoBorder(int bc) * address of the appropriate character definition table for * the current graphics mode into interrupt vector 0x43 (0000:010C). */ -char __far * +static char __far * vga_FontPtrs(void) { USHORT __far *tmp; @@ -1109,6 +1137,7 @@ vga_GetBitmap(uint32 chr, unsigned char *bitmap) } } +#ifdef TILES_IN_GLYPHMAP /* * This is the routine that displays a high-res "cell" pointed to by 'gp' * at the desired location (col,row). @@ -1172,6 +1201,7 @@ vga_DisplayCell_O(struct overview_planar_cell_struct *gpcs, int col, int row) } egawriteplane(15); } +#endif /* TILES_IN_GLYPHMAP */ /* * Write the character string pointed to by 's', whose maximum length @@ -1421,9 +1451,13 @@ vga_DrawCursor(void) unsigned char first, second; /* char on[2] = {0xFF,0xFF}; */ /* char off[2] = {0x00,0x00}; */ +#ifdef TILES_IN_GLYPHMAP boolean isrogue = Is_rogue_level(&u.uz); boolean singlebyte = (isrogue || iflags.over_view || iflags.traditional_view || !inmap); +#else + const boolean singlebyte = TRUE; +#endif int curtyp; if (!cursor_type && inmap) @@ -1633,9 +1667,13 @@ vga_HideCursor(void) int i, pixx, pixy, x, y; char __far *tmp1; char __far *tmp2; +#ifdef TILES_IN_GLYPHMAP boolean isrogue = Is_rogue_level(&u.uz); boolean singlebyte = (isrogue || iflags.over_view || iflags.traditional_view || !inmap); +#else + const boolean singlebyte = TRUE; +#endif int curtyp; if (inmap && !cursor_type) diff --git a/sys/share/pctty.c b/sys/share/pctty.c index f06dfe475..3d276fcc6 100644 --- a/sys/share/pctty.c +++ b/sys/share/pctty.c @@ -53,6 +53,13 @@ setftty(void) term_start_screen(); } +#ifdef ENHANCED_SYMBOLS +void +tty_utf8graphics_fixup(void) +{ +} +#endif + #if defined(TIMED_DELAY) && defined(_MSC_VER) void msleep(unsigned mseconds) diff --git a/sys/unix/hints/include/cross-post.500 b/sys/unix/hints/include/cross-post.500 index db5eebe6f..e0a28eb43 100644 --- a/sys/unix/hints/include/cross-post.500 +++ b/sys/unix/hints/include/cross-post.500 @@ -50,7 +50,7 @@ $(DOSFONT)/ter-u32b.psf: $(FONTTOP)/ter-u32b.bdf $(DOSFONT)/nh-u32b.bdf $(DOSFON # .PHONY: dodata dospkg dosfonts dosfonts: $(FONTTARGETS) -dospkg: dodata dosfonts $(GAMEBIN) $(TARGETPFX)recover.exe ../dat/nhtiles.bmp +dospkg: dodata dosfonts $(GAMEBIN) $(TARGETPFX)recover.exe $(NHTILES) $(TARGET_STUBEDIT) $(GAMEBIN) minstack=2048K mkdir -p $(TARGETPFX)pkg cp $(GAMEBIN) $(TARGETPFX)pkg/NETHACK.EXE @@ -58,7 +58,7 @@ dospkg: dodata dosfonts $(GAMEBIN) $(TARGETPFX)recover.exe ../dat/nhtiles.bmp -cp $(SFCTOOLBIN) $(TARGETPFX)pkg/SFCTOOL.EXE cp ../dat/nhdat $(TARGETPFX)pkg/NHDAT cp ../dat/license $(TARGETPFX)pkg/LICENSE - cp ../dat/nhtiles.bmp $(TARGETPFX)pkg/NHTILES.BMP + -cp ../dat/nhtiles.bmp $(TARGETPFX)pkg/NHTILES.BMP cp ../dat/symbols $(TARGETPFX)pkg/SYMBOLS cp ../sys/share/NetHack.cnf $(TARGETPFX)pkg/NETHACK.CNF cp ../sys/msdos/sysconf $(TARGETPFX)pkg/SYSCONF diff --git a/sys/unix/hints/include/cross-pre2.500 b/sys/unix/hints/include/cross-pre2.500 index b5efbb377..5fc642162 100644 --- a/sys/unix/hints/include/cross-pre2.500 +++ b/sys/unix/hints/include/cross-pre2.500 @@ -177,8 +177,23 @@ MSDOS_GPP_CFLAGS = -Wall -Wextra -Wno-missing-field-initializers -Wreturn-type \ -Wunused -Wformat -Wswitch -Wshadow -Wwrite-strings -pedantic \ -Wmissing-declarations -Wformat-nonliteral -Wunreachable-code \ -Wno-maybe-uninitialized +ifdef NO_GRAPHICS + MSDOS_GRAPH_CONFIG = -DSUPPRESS_GRAPHICS + # Curses will need the fonts, but not font.c + ifndef WANT_DOSVGA + SKIP_FONTS = 1 + endif + SKIP_FONT_C = 1 + SKIP_TILES = 1 +else ifdef NO_TILES + MSDOS_GRAPH_CONFIG = + # without SKIP_FONT_C; if ENHANCED_SYMBOLS is set, we'll need the fonts + SKIP_TILES = 1 +else + MSDOS_GRAPH_CONFIG = -DTILES_IN_GLYPHMAP +endif MSDOS_TARGET_CFLAGS = -c -O $(DBGFLAGS) -I../include -I../sys/msdos -I../win/share \ - $(LUAINCL) -DDLB $(PDCURSESDEF) -DTILES_IN_GLYPHMAP \ + $(LUAINCL) -DDLB $(PDCURSESDEF) $(MSDOS_GRAPH_CONFIG) \ -DCROSSCOMPILE -DCROSSCOMPILE_TARGET -DCROSS_TO_MSDOS \ -D_NAIVE_DOS_REGS \ $(MSDOS_GCC_CFLAGS) $(SNDCFLAGS) @@ -190,7 +205,11 @@ MSDOS_TARGET_CXXFLAGS = -c -O $(DBGFLAGS) -I../include -I../sys/msdos -I../win/s PDCINCL += -I$(PDCPORT) PDC_TARGET_CFLAGS = $(MSDOS_TARGET_CFLAGS) -Wno-unused-parameter \ -Wno-missing-prototypes -ifndef SKIP_FONTS_IN_CI +ifdef SKIP_FONTS_IN_CI +FONTTARGETS= +else ifdef SKIP_FONTS +FONTTARGETS= +else FONTVER = terminus-font-4.49.1 FONTTOP = ../lib/$(FONTVER) DOSFONT = ../sys/msdos/fonts @@ -198,8 +217,6 @@ FONTTARGETS = $(DOSFONT)/ter-u16b.psf $(DOSFONT)/ter-u16v.psf \ $(DOSFONT)/ter-u18b.psf $(DOSFONT)/ter-u20b.psf \ $(DOSFONT)/ter-u22b.psf $(DOSFONT)/ter-u24b.psf \ $(DOSFONT)/ter-u28b.psf $(DOSFONT)/ter-u32b.psf -else -FONTTARGETS= endif LUABIN = ../lib/lua-$(LUA_VERSION)/src/lua LUA_TARGET_CFLAGS = $(MSDOS_TARGET_CFLAGS) @@ -216,18 +233,22 @@ override SYSSRC = ../sys/share/pcmain.c ../sys/msdos/msdos.c \ ../sys/share/pcsys.c ../sys/share/pctty.c \ ../sys/share/pcunix.c ../sys/msdos/video.c \ ../sys/msdos/vidtxt.c ../sys/msdos/pckeys.c \ - ../sys/msdos/vidvga.c ../sys/msdos/vidvesa.c \ - ../sys/msdos/font.c \ - ../win/share/bmptiles.c ../win/share/giftiles.c \ - ../win/share/tileset.c + ../sys/msdos/vidvga.c ../sys/msdos/vidvesa.c override SYSOBJ= $(TARGETPFX)pcmain.o $(TARGETPFX)msdos.o \ $(TARGETPFX)pcsys.o $(TARGETPFX)pctty.o \ $(TARGETPFX)pcunix.o $(TARGETPFX)video.o \ $(TARGETPFX)vidtxt.o $(TARGETPFX)pckeys.o \ - $(TARGETPFX)vidvga.o $(TARGETPFX)vidvesa.o \ - $(TARGETPFX)font.o \ - $(TARGETPFX)bmptiles.o $(TARGETPFX)giftiles.o \ + $(TARGETPFX)vidvga.o $(TARGETPFX)vidvesa.o +ifndef SKIP_FONT_C +override SYSSRC += ../sys/msdos/font.c +override SYSOBJ += $(TARGETPFX)font.o +endif +ifndef SKIP_TILES +override SYSSRC += ../win/share/bmptiles.c ../win/share/giftiles.c \ + ../win/share/tileset.c +override SYSOBJ += $(TARGETPFX)bmptiles.o $(TARGETPFX)giftiles.o \ $(TARGETPFX)tileset.o +endif override WINLIB= override LUALIB= override LUALIBS= @@ -250,7 +271,12 @@ GDBEXE= GDBBAT= GDBCMDLINE= endif +ifndef SKIP_TILES VARDATND += nhtiles.bmp +NHTILES = ../dat/nhtiles.bmp +else +NHTILES = +endif # ifdef WANT_WIN_CURSES # rules for pdcurses dos-specific files diff --git a/win/share/bmptiles.c b/win/share/bmptiles.c index a82ea651a..43d1bf814 100644 --- a/win/share/bmptiles.c +++ b/win/share/bmptiles.c @@ -3,6 +3,9 @@ /* NetHack may be freely redistributed. See license for details. */ #include "config.h" + +#ifdef TILES_IN_GLYPHMAP + #include "tileset.h" /* First BMP file header */ @@ -592,3 +595,5 @@ pixel_element(uint32 mask, uint32 color) color &= mask; return color * 255 / mask; } + +#endif /* TILES_IN_GLYPHMAP */ diff --git a/win/share/giftiles.c b/win/share/giftiles.c index cb026cc05..cccf206fd 100644 --- a/win/share/giftiles.c +++ b/win/share/giftiles.c @@ -7,6 +7,9 @@ * http://www.w3.org/Graphics/GIF/spec-gif89a.txt */ #include "config.h" + +#ifdef TILES_IN_GLYPHMAP + #include "tileset.h" #define MIN_LZW_BITS 3 @@ -497,3 +500,5 @@ free_data_block(struct DataBlock *block) block->size = 0; block->data = NULL; } + +#endif /* TILES_IN_GLYPHMAP */ diff --git a/win/share/tileset.c b/win/share/tileset.c index c3fbb209a..556298a7c 100644 --- a/win/share/tileset.c +++ b/win/share/tileset.c @@ -3,6 +3,9 @@ /* NetHack may be freely redistributed. See license for details. */ #include "config.h" + +#ifdef TILES_IN_GLYPHMAP + #include "objclass.h" #include "flag.h" #include "tileset.h" @@ -348,3 +351,5 @@ read_png_tiles(const char *filename UNUSED, struct TileSetImage *image UNUSED) /* stub */ return FALSE; } + +#endif /* TILES_IN_GLYPHMAP */ diff --git a/win/tty/termcap.c b/win/tty/termcap.c index 037f1bf0f..95dd0b27c 100644 --- a/win/tty/termcap.c +++ b/win/tty/termcap.c @@ -27,11 +27,13 @@ void term_end_extracolor(void); #if (!defined(UNIX) || !defined(TERMINFO)) && !defined(TOS) static void analyze_seq(char *, int *, int *); #endif +#if defined(UNIX) && defined(TERMINFO) +static int indexed_color_count(void); +#endif #endif #if (defined(TERMLIB) || defined(ANSI_DEFAULT)) static void init_hilite(void); static void kill_hilite(void); -static int indexed_color_count(void); #endif /* (see tcap.h) -- nh_CM, nh_ND, nh_CD, nh_HI,nh_HE, nh_US,nh_UE, ul_hack */ @@ -40,12 +42,16 @@ struct tc_lcl_data tc_lcl_data = { 0, 0, 0, 0, 0, 0, 0, FALSE }; static char *nh_VI = (char *) 0; /* cursor_invisible */ static char *nh_VE = (char *) 0; /* cursor_normal */ /*static char *nh_VS = (char *) 0;*/ /* cursor_visible (highlighted cursor) */ +#if defined(TERMLIB) || defined(CHANGE_COLOR) static char *nh_Ic = (char *) 0; /* initialize_color */ +#endif #if !defined(__NetBSD__) static char *UP, *BC; +#ifdef TERMLIB static char PC = '\0'; #endif +#endif static char *HO, *CL, *CE, *XD, *SO, *SE, *TI, *TE; static char *VS, *VE; @@ -1580,13 +1586,7 @@ tty_change_color(int color, long rgb, int reverse UNUSED) #ifndef SEP2 #define tcfmtstr "\033[38;2;%ld;%ld;%ldm" -#ifdef UNIX -#define tcfmtstr24bit "\033[38;2;%u;%u;%um" #define tcfmtstr256 "\033[38;5;%dm" -#else -#define tcfmtstr24bit "\033[38;2;%lu;%lu;%lum" -#define tcfmtstr256 "\033[38:5:%lum" -#endif #endif static void emit24bit(long mcolor); diff --git a/win/tty/wintty.c b/win/tty/wintty.c index c4aa816bd..9b545d8fd 100644 --- a/win/tty/wintty.c +++ b/win/tty/wintty.c @@ -182,7 +182,7 @@ static const char winpanicstr[] = "Bad window Id %d (%s)"; char defmorestr[] = "--More--"; #ifdef CLIPPING -#if defined(TILES_IN_GLYPHMAP) && defined(MSDOS) +#if (defined(TILES_IN_GLYPHMAP) || defined(ENHANCED_SYMBOLS)) && defined(MSDOS) boolean clipping = FALSE; /* clipping on? */ int clipx = 0, clipxmax = 0; int clipy = 0, clipymax = 0; @@ -193,7 +193,7 @@ static int clipy = 0, clipymax = 0; #endif #endif /* CLIPPING */ -#if defined(TILES_IN_GLYPHMAP) && defined(MSDOS) +#if defined(NO_TERMS) && defined(MSDOS) extern void adjust_cursor_flags(struct WinDesc *); #endif @@ -2072,7 +2072,7 @@ tty_curs( print_vt_code2(AVTC_SELECT_WINDOW, window); -#if defined(TILES_IN_GLYPHMAP) && defined(MSDOS) +#if defined(NO_TERMS) && defined(MSDOS) adjust_cursor_flags(cw); #endif