From cb430610766793433d67831eaf28feff585895d0 Mon Sep 17 00:00:00 2001 From: nhmall Date: Fri, 16 Nov 2018 20:51:22 -0500 Subject: [PATCH 01/74] curses changes to existing files --- doc/window.doc | 7 +++ include/config.h | 7 +++ include/flag.h | 19 ++++-- include/ntconf.h | 5 +- include/rm.h | 9 +-- include/winprocs.h | 6 +- src/cmd.c | 2 +- src/drawing.c | 15 ++++- src/options.c | 120 ++++++++++++++++++++++++++++++++++++- src/rip.c | 2 +- src/windows.c | 6 ++ sys/share/pcmain.c | 16 +++-- sys/unix/Makefile.src | 63 +++++++++++++++++-- sys/unix/hints/linux | 7 ++- sys/unix/hints/macosx10.10 | 9 +++ sys/winnt/Makefile.msc | 84 +++++++++++++++++++++----- util/makedefs.c | 3 + win/tty/termcap.c | 7 +++ 18 files changed, 345 insertions(+), 42 deletions(-) diff --git a/doc/window.doc b/doc/window.doc index a564d5b7b..0b7cbf52f 100644 --- a/doc/window.doc +++ b/doc/window.doc @@ -774,6 +774,9 @@ to support: | wraptext | WC2_WRAPTEXT | wc2_wraptext |boolean | | selectsaved | WC2_SELECTSAVED | wc2_selectsaved |boolean | | hitpointbar | WC2_HITPOINTBAR | wc2_hitpointbar |boolean | + | term_cols | WC2_TERM_COLS | wc2_term_cols |int | + | term_rows | WC2_TERM_ROWS | wc2_term_rows |int | + | windowborders | WC2_WINDOWBORDERS | wc2_windowborders |int | +--------------------+--------------------+--------------------+--------+ more wincap2 for STATUS_HILITES support and control @@ -820,6 +823,8 @@ scroll_margin -- port should scroll the display when the hero or cursor selectsaved -- if port can display a menu of the user's saved games do so. softkeyboard -- handhelds should display an on-screen keyboard if possible. splash_screen -- port should/should not display an opening splashscreen. +term_cols -- Terminal should size itself to specified width, if possible. +term_rows -- Terminal should size itself to specified height, if possible. tiled_map -- port should display a tiled map if it can. tile_width -- port should display tiles with this width or round to closest if it can. @@ -830,6 +835,8 @@ tile_file -- open this alternative tile file. The file name is likely to be use_inverse -- port should display inverse when NetHack asks for it. vary_msgcount -- port should display this number of messages at a time in the message window. +windowborders -- port should display borders around main NetHack windows. + Can be set to (1) on, (2) off, or (3) auto. windowcolors -- port should use these colors for window foreground/background colors. Syntax: diff --git a/include/config.h b/include/config.h index ef6d0e534..4f242679a 100644 --- a/include/config.h +++ b/include/config.h @@ -45,6 +45,7 @@ #if !defined(NOTTYGRAPHICS) #define TTY_GRAPHICS /* good old tty based graphics */ #endif +/* #define CURSES_GRAPHICS *//* Curses interface - Karl Garrison*/ /* #define X11_GRAPHICS */ /* X11 interface */ /* #define QT_GRAPHICS */ /* Qt interface */ /* #define GNOME_GRAPHICS */ /* Gnome interface */ @@ -118,6 +119,12 @@ #define DEFAULT_WINDOW_SYS "tty" #endif +#ifdef CURSES_GRAPHICS +#ifndef DEFAULT_WINDOW_SYS +#define DEFAULT_WINDOW_SYS "curses" +#endif +#endif + #ifdef X11_GRAPHICS /* * There are two ways that X11 tiles may be defined. (1) using a custom diff --git a/include/flag.h b/include/flag.h index b8c6a5993..b0be1a0f9 100644 --- a/include/flag.h +++ b/include/flag.h @@ -312,6 +312,7 @@ struct instance_flags { boolean rlecomp; /* alternative to zerocomp; run-length encoding * compression of levels when writing savefile */ uchar num_pad_mode; + boolean cursesgraphics; /* Use portable curses extended characters */ #if 0 /* XXXgraphics superseded by symbol sets */ boolean DECgraphics; /* use DEC VT-xxx extended character set */ boolean IBMgraphics; /* use IBM extended character set */ @@ -323,6 +324,8 @@ struct instance_flags { uchar bouldersym; /* symbol for boulder display */ #ifdef TTY_GRAPHICS char prevmsg_window; /* type of old message window to use */ +#endif +#if defined(TTY_GRAPHICS) || defined(CURSES_GRAPHICS) boolean extmenu; /* extended commands use menu interface */ #endif #ifdef MFLOPPY @@ -363,8 +366,12 @@ struct instance_flags { #ifdef TTY_TILES_ESCCODES boolean vt_tiledata; /* output console codes for tile support in TTY */ #endif - boolean wizweight; /* display weight of everything in wizard mode */ - + boolean wizweight; /* display weight of everything in wizard mode */ + boolean cmdassist; /* provide detailed assistance for some commands */ + boolean clicklook; /* allow right-clicking for look */ + boolean msg_is_alert; /* suggest windowport should grab player's attention + * and request acknowlegement */ + int statuslines; /* default = 2, code support for alternative 3 */ /* * Window capability support. */ @@ -416,8 +423,11 @@ struct instance_flags { boolean wc2_selectsaved; /* display a menu of user's saved games */ boolean wc2_darkgray; /* try to use dark-gray color for black glyphs */ boolean wc2_hitpointbar; /* show graphical bar representing hit points */ - boolean cmdassist; /* provide detailed assistance for some commands */ - boolean clicklook; /* allow right-clicking for look */ + int wc2_term_cols; /* terminal width, in characters */ + int wc2_term_rows; /* terminal height, in characters */ + int wc2_windowborders; /* display borders on NetHack windows */ + int wc2_petattr; /* text attributes for pet */ + boolean wc2_guicolor; /* allow colours in gui (outside map) */ boolean obsolete; /* obsolete options can point at this, it isn't used */ struct autopickup_exception *autopickup_exceptions[2]; #define AP_LEAVE 0 @@ -438,6 +448,7 @@ struct instance_flags { short soko_prize_type1; /* bag of holding or */ short soko_prize_type2; /* amulet of reflection */ struct debug_flags debug; + boolean windowtype_locked; /* windowtype can't change from configfile */ }; /* diff --git a/include/ntconf.h b/include/ntconf.h index c0e2f77c0..73d421fd8 100644 --- a/include/ntconf.h +++ b/include/ntconf.h @@ -93,6 +93,7 @@ extern void FDECL(interject, (int)); * Compiler-specific adjustments *=============================================== */ + #ifdef _MSC_VER #if (_MSC_VER > 1000) /* Visual C 8 warning elimination */ @@ -227,7 +228,9 @@ open(const char _FAR *__path, int __access, ... /*unsigned mode*/); long _RTLENTRY _EXPFUNC lseek(int __handle, long __offset, int __fromwhere); int _RTLENTRY _EXPFUNC read(int __handle, void _FAR *__buf, unsigned __len); #endif -#include +#ifndef CURSES_GRAPHICS +#include /* conflicting definitions with curses.h */ +#endif #undef kbhit /* Use our special NT kbhit */ #define kbhit (*nt_kbhit) diff --git a/include/rm.h b/include/rm.h index 7fd41c47c..1406e5723 100644 --- a/include/rm.h +++ b/include/rm.h @@ -108,7 +108,7 @@ enum levl_typ_types { /* * The screen symbols may be the default or defined at game startup time. * See drawing.c for defaults. - * Note: {ibm|dec}_graphics[] arrays (also in drawing.c) must be kept in + * Note: {ibm|dec|curses}_graphics[] arrays (also in drawing.c) must be kept in * synch. */ @@ -294,9 +294,10 @@ struct symsetentry { * Must match the order of the known_handlers strings * in drawing.c */ -#define H_UNK 0 -#define H_IBM 1 -#define H_DEC 2 +#define H_UNK 0 +#define H_IBM 1 +#define H_DEC 2 +#define H_CURS 3 extern const struct symdef defsyms[MAXPCHARS]; /* defaults */ extern const struct symdef def_warnsyms[WARNCOUNT]; diff --git a/include/winprocs.h b/include/winprocs.h index a0c490f11..326f44eb2 100644 --- a/include/winprocs.h +++ b/include/winprocs.h @@ -216,7 +216,11 @@ extern after updating status window fields */ #define WC2_RESET_STATUS 0x0100L /* 09 call status_update(BL_RESET) to indicate draw everything */ - /* 23 free bits */ +#define WC2_TERM_SIZE 0x0100L /* 10 support setting terminal size */ +#define WC2_WINDOWBORDERS 0x0200L /* 11 display borders on nh windows */ +#define WC2_PETATTR 0x0400L /* 12 attributes for hilite_pet */ +#define WC2_GUICOLOR 0x0800L /* 13 display colours outside map win */ + /* 19 free bits */ #define ALIGN_LEFT 1 #define ALIGN_RIGHT 2 diff --git a/src/cmd.c b/src/cmd.c index b2debe337..8c830b9c3 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -533,7 +533,7 @@ doextlist(VOID_ARGS) return 0; } -#ifdef TTY_GRAPHICS +#if defined(TTY_GRAPHICS) || defined(CURSES_GRAPHICS) #define MAX_EXT_CMD 200 /* Change if we ever have more ext cmds */ /* diff --git a/src/drawing.c b/src/drawing.c index 68fdebdad..5a73d4c3f 100644 --- a/src/drawing.c +++ b/src/drawing.c @@ -264,6 +264,10 @@ void NDECL((*ibmgraphics_mode_callback)) = 0; /* set in tty_start_screen() */ void NDECL((*ascgraphics_mode_callback)) = 0; /* set in tty_start_screen() */ #endif +#ifdef CURSES_GRAPHICS +void NDECL((*cursesgraphics_mode_callback)) = 0; +#endif + /* * Convert the given character to an object class. If the character is not * recognized, then MAXOCLASSES is returned. Used in detect.c, invent.c, @@ -495,6 +499,10 @@ int nondefault; if (SYMHANDLING(H_DEC) && decgraphics_mode_callback) (*decgraphics_mode_callback)(); #endif +# ifdef CURSES_GRAPHICS + if (SYMHANDLING(H_CURS) && cursesgraphics_mode_callback) + (*cursesgraphics_mode_callback)(); +# endif } else init_symbols(); } @@ -544,9 +552,10 @@ boolean name_too; * to this array at the matching offset. */ const char *known_handling[] = { - "UNKNOWN", /* H_UNK */ - "IBM", /* H_IBM */ - "DEC", /* H_DEC */ + "UNKNOWN", /* H_UNK */ + "IBM", /* H_IBM */ + "DEC", /* H_DEC */ + "CURS", /* H_CURS */ (const char *) 0, }; diff --git a/src/options.c b/src/options.c index e337b4c36..21dc510a9 100644 --- a/src/options.c +++ b/src/options.c @@ -28,6 +28,10 @@ NEARDATA struct instance_flags iflags; /* provide linkage */ #define PREFER_TILED FALSE #endif +#ifdef CURSES_GRAPHICS +extern int curses_read_attrs(char *attrs); +#endif + enum window_option_types { MESSAGE_OPTION = 1, STATUS_OPTION, @@ -110,7 +114,7 @@ static struct Bool_Opt { { "confirm", &flags.confirm, TRUE, SET_IN_GAME }, { "dark_room", &flags.dark_room, TRUE, SET_IN_GAME }, { "eight_bit_tty", &iflags.wc_eight_bit_input, FALSE, SET_IN_GAME }, /*WC*/ -#ifdef TTY_GRAPHICS +#if defined(TTY_GRAPHICS) || defined(CURSES_GRAPHICS) { "extmenu", &iflags.extmenu, FALSE, SET_IN_GAME }, #else { "extmenu", (boolean *) 0, FALSE, SET_IN_FILE }, @@ -130,6 +134,7 @@ static struct Bool_Opt { { "force_invmenu", &iflags.force_invmenu, FALSE, SET_IN_GAME }, { "fullscreen", &iflags.wc2_fullscreen, FALSE, SET_IN_FILE }, { "goldX", &iflags.goldX, FALSE, SET_IN_GAME }, + { "guicolor", &iflags.wc2_guicolor, TRUE, SET_IN_GAME}, { "help", &flags.help, TRUE, SET_IN_GAME }, { "herecmd_menu", &iflags.herecmd_menu, FALSE, SET_IN_GAME }, { "hilite_pet", &iflags.wc_hilite_pet, FALSE, SET_IN_GAME }, /*WC*/ @@ -161,7 +166,11 @@ static struct Bool_Opt { { "menu_overlay", (boolean *) 0, FALSE, SET_IN_FILE }, #endif { "monpolycontrol", &iflags.mon_polycontrol, FALSE, SET_IN_WIZGAME }, +#ifdef CURSES_GRAPHICS + { "mouse_support", &iflags.wc_mouse_support, FALSE, DISP_IN_GAME }, /*WC*/ +#else { "mouse_support", &iflags.wc_mouse_support, TRUE, DISP_IN_GAME }, /*WC*/ +#endif #ifdef NEWS { "news", &iflags.news, TRUE, DISP_IN_GAME }, #else @@ -326,7 +335,7 @@ static struct Comp_Opt { { "monsters", "the symbols to use for monsters", MAXMCLASSES, SET_IN_FILE }, { "msghistory", "number of top line messages to save", 5, DISP_IN_GAME }, -#ifdef TTY_GRAPHICS +#if defined(TTY_GRAPHICS) || defined(CURSES_GRAPHICS) { "msg_window", "the type of message window required", 1, SET_IN_GAME }, #else { "msg_window", "the type of message window required", 1, SET_IN_FILE }, @@ -352,6 +361,7 @@ static struct Comp_Opt { #endif { "paranoid_confirmation", "extra prompting in certain situations", 28, SET_IN_GAME }, + { "petattr", "attributes for highlighting pets", 12, SET_IN_FILE }, { "pettype", "your preferred initial pet type", 4, DISP_IN_GAME }, { "pickup_burden", "maximum burden picked up before prompt", 20, SET_IN_GAME }, @@ -386,6 +396,13 @@ static struct Comp_Opt { 20, SET_IN_GAME }, #else { "statushilites", "highlight control", 20, SET_IN_FILE }, +#endif +#ifdef CURSES_GRAPHICS + { "statuslines", + "0,1,2 = classic behavior, 3 = alternative behavior", + 20, DISP_IN_GAME }, +#else + { "statuslines", "# of status lines", 20, SET_IN_FILE }, #endif { "symset", "load a set of display symbols from the symbols file", 70, SET_IN_GAME }, @@ -427,6 +444,9 @@ static struct Comp_Opt { #ifdef BACKWARD_COMPAT { "DECgraphics", "load DECGraphics display symbols", 70, SET_IN_FILE }, { "IBMgraphics", "load IBMGraphics display symbols", 70, SET_IN_FILE }, +#ifdef CURSES_GRAPHICS + {"cursesgraphics", "load curses display symbols", 70, SET_IN_FILE}, +#endif #ifdef MAC_GRAPHICS_ENV { "Macgraphics", "load MACGraphics display symbols", 70, SET_IN_FILE }, #endif @@ -3462,6 +3482,8 @@ boolean tinitial, tfrom_file; */ fullname = "windowtype"; if (match_optname(opts, fullname, 3, TRUE)) { + if (iflags.windowtype_locked) + return retval; if (duplicate) complain_about_duplicate(opts, 1); if (negated) { @@ -3509,6 +3531,74 @@ boolean tinitial, tfrom_file; bad_negation(fullname, TRUE); return retval; } +#ifdef CURSES_GRAPHICS + /* WINCAP2 + * term_cols:amount */ + fullname = "term_cols"; + if (match_optname(opts, fullname, sizeof("term_cols")-1, TRUE)) { + op = string_for_opt(opts, negated); + iflags.wc2_term_cols = atoi(op); + if (negated) + bad_negation(fullname, FALSE); + return retval; + } + + /* WINCAP2 + * term_rows:amount */ + fullname = "term_rows"; + if (match_optname(opts, fullname, sizeof("term_rows")-1, TRUE)) { + op = string_for_opt(opts, negated); + iflags.wc2_term_rows = atoi(op); + if (negated) + bad_negation(fullname, FALSE); + return retval; + } + + /* WINCAP2 + * petattr:string */ + fullname = "petattr"; + if (match_optname(opts, fullname, sizeof("petattr")-1, TRUE)) { + op = string_for_opt(opts, negated); + if (op && !negated) { +#ifdef CURSES_GRAPHICS + iflags.wc2_petattr = curses_read_attrs(op); + if (!curses_read_attrs(op)) + config_error_add("Unknown %s parameter '%s'", fullname, opts); + return FALSE; +#else + /* non-curses windowports will not use this flag anyway + * but the above will not compile if we don't have curses. + * Just set it to a sensible default: */ + iflags.wc2_petattr = ATR_INVERSE +#endif + } else if (negated) bad_negation(fullname, TRUE); + return retval; + } + + /* WINCAP2 + * windowborders:n */ + fullname = "windowborders"; + if (match_optname(opts, fullname, sizeof("windowborders")-1, TRUE)) { + op = string_for_opt(opts, negated); + if (negated && op) + bad_negation(fullname, TRUE); + else { + if (negated) + iflags.wc2_windowborders = 2; /* Off */ + else if (!op) + iflags.wc2_windowborders = 1; /* On */ + else /* Value supplied */ + iflags.wc2_windowborders = atoi(op); + if ((iflags.wc2_windowborders > 3) + || (iflags.wc2_windowborders < 1)) { + iflags.wc2_windowborders = 0; + config_error_add( + "Badoption - windowborders %s.", opts); + } + } + return retval; + } +#endif /* menustyle:traditional or combination or full or partial */ fullname = "menustyle"; @@ -3852,6 +3942,10 @@ boolean tinitial, tfrom_file; status_initialize(REASSESS_ONLY); need_redraw = TRUE; #endif +#ifdef CURSES_GRAPHICS + } else if ((boolopt[i].addr) == &iflags.cursesgraphics) { + need_redraw = TRUE; +#endif #ifdef TEXTCOLOR } else if (boolopt[i].addr == &iflags.use_color) { need_redraw = TRUE; @@ -5514,6 +5608,18 @@ char *buf; symset[PRIMARY].name ? symset[PRIMARY].name : "default"); if (currentgraphics == PRIMARY && symset[PRIMARY].name) Strcat(buf, ", active"); +#ifdef CURSES_GRAPHICS + } else if (!strcmp(optname, "term_cols")) { + if (iflags.wc2_term_cols) + Sprintf(buf, "%d", iflags.wc2_term_cols); + else + Strcpy(buf, defopt); + } else if (!strcmp(optname, "term_rows")) { + if (iflags.wc2_term_rows) + Sprintf(buf, "%d",iflags.wc2_term_rows); + else + Strcpy(buf, defopt); +#endif } else if (!strcmp(optname, "tile_file")) { Sprintf(buf, "%s", iflags.wc_tile_file ? iflags.wc_tile_file : defopt); @@ -5550,6 +5656,13 @@ char *buf; ttycolors[CLR_YELLOW], ttycolors[CLR_BRIGHT_BLUE], ttycolors[CLR_BRIGHT_MAGENTA], ttycolors[CLR_BRIGHT_CYAN]); #endif /* VIDEOSHADES */ +#ifdef CURSES_GRAPHICS + } else if (!strcmp(optname,"windowborders")) { + Sprintf(buf, "%s", + iflags.wc2_windowborders == 1 ? "1=on" : + iflags.wc2_windowborders == 2 ? "2=off" : + iflags.wc2_windowborders == 3 ? "3=auto" : defopt); +#endif } else if (!strcmp(optname, "windowtype")) { Sprintf(buf, "%s", windowprocs.name); } else if (!strcmp(optname, "windowcolors")) { @@ -6217,6 +6330,9 @@ static struct wc_Opt wc2_options[] = { { "status hilite rules", WC2_HILITE_STATUS }, /* statushilites doesn't have its own bit */ { "statushilites", WC2_HILITE_STATUS }, +#ifdef CURSES_GRAPHICS + {"windowborders", WC2_WINDOWBORDERS}, +#endif { (char *) 0, 0L } }; diff --git a/src/rip.c b/src/rip.c index 6e48dde45..f6fba01bc 100644 --- a/src/rip.c +++ b/src/rip.c @@ -6,7 +6,7 @@ #include "hack.h" #if defined(TTY_GRAPHICS) || defined(X11_GRAPHICS) || defined(GEM_GRAPHICS) \ - || defined(MSWIN_GRAPHICS) || defined(DUMPLOG) + || defined(MSWIN_GRAPHICS) || defined(DUMPLOG) || defined(CURSES_GRAPHICS) #define TEXT_TOMBSTONE #endif #if defined(mac) || defined(__BEOS__) || defined(WIN32_GRAPHICS) diff --git a/src/windows.c b/src/windows.c index 3a9471224..9e7ffe5b3 100644 --- a/src/windows.c +++ b/src/windows.c @@ -6,6 +6,9 @@ #ifdef TTY_GRAPHICS #include "wintty.h" #endif +#ifdef CURSES_GRAPHICS +extern struct window_procs curses_procs; +#endif #ifdef X11_GRAPHICS /* Cannot just blindly include winX.h without including all of X11 stuff and must get the order of include files right. Don't bother. */ @@ -92,6 +95,9 @@ static struct win_choices { #ifdef TTY_GRAPHICS { &tty_procs, win_tty_init CHAINR(0) }, #endif +#ifdef CURSES_GRAPHICS + { &curses_procs, 0 }, +#endif #ifdef X11_GRAPHICS { &X11_procs, win_X11_init CHAINR(0) }, #endif diff --git a/sys/share/pcmain.c b/sys/share/pcmain.c index 393dd0d8d..93674ab34 100644 --- a/sys/share/pcmain.c +++ b/sys/share/pcmain.c @@ -98,8 +98,12 @@ char *argv[]; nethack_enter(argc, argv); sys_early_init(); -#ifdef WIN32 +#if defined(WIN32) && defined(TTY_GRAPHICS) Strcpy(default_window_sys, "tty"); +#else +#if defined(CURSES_GRAPHICS) + Strcpy(default_window_sys, "curses"); +#endif #endif resuming = pcmain(argc, argv); @@ -173,6 +177,10 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ choose_windows(DEFAULT_WINDOW_SYS); #else choose_windows(default_window_sys); + if (argc > 1 + && !strcmpi(default_window_sys, "mswin") + && strstri(argv[0], "nethackw.exe")) + iflags.windowtype_locked = TRUE; #endif #if !defined(AMIGA) && !defined(GNUDOS) @@ -500,9 +508,9 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ } else { iflags.use_background_glyph = TRUE; } -#endif -#endif -#endif +#endif /* TTY_GRAPHICS */ +#endif /* WIN32 */ +#endif /* MSDOS || WIN32 */ #if defined(MSDOS) || defined(WIN32) init_nhwindows(&argc, argv); diff --git a/sys/unix/Makefile.src b/sys/unix/Makefile.src index 4fac84eec..bfe32f285 100644 --- a/sys/unix/Makefile.src +++ b/sys/unix/Makefile.src @@ -146,6 +146,15 @@ SYSOBJ = ioctl.o unixmain.o unixtty.o unixunix.o unixres.o #LINK = gcc #LFLAGS = -Xlinker -soname=_APP_ +# Compile with PDCurses installed in a separate directory that doesn't +# conflict with the system curses/ncurses library +#CFLAGS = -O -I../include -I/usr/local/include/pdcurses +# Same as above, but for XCurses +#CFLAGS = -O -DXCURSES -I../include -I/usr/local/include/pdcurses +# Compile against system curses library, such as ncurses +#CFLAGS = -O -I../include + + # Only used for the Gnome interface. # When including the Gnome interface, you need to include gnome specific # directories. The ones given below is the usual spot for linux systems. @@ -190,6 +199,14 @@ WINTTYSRC = ../win/tty/getline.c ../win/tty/termcap.c ../win/tty/topl.c \ ../win/tty/wintty.c WINTTYOBJ = getline.o termcap.o topl.o wintty.o # +# Files for curses interface +WINCURSESSRC = ../win/curses/cursmain.c ../win/curses/curswins.c \ + ../win/curses/cursmisc.c ../win/curses/cursdial.c \ + ../win/curses/cursstat.c ../win/curses/cursinit.c \ + ../win/curses/cursmesg.c ../win/curses/cursinvt.c +WINCURSESOBJ = cursmain.o curswins.o cursmisc.o cursdial.o cursstat.o \ + cursinit.o cursmesg.o cursinvt.o +# # files for an X11 port # (tile.c is a generated source file) WINX11SRC = ../win/X11/Window.c ../win/X11/dialogs.c ../win/X11/winX.c \ @@ -243,12 +260,15 @@ WINBEOBJ = #WINBESRC = ../win/BeOS/winbe.cpp ../win/BeOS/NHWindow.cpp \ # ../win/BeOS/NHMenuWindow.cpp ../win/BeOS/NHMapWindow.cpp tile.c #WINBEOBJ = winbe.o NHWindow.o NHMenuWindow.o NHMapWindow.o tile.o - # # #WINSRC = $(WINTTYSRC) #WINOBJ = $(WINTTYOBJ) - +# +# Curses - Karl Garrison, Tangles +#WINSRC = $(WINCURSESSRC) +#WINOBJ = $(WINCURSESOBJ) +# # on some systems the termcap library is in -ltermcap or -lcurses # on 386 Xenix, the -ltermlib tputs() seems not to work; use -lcurses instead # Sysatt uses shared library in lieu of this option @@ -272,6 +292,7 @@ WINX11LIB = -lXaw -lXmu -lXext -lXt -lX11 # WINX11LIB = -lXaw -lXmu -lXext -lXt -lXpm -lX11 -lm # WINX11LIB = -lXaw -lXmu -lXpm -lXext -lXt -lX11 -lSM -lICE -lm # BSD/OS 2.0 # +# # libraries for Qt 3 WINQTLIB = -L$(QTDIR)/lib -lqt # @@ -292,9 +313,20 @@ WINGEMLIB = -le_gem -lgem # # libraries for BeOS WINBELIB = -lbe - +# +# libraries for curses port +# link with ncurses +WINCURSESLIB = -lncurses +# link with pdcurses for SDL, installed in a separate directory +#WINCURSESLIB = -L/usr/local/lib/pdcurses -lpdcurses -lSDL +# same as above, for XCurses +#WINCURSESLIB = -L/usr/local/lib/pdcurses -lXCurses -lXawM -lXmu -lXext -lXt -lX11 +# #WINLIB = $(WINTTYLIB) - +# +# For Curses +#WINLIB = $(WINCURSESLIB) +# # any other strange libraries your system needs (for Sysunix only -- the more # specialized targets should already be right) # @@ -743,6 +775,29 @@ topl.o: ../win/tty/topl.c $(HACK_H) ../include/tcap.h $(CC) $(CFLAGS) -c ../win/tty/topl.c wintty.o: ../win/tty/wintty.c $(HACK_H) ../include/dlb.h ../include/tcap.h $(CC) $(CFLAGS) -c ../win/tty/wintty.c +cursmain.o: ../win/curses/cursmain.c $(HACK_H) ../include/wincurs.h + $(CC) $(CFLAGS) -c ../win/curses/cursmain.c +curswins.o: ../win/curses/curswins.c $(HACK_H) ../include/func_tab.h \ + ../include/wincurs.h ../win/curses/curswins.h + $(CC) $(CFLAGS) -c ../win/curses/curswins.c +cursmisc.o: ../win/curses/cursmisc.c $(HACK_H) ../include/wincurs.h \ + ../win/curses/cursmisc.h + $(CC) $(CFLAGS) -c ../win/curses/cursmisc.c +cursdial.o: ../win/curses/cursdial.c $(HACK_H) ../include/func_tab.h \ + ../include/wincurs.h ../win/curses/cursdial.h + $(CC) $(CFLAGS) -c ../win/curses/cursdial.c +cursstat.o: ../win/curses/cursstat.c $(HACK_H) ../include/wincurs.h \ + ../win/curses/cursstat.h + $(CC) $(CFLAGS) -c ../win/curses/cursstat.c +cursinit.o: ../win/curses/cursinit.c $(HACK_H) ../include/wincurs.h \ + ../win/curses/cursinit.h + $(CC) $(CFLAGS) -c ../win/curses/cursinit.c +cursinvt.o: ../win/curses/cursinvt.c $(HACK_H) ../include/wincurs.h \ + ../win/curses/cursinvt.h + $(CC) $(CFLAGS) -c ../win/curses/cursinvt.c +cursmesg.o: ../win/curses/cursmesg.c $(HACK_H) ../include/wincurs.h \ + ../win/curses/cursmesg.h + $(CC) $(CFLAGS) -c ../win/curses/cursmesg.c Window.o: ../win/X11/Window.c ../include/xwindowp.h ../include/xwindow.h \ $(CONFIG_H) ../include/lint.h $(CC) $(CFLAGS) -c ../win/X11/Window.c diff --git a/sys/unix/hints/linux b/sys/unix/hints/linux index 4dc6b2f53..cb0317946 100644 --- a/sys/unix/hints/linux +++ b/sys/unix/hints/linux @@ -27,14 +27,15 @@ CFLAGS+=-DTIMED_DELAY CFLAGS+=-DHACKDIR=\"$(HACKDIR)\" CFLAGS+=-DDUMPLOG CFLAGS+=-DCONFIG_ERROR_SECURE=FALSE +CFLAGS+=-DCURSES_GRAPHICS LINK=$(CC) # Only needed for GLIBC stack trace: LFLAGS=-rdynamic -WINSRC = $(WINTTYSRC) -WINOBJ = $(WINTTYOBJ) -WINLIB = $(WINTTYLIB) +WINSRC = $(WINTTYSRC) $(WINCURSESSRC) +WINOBJ = $(WINTTYOBJ) $(WINCURSESOBJ) +WINLIB = $(WINTTYLIB) $(WINCURSESLIB) WINTTYLIB=-lcurses diff --git a/sys/unix/hints/macosx10.10 b/sys/unix/hints/macosx10.10 index f320e25fb..a08b27acc 100644 --- a/sys/unix/hints/macosx10.10 +++ b/sys/unix/hints/macosx10.10 @@ -21,11 +21,13 @@ WANT_WIN_TTY=1 #WANT_WIN_X11=1 #WANT_WIN_QT=1 +#WANT_WIN_CURSES=1 # 1a. What is the default window system? WANT_DEFAULT=tty #WANT_DEFAULT=x11 #WANT_DEFAULT=qt +#WANT_DEFAULT=curses # 1b. If you set WANT_WIN_QT, you need to # A) set QTDIR either here or in the environment to point to the Qt2 or Qt3 @@ -96,6 +98,13 @@ else # !WANT_WIN_TTY CFLAGS += -DNOTTYGRAPHICS endif # !WANT_WIN_TTY +ifdef WANT_WIN_CURSES +CFLAGS += -DCURSES_GRAPHICS +WINSRC += $(WINCURSESSRC) +WINOBJ += $(WINCURSESOBJ) +WINLIB += -lncurses +endif + ifdef WANT_WIN_X11 WINSRC += $(WINX11SRC) WINOBJ += $(WINX11OBJ) diff --git a/sys/winnt/Makefile.msc b/sys/winnt/Makefile.msc index f86a67acc..7f908c637 100644 --- a/sys/winnt/Makefile.msc +++ b/sys/winnt/Makefile.msc @@ -61,6 +61,19 @@ DEBUGINFO = Y #TARGET_CPU=x64 #TARGET_CPU=x86 +#--------------------------------------------------------------- +# OPTIONAL - Curses window port support +# +# 4. Uncomment these and set them appropriate if you want to +# include curses port support alongside TTY support in your +# console binary. You'll have to set CURSESINCL to the location +# of your curses header (.h) files and CURSESDLL to the location +# of your pdcurses.dll. +# +ADD_CURSES=Y +CURSESINCL=..\..\pdcurses +CURSESLIB=..\..\pdcurses\wincon\pdcurses.lib +# #============================================================================== # This marks the end of the BUILD DECISIONS section. #============================================================================== @@ -85,16 +98,17 @@ DEBUGINFO = Y # Source directories. Makedefs hardcodes these, don't change them. # -INCL = ..\include # NetHack include files -DAT = ..\dat # NetHack data files -DOC = ..\doc # NetHack documentation files -UTIL = ..\util # Utility source -SRC = ..\src # Main source -SSYS = ..\sys\share # Shared system files -MSWSYS= ..\sys\winnt # mswin specific files -TTY = ..\win\tty # window port files (tty) -MSWIN = ..\win\win32 # window port files (WIN32) -WSHR = ..\win\share # Tile support files +INCL = ..\include # NetHack include files +DAT = ..\dat # NetHack data files +DOC = ..\doc # NetHack documentation files +UTIL = ..\util # Utility source +SRC = ..\src # Main source +SSYS = ..\sys\share # Shared system files +MSWSYS = ..\sys\winnt # mswin specific files +TTY = ..\win\tty # window port files (tty) +MSWIN = ..\win\win32 # window port files (win32) +CURSES = ..\win\curses # window port files (curses) +WSHR = ..\win\share # Tile support files # # Object directory. @@ -203,6 +217,15 @@ VSVER=2999 #untested future version #---------------------------------------------------------------- +!IF "$(ADD_CURSES)" == "Y" +#CURSESDEF=-D"PDC_DLL_BUILD" -D"CURSES_GRAPHICS" -D"CURSES_BRIEF_INCLUDE" +CURSESDEF=-D"CURSES_GRAPHICS" -D"CURSES_BRIEF_INCLUDE" +!ELSE +CURSDEF= +CURSESLIB= +CURSESINCL= +!ENDIF + #These will be in the environment variables with one of the VS2017 #developer command prompts. #VSCMD_ARG_HOST_ARCH=x64 @@ -234,7 +257,8 @@ CL_RECENT=-sdl ccommon= -c -nologo -D"_CONSOLE" -D"_CRT_NONSTDC_NO_DEPRECATE" -D"_CRT_SECURE_NO_DEPRECATE" \ -D"_LIB" -D"_SCL_SECURE_NO_DEPRECATE" -D"_VC80_UPGRADE=0x0600" -D"DLB" -D"_MBCS" \ - -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -D"NDEBUG" -D"YY_NO_UNISTD_H" -EHsc -fp:precise -Gd -GF -GS -Gy \ + -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -D"NDEBUG" -D"YY_NO_UNISTD_H" $(CURSESDEF) \ + -EHsc -fp:precise -Gd -GF -GS -Gy \ $(CL_RECENT) -WX- -Zc:forScope -Zc:wchar_t -Zi cdebug= -analyze- -D"_DEBUG" -Gm -MTd -RTC1 -Od crelease= -analyze- -D"_MBCS" -errorReport:prompt -Gm- -MT -O2 -Ot -Ox -Oy @@ -300,7 +324,12 @@ conlibs = $(baselibs) guilibs = $(winlibs) # +!IFNDEF ADD_CURSES INCLDIR= /I..\include /I..\sys\winnt +!ELSE +INCLDIR= /I..\include /I..\sys\winnt /I$(CURSESINCL) +!ENDIF + #========================================== # Util builds @@ -313,7 +342,7 @@ lflagsBuild = $(lflags) $(conlibs) $(MACHINE) # - Game build #========================================== -LIBS= user32.lib winmm.lib $(ZLIB) +LIBS= user32.lib winmm.lib $(ZLIB) $(CURSESLIB) ! IF ("$(USE_DLB)"=="Y") DLB = nhdat @@ -406,6 +435,13 @@ REGEX = $(O)cppregex.o TTYOBJ = $(O)topl.o $(O)getline.o $(O)wintty.o +!IFNDEF ADD_CURSES +CURSESOBJ= +!ELSE +CURSESOBJ= $(O)cursdial.o $(O)cursinit.o $(O)cursinvt.o $(O)cursmain.o \ + $(O)cursmesg.o $(O)cursmisc.o $(O)cursstat.o $(O)curswins.o +!ENDIF + SOBJ = $(O)winnt.o $(O)pcsys.o $(O)pcunix.o \ $(SOUND) $(O)nhlan.o @@ -414,7 +450,8 @@ OBJS = $(VOBJ01) $(VOBJ02) $(VOBJ03) $(VOBJ04) $(VOBJ05) \ $(VOBJ11) $(VOBJ12) $(VOBJ13) $(VOBJ14) $(VOBJ15) \ $(VOBJ16) $(VOBJ17) $(VOBJ18) $(VOBJ19) $(VOBJ20) \ $(VOBJ21) $(VOBJ22) $(VOBJ23) $(VOBJ24) $(VOBJ25) \ - $(VOBJ26) $(VOBJ27) $(VOBJ28) $(VOBJ29) $(REGEX) + $(VOBJ26) $(VOBJ27) $(VOBJ28) $(VOBJ29) $(REGEX) \ + $(CURSESOBJ) GUIOBJ = $(O)mhaskyn.o $(O)mhdlg.o \ $(O)mhfont.o $(O)mhinput.o $(O)mhmain.o $(O)mhmap.o \ @@ -524,6 +561,19 @@ DATABASE = $(DAT)\data.base {$(UTIL)}.c{$(OBJ)}.o: @$(cc) $(cflagsBuild) -Fo$@ $< +#========================================== +# Rules for files in win\curses +#========================================== + +{$(CURSES)}.c{$(OBJ)}.o: + @$(cc) $(cflagsBuild) -Fo$@ $< + +{$(CURSES)}.h{$(INCL)}.h: + @copy $< $@ + +#{$(CURSES)}.txt{$(DAT)}.txt: +# @copy $< $@ + #========================================== # Rules for files in win\share #========================================== @@ -592,7 +642,7 @@ $(O)install.tag: $(DAT)\data $(DAT)\rumors $(DAT)\dungeon \ if exist $(DOC)\nethack.txt copy $(DOC)\nethack.txt $(GAMEDIR)\NetHack.txt @if exist $(GAMEDIR)\NetHack.PDB echo NOTE: You may want to remove $(GAMEDIR:\=/)/NetHack.PDB to conserve space @if exist $(GAMEDIR)\NetHackW.PDB echo NOTE: You may want to remove $(GAMEDIR:\=/)/NetHackW.PDB to conserve space - -copy $(MSWSYS)\defaults.nh $(GAMEDIR)\defaults.nh + -if not exist $(GAMEDIR)\defaults.nh copy $(MSWSYS)\defaults.nh $(GAMEDIR)\defaults.nh -if not exist $(GAMEDIR)\record. goto>$(GAMEDIR)\record. echo install done > $@ @@ -987,6 +1037,12 @@ $(O)envchk.tag: $(O)obj.tag ! ELSE @echo Windows x86 32-bit target build ! ENDIF +!IFDEF TTYOBJ + @echo tty window support included +! IF "$(ADD_CURSES)"=="Y" + @echo curses window support also included +! ENDIF +!ENDIF ! IF "$(CL)"!="" # @echo Warning, the CL Environment variable is defined: # @echo CL=$(CL) diff --git a/util/makedefs.c b/util/makedefs.c index c41471b2c..39816cb12 100644 --- a/util/makedefs.c +++ b/util/makedefs.c @@ -1650,6 +1650,9 @@ static struct win_info window_opts[] = { #ifdef TTY_GRAPHICS { "tty", "traditional tty-based graphics" }, #endif +#ifdef CURSES_GRAPHICS + { "curses", "terminal-based graphics using curses libraries" }, +#endif #ifdef X11_GRAPHICS { "X11", "X11" }, #endif diff --git a/win/tty/termcap.c b/win/tty/termcap.c index 5f344f04b..c373df04c 100644 --- a/win/tty/termcap.c +++ b/win/tty/termcap.c @@ -1271,6 +1271,13 @@ int color; if (windowprocs.name != NULL && !strcmpi(windowprocs.name, "Qt")) return 1; #endif +#ifdef CURSES_GRAPHICS + /* XXX has_color() should be added to windowprocs */ + /* iflags.wc_color is set to false and the option disabled if the + terminal cannot display color */ + if (windowprocs.name != NULL && !strcmpi(windowprocs.name, "curses")) + return iflags.wc_color; +#endif #ifdef AMII_GRAPHICS /* hilites[] not used */ return iflags.use_color ? 1 : 0; From 748280d5dc9575f26caccf03525d637acf93c588 Mon Sep 17 00:00:00 2001 From: nhmall Date: Fri, 16 Nov 2018 20:53:38 -0500 Subject: [PATCH 02/74] curses new file additions --- win/curses/Bugs.txt | 13 + win/curses/Readme.txt | 116 +++ win/curses/Todo.txt | 146 ++++ win/curses/cursdial.c | 1387 ++++++++++++++++++++++++++++++++++++ win/curses/cursdial.h | 23 + win/curses/cursinit.c | 923 ++++++++++++++++++++++++ win/curses/cursinit.h | 17 + win/curses/cursinvt.c | 111 +++ win/curses/cursinvt.h | 11 + win/curses/cursmain.c | 820 +++++++++++++++++++++ win/curses/cursmesg.c | 630 ++++++++++++++++ win/curses/cursmesg.h | 19 + win/curses/cursmisc.c | 880 +++++++++++++++++++++++ win/curses/cursmisc.h | 30 + win/curses/cursstat.c | 1583 +++++++++++++++++++++++++++++++++++++++++ win/curses/cursstat.h | 21 + win/curses/curswins.c | 752 ++++++++++++++++++++ win/curses/curswins.h | 33 + 18 files changed, 7515 insertions(+) create mode 100644 win/curses/Bugs.txt create mode 100644 win/curses/Readme.txt create mode 100644 win/curses/Todo.txt create mode 100644 win/curses/cursdial.c create mode 100644 win/curses/cursdial.h create mode 100644 win/curses/cursinit.c create mode 100644 win/curses/cursinit.h create mode 100644 win/curses/cursinvt.c create mode 100644 win/curses/cursinvt.h create mode 100644 win/curses/cursmain.c create mode 100644 win/curses/cursmesg.c create mode 100644 win/curses/cursmesg.h create mode 100644 win/curses/cursmisc.c create mode 100644 win/curses/cursmisc.h create mode 100644 win/curses/cursstat.c create mode 100644 win/curses/cursstat.h create mode 100644 win/curses/curswins.c create mode 100644 win/curses/curswins.h diff --git a/win/curses/Bugs.txt b/win/curses/Bugs.txt new file mode 100644 index 000000000..86b731b43 --- /dev/null +++ b/win/curses/Bugs.txt @@ -0,0 +1,13 @@ +Here is a list of known issues with the curses interface at the time of +this writing. Send any others you discover to me (Karl Garrison) at +kgarrison@obox.com, along with how to reproduce the problem, if +possible. Missing features are listed in the file Todo.txt. + + * Resizing a window to 80 columns or less causes a crash (PDCurses for + SDL and X11 only). Windows starting at this size and below do not + cause a crash, however. + + * Cursor position is wrong on map for smaller terminal windows in all + versions of PDCurses (smaller than 80 width or 24 height). This is + due to an incomplete workaround for an issue with the wmove() function + in PDCurses. diff --git a/win/curses/Readme.txt b/win/curses/Readme.txt new file mode 100644 index 000000000..f9c95fdef --- /dev/null +++ b/win/curses/Readme.txt @@ -0,0 +1,116 @@ +INTRO +===== + +The "curses" windowport is a new text-based interface for NetHack, +using high-level curses routines to control the display. Currently, it +has been compiled and tested on Linux and Windows, but it should also +be portable to a number of other systems, such as other forms of UNIX, +Mac OS X, MSDOS, and OS/2. + +Some features of this interface compared to the traditional tty +interface include: + + * Dynamic window resizing (e.g. maximizing a terminal window) + * Dynamic configurable placement of status and message windows, + relative to the map + * Makes better use of larger terminal windows + * Fancier display (e.g. window borders, optional popup dialogs) + * "cursesgraphics" option for fancier line-drawing characters for + drawing the dungeon - this should work on most terminals/platforms + + +BUILDING +======== + +As of this writing code has been compiled on Linux and Windows. + +UNIX/Linux build instructions: Follow the instructions in +sys/unix/Install.unx. By default, the Makefile is setup to compile +against ncurses. Edit Makefile.src if you wish to compile against a +different curses library, such as PDCurses for SDL. + +Windows build instructions: If you are using Mingw32 as your compiler, +then follow the instructions in sys/winnt/Install.nt with the following +changes: + + * After running nhsetup, manually copy the file cursmake.gcc to the + src/ subdirectory + * Instead of typing "mingw32-make -f Makefile.gcc install" you will + type "mingw32-make -f cursmake.gcc install" + +If you are using a different compiler, you will have to manually modify +the appropriate Makefile to include the curses windowport files. + + +GAMEPLAY +======== + +Gameplay should be similar to the tty interface for NetHack; the +differences are primarily visual. This windowport supports dymanic +resizing of the terminal window, so you can play with it to see how it +looks best to you during a game. Also, the align_status and +align_message options may be set during the game, so you can experiment +to see what arraingement looks best to you. + +For menus, in addition to the normal configurable keybindings for menu +navigation descrived in the Guidebook, you can use the right and left +arrows to to forward or backward one page, respectively, and the home +and end keys to go to the first and last pages, respectively. + +Some configuration options that are specific to or relevant to the +curses windowport are shown below. Copy any of these that you like to +your nethack configuration file (e.g. .nethackrc for UNIX or +NetHack.cnf for Windows): +# +# Use this if the binary was compiled with multiple window interfaces, +# and curses is not the default +OPTIONS=windowtype:curses +# +# Set this for Windows systems, or for PDCurses for SDL on any system. +# The latter uses a cp437 font, which works with this option +#OPTIONS=IBMgraphics +# +# Set this if IBMgraphics above won't work for your system. Mutually +# exclusive with the above option, and should work on nearly any +# system. +OPTIONS=cursesgraphics +# +# Optionally specify the alignment of the message and status windows +# relative to the map window. If not specified, the code will default +# to the locations used in the tty interface: message window on top, +# and status window on bottom. Placing either of these on the right or +# left really only works well for winder terminal windows. +OPTIONS=align_message:bottom,align_status:right +# +# Use a small popup "window" for short prompts, e.g. "Really save?". +# If this is not set, the message window will be used for these as is +# done for the tty interface. +OPTIONS=popup_dialog +# +# Specify the initial window size for NetHack in units of characters. +# This is supported on PDCurses for SDL as well as PDCurses for +# Windows. +OPTIONS=term_cols:110,term_rows:32 +# +# Controls the usage of window borders for the main NetHack windows +# (message, map, and status windows). A value of 1 forces the borders +# to be drawn, a value of 2 forces them to be off, and a value of 3 +# allows the code to decide if they should be drawn based on the size +# of the terminal window. +OPTIONS=windowborders:3 + + +CONTACT +======= + +Please send any bug reports, suggestions, patches, or miscellaneous +feedback to me (Karl Garrison) at: kgarrison@pobox.com. Note that as +of this writing, I only have sporatic Internet access, so I may not get +back to you right away. + +Happy Hacking! + +Karl Garrison +March, 2009 + + diff --git a/win/curses/Todo.txt b/win/curses/Todo.txt new file mode 100644 index 000000000..b92327790 --- /dev/null +++ b/win/curses/Todo.txt @@ -0,0 +1,146 @@ +Below are some things I would like to see + +NETHACK INTERFACE +================= + +(These are the functions in cursmain.c called by the core NetHack code) + + * Implement curses_rip for optional fancier color tombstone, as well + as one that will display correctly on smaller terminals. + + * I am confused as to how mark_synch, wait_synch, and delay_output + should work. Help, please? + + * Both PDCurses and Ncurses have mouse support, so the poskey function + could probably be implemented easily enough. + + * raw_print is supposed to be able to work before the windowing system + has been initialized, as well as after, so I am unsure if curses + functions should be used here. Maybe check to see if initscr() has + been called, and use curses functions if so, and call initscr() from + there is not? Right now it is just a call to puts() with no support + for bold text. + + +DISPLAY +======= + + * Consolidate refreshes of the display for smoother output. + + * Horizontal scrollbar to show position for displays < 80 columns. + + * Calls to getch() should probably be turned into wgetch() for the + appropriate window. This causes quirty cursor behavior under + PDCurses, however. + + * Animation effects do not display properly - this could probably be + fixed with a correct implementation of the delay_output function. + + * Support option to set forground and background colors for individual + windows + + +MENUS +===== + +(cursdial.c) + + * Menus need to be able to accept a count as input, e.g. to specifiy + how many items to drop. + + * Currently the "preselected" flag for an individual menu item is + ignored. This should eventually be implemented. + + * Menus probably should never overlap with the message window, since + the user sometmes needs to be able to see the messages while the menu + is active, e.g. when identifying multiple items one at a time. + + * Perhaps allow for keyboard navigation of individual items, e.g. + using the up and down arrows to move among the selectable items, and + selecting individual items with the spacebar. Perhaps the tab key + could jump to the first selectable item after the next heading, and + shift-tab could jump to the first item of the previous heading. + + +MESSAGE WINDOW +============== + +(cursmesg.c) + + * Hitting Esc at the more prompt (which is '>>' for the curses + interface) should suppress the display of any further messages for + that turn like the tty interface does. + + +MAP WINDOW +========== + +(curswins.c) + + * The map window would probably benefit from a total redesign. Right + now, it uses a pad instead of a regular curses window, which causes a + number of special cases in the code to account for it, and a seperate + window behind it just to draw the border. It feels kludgy and + annoying! + + +STATUS WINDOW +============= + +(cursstat.c) + + * If the status window is on the right or left, then we have much more + room to work with for each item horizontally. Expand out some of the + labels for clarity. We can also list the current dungeon (e.g. + Gnomish Mines) and perhaps show thermometer bars for hit points and + magical power. + + * Conversely, if we have a narrower dislay, compress some of the + labels to save space, and do not display some items that never or + rarely change (e.g. name, level and title, and alignment). Perhaps + display changes to these fields in the message window if they do + happen to change (e.g. converting to a new alignment). + + * Maybe add some configuration options for what colors are used and + the like. + +OTHER DIALOGS +============= + +(cursdial.c) + + * curses_yn_function needs to accept a count if a '#' is present in + choices string. + + * Extended commands should be enterable letter-by-letter via a '#' + prompt if user does not have the extmenu command set to TRUE. + + * Character selection should allow for a random selection of any or + all choices. + + +OTHER PLATFORMS +=============== + + * PDCurses also work on DOS and OS/2. PDCurses for SDL and ncurses + exist for Mac OS X. Porting the curses interface to these platforms + should not be too difficult. + + +MISC +==== + + * Update documentation and in-game help to describe the newly-added + options: cursesgraphics, term_rows, term_cols, and windowborders. + + * Recognize "Alt" key in a platform-independant way to allow its use + to select extended commands. Currently this works for PDCurses. For + Ncurses, the Alt key works in an xterm or rxvt if the -meta8 flag is + passed, but I'd like to see a general way of detecting it. + + * PDCurses has a function named "addrawch" to output the visual + representation of a control character to the screen without having the + control character affect the display otherwise. I would like to find + a way to accomplish the same thing via Ncurses to e.g. be able to use + a font like nh10 with the correct symbol mappings in an xterm or the + like. diff --git a/win/curses/cursdial.c b/win/curses/cursdial.c new file mode 100644 index 000000000..274710db1 --- /dev/null +++ b/win/curses/cursdial.c @@ -0,0 +1,1387 @@ +/* vim:set cin ft=c sw=4 sts=4 ts=8 et ai cino=Ls\:0t0(0 : -*- mode:c;fill-column:80;tab-width:8;c-basic-offset:4;indent-tabs-mode:nil;c-file-style:"k&r" -*-*/ + +#include "curses.h" +#include "hack.h" +#include "wincurs.h" +#include "cursdial.h" +#include "func_tab.h" +#include + +#if defined(FILENAME_CMP) +#define strcasecmp FILENAME_CMP +#endif +#if defined(STRNCMPI) +#define strncasecmp strncmpi +#endif + +/* Dialog windows for curses interface */ + + +/* Private declarations */ + +typedef struct nhmi { + winid wid; /* NetHack window id */ + int glyph; /* Menu glyphs */ + anything identifier; /* Value returned if item selected */ + CHAR_P accelerator; /* Character used to select item from menu */ + CHAR_P group_accel; /* Group accelerator for menu item, if any */ + int attr; /* Text attributes for item */ + const char *str; /* Text of menu item */ + BOOLEAN_P presel; /* Whether menu item should be preselected */ + boolean selected; /* Whether item is currently selected */ + int page_num; /* Display page number for entry */ + int line_num; /* Line number on page where entry begins */ + int num_lines; /* Number of lines entry uses on page */ + int count; /* Count for selected item */ + struct nhmi *prev_item; /* Pointer to previous entry */ + struct nhmi *next_item; /* Pointer to next entry */ +} nhmenu_item; + +typedef struct nhm { + winid wid; /* NetHack window id */ + const char *prompt; /* Menu prompt text */ + nhmenu_item *entries; /* Menu entries */ + int num_entries; /* Number of menu entries */ + int num_pages; /* Number of display pages for entry */ + int height; /* Window height of menu */ + int width; /* Window width of menu */ + boolean reuse_accels; /* Non-unique accelerators per page */ + struct nhm *prev_menu; /* Pointer to previous entry */ + struct nhm *next_menu; /* Pointer to next entry */ +} nhmenu; + +typedef enum menu_op_type { + SELECT, + DESELECT, + INVERT +} menu_op; + +static nhmenu *get_menu(winid wid); +static char menu_get_accel(boolean first); +static void menu_determine_pages(nhmenu *menu); +static boolean menu_is_multipage(nhmenu *menu, int width, int height); +static void menu_win_size(nhmenu *menu); +static void menu_display_page(nhmenu *menu, WINDOW * win, int page_num); +static int menu_get_selections(WINDOW * win, nhmenu *menu, int how); +static void menu_select_deselect(WINDOW * win, nhmenu_item *item, + menu_op operation); +static int menu_operation(WINDOW * win, nhmenu *menu, menu_op operation, + int page_num); +static void menu_clear_selections(nhmenu *menu); +static int menu_max_height(void); + +static nhmenu *nhmenus = NULL; /* NetHack menu array */ + + +/* Get a line of text from the player, such as asking for a character name or a wish */ + +void +curses_line_input_dialog(const char *prompt, char *answer, int buffer) +{ + int map_height, map_width, maxwidth, remaining_buf, winx, winy, count; + WINDOW *askwin, *bwin; +#if __STDC_VERSION__ >= 199901L + char input[buffer]; +#else +#ifndef BUFSZ +#define BUFSZ 256 +#endif + char input[BUFSZ]; + + buffer = BUFSZ - 1; +#endif + char *tmpstr; + int prompt_width = strlen(prompt) + buffer + 1; + int prompt_height = 1; + int height = prompt_height; + + maxwidth = term_cols - 2; + + if (iflags.window_inited) { + if (!iflags.wc_popup_dialog) { + curses_message_win_getline(prompt, answer, buffer); + return; + } + curses_get_window_size(MAP_WIN, &map_height, &map_width); + if ((prompt_width + 2) > map_width) + maxwidth = map_width - 2; + } + + if (prompt_width > maxwidth) { + prompt_height = curses_num_lines(prompt, maxwidth); + height = prompt_height; + prompt_width = maxwidth; + tmpstr = curses_break_str(prompt, maxwidth, prompt_height); + remaining_buf = buffer - (strlen(tmpstr) - 1); + if (remaining_buf > 0) { + height += (remaining_buf / prompt_width); + if ((remaining_buf % prompt_width) > 0) { + height++; + } + } + } + + if (iflags.window_inited) { + bwin = curses_create_window(prompt_width, height, UP); + wrefresh(bwin); + getbegyx(bwin, winy, winx); + askwin = newwin(height, prompt_width, winy + 1, winx + 1); + } else { + bwin = curses_create_window(prompt_width, height, CENTER); + wrefresh(bwin); + getbegyx(bwin, winy, winx); + askwin = newwin(height, prompt_width, winy + 1, winx + 1); + } + for (count = 0; count < prompt_height; count++) { + tmpstr = curses_break_str(prompt, maxwidth, count + 1); + if (count == (prompt_height - 1)) { /* Last line */ + mvwprintw(askwin, count, 0, "%s ", tmpstr); + } else { + mvwaddstr(askwin, count, 0, tmpstr); + } + free(tmpstr); + } + + echo(); + curs_set(1); + wgetnstr(askwin, input, buffer - 1); + curs_set(0); + strcpy(answer, input); + werase(bwin); + delwin(bwin); + curses_destroy_win(askwin); + noecho(); +} + + +/* Get a single character response from the player, such as a y/n prompt */ + +int +curses_character_input_dialog(const char *prompt, const char *choices, + CHAR_P def) +{ + WINDOW *askwin = NULL; + int answer, count, maxwidth, map_height, map_width; + char *linestr; + char askstr[BUFSZ + QBUFSZ]; + char choicestr[QBUFSZ]; + int prompt_width = strlen(prompt); + int prompt_height = 1; + boolean any_choice = FALSE; + boolean accept_count = FALSE; + + if (invent || (moves > 1)) { + curses_get_window_size(MAP_WIN, &map_height, &map_width); + } else { + map_height = term_rows; + map_width = term_cols; + } + + maxwidth = map_width - 2; + + if (choices != NULL) { + for (count = 0; choices[count] != '\0'; count++) { + if (choices[count] == '#') { /* Accept a count */ + accept_count = TRUE; + } + } + choicestr[0] = ' '; + choicestr[1] = '['; + for (count = 0; choices[count] != '\0'; count++) { + if (choices[count] == '\033') { /* Escape */ + break; + } + choicestr[count + 2] = choices[count]; + } + choicestr[count + 2] = ']'; + if (((def >= 'A') && (def <= 'Z')) || ((def >= 'a') && (def <= 'z'))) { + choicestr[count + 3] = ' '; + choicestr[count + 4] = '('; + choicestr[count + 5] = def; + choicestr[count + 6] = ')'; + choicestr[count + 7] = '\0'; + } else { /* No usable default choice */ + + choicestr[count + 3] = '\0'; + def = '\0'; /* Mark as no default */ + } + strcpy(askstr, prompt); + strcat(askstr, choicestr); + } else { + strcpy(askstr, prompt); + any_choice = TRUE; + } + + prompt_width = strlen(askstr); + + if ((prompt_width + 2) > maxwidth) { + prompt_height = curses_num_lines(askstr, maxwidth); + prompt_width = map_width - 2; + } + + if (iflags.wc_popup_dialog /*|| curses_stupid_hack*/) { + askwin = curses_create_window(prompt_width, prompt_height, UP); + for (count = 0; count < prompt_height; count++) { + linestr = curses_break_str(askstr, maxwidth, count + 1); + mvwaddstr(askwin, count + 1, 1, linestr); + free(linestr); + } + + wrefresh(askwin); + } else { + linestr = curses_copy_of(askstr); + pline("%s", linestr); + free(linestr); + curs_set(1); + } + + /*curses_stupid_hack = 0; */ + + while (1) { + answer = getch(); + + if (answer == ERR) { + answer = def; + break; + } + + answer = curses_convert_keys(answer); + + if (answer == KEY_ESC) { + if (choices == NULL) { + break; + } + answer = def; + for (count = 0; choices[count] != '\0'; count++) { + if (choices[count] == 'q') { /* q is preferred over n */ + answer = 'q'; + } else if ((choices[count] == 'n') && answer != 'q') { + answer = 'n'; + } + } + break; + } else if ((answer == '\n') || (answer == '\r') || (answer == ' ')) { + if ((choices != NULL) && (def != '\0')) { + answer = def; + } + break; + } + + if (digit(answer)) { + if (accept_count) { + if (answer != '0') { + yn_number = curses_get_count(answer - '0'); + touchwin(askwin); + refresh(); + } + + answer = '#'; + break; + } + } + + if (any_choice) { + break; + } + + if (choices != NULL) { + for (count = 0; (size_t) count < strlen(choices); count++) { + if (choices[count] == answer) { + break; + } + } + if (choices[count] == answer) { + break; + } + } + } + + if (iflags.wc_popup_dialog) { + /* Kludge to make prompt visible after window is dismissed + when inputting a number */ + if (digit(answer)) { + linestr = curses_copy_of(askstr); + pline("%s", linestr); + free(linestr); + curs_set(1); + } + + curses_destroy_win(askwin); + } else { + curses_clear_unhighlight_message_window(); + curs_set(0); + } + + return answer; +} + + +/* Return an extended command from the user */ + +int +curses_ext_cmd() +{ + int count, letter, prompt_width, startx, starty, winx, winy; + int messageh, messagew, maxlen = BUFSZ - 1; + int ret = -1; + char cur_choice[BUFSZ]; + int matches = 0; + WINDOW *extwin = NULL, *extwin2 = NULL; + + if (iflags.extmenu) { + return extcmd_via_menu(); + } + + startx = 0; + starty = 0; + if (iflags.wc_popup_dialog) { /* Prompt in popup window */ + int x0, y0, w, h; /* bounding coords of popup */ + extwin2 = curses_create_window(25, 1, UP); + wrefresh(extwin2); + /* create window inside window to prevent overwriting of border */ + getbegyx(extwin2,y0,x0); + getmaxyx(extwin2,h,w); + extwin = newwin(1, w-2, y0+1, x0+1); + if (w - 4 < maxlen) maxlen = w - 4; + } else { + curses_get_window_xy(MESSAGE_WIN, &winx, &winy); + curses_get_window_size(MESSAGE_WIN, &messageh, &messagew); + + if (curses_window_has_border(MESSAGE_WIN)) { + winx++; + winy++; + } + + winy += messageh - 1; + extwin = newwin(1, messagew-2, winy, winx); + if (messagew - 4 < maxlen) maxlen = messagew - 4; + pline("#"); + } + + cur_choice[0] = '\0'; + + while (1) { + wmove(extwin, starty, startx); + waddstr(extwin, "# "); + wmove(extwin, starty, startx + 2); + waddstr(extwin, cur_choice); + wmove(extwin, starty, strlen(cur_choice) + startx + 2); + wprintw(extwin, " "); + + /* if we have an autocomplete command, AND it matches uniquely */ + if (matches == 1) { + curses_toggle_color_attr(extwin, NONE, A_UNDERLINE, ON); + wmove(extwin, starty, strlen(cur_choice) + startx + 2); + wprintw(extwin, "%s", extcmdlist[ret].ef_txt + strlen(cur_choice)); + curses_toggle_color_attr(extwin, NONE, A_UNDERLINE, OFF); + mvwprintw(extwin, starty, + strlen(extcmdlist[ret].ef_txt) + 2, " "); + } + + wrefresh(extwin); + letter = getch(); + prompt_width = strlen(cur_choice); + matches = 0; + + if (letter == '\033' || letter == ERR) { + ret = -1; + break; + } + + if ((letter == '\r') || (letter == '\n')) { + if (ret == -1) { + for (count = 0; extcmdlist[count].ef_txt; count++) { + if (!strcasecmp(cur_choice, extcmdlist[count].ef_txt)) { + ret = count; + break; + } + } + } + break; + } + + if ((letter == '\b') || (letter == KEY_BACKSPACE)) { + if (prompt_width == 0) { + ret = -1; + break; + } else { + cur_choice[prompt_width - 1] = '\0'; + letter = '*'; + prompt_width--; + } + } + if (letter != '*' && prompt_width < maxlen) { + cur_choice[prompt_width] = letter; + cur_choice[prompt_width + 1] = '\0'; + ret = -1; + } + for (count = 0; extcmdlist[count].ef_txt; count++) { + if (!(extcmdlist[count].flags & AUTOCOMPLETE)) + continue; + if (strlen(extcmdlist[count].ef_txt) > (size_t) prompt_width) { + if (strncasecmp(cur_choice, extcmdlist[count].ef_txt, + prompt_width) == 0) { + if ((extcmdlist[count].ef_txt[prompt_width] == + lowc(letter)) || letter == '*') { + if (matches == 0) { + ret = count; + } + + matches++; + } + } + } + } + } + + curses_destroy_win(extwin); + if (extwin2) curses_destroy_win(extwin2); + return ret; +} + + +/* Initialize a menu from given NetHack winid */ + +void +curses_create_nhmenu(winid wid) +{ + nhmenu *new_menu = NULL; + nhmenu *menuptr = nhmenus; + nhmenu_item *menu_item_ptr = NULL; + nhmenu_item *tmp_menu_item = NULL; + + new_menu = get_menu(wid); + + if (new_menu != NULL) { + /* Reuse existing menu, clearing out current entries */ + menu_item_ptr = new_menu->entries; + + if (menu_item_ptr != NULL) { + while (menu_item_ptr->next_item != NULL) { + tmp_menu_item = menu_item_ptr->next_item; + free(menu_item_ptr); + menu_item_ptr = tmp_menu_item; + } + free(menu_item_ptr); /* Last entry */ + new_menu->entries = NULL; + } + if (new_menu->prompt != NULL) { /* Reusing existing menu */ + free((char *) new_menu->prompt); + } + return; + } + + new_menu = malloc(sizeof (nhmenu)); + new_menu->wid = wid; + new_menu->prompt = NULL; + new_menu->entries = NULL; + new_menu->num_pages = 0; + new_menu->height = 0; + new_menu->width = 0; + new_menu->reuse_accels = FALSE; + new_menu->next_menu = NULL; + + if (nhmenus == NULL) { /* no menus in memory yet */ + new_menu->prev_menu = NULL; + nhmenus = new_menu; + } else { + while (menuptr->next_menu != NULL) { + menuptr = menuptr->next_menu; + } + new_menu->prev_menu = menuptr; + menuptr->next_menu = new_menu; + } +} + + +/* Add a menu item to the given menu window */ + +void +curses_add_nhmenu_item(winid wid, int glyph, const ANY_P * identifier, + CHAR_P accelerator, CHAR_P group_accel, int attr, + const char *str, BOOLEAN_P presel) +{ + char *new_str; + nhmenu_item *new_item, *current_items, *menu_item_ptr; + nhmenu *current_menu = get_menu(wid); + + if (str == NULL) { + return; + } + + new_str = curses_copy_of(str); + curses_rtrim((char *) new_str); + new_item = malloc(sizeof (nhmenu_item)); + new_item->wid = wid; + new_item->glyph = glyph; + new_item->identifier = *identifier; + new_item->accelerator = accelerator; + new_item->group_accel = group_accel; + new_item->attr = attr; + new_item->str = new_str; + new_item->presel = presel; + new_item->selected = FALSE; + new_item->page_num = 0; + new_item->line_num = 0; + new_item->num_lines = 0; + new_item->count = -1; + new_item->next_item = NULL; + + if (current_menu == NULL) { + panic + ("curses_add_nhmenu_item: attempt to add item to nonexistant menu"); + } + + current_items = current_menu->entries; + menu_item_ptr = current_items; + + if (current_items == NULL) { + new_item->prev_item = NULL; + current_menu->entries = new_item; + } else { + while (menu_item_ptr->next_item != NULL) { + menu_item_ptr = menu_item_ptr->next_item; + } + new_item->prev_item = menu_item_ptr; + menu_item_ptr->next_item = new_item; + } +} + + +/* No more entries are to be added to menu, so details of the menu can be + finalized in memory */ + +void +curses_finalize_nhmenu(winid wid, const char *prompt) +{ + int count = 0; + nhmenu *current_menu = get_menu(wid); + nhmenu_item *menu_item_ptr = current_menu->entries; + + if (current_menu == NULL) { + panic("curses_finalize_nhmenu: attempt to finalize nonexistant menu"); + } + + while (menu_item_ptr != NULL) { + menu_item_ptr = menu_item_ptr->next_item; + count++; + } + + current_menu->num_entries = count; + + current_menu->prompt = curses_copy_of(prompt); +} + + +/* Display a nethack menu, and return a selection, if applicable */ + +int +curses_display_nhmenu(winid wid, int how, MENU_ITEM_P ** _selected) +{ + nhmenu *current_menu = get_menu(wid); + nhmenu_item *menu_item_ptr; + int num_chosen, count; + WINDOW *win; + MENU_ITEM_P *selected = NULL; + + *_selected = NULL; + + if (current_menu == NULL) { + panic("curses_display_nhmenu: attempt to display nonexistant menu"); + } + + menu_item_ptr = current_menu->entries; + + if (menu_item_ptr == NULL) { + panic("curses_display_nhmenu: attempt to display empty menu"); + } + + /* Reset items to unselected to clear out selections from previous + invocations of this menu, and preselect appropriate items */ + while (menu_item_ptr != NULL) { + menu_item_ptr->selected = menu_item_ptr->presel; + menu_item_ptr = menu_item_ptr->next_item; + } + + menu_win_size(current_menu); + menu_determine_pages(current_menu); + + /* Display pre and post-game menus centered */ + if (((moves <= 1) && !invent) || program_state.gameover) { + win = curses_create_window(current_menu->width, + current_menu->height, CENTER); + } else { /* Display during-game menus on the right out of the way */ + + win = curses_create_window(current_menu->width, + current_menu->height, RIGHT); + } + + num_chosen = menu_get_selections(win, current_menu, how); + curses_destroy_win(win); + + if (num_chosen > 0) { + selected = (MENU_ITEM_P *) malloc(num_chosen * sizeof (MENU_ITEM_P)); + count = 0; + + menu_item_ptr = current_menu->entries; + + while (menu_item_ptr != NULL) { + if (menu_item_ptr->selected) { + if (count == num_chosen) { + panic("curses_display_nhmenu: Selected items " + "exceeds expected number"); + } + selected[count].item = menu_item_ptr->identifier; + selected[count].count = menu_item_ptr->count; + count++; + } + menu_item_ptr = menu_item_ptr->next_item; + } + + if (count != num_chosen) { + panic("curses_display_nhmenu: Selected items less than " + "expected number"); + } + } + + *_selected = selected; + + return num_chosen; +} + + +boolean +curses_menu_exists(winid wid) +{ + if (get_menu(wid) != NULL) { + return TRUE; + } else { + return FALSE; + } +} + +/* Delete the menu associated with the given NetHack winid from memory */ + +void +curses_del_menu(winid wid) +{ + nhmenu_item *tmp_menu_item; + nhmenu_item *menu_item_ptr; + nhmenu *tmpmenu; + nhmenu *current_menu = get_menu(wid); + + if (current_menu == NULL) { + return; + } + + menu_item_ptr = current_menu->entries; + + /* First free entries associated with this menu from memory */ + if (menu_item_ptr != NULL) { + while (menu_item_ptr->next_item != NULL) { + tmp_menu_item = menu_item_ptr->next_item; + free(menu_item_ptr); + menu_item_ptr = tmp_menu_item; + } + free(menu_item_ptr); /* Last entry */ + current_menu->entries = NULL; + } + + /* Now unlink the menu from the list and free it as well */ + if (current_menu->prev_menu != NULL) { + tmpmenu = current_menu->prev_menu; + tmpmenu->next_menu = current_menu->next_menu; + } else { + nhmenus = current_menu->next_menu; /* New head mode or NULL */ + } + if (current_menu->next_menu != NULL) { + tmpmenu = current_menu->next_menu; + tmpmenu->prev_menu = current_menu->prev_menu; + } + + free(current_menu); + + curses_del_wid(wid); +} + + +/* return a pointer to the menu associated with the given NetHack winid */ + +static nhmenu * +get_menu(winid wid) +{ + nhmenu *menuptr = nhmenus; + + while (menuptr != NULL) { + if (menuptr->wid == wid) { + return menuptr; + } + menuptr = menuptr->next_menu; + } + + return NULL; /* Not found */ +} + + +static char +menu_get_accel(boolean first) +{ + char ret; + static char next_letter = 'a'; + + if (first) { + next_letter = 'a'; + } + + ret = next_letter; + + if (((next_letter < 'z') && (next_letter >= 'a')) || ((next_letter < 'Z') + && (next_letter >= + 'A')) || + ((next_letter < '9') && (next_letter >= '0'))) { + next_letter++; + } else if (next_letter == 'z') { + next_letter = 'A'; + } else if (next_letter == 'Z') { + next_letter = '0'; + } + + return ret; +} + + +/* Determine if menu will require multiple pages to display */ + +static boolean +menu_is_multipage(nhmenu *menu, int width, int height) +{ + int num_lines; + int curline = 0; + nhmenu_item *menu_item_ptr = menu->entries; + + if (strlen(menu->prompt) > 0) { + curline += curses_num_lines(menu->prompt, width) + 1; + } + + if (menu->num_entries <= (height - curline)) { + while (menu_item_ptr != NULL) { + menu_item_ptr->line_num = curline; + if (menu_item_ptr->identifier.a_void == NULL) { + num_lines = curses_num_lines(menu_item_ptr->str, width); + } else { + /* Add space for accelerator */ + num_lines = curses_num_lines(menu_item_ptr->str, width - 4); + } + menu_item_ptr->num_lines = num_lines; + curline += num_lines; + menu_item_ptr = menu_item_ptr->next_item; + if ((curline > height) || ((curline > height - 2) && + (height == menu_max_height()))) { + break; + } + } + if (menu_item_ptr == NULL) { + return FALSE; + } + } + return TRUE; +} + + +/* Determine which entries go on which page, and total number of pages */ + +static void +menu_determine_pages(nhmenu *menu) +{ + int tmpline, num_lines; + int curline = 0; + int page_num = 1; + nhmenu_item *menu_item_ptr = menu->entries; + int width = menu->width; + int height = menu->height; + int page_end = height; + + + if (strlen(menu->prompt) > 0) { + curline += curses_num_lines(menu->prompt, width) + 1; + } + + tmpline = curline; + + if (menu_is_multipage(menu, width, height)) { + page_end -= 2; /* Room to display current page number */ + } + + /* Determine what entries belong on which page */ + menu_item_ptr = menu->entries; + + while (menu_item_ptr != NULL) { + menu_item_ptr->page_num = page_num; + menu_item_ptr->line_num = curline; + if (menu_item_ptr->identifier.a_void == NULL) { + num_lines = curses_num_lines(menu_item_ptr->str, width); + } else { + /* Add space for accelerator */ + num_lines = curses_num_lines(menu_item_ptr->str, width - 4); + } + menu_item_ptr->num_lines = num_lines; + curline += num_lines; + if (curline > page_end) { + page_num++; + curline = tmpline; + /* Move ptr back so entry will be reprocessed on new page */ + menu_item_ptr = menu_item_ptr->prev_item; + } + menu_item_ptr = menu_item_ptr->next_item; + } + + menu->num_pages = page_num; +} + + +/* Determine dimensions of menu window based on term size and entries */ + +static void +menu_win_size(nhmenu *menu) +{ + int width, height, maxwidth, maxheight, curentrywidth, lastline; + int maxentrywidth = strlen(menu->prompt); + int maxheaderwidth = 0; + nhmenu_item *menu_item_ptr = menu->entries; + + maxwidth = 38; /* Reasonable minimum usable width */ + + if ((term_cols / 2) > maxwidth) { + maxwidth = (term_cols / 2); /* Half the screen */ + } + + maxheight = menu_max_height(); + + /* First, determine the width of the longest menu entry */ + while (menu_item_ptr != NULL) + { + if (menu_item_ptr->identifier.a_void == NULL) { + curentrywidth = strlen(menu_item_ptr->str); + + if (curentrywidth > maxheaderwidth) { + maxheaderwidth = curentrywidth; + } + } else { + /* Add space for accelerator */ + curentrywidth = strlen(menu_item_ptr->str) + 4; +#if 0 // FIXME: menu glyphs + if (menu_item_ptr->glyph != NO_GLYPH + && iflags.use_menu_glyphs) + curentrywidth += 2; +#endif + } + if (curentrywidth > maxentrywidth) { + maxentrywidth = curentrywidth; + } + menu_item_ptr = menu_item_ptr->next_item; + } + + /* If the widest entry is smaller than maxwidth, reduce maxwidth accordingly */ + if (maxentrywidth < maxwidth) { + maxwidth = maxentrywidth; + } + + /* Try not to wrap headers/normal text lines if possible. We can + go wider than half the screen for this purpose if need be */ + + if ((maxheaderwidth > maxwidth) && (maxheaderwidth < (term_cols - 2))) { + maxwidth = maxheaderwidth; + } + + width = maxwidth; + + /* Possibly reduce height if only 1 page */ + if (!menu_is_multipage(menu, maxwidth, maxheight)) { + menu_item_ptr = menu->entries; + + while (menu_item_ptr->next_item != NULL) { + menu_item_ptr = menu_item_ptr->next_item; + } + + lastline = (menu_item_ptr->line_num) + menu_item_ptr->num_lines; + + if (lastline < maxheight) { + maxheight = lastline; + } + } else { /* If multipage, make sure we have enough width for page footer */ + + if (width < 20) { + width = 20; + } + } + + height = maxheight; + menu->width = width; + menu->height = height; +} + + +/* Displays menu selections in the given window */ + +static void +menu_display_page(nhmenu *menu, WINDOW * win, int page_num) +{ + nhmenu_item *menu_item_ptr; + int count, curletter, entry_cols, start_col, num_lines, footer_x; + boolean first_accel = TRUE; + + int color = NO_COLOR; + int attr = A_NORMAL; + boolean menu_color = FALSE; + + /* Cycle through entries until we are on the correct page */ + + menu_item_ptr = menu->entries; + + while (menu_item_ptr != NULL) { + if (menu_item_ptr->page_num == page_num) { + break; + } + menu_item_ptr = menu_item_ptr->next_item; + } + + if (menu_item_ptr == NULL) { /* Page not found */ + panic("menu_display_page: attempt to display nonexistant page"); + } + + werase(win); + + if (strlen(menu->prompt) > 0) { + num_lines = curses_num_lines(menu->prompt, menu->width); + + for (count = 0; count < num_lines; count++) { + mvwprintw(win, count + 1, 1, "%s", + curses_break_str(menu->prompt, menu->width, count + 1)); + } + } + + /* Display items for current page */ + + while (menu_item_ptr != NULL) { + if (menu_item_ptr->page_num != page_num) { + break; + } + if (menu_item_ptr->identifier.a_void != NULL) { + if (menu_item_ptr->accelerator != 0) { + curletter = menu_item_ptr->accelerator; + } else { + if (first_accel) { + curletter = menu_get_accel(TRUE); + first_accel = FALSE; + if (!menu->reuse_accels && (menu->num_pages > 1)) { + menu->reuse_accels = TRUE; + } + } else { + curletter = menu_get_accel(FALSE); + } + menu_item_ptr->accelerator = curletter; + } + + if (menu_item_ptr->selected) { + curses_toggle_color_attr(win, HIGHLIGHT_COLOR, A_REVERSE, ON); + mvwaddch(win, menu_item_ptr->line_num + 1, 1, '<'); + mvwaddch(win, menu_item_ptr->line_num + 1, 2, curletter); + mvwaddch(win, menu_item_ptr->line_num + 1, 3, '>'); + curses_toggle_color_attr(win, HIGHLIGHT_COLOR, A_REVERSE, OFF); + } else { + curses_toggle_color_attr(win, HIGHLIGHT_COLOR, NONE, ON); + mvwaddch(win, menu_item_ptr->line_num + 1, 2, curletter); + curses_toggle_color_attr(win, HIGHLIGHT_COLOR, NONE, OFF); + mvwprintw(win, menu_item_ptr->line_num + 1, 3, ") "); + } + } + entry_cols = menu->width; + start_col = 1; + + if (menu_item_ptr->identifier.a_void != NULL) { + entry_cols -= 4; + start_col += 4; + } +#if 0 + //FIXME: menuglyphs not implemented yet + if (menu_item_ptr->glyph != NO_GLYPH && iflags.use_menu_glyphs) { + unsigned special; /*notused */ + + mapglyph(menu_item_ptr->glyph, &curletter, &color, &special, 0, 0); + curses_toggle_color_attr(win, color, NONE, ON); + mvwaddch(win, menu_item_ptr->line_num + 1, start_col, curletter); + curses_toggle_color_attr(win, color, NONE, OFF); + mvwaddch(win, menu_item_ptr->line_num + 1, start_col + 1, ' '); + entry_cols -= 2; + start_col += 2; + } +#endif + if (iflags.use_menu_color && (menu_color = get_menu_coloring + ((char *) menu_item_ptr->str, &color, + &attr))) { + if (color != NO_COLOR) { + curses_toggle_color_attr(win, color, NONE, ON); + } + attr = curses_convert_attr(attr); + if (attr != A_NORMAL) { + menu_item_ptr->attr = menu_item_ptr->attr | attr; + } + } + curses_toggle_color_attr(win, NONE, menu_item_ptr->attr, ON); + + num_lines = curses_num_lines(menu_item_ptr->str, entry_cols); + + for (count = 0; count < num_lines; count++) { + if (strlen(menu_item_ptr->str) > 0) { + mvwprintw(win, menu_item_ptr->line_num + count + 1, + start_col, "%s", curses_break_str(menu_item_ptr->str, + entry_cols, + count + 1)); + } + } + if (menu_color && (color != NO_COLOR)) { + curses_toggle_color_attr(win, color, NONE, OFF); + } + curses_toggle_color_attr(win, NONE, menu_item_ptr->attr, OFF); + menu_item_ptr = menu_item_ptr->next_item; + } + + if (menu->num_pages > 1) { + footer_x = menu->width - strlen("<- (Page X of Y) ->"); + if (menu->num_pages > 9) { /* Unlikely */ + footer_x -= 2; + } + mvwprintw(win, menu->height, footer_x + 3, "(Page %d of %d)", + page_num, menu->num_pages); + if (page_num != 1) { + curses_toggle_color_attr(win, HIGHLIGHT_COLOR, NONE, ON); + mvwaddstr(win, menu->height, footer_x, "<="); + curses_toggle_color_attr(win, HIGHLIGHT_COLOR, NONE, OFF); + } + if (page_num != menu->num_pages) { + curses_toggle_color_attr(win, HIGHLIGHT_COLOR, NONE, ON); + mvwaddstr(win, menu->height, menu->width - 2, "=>"); + curses_toggle_color_attr(win, HIGHLIGHT_COLOR, NONE, OFF); + } + } + curses_toggle_color_attr(win, DIALOG_BORDER_COLOR, NONE, ON); + box(win, 0, 0); + curses_toggle_color_attr(win, DIALOG_BORDER_COLOR, NONE, OFF); + wrefresh(win); +} + + +static int +menu_get_selections(WINDOW * win, nhmenu *menu, int how) +{ + int curletter; + int count = -1; + int count_letter = '\0'; + int curpage = 1; + int num_selected = 0; + boolean dismiss = FALSE; + char search_key[BUFSZ]; + nhmenu_item *menu_item_ptr = menu->entries; + + menu_display_page(menu, win, 1); + + while (!dismiss) { + curletter = getch(); + + if (curletter == ERR) { + num_selected = -1; + dismiss = TRUE; + } + + if (curletter == '\033') { + curletter = curses_convert_keys(curletter); + } + + switch (how) { + case PICK_NONE: + if (menu->num_pages == 1) { + if (curletter == KEY_ESC) { + num_selected = -1; + } else { + num_selected = 0; + + } + dismiss = TRUE; + break; + } + break; + case PICK_ANY: + switch (curletter) { + case MENU_SELECT_PAGE: + (void) menu_operation(win, menu, SELECT, curpage); + break; + case MENU_SELECT_ALL: + curpage = menu_operation(win, menu, SELECT, 0); + break; + case MENU_UNSELECT_PAGE: + (void) menu_operation(win, menu, DESELECT, curpage); + break; + case MENU_UNSELECT_ALL: + curpage = menu_operation(win, menu, DESELECT, 0); + break; + case MENU_INVERT_PAGE: + (void) menu_operation(win, menu, INVERT, curpage); + break; + case MENU_INVERT_ALL: + curpage = menu_operation(win, menu, INVERT, 0); + break; + } + default: + if (isdigit(curletter)) { + count = curses_get_count(curletter - '0'); + touchwin(win); + refresh(); + curletter = getch(); + if (count > 0) { + count_letter = curletter; + } + } + } + + switch (curletter) { + case KEY_ESC: + num_selected = -1; + dismiss = TRUE; + break; + case '\n': + case '\r': + dismiss = TRUE; + break; + case KEY_RIGHT: + case KEY_NPAGE: + case MENU_NEXT_PAGE: + case ' ': + if (curpage < menu->num_pages) { + curpage++; + menu_display_page(menu, win, curpage); + } else if (curletter == ' ') { + dismiss = TRUE; + break; + } + break; + case KEY_LEFT: + case KEY_PPAGE: + case MENU_PREVIOUS_PAGE: + if (curpage > 1) { + curpage--; + menu_display_page(menu, win, curpage); + } + break; + case KEY_END: + case MENU_LAST_PAGE: + if (curpage != menu->num_pages) { + curpage = menu->num_pages; + menu_display_page(menu, win, curpage); + } + break; + case KEY_HOME: + case MENU_FIRST_PAGE: + if (curpage != 1) { + curpage = 1; + menu_display_page(menu, win, curpage); + } + break; + case MENU_SEARCH: + curses_line_input_dialog("Search for:", search_key, BUFSZ); + + refresh(); + touchwin(win); + wrefresh(win); + + if (strlen(search_key) == 0) { + break; + } + + menu_item_ptr = menu->entries; + + while (menu_item_ptr != NULL) { + if ((menu_item_ptr->identifier.a_void != NULL) && + (strstri(menu_item_ptr->str, search_key))) { + if (how == PICK_ONE) { + menu_clear_selections(menu); + menu_select_deselect(win, menu_item_ptr, SELECT); + num_selected = 1; + dismiss = TRUE; + break; + } else { + menu_select_deselect(win, menu_item_ptr, INVERT); + } + } + + menu_item_ptr = menu_item_ptr->next_item; + } + + menu_item_ptr = menu->entries; + break; + default: + if (how == PICK_NONE) { + num_selected = 0; + dismiss = TRUE; + break; + } + } + + menu_item_ptr = menu->entries; + while (menu_item_ptr != NULL) { + if (menu_item_ptr->identifier.a_void != NULL) { + if (((curletter == menu_item_ptr->accelerator) && + ((curpage == menu_item_ptr->page_num) || + (!menu->reuse_accels))) || ((menu_item_ptr->group_accel) + && (curletter == + menu_item_ptr-> + group_accel))) { + if (curpage != menu_item_ptr->page_num) { + curpage = menu_item_ptr->page_num; + menu_display_page(menu, win, curpage); + } + + if (how == PICK_ONE) { + menu_clear_selections(menu); + menu_select_deselect(win, menu_item_ptr, SELECT); + num_selected = 1; + dismiss = TRUE; + break; + } else if ((how == PICK_ANY) && (curletter == count_letter)) { + menu_select_deselect(win, menu_item_ptr, SELECT); + menu_item_ptr->count = count; + count = 0; + count_letter = '\0'; + } else { + menu_select_deselect(win, menu_item_ptr, INVERT); + } + } + } + menu_item_ptr = menu_item_ptr->next_item; + } + } + + if ((how == PICK_ANY) && (num_selected != -1)) { + num_selected = 0; + menu_item_ptr = menu->entries; + + while (menu_item_ptr != NULL) { + if (menu_item_ptr->identifier.a_void != NULL) { + if (menu_item_ptr->selected) { + num_selected++; + } + } + menu_item_ptr = menu_item_ptr->next_item; + } + } + + return num_selected; +} + + +/* Select, deselect, or toggle selected for the given menu entry */ + +static void +menu_select_deselect(WINDOW * win, nhmenu_item *item, menu_op operation) +{ + int curletter = item->accelerator; + + if ((operation == DESELECT) || (item->selected && (operation == INVERT))) { + item->selected = FALSE; + mvwaddch(win, item->line_num + 1, 1, ' '); + curses_toggle_color_attr(win, HIGHLIGHT_COLOR, NONE, ON); + mvwaddch(win, item->line_num + 1, 2, curletter); + curses_toggle_color_attr(win, HIGHLIGHT_COLOR, NONE, OFF); + mvwaddch(win, item->line_num + 1, 3, ')'); + } else { + item->selected = TRUE; + curses_toggle_color_attr(win, HIGHLIGHT_COLOR, A_REVERSE, ON); + mvwaddch(win, item->line_num + 1, 1, '<'); + mvwaddch(win, item->line_num + 1, 2, curletter); + mvwaddch(win, item->line_num + 1, 3, '>'); + curses_toggle_color_attr(win, HIGHLIGHT_COLOR, A_REVERSE, OFF); + } + + wrefresh(win); +} + + +/* Perform the selected operation (select, unselect, invert selection) +on the given menu page. If menu_page is 0, then perform opetation on +all pages in menu. Returns last page displayed. */ + +static int +menu_operation(WINDOW * win, nhmenu *menu, menu_op + operation, int page_num) +{ + int first_page, last_page, current_page; + nhmenu_item *menu_item_ptr = menu->entries; + + if (page_num == 0) { /* Operation to occur on all pages */ + first_page = 1; + last_page = menu->num_pages; + } else { + first_page = page_num; + last_page = page_num; + } + + /* Cycle through entries until we are on the correct page */ + + while (menu_item_ptr != NULL) { + if (menu_item_ptr->page_num == first_page) { + break; + } + menu_item_ptr = menu_item_ptr->next_item; + } + + current_page = first_page; + + if (page_num == 0) { + menu_display_page(menu, win, current_page); + } + + if (menu_item_ptr == NULL) { /* Page not found */ + panic("menu_display_page: attempt to display nonexistant page"); + } + + while (menu_item_ptr != NULL) { + if (menu_item_ptr->page_num != current_page) { + if (menu_item_ptr->page_num > last_page) { + break; + } + + current_page = menu_item_ptr->page_num; + menu_display_page(menu, win, current_page); + } + + if (menu_item_ptr->identifier.a_void != NULL) { + menu_select_deselect(win, menu_item_ptr, operation); + } + + menu_item_ptr = menu_item_ptr->next_item; + } + + return current_page; +} + + +/* Set all menu items to unselected in menu */ + +static void +menu_clear_selections(nhmenu *menu) +{ + nhmenu_item *menu_item_ptr = menu->entries; + + while (menu_item_ptr != NULL) { + menu_item_ptr->selected = FALSE; + menu_item_ptr = menu_item_ptr->next_item; + } +} + + +/* Get the maximum height for a menu */ + +static int +menu_max_height(void) +{ + return term_rows - 2; +} diff --git a/win/curses/cursdial.h b/win/curses/cursdial.h new file mode 100644 index 000000000..bf3f68d9e --- /dev/null +++ b/win/curses/cursdial.h @@ -0,0 +1,23 @@ +/* vim:set cin ft=c sw=4 sts=4 ts=8 et ai cino=Ls\:0t0(0 : -*- mode:c;fill-column:80;tab-width:8;c-basic-offset:4;indent-tabs-mode:nil;c-file-style:"k&r" -*-*/ + +#ifndef CURSDIAL_H +# define CURSDIAL_H + +/* Global declarations */ + +void curses_line_input_dialog(const char *prompt, char *answer, int buffer); +int curses_character_input_dialog(const char *prompt, const char *choices, + CHAR_P def); +int curses_ext_cmd(void); +void curses_create_nhmenu(winid wid); +void curses_add_nhmenu_item(winid wid, int glyph, const ANY_P * identifier, + CHAR_P accelerator, CHAR_P group_accel, int attr, + const char *str, BOOLEAN_P presel); +void curses_finalize_nhmenu(winid wid, const char *prompt); +int curses_display_nhmenu(winid wid, int how, MENU_ITEM_P ** _selected); +boolean curses_menu_exists(winid wid); +void curses_del_menu(winid wid); + + + +#endif /* CURSDIAL_H */ diff --git a/win/curses/cursinit.c b/win/curses/cursinit.c new file mode 100644 index 000000000..3e87693a7 --- /dev/null +++ b/win/curses/cursinit.c @@ -0,0 +1,923 @@ +/* vim:set cin ft=c sw=4 sts=4 ts=8 et ai cino=Ls\:0t0(0 : -*- mode:c;fill-column:80;tab-width:8;c-basic-offset:4;indent-tabs-mode:nil;c-file-style:"k&r" -*-*/ + +#include "curses.h" +#include "hack.h" +#include "wincurs.h" +#include "cursinit.h" +#include "patchlevel.h" + +#include + +/* Initialization and startup functions for curses interface */ + +/* Private declarations */ + +static void set_window_position(int *, int *, int *, int *, int, + int *, int *, int *, int *, int, + int, int); + +/* array to save initial terminal colors for later restoration */ + +typedef struct nhrgb_type { + short r; + short g; + short b; +} nhrgb; + +nhrgb orig_yellow; +nhrgb orig_white; +nhrgb orig_darkgray; +nhrgb orig_hired; +nhrgb orig_higreen; +nhrgb orig_hiyellow; +nhrgb orig_hiblue; +nhrgb orig_himagenta; +nhrgb orig_hicyan; +nhrgb orig_hiwhite; + +/* Banners used for an optional ASCII splash screen */ + +#define NETHACK_SPLASH_A \ +" _ _ _ _ _ _ " + +#define NETHACK_SPLASH_B \ +"| \\ | | | | | | | | | | " + +#define NETHACK_SPLASH_C \ +"| \\| | ___ | |_ | |__| | __ _ ___ | | __" + +#define NETHACK_SPLASH_D \ +"| . ` | / _ \\| __|| __ | / _` | / __|| |/ /" + +#define NETHACK_SPLASH_E \ +"| |\\ || __/| |_ | | | || (_| || (__ | < " + +#define NETHACK_SPLASH_F \ +"|_| \\_| \\___| \\__||_| |_| \\__,_| \\___||_|\\_\\" + + +/* win* is size and placement of window to change, x/y/w/h is baseline which can + decrease depending on alignment of win* in orientation. + Negative minh/minw: as much as possible, but at least as much as specified. */ +static void +set_window_position(int *winx, int *winy, int *winw, int *winh, int orientation, + int *x, int *y, int *w, int *h, int border_space, + int minh, int minw) +{ + *winw = *w; + *winh = *h; + + /* Set window height/width */ + if (orientation == ALIGN_TOP || orientation == ALIGN_BOTTOM) { + if (minh < 0) { + *winh = (*h - ROWNO - border_space); + if (-minh > *winh) + *winh = -minh; + } else + *winh = minh; + *h -= (*winh + border_space); + } else { + if (minw < 0) { + *winw = (*w - COLNO - border_space); + if (-minw > *winw) + *winw = -minw; + } else + *winw = minw; + *w -= (*winw + border_space); + } + + *winx = *w + border_space + *x; + *winy = *h + border_space + *y; + + /* Set window position */ + if (orientation != ALIGN_RIGHT) { + *winx = *x; + if (orientation == ALIGN_LEFT) + *x += *winw + border_space; + } + if (orientation != ALIGN_BOTTOM) { + *winy = *y; + if (orientation == ALIGN_TOP) + *y += *winh + border_space; + } +} + +/* Create the "main" nonvolitile windows used by nethack */ + +void +curses_create_main_windows() +{ + int min_message_height = 1; + int message_orientation = 0; + int status_orientation = 0; + int border_space = 0; + int hspace = term_cols - 80; + boolean borders = FALSE; + + switch (iflags.wc2_windowborders) { + case 1: /* On */ + borders = TRUE; + break; + case 2: /* Off */ + borders = FALSE; + break; + case 3: /* Auto */ + if ((term_cols > 81) && (term_rows > 25)) { + borders = TRUE; + } + break; + default: + borders = FALSE; + } + + + if (borders) { + border_space = 2; + hspace -= border_space; + } + + if ((term_cols - border_space) < COLNO) { + min_message_height++; + } + + /* Determine status window orientation */ + if (!iflags.wc_align_status || (iflags.wc_align_status == ALIGN_TOP) + || (iflags.wc_align_status == ALIGN_BOTTOM)) { + if (!iflags.wc_align_status) { + iflags.wc_align_status = ALIGN_BOTTOM; + } + status_orientation = iflags.wc_align_status; + } else { /* left or right alignment */ + + /* Max space for player name and title horizontally */ + if ((hspace >= 26) && (term_rows >= 24)) { + status_orientation = iflags.wc_align_status; + hspace -= (26 + border_space); + } else { + status_orientation = ALIGN_BOTTOM; + } + } + + /* Determine message window orientation */ + if (!iflags.wc_align_message || (iflags.wc_align_message == ALIGN_TOP) + || (iflags.wc_align_message == ALIGN_BOTTOM)) { + if (!iflags.wc_align_message) { + iflags.wc_align_message = ALIGN_TOP; + } + message_orientation = iflags.wc_align_message; + } else { /* left or right alignment */ + + if ((hspace - border_space) >= 25) { /* Arbitrary */ + message_orientation = iflags.wc_align_message; + } else { + message_orientation = ALIGN_TOP; + } + } + + /* Figure out window positions and placements. Status and message area can be aligned + based on configuration. The priority alignment-wise is: status > msgarea > game. + Define everything as taking as much space as possible and shrink/move based on + alignment positions. */ + int message_x = 0; + int message_y = 0; + int status_x = 0; + int status_y = 0; + int inv_x = 0; + int inv_y = 0; + int map_x = 0; + int map_y = 0; + + int message_height = 0; + int message_width = 0; + int status_height = 0; + int status_width = 0; + int inv_height = 0; + int inv_width = 0; + int map_height = (term_rows - border_space); + int map_width = (term_cols - border_space); + + boolean status_vertical = FALSE; + boolean msg_vertical = FALSE; + if (status_orientation == ALIGN_LEFT || + status_orientation == ALIGN_RIGHT) + status_vertical = TRUE; + if (message_orientation == ALIGN_LEFT || + message_orientation == ALIGN_RIGHT) + msg_vertical = TRUE; + + int statusheight = 3; + if (iflags.statuslines < 3) + statusheight = 2; + + /* Vertical windows have priority. Otherwise, priotity is: + status > inv > msg */ + if (status_vertical) + set_window_position(&status_x, &status_y, &status_width, &status_height, + status_orientation, &map_x, &map_y, &map_width, &map_height, + border_space, statusheight, 26); + + if (iflags.perm_invent) { + /* Take up all width unless msgbar is also vertical. */ + int width = -25; + if (msg_vertical) + width = 25; + + set_window_position(&inv_x, &inv_y, &inv_width, &inv_height, + ALIGN_RIGHT, &map_x, &map_y, &map_width, &map_height, + border_space, -1, width); + } + + if (msg_vertical) + set_window_position(&message_x, &message_y, &message_width, &message_height, + message_orientation, &map_x, &map_y, &map_width, &map_height, + border_space, -1, -25); + + /* Now draw horizontal windows */ + if (!status_vertical) + set_window_position(&status_x, &status_y, &status_width, &status_height, + status_orientation, &map_x, &map_y, &map_width, &map_height, + border_space, statusheight, 26); + + if (!msg_vertical) + set_window_position(&message_x, &message_y, &message_width, &message_height, + message_orientation, &map_x, &map_y, &map_width, &map_height, + border_space, -1, -25); + + if (map_width > COLNO) + map_width = COLNO; + + if (map_height > ROWNO) + map_height = ROWNO; + + if (curses_get_nhwin(STATUS_WIN)) { + curses_del_nhwin(STATUS_WIN); + curses_del_nhwin(MESSAGE_WIN); + curses_del_nhwin(MAP_WIN); + curses_del_nhwin(INV_WIN); + + clear(); + } + + curses_add_nhwin(STATUS_WIN, status_height, status_width, status_y, + status_x, status_orientation, borders); + + curses_add_nhwin(MESSAGE_WIN, message_height, message_width, message_y, + message_x, message_orientation, borders); + + if (iflags.perm_invent) + curses_add_nhwin(INV_WIN, inv_height, inv_width, inv_y, inv_x, + ALIGN_RIGHT, borders); + + curses_add_nhwin(MAP_WIN, map_height, map_width, map_y, map_x, 0, borders); + + refresh(); + + curses_refresh_nethack_windows(); +/* + if (iflags.window_inited) { + curses_update_stats(); + if (iflags.perm_invent) + curses_update_inventory(); + } else { + iflags.window_inited = TRUE; + } +*/ +} + + +/* Initialize curses colors to colors used by NetHack */ + +void +curses_init_nhcolors() +{ +#ifdef TEXTCOLOR + if (has_colors()) { + use_default_colors(); + init_pair(1, COLOR_BLACK, -1); + init_pair(2, COLOR_RED, -1); + init_pair(3, COLOR_GREEN, -1); + init_pair(4, COLOR_YELLOW, -1); + init_pair(5, COLOR_BLUE, -1); + init_pair(6, COLOR_MAGENTA, -1); + init_pair(7, COLOR_CYAN, -1); + init_pair(8, -1, -1); + + { + int i; + + int clr_remap[16] = { + COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW, + COLOR_BLUE, + COLOR_MAGENTA, COLOR_CYAN, -1, COLOR_WHITE, + COLOR_RED + 8, COLOR_GREEN + 8, COLOR_YELLOW + 8, + COLOR_BLUE + 8, + COLOR_MAGENTA + 8, COLOR_CYAN + 8, COLOR_WHITE + 8 + }; + + for (i = 0; i < (COLORS >= 16 ? 16 : 8); i++) { + init_pair(17 + (i * 2) + 0, clr_remap[i], COLOR_RED); + init_pair(17 + (i * 2) + 1, clr_remap[i], COLOR_BLUE); + } + + boolean hicolor = FALSE; + if (COLORS >= 16) + hicolor = TRUE; + + /* Work around the crazy definitions above for more background colors... */ + for (i = 0; i < (COLORS >= 16 ? 16 : 8); i++) { + init_pair((hicolor ? 49 : 9) + i, clr_remap[i], COLOR_GREEN); + init_pair((hicolor ? 65 : 33) + i, clr_remap[i], COLOR_YELLOW); + init_pair((hicolor ? 81 : 41) + i, clr_remap[i], COLOR_MAGENTA); + init_pair((hicolor ? 97 : 49) + i, clr_remap[i], COLOR_CYAN); + init_pair((hicolor ? 113 : 57) + i, clr_remap[i], COLOR_WHITE); + } + } + + + if (COLORS >= 16) { + init_pair(9, COLOR_WHITE, -1); + init_pair(10, COLOR_RED + 8, -1); + init_pair(11, COLOR_GREEN + 8, -1); + init_pair(12, COLOR_YELLOW + 8, -1); + init_pair(13, COLOR_BLUE + 8, -1); + init_pair(14, COLOR_MAGENTA + 8, -1); + init_pair(15, COLOR_CYAN + 8, -1); + init_pair(16, COLOR_WHITE + 8, -1); + } + + if (can_change_color()) { + /* Preserve initial terminal colors */ + color_content(COLOR_YELLOW, &orig_yellow.r, &orig_yellow.g, + &orig_yellow.b); + color_content(COLOR_WHITE, &orig_white.r, &orig_white.g, + &orig_white.b); + + /* Set colors to appear as NetHack expects */ + init_color(COLOR_YELLOW, 500, 300, 0); + init_color(COLOR_WHITE, 600, 600, 600); + if (COLORS >= 16) { + /* Preserve initial terminal colors */ + color_content(COLOR_RED + 8, &orig_hired.r, + &orig_hired.g, &orig_hired.b); + color_content(COLOR_GREEN + 8, &orig_higreen.r, + &orig_higreen.g, &orig_higreen.b); + color_content(COLOR_YELLOW + 8, &orig_hiyellow.r, + &orig_hiyellow.g, &orig_hiyellow.b); + color_content(COLOR_BLUE + 8, &orig_hiblue.r, + &orig_hiblue.g, &orig_hiblue.b); + color_content(COLOR_MAGENTA + 8, &orig_himagenta.r, + &orig_himagenta.g, &orig_himagenta.b); + color_content(COLOR_CYAN + 8, &orig_hicyan.r, + &orig_hicyan.g, &orig_hicyan.b); + color_content(COLOR_WHITE + 8, &orig_hiwhite.r, + &orig_hiwhite.g, &orig_hiwhite.b); + + /* Set colors to appear as NetHack expects */ + init_color(COLOR_RED + 8, 1000, 500, 0); + init_color(COLOR_GREEN + 8, 0, 1000, 0); + init_color(COLOR_YELLOW + 8, 1000, 1000, 0); + init_color(COLOR_BLUE + 8, 0, 0, 1000); + init_color(COLOR_MAGENTA + 8, 1000, 0, 1000); + init_color(COLOR_CYAN + 8, 0, 1000, 1000); + init_color(COLOR_WHITE + 8, 1000, 1000, 1000); +# ifdef USE_DARKGRAY + if (COLORS > 16) { + color_content(CURSES_DARK_GRAY, &orig_darkgray.r, + &orig_darkgray.g, &orig_darkgray.b); + init_color(CURSES_DARK_GRAY, 300, 300, 300); + /* just override black colorpair entry here */ + init_pair(1, CURSES_DARK_GRAY, -1); + } +# endif + } else { + /* Set flag to use bold for bright colors */ + } + } + } +#endif +} + + +/* Allow player to pick character's role, race, gender, and alignment. +Borrowed from the Gnome window port. */ + +void +curses_choose_character() +{ + int n, i, sel, count_off, pick4u; + int count = 0; + int cur_character = 0; + const char **choices; + int *pickmap; + char *prompt; + char pbuf[QBUFSZ]; + char choice[QBUFSZ]; + char tmpchoice[QBUFSZ]; + + prompt = build_plselection_prompt(pbuf, QBUFSZ, flags.initrole, + flags.initrace, flags.initgend, + flags.initalign); + + /* This part is irritating: we have to strip the choices off of + the string and put them in a separate string in order to use + curses_character_input_dialog for this prompt. */ + + while (cur_character != '[') { + cur_character = prompt[count]; + count++; + } + + count_off = count; + + while (cur_character != ']') { + tmpchoice[count - count_off] = prompt[count]; + count++; + cur_character = prompt[count]; + } + + tmpchoice[count - count_off] = '\0'; + lcase(tmpchoice); + + while (!isspace(prompt[count_off])) { + count_off--; + } + + prompt[count_off] = '\0'; + sprintf(choice, "%s%c", tmpchoice, '\033'); + if (strchr(tmpchoice, 't')) { /* Tutorial mode */ + mvaddstr(0, 1, "New? Press t to enter a tutorial."); + } + + /* Add capital letters as choices that aren't displayed */ + + for (count = 0; tmpchoice[count]; count++) { + tmpchoice[count] = toupper(tmpchoice[count]); + } + + sprintf(choice, "%s%s", choice, tmpchoice); + + /* prevent an unnecessary prompt */ + rigid_role_checks(); + + if (!flags.randomall && + (flags.initrole == ROLE_NONE || flags.initrace == ROLE_NONE || + flags.initgend == ROLE_NONE || flags.initalign == ROLE_NONE)) { + pick4u = tolower(curses_character_input_dialog(prompt, choice, 'y')); + } else { + pick4u = 'y'; + } + + if (pick4u == 'q') { /* Quit or cancelled */ + clearlocks(); + curses_bail(0); + } + + if (pick4u == 'y') { + flags.randomall = TRUE; + } + + clear(); + refresh(); + + if (!flags.randomall && flags.initrole < 0) { + /* select a role */ + for (n = 0; roles[n].name.m; n++) + continue; + choices = (const char **) alloc(sizeof (char *) * (n + 1)); + pickmap = (int *) alloc(sizeof (int) * (n + 1)); + for (;;) { + for (n = 0, i = 0; roles[i].name.m; i++) { + if (ok_role(i, flags.initrace, flags.initgend, flags.initalign)) { + if (flags.initgend >= 0 && flags.female && roles[i].name.f) + choices[n] = roles[i].name.f; + else + choices[n] = roles[i].name.m; + pickmap[n++] = i; + } + } + if (n > 0) + break; + else if (flags.initalign >= 0) + flags.initalign = -1; /* reset */ + else if (flags.initgend >= 0) + flags.initgend = -1; + else if (flags.initrace >= 0) + flags.initrace = -1; + else + panic("no available ROLE+race+gender+alignment combinations"); + } + choices[n] = (const char *) 0; + if (n > 1) + sel = + curses_character_dialog(choices, + "Choose one of the following roles:"); + else + sel = 0; + if (sel >= 0) + sel = pickmap[sel]; + else if (sel == ROLE_NONE) { /* Quit */ + clearlocks(); + curses_bail(0); + } + free((genericptr_t) choices); + free((genericptr_t) pickmap); + } else if (flags.initrole < 0) + sel = ROLE_RANDOM; + else + sel = flags.initrole; + + if (sel == ROLE_RANDOM) { /* Random role */ + sel = pick_role(flags.initrace, flags.initgend, + flags.initalign, PICK_RANDOM); + if (sel < 0) + sel = randrole(); + } + + flags.initrole = sel; + + /* Select a race, if necessary */ + /* force compatibility with role, try for compatibility with + * pre-selected gender/alignment */ + if (flags.initrace < 0 || !validrace(flags.initrole, flags.initrace)) { + if (flags.initrace == ROLE_RANDOM || flags.randomall) { + flags.initrace = pick_race(flags.initrole, flags.initgend, + flags.initalign, PICK_RANDOM); + if (flags.initrace < 0) + flags.initrace = randrace(flags.initrole); + } else { + /* Count the number of valid races */ + n = 0; /* number valid */ + for (i = 0; races[i].noun; i++) { + if (ok_race(flags.initrole, i, flags.initgend, flags.initalign)) + n++; + } + if (n == 0) { + for (i = 0; races[i].noun; i++) { + if (validrace(flags.initrole, i)) + n++; + } + } + + choices = (const char **) alloc(sizeof (char *) * (n + 1)); + pickmap = (int *) alloc(sizeof (int) * (n + 1)); + for (n = 0, i = 0; races[i].noun; i++) { + if (ok_race(flags.initrole, i, flags.initgend, flags.initalign)) { + choices[n] = races[i].noun; + pickmap[n++] = i; + } + } + choices[n] = (const char *) 0; + /* Permit the user to pick, if there is more than one */ + if (n > 1) + sel = + curses_character_dialog(choices, + "Choose one of the following races:"); + else + sel = 0; + if (sel >= 0) + sel = pickmap[sel]; + else if (sel == ROLE_NONE) { /* Quit */ + clearlocks(); + curses_bail(0); + } + flags.initrace = sel; + free((genericptr_t) choices); + free((genericptr_t) pickmap); + } + if (flags.initrace == ROLE_RANDOM) { /* Random role */ + sel = pick_race(flags.initrole, flags.initgend, + flags.initalign, PICK_RANDOM); + if (sel < 0) + sel = randrace(flags.initrole); + flags.initrace = sel; + } + } + + /* Select a gender, if necessary */ + /* force compatibility with role/race, try for compatibility with + * pre-selected alignment */ + if (flags.initgend < 0 || + !validgend(flags.initrole, flags.initrace, flags.initgend)) { + if (flags.initgend == ROLE_RANDOM || flags.randomall) { + flags.initgend = pick_gend(flags.initrole, flags.initrace, + flags.initalign, PICK_RANDOM); + if (flags.initgend < 0) + flags.initgend = randgend(flags.initrole, flags.initrace); + } else { + /* Count the number of valid genders */ + n = 0; /* number valid */ + for (i = 0; i < ROLE_GENDERS; i++) { + if (ok_gend(flags.initrole, flags.initrace, i, flags.initalign)) + n++; + } + if (n == 0) { + for (i = 0; i < ROLE_GENDERS; i++) { + if (validgend(flags.initrole, flags.initrace, i)) + n++; + } + } + + choices = (const char **) alloc(sizeof (char *) * (n + 1)); + pickmap = (int *) alloc(sizeof (int) * (n + 1)); + for (n = 0, i = 0; i < ROLE_GENDERS; i++) { + if (ok_gend(flags.initrole, flags.initrace, i, flags.initalign)) { + choices[n] = genders[i].adj; + pickmap[n++] = i; + } + } + choices[n] = (const char *) 0; + /* Permit the user to pick, if there is more than one */ + if (n > 1) + sel = + curses_character_dialog(choices, + "Choose one of the following genders:"); + else + sel = 0; + if (sel >= 0) + sel = pickmap[sel]; + else if (sel == ROLE_NONE) { /* Quit */ + clearlocks(); + curses_bail(0); + } + flags.initgend = sel; + free((genericptr_t) choices); + free((genericptr_t) pickmap); + } + if (flags.initgend == ROLE_RANDOM) { /* Random gender */ + sel = pick_gend(flags.initrole, flags.initrace, + flags.initalign, PICK_RANDOM); + if (sel < 0) + sel = randgend(flags.initrole, flags.initrace); + flags.initgend = sel; + } + } + + /* Select an alignment, if necessary */ + /* force compatibility with role/race/gender */ + if (flags.initalign < 0 || + !validalign(flags.initrole, flags.initrace, flags.initalign)) { + if (flags.initalign == ROLE_RANDOM || flags.randomall) { + flags.initalign = pick_align(flags.initrole, flags.initrace, + flags.initgend, PICK_RANDOM); + if (flags.initalign < 0) + flags.initalign = randalign(flags.initrole, flags.initrace); + } else { + /* Count the number of valid alignments */ + n = 0; /* number valid */ + for (i = 0; i < ROLE_ALIGNS; i++) { + if (ok_align(flags.initrole, flags.initrace, flags.initgend, i)) + n++; + } + if (n == 0) { + for (i = 0; i < ROLE_ALIGNS; i++) + if (validalign(flags.initrole, flags.initrace, i)) + n++; + } + + choices = (const char **) alloc(sizeof (char *) * (n + 1)); + pickmap = (int *) alloc(sizeof (int) * (n + 1)); + for (n = 0, i = 0; i < ROLE_ALIGNS; i++) { + if (ok_align(flags.initrole, flags.initrace, flags.initgend, i)) { + choices[n] = aligns[i].adj; + pickmap[n++] = i; + } + } + choices[n] = (const char *) 0; + /* Permit the user to pick, if there is more than one */ + if (n > 1) + sel = + curses_character_dialog(choices, + "Choose one of the following alignments:"); + else + sel = 0; + if (sel >= 0) + sel = pickmap[sel]; + else if (sel == ROLE_NONE) { /* Quit */ + clearlocks(); + curses_bail(0); + } + flags.initalign = sel; + free((genericptr_t) choices); + free((genericptr_t) pickmap); + } + if (flags.initalign == ROLE_RANDOM) { + sel = pick_align(flags.initrole, flags.initrace, + flags.initgend, PICK_RANDOM); + if (sel < 0) + sel = randalign(flags.initrole, flags.initrace); + flags.initalign = sel; + } + } +} + + +/* Prompt user for character race, role, alignment, or gender */ + +int +curses_character_dialog(const char **choices, const char *prompt) +{ + int count, count2, ret, curletter; + char used_letters[52]; + anything identifier; + menu_item *selected = NULL; + winid wid = curses_get_wid(NHW_MENU); + + identifier.a_void = 0; + curses_start_menu(wid); + + for (count = 0; choices[count]; count++) { + curletter = tolower(choices[count][0]); + for (count2 = 0; count2 < count; count2++) { + if (curletter == used_letters[count2]) { + curletter = toupper(curletter); + } + } + + identifier.a_int = (count + 1); /* Must be non-zero */ + curses_add_menu(wid, NO_GLYPH, &identifier, curletter, 0, + A_NORMAL, choices[count], FALSE); + used_letters[count] = curletter; + } + + /* Random Selection */ + identifier.a_int = ROLE_RANDOM; + curses_add_menu(wid, NO_GLYPH, &identifier, '*', 0, A_NORMAL, "Random", + FALSE); + + /* Quit prompt */ + identifier.a_int = ROLE_NONE; + curses_add_menu(wid, NO_GLYPH, &identifier, 'q', 0, A_NORMAL, "Quit", + FALSE); + curses_end_menu(wid, prompt); + ret = curses_select_menu(wid, PICK_ONE, &selected); + if (ret == 1) { + ret = (selected->item.a_int); + } else { /* Cancelled selection */ + + ret = ROLE_NONE; + } + + if (ret > 0) { + ret--; + } + + free((genericptr_t) selected); + return ret; +} + + +/* Initialize and display options appropriately */ + +void +curses_init_options() +{ + set_wc_option_mod_status(WC_ALIGN_MESSAGE | WC_ALIGN_STATUS | WC_COLOR | + WC_HILITE_PET | WC_POPUP_DIALOG, SET_IN_GAME); + + set_wc2_option_mod_status(WC2_GUICOLOR, SET_IN_GAME); + + /* Remove a few options that are irrelevant to this windowport */ + /*set_option_mod_status("DECgraphics", SET_IN_FILE); */ + set_option_mod_status("eight_bit_tty", SET_IN_FILE); + + /* Add those that are */ + set_option_mod_status("statuslines", SET_IN_GAME); + + /* Make sure that DECgraphics is not set to true via the config + file, as this will cause display issues. We can't disable it in + options.c in case the game is compiled with both tty and curses. */ + if (!symset[PRIMARY].name || !strcmpi(symset[PRIMARY].name, "DECgraphics")) { + load_symset("curses",PRIMARY); + load_symset("default",ROGUESET); + } +#ifdef PDCURSES + /* PDCurses for SDL, win32 and OS/2 has the ability to set the + terminal size programatically. If the user does not specify a + size in the config file, we will set it to a nice big 110x32 to + take advantage of some of the nice features of this windowport. */ + if (iflags.wc2_term_cols == 0) { + iflags.wc2_term_cols = 110; + } + + if (iflags.wc2_term_rows == 0) { + iflags.wc2_term_rows = 32; + } + + resize_term(iflags.wc2_term_rows, iflags.wc2_term_cols); + getmaxyx(base_term, term_rows, term_cols); + + /* This is needed for an odd bug with PDCurses-SDL */ +/* How to deal with this? + switch_graphics(ASCII_GRAPHICS); + if (iflags.IBMgraphics) { + switch_graphics(IBM_GRAPHICS); + } else if (iflags.cursesgraphics) { + switch_graphics(CURS_GRAPHICS); + } else { + switch_graphics(ASCII_GRAPHICS); + } +*/ +#endif /* PDCURSES */ + if (!iflags.wc2_windowborders) { + iflags.wc2_windowborders = 3; /* Set to auto if not specified */ + } + + if (!iflags.wc2_petattr) { + iflags.wc2_petattr = A_REVERSE; + } else { /* Pet attribute specified, so hilite_pet should be true */ + + iflags.hilite_pet = TRUE; + } + +#ifdef NCURSES_MOUSE_VERSION + if (iflags.wc_mouse_support) { + mousemask(BUTTON1_CLICKED, NULL); + } +#endif +} + + +/* Display an ASCII splash screen if the splash_screen option is set */ + +void +curses_display_splash_window() +{ + int x_start; + int y_start; + + curses_get_window_xy(MAP_WIN, &x_start, &y_start); + + if ((term_cols < 70) || (term_rows < 20)) { + iflags.wc_splash_screen = FALSE; /* No room for s.s. */ + } + + curses_toggle_color_attr(stdscr, CLR_WHITE, A_NORMAL, ON); + if (iflags.wc_splash_screen) { + mvaddstr(y_start, x_start, NETHACK_SPLASH_A); + mvaddstr(y_start + 1, x_start, NETHACK_SPLASH_B); + mvaddstr(y_start + 2, x_start, NETHACK_SPLASH_C); + mvaddstr(y_start + 3, x_start, NETHACK_SPLASH_D); + mvaddstr(y_start + 4, x_start, NETHACK_SPLASH_E); + mvaddstr(y_start + 5, x_start, NETHACK_SPLASH_F); + y_start += 7; + } + + curses_toggle_color_attr(stdscr, CLR_WHITE, A_NORMAL, OFF); + +#ifdef COPYRIGHT_BANNER_A + mvaddstr(y_start, x_start, COPYRIGHT_BANNER_A); + y_start++; +#endif + +#ifdef COPYRIGHT_BANNER_B + mvaddstr(y_start, x_start, COPYRIGHT_BANNER_B); + y_start++; +#endif + +#ifdef COPYRIGHT_BANNER_C + mvaddstr(y_start, x_start, COPYRIGHT_BANNER_C); + y_start++; +#endif + +#ifdef COPYRIGHT_BANNER_D /* Just in case */ + mvaddstr(y_start, x_start, COPYRIGHT_BANNER_D); + y_start++; +#endif + refresh(); +} + + +/* Resore colors and cursor state before exiting */ + +void +curses_cleanup() +{ +#ifdef TEXTCOLOR + if (has_colors() && can_change_color()) { + init_color(COLOR_YELLOW, orig_yellow.r, orig_yellow.g, orig_yellow.b); + init_color(COLOR_WHITE, orig_white.r, orig_white.g, orig_white.b); + + if (COLORS >= 16) { + init_color(COLOR_RED + 8, orig_hired.r, orig_hired.g, orig_hired.b); + init_color(COLOR_GREEN + 8, orig_higreen.r, orig_higreen.g, + orig_higreen.b); + init_color(COLOR_YELLOW + 8, orig_hiyellow.r, + orig_hiyellow.g, orig_hiyellow.b); + init_color(COLOR_BLUE + 8, orig_hiblue.r, orig_hiblue.g, + orig_hiblue.b); + init_color(COLOR_MAGENTA + 8, orig_himagenta.r, + orig_himagenta.g, orig_himagenta.b); + init_color(COLOR_CYAN + 8, orig_hicyan.r, orig_hicyan.g, + orig_hicyan.b); + init_color(COLOR_WHITE + 8, orig_hiwhite.r, orig_hiwhite.g, + orig_hiwhite.b); +# ifdef USE_DARKGRAY + if (COLORS > 16) { + init_color(CURSES_DARK_GRAY, orig_darkgray.r, + orig_darkgray.g, orig_darkgray.b); + } +# endif + } + } +#endif +} diff --git a/win/curses/cursinit.h b/win/curses/cursinit.h new file mode 100644 index 000000000..c7f390047 --- /dev/null +++ b/win/curses/cursinit.h @@ -0,0 +1,17 @@ +/* vim:set cin ft=c sw=4 sts=4 ts=8 et ai cino=Ls\:0t0(0 : -*- mode:c;fill-column:80;tab-width:8;c-basic-offset:4;indent-tabs-mode:nil;c-file-style:"k&r" -*-*/ + +#ifndef CURSINIT_H +# define CURSINIT_H + +/* Global declarations */ + +void curses_create_main_windows(void); +void curses_init_nhcolors(void); +void curses_choose_character(void); +int curses_character_dialog(const char **choices, const char *prompt); +void curses_init_options(void); +void curses_display_splash_window(void); +void curses_cleanup(void); + + +#endif /* CURSINIT_H */ diff --git a/win/curses/cursinvt.c b/win/curses/cursinvt.c new file mode 100644 index 000000000..f5a362d7d --- /dev/null +++ b/win/curses/cursinvt.c @@ -0,0 +1,111 @@ +/* vim:set cin ft=c sw=4 sts=4 ts=8 et ai cino=Ls\:0t0(0 : -*- mode:c;fill-column:80;tab-width:8;c-basic-offset:4;indent-tabs-mode:nil;c-file-style:"k&r" -*-*/ + +#include "curses.h" +#include "hack.h" +#include "wincurs.h" +#include "cursinvt.h" + +/* Permanent inventory for curses interface */ + +/* Runs when the game indicates that the inventory has been updated */ +void +curses_update_inv(void) +{ + WINDOW *win = curses_get_nhwin(INV_WIN); + + /* Check if the inventory window is enabled in first place */ + if (!win) { + /* It's not. Re-initialize the main windows if the + option was enabled. */ + if (iflags.perm_invent) { + curses_create_main_windows(); + curses_last_messages(); + doredraw(); + } + return; + } + + boolean border = curses_window_has_border(INV_WIN); + + /* Figure out drawing area */ + int x = 0; + int y = 0; + if (border) { + x++; + y++; + } + + /* Clear the window as it is at the moment. */ + werase(win); + + wmove(win, y, x); + attr_t attr = A_UNDERLINE; + wattron(win, attr); + wprintw(win, "Inventory:"); + wattroff(win, attr); + + /* The actual inventory will override this if we do carry stuff */ + wmove(win, y + 1, x); + wprintw(win, "Not carrying anything"); + + display_inventory(NULL, FALSE); + + if (border) + box(win, 0, 0); + + wnoutrefresh(win); +} + +/* Adds an inventory item. */ +void +curses_add_inv(int y, int glyph, CHAR_P accelerator, attr_t attr, + const char *str) +{ + WINDOW *win = curses_get_nhwin(INV_WIN); + + /* Figure out where to draw the line */ + int x = 0; + if (curses_window_has_border(INV_WIN)) { + x++; + y++; + } + + wmove(win, y, x); + if (accelerator) { + attr_t bold = A_BOLD; + wattron(win, bold); + waddch(win, accelerator); + wattroff(win, bold); + wprintw(win, ") "); + } +#if 0 // FIXME: MENU GLYPHS + if (accelerator && glyph != NO_GLYPH && iflags.use_menu_glyphs) { + unsigned dummy = 0; /* Not used */ + int color = 0; + int symbol = 0; + mapglyph(glyph, &symbol, &color, &dummy, + u.ux, u.uy); + attr_t glyphclr = curses_color_attr(color, 0); + wattron(win, glyphclr); + wprintw(win, "%c ", symbol); + wattroff(win, glyphclr); + } +#endif + int color = NO_COLOR; + if (accelerator && /* Don't colorize categories */ + iflags.use_menu_color) { + boolean menu_color = FALSE; + char str_mutable[BUFSZ]; + Strcpy(str_mutable, str); + attr = 0; + get_menu_coloring(str_mutable, &color, &attr); + attr = curses_convert_attr(attr); + } + if (color == NO_COLOR) color = NONE; + curses_toggle_color_attr(win, color, attr, ON); + //wattron(win, attr); + wprintw(win, "%s", str); + //wattroff(win, attr); + curses_toggle_color_attr(win, color, attr, OFF); + wclrtoeol(win); +} diff --git a/win/curses/cursinvt.h b/win/curses/cursinvt.h new file mode 100644 index 000000000..99c90d277 --- /dev/null +++ b/win/curses/cursinvt.h @@ -0,0 +1,11 @@ +/* vim:set cin ft=c sw=4 sts=4 ts=8 et ai cino=Ls\:0t0(0 : -*- mode:c;fill-column:80;tab-width:8;c-basic-offset:4;indent-tabs-mode:nil;c-file-style:"k&r" -*-*/ + +#ifndef CURSINVT_H +# define CURSINVT_H + + +/* Global declarations */ + +void curses_update_inv(void); + +#endif /* CURSINVT_H */ diff --git a/win/curses/cursmain.c b/win/curses/cursmain.c new file mode 100644 index 000000000..a7addedea --- /dev/null +++ b/win/curses/cursmain.c @@ -0,0 +1,820 @@ +/* vim:set cin ft=c sw=4 sts=4 ts=8 et ai cino=Ls\:0t0(0 : -*- mode:c;fill-column:80;tab-width:8;c-basic-offset:4;indent-tabs-mode:nil;c-file-style:"k&r" -*-*/ + +#include "curses.h" +#include "hack.h" +#include "patchlevel.h" +#include "color.h" +#include "wincurs.h" + +/* Public functions for curses NetHack interface */ + +/* Interface definition, for windows.c */ +struct window_procs curses_procs = { + "curses", + WC_ALIGN_MESSAGE | WC_ALIGN_STATUS | WC_COLOR | WC_HILITE_PET | + WC_PERM_INVENT | WC_POPUP_DIALOG | WC_SPLASH_SCREEN, + WC2_DARKGRAY | WC2_HITPOINTBAR | +#if defined(STATUS_HILITES) + WC2_HILITE_STATUS | +#endif + WC2_HITPOINTBAR | WC2_FLUSH_STATUS | + WC2_TERM_SIZE | WC2_WINDOWBORDERS | WC2_PETATTR | WC2_GUICOLOR, + curses_init_nhwindows, + curses_player_selection, + curses_askname, + curses_get_nh_event, + curses_exit_nhwindows, + curses_suspend_nhwindows, + curses_resume_nhwindows, + curses_create_nhwindow, + curses_clear_nhwindow, + curses_display_nhwindow, + curses_destroy_nhwindow, + curses_curs, + curses_putstr, + genl_putmixed, + curses_display_file, + curses_start_menu, + curses_add_menu, + curses_end_menu, + curses_select_menu, + genl_message_menu, + curses_update_inventory, + curses_mark_synch, + curses_wait_synch, +#ifdef CLIPPING + curses_cliparound, +#endif +#ifdef POSITIONBAR + donull, +#endif + curses_print_glyph, + curses_raw_print, + curses_raw_print_bold, + curses_nhgetch, + curses_nh_poskey, + curses_nhbell, + curses_doprev_message, + curses_yn_function, + curses_getlin, + curses_get_ext_cmd, + curses_number_pad, + curses_delay_output, +#ifdef CHANGE_COLOR /* only a Mac option currently */ + donull, + donull, +#endif + curses_start_screen, + curses_end_screen, + genl_outrip, + curses_preference_update, + genl_getmsghistory, + genl_putmsghistory, + curses_status_init, + genl_status_finish, + genl_status_enablefield, + curses_status_update, + genl_can_suspend_yes, +}; + +/* Track if we're performing an update to the permanent window. + Needed since we aren't using the normal menu functions to handle + the inventory window. */ +static int inv_update = 0; + +/* +init_nhwindows(int* argcp, char** argv) + -- Initialize the windows used by NetHack. This can also + create the standard windows listed at the top, but does + not display them. + -- Any commandline arguments relevant to the windowport + should be interpreted, and *argcp and *argv should + be changed to remove those arguments. + -- When the message window is created, the variable + iflags.window_inited needs to be set to TRUE. Otherwise + all plines() will be done via raw_print(). + ** Why not have init_nhwindows() create all of the "standard" + ** windows? Or at least all but WIN_INFO? -dean +*/ +void +curses_init_nhwindows(int *argcp, char **argv) +{ +#ifdef PDCURSES + char window_title[BUFSZ]; +#endif + +#ifdef XCURSES + base_term = Xinitscr(*argcp, argv); +#else + base_term = initscr(); +#endif +#ifdef TEXTCOLOR + if (has_colors()) { + start_color(); + curses_init_nhcolors(); + } else { + iflags.use_color = FALSE; + set_option_mod_status("color", SET_IN_FILE); + iflags.wc2_guicolor = FALSE; + set_wc2_option_mod_status(WC2_GUICOLOR, SET_IN_FILE); + } +#else + iflags.use_color = FALSE; + set_option_mod_status("color", SET_IN_FILE); + iflags.wc2_guicolor = FALSE; + set_wc2_option_mod_status(WC2_GUICOLOR, SET_IN_FILE); +#endif + noecho(); + raw(); + meta(stdscr, TRUE); + orig_cursor = curs_set(0); + keypad(stdscr, TRUE); +#ifdef NCURSES_VERSION +# ifdef __APPLE__ + ESCDELAY = 25; +# else + set_escdelay(25); +# endif/* __APPLE__ */ +#endif /* NCURSES_VERSION */ +#ifdef PDCURSES +# ifdef DEF_GAME_NAME +# ifdef VERSION_STRING + sprintf(window_title, "%s %s", DEF_GAME_NAME, VERSION_STRING); +# else + sprintf(window_title, "%s", DEF_GAME_NAME); +# endif + /* VERSION_STRING */ +# else +# ifdef VERSION_STRING + sprintf(window_title, "%s %s", "NetHack", VERSION_STRING); +# else + sprintf(window_title, "%s", "NetHack"); +# endif + /* VERSION_STRING */ +# endif/* DEF_GAME_NAME */ + PDC_set_title(window_title); + PDC_set_blink(TRUE); /* Only if the user asks for it! */ + timeout(1); + (void) getch(); + timeout(-1); +#endif /* PDCURSES */ + getmaxyx(base_term, term_rows, term_cols); + counting = FALSE; + curses_init_options(); + if ((term_rows < 15) || (term_cols < 40)) { + panic("Terminal too small. Must be minumum 40 width and 15 height"); + } + + curses_create_main_windows(); + curses_init_mesg_history(); + curses_display_splash_window(); +} + +/* Do a window-port specific player type selection. If player_selection() + offers a Quit option, it is its responsibility to clean up and terminate + the process. You need to fill in pl_character[0]. +*/ +void +curses_player_selection() +{ + curses_choose_character(); +} + + +/* Ask the user for a player name. */ +void +curses_askname() +{ + curses_line_input_dialog("Who are you?", plname, PL_NSIZ); +} + + +/* Does window event processing (e.g. exposure events). + A noop for the tty and X window-ports. +*/ +void +curses_get_nh_event() +{ +#ifdef PDCURSES + if (is_termresized()) { + resize_term(0, 0); + getmaxyx(base_term, term_rows, term_cols); + curses_create_main_windows(); + curses_last_messages(); + doredraw(); + } +#endif +#ifdef NCURSES_VERSION /* Is there a better way to detect ncurses? */ + if (is_term_resized(term_rows, term_cols)) { + if (!isendwin()) { + endwin(); + } + + refresh(); + getmaxyx(base_term, term_rows, term_cols); + curses_create_main_windows(); + curses_last_messages(); + doredraw(); + } +#endif +} + +/* Exits the window system. This should dismiss all windows, + except the "window" used for raw_print(). str is printed if possible. +*/ +void +curses_exit_nhwindows(const char *str) +{ + curses_cleanup(); + curs_set(orig_cursor); + endwin(); + iflags.window_inited = 0; + if (str != NULL) { + raw_print(str); + } +} + +/* Prepare the window to be suspended. */ +void +curses_suspend_nhwindows(const char *str) +{ + endwin(); +} + + +/* Restore the windows after being suspended. */ +void +curses_resume_nhwindows() +{ + curses_refresh_nethack_windows(); +} + +/* Create a window of type "type" which can be + NHW_MESSAGE (top line) + NHW_STATUS (bottom lines) + NHW_MAP (main dungeon) + NHW_MENU (inventory or other "corner" windows) + NHW_TEXT (help/text, full screen paged window) +*/ +winid +curses_create_nhwindow(int type) +{ + winid wid = curses_get_wid(type); + + if (curses_is_menu(wid) || curses_is_text(wid)) { + curses_start_menu(wid); + curses_add_wid(wid); + } + + return wid; +} + + +/* Clear the given window, when asked to. */ +void +curses_clear_nhwindow(winid wid) +{ + if (wid != NHW_MESSAGE) { + curses_clear_nhwin(wid); + } +} + +/* -- Display the window on the screen. If there is data + pending for output in that window, it should be sent. + If blocking is TRUE, display_nhwindow() will not + return until the data has been displayed on the screen, + and acknowledged by the user where appropriate. + -- All calls are blocking in the tty window-port. + -- Calling display_nhwindow(WIN_MESSAGE,???) will do a + --more--, if necessary, in the tty window-port. +*/ +void +curses_display_nhwindow(winid wid, BOOLEAN_P block) +{ + menu_item *selected = NULL; + if (curses_is_menu(wid) || curses_is_text(wid)) { + curses_end_menu(wid, ""); + curses_select_menu(wid, PICK_NONE, &selected); + return; + } + + /* don't overwrite the splash screen first time through */ + if (!iflags.window_inited && wid == MAP_WIN) + iflags.window_inited = TRUE; + else { + /* actually display the window */ + wnoutrefresh(curses_get_nhwin(wid)); + /* flush pending writes from other windows too */ + doupdate(); + } + if ((wid == MAP_WIN) && block) { + (void) curses_more(); + } + + if ((wid == MESSAGE_WIN) && block) { + (void) curses_block(TRUE); + } +} + + +/* Destroy will dismiss the window if the window has not + * already been dismissed. +*/ +void +curses_destroy_nhwindow(winid wid) +{ + curses_del_nhwin(wid); +} + +/* Next output to window will start at (x,y), also moves + displayable cursor to (x,y). For backward compatibility, + 1 <= x < cols, 0 <= y < rows, where cols and rows are + the size of window. +*/ +void +curses_curs(winid wid, int x, int y) +{ + curses_move_cursor(wid, x, y); +} + +/* +putstr(window, attr, str) + -- Print str on the window with the given attribute. Only + printable ASCII characters (040-0126) must be supported. + Multiple putstr()s are output on separate lines. +Attributes + can be one of + ATR_NONE (or 0) + ATR_ULINE + ATR_BOLD + ATR_BLINK + ATR_INVERSE + If a window-port does not support all of these, it may map + unsupported attributes to a supported one (e.g. map them + all to ATR_INVERSE). putstr() may compress spaces out of + str, break str, or truncate str, if necessary for the + display. Where putstr() breaks a line, it has to clear + to end-of-line. + -- putstr should be implemented such that if two putstr()s + are done consecutively the user will see the first and + then the second. In the tty port, pline() achieves this + by calling more() or displaying both on the same line. +*/ +void +curses_putstr(winid wid, int attr, const char *text) +{ + int curses_attr = curses_convert_attr(attr); + + /* We need to convert NetHack attributes to curses attributes */ + curses_puts(wid, curses_attr, text); +} + +/* Display the file named str. Complain about missing files + iff complain is TRUE. +*/ +void +curses_display_file(const char *filename, BOOLEAN_P must_exist) +{ + curses_view_file(filename, must_exist); +} + +/* Start using window as a menu. You must call start_menu() + before add_menu(). After calling start_menu() you may not + putstr() to the window. Only windows of type NHW_MENU may + be used for menus. +*/ +void +curses_start_menu(winid wid) +{ + if (inv_update) + return; + + curses_create_nhmenu(wid); +} + +/* +add_menu(winid wid, int glyph, const anything identifier, + char accelerator, char groupacc, + int attr, char *str, boolean preselected) + -- Add a text line str to the given menu window. If identifier + is 0, then the line cannot be selected (e.g. a title). + Otherwise, identifier is the value returned if the line is + selected. Accelerator is a keyboard key that can be used + to select the line. If the accelerator of a selectable + item is 0, the window system is free to select its own + accelerator. It is up to the window-port to make the + accelerator visible to the user (e.g. put "a - " in front + of str). The value attr is the same as in putstr(). + Glyph is an optional glyph to accompany the line. If + window port cannot or does not want to display it, this + is OK. If there is no glyph applicable, then this + value will be NO_GLYPH. + -- All accelerators should be in the range [A-Za-z]. + -- It is expected that callers do not mix accelerator + choices. Either all selectable items have an accelerator + or let the window system pick them. Don't do both. + -- Groupacc is a group accelerator. It may be any character + outside of the standard accelerator (see above) or a + number. If 0, the item is unaffected by any group + accelerator. If this accelerator conflicts with + the menu command (or their user defined alises), it loses. + The menu commands and aliases take care not to interfere + with the default object class symbols. + -- If you want this choice to be preselected when the + menu is displayed, set preselected to TRUE. +*/ +void +curses_add_menu(winid wid, int glyph, const ANY_P * identifier, + CHAR_P accelerator, CHAR_P group_accel, int attr, + const char *str, BOOLEAN_P presel) +{ + int curses_attr = curses_convert_attr(attr); + + if (inv_update) { + curses_add_inv(inv_update, glyph, accelerator, curses_attr, str); + inv_update++; + return; + } + + curses_add_nhmenu_item(wid, glyph, identifier, accelerator, group_accel, + curses_attr, str, presel); +} + +/* +end_menu(window, prompt) + -- Stop adding entries to the menu and flushes the window + to the screen (brings to front?). Prompt is a prompt + to give the user. If prompt is NULL, no prompt will + be printed. + ** This probably shouldn't flush the window any more (if + ** it ever did). That should be select_menu's job. -dean +*/ +void +curses_end_menu(winid wid, const char *prompt) +{ + if (inv_update) + return; + + curses_finalize_nhmenu(wid, prompt); +} + +/* +int select_menu(winid window, int how, menu_item **selected) + -- Return the number of items selected; 0 if none were chosen, + -1 when explicitly cancelled. If items were selected, then + selected is filled in with an allocated array of menu_item + structures, one for each selected line. The caller must + free this array when done with it. The "count" field + of selected is a user supplied count. If the user did + not supply a count, then the count field is filled with + -1 (meaning all). A count of zero is equivalent to not + being selected and should not be in the list. If no items + were selected, then selected is NULL'ed out. How is the + mode of the menu. Three valid values are PICK_NONE, + PICK_ONE, and PICK_N, meaning: nothing is selectable, + only one thing is selectable, and any number valid items + may selected. If how is PICK_NONE, this function should + never return anything but 0 or -1. + -- You may call select_menu() on a window multiple times -- + the menu is saved until start_menu() or destroy_nhwindow() + is called on the window. + -- Note that NHW_MENU windows need not have select_menu() + called for them. There is no way of knowing whether + select_menu() will be called for the window at + create_nhwindow() time. +*/ +int +curses_select_menu(winid wid, int how, MENU_ITEM_P ** selected) +{ + if (inv_update) + return 0; + + return curses_display_nhmenu(wid, how, selected); +} + +void +curses_update_inventory(void) +{ + /* Don't do anything if perm_invent is off unless we + changed the option. */ + if (!iflags.perm_invent) { + if (curses_get_nhwin(INV_WIN)) { + curses_create_main_windows(); + curses_last_messages(); + doredraw(); + } + return; + } + + /* Update inventory sidebar. NetHack uses normal menu functions + when drawing the inventory, and we don't want to change the + underlying code. So instead, track if an inventory update is + being performed with a static variable. */ + inv_update = 1; + curses_update_inv(); + inv_update = 0; +} + +/* +mark_synch() -- Don't go beyond this point in I/O on any channel until + all channels are caught up to here. Can be an empty call + for the moment +*/ +void +curses_mark_synch() +{ +} + +/* +wait_synch() -- Wait until all pending output is complete (*flush*() for + streams goes here). + -- May also deal with exposure events etc. so that the + display is OK when return from wait_synch(). +*/ +void +curses_wait_synch() +{ +} + +/* +cliparound(x, y)-- Make sure that the user is more-or-less centered on the + screen if the playing area is larger than the screen. + -- This function is only defined if CLIPPING is defined. +*/ +void +curses_cliparound(int x, int y) +{ + int sx, sy, ex, ey; + boolean redraw = curses_map_borders(&sx, &sy, &ex, &ey, x, y); + + if (redraw) { + curses_draw_map(sx, sy, ex, ey); + } +} + +/* +print_glyph(window, x, y, glyph, bkglyph) + -- Print the glyph at (x,y) on the given window. Glyphs are + integers at the interface, mapped to whatever the window- + port wants (symbol, font, color, attributes, ...there's + a 1-1 map between glyphs and distinct things on the map). + bkglyph is to render the background behind the glyph. + It's not used here. +*/ +void +curses_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph, int bkglyph) +{ + int ch; + int color; + unsigned int special; + int attr = -1; + + /* map glyph to character and color */ + mapglyph(glyph, &ch, &color, &special, x, y); + if ((special & MG_PET) && iflags.hilite_pet) { + attr = iflags.wc2_petattr; + } + if ((special & MG_DETECT) && iflags.use_inverse) { + attr = A_REVERSE; + } + if (!symset[PRIMARY].name || !strcmpi(symset[PRIMARY].name, "curses")) { + ch = curses_convert_glyph(ch, glyph); + } + if (wid == NHW_MAP) { +/* hilite stairs not in 3.6, yet + if ((special & MG_STAIRS) && iflags.hilite_hidden_stairs) { + color = 16 + (color * 2); + } else +*/ + if ((special & MG_OBJPILE) && iflags.hilite_pile) { + color = 16 + (color * 2) + 1; + } + } + + curses_putch(wid, x, y, ch, color, attr); +} + +/* +raw_print(str) -- Print directly to a screen, or otherwise guarantee that + the user sees str. raw_print() appends a newline to str. + It need not recognize ASCII control characters. This is + used during startup (before windowing system initialization + -- maybe this means only error startup messages are raw), + for error messages, and maybe other "msg" uses. E.g. + updating status for micros (i.e, "saving"). +*/ +void +curses_raw_print(const char *str) +{ + puts(str); +} + +/* +raw_print_bold(str) + -- Like raw_print(), but prints in bold/standout (if possible). +*/ +void +curses_raw_print_bold(const char *str) +{ + curses_raw_print(str); +} + +/* +int nhgetch() -- Returns a single character input from the user. + -- In the tty window-port, nhgetch() assumes that tgetch() + will be the routine the OS provides to read a character. + Returned character _must_ be non-zero. +*/ +int +curses_nhgetch() +{ + int ch; + + curses_prehousekeeping(); + ch = curses_read_char(); + curses_posthousekeeping(); + + return ch; +} + +/* +int nh_poskey(int *x, int *y, int *mod) + -- Returns a single character input from the user or a + a positioning event (perhaps from a mouse). If the + return value is non-zero, a character was typed, else, + a position in the MAP window is returned in x, y and mod. + mod may be one of + + CLICK_1 -- mouse click type 1 + CLICK_2 -- mouse click type 2 + + The different click types can map to whatever the + hardware supports. If no mouse is supported, this + routine always returns a non-zero character. +*/ +int +curses_nh_poskey(int *x, int *y, int *mod) +{ + int key = curses_nhgetch(); + +#ifdef NCURSES_MOUSE_VERSION + /* Mouse event if mouse_support is true */ + if (key == KEY_MOUSE) { + key = curses_get_mouse(x, y, mod); + } +#endif + + return key; +} + +/* +nhbell() -- Beep at user. [This will exist at least until sounds are + redone, since sounds aren't attributable to windows anyway.] +*/ +void +curses_nhbell() +{ + beep(); +} + +/* +doprev_message() + -- Display previous messages. Used by the ^P command. + -- On the tty-port this scrolls WIN_MESSAGE back one line. +*/ +int +curses_doprev_message() +{ + curses_prev_mesg(); + return 0; +} + +/* +char yn_function(const char *ques, const char *choices, char default) + -- Print a prompt made up of ques, choices and default. + Read a single character response that is contained in + choices or default. If choices is NULL, all possible + inputs are accepted and returned. This overrides + everything else. The choices are expected to be in + lower case. Entering ESC always maps to 'q', or 'n', + in that order, if present in choices, otherwise it maps + to default. Entering any other quit character (SPACE, + RETURN, NEWLINE) maps to default. + -- If the choices string contains ESC, then anything after + it is an acceptable response, but the ESC and whatever + follows is not included in the prompt. + -- If the choices string contains a '#' then accept a count. + Place this value in the global "yn_number" and return '#'. + -- This uses the top line in the tty window-port, other + ports might use a popup. +*/ +char +curses_yn_function(const char *question, const char *choices, CHAR_P def) +{ + return (char) curses_character_input_dialog(question, choices, def); +} + +/* +getlin(const char *ques, char *input) + -- Prints ques as a prompt and reads a single line of text, + up to a newline. The string entered is returned without the + newline. ESC is used to cancel, in which case the string + "\033\000" is returned. + -- getlin() must call flush_screen(1) before doing anything. + -- This uses the top line in the tty window-port, other + ports might use a popup. +*/ +void +curses_getlin(const char *question, char *input) +{ + curses_line_input_dialog(question, input, BUFSZ); +} + +/* +int get_ext_cmd(void) + -- Get an extended command in a window-port specific way. + An index into extcmdlist[] is returned on a successful + selection, -1 otherwise. +*/ +int +curses_get_ext_cmd() +{ + return curses_ext_cmd(); +} + + +/* +number_pad(state) + -- Initialize the number pad to the given state. +*/ +void +curses_number_pad(int state) +{ +} + +/* +delay_output() -- Causes a visible delay of 50ms in the output. + Conceptually, this is similar to wait_synch() followed + by a nap(50ms), but allows asynchronous operation. +*/ +void +curses_delay_output() +{ + /* refreshing the whole display is a waste of time, + * but that's why we're here */ + refresh(); + napms(50); +} + +/* +start_screen() -- Only used on Unix tty ports, but must be declared for + completeness. Sets up the tty to work in full-screen + graphics mode. Look at win/tty/termcap.c for an + example. If your window-port does not need this function + just declare an empty function. +*/ +void +curses_start_screen() +{ +} + +/* +end_screen() -- Only used on Unix tty ports, but must be declared for + completeness. The complement of start_screen(). +*/ +void +curses_end_screen() +{ +} + +/* +outrip(winid, int) + -- The tombstone code. If you want the traditional code use + genl_outrip for the value and check the #if in rip.c. +*/ +void +curses_outrip(winid wid, int how) +{ +} + +/* +preference_update(preference) + -- The player has just changed one of the wincap preference + settings, and the NetHack core is notifying your window + port of that change. If your window-port is capable of + dynamically adjusting to the change then it should do so. + Your window-port will only be notified of a particular + change if it indicated that it wants to be by setting the + corresponding bit in the wincap mask. +*/ +void +curses_preference_update(const char *pref) +{ + if ((strcmp(pref, "align_status") == 0) || + (strcmp(pref, "align_message") == 0)) { + curses_create_main_windows(); + curses_last_messages(); + doredraw(); + } +} + diff --git a/win/curses/cursmesg.c b/win/curses/cursmesg.c new file mode 100644 index 000000000..9fc1d6442 --- /dev/null +++ b/win/curses/cursmesg.c @@ -0,0 +1,630 @@ +/* vim:set cin ft=c sw=4 sts=4 ts=8 et ai cino=Ls\:0t0(0 : -*- mode:c;fill-column:80;tab-width:8;c-basic-offset:4;indent-tabs-mode:nil;c-file-style:"k&r" -*-*/ + +#include "curses.h" +#include "hack.h" +#include "wincurs.h" +#include "cursmesg.h" +#include + + +/* Message window routines for curses interface */ + +/* Private declatations */ + +typedef struct nhpm { + char *str; /* Message text */ + long turn; /* Turn number for message */ + struct nhpm *prev_mesg; /* Pointer to previous message */ + struct nhpm *next_mesg; /* Pointer to next message */ +} nhprev_mesg; + +static void scroll_window(winid wid); +static void unscroll_window(winid wid); +static void directional_scroll(winid wid, int nlines); +static void mesg_add_line(char *mline); +static nhprev_mesg *get_msg_line(boolean reverse, int mindex); + +static int turn_lines = 1; +static int mx = 0; +static int my = 0; /* message window text location */ +static nhprev_mesg *first_mesg = NULL; +static nhprev_mesg *last_mesg = NULL; +static int max_messages; +static int num_messages = 0; + + + +/* Write a string to the message window. Attributes set by calling function. */ + +void +curses_message_win_puts(const char *message, boolean recursed) +{ + int height, width, linespace; + char *tmpstr; + WINDOW *win = curses_get_nhwin(MESSAGE_WIN); + boolean border = curses_window_has_border(MESSAGE_WIN); + int message_length = strlen(message); + int border_space = 0; + static long suppress_turn = -1; + + if (strncmp("Count:", message, 6) == 0) { + curses_count_window(message); + return; + } + + if (suppress_turn == moves) { + return; + } + + curses_get_window_size(MESSAGE_WIN, &height, &width); + if (border) { + border_space = 1; + if (mx < 1) { + mx = 1; + } + if (my < 1) { + my = 1; + } + } + + linespace = ((width + border_space) - 3) - mx; + + if (strcmp(message, "#") == 0) { /* Extended command or Count: */ + if ((strcmp(toplines, "#") != 0) && (my >= (height - 1 + border_space)) && (height != 1)) { /* Bottom of message window */ + scroll_window(MESSAGE_WIN); + mx = width; + my--; + strcpy(toplines, message); + } + + return; + } + + if (!recursed) { + strcpy(toplines, message); + mesg_add_line((char *) message); + } + + if (linespace < message_length) { + if (my >= (height - 1 + border_space)) { /* bottom of message win */ + if ((turn_lines > height) || (height == 1)) { + /* Pause until key is hit - Esc suppresses any further + messages that turn */ + if (curses_more() == '\033') { + suppress_turn = moves; + return; + } + } else { + scroll_window(MESSAGE_WIN); + turn_lines++; + } + } else { + if (mx != border_space) { + my++; + mx = border_space; + } + } + } + + if (height > 1) { + curses_toggle_color_attr(win, NONE, A_BOLD, ON); + } + + if ((mx == border_space) && ((message_length + 2) > width)) { + tmpstr = curses_break_str(message, (width - 2), 1); + mvwprintw(win, my, mx, "%s", tmpstr); + mx += strlen(tmpstr); + if (strlen(tmpstr) < (size_t) (width - 2)) { + mx++; + } + free(tmpstr); + if (height > 1) { + curses_toggle_color_attr(win, NONE, A_BOLD, OFF); + } + curses_message_win_puts(tmpstr = curses_str_remainder(message, (width - 2), 1), + TRUE); + free(tmpstr); + } else { + mvwprintw(win, my, mx, "%s", message); + curses_toggle_color_attr(win, NONE, A_BOLD, OFF); + mx += message_length + 1; + } + wrefresh(win); +} + + +int +curses_block(boolean noscroll) +/* noscroll - blocking because of msgtype = stop/alert */ +/* else blocking because window is full, so need to scroll after */ +{ + int height, width, ret; + WINDOW *win = curses_get_nhwin(MESSAGE_WIN); + char *resp = " \n\033"; /* space, enter, esc */ + + + curses_get_window_size(MESSAGE_WIN, &height, &width); + curses_toggle_color_attr(win, MORECOLOR, NONE, ON); + mvwprintw(win, my, mx, iflags.msg_is_alert ? "" : ">>"); + curses_toggle_color_attr(win, MORECOLOR, NONE, OFF); + if (iflags.msg_is_alert) + curses_alert_main_borders(TRUE); + wrefresh(win); + while (iflags.msg_is_alert && (ret = wgetch(win) != '\t')); + /* msgtype=stop should require space/enter rather than + * just any key, as we want to prevent YASD from + * riding direction keys. */ + while (!iflags.msg_is_alert && (ret = wgetch(win)) && !index(resp,(char)ret)); + if (iflags.msg_is_alert) + curses_alert_main_borders(FALSE); + if (height == 1) { + curses_clear_unhighlight_message_window(); + } else { + mvwprintw(win, my, mx, " "); + if (!noscroll) { + scroll_window(MESSAGE_WIN); + turn_lines = 1; + } + wrefresh(win); + } + + return ret; +} + +int +curses_more() +{ + return curses_block(FALSE); +} + + +/* Clear the message window if one line; otherwise unhighlight old messages */ + +void +curses_clear_unhighlight_message_window() +{ + int mh, mw, count; + boolean border = curses_window_has_border(MESSAGE_WIN); + WINDOW *win = curses_get_nhwin(MESSAGE_WIN); + + turn_lines = 1; + + curses_get_window_size(MESSAGE_WIN, &mh, &mw); + + mx = 0; + + if (border) { + mx++; + } + + if (mh == 1) { + curses_clear_nhwin(MESSAGE_WIN); + } else { + mx += mw; /* Force new line on new turn */ + + if (border) { + + for (count = 0; count < mh; count++) { + mvwchgat(win, count + 1, 1, mw, COLOR_PAIR(8), A_NORMAL, NULL); + } + } else { + for (count = 0; count < mh; count++) { + mvwchgat(win, count, 0, mw, COLOR_PAIR(8), A_NORMAL, NULL); + } + } + + wnoutrefresh(win); + } +} + + +/* Reset message window cursor to starting position, and display most +recent messages. */ + +void +curses_last_messages() +{ + boolean border = curses_window_has_border(MESSAGE_WIN); + + if (border) { + mx = 1; + my = 1; + } else { + mx = 0; + my = 0; + } + + nhprev_mesg *mesg; + int i; + for (i = (num_messages - 1); i > 0; i--) { + mesg = get_msg_line(TRUE, i); + if (mesg && mesg->str && strcmp(mesg->str, "")) + curses_message_win_puts(mesg->str, TRUE); + } + curses_message_win_puts(toplines, TRUE); +} + + +/* Initialize list for message history */ + +void +curses_init_mesg_history() +{ + max_messages = iflags.msg_history; + + if (max_messages < 1) { + max_messages = 1; + } + + if (max_messages > MESG_HISTORY_MAX) { + max_messages = MESG_HISTORY_MAX; + } +} + + +/* Display previous message window messages in reverse chron order */ + +void +curses_prev_mesg() +{ + int count; + winid wid; + long turn = 0; + anything *identifier; + nhprev_mesg *mesg; + menu_item *selected = NULL; + + wid = curses_get_wid(NHW_MENU); + curses_create_nhmenu(wid); + identifier = malloc(sizeof (anything)); + identifier->a_void = NULL; + + for (count = 0; count < num_messages; count++) { + mesg = get_msg_line(TRUE, count); + if ((turn != mesg->turn) && (count != 0)) { + curses_add_menu(wid, NO_GLYPH, identifier, 0, 0, A_NORMAL, + "---", FALSE); + } + curses_add_menu(wid, NO_GLYPH, identifier, 0, 0, A_NORMAL, + mesg->str, FALSE); + turn = mesg->turn; + } + + curses_end_menu(wid, ""); + curses_select_menu(wid, PICK_NONE, &selected); +} + + +/* Shows Count: in a separate window, or at the bottom of the message +window, depending on the user's settings */ + +void +curses_count_window(const char *count_text) +{ + int startx, starty, winx, winy; + int messageh, messagew; + static WINDOW *countwin = NULL; + + if ((count_text == NULL) && (countwin != NULL)) { + delwin(countwin); + countwin = NULL; + counting = FALSE; + return; + } + + counting = TRUE; + + if (iflags.wc_popup_dialog) { /* Display count in popup window */ + startx = 1; + starty = 1; + + if (countwin == NULL) { + countwin = curses_create_window(25, 1, UP); + } + + } else { /* Display count at bottom of message window */ + + curses_get_window_xy(MESSAGE_WIN, &winx, &winy); + curses_get_window_size(MESSAGE_WIN, &messageh, &messagew); + + if (curses_window_has_border(MESSAGE_WIN)) { + winx++; + winy++; + } + + winy += messageh - 1; + + if (countwin == NULL) { + pline("#"); +#ifndef PDCURSES + countwin = newwin(1, 25, winy, winx); +#endif /* !PDCURSES */ + } +#ifdef PDCURSES + else { + curses_destroy_win(countwin); + } + + countwin = newwin(1, 25, winy, winx); +#endif /* PDCURSES */ + startx = 0; + starty = 0; + } + + mvwprintw(countwin, starty, startx, "%s", count_text); + wrefresh(countwin); +} + + /* Gets a "line" (buffer) of input. */ +void +curses_message_win_getline(const char *prompt, char *answer, int buffer) +{ + int height, width; /* of window */ + char *tmpbuf, *p_answer; /* combined prompt + answer */ + int nlines, maxlines, i; /* prompt + answer */ + int promptline; + int promptx; + char **linestarts; /* pointers to start of each line */ + char *tmpstr; /* for free() */ + int maxy, maxx; /* linewrap / scroll */ + int ch; + + WINDOW *win = curses_get_nhwin(MESSAGE_WIN); + int border_space = 0; + int len = 0; /* of answer string */ + boolean border = curses_window_has_border(MESSAGE_WIN); + int orig_cursor = curs_set(0); + + curses_get_window_size(MESSAGE_WIN, &height, &width); + if (border) { + border_space = 1; + if (mx < 1) mx = 1; + if (my < 1) my = 1; + } + maxy = height - 1 + border_space; + maxx = width - 1 + border_space; + + tmpbuf = (char *)malloc(strlen(prompt) + buffer + 2); + maxlines = buffer / width * 2; + strcpy(tmpbuf, prompt); + strcat(tmpbuf, " "); + nlines = curses_num_lines(tmpbuf,width); + maxlines += nlines * 2; + linestarts = (char **)malloc(sizeof(char*) * maxlines); + p_answer = tmpbuf + strlen(tmpbuf); + linestarts[0] = tmpbuf; + + if (mx > border_space) { /* newline */ + if (my >= maxy) scroll_window(MESSAGE_WIN); + else my++; + mx = border_space; + } + + curses_toggle_color_attr(win, NONE, A_BOLD, ON); + + for (i = 0; i < nlines-1; i++) { + tmpstr = curses_break_str(linestarts[i],width-1,1); + linestarts[i+1] = linestarts[i] + strlen(tmpstr); + if (*linestarts[i+1] == ' ') linestarts[i+1]++; + mvwaddstr(win,my,mx,tmpstr); + free(tmpstr); + if (++my >= maxy) { + scroll_window(MESSAGE_WIN); + my--; + } + } + mvwaddstr(win,my,mx,linestarts[nlines-1]); + mx = promptx = strlen(linestarts[nlines-1]) + border_space; + promptline = nlines - 1; + + while(1) { + mx = strlen(linestarts[nlines - 1]) + border_space; + if (mx > maxx) { + if (nlines < maxlines) { + tmpstr = curses_break_str(linestarts[nlines - 1], width - 1, 1); + mx = strlen(tmpstr) + border_space; + mvwprintw(win, my, mx, "%*c", maxx - mx + 1, ' '); + if (++my > maxy) { + scroll_window(MESSAGE_WIN); + my--; + } + mx = border_space; + linestarts[nlines] = linestarts[nlines - 1] + strlen(tmpstr); + if (*linestarts[nlines] == ' ') linestarts[nlines]++; + mvwaddstr(win, my, mx, linestarts[nlines]); + mx = strlen(linestarts[nlines]) + border_space; + nlines++; + free(tmpstr); + } else { + p_answer[--len] = '\0'; + mvwaddch(win, my, --mx, ' '); + } + } + wmove(win, my, mx); + curs_set(1); + wrefresh(win); + ch = getch(); + curs_set(0); + switch(ch) { + case '\033': /* DOESCAPE */ + /* blank the input but don't exit */ + while(nlines - 1 > promptline) { + if (nlines-- > height) { + unscroll_window(MESSAGE_WIN); + tmpstr = curses_break_str(linestarts[nlines - height], width - 1, 1); + mvwaddstr(win, border_space, border_space, tmpstr); + free(tmpstr); + } else { + mx = border_space; + mvwprintw(win, my, mx, "%*c", maxx - mx, ' '); + my--; + } + } + mx = promptx; + mvwprintw(win, my, mx, "%*c", maxx - mx, ' '); + *p_answer = '\0'; + len = 0; + break; + case ERR: /* should not happen */ + *answer = '\0'; + free(tmpbuf); + free(linestarts); + curs_set(orig_cursor); + curses_toggle_color_attr(win, NONE, A_BOLD, OFF); + return; + case '\r': + case '\n': + free(linestarts); + strncpy(answer, p_answer, buffer); + strcpy(toplines, tmpbuf); + mesg_add_line((char *) tmpbuf); + free(tmpbuf); + curs_set(orig_cursor); + curses_toggle_color_attr(win, NONE, A_BOLD, OFF); + if (++my > maxy) { + scroll_window(MESSAGE_WIN); + my--; + } + mx = border_space; + return; + case '\b': + case KEY_BACKSPACE: + if (len < 1) { + len = 1; + mx = promptx; + } + p_answer[--len] = '\0'; + mvwaddch(win, my, --mx, ' '); + /* try to unwrap back to the previous line if there is one */ + if (nlines > 1 && strlen(linestarts[nlines - 2]) < (size_t) width) { + mvwaddstr(win, my - 1, border_space, linestarts[nlines - 2]); + if (nlines-- > height) { + unscroll_window(MESSAGE_WIN); + tmpstr = curses_break_str(linestarts[nlines - height], width - 1, 1); + mvwaddstr(win, border_space, border_space, tmpstr); + free(tmpstr); + } else { + /* clean up the leftovers on the next line, if we didn't scroll it away */ + mvwprintw(win, my--, border_space, "%*c", strlen(linestarts[nlines]), ' '); + } + } + break; + default: + p_answer[len++] = ch; + if (len >= buffer) len = buffer-1; + else mvwaddch(win, my, mx, ch); + p_answer[len] = '\0'; + } + } +} + +/* Scroll lines upward in given window, or clear window if only one line. */ +static void +scroll_window(winid wid) +{ + directional_scroll(wid,1); +} + +static void +unscroll_window(winid wid) +{ + directional_scroll(wid,-1); +} + +static void +directional_scroll(winid wid, int nlines) +{ + int wh, ww, s_top, s_bottom; + boolean border = curses_window_has_border(wid); + WINDOW *win = curses_get_nhwin(wid); + + curses_get_window_size(wid, &wh, &ww); + if (wh == 1) { + curses_clear_nhwin(wid); + return; + } + if (border) { + s_top = 1; + s_bottom = wh; + } else { + s_top = 0; + s_bottom = wh - 1; + } + scrollok(win, TRUE); + wsetscrreg(win, s_top, s_bottom); + wscrl(win, nlines); + scrollok(win, FALSE); + if (wid == MESSAGE_WIN) { + if (border) + mx = 1; + else + mx = 0; + } + if (border) { + box(win, 0, 0); + } + wrefresh(win); +} + + +/* Add given line to message history */ + +static void +mesg_add_line(char *mline) +{ + nhprev_mesg *tmp_mesg = NULL; + nhprev_mesg *current_mesg = malloc(sizeof (nhprev_mesg)); + + current_mesg->str = curses_copy_of(mline); + current_mesg->turn = moves; + current_mesg->next_mesg = NULL; + + if (num_messages == 0) { + first_mesg = current_mesg; + } + + if (last_mesg != NULL) { + last_mesg->next_mesg = current_mesg; + } + current_mesg->prev_mesg = last_mesg; + last_mesg = current_mesg; + + + if (num_messages < max_messages) { + num_messages++; + } else { + tmp_mesg = first_mesg->next_mesg; + free(first_mesg); + first_mesg = tmp_mesg; + } +} + + +/* Returns specified line from message history, or NULL if out of bounds */ + +static nhprev_mesg * +get_msg_line(boolean reverse, int mindex) +{ + int count; + nhprev_mesg *current_mesg; + + if (reverse) { + current_mesg = last_mesg; + for (count = 0; count < mindex; count++) { + if (current_mesg == NULL) { + return NULL; + } + current_mesg = current_mesg->prev_mesg; + } + return current_mesg; + } else { + current_mesg = first_mesg; + for (count = 0; count < mindex; count++) { + if (current_mesg == NULL) { + return NULL; + } + current_mesg = current_mesg->next_mesg; + } + return current_mesg; + } +} diff --git a/win/curses/cursmesg.h b/win/curses/cursmesg.h new file mode 100644 index 000000000..54af5f9b3 --- /dev/null +++ b/win/curses/cursmesg.h @@ -0,0 +1,19 @@ +/* vim:set cin ft=c sw=4 sts=4 ts=8 et ai cino=Ls\:0t0(0 : -*- mode:c;fill-column:80;tab-width:8;c-basic-offset:4;indent-tabs-mode:nil;c-file-style:"k&r" -*-*/ + +#ifndef CURSMESG_H +# define CURSMESG_H + + +/* Global declarations */ + +void curses_message_win_puts(const char *message, boolean recursed); +int curses_block(boolean require_tab); +int curses_more(void); +void curses_clear_unhighlight_message_window(void); +void curses_message_win_getline(const char *prompt, char *answer, int buffer); +void curses_last_messages(void); +void curses_init_mesg_history(void); +void curses_prev_mesg(void); +void curses_count_window(const char *count_text); + +#endif /* CURSMESG_H */ diff --git a/win/curses/cursmisc.c b/win/curses/cursmisc.c new file mode 100644 index 000000000..4b424884d --- /dev/null +++ b/win/curses/cursmisc.c @@ -0,0 +1,880 @@ +/* vim:set cin ft=c sw=4 sts=4 ts=8 et ai cino=Ls\:0t0(0 : -*- mode:c;fill-column:80;tab-width:8;c-basic-offset:4;indent-tabs-mode:nil;c-file-style:"k&r" -*-*/ + +#include "curses.h" +#include "hack.h" +#include "wincurs.h" +#include "cursmisc.h" +#include "func_tab.h" +#include "dlb.h" + +#include + +/* Misc. curses interface functions */ + +/* Private declarations */ + +static int curs_x = -1; +static int curs_y = -1; + +static int parse_escape_sequence(void); + +/* Macros for Control and Alt keys */ + +#ifndef M +# ifndef NHSTDC +# define M(c) (0x80 | (c)) +# else +# define M(c) ((c) - 128) +# endif/* NHSTDC */ +#endif +#ifndef C +# define C(c) (0x1f & (c)) +#endif + + +/* Read a character of input from the user */ + +int +curses_read_char() +{ + int ch, tmpch; + + ch = getch(); + tmpch = ch; + ch = curses_convert_keys(ch); + + if (ch == 0) { + ch = '\033'; /* map NUL to ESC since nethack doesn't expect NUL */ + } +#if defined(ALT_0) && defined(ALT_9) /* PDCurses, maybe others */ + if ((ch >= ALT_0) && (ch <= ALT_9)) { + tmpch = (ch - ALT_0) + '0'; + ch = M(tmpch); + } +#endif + +#if defined(ALT_A) && defined(ALT_Z) /* PDCurses, maybe others */ + if ((ch >= ALT_A) && (ch <= ALT_Z)) { + tmpch = (ch - ALT_A) + 'a'; + ch = M(tmpch); + } +#endif + +#ifdef KEY_RESIZE + /* Handle resize events via get_nh_event, not this code */ + if (ch == KEY_RESIZE) { + ch = '\033'; /* NetHack doesn't know what to do with KEY_RESIZE */ + } +#endif + + if (counting && !isdigit(ch)) { /* Dismiss count window if necissary */ + curses_count_window(NULL); + curses_refresh_nethack_windows(); + } + + return ch; +} + +/* Turn on or off the specified color and / or attribute */ + +void +curses_toggle_color_attr(WINDOW * win, int color, int attr, int onoff) +{ +#ifdef TEXTCOLOR + int curses_color; + + /* Map color disabled */ + if ((!iflags.wc_color) && (win == mapwin)) { + return; + } + + /* GUI color disabled */ +// if ((!iflags.wc2_guicolor) && (win != mapwin)) { +// return; +// } + + if (color == 0) { /* make black fg visible */ +# ifdef USE_DARKGRAY + if (iflags.wc2_darkgray) { + if (can_change_color() && (COLORS > 16)) { + /* colorpair for black is already darkgray */ + } else { /* Use bold for a bright black */ + + wattron(win, A_BOLD); + } + } else +# endif/* USE_DARKGRAY */ + color = CLR_BLUE; + } + curses_color = color + 1; + if (COLORS < 16) { + if (curses_color > 8 && curses_color < 17) + curses_color -= 8; + else if (curses_color > (17 + 16)) + curses_color -= 16; + } + if (onoff == ON) { /* Turn on color/attributes */ + if (color != NONE) { + if ((((color > 7) && (color < 17)) || + (color > 17 + 17)) && (COLORS < 16)) { + wattron(win, A_BOLD); + } + wattron(win, COLOR_PAIR(curses_color)); + } + + if (attr != NONE) { + wattron(win, attr); + } + } else { /* Turn off color/attributes */ + + if (color != NONE) { + if ((color > 7) && (COLORS < 16)) { + wattroff(win, A_BOLD); + } +# ifdef USE_DARKGRAY + if ((color == 0) && (!can_change_color() || (COLORS <= 16))) { + wattroff(win, A_BOLD); + } +# else + if (iflags.use_inverse) { + wattroff(win, A_REVERSE); + } +# endif/* DARKGRAY */ + wattroff(win, COLOR_PAIR(curses_color)); + } + + if (attr != NONE) { + wattroff(win, attr); + } + } +#endif /* TEXTCOLOR */ +} + + +/* clean up and quit - taken from tty port */ + +void +curses_bail(const char *mesg) +{ + clearlocks(); + curses_exit_nhwindows(mesg); + nh_terminate(EXIT_SUCCESS); +} + + +/* Return a winid for a new window of the given type */ + +winid +curses_get_wid(int type) +{ + winid ret; + static winid menu_wid = 20; /* Always even */ + static winid text_wid = 21; /* Always odd */ + + switch (type) { + case NHW_MESSAGE: + return MESSAGE_WIN; + case NHW_MAP: + return MAP_WIN; + case NHW_STATUS: + return STATUS_WIN; + case NHW_MENU: + ret = menu_wid; + break; + case NHW_TEXT: + ret = text_wid; + break; + default: + panic("curses_get_wid: unsupported window type"); + ret = -1; /* Not reached */ + } + + while (curses_window_exists(ret)) { + ret += 2; + if ((ret + 2) > 10000) { /* Avoid "wid2k" problem */ + ret -= 9900; + } + } + + if (type == NHW_MENU) { + menu_wid += 2; + } else { + text_wid += 2; + } + + return ret; +} + + +/* + * Allocate a copy of the given string. If null, return a string of + * zero length. + * + * This is taken from copy_of() in tty/wintty.c. + */ + +char * +curses_copy_of(const char *s) +{ + if (!s) + s = ""; + return strcpy((char *) alloc((unsigned) (strlen(s) + 1)), s); +} + + +/* Determine the number of lines needed for a string for a dialog window +of the given width */ + +int +curses_num_lines(const char *str, int width) +{ + int last_space, count; + int curline = 1; + char substr[BUFSZ]; + char tmpstr[BUFSZ]; + + strncpy(substr, str, BUFSZ-1); + substr[BUFSZ-1] = '\0'; + + while (strlen(substr) > (size_t) width) { + last_space = 0; + + for (count = 0; count <= width; count++) { + if (substr[count] == ' ') + last_space = count; + + } + if (last_space == 0) { /* No spaces found */ + last_space = count - 1; + } + for (count = (last_space + 1); (size_t) count < strlen(substr); count++) { + tmpstr[count - (last_space + 1)] = substr[count]; + } + tmpstr[count - (last_space + 1)] = '\0'; + strcpy(substr, tmpstr); + curline++; + } + + return curline; +} + + +/* Break string into smaller lines to fit into a dialog window of the +given width */ + +char * +curses_break_str(const char *str, int width, int line_num) +{ + int last_space, count; + char *retstr; + int curline = 0; + int strsize = strlen(str) + 1; +#if __STDC_VERSION__ >= 199901L + char substr[strsize]; + char curstr[strsize]; + char tmpstr[strsize]; + + strcpy(substr, str); +#else +#ifndef BUFSZ +#define BUFSZ 256 +#endif + char substr[BUFSZ * 2]; + char curstr[BUFSZ * 2]; + char tmpstr[BUFSZ * 2]; + + if (strsize > (BUFSZ * 2) - 1) { + paniclog("curses", "curses_break_str() string too long."); + strncpy(substr, str, (BUFSZ * 2) - 2); + substr[(BUFSZ * 2) - 1] = '\0'; + } else + strcpy(substr, str); +#endif + + while (curline < line_num) { + if (strlen(substr) == 0) { + break; + } + curline++; + last_space = 0; + for (count = 0; count <= width; count++) { + if (substr[count] == ' ') { + last_space = count; + } else if (substr[count] == '\0') { + last_space = count; + break; + } + } + if (last_space == 0) { /* No spaces found */ + last_space = count - 1; + } + for (count = 0; count < last_space; count++) { + curstr[count] = substr[count]; + } + curstr[count] = '\0'; + if (substr[count] == '\0') { + break; + } + for (count = (last_space + 1); (size_t) count < strlen(substr); count++) { + tmpstr[count - (last_space + 1)] = substr[count]; + } + tmpstr[count - (last_space + 1)] = '\0'; + strcpy(substr, tmpstr); + } + + if (curline < line_num) { + return NULL; + } + + retstr = curses_copy_of(curstr); + + return retstr; +} + + +/* Return the remaining portion of a string after hacking-off line_num lines */ + +char * +curses_str_remainder(const char *str, int width, int line_num) +{ + int last_space, count; + char *retstr; + int curline = 0; + int strsize = strlen(str) + 1; +#if __STDC_VERSION__ >= 199901L + char substr[strsize]; + char curstr[strsize]; + char tmpstr[strsize]; + + strcpy(substr, str); +#else +#ifndef BUFSZ +#define BUFSZ 256 +#endif + char substr[BUFSZ * 2]; + char curstr[BUFSZ * 2]; + char tmpstr[BUFSZ * 2]; + + if (strsize > (BUFSZ * 2) - 1) { + paniclog("curses", "curses_str_remainder() string too long."); + strncpy(substr, str, (BUFSZ * 2) - 2); + substr[(BUFSZ * 2) - 1] = '\0'; + } else + strcpy(substr, str); +#endif + + while (curline < line_num) { + if (strlen(substr) == 0) { + break; + } + curline++; + last_space = 0; + for (count = 0; count <= width; count++) { + if (substr[count] == ' ') { + last_space = count; + } else if (substr[count] == '\0') { + last_space = count; + break; + } + } + if (last_space == 0) { /* No spaces found */ + last_space = count - 1; + } + for (count = 0; count < last_space; count++) { + curstr[count] = substr[count]; + } + curstr[count] = '\0'; + if (substr[count] == '\0') { + break; + } + for (count = (last_space + 1); (size_t) count < strlen(substr); count++) { + tmpstr[count - (last_space + 1)] = substr[count]; + } + tmpstr[count - (last_space + 1)] = '\0'; + strcpy(substr, tmpstr); + } + + if (curline < line_num) { + return NULL; + } + + retstr = curses_copy_of(substr); + + return retstr; +} + + +/* Determine if the given NetHack winid is a menu window */ + +boolean +curses_is_menu(winid wid) +{ + if ((wid > 19) && !(wid % 2)) { /* Even number */ + return TRUE; + } else { + return FALSE; + } +} + + +/* Determine if the given NetHack winid is a text window */ + +boolean +curses_is_text(winid wid) +{ + if ((wid > 19) && (wid % 2)) { /* Odd number */ + return TRUE; + } else { + return FALSE; + } +} + + +/* Replace certain characters with portable drawing characters if +cursesgraphics option is enabled */ + +int +curses_convert_glyph(int ch, int glyph) +{ + int symbol; + + if (Is_rogue_level(&u.uz)) { + return ch; + } + + /* Save some processing time by returning if the glyph represents + an object that we don't have custom characters for */ + if (!glyph_is_cmap(glyph)) { + return ch; + } + + symbol = glyph_to_cmap(glyph); + + /* If user selected a custom character for this object, don't + override this. */ + if (((glyph_is_cmap(glyph)) && (ch != showsyms[symbol]))) { + return ch; + } + + switch (symbol) { + case S_vwall: + return ACS_VLINE; + case S_hwall: + return ACS_HLINE; + case S_tlcorn: + return ACS_ULCORNER; + case S_trcorn: + return ACS_URCORNER; + case S_blcorn: + return ACS_LLCORNER; + case S_brcorn: + return ACS_LRCORNER; + case S_crwall: + return ACS_PLUS; + case S_tuwall: + return ACS_BTEE; + case S_tdwall: + return ACS_TTEE; + case S_tlwall: + return ACS_RTEE; + case S_trwall: + return ACS_LTEE; + case S_tree: + return ACS_PLMINUS; + case S_corr: + return ACS_CKBOARD; + case S_litcorr: + return ACS_CKBOARD; + } + + return ch; +} + + +/* Move text cursor to specified coordinates in the given NetHack window */ + +void +curses_move_cursor(winid wid, int x, int y) +{ + int sx, sy, ex, ey; + int xadj = 0; + int yadj = 0; + +#ifndef PDCURSES + WINDOW *win = curses_get_nhwin(MAP_WIN); +#endif + + if (wid != MAP_WIN) { + return; + } +#ifdef PDCURSES + /* PDCurses seems to not handle wmove correctly, so we use move and + physical screen coordinates instead */ + curses_get_window_xy(wid, &xadj, &yadj); +#endif + curs_x = x + xadj; + curs_y = y + yadj; + curses_map_borders(&sx, &sy, &ex, &ey, x, y); + + if (curses_window_has_border(wid)) { + curs_x++; + curs_y++; + } + + if ((x >= sx) && (x <= ex) && (y >= sy) && (y <= ey)) { + curs_x -= sx; + curs_y -= sy; +#ifdef PDCURSES + move(curs_y, curs_x); +#else + wmove(win, curs_y, curs_x); +#endif + } +} + + +/* Perform actions that should be done every turn before nhgetch() */ + +void +curses_prehousekeeping() +{ +#ifndef PDCURSES + WINDOW *win = curses_get_nhwin(MAP_WIN); +#endif /* PDCURSES */ + + if ((curs_x > -1) && (curs_y > -1)) { + curs_set(1); +#ifdef PDCURSES + /* PDCurses seems to not handle wmove correctly, so we use move + and physical screen coordinates instead */ + move(curs_y, curs_x); +#else + wmove(win, curs_y, curs_x); +#endif /* PDCURSES */ + curses_refresh_nhwin(MAP_WIN); + } +} + + +/* Perform actions that should be done every turn after nhgetch() */ + +void +curses_posthousekeeping() +{ + curs_set(0); + //curses_decrement_highlights(FALSE); + curses_clear_unhighlight_message_window(); +} + + +void +curses_view_file(const char *filename, boolean must_exist) +{ + winid wid; + anything *identifier; + char buf[BUFSZ]; + menu_item *selected = NULL; + dlb *fp = dlb_fopen(filename, "r"); + + if ((fp == NULL) && (must_exist)) { + pline("Cannot open %s for reading!", filename); + } + + if (fp == NULL) { + return; + } + + wid = curses_get_wid(NHW_MENU); + curses_create_nhmenu(wid); + identifier = malloc(sizeof (anything)); + identifier->a_void = NULL; + + while (dlb_fgets(buf, BUFSZ, fp) != NULL) { + curses_add_menu(wid, NO_GLYPH, identifier, 0, 0, A_NORMAL, buf, FALSE); + } + + dlb_fclose(fp); + curses_end_menu(wid, ""); + curses_select_menu(wid, PICK_NONE, &selected); +} + + +void +curses_rtrim(char *str) +{ + char *s; + + for (s = str; *s != '\0'; ++s); + for (--s; isspace(*s) && s > str; --s); + if (s == str) + *s = '\0'; + else + *(++s) = '\0'; +} + + +/* Read numbers until non-digit is encountered, and return number +in int form. */ + +int +curses_get_count(int first_digit) +{ + long current_count = first_digit; + int current_char; + + current_char = curses_read_char(); + + while (isdigit(current_char)) { + current_count = (current_count * 10) + (current_char - '0'); + if (current_count > LARGEST_INT) { + current_count = LARGEST_INT; + } + + pline("Count: %ld", current_count); + current_char = curses_read_char(); + } + + ungetch(current_char); + + if (current_char == '\033') { /* Cancelled with escape */ + current_count = -1; + } + + return current_count; +} + + +/* Convert the given NetHack text attributes into the format curses +understands, and return that format mask. */ + +int +curses_convert_attr(int attr) +{ + int curses_attr; + + switch (attr) { + case ATR_NONE: + curses_attr = A_NORMAL; + break; + case ATR_ULINE: + curses_attr = A_UNDERLINE; + break; + case ATR_BOLD: + curses_attr = A_BOLD; + break; + case ATR_BLINK: + curses_attr = A_BLINK; + break; + case ATR_INVERSE: + curses_attr = A_REVERSE; + break; + default: + curses_attr = A_NORMAL; + } + + return curses_attr; +} + + +/* Map letter attributes from a string to bitmask. Return mask on +success, or 0 if not found */ + +int +curses_read_attrs(char *attrs) +{ + int retattr = 0; + + if (strchr(attrs, 'b') || strchr(attrs, 'B')) { + retattr = retattr | A_BOLD; + } + if (strchr(attrs, 'i') || strchr(attrs, 'I')) { + retattr = retattr | A_REVERSE; + } + if (strchr(attrs, 'u') || strchr(attrs, 'U')) { + retattr = retattr | A_UNDERLINE; + } + if (strchr(attrs, 'k') || strchr(attrs, 'K')) { + retattr = retattr | A_BLINK; + } +#ifdef A_ITALIC + if (strchr(attrs, 't') || strchr(attrs, 'T')) { + retattr = retattr | A_ITALIC; + } +#endif +#ifdef A_RIGHTLINE + if (strchr(attrs, 'r') || strchr(attrs, 'R')) { + retattr = retattr | A_RIGHTLINE; + } +#endif +#ifdef A_LEFTLINE + if (strchr(attrs, 'l') || strchr(attrs, 'L')) { + retattr = retattr | A_LEFTLINE; + } +#endif + + return retattr; +} + + +/* Convert special keys into values that NetHack can understand. +Currently this is limited to arrow keys, but this may be expanded. */ + +int +curses_convert_keys(int key) +{ + int ret = key; + + if (ret == '\033') { + ret = parse_escape_sequence(); + } + + /* Handle arrow keys */ + switch (key) { + case KEY_LEFT: + if (iflags.num_pad) { + ret = '4'; + } else { + ret = 'h'; + } + break; + case KEY_RIGHT: + if (iflags.num_pad) { + ret = '6'; + } else { + ret = 'l'; + } + break; + case KEY_UP: + if (iflags.num_pad) { + ret = '8'; + } else { + ret = 'k'; + } + break; + case KEY_DOWN: + if (iflags.num_pad) { + ret = '2'; + } else { + ret = 'j'; + } + break; +#ifdef KEY_A1 + case KEY_A1: + if (iflags.num_pad) { + ret = '7'; + } else { + ret = 'y'; + } + break; +#endif /* KEY_A1 */ +#ifdef KEY_A3 + case KEY_A3: + if (iflags.num_pad) { + ret = '9'; + } else { + ret = 'u'; + } + break; +#endif /* KEY_A3 */ +#ifdef KEY_C1 + case KEY_C1: + if (iflags.num_pad) { + ret = '1'; + } else { + ret = 'b'; + } + break; +#endif /* KEY_C1 */ +#ifdef KEY_C3 + case KEY_C3: + if (iflags.num_pad) { + ret = '3'; + } else { + ret = 'n'; + } + break; +#endif /* KEY_C3 */ +#ifdef KEY_B2 + case KEY_B2: + if (iflags.num_pad) { + ret = '5'; + } else { + ret = 'g'; + } + break; +#endif /* KEY_B2 */ + } + + return ret; +} + + +/* Process mouse events. Mouse movement is processed until no further +mouse movement events are available. Returns 0 for a mouse click +event, or the first non-mouse key event in the case of mouse +movement. */ + +int +curses_get_mouse(int *mousex, int *mousey, int *mod) +{ + int key = '\033'; + +#ifdef NCURSES_MOUSE_VERSION + MEVENT event; + + if (getmouse(&event) == OK) { /* When the user clicks left mouse button */ + if (event.bstate & BUTTON1_CLICKED) { + /* See if coords are in map window & convert coords */ + if (wmouse_trafo(mapwin, &event.y, &event.x, TRUE)) { + key = 0; /* Flag mouse click */ + *mousex = event.x; + *mousey = event.y; + + if (curses_window_has_border(MAP_WIN)) { + (*mousex)--; + (*mousey)--; + } + + *mod = CLICK_1; + } + } + } +#endif /* NCURSES_MOUSE_VERSION */ + + return key; +} + + +static int +parse_escape_sequence(void) +{ +#ifndef PDCURSES + int ret; + + timeout(10); + + ret = getch(); + + if (ret != ERR) { /* Likely an escape sequence */ + if (((ret >= 'a') && (ret <= 'z')) || ((ret >= '0') && (ret <= '9'))) { + ret |= 0x80; /* Meta key support for most terminals */ + } else if (ret == 'O') { /* Numeric keypad */ + ret = getch(); + if ((ret != ERR) && (ret >= 112) && (ret <= 121)) { + ret = ret - 112 + '0'; /* Convert to number */ + } else { + ret = '\033'; /* Escape */ + } + } + } else { + ret = '\033'; /* Just an escape character */ + } + + timeout(-1); + + return ret; +#else + return '\033'; +#endif /* !PDCURSES */ +} + diff --git a/win/curses/cursmisc.h b/win/curses/cursmisc.h new file mode 100644 index 000000000..50821c81a --- /dev/null +++ b/win/curses/cursmisc.h @@ -0,0 +1,30 @@ +/* vim:set cin ft=c sw=4 sts=4 ts=8 et ai cino=Ls\:0t0(0 : -*- mode:c;fill-column:80;tab-width:8;c-basic-offset:4;indent-tabs-mode:nil;c-file-style:"k&r" -*-*/ + +#ifndef CURSMISC_H +# define CURSMISC_H + +/* Global declarations */ + +int curses_read_char(void); +void curses_toggle_color_attr(WINDOW * win, int color, int attr, int onoff); +void curses_bail(const char *mesg); +winid curses_get_wid(int type); +char *curses_copy_of(const char *s); +int curses_num_lines(const char *str, int width); +char *curses_break_str(const char *str, int width, int line_num); +char *curses_str_remainder(const char *str, int width, int line_num); +boolean curses_is_menu(winid wid); +boolean curses_is_text(winid wid); +int curses_convert_glyph(int ch, int glyph); +void curses_move_cursor(winid wid, int x, int y); +void curses_prehousekeeping(void); +void curses_posthousekeeping(void); +void curses_view_file(const char *filename, boolean must_exist); +void curses_rtrim(char *str); +int curses_get_count(int first_digit); +int curses_convert_attr(int attr); +int curses_read_attrs(char *attrs); +int curses_convert_keys(int key); +int curses_get_mouse(int *mousex, int *mousey, int *mod); + +#endif /* CURSMISC_H */ diff --git a/win/curses/cursstat.c b/win/curses/cursstat.c new file mode 100644 index 000000000..ab3ca0ca5 --- /dev/null +++ b/win/curses/cursstat.c @@ -0,0 +1,1583 @@ +/* vim:set cin ft=c sw=4 sts=4 ts=8 et ai cino=Ls\:0t0(0 : -*- mode:c;fill-column:80;tab-width:8;c-basic-offset:4;indent-tabs-mode:nil;c-file-style:"k&r" -*-*/ + +#include /* toupper() */ +#include "curses.h" +#include "hack.h" +#include "wincurs.h" +#include "cursstat.h" + +/* Status window functions for curses interface */ + +/* + * The following data structures come from the genl_ routines in + * src/windows.c and as such are considered to be on the window-port + * "side" of things, rather than the NetHack-core "side" of things. + */ + +extern const char *status_fieldfmt[MAXBLSTATS]; +extern const char *status_fieldnm[MAXBLSTATS]; +extern char *status_vals[MAXBLSTATS]; +extern boolean status_activefields[MAXBLSTATS]; + +/* Long format fields for vertical window */ +static char *status_vals_long[MAXBLSTATS]; + +#ifdef STATUS_HILITES +static long curses_condition_bits; +static int curses_status_colors[MAXBLSTATS]; +int hpbar_percent, hpbar_color; + +static int FDECL(condcolor, (long, unsigned long *)); +static int FDECL(condattr, (long, unsigned long *)); +#endif /* STATUS_HILITES */ +static void FDECL(draw_status, (unsigned long *)); +static void FDECL(draw_classic, (boolean, unsigned long *)); +static void FDECL(draw_vertical, (boolean, unsigned long *)); +static void FDECL(draw_horizontal, (boolean, unsigned long *)); + +void +curses_status_init() +{ +#ifdef STATUS_HILITES + int i; + + for (i = 0; i < MAXBLSTATS; ++i) { + curses_status_colors[i] = NO_COLOR; /* no color */ + status_vals_long[i] = (char *) alloc(MAXCO); + *status_vals_long[i] = '\0'; + } + curses_condition_bits = 0L; + hpbar_percent = 0, hpbar_color = NO_COLOR; +#endif /* STATUS_HILITES */ + + /* let genl_status_init do most of the initialization */ + genl_status_init(); +} + +/* + * *_status_update() + * -- update the value of a status field. + * -- the fldindex identifies which field is changing and + * is an integer index value from botl.h + * -- fldindex could be any one of the following from botl.h: + * BL_TITLE, BL_STR, BL_DX, BL_CO, BL_IN, BL_WI, BL_CH, + * BL_ALIGN, BL_SCORE, BL_CAP, BL_GOLD, BL_ENE, BL_ENEMAX, + * BL_XP, BL_AC, BL_HD, BL_TIME, BL_HUNGER, BL_HP, BL_HPMAX, + * BL_LEVELDESC, BL_EXP, BL_CONDITION + * -- fldindex could also be BL_FLUSH (-1), which is not really + * a field index, but is a special trigger to tell the + * windowport that it should redisplay all its status fields, + * even if no changes have been presented to it. + * -- ptr is usually a "char *", unless fldindex is BL_CONDITION. + * If fldindex is BL_CONDITION, then ptr is a long value with + * any or none of the following bits set (from botl.h): + * BL_MASK_STONE 0x00000001L + * BL_MASK_SLIME 0x00000002L + * BL_MASK_STRNGL 0x00000004L + * BL_MASK_FOODPOIS 0x00000008L + * BL_MASK_TERMILL 0x00000010L + * BL_MASK_BLIND 0x00000020L + * BL_MASK_DEAF 0x00000040L + * BL_MASK_STUN 0x00000080L + * BL_MASK_CONF 0x00000100L + * BL_MASK_HALLU 0x00000200L + * BL_MASK_LEV 0x00000400L + * BL_MASK_FLY 0x00000800L + * BL_MASK_RIDE 0x00001000L + * -- The value passed for BL_GOLD includes an encoded leading + * symbol for GOLD "\GXXXXNNNN:nnn". If the window port needs to use + * the textual gold amount without the leading "$:" the port will + * have to skip past ':' in the passed "ptr" for the BL_GOLD case. + * -- color is an unsigned int. + * color_index = color & 0x00FF; CLR_* value + * attribute = color & 0xFF00 >> 8; BL_* values + * This holds the color and attribute that the field should + * be displayed in. + * This is relevant for everything except BL_CONDITION fldindex. + * If fldindex is BL_CONDITION, this parameter should be ignored, + * as condition hilighting is done via the next colormasks + * parameter instead. + * + * -- colormasks - pointer to cond_hilites[] array of colormasks. + * Only relevant for BL_CONDITION fldindex. The window port + * should ignore this parameter for other fldindex values. + * Each condition bit must only ever appear in one of the + * CLR_ array members, but can appear in multiple HL_ATTCLR_ + * offsets (because more than one attribute can co-exist). + * See doc/window.doc for more details. + */ + +/* new approach through status_update() only */ +#define Begin_Attr(m) \ + if (m) { \ + if ((m) & HL_BOLD) \ + wattron(win, A_BOLD); \ + if ((m) & HL_INVERSE) \ + wattron(win,A_REVERSE); \ + if ((m) & HL_ULINE) \ + wattron(win,A_UNDERLINE); \ + if ((m) & HL_BLINK) \ + wattron(win,A_BLINK); \ + if ((m) & HL_DIM) \ + wattron(win,A_DIM); \ + } + +#define End_Attr(m) \ + if (m) { \ + if ((m) & HL_DIM) \ + wattroff(win,A_DIM); \ + if ((m) & HL_BLINK) \ + wattroff(win,A_BLINK); \ + if ((m) & HL_ULINE) \ + wattroff(win,A_UNDERLINE); \ + if ((m) & HL_INVERSE) \ + wattroff(win,A_REVERSE); \ + if ((m) & HL_BOLD) \ + wattroff(win,A_BOLD); \ + } + +#ifdef STATUS_HILITES + +#ifdef TEXTCOLOR +#define MaybeDisplayCond(bm,txt) \ + if (curses_condition_bits & (bm)) { \ + putstr(STATUS_WIN, 0, " "); \ + if (iflags.hilite_delta) { \ + attrmask = condattr((bm), colormasks); \ + Begin_Attr(attrmask); \ + if ((coloridx = condcolor((bm), colormasks)) != NO_COLOR) \ + curses_toggle_color_attr(win, coloridx, NONE, ON); \ + } \ + putstr(STATUS_WIN, 0, (txt)); \ + if (iflags.hilite_delta) { \ + if (coloridx != NO_COLOR) \ + curses_toggle_color_attr(win, coloridx, NONE, OFF); \ + End_Attr(attrmask); \ + } \ + } +#else +#define MaybeDisplayCond(bm,txt) \ + if (curses_condition_bits & (bm)) { \ + putstr(STATUS_WIN, 0, " "); \ + if (iflags.hilite_delta) { \ + attrmask = condattr((bm), colormasks); \ + Begin_Attr(attrmask); \ + } \ + putstr(STATUS_WIN, 0, (txt)); \ + if (iflags.hilite_delta) { \ + End_Attr(attrmask); \ + } \ + } +#endif + +void +curses_status_update(fldidx, ptr, chg, percent, color, colormasks) +int fldidx, chg UNUSED, percent, color; +genericptr_t ptr; +unsigned long *colormasks; +{ + long *condptr = (long *) ptr; + char *text = (char *) ptr; + char *goldnum = NULL; + static boolean oncearound = FALSE; /* prevent premature partial display */ + boolean use_name = TRUE; + + if (fldidx != BL_FLUSH) { + if (!status_activefields[fldidx]) + return; + if (fldidx == BL_GOLD) + goldnum = index(text,':') + 1; + switch (fldidx) { + case BL_CONDITION: + curses_condition_bits = *condptr; + oncearound = TRUE; + break; + case BL_TITLE: + case BL_HPMAX: + case BL_ENEMAX: + case BL_HUNGER: + case BL_CAP: + case BL_EXP: + use_name = FALSE; + /* FALLTHROUGH */ + default: + Sprintf(status_vals[fldidx], + (fldidx == BL_TITLE && iflags.wc2_hitpointbar) ? "%-30s" : + status_fieldfmt[fldidx] ? status_fieldfmt[fldidx] : "%s", + text); + if (use_name) { + Sprintf(status_vals_long[fldidx], "%-16s: %s", + status_fieldnm[fldidx], goldnum ? goldnum : text); + *(status_vals_long[fldidx]) = toupper((*status_vals_long[fldidx])); + } else + Strcpy(status_vals_long[fldidx], status_vals[fldidx]); +#ifdef TEXTCOLOR + curses_status_colors[fldidx] = color; +#else + curses_status_colors[fldidx] = NO_COLOR; +#endif + if (iflags.wc2_hitpointbar && fldidx == BL_HP) { + hpbar_percent = percent; +#ifdef TEXTCOLOR + hpbar_color = color; +#else + hpbar_color = NO_COLOR; +#endif + } + break; + } + } + + if (!oncearound) return; + draw_status(colormasks); +} + +void +draw_status(colormasks) +unsigned long *colormasks; +{ + boolean horiz = FALSE; + WINDOW *win = curses_get_nhwin(STATUS_WIN); + int orient = curses_get_window_orientation(STATUS_WIN); + boolean border = curses_window_has_border(STATUS_WIN); + + if ((orient != ALIGN_RIGHT) && (orient != ALIGN_LEFT)) + horiz = TRUE; + + /* Figure out if we have proper window dimensions for horizontal statusbar. */ + if (horiz) { + /* correct y */ + int cy = 3; + if (iflags.statuslines < 3) + cy = 2; + + /* actual y (and x) */ + int ax = 0; + int ay = 0; + getmaxyx(win, ay, ax); + if (border) + ay -= 2; + + if (cy != ay) { /* something changed. Redo everything */ + curses_create_main_windows(); + curses_last_messages(); + doredraw(); + win = curses_get_nhwin(STATUS_WIN); + } + } + + werase(win); + if (horiz) { + if (iflags.statuslines < 3) + draw_classic(border, colormasks); + else + draw_horizontal(border, colormasks); + } else + draw_vertical(border, colormasks); + + if (border) + box(win, 0, 0); + wnoutrefresh(win); +} + +/* The 'classic' NetHack 3.x status layout */ +void +draw_classic(border, colormasks) +boolean border; +unsigned long *colormasks; +{ + enum statusfields fieldorder[2][15] = { + { BL_TITLE, BL_STR, BL_DX, BL_CO, BL_IN, BL_WI, BL_CH, BL_ALIGN, + BL_SCORE, BL_FLUSH, BL_FLUSH, BL_FLUSH, BL_FLUSH, BL_FLUSH, + BL_FLUSH }, + { BL_LEVELDESC, BL_GOLD, BL_HP, BL_HPMAX, BL_ENE, BL_ENEMAX, + BL_AC, BL_XP, BL_EXP, BL_HD, BL_TIME, BL_HUNGER, + BL_CAP, BL_CONDITION, BL_FLUSH } + }; +#ifdef TEXTCOLOR + int coloridx = NO_COLOR; +#endif + int i, attrmask = 0; + char *text; + int attridx = 0; + + WINDOW *win = curses_get_nhwin(STATUS_WIN); + if (border) wmove(win, 1, 1); + else wmove(win, 0, 0); + for (i = 0; fieldorder[0][i] != BL_FLUSH; ++i) { + int fldidx1 = fieldorder[0][i]; + if (status_activefields[fldidx1]) { + if (fldidx1 != BL_TITLE || !iflags.wc2_hitpointbar) { +#ifdef TEXTCOLOR + coloridx = curses_status_colors[fldidx1] & 0x00FF; +#endif + attridx = (curses_status_colors[fldidx1] & 0xFF00) >> 8; + text = status_vals[fldidx1]; + if (iflags.hilite_delta) { + if (*text == ' ') { + putstr(STATUS_WIN, 0, " "); + text++; + } + /* multiple attributes can be in effect concurrently */ + Begin_Attr(attridx); +#ifdef TEXTCOLOR + if (coloridx != NO_COLOR && coloridx != CLR_MAX) + curses_toggle_color_attr(win, coloridx, NONE, ON); +#endif + } + + putstr(STATUS_WIN, 0, text); + + if (iflags.hilite_delta) { +#ifdef TEXTCOLOR + if (coloridx != NO_COLOR) + curses_toggle_color_attr(win, coloridx,NONE,OFF); +#endif + End_Attr(attridx); + } + } else { + /* hitpointbar using hp percent calculation */ + int bar_pos, bar_len; + char *bar2 = (char *)0; + char bar[MAXCO], savedch; + boolean twoparts = FALSE; + + text = status_vals[fldidx1]; + bar_len = strlen(text); + if (bar_len < MAXCO-1) { + Strcpy(bar, text); + bar_pos = (bar_len * hpbar_percent) / 100; + if (bar_pos < 1 && hpbar_percent > 0) + bar_pos = 1; + if (bar_pos >= bar_len && hpbar_percent < 100) + bar_pos = bar_len - 1; + if (bar_pos > 0 && bar_pos < bar_len) { + twoparts = TRUE; + bar2 = &bar[bar_pos]; + savedch = *bar2; + *bar2 = '\0'; + } + } + if (iflags.hilite_delta && iflags.wc2_hitpointbar) { + putstr(STATUS_WIN, 0, "["); +#ifdef TEXTCOLOR + coloridx = hpbar_color & 0x00FF; + /* attridx = (hpbar_color & 0xFF00) >> 8; */ + if (coloridx != NO_COLOR) + curses_toggle_color_attr(win,coloridx,NONE,ON); +#endif + wattron(win,A_REVERSE); + putstr(STATUS_WIN, 0, bar); + wattroff(win,A_REVERSE); +#ifdef TEXTCOLOR + if (coloridx != NO_COLOR) + curses_toggle_color_attr(win,coloridx,NONE,OFF); +#endif + if (twoparts) { + *bar2 = savedch; + putstr(STATUS_WIN, 0, bar2); + } + putstr(STATUS_WIN, 0, "]"); + } else + putstr(STATUS_WIN, 0, text); + } + } + } + wclrtoeol(win); + if (border) wmove(win, 2, 1); + else wmove (win, 1, 0); + for (i = 0; fieldorder[1][i] != BL_FLUSH; ++i) { + int fldidx2 = fieldorder[1][i]; + + if (status_activefields[fldidx2]) { + if (fldidx2 != BL_CONDITION) { +#ifdef TEXTCOLOR + coloridx = curses_status_colors[fldidx2] & 0x00FF; +#endif + attridx = (curses_status_colors[fldidx2] & 0xFF00) >> 8; + text = status_vals[fldidx2]; + if (iflags.hilite_delta) { + if (*text == ' ') { + putstr(STATUS_WIN, 0, " "); + text++; + } + /* multiple attributes can be in effect concurrently */ + Begin_Attr(attridx); +#ifdef TEXTCOLOR + if (coloridx != NO_COLOR && coloridx != CLR_MAX) + curses_toggle_color_attr(win,coloridx,NONE,ON); +#endif + } + + if (fldidx2 == BL_GOLD) { + /* putmixed() due to GOLD glyph */ + putmixed(STATUS_WIN, 0, text); + } else { + putstr(STATUS_WIN, 0, text); + } + + if (iflags.hilite_delta) { +#ifdef TEXTCOLOR + if (coloridx != NO_COLOR) + curses_toggle_color_attr(win,coloridx,NONE,OFF); +#endif + End_Attr(attridx); + } + } else { + MaybeDisplayCond(BL_MASK_STONE, "Stone"); + MaybeDisplayCond(BL_MASK_SLIME, "Slime"); + MaybeDisplayCond(BL_MASK_STRNGL, "Strngl"); + MaybeDisplayCond(BL_MASK_FOODPOIS, "FoodPois"); + MaybeDisplayCond(BL_MASK_TERMILL, "TermIll"); + MaybeDisplayCond(BL_MASK_BLIND, "Blind"); + MaybeDisplayCond(BL_MASK_DEAF, "Deaf"); + MaybeDisplayCond(BL_MASK_STUN, "Stun"); + MaybeDisplayCond(BL_MASK_CONF, "Conf"); + MaybeDisplayCond(BL_MASK_HALLU, "Hallu"); + MaybeDisplayCond(BL_MASK_LEV, "Lev"); + MaybeDisplayCond(BL_MASK_FLY, "Fly"); + MaybeDisplayCond(BL_MASK_RIDE, "Ride"); + } + } + } + wclrtoeol(win); + return; +} + +/* The new NH4-style horizontal layout on 3 lines */ +void +draw_horizontal(border, colormasks) +boolean border; +unsigned long *colormasks; +{ + /* TODO: implement this */ + /* for now, just draw classic */ + draw_classic(border, colormasks); +} + +/* The vertical layout from the original curses implementation */ +void +draw_vertical(border, colormasks) +boolean border; +unsigned long *colormasks; +{ + enum statusfields fieldorder[24] = { + BL_TITLE, BL_STR, BL_DX, BL_CO, BL_IN, BL_WI, BL_CH, BL_ALIGN, + BL_SCORE, BL_LEVELDESC, BL_GOLD, BL_HP, BL_HPMAX, BL_ENE, BL_ENEMAX, + BL_AC, BL_XP, BL_EXP, BL_HD, BL_TIME, BL_HUNGER, + BL_CAP, BL_CONDITION, BL_FLUSH + }; +#ifdef TEXTCOLOR + int coloridx = NO_COLOR; +#endif + int i, attrmask = 0; + char *text; + int attridx = 0; + int x = 0, y = 0; + + WINDOW *win = curses_get_nhwin(STATUS_WIN); + if (border) x++,y++; + for (i = 0; fieldorder[i] != BL_FLUSH; ++i) { + int fldidx1 = fieldorder[i]; + if (status_activefields[fldidx1]) { + if (fldidx1 != BL_TITLE || !iflags.wc2_hitpointbar) { + + if (fldidx1 != BL_CONDITION) { +#ifdef TEXTCOLOR + coloridx = curses_status_colors[fldidx1] & 0x00FF; +#endif + attridx = (curses_status_colors[fldidx1] & 0xFF00) >> 8; + text = status_vals_long[fldidx1]; + if (iflags.hilite_delta) { + if (*text == ' ') { + putstr(STATUS_WIN, 0, " "); + text++; + } + /* multiple attributes can be in effect concurrently */ + Begin_Attr(attridx); +#ifdef TEXTCOLOR + if (coloridx != NO_COLOR && coloridx != CLR_MAX) + curses_toggle_color_attr(win, coloridx, NONE, ON); +#endif + } + + if (fldidx1 != BL_HPMAX + && fldidx1 != BL_ENEMAX + && fldidx1 != BL_EXP) + wmove(win, y++, x); /* everything on a new line except the above */ + + putstr(STATUS_WIN, 0, text); + + if (fldidx1 == BL_TITLE) y++; + + if (iflags.hilite_delta) { +#ifdef TEXTCOLOR + if (coloridx != NO_COLOR) + curses_toggle_color_attr(win, coloridx,NONE,OFF); +#endif + End_Attr(attridx); + } + } else { /* condition */ + MaybeDisplayCond(BL_MASK_STONE, "Stone"); + MaybeDisplayCond(BL_MASK_SLIME, "Slime"); + MaybeDisplayCond(BL_MASK_STRNGL, "Strngl"); + MaybeDisplayCond(BL_MASK_FOODPOIS, "FoodPois"); + MaybeDisplayCond(BL_MASK_TERMILL, "TermIll"); + MaybeDisplayCond(BL_MASK_BLIND, "Blind"); + MaybeDisplayCond(BL_MASK_DEAF, "Deaf"); + MaybeDisplayCond(BL_MASK_STUN, "Stun"); + MaybeDisplayCond(BL_MASK_CONF, "Conf"); + MaybeDisplayCond(BL_MASK_HALLU, "Hallu"); + MaybeDisplayCond(BL_MASK_LEV, "Lev"); + MaybeDisplayCond(BL_MASK_FLY, "Fly"); + MaybeDisplayCond(BL_MASK_RIDE, "Ride"); + } + } else { + /* hitpointbar using hp percent calculation */ + int bar_pos, bar_len; + char *bar2 = (char *)0; + char bar[MAXCO], savedch; + boolean twoparts = FALSE; + int height,width; + + text = status_vals[fldidx1]; + getmaxyx(win, height, width); + bar_len = min(strlen(text), (size_t)width - (border ? 4 : 2)); + text[bar_len] = '\0'; + if (bar_len < MAXCO-1) { + Strcpy(bar, text); + bar_pos = (bar_len * hpbar_percent) / 100; + if (bar_pos < 1 && hpbar_percent > 0) + bar_pos = 1; + if (bar_pos >= bar_len && hpbar_percent < 100) + bar_pos = bar_len - 1; + if (bar_pos > 0 && bar_pos < bar_len) { + twoparts = TRUE; + bar2 = &bar[bar_pos]; + savedch = *bar2; + *bar2 = '\0'; + } + } + wmove(win, y++, x); + if (iflags.hilite_delta && iflags.wc2_hitpointbar) { + putstr(STATUS_WIN, 0, "["); +#ifdef TEXTCOLOR + coloridx = hpbar_color & 0x00FF; + /* attridx = (hpbar_color & 0xFF00) >> 8; */ + if (coloridx != NO_COLOR) + curses_toggle_color_attr(win,coloridx,NONE,ON); +#endif + wattron(win,A_REVERSE); + putstr(STATUS_WIN, 0, bar); + wattroff(win,A_REVERSE); +#ifdef TEXTCOLOR + if (coloridx != NO_COLOR) + curses_toggle_color_attr(win,coloridx,NONE,OFF); +#endif + if (twoparts) { + *bar2 = savedch; + putstr(STATUS_WIN, 0, bar2); + } + putstr(STATUS_WIN, 0, "]"); + } else + putstr(STATUS_WIN, 0, text); + y++; /* blank line after title */ + } + } + } + return; +} + +#ifdef TEXTCOLOR +/* + * Return what color this condition should + * be displayed in based on user settings. + */ +int condcolor(bm, bmarray) +long bm; +unsigned long *bmarray; +{ + int i; + + if (bm && bmarray) + for (i = 0; i < CLR_MAX; ++i) { + if (bmarray[i] && (bm & bmarray[i])) + return i; + } + return NO_COLOR; +} +#endif /* TEXTCOLOR */ + +int condattr(bm, bmarray) +long bm; +unsigned long *bmarray; +{ + int attr = 0; + int i; + + if (bm && bmarray) { + for (i = HL_ATTCLR_DIM; i < BL_ATTCLR_MAX; ++i) { + if (bmarray[i] && (bm & bmarray[i])) { + switch(i) { + case HL_ATTCLR_DIM: + attr |= HL_DIM; + break; + case HL_ATTCLR_BLINK: + attr |= HL_BLINK; + break; + case HL_ATTCLR_ULINE: + attr |= HL_ULINE; + break; + case HL_ATTCLR_INVERSE: + attr |= HL_INVERSE; + break; + case HL_ATTCLR_BOLD: + attr |= HL_BOLD; + break; + } + } + } + } + return attr; +} +#endif /* STATUS_HILITES */ + +#if 0 //old stuff to be re-incorporated +/* Private declarations */ + +/* Used to track previous value of things, to highlight changes. */ +typedef struct nhs { + long value; + int highlight_turns; + int highlight_color; +} nhstat; + +static attr_t get_trouble_color(const char *); +static void draw_trouble_str(const char *); +static void print_statdiff(const char *append, nhstat *, int, int); +static void get_playerrank(char *); +static int hpen_color(boolean, int, int); +static void draw_bar(boolean, int, int, const char *); +static void draw_horizontal(int, int, int, int); +static void draw_horizontal_new(int, int, int, int); +static void draw_vertical(int, int, int, int); +static void curses_add_statuses(WINDOW *, boolean, boolean, int *, int *); +static void curses_add_status(WINDOW *, boolean, boolean, int *, int *, + const char *, int); +static int decrement_highlight(nhstat *, boolean); + +#ifdef STATUS_COLORS +static attr_t hpen_color_attr(boolean, int, int); +extern struct color_option text_color_of(const char *text, + const struct text_color_option *color_options); +struct color_option percentage_color_of(int value, int max, + const struct percent_color_option *color_options); + +extern const struct text_color_option *text_colors; +extern const struct percent_color_option *hp_colors; +extern const struct percent_color_option *pw_colors; +#endif + +/* Whether or not we have printed status window content at least once. + Used to ensure that prev* doesn't end up highlighted on game start. */ +static boolean first = TRUE; +static nhstat prevdepth; +static nhstat prevstr; +static nhstat prevint; +static nhstat prevwis; +static nhstat prevdex; +static nhstat prevcon; +static nhstat prevcha; +static nhstat prevau; +static nhstat prevlevel; +static nhstat prevac; +static nhstat prevexp; +static nhstat prevtime; + +#ifdef SCORE_ON_BOTL +static nhstat prevscore; +#endif + +extern const char *hu_stat[]; /* from eat.c */ +extern const char *enc_stat[]; /* from botl.c */ + +/* If the statuscolors patch isn't enabled, have some default colors for status problems + anyway */ + +struct statcolor { + const char *txt; /* For status problems */ + int color; /* Default color assuming STATUS_COLORS isn't enabled */ +}; + +static const struct statcolor default_colors[] = { + {"Satiated", CLR_YELLOW}, + {"Hungry", CLR_YELLOW}, + {"Weak", CLR_ORANGE}, + {"Fainted", CLR_BRIGHT_MAGENTA}, + {"Fainting", CLR_BRIGHT_MAGENTA}, + {"Burdened", CLR_RED}, + {"Stressed", CLR_RED}, + {"Strained", CLR_ORANGE}, + {"Overtaxed", CLR_ORANGE}, + {"Overloaded", CLR_BRIGHT_MAGENTA}, + {"Conf", CLR_BRIGHT_BLUE}, + {"Blind", CLR_BRIGHT_BLUE}, + {"Stun", CLR_BRIGHT_BLUE}, + {"Hallu", CLR_BRIGHT_BLUE}, + {"Ill", CLR_BRIGHT_MAGENTA}, + {"FoodPois", CLR_BRIGHT_MAGENTA}, + {"Slime", CLR_BRIGHT_MAGENTA}, + {NULL, NULL, NO_COLOR}, +}; + +static attr_t +get_trouble_color(const char *stat) +{ + attr_t res = curses_color_attr(CLR_GRAY, 0); + const struct statcolor *clr; + for (clr = default_colors; clr->txt; clr++) { + if (stat && !strcmp(clr->txt, stat)) { +#ifdef STATUS_COLORS + /* Check if we have a color enabled with statuscolors */ + if (!iflags.use_status_colors) + return curses_color_attr(CLR_GRAY, 0); /* no color configured */ + + struct color_option stat_color; + + stat_color = text_color_of(clr->txt, text_colors); + if (stat_color.color == NO_COLOR && !stat_color.attr_bits) + return curses_color_attr(CLR_GRAY, 0); + + if (stat_color.color != NO_COLOR) + res = curses_color_attr(stat_color.color, 0); + + res = curses_color_attr(stat_color.color, 0); + int count; + for (count = 0; (1 << count) <= stat_color.attr_bits; count++) { + if (count != ATR_NONE && + (stat_color.attr_bits & (1 << count))) + res |= curses_convert_attr(count); + } + + return res; +#else + return curses_color_attr(clr->color, 0); +#endif + } + } + + return res; +} + +/* TODO: This is in the wrong place. */ +void +get_playerrank(char *rank) +{ + char buf[BUFSZ]; + if (Upolyd) { + int k = 0; + + Strcpy(buf, mons[u.umonnum].mname); + while(buf[k] != 0) { + if ((k == 0 || (k > 0 && buf[k-1] == ' ')) && + 'a' <= buf[k] && buf[k] <= 'z') + buf[k] += 'A' - 'a'; + k++; + } + Strcpy(rank, buf); + } else + Strcpy(rank, rank_of(u.ulevel, Role_switch, flags.female)); +} + +/* Handles numerical stat changes of various kinds. + type is generally STAT_OTHER (generic "do nothing special"), + but is used if the stat needs to be handled in a special way. */ +static void +print_statdiff(const char *append, nhstat *stat, int new, int type) +{ + char buf[BUFSZ]; + WINDOW *win = curses_get_nhwin(STATUS_WIN); + + int color = CLR_GRAY; + + /* Turncount isn't highlighted, or it would be highlighted constantly. */ + if (type != STAT_TIME && new != stat->value) { + /* Less AC is better */ + if ((type == STAT_AC && new < stat->value) || + (type != STAT_AC && new > stat->value)) { + color = STAT_UP_COLOR; + if (type == STAT_GOLD) + color = HI_GOLD; + } else + color = STAT_DOWN_COLOR; + + stat->value = new; + stat->highlight_color = color; + stat->highlight_turns = 5; + } else if (stat->highlight_turns) + color = stat->highlight_color; + + attr_t attr = curses_color_attr(color, 0); + wattron(win, attr); + wprintw(win, "%s", append); + if (type == STAT_STR && new > 18) { + if (new > 118) + wprintw(win, "%d", new - 100); + else if (new == 118) + wprintw(win, "18/**"); + else + wprintw(win, "18/%02d", new - 18); + } else + wprintw(win, "%d", new); + + wattroff(win, attr); +} + +static void +draw_trouble_str(const char *str) +{ + WINDOW *win = curses_get_nhwin(STATUS_WIN); + + attr_t attr = get_trouble_color(str); + wattron(win, attr); + wprintw(win, "%s", str); + wattroff(win, attr); +} + +/* Returns a ncurses attribute for foreground and background. + This should probably be in cursinit.c or something. */ +attr_t +curses_color_attr(int nh_color, int bg_color) +{ + int color = nh_color + 1; + attr_t cattr = A_NORMAL; + + if (!nh_color) { +#ifdef USE_DARKGRAY + if (iflags.wc2_darkgray) { + if (!can_change_color() || COLORS <= 16) + cattr |= A_BOLD; + } else +#endif + color = COLOR_BLUE; + } + + if (COLORS < 16 && color > 8) { + color -= 8; + cattr = A_BOLD; + } + + /* Can we do background colors? We can if we have more than + 16*7 colors (more than 8*7 for terminals with bold) */ + if (COLOR_PAIRS > (COLORS >= 16 ? 16 : 8) * 7) { + /* NH3 has a rather overcomplicated way of defining + its colors past the first 16: + Pair Foreground Background + 17 Black Red + 18 Black Blue + 19 Red Red + 20 Red Blue + 21 Green Red + ... + (Foreground order: Black, Red, Green, Yellow, Blue, + Magenta, Cyan, Gray/White) + + To work around these oddities, we define backgrounds + by the following pairs: + + 16 COLORS + 49-64: Green + 65-80: Yellow + 81-96: Magenta + 97-112: Cyan + 113-128: Gray/White + + 8 COLORS + 9-16: Green + 33-40: Yellow + 41-48: Magenta + 49-56: Cyan + 57-64: Gray/White */ + + if (bg_color == nh_color) + color = 1; /* Make foreground black if fg==bg */ + + if (bg_color == CLR_RED || bg_color == CLR_BLUE) { + /* already defined before extension */ + color *= 2; + color += 16; + if (bg_color == CLR_RED) + color--; + } else { + boolean hicolor = FALSE; + if (COLORS >= 16) + hicolor = TRUE; + + switch (bg_color) { + case CLR_GREEN: + color = (hicolor ? 48 : 8) + color; + break; + case CLR_BROWN: + color = (hicolor ? 64 : 32) + color; + break; + case CLR_MAGENTA: + color = (hicolor ? 80 : 40) + color; + break; + case CLR_CYAN: + color = (hicolor ? 96 : 48) + color; + break; + case CLR_GRAY: + color = (hicolor ? 112 : 56) + color; + break; + default: + break; + } + } + } + cattr |= COLOR_PAIR(color); + + return cattr; +} + +/* Returns a complete curses attribute. Used to possibly bold/underline/etc HP/Pw. */ +#ifdef STATUS_COLORS +static attr_t +hpen_color_attr(boolean is_hp, int cur, int max) +{ + struct color_option stat_color; + int count; + attr_t attr = 0; + if (!iflags.use_status_colors) + return curses_color_attr(CLR_GRAY, 0); + + stat_color = percentage_color_of(cur, max, is_hp ? hp_colors : pw_colors); + + if (stat_color.color != NO_COLOR) + attr |= curses_color_attr(stat_color.color, 0); + + for (count = 0; (1 << count) <= stat_color.attr_bits; count++) { + if (count != ATR_NONE && (stat_color.attr_bits & (1 << count))) + attr |= curses_convert_attr(count); + } + + return attr; +} +#endif + +/* Return color for the HP bar. + With status colors ON, this respect its configuration (defaulting to gray), but + only obeys the color (no weird attributes for the HP bar). + With status colors OFF, this returns reasonable defaults which are also used + for the HP/Pw text itself. */ +static int +hpen_color(boolean is_hp, int cur, int max) +{ +#ifdef STATUS_COLORS + if (iflags.use_status_colors) { + struct color_option stat_color; + stat_color = percentage_color_of(cur, max, is_hp ? hp_colors : pw_colors); + + if (stat_color.color == NO_COLOR) + return CLR_GRAY; + else + return stat_color.color; + } else + return CLR_GRAY; +#endif + + int color = CLR_GRAY; + if (cur == max) + color = CLR_GRAY; + else if (cur * 3 > max * 2) /* >2/3 */ + color = is_hp ? CLR_GREEN : CLR_CYAN; + else if (cur * 3 > max) /* >1/3 */ + color = is_hp ? CLR_YELLOW : CLR_BLUE; + else if (cur * 7 > max) /* >1/7 */ + color = is_hp ? CLR_RED : CLR_MAGENTA; + else + color = is_hp ? CLR_ORANGE : CLR_BRIGHT_MAGENTA; + + return color; +} + +/* Draws a bar + is_hp: TRUE if we're drawing HP, Pw otherwise (determines colors) + cur/max: Current/max HP/Pw + title: Not NULL if we are drawing as part of an existing title. + Otherwise, the format is as follows: [ 11 / 11 ] */ +static void +draw_bar(boolean is_hp, int cur, int max, const char *title) +{ + WINDOW *win = curses_get_nhwin(STATUS_WIN); + +#ifdef STATUS_COLORS + if (!iflags.hitpointbar) { + wprintw(win, "%s", !title ? "---" : title); + return; + } +#endif + + char buf[BUFSZ]; + if (title) + Strcpy(buf, title); + else { + int len = 5; + sprintf(buf, "%*d / %-*d", len, cur, len, max); + } + + /* Colors */ + attr_t fillattr, attr; + int color = hpen_color(is_hp, cur, max); + int invcolor = color & 7; + + fillattr = curses_color_attr(color, invcolor); + attr = curses_color_attr(color, 0); + + /* Figure out how much of the bar to fill */ + int fill = 0; + int len = strlen(buf); + if (cur > 0 && max > 0) + fill = len * cur / max; + if (fill > len) + fill = len; + + waddch(win, '['); + wattron(win, fillattr); + wprintw(win, "%.*s", fill, buf); + wattroff(win, fillattr); + wattron(win, attr); + wprintw(win, "%.*s", len - fill, &buf[fill]); + wattroff(win, attr); + waddch(win, ']'); +} + +/* Update the status win - this is called when NetHack would normally + write to the status window, so we know somwthing has changed. We + override the write and update what needs to be updated ourselves. */ +void +curses_update_stats(void) +{ + WINDOW *win = curses_get_nhwin(STATUS_WIN); + + /* Clear the window */ + werase(win); + + int orient = curses_get_window_orientation(STATUS_WIN); + + boolean horiz = FALSE; + if ((orient != ALIGN_RIGHT) && (orient != ALIGN_LEFT)) + horiz = TRUE; + boolean border = curses_window_has_border(STATUS_WIN); + + /* Figure out if we have proper window dimensions for horizontal statusbar. */ + if (horiz) { + /* correct y */ + int cy = 3; + if (iflags.statuslines < 3) + cy = 2; + + /* actual y (and x) */ + int ax = 0; + int ay = 0; + getmaxyx(win, ay, ax); + if (border) + ay -= 2; + + if (cy != ay) { + curses_create_main_windows(); + curses_last_messages(); + doredraw(); + + /* Reset XP highlight (since classic_status and new show different numbers) */ + prevexp.highlight_turns = 0; + curses_update_stats(); + return; + } + } + + /* Starting x/y. Passed to draw_horizontal/draw_vertical to keep track of + window positioning. */ + int x = 0; + int y = 0; + + /* Don't start at border position if applicable */ + if (border) { + x++; + y++; + } + + /* Get HP values. */ + int hp = u.uhp; + int hpmax = u.uhpmax; + if (Upolyd) { + hp = u.mh; + hpmax = u.mhmax; + } + + if (orient != ALIGN_RIGHT && orient != ALIGN_LEFT) + draw_horizontal(x, y, hp, hpmax); + else + draw_vertical(x, y, hp, hpmax); + + if (border) + box(win, 0, 0); + + wnoutrefresh(win); + + if (first) { + first = FALSE; + + /* Zero highlight timers. This will call curses_update_status again if needed */ + curses_decrement_highlights(TRUE); + } +} + +static void +draw_horizontal(int x, int y, int hp, int hpmax) +{ + if (iflags.statuslines >= 3) { + /* Draw new-style statusbar */ + draw_horizontal_new(x, y, hp, hpmax); + return; + } + char buf[BUFSZ]; + char rank[BUFSZ]; + WINDOW *win = curses_get_nhwin(STATUS_WIN); + + /* Line 1 */ + wmove(win, y, x); + + get_playerrank(rank); + sprintf(buf, "%s the %s", plname, rank); + + /* Use the title as HP bar (similar to hitpointbar) */ + draw_bar(TRUE, hp, hpmax, buf); + + /* Attributes */ + print_statdiff(" St:", &prevstr, ACURR(A_STR), STAT_STR); + print_statdiff(" Dx:", &prevdex, ACURR(A_DEX), STAT_OTHER); + print_statdiff(" Co:", &prevcon, ACURR(A_CON), STAT_OTHER); + print_statdiff(" In:", &prevint, ACURR(A_INT), STAT_OTHER); + print_statdiff(" Wi:", &prevwis, ACURR(A_WIS), STAT_OTHER); + print_statdiff(" Ch:", &prevcha, ACURR(A_CHA), STAT_OTHER); + + wprintw(win, (u.ualign.type == A_CHAOTIC ? " Chaotic" : + u.ualign.type == A_NEUTRAL ? " Neutral" : " Lawful")); + +#ifdef SCORE_ON_BOTL + if (flags.showscore) + print_statdiff(" S:", &prevscore, botl_score(), STAT_OTHER); +#endif /* SCORE_ON_BOTL */ + + + /* Line 2 */ + y++; + wmove(win, y, x); + + describe_level(buf); + + wprintw(win, "%s", buf); + + print_statdiff("$", &prevau, money_cnt(invent), STAT_GOLD); + + /* HP/Pw use special coloring rules */ + attr_t hpattr, pwattr; +#ifdef STATUS_COLORS + hpattr = hpen_color_attr(TRUE, hp, hpmax); + pwattr = hpen_color_attr(FALSE, u.uen, u.uenmax); +#else + int hpcolor, pwcolor; + hpcolor = hpen_color(TRUE, hp, hpmax); + pwcolor = hpen_color(FALSE, u.uen, u.uenmax); + hpattr = curses_color_attr(hpcolor, 0); + pwattr = curses_color_attr(pwcolor, 0); +#endif + wprintw(win, " HP:"); + wattron(win, hpattr); + wprintw(win, "%d(%d)", (hp < 0) ? 0 : hp, hpmax); + wattroff(win, hpattr); + + wprintw(win, " Pw:"); + wattron(win, pwattr); + wprintw(win, "%d(%d)", u.uen, u.uenmax); + wattroff(win, pwattr); + + print_statdiff(" AC:", &prevac, u.uac, STAT_AC); + + if (Upolyd) + print_statdiff(" HD:", &prevlevel, mons[u.umonnum].mlevel, STAT_OTHER); + else if (flags.showexp) { + print_statdiff(" Xp:", &prevlevel, u.ulevel, STAT_OTHER); + /* use waddch, we don't want to highlight the '/' */ + waddch(win, '/'); + print_statdiff("", &prevexp, u.uexp, STAT_OTHER); + } + else + print_statdiff(" Exp:", &prevlevel, u.ulevel, STAT_OTHER); + + if (flags.time) + print_statdiff(" T:", &prevtime, moves, STAT_TIME); + + curses_add_statuses(win, FALSE, FALSE, NULL, NULL); +} + +static void +draw_horizontal_new(int x, int y, int hp, int hpmax) +{ + char buf[BUFSZ]; + char rank[BUFSZ]; + WINDOW *win = curses_get_nhwin(STATUS_WIN); + + /* Line 1 */ + wmove(win, y, x); + + get_playerrank(rank); + char race[BUFSZ]; + Strcpy(race, urace.adj); + race[0] = highc(race[0]); + wprintw(win, "%s the %s %s%s%s", plname, + (u.ualign.type == A_CHAOTIC ? "Chaotic" : + u.ualign.type == A_NEUTRAL ? "Neutral" : "Lawful"), + Upolyd ? "" : race, Upolyd ? "" : " ", + rank); + + /* Line 2 */ + y++; + wmove(win, y, x); + wprintw(win, "HP:"); + draw_bar(TRUE, hp, hpmax, NULL); + print_statdiff(" AC:", &prevac, u.uac, STAT_AC); + if (Upolyd) + print_statdiff(" HD:", &prevlevel, mons[u.umonnum].mlevel, STAT_OTHER); + else if (flags.showexp) { + /* Ensure that Xp have proper highlight on level change. */ + int levelchange = 0; + if (prevlevel.value != u.ulevel) { + if (prevlevel.value < u.ulevel) + levelchange = 1; + else + levelchange = 2; + } + print_statdiff(" Xp:", &prevlevel, u.ulevel, STAT_OTHER); + /* use waddch, we don't want to highlight the '/' */ + waddch(win, '('); + + /* Figure out amount of Xp needed to next level */ + int xp_left = 0; + if (u.ulevel < 30) + xp_left = (newuexp(u.ulevel) - u.uexp); + + if (levelchange) { + prevexp.value = (xp_left + 1); + if (levelchange == 2) + prevexp.value = (xp_left - 1); + } + print_statdiff("", &prevexp, xp_left, STAT_AC); + waddch(win, ')'); + } + else + print_statdiff(" Exp:", &prevlevel, u.ulevel, STAT_OTHER); + + waddch(win, ' '); + describe_level(buf); + + wprintw(win, "%s", buf); + + /* Line 3 */ + y++; + wmove(win, y, x); + wprintw(win, "Pw:"); + draw_bar(FALSE, u.uen, u.uenmax, NULL); + + print_statdiff(" $", &prevau, money_cnt(invent), STAT_GOLD); + +#ifdef SCORE_ON_BOTL + if (flags.showscore) + print_statdiff(" S:", &prevscore, botl_score(), STAT_OTHER); +#endif /* SCORE_ON_BOTL */ + + if (flags.time) + print_statdiff(" T:", &prevtime, moves, STAT_TIME); + + curses_add_statuses(win, TRUE, FALSE, &x, &y); + + /* Right-aligned attributes */ + int stat_length = 6; /* " Dx:xx" */ + int str_length = 6; + if (ACURR(A_STR) > 18 && ACURR(A_STR) < 119) + str_length = 9; + + getmaxyx(win, y, x); + + /* We want to deal with top line of y. getmaxx would do what we want, but it only + exist for compatibility reasons and might not exist at all in some versions. */ + y = 0; + if (curses_window_has_border(STATUS_WIN)) { + x--; + y++; + } + + x -= stat_length; + int orig_x = x; + wmove(win, y, x); + print_statdiff(" Co:", &prevcon, ACURR(A_CON), STAT_OTHER); + x -= stat_length; + wmove(win, y, x); + print_statdiff(" Dx:", &prevdex, ACURR(A_DEX), STAT_OTHER); + x -= str_length; + wmove(win, y, x); + print_statdiff(" St:", &prevstr, ACURR(A_STR), STAT_STR); + + x = orig_x; + y++; + wmove(win, y, x); + print_statdiff(" Ch:", &prevcha, ACURR(A_CHA), STAT_OTHER); + x -= stat_length; + wmove(win, y, x); + print_statdiff(" Wi:", &prevwis, ACURR(A_WIS), STAT_OTHER); + x -= str_length; + wmove(win, y, x); + print_statdiff(" In:", &prevint, ACURR(A_INT), STAT_OTHER); +} + +/* Personally I never understood the point of a vertical status bar. But removing the + option would be silly, so keep the functionality. */ +static void +draw_vertical(int x, int y, int hp, int hpmax) +{ + char buf[BUFSZ]; + char rank[BUFSZ]; + WINDOW *win = curses_get_nhwin(STATUS_WIN); + + /* Print title and dungeon branch */ + wmove(win, y++, x); + + get_playerrank(rank); + int ranklen = strlen(rank); + int namelen = strlen(plname); + int maxlen = 19; +#ifdef STATUS_COLORS + if (!iflags.hitpointbar) + maxlen += 2; /* With no hitpointbar, we can fit more since there's no "[]" */ +#endif + + if ((ranklen + namelen) > maxlen) { + /* The result doesn't fit. Strip name if >10 characters, then strip title */ + if (namelen > 10) { + while (namelen > 10 && (ranklen + namelen) > maxlen) + namelen--; + } + + while ((ranklen + namelen) > maxlen) + ranklen--; /* Still doesn't fit, strip rank */ + } + sprintf(buf, "%-*s the %-*s", namelen, plname, ranklen, rank); + draw_bar(TRUE, hp, hpmax, buf); + wmove(win, y++, x); + wprintw(win, "%s", dungeons[u.uz.dnum].dname); + + y++; /* Blank line inbetween */ + wmove(win, y++, x); + + /* Attributes. Old vertical order is preserved */ + print_statdiff("Strength: ", &prevstr, ACURR(A_STR), STAT_STR); + wmove(win, y++, x); + print_statdiff("Intelligence: ", &prevint, ACURR(A_INT), STAT_OTHER); + wmove(win, y++, x); + print_statdiff("Wisdom: ", &prevwis, ACURR(A_WIS), STAT_OTHER); + wmove(win, y++, x); + print_statdiff("Dexterity: ", &prevdex, ACURR(A_DEX), STAT_OTHER); + wmove(win, y++, x); + print_statdiff("Constitution: ", &prevcon, ACURR(A_CON), STAT_OTHER); + wmove(win, y++, x); + print_statdiff("Charisma: ", &prevcha, ACURR(A_CHA), STAT_OTHER); + wmove(win, y++, x); + wprintw(win, "Alignment: "); + wprintw(win, (u.ualign.type == A_CHAOTIC ? "Chaotic" : + u.ualign.type == A_NEUTRAL ? "Neutral" : "Lawful")); + wmove(win, y++, x); + wprintw(win, "Dungeon Level: "); + + /* Astral Plane doesn't fit */ + if (In_endgame(&u.uz)) + wprintw(win, "%s", Is_astralevel(&u.uz) ? "Astral" : "End Game"); + else + wprintw(win, "%d", depth(&u.uz)); + wmove(win, y++, x); + + print_statdiff("Gold: ", &prevau, money_cnt(invent), STAT_GOLD); + wmove(win, y++, x); + + /* HP/Pw use special coloring rules */ + attr_t hpattr, pwattr; +#ifdef STATUS_COLORS + hpattr = hpen_color_attr(TRUE, hp, hpmax); + pwattr = hpen_color_attr(FALSE, u.uen, u.uenmax); +#else + int hpcolor, pwcolor; + hpcolor = hpen_color(TRUE, hp, hpmax); + pwcolor = hpen_color(FALSE, u.uen, u.uenmax); + hpattr = curses_color_attr(hpcolor, 0); + pwattr = curses_color_attr(pwcolor, 0); +#endif + + wprintw(win, "Hit Points: "); + wattron(win, hpattr); + wprintw(win, "%d/%d", (hp < 0) ? 0 : hp, hpmax); + wattroff(win, hpattr); + wmove(win, y++, x); + + wprintw(win, "Magic Power: "); + wattron(win, pwattr); + wprintw(win, "%d/%d", u.uen, u.uenmax); + wattroff(win, pwattr); + wmove(win, y++, x); + + print_statdiff("Armor Class: ", &prevac, u.uac, STAT_AC); + wmove(win, y++, x); + + if (Upolyd) + print_statdiff("Hit Dice: ", &prevlevel, mons[u.umonnum].mlevel, STAT_OTHER); + else if (flags.showexp) { + print_statdiff("Experience: ", &prevlevel, u.ulevel, STAT_OTHER); + /* use waddch, we don't want to highlight the '/' */ + waddch(win, '/'); + print_statdiff("", &prevexp, u.uexp, STAT_OTHER); + } + else + print_statdiff("Level: ", &prevlevel, u.ulevel, STAT_OTHER); + wmove(win, y++, x); + + if (flags.time) { + print_statdiff("Time: ", &prevtime, moves, STAT_TIME); + wmove(win, y++, x); + } + +#ifdef SCORE_ON_BOTL + if (flags.showscore) { + print_statdiff("Score: ", &prevscore, botl_score(), STAT_OTHER); + wmove(win, y++, x); + } +#endif /* SCORE_ON_BOTL */ + + curses_add_statuses(win, FALSE, TRUE, &x, &y); +} + +static void +curses_add_statuses(WINDOW *win, boolean align_right, + boolean vertical, int *x, int *y) +{ + if (align_right) { + /* Right-aligned statuses. Since add_status decrease one x more + (to separate them with spaces), add 1 to x unless we have borders + (which would offset what add_status does) */ + int mx = *x; + int my = *y; + getmaxyx(win, my, mx); + if (!curses_window_has_border(STATUS_WIN)) + mx++; + + *x = mx; + } + +#define statprob(str, trouble) \ + curses_add_status(win, align_right, vertical, x, y, str, trouble) + + /* Hunger */ + statprob(hu_stat[u.uhs], u.uhs != 1); /* 1 is NOT_HUNGRY (not defined here) */ + + /* General troubles */ + statprob("Conf", Confusion); + statprob("Blind", Blind); + statprob("Stun", Stunned); + statprob("Hallu", Hallucination); + statprob("Ill", (u.usick_type & SICK_NONVOMITABLE)); + statprob("FoodPois", (u.usick_type & SICK_VOMITABLE)); + statprob("Slime", Slimed); + + /* Encumbrance */ + int enc = near_capacity(); + statprob(enc_stat[enc], enc > UNENCUMBERED); +#undef statprob +} + +static void +curses_add_status(WINDOW *win, boolean align_right, boolean vertical, + int *x, int *y, const char *str, int trouble) +{ + /* If vertical is TRUE here with no x/y, that's an error. But handle + it gracefully since NH3 doesn't recover well in crashes. */ + if (!x || !y) + vertical = FALSE; + + if (!trouble) + return; + + if (!vertical && !align_right) + waddch(win, ' '); + + /* For whatever reason, hunger states have trailing spaces. Get rid of them. */ + char buf[BUFSZ]; + Strcpy(buf, str); + int i; + for (i = 0; (buf[i] != ' ' && buf[i] != '\0'); i++) ; + + buf[i] = '\0'; + if (align_right) { + *x -= (strlen(buf) + 1); /* add spacing */ + wmove(win, *y, *x); + } + + draw_trouble_str(buf); + + if (vertical) { + wmove(win, *y, *x); + *y += 1; /* ++ advances the pointer addr */ + } +} + +/* Decrement a single highlight, return 1 if decremented to zero. zero is TRUE if we're + zeroing the highlight. */ +static int +decrement_highlight(nhstat *stat, boolean zero) +{ + if (stat->highlight_turns > 0) { + if (zero) { + stat->highlight_turns = 0; + return 1; + } + + stat->highlight_turns--; + if (stat->highlight_turns == 0) + return 1; + } + return 0; +} + +/* Decrement the highlight_turns for all stats. Call curses_update_stats + if needed to unhighlight a stat */ +void +curses_decrement_highlights(boolean zero) +{ + int unhighlight = 0; + + unhighlight |= decrement_highlight(&prevdepth, zero); + unhighlight |= decrement_highlight(&prevstr, zero); + unhighlight |= decrement_highlight(&prevdex, zero); + unhighlight |= decrement_highlight(&prevcon, zero); + unhighlight |= decrement_highlight(&prevint, zero); + unhighlight |= decrement_highlight(&prevwis, zero); + unhighlight |= decrement_highlight(&prevcha, zero); + unhighlight |= decrement_highlight(&prevau, zero); + unhighlight |= decrement_highlight(&prevlevel, zero); + unhighlight |= decrement_highlight(&prevac, zero); + unhighlight |= decrement_highlight(&prevexp, zero); + unhighlight |= decrement_highlight(&prevtime, zero); +#ifdef SCORE_ON_BOTL + unhighlight |= decrement_highlight(&prevscore, zero); +#endif + + if (unhighlight) + curses_update_stats(); +} +#endif diff --git a/win/curses/cursstat.h b/win/curses/cursstat.h new file mode 100644 index 000000000..7773d422b --- /dev/null +++ b/win/curses/cursstat.h @@ -0,0 +1,21 @@ +/* vim:set cin ft=c sw=4 sts=4 ts=8 et ai cino=Ls\:0t0(0 : -*- mode:c;fill-column:80;tab-width:8;c-basic-offset:4;indent-tabs-mode:nil;c-file-style:"k&r" -*-*/ + +#ifndef CURSSTAT_H +# define CURSSTAT_H + +/* Used by handle_stat_change to handle some stats differently. Not an enum + because this is how NetHack code generally handles them. */ +# define STAT_OTHER 0 +# define STAT_STR 1 +# define STAT_GOLD 2 +# define STAT_AC 4 +# define STAT_TIME 5 +# define STAT_TROUBLE 6 + +/* Global declarations */ + +void curses_update_stats(); +void curses_decrement_highlights(boolean); +attr_t curses_color_attr(int nh_color, int bg_color); + +#endif /* CURSSTAT_H */ diff --git a/win/curses/curswins.c b/win/curses/curswins.c new file mode 100644 index 000000000..b04fd94c7 --- /dev/null +++ b/win/curses/curswins.c @@ -0,0 +1,752 @@ +/* vim:set cin ft=c sw=4 sts=4 ts=8 et ai cino=Ls\:0t0(0 : -*- mode:c;fill-column:80;tab-width:8;c-basic-offset:4;indent-tabs-mode:nil;c-file-style:"k&r" -*-*/ + +#include "curses.h" +#include "hack.h" +#include "wincurs.h" +#include "curswins.h" + +/* Window handling for curses interface */ + +/* Private declarations */ + +typedef struct nhw { + winid nhwin; /* NetHack window id */ + WINDOW *curwin; /* Curses window pointer */ + int width; /* Usable width not counting border */ + int height; /* Usable height not counting border */ + int x; /* start of window on terminal (left) */ + int y; /* start of window on termial (top) */ + int orientation; /* Placement of window relative to map */ + boolean border; /* Whether window has a visible border */ +} nethack_window; + +typedef struct nhwd { + winid nhwid; /* NetHack window id */ + struct nhwd *prev_wid; /* Pointer to previous entry */ + struct nhwd *next_wid; /* Pointer to next entry */ +} nethack_wid; + +typedef struct nhchar { + int ch; /* character */ + int color; /* color info for character */ + int attr; /* attributes of character */ +} nethack_char; + +static boolean map_clipped; /* Map window smaller than 80x21 */ +static nethack_window nhwins[NHWIN_MAX]; /* NetHack window array */ +static nethack_char map[ROWNO][COLNO]; /* Map window contents */ +static nethack_wid *nhwids = NULL; /* NetHack wid array */ + +static boolean is_main_window(winid wid); +static void write_char(WINDOW * win, int x, int y, nethack_char ch); +static void clear_map(void); + +/* Create a window with the specified size and orientation */ + +WINDOW * +curses_create_window(int width, int height, orient orientation) +{ + int mapx, mapy, maph, mapw = 0; + int startx = 0; + int starty = 0; + WINDOW *win; + boolean map_border = FALSE; + int mapb_offset = 0; + + if ((orientation == UP) || (orientation == DOWN) || + (orientation == LEFT) || (orientation == RIGHT)) { + if (invent || (moves > 1)) { + map_border = curses_window_has_border(MAP_WIN); + curses_get_window_xy(MAP_WIN, &mapx, &mapy); + curses_get_window_size(MAP_WIN, &maph, &mapw); + } else { + map_border = TRUE; + mapx = 0; + mapy = 0; + maph = term_rows; + mapw = term_cols; + } + } + + if (map_border) { + mapb_offset = 1; + } + + width += 2; /* leave room for bounding box */ + height += 2; + + if ((width > term_cols) || (height > term_rows)) + panic("curses_create_window: Terminal too small for dialog window"); + switch (orientation) { + case CENTER: + startx = (term_cols / 2) - (width / 2); + starty = (term_rows / 2) - (height / 2); + break; + case UP: + if (invent || (moves > 1)) { + startx = (mapw / 2) - (width / 2) + mapx + mapb_offset; + } else { + startx = 0; + } + + starty = mapy + mapb_offset; + break; + case DOWN: + if (invent || (moves > 1)) { + startx = (mapw / 2) - (width / 2) + mapx + mapb_offset; + } else { + startx = 0; + } + + starty = height - mapy - 1 - mapb_offset; + break; + case LEFT: + if (map_border && (width < term_cols)) + startx = 1; + else + startx = 0; + starty = term_rows - height; + break; + case RIGHT: + if (invent || (moves > 1)) { + startx = (mapw + mapx + (mapb_offset * 2)) - width; + } else { + startx = term_cols - width; + } + + starty = 0; + break; + default: + panic("curses_create_window: Bad orientation"); + break; + } + + if (startx < 0) { + startx = 0; + } + + if (starty < 0) { + starty = 0; + } + + win = newwin(height, width, starty, startx); + curses_toggle_color_attr(win, DIALOG_BORDER_COLOR, NONE, ON); + box(win, 0, 0); + curses_toggle_color_attr(win, DIALOG_BORDER_COLOR, NONE, OFF); + return win; +} + + +/* Erase and delete curses window, and refresh standard windows */ + +void +curses_destroy_win(WINDOW * win) +{ + werase(win); + wrefresh(win); + delwin(win); + curses_refresh_nethack_windows(); +} + + +/* Refresh nethack windows if they exist, or base window if not */ + +void +curses_refresh_nethack_windows() +{ + WINDOW *status_window, *message_window, *map_window, *inv_window; + + status_window = curses_get_nhwin(STATUS_WIN); + message_window = curses_get_nhwin(MESSAGE_WIN); + map_window = curses_get_nhwin(MAP_WIN); + inv_window = curses_get_nhwin(INV_WIN); + + if ((moves <= 1) && !invent) { + /* Main windows not yet displayed; refresh base window instead */ + touchwin(stdscr); + refresh(); + } else { + touchwin(status_window); + wnoutrefresh(status_window); + touchwin(map_window); + wnoutrefresh(map_window); + touchwin(message_window); + wnoutrefresh(message_window); + if (inv_window) { + touchwin(inv_window); + wnoutrefresh(inv_window); + } + doupdate(); + } +} + + +/* Return curses window pointer for given NetHack winid */ + +WINDOW * +curses_get_nhwin(winid wid) +{ + if (!is_main_window(wid)) { + panic("curses_get_nhwin: wid out of range. Not a main window."); + } + + return nhwins[wid].curwin; +} + + +/* Add curses window pointer and window info to list for given NetHack winid */ + +void +curses_add_nhwin(winid wid, int height, int width, int y, int x, + orient orientation, boolean border) +{ + WINDOW *win; + int real_width = width; + int real_height = height; + + if (!is_main_window(wid)) { + panic("curses_add_nhwin: wid out of range. Not a main window."); + } + + nhwins[wid].nhwin = wid; + nhwins[wid].border = border; + nhwins[wid].width = width; + nhwins[wid].height = height; + nhwins[wid].x = x; + nhwins[wid].y = y; + nhwins[wid].orientation = orientation; + + if (border) { + real_width += 2; /* leave room for bounding box */ + real_height += 2; + } + + win = newwin(real_height, real_width, y, x); + + switch (wid) { + case MESSAGE_WIN: + messagewin = win; + break; + case STATUS_WIN: + statuswin = win; + break; + case MAP_WIN: + mapwin = win; + + if ((width < COLNO) || (height < ROWNO)) { + map_clipped = TRUE; + } else { + map_clipped = FALSE; + } + + break; + } + + if (border) { + box(win, 0, 0); + } + + nhwins[wid].curwin = win; +} + + +/* Add wid to list of known window IDs */ + +void +curses_add_wid(winid wid) +{ + nethack_wid *new_wid; + nethack_wid *widptr = nhwids; + + new_wid = malloc(sizeof (nethack_wid)); + new_wid->nhwid = wid; + + new_wid->next_wid = NULL; + + if (widptr == NULL) { + new_wid->prev_wid = NULL; + nhwids = new_wid; + } else { + while (widptr->next_wid != NULL) { + widptr = widptr->next_wid; + } + new_wid->prev_wid = widptr; + widptr->next_wid = new_wid; + } +} + + +/* refresh a curses window via given nethack winid */ + +void +curses_refresh_nhwin(winid wid) +{ + wnoutrefresh(curses_get_nhwin(wid)); + doupdate(); +} + + +/* Delete curses window via given NetHack winid and remove entry from list */ + +void +curses_del_nhwin(winid wid) +{ + if (curses_is_menu(wid) || curses_is_text(wid)) { + curses_del_menu(wid); + return; + } + + if (!is_main_window(wid)) { + panic("curses_del_nhwin: wid out of range. Not a main window."); + } + + nhwins[wid].curwin = NULL; + nhwins[wid].nhwin = -1; +} + + +/* Delete wid from list of known window IDs */ + +void +curses_del_wid(winid wid) +{ + nethack_wid *tmpwid; + nethack_wid *widptr = nhwids; + + if (curses_is_menu(wid) || curses_is_text(wid)) { + curses_del_menu(wid); + } + + while (widptr != NULL) { + if (widptr->nhwid == wid) { + if (widptr->prev_wid != NULL) { + tmpwid = widptr->prev_wid; + tmpwid->next_wid = widptr->next_wid; + } else { + nhwids = widptr->next_wid; /* New head mode, or NULL */ + } + if (widptr->next_wid != NULL) { + tmpwid = widptr->next_wid; + tmpwid->prev_wid = widptr->prev_wid; + } + free(widptr); + break; + } + widptr = widptr->next_wid; + } +} + + +/* Print a single character in the given window at the given coordinates */ + +void +curses_putch(winid wid, int x, int y, int ch, int color, int attr) +{ + int sx, sy, ex, ey; + boolean border = curses_window_has_border(wid); + nethack_char nch; + static boolean map_initted = FALSE; +/* + if (wid == STATUS_WIN) { + curses_update_stats(); + } +*/ + if (wid != MAP_WIN) { + return; + } + + if (!map_initted) { + clear_map(); + map_initted = TRUE; + } + + map[y][x].ch = ch; + map[y][x].color = color; + map[y][x].attr = attr; + nch = map[y][x]; + + (void) curses_map_borders(&sx, &sy, &ex, &ey, -1, -1); + + if ((x >= sx) && (x <= ex) && (y >= sy) && (y <= ey)) { + if (border) { + x++; + y++; + } + + write_char(mapwin, x - sx, y - sy, nch); + } + /* refresh after every character? + * Fair go, mate! Some of us are playing from Australia! */ + /* wrefresh(mapwin); */ +} + + +/* Get x, y coordinates of curses window on the physical terminal window */ + +void +curses_get_window_xy(winid wid, int *x, int *y) +{ + if (!is_main_window(wid)) { + panic("curses_get_window_xy: wid out of range. Not a main window."); + } + + *x = nhwins[wid].x; + *y = nhwins[wid].y; +} + + +/* Get usable width and height curses window on the physical terminal window */ + +void +curses_get_window_size(winid wid, int *height, int *width) +{ + *height = nhwins[wid].height; + *width = nhwins[wid].width; +} + + +/* Determine if given window has a visible border */ + +boolean +curses_window_has_border(winid wid) +{ + return nhwins[wid].border; +} + + +/* Determine if window for given winid exists */ + +boolean +curses_window_exists(winid wid) +{ + nethack_wid *widptr = nhwids; + + while (widptr != NULL) { + if (widptr->nhwid == wid) { + return TRUE; + } + + widptr = widptr->next_wid; + } + + return FALSE; +} + + +/* Return the orientation of the specified window */ + +int +curses_get_window_orientation(winid wid) +{ + if (!is_main_window(wid)) { + panic + ("curses_get_window_orientation: wid out of range. Not a main window."); + } + + return nhwins[wid].orientation; +} + + +/* Output a line of text to specified NetHack window with given coordinates +and text attributes */ + +void +curses_puts(winid wid, int attr, const char *text) +{ + anything *identifier; + WINDOW *win = NULL; + + if (is_main_window(wid)) { + win = curses_get_nhwin(wid); + } + + if (wid == MESSAGE_WIN) { + curses_message_win_puts(text, FALSE); + return; + } + +#if 0 + if (wid == STATUS_WIN) { + curses_update_stats(); /* We will do the write ourselves */ + /* Inventory updating isn't performed on redraws, so + also update inventory here... */ + curses_update_inventory(); + return; + } +#endif + + if (curses_is_menu(wid) || curses_is_text(wid)) { + if (!curses_menu_exists(wid)) { + panic("curses_puts: Attempted write to nonexistant window!"); + } + identifier = malloc(sizeof (anything)); + identifier->a_void = NULL; + curses_add_nhmenu_item(wid, NO_GLYPH, identifier, 0, 0, attr, text, + FALSE); + } else { + waddstr(win, text); + wnoutrefresh(win); + } +} + + +/* Clear the contents of a window via the given NetHack winid */ + +void +curses_clear_nhwin(winid wid) +{ + WINDOW *win = curses_get_nhwin(wid); + boolean border = curses_window_has_border(wid); + + if (wid == MAP_WIN) { + clearok(win, TRUE); /* Redraw entire screen when refreshed */ + clear_map(); + } + + werase(win); + + if (border) { + box(win, 0, 0); + } +} + +/* Change colour of window border to alert player to something */ +void +curses_alert_win_border(winid wid, boolean onoff) +{ + WINDOW *win = curses_get_nhwin(wid); + + if (!win || !curses_window_has_border(wid)) + return; + if (onoff) + curses_toggle_color_attr(win, ALERT_BORDER_COLOR, NONE, ON); + box(win, 0, 0); + if (onoff) + curses_toggle_color_attr(win, ALERT_BORDER_COLOR, NONE, OFF); + wnoutrefresh(win); +} + + +void +curses_alert_main_borders(boolean onoff) +{ + curses_alert_win_border(MAP_WIN, onoff); + curses_alert_win_border(MESSAGE_WIN, onoff); + curses_alert_win_border(STATUS_WIN, onoff); + curses_alert_win_border(INV_WIN, onoff); +} + +/* Return true if given wid is a main NetHack window */ + +static boolean +is_main_window(winid wid) +{ + if ((wid == MESSAGE_WIN) || (wid == MAP_WIN) || (wid == STATUS_WIN) || wid == INV_WIN) { + return TRUE; + } else { + return FALSE; + } +} + + +/* Unconditionally write a single character to a window at the given +coordinates without a refresh. Currently only used for the map. */ + +static void +write_char(WINDOW * win, int x, int y, nethack_char nch) +{ + curses_toggle_color_attr(win, nch.color, nch.attr, ON); +#ifdef PDCURSES + mvwaddrawch(win, y, x, nch.ch); +#else + mvwaddch(win, y, x, nch.ch); +#endif + curses_toggle_color_attr(win, nch.color, nch.attr, OFF); +} + + +/* Draw the entire visible map onto the screen given the visible map +boundaries */ + +void +curses_draw_map(int sx, int sy, int ex, int ey) +{ + int curx, cury; + int bspace = 0; + +#ifdef MAP_SCROLLBARS + int sbsx, sbsy, sbex, sbey, count; + nethack_char hsb_back, hsb_bar, vsb_back, vsb_bar; +#endif + + if (curses_window_has_border(MAP_WIN)) { + bspace++; + } +#ifdef MAP_SCROLLBARS + hsb_back.ch = '-'; + hsb_back.color = SCROLLBAR_BACK_COLOR; + hsb_back.attr = A_NORMAL; + hsb_bar.ch = '*'; + hsb_bar.color = SCROLLBAR_COLOR; + hsb_bar.attr = A_NORMAL; + vsb_back.ch = '|'; + vsb_back.color = SCROLLBAR_BACK_COLOR; + vsb_back.attr = A_NORMAL; + vsb_bar.ch = '*'; + vsb_bar.color = SCROLLBAR_COLOR; + vsb_bar.attr = A_NORMAL; + + /* Horizontal scrollbar */ + if ((sx > 0) || (ex < (COLNO - 1))) { + sbsx = (sx * ((long) (ex - sx + 1) / COLNO)); + sbex = (ex * ((long) (ex - sx + 1) / COLNO)); + + for (count = 0; count < sbsx; count++) { + write_char(mapwin, count + bspace, ey - sy + 1 + bspace, hsb_back); + } + + for (count = sbsx; count <= sbex; count++) { + write_char(mapwin, count + bspace, ey - sy + 1 + bspace, hsb_bar); + } + + for (count = sbex + 1; count <= (ex - sx); count++) { + write_char(mapwin, count + bspace, ey - sy + 1 + bspace, hsb_back); + } + } + + /* Vertical scrollbar */ + if ((sy > 0) || (ey < (ROWNO - 1))) { + sbsy = (sy * ((long) (ey - sy + 1) / ROWNO)); + sbey = (ey * ((long) (ey - sy + 1) / ROWNO)); + + for (count = 0; count < sbsy; count++) { + write_char(mapwin, ex - sx + 1 + bspace, count + bspace, vsb_back); + } + + for (count = sbsy; count <= sbey; count++) { + write_char(mapwin, ex - sx + 1 + bspace, count + bspace, vsb_bar); + } + + for (count = sbey + 1; count <= (ey - sy); count++) { + write_char(mapwin, ex - sx + 1 + bspace, count + bspace, vsb_back); + } + } +#endif /* MAP_SCROLLBARS */ + + for (curx = sx; curx <= ex; curx++) { + for (cury = sy; cury <= ey; cury++) { + write_char(mapwin, curx - sx + bspace, cury - sy + bspace, + map[cury][curx]); + } + } +} + + +/* Init map array to blanks */ + +static void +clear_map() +{ + int x, y; + + for (x = 0; x < COLNO; x++) { + for (y = 0; y < ROWNO; y++) { + map[y][x].ch = ' '; + map[y][x].color = NO_COLOR; + map[y][x].attr = A_NORMAL; + } + } +} + + +/* Determine visible boundaries of map, and determine if it needs to be +based on the location of the player. */ + +boolean +curses_map_borders(int *sx, int *sy, int *ex, int *ey, int ux, int uy) +{ + static int width = 0; + static int height = 0; + static int osx = 0; + static int osy = 0; + static int oex = 0; + static int oey = 0; + static int oux = -1; + static int ouy = -1; + + if ((oux == -1) || (ouy == -1)) { + oux = u.ux; + ouy = u.uy; + } + + if (ux == -1) { + ux = oux; + } else { + oux = ux; + } + + if (uy == -1) { + uy = ouy; + } else { + ouy = uy; + } + + curses_get_window_size(MAP_WIN, &height, &width); + +#ifdef MAP_SCROLLBARS + if (width < COLNO) { + height--; /* room for horizontal scrollbar */ + } + + if (height < ROWNO) { + width--; /* room for vertical scrollbar */ + + if (width == COLNO) { + height--; + } + } +#endif /* MAP_SCROLLBARS */ + + if (width >= COLNO) { + *sx = 0; + *ex = COLNO - 1; + } else { + *ex = (width / 2) + ux; + *sx = *ex - (width - 1); + + if (*ex >= COLNO) { + *sx = COLNO - width; + *ex = COLNO - 1; + } else if (*sx < 0) { + *sx = 0; + *ex = width - 1; + } + } + + if (height >= ROWNO) { + *sy = 0; + *ey = ROWNO - 1; + } else { + *ey = (height / 2) + uy; + *sy = *ey - (height - 1); + + if (*ey >= ROWNO) { + *sy = ROWNO - height; + *ey = ROWNO - 1; + } else if (*sy < 0) { + *sy = 0; + *ey = height - 1; + } + } + + if ((*sx != osx) || (*sy != osy) || (*ex != oex) || (*ey != oey) || + map_clipped) { + osx = *sx; + osy = *sy; + oex = *ex; + oey = *ey; + return TRUE; + } + + return FALSE; +} diff --git a/win/curses/curswins.h b/win/curses/curswins.h new file mode 100644 index 000000000..ce1935e07 --- /dev/null +++ b/win/curses/curswins.h @@ -0,0 +1,33 @@ +/* vim:set cin ft=c sw=4 sts=4 ts=8 et ai cino=Ls\:0t0(0 : -*- mode:c;fill-column:80;tab-width:8;c-basic-offset:4;indent-tabs-mode:nil;c-file-style:"k&r" -*-*/ + +#ifndef CURSWIN_H +# define CURSWIN_H + + +/* Global declarations */ + +WINDOW *curses_create_window(int width, int height, orient orientation); + +void curses_destroy_win(WINDOW * win); +void curses_refresh_nethack_windows(void); +WINDOW *curses_get_nhwin(winid wid); +void curses_add_nhwin(winid wid, int height, int width, int y, int x, + orient orientation, boolean border); +void curses_add_wid(winid wid); +void curses_refresh_nhwin(winid wid); +void curses_del_nhwin(winid wid); +void curses_del_wid(winid wid); +void curses_putch(winid wid, int x, int y, int ch, int color, int attrs); +void curses_get_window_xy(winid wid, int *x, int *y); +boolean curses_window_has_border(winid wid); +boolean curses_window_exists(winid wid); +int curses_get_window_orientation(winid wid); +void curses_puts(winid wid, int attr, const char *text); +void curses_clear_nhwin(winid wid); +void curses_alert_win_border(winid wid, boolean onoff); +void curses_alert_main_borders(boolean onoff); +void curses_draw_map(int sx, int sy, int ex, int ey); +boolean curses_map_borders(int *sx, int *sy, int *ex, int *ey, int ux, int uy); + + +#endif /* CURSWIN_H */ From 113d5cdb26d76626b08434bce4bb4ea6842379f2 Mon Sep 17 00:00:00 2001 From: nhmall Date: Fri, 16 Nov 2018 21:00:11 -0500 Subject: [PATCH 03/74] missed include/wincurs.h --- include/wincurs.h | 310 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 310 insertions(+) create mode 100644 include/wincurs.h diff --git a/include/wincurs.h b/include/wincurs.h new file mode 100644 index 000000000..0db58fcbc --- /dev/null +++ b/include/wincurs.h @@ -0,0 +1,310 @@ +#ifndef WINCURS_H +#define WINCURS_H + +/* Global declarations for curses interface */ + +int term_rows, term_cols; /* size of underlying terminal */ + +WINDOW *base_term; /* underlying terminal window */ + +WINDOW *mapwin, *statuswin, *messagewin; /* Main windows */ + +int orig_cursor; /* Preserve initial cursor state */ + +boolean counting; /* Count window is active */ + + +#define TEXTCOLOR /* Allow color */ +#define NHW_END 19 +#define OFF 0 +#define ON 1 +#define NONE -1 +#define KEY_ESC 0x1b +#define DIALOG_BORDER_COLOR CLR_MAGENTA +#define ALERT_BORDER_COLOR CLR_RED +#define SCROLLBAR_COLOR CLR_MAGENTA +#define SCROLLBAR_BACK_COLOR CLR_BLACK +#define HIGHLIGHT_COLOR CLR_WHITE +#define MORECOLOR CLR_ORANGE +#define STAT_UP_COLOR CLR_GREEN +#define STAT_DOWN_COLOR CLR_RED +#define MESSAGE_WIN 1 +#define STATUS_WIN 2 +#define MAP_WIN 3 +#define INV_WIN 4 +#define NHWIN_MAX 5 +#define MESG_HISTORY_MAX 200 +#if !defined(__APPLE__) || !defined(NCURSES_VERSION) +# define USE_DARKGRAY /* Allow "bright" black; delete if not visible */ +#endif /* !__APPLE__ && !PDCURSES */ +#define CURSES_DARK_GRAY 17 +#define MAP_SCROLLBARS +#ifdef PDCURSES +# define getmouse nc_getmouse +# ifndef NCURSES_MOUSE_VERSION +# define NCURSES_MOUSE_VERSION +# endif +#endif + + +typedef enum orient_type +{ + CENTER, + UP, + DOWN, + RIGHT, + LEFT, + UNDEFINED +} orient; + + +/* cursmain.c */ + +extern struct window_procs curses_procs; + +extern void curses_init_nhwindows(int* argcp, char** argv); + +extern void curses_player_selection(void); + +extern void curses_askname(void); + +extern void curses_get_nh_event(void); + +extern void curses_exit_nhwindows(const char *str); + +extern void curses_suspend_nhwindows(const char *str); + +extern void curses_resume_nhwindows(void); + +extern winid curses_create_nhwindow(int type); + +extern void curses_clear_nhwindow(winid wid); + +extern void curses_display_nhwindow(winid wid, BOOLEAN_P block); + +extern void curses_destroy_nhwindow(winid wid); + +extern void curses_curs(winid wid, int x, int y); + +extern void curses_putstr(winid wid, int attr, const char *text); + +extern void curses_display_file(const char *filename,BOOLEAN_P must_exist); + +extern void curses_start_menu(winid wid); + +extern void curses_add_menu(winid wid, int glyph, const ANY_P * identifier, + CHAR_P accelerator, CHAR_P group_accel, int attr, + const char *str, BOOLEAN_P presel); + +extern void curses_end_menu(winid wid, const char *prompt); + +extern int curses_select_menu(winid wid, int how, MENU_ITEM_P **selected); + +extern void curses_update_inventory(void); + +extern void curses_mark_synch(void); + +extern void curses_wait_synch(void); + +extern void curses_cliparound(int x, int y); + +extern void curses_print_glyph(winid wid,XCHAR_P x,XCHAR_P y,int glyph, int bkglyph); + +extern void curses_raw_print(const char *str); + +extern void curses_raw_print_bold(const char *str); + +extern int curses_nhgetch(void); + +extern int curses_nh_poskey(int *x, int *y, int *mod); + +extern void curses_nhbell(void); + +extern int curses_doprev_message(void); + +extern char curses_yn_function(const char *question, const char *choices, CHAR_P def); + +extern void curses_getlin(const char *question, char *input); + +extern int curses_get_ext_cmd(void); + +extern void curses_number_pad(int state); + +extern void curses_delay_output(void); + +extern void curses_start_screen(void); + +extern void curses_end_screen(void); + +extern void curses_outrip(winid wid, int how); + +extern void genl_outrip(winid tmpwin, int how, time_t when); + +extern void curses_preference_update(const char *pref); + + +/* curswins.c */ + +extern WINDOW *curses_create_window(int width, int height, orient orientation); + +extern void curses_destroy_win(WINDOW *win); + +extern WINDOW *curses_get_nhwin(winid wid); + +extern void curses_add_nhwin(winid wid, int height, int width, int y, + int x, orient orientation, boolean border); + +extern void curses_add_wid(winid wid); + +extern void curses_refresh_nhwin(winid wid); + +extern void curses_refresh_nethack_windows(void); + +extern void curses_del_nhwin(winid wid); + +extern void curses_del_wid(winid wid); + +extern void curses_putch(winid wid, int x, int y, int ch, int color, int attrs); + +extern void curses_get_window_size(winid wid, int *height, int *width); + +extern boolean curses_window_has_border(winid wid); + +extern boolean curses_window_exists(winid wid); + +extern int curses_get_window_orientation(winid wid); + +extern void curses_get_window_xy(winid wid, int *x, int *y); + +extern void curses_puts(winid wid, int attr, const char *text); + +extern void curses_clear_nhwin(winid wid); + +extern void curses_alert_win_border(winid wid, boolean onoff); + +extern void curses_alert_main_borders(boolean onoff); + +extern void curses_draw_map(int sx, int sy, int ex, int ey); + +extern boolean curses_map_borders(int *sx, int *sy, int *ex, int *ey, + int ux, int uy); + + +/* cursmisc.c */ + +extern int curses_read_char(void); + +extern void curses_toggle_color_attr(WINDOW *win, int color, int attr, int onoff); + +extern void curses_bail(const char *mesg); + +extern winid curses_get_wid(int type); + +extern char *curses_copy_of(const char *s); + +extern int curses_num_lines(const char *str, int width); + +extern char *curses_break_str(const char *str, int width, int line_num); + +extern char *curses_str_remainder(const char *str, int width, int line_num); + +extern boolean curses_is_menu(winid wid); + +extern boolean curses_is_text(winid wid); + +extern int curses_convert_glyph(int ch, int glyph); + +extern void curses_move_cursor(winid wid, int x, int y); + +extern void curses_prehousekeeping(void); + +extern void curses_posthousekeeping(void); + +extern void curses_view_file(const char *filename, boolean must_exist); + +extern void curses_rtrim(char *str); + +extern int curses_get_count(int first_digit); + +extern int curses_convert_attr(int attr); + +extern int curses_read_attrs(char *attrs); + +extern int curses_convert_keys(int key); + +extern int curses_get_mouse(int *mousex, int *mousey, int *mod); + +/* cursdial.c */ + +extern void curses_line_input_dialog(const char *prompt, char *answer, int buffer); + +extern int curses_character_input_dialog(const char *prompt, const char *choices, CHAR_P def); + +extern int curses_ext_cmd(void); + +extern void curses_create_nhmenu(winid wid); +extern void curses_add_nhmenu_item(winid wid, int glyph, const ANY_P *identifier, + CHAR_P accelerator, CHAR_P group_accel, int attr, const char *str, + BOOLEAN_P presel); + +extern void curses_finalize_nhmenu(winid wid, const char *prompt); + +extern int curses_display_nhmenu(winid wid, int how, MENU_ITEM_P **_selected); + +extern boolean curses_menu_exists(winid wid); + +extern void curses_del_menu(winid wid); + + +/* cursstat.c */ + +extern void curses_status_init(void); +extern void curses_status_update(int, genericptr_t, int, int, int, unsigned long *); +/* extern attr_t curses_color_attr(int nh_color, int bg_color); */ +/* extern void curses_update_stats(void); */ +/* extern void curses_decrement_highlight(void); */ + +/* cursinvt.c */ + +extern void curses_update_inv(void); +extern void curses_add_inv(int, int, CHAR_P, attr_t, const char *); + +/* cursinit.c */ + +extern void curses_create_main_windows(void); + +extern void curses_init_nhcolors(void); + +extern void curses_choose_character(void); + +extern int curses_character_dialog(const char** choices, const char *prompt); + +extern void curses_init_options(void); + +extern void curses_display_splash_window(void); + +extern void curses_cleanup(void); + + +/* cursmesg.c */ + +extern void curses_message_win_puts(const char *message, boolean recursed); + +extern int curses_block(boolean require_tab); /* for MSGTYPE=STOP */ + +extern int curses_more(void); + +extern void curses_clear_unhighlight_message_window(void); + +extern void curses_message_win_getline(const char *prompt, char *answer, int buffer); + +extern void curses_last_messages(void); + +extern void curses_init_mesg_history(void); + +extern void curses_prev_mesg(void); + +extern void curses_count_window(const char *count_text); + +#endif /* WINCURS_H */ + From afe828507a545a6942b10b7e3d2118e5ccbd61a3 Mon Sep 17 00:00:00 2001 From: Bart House Date: Sat, 17 Nov 2018 14:48:38 -0800 Subject: [PATCH 04/74] Getting build working. --- win/win32/vs2017/NetHack.vcxproj | 37 +++++++++++++++++++++++++++++--- win/win32/vs2017/dirs.props | 1 + 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/win/win32/vs2017/NetHack.vcxproj b/win/win32/vs2017/NetHack.vcxproj index 66ad09e34..981bc1e45 100644 --- a/win/win32/vs2017/NetHack.vcxproj +++ b/win/win32/vs2017/NetHack.vcxproj @@ -16,6 +16,18 @@ $(BinDir) + + $(PDCURSES);$(IncludePath) + + + $(PDCURSES);$(IncludePath) + + + $(PDCURSES);$(IncludePath) + + + $(PDCURSES);$(IncludePath) + /Gs /Oi- %(AdditionalOptions) @@ -24,10 +36,14 @@ Speed true $(WinWin32Dir);$(IncDir);$(SysWinntDir);$(SysShareDir);$(WinShareDir);%(AdditionalIncludeDirectories) - TILES;WIN32CON;DLB;MSWIN_GRAPHICS;_LIB;%(PreprocessorDefinitions) + TILES;WIN32CON;DLB;MSWIN_GRAPHICS;CURSES_GRAPHICS;_LIB;%(PreprocessorDefinitions) - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;winmm.lib;Winmm.lib;%(AdditionalDependencies) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;winmm.lib;Winmm.lib;PDCurses.lib;%(AdditionalDependencies) + $(PDCURSES)\bin\$(Platform)\$(Configuration)\ + $(PDCURSES)\bin\$(Platform)\$(Configuration)\ + $(PDCURSES)\bin\$(Platform)\$(Configuration)\ + $(PDCURSES)\bin\$(Platform)\$(Configuration)\ @@ -154,6 +170,14 @@ + + + + + + + + @@ -212,6 +236,13 @@ + + + + + + + @@ -229,4 +260,4 @@ - + \ No newline at end of file diff --git a/win/win32/vs2017/dirs.props b/win/win32/vs2017/dirs.props index 9d4ed49e4..e1c36b8a1 100644 --- a/win/win32/vs2017/dirs.props +++ b/win/win32/vs2017/dirs.props @@ -20,5 +20,6 @@ $(RootDir)win\win32\ $(ToolsDir) $(ObjDir) + $(RootDir)win\curses\ From ac367ef4cc2cbad036964402ba541f869e6c8dd9 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sat, 17 Nov 2018 20:27:21 -0500 Subject: [PATCH 05/74] curses port: accept return on Windows platform --- win/curses/cursmesg.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/win/curses/cursmesg.c b/win/curses/cursmesg.c index 9fc1d6442..67986bbbb 100644 --- a/win/curses/cursmesg.c +++ b/win/curses/cursmesg.c @@ -132,6 +132,11 @@ curses_message_win_puts(const char *message, boolean recursed) wrefresh(win); } +#ifdef WIN32 +#define XTRA_RESP "\r" +#else +#define XTRA_RESP "" +#endif int curses_block(boolean noscroll) @@ -140,8 +145,7 @@ curses_block(boolean noscroll) { int height, width, ret; WINDOW *win = curses_get_nhwin(MESSAGE_WIN); - char *resp = " \n\033"; /* space, enter, esc */ - + char *resp = " \n\033" XTRA_RESP; /* space, enter, esc */ curses_get_window_size(MESSAGE_WIN, &height, &width); curses_toggle_color_attr(win, MORECOLOR, NONE, ON); From 83fb79b77597cc44658458872a81d406ae177487 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sat, 17 Nov 2018 21:17:43 -0500 Subject: [PATCH 06/74] more CR on windows --- win/curses/cursmesg.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/win/curses/cursmesg.c b/win/curses/cursmesg.c index 67986bbbb..d54249dcd 100644 --- a/win/curses/cursmesg.c +++ b/win/curses/cursmesg.c @@ -133,9 +133,11 @@ curses_message_win_puts(const char *message, boolean recursed) } #ifdef WIN32 -#define XTRA_RESP "\r" +#define RESP " \n\033\r" /* space, enter, esc, cr */ +#define TRANS " \n\033\n" /* translated return value */ #else -#define XTRA_RESP "" +#define RESP " \n\033" /* space, enter, esc */ +#define TRANS " \n\033" #endif int @@ -145,8 +147,9 @@ curses_block(boolean noscroll) { int height, width, ret; WINDOW *win = curses_get_nhwin(MESSAGE_WIN); - char *resp = " \n\033" XTRA_RESP; /* space, enter, esc */ - + char *resp = RESP; + char *trans = TRANS; + char *rp = (char *) 0; curses_get_window_size(MESSAGE_WIN, &height, &width); curses_toggle_color_attr(win, MORECOLOR, NONE, ON); mvwprintw(win, my, mx, iflags.msg_is_alert ? "" : ">>"); @@ -158,7 +161,9 @@ curses_block(boolean noscroll) /* msgtype=stop should require space/enter rather than * just any key, as we want to prevent YASD from * riding direction keys. */ - while (!iflags.msg_is_alert && (ret = wgetch(win)) && !index(resp,(char)ret)); + while (!iflags.msg_is_alert && + (ret = wgetch(win)) && ((rp = index(resp,(char)ret)) == 0)) + ; if (iflags.msg_is_alert) curses_alert_main_borders(FALSE); if (height == 1) { @@ -171,6 +176,8 @@ curses_block(boolean noscroll) } wrefresh(win); } + if (rp) + ret = trans[(rp - resp)]; return ret; } From 2829e3f78003bc554d435dd473693b1326eee003 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sat, 17 Nov 2018 21:29:41 -0500 Subject: [PATCH 07/74] Revert "more CR on windows" This reverts commit 83fb79b77597cc44658458872a81d406ae177487. --- win/curses/cursmesg.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/win/curses/cursmesg.c b/win/curses/cursmesg.c index d54249dcd..67986bbbb 100644 --- a/win/curses/cursmesg.c +++ b/win/curses/cursmesg.c @@ -133,11 +133,9 @@ curses_message_win_puts(const char *message, boolean recursed) } #ifdef WIN32 -#define RESP " \n\033\r" /* space, enter, esc, cr */ -#define TRANS " \n\033\n" /* translated return value */ +#define XTRA_RESP "\r" #else -#define RESP " \n\033" /* space, enter, esc */ -#define TRANS " \n\033" +#define XTRA_RESP "" #endif int @@ -147,9 +145,8 @@ curses_block(boolean noscroll) { int height, width, ret; WINDOW *win = curses_get_nhwin(MESSAGE_WIN); - char *resp = RESP; - char *trans = TRANS; - char *rp = (char *) 0; + char *resp = " \n\033" XTRA_RESP; /* space, enter, esc */ + curses_get_window_size(MESSAGE_WIN, &height, &width); curses_toggle_color_attr(win, MORECOLOR, NONE, ON); mvwprintw(win, my, mx, iflags.msg_is_alert ? "" : ">>"); @@ -161,9 +158,7 @@ curses_block(boolean noscroll) /* msgtype=stop should require space/enter rather than * just any key, as we want to prevent YASD from * riding direction keys. */ - while (!iflags.msg_is_alert && - (ret = wgetch(win)) && ((rp = index(resp,(char)ret)) == 0)) - ; + while (!iflags.msg_is_alert && (ret = wgetch(win)) && !index(resp,(char)ret)); if (iflags.msg_is_alert) curses_alert_main_borders(FALSE); if (height == 1) { @@ -176,8 +171,6 @@ curses_block(boolean noscroll) } wrefresh(win); } - if (rp) - ret = trans[(rp - resp)]; return ret; } From 816a7dd87151525e0e6b71b6fd024fe25de24e6d Mon Sep 17 00:00:00 2001 From: nhmall Date: Sat, 17 Nov 2018 21:30:01 -0500 Subject: [PATCH 08/74] Revert "curses port: accept return on Windows platform" This reverts commit ac367ef4cc2cbad036964402ba541f869e6c8dd9. --- win/curses/cursmesg.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/win/curses/cursmesg.c b/win/curses/cursmesg.c index 67986bbbb..9fc1d6442 100644 --- a/win/curses/cursmesg.c +++ b/win/curses/cursmesg.c @@ -132,11 +132,6 @@ curses_message_win_puts(const char *message, boolean recursed) wrefresh(win); } -#ifdef WIN32 -#define XTRA_RESP "\r" -#else -#define XTRA_RESP "" -#endif int curses_block(boolean noscroll) @@ -145,7 +140,8 @@ curses_block(boolean noscroll) { int height, width, ret; WINDOW *win = curses_get_nhwin(MESSAGE_WIN); - char *resp = " \n\033" XTRA_RESP; /* space, enter, esc */ + char *resp = " \n\033"; /* space, enter, esc */ + curses_get_window_size(MESSAGE_WIN, &height, &width); curses_toggle_color_attr(win, MORECOLOR, NONE, ON); From 6ba270563c70bd4273e19db50be976c7a2a73388 Mon Sep 17 00:00:00 2001 From: Bart House Date: Sat, 17 Nov 2018 23:56:31 -0800 Subject: [PATCH 09/74] Build curses if PDCurses is available. There are two ways to enable curses in the build. Either set the environment variable PDCURSES to a folder containing a PDCurses repository OR place the PDCurses folder alongside the NetHack source repository. --- win/win32/vs2017/NetHack.vcxproj | 46 ++++++++++++++------------------ win/win32/vs2017/dirs.props | 3 +++ 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/win/win32/vs2017/NetHack.vcxproj b/win/win32/vs2017/NetHack.vcxproj index 981bc1e45..e51474a65 100644 --- a/win/win32/vs2017/NetHack.vcxproj +++ b/win/win32/vs2017/NetHack.vcxproj @@ -16,18 +16,16 @@ $(BinDir) - - $(PDCURSES);$(IncludePath) - - - $(PDCURSES);$(IncludePath) - - - $(PDCURSES);$(IncludePath) - - - $(PDCURSES);$(IncludePath) - + + + $(PDCURSES);%(AdditionalIncludeDirectories) + CURSES_GRAPHICS;%(PreprocessorDefinitions) + + + $(PDCURSES)\bin\$(Platform)\$(Configuration)\ + PDCurses.lib;%(AdditionalDependencies) + + /Gs /Oi- %(AdditionalOptions) @@ -36,14 +34,10 @@ Speed true $(WinWin32Dir);$(IncDir);$(SysWinntDir);$(SysShareDir);$(WinShareDir);%(AdditionalIncludeDirectories) - TILES;WIN32CON;DLB;MSWIN_GRAPHICS;CURSES_GRAPHICS;_LIB;%(PreprocessorDefinitions) + TILES;WIN32CON;DLB;MSWIN_GRAPHICS;_LIB;%(PreprocessorDefinitions) - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;winmm.lib;Winmm.lib;PDCurses.lib;%(AdditionalDependencies) - $(PDCURSES)\bin\$(Platform)\$(Configuration)\ - $(PDCURSES)\bin\$(Platform)\$(Configuration)\ - $(PDCURSES)\bin\$(Platform)\$(Configuration)\ - $(PDCURSES)\bin\$(Platform)\$(Configuration)\ + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;winmm.lib;Winmm.lib;%(AdditionalDependencies) @@ -170,14 +164,14 @@ - - - - - - - - + + + + + + + + diff --git a/win/win32/vs2017/dirs.props b/win/win32/vs2017/dirs.props index e1c36b8a1..0ebb31a25 100644 --- a/win/win32/vs2017/dirs.props +++ b/win/win32/vs2017/dirs.props @@ -22,4 +22,7 @@ $(ObjDir) $(RootDir)win\curses\ + + $(RootDir)..\PDCurses\ + From 9c4de50c9a67d005f89193ee008397c7bf0dcbc9 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 18 Nov 2018 06:24:32 -0500 Subject: [PATCH 10/74] windows VS Makefile with curses and PDCurses --- sys/winnt/Makefile.msc | 103 +++++++++++++++++++++++++++++++++-------- 1 file changed, 83 insertions(+), 20 deletions(-) diff --git a/sys/winnt/Makefile.msc b/sys/winnt/Makefile.msc index 7f908c637..c0773c035 100644 --- a/sys/winnt/Makefile.msc +++ b/sys/winnt/Makefile.msc @@ -32,11 +32,12 @@ #======================================================================================== # BUILD DECISIONS SECTION # -# There are currently only 3 decisions that you can choose to make, and none are -# required: +# There are currently only 4 decisions that you can choose to make, and none are +# absolutely required because defaults are in place: # 1. Where do you want your build to end up? # 2. Do you want debug information in the executable? # 3. Do you want to explicitly override auto-detection of a 32-bit or 64-bit target? +# 4. Do you want to include the optional curses port? # #----------------------------------------------------------------------------------------- #========================================================================================= @@ -64,15 +65,16 @@ DEBUGINFO = Y #--------------------------------------------------------------- # OPTIONAL - Curses window port support # -# 4. Uncomment these and set them appropriate if you want to +# 4. Uncomment these and set them appropriately if you want to # include curses port support alongside TTY support in your -# console binary. You'll have to set CURSESINCL to the location -# of your curses header (.h) files and CURSESDLL to the location -# of your pdcurses.dll. +# NetHack.exe binary. +# +# You'll have to set PDCURSES_H to the correct location of the +# PDCurses header (.h) files and PDCURSES_C to the location +# of your PDCurses C files. # ADD_CURSES=Y -CURSESINCL=..\..\pdcurses -CURSESLIB=..\..\pdcurses\wincon\pdcurses.lib +PDCURSES_TOP=..\..\pdcurses # #============================================================================== # This marks the end of the BUILD DECISIONS section. @@ -98,18 +100,20 @@ CURSESLIB=..\..\pdcurses\wincon\pdcurses.lib # Source directories. Makedefs hardcodes these, don't change them. # -INCL = ..\include # NetHack include files -DAT = ..\dat # NetHack data files -DOC = ..\doc # NetHack documentation files -UTIL = ..\util # Utility source -SRC = ..\src # Main source -SSYS = ..\sys\share # Shared system files -MSWSYS = ..\sys\winnt # mswin specific files -TTY = ..\win\tty # window port files (tty) -MSWIN = ..\win\win32 # window port files (win32) -CURSES = ..\win\curses # window port files (curses) -WSHR = ..\win\share # Tile support files +INCL = ..\include # NetHack include files +DAT = ..\dat # NetHack data files +DOC = ..\doc # NetHack documentation files +UTIL = ..\util # Utility source +SRC = ..\src # Main source +SSYS = ..\sys\share # Shared system files +MSWSYS = ..\sys\winnt # mswin specific files +TTY = ..\win\tty # window port files (tty) +MSWIN = ..\win\win32 # window port files (win32) +WCURSES = ..\win\curses # window port files (curses) +WSHR = ..\win\share # Tile support files +! IF ("$(ADD_CURSES)"=="Y") +PDCURSES = # # Object directory. # @@ -481,6 +485,38 @@ ALLOBJ = $(SOBJ) $(DLBOBJ) $(WOBJ) $(OBJS) $(VVOBJ) OPTIONS_FILE = $(DAT)\options +!IF "$(ADD_CURSES)" == "Y" +#========================================== +# PDCurses build macros +#========================================== +PDCURSES_CURSES_H = $(PDCURSES_TOP)\curses.h +PDCURSES_CURSPRIV_H = $(PDCURSES_TOP)\curspriv.h +PDCURSES_HEADERS = $(PDCURSES_CURSES_H) $(PDCURSES_CURSPRIV_H) +PANEL_HEADER = $(PDCURSES_TOP)\panel.h +TERM_HEADER = $(PDCURSES_TOP)\term.h +PDCSRC = $(PDCURSES_TOP)\wincon + +PDCLIBOBJS = $(O)addch.o $(O)addchstr.o $(O)addstr.o $(O)attr.o $(O)beep.o \ + $(O)bkgd.o $(O)border.o $(O)clear.o $(O)color.o $(O)delch.o $(O)deleteln.o \ + $(O)deprec.o $(O)getch.o $(O)getstr.o $(O)getyx.o $(O)inch.o $(O)inchstr.o \ + $(O)initscr.o $(O)inopts.o $(O)insch.o $(O)insstr.o $(O)instr.o $(O)kernel.o \ + $(O)keyname.o $(O)mouse.o $(O)move.o $(O)outopts.o $(O)overlay.o $(O)pad.o \ + $(O)panel.o $(O)printw.o $(O)refresh.o $(O)scanw.o $(O)scr_dump.o $(O)scroll.o \ + $(O)slk.o $(O)termattr.o $(O)terminfo.o $(O)touch.o $(O)util.o $(O)window.o \ + $(O)debug.o + +PDCOBJS = $(O)pdcclip.o $(O)pdcdisp.o $(O)pdcgetsc.o $(O)pdckbd.o $(O)pdcscrn.o \ + $(O)pdcsetsc.o $(O)pdcutil.o +PDCOSDIR = $(PDCURSES_SRCDIR)/wincon + +PDCURSES_WIN_H = $(PDCOSDIR)/pdcwin.h + +PDCLIB = $(O)\pdcurses.lib + +!ELSE +PDCLIB = +!ENDIF + #========================================== # Header file macros #========================================== @@ -602,6 +638,16 @@ DATABASE = $(DAT)\data.base {$(MSWIN)}.c{$(OBJ)}.o: @$(cc) $(cflagsBuild) -Fo$@ $< +#========================================== +# Rules for files in PDCurses +#========================================== + +{$(PDCURSES_TOP)}.c{$(OBJ)}.o: + @$(cc) $(cflagsBuild) -Fo$@ $< + +{$(PDCSRC)}.c{$(OBJ)}.o: + @$(cc) $(cflagsBuild) -Fo$@ $< + #========================================== #=============== TARGETS ================== #========================================== @@ -757,7 +803,7 @@ $(GAMEDIR)\NetHack.exe : $(O)gamedir.tag $(O)tile.o $(O)nttty.o $(O)guistub.o \ @if not exist $(GAMEDIR)\*.* mkdir $(GAMEDIR) @echo Linking $(@:\=/) $(link) $(lflagsBuild) $(conlflags) /STACK:2048 /PDB:$(GAMEDIR)\$(@B).PDB /MAP:$(O)$(@B).MAP \ - $(LIBS) $(conlibs) -out:$@ @<<$(@B).lnk + $(PDCLIB) $(LIBS) $(conlibs) -out:$@ @<<$(@B).lnk $(GAMEOBJ) $(TTYOBJ) $(O)nttty.o @@ -1213,6 +1259,12 @@ $(O)tile2bmp.o: $(WSHR)\tile2bmp.c $(HACK_H) $(TILE_H) $(MSWSYS)\win32api.h $(O)til2bm32.o: $(WSHR)\tile2bmp.c $(HACK_H) $(TILE_H) $(MSWSYS)\win32api.h @$(cc) $(cflagsBuild) -I$(WSHR) /DPACKED_FILE /DTILE_X=32 /DTILE_Y=32 /Fo$@ $(WSHR)\tile2bmp.c +#========================================== +# PDCurses +#========================================== + +$(PDCLIB) : $(PDCLIBOBJS) + #========================================== # Housekeeping #========================================== @@ -1428,6 +1480,17 @@ $(O)panic.o: $(U)panic.c $(CONFIG_H) (O)cppregex.o: $(O)cppregex.cpp $(HACK_H) @$(CC) $(cflagsBuild) -Fo$@ ..\sys\share\cppregex.cpp +# +# curses window port dependencies +# +$(O)\cursdial.o: $(WCURSES)\cursdial.c $(WCURSES)\cursdial.h $(INCL)\wincurs.h +$(O)\cursinit.c: $(WCURSES)\cursinit.c $(WCURSES)\cursinit.h $(INCL)\wincurs.h +$(O)\cursinvt.c: $(WCURSES)\cursinvt.c $(WCURSES)\cursinvt.h $(INCL)\wincurs.h +$(O)\cursmain.c: $(WCURSES)\cursmain.c $(WCURSES)\cursmain.h $(INCL)\wincurs.h +$(O)\cursmesg.c: $(WCURSES)\cursmesg.c $(WCURSES)\cursmesg.h $(INCL)\wincurs.h +$(O)\cursmisc.c: $(WCURSES)\cursmisc.c $(WCURSES)\cursmisc.h $(INCL)\wincurs.h +$(O)\cursstat.c: $(WCURSES)\cursstat.c $(WCURSES)\cursstat.h $(INCL)\wincurs.h +$(O)\curswins.c: $(WCURSES)\curswins.c $(WCURSES)\curswins.h $(INCL)\wincurs.h # # The rest are stolen from sys/unix/Makefile.src, # with the following changes: From bbe7029e773d5637dd2facaddb2d3ff9095497e8 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 18 Nov 2018 06:48:47 -0500 Subject: [PATCH 11/74] more curses Makfile mods --- sys/winnt/Makefile.msc | 273 ++++++++++++++++++++--------------------- 1 file changed, 136 insertions(+), 137 deletions(-) diff --git a/sys/winnt/Makefile.msc b/sys/winnt/Makefile.msc index c0773c035..49b1aa590 100644 --- a/sys/winnt/Makefile.msc +++ b/sys/winnt/Makefile.msc @@ -112,8 +112,6 @@ MSWIN = ..\win\win32 # window port files (win32) WCURSES = ..\win\curses # window port files (curses) WSHR = ..\win\share # Tile support files -! IF ("$(ADD_CURSES)"=="Y") -PDCURSES = # # Object directory. # @@ -219,17 +217,6 @@ VSVER=2999 #untested future version !include ! ENDIF -#---------------------------------------------------------------- - -!IF "$(ADD_CURSES)" == "Y" -#CURSESDEF=-D"PDC_DLL_BUILD" -D"CURSES_GRAPHICS" -D"CURSES_BRIEF_INCLUDE" -CURSESDEF=-D"CURSES_GRAPHICS" -D"CURSES_BRIEF_INCLUDE" -!ELSE -CURSDEF= -CURSESLIB= -CURSESINCL= -!ENDIF - #These will be in the environment variables with one of the VS2017 #developer command prompts. #VSCMD_ARG_HOST_ARCH=x64 @@ -259,100 +246,6 @@ CL_RECENT=-sdl ! ENDIF !ENDIF -ccommon= -c -nologo -D"_CONSOLE" -D"_CRT_NONSTDC_NO_DEPRECATE" -D"_CRT_SECURE_NO_DEPRECATE" \ - -D"_LIB" -D"_SCL_SECURE_NO_DEPRECATE" -D"_VC80_UPGRADE=0x0600" -D"DLB" -D"_MBCS" \ - -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -D"NDEBUG" -D"YY_NO_UNISTD_H" $(CURSESDEF) \ - -EHsc -fp:precise -Gd -GF -GS -Gy \ - $(CL_RECENT) -WX- -Zc:forScope -Zc:wchar_t -Zi -cdebug= -analyze- -D"_DEBUG" -Gm -MTd -RTC1 -Od -crelease= -analyze- -D"_MBCS" -errorReport:prompt -Gm- -MT -O2 -Ot -Ox -Oy - -lcommon= /NOLOGO /INCREMENTAL:NO - -!IF "$(DEBUGINFO)" == "Y" -ldebug = /DEBUG -cflags1=$(ccommon) $(cdebug) -lflags1=$(lcommon) $(ldebug) -!ELSE -ldebug= /DEBUG -cflags1=$(ccommon) $(crelease) -lflags1=$(lcommon) $(ldebug) -!ENDIF - -lflags= $(lflags1) - -!IF "$(TARGET_CPU)" == "x86" -cflags = $(cflags1) -D_X86_=1 -DWIN32 -D_WIN32 -W3 -scall = -Gz - -!ELSEIF "$(TARGET_CPU)" == "x64" -cflags = $(cflags1) -D_AMD64_=1 -DWIN64 -D_WIN64 -DWIN32 -D_WIN32 -W4 -scall = -!ENDIF - -!IF ($(VSVER) >= 2012) -cflags = $(cflags:-W4=-W3) -!ENDIF - -#More verbose warning output options below -#cflags = $(cflags:-W4=-wd4131 -#cflags = $(cflags:-W4=-Wall) -#cflags = $(cflags:-W3=-wd4131 -#cflags = $(cflags:-W3=-Wall) - -# declarations for use on Intel x86 systems -!IF "$(TARGET_CPU)" == "x86" -DLLENTRY = @12 -EXEVER=5.01 -MACHINE=/MACHINE:X86 -!ENDIF - -# declarations for use on AMD64 systems -!IF "$(TARGET_CPU)" == "x64" -DLLENTRY = -EXEVER=5.02 -MACHINE=/MACHINE:X64 -!ENDIF - -# for Windows applications -conlflags = $(lflags) -subsystem:console,$(EXEVER) -guilflags = $(lflags) -subsystem:windows,$(EXEVER) -dlllflags = $(lflags) -entry:_DllMainCRTStartup$(DLLENTRY) -dll - -# basic subsystem specific libraries, less the C Run-Time -baselibs = kernel32.lib $(optlibs) $(winsocklibs) advapi32.lib gdi32.lib -winlibs = $(baselibs) user32.lib comdlg32.lib winspool.lib - -# for Windows applications that use the C Run-Time libraries -conlibs = $(baselibs) -guilibs = $(winlibs) -# - -!IFNDEF ADD_CURSES -INCLDIR= /I..\include /I..\sys\winnt -!ELSE -INCLDIR= /I..\include /I..\sys\winnt /I$(CURSESINCL) -!ENDIF - - -#========================================== -# Util builds -#========================================== - -cflagsBuild = $(cflags) $(INCLDIR) $(WINPFLAG) $(DLBFLG) -lflagsBuild = $(lflags) $(conlibs) $(MACHINE) - -#========================================== -# - Game build -#========================================== - -LIBS= user32.lib winmm.lib $(ZLIB) $(CURSESLIB) - -! IF ("$(USE_DLB)"=="Y") -DLB = nhdat -! ELSE -DLB = -! ENDIF #========================================== #================ MACROS ================== @@ -492,10 +385,8 @@ OPTIONS_FILE = $(DAT)\options PDCURSES_CURSES_H = $(PDCURSES_TOP)\curses.h PDCURSES_CURSPRIV_H = $(PDCURSES_TOP)\curspriv.h PDCURSES_HEADERS = $(PDCURSES_CURSES_H) $(PDCURSES_CURSPRIV_H) -PANEL_HEADER = $(PDCURSES_TOP)\panel.h -TERM_HEADER = $(PDCURSES_TOP)\term.h -PDCSRC = $(PDCURSES_TOP)\wincon - +PDCSRC = $(PDCURSES_TOP)\pdcurses +PDCWINCON = $(PDCURSES_TOP)\wincon PDCLIBOBJS = $(O)addch.o $(O)addchstr.o $(O)addstr.o $(O)attr.o $(O)beep.o \ $(O)bkgd.o $(O)border.o $(O)clear.o $(O)color.o $(O)delch.o $(O)deleteln.o \ $(O)deprec.o $(O)getch.o $(O)getstr.o $(O)getyx.o $(O)inch.o $(O)inchstr.o \ @@ -507,12 +398,11 @@ PDCLIBOBJS = $(O)addch.o $(O)addchstr.o $(O)addstr.o $(O)attr.o $(O)beep.o PDCOBJS = $(O)pdcclip.o $(O)pdcdisp.o $(O)pdcgetsc.o $(O)pdckbd.o $(O)pdcscrn.o \ $(O)pdcsetsc.o $(O)pdcutil.o -PDCOSDIR = $(PDCURSES_SRCDIR)/wincon - -PDCURSES_WIN_H = $(PDCOSDIR)/pdcwin.h PDCLIB = $(O)\pdcurses.lib +PDCINCL = /I$(PDCURSES_TOP) /I$(PDCSRC) /I$(PDCURSES_TOP)\pdcurses + !ELSE PDCLIB = !ENDIF @@ -554,6 +444,114 @@ TILE_H = ..\win\share\tile.h DATABASE = $(DAT)\data.base +#========================================== +# More compiler setup post-macros +#========================================== +#---------------------------------------------------------------- + +!IF "$(ADD_CURSES)" == "Y" +#CURSESDEF=-D"PDC_DLL_BUILD" -D"CURSES_GRAPHICS" -D"CURSES_BRIEF_INCLUDE" +CURSESDEF=-D"CURSES_GRAPHICS" -D"CURSES_BRIEF_INCLUDE" +!ELSE +CURSDEF= +CURSESLIB= +CURSESINCL= +!ENDIF + +ccommon= -c -nologo -D"_CONSOLE" -D"_CRT_NONSTDC_NO_DEPRECATE" -D"_CRT_SECURE_NO_DEPRECATE" \ + -D"_LIB" -D"_SCL_SECURE_NO_DEPRECATE" -D"_VC80_UPGRADE=0x0600" -D"DLB" -D"_MBCS" \ + -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -D"NDEBUG" -D"YY_NO_UNISTD_H" $(CURSESDEF) \ + -EHsc -fp:precise -Gd -GF -GS -Gy \ + $(CL_RECENT) -WX- -Zc:forScope -Zc:wchar_t -Zi +cdebug= -analyze- -D"_DEBUG" -Gm -MTd -RTC1 -Od +crelease= -analyze- -D"_MBCS" -errorReport:prompt -Gm- -MT -O2 -Ot -Ox -Oy + +lcommon= /NOLOGO /INCREMENTAL:NO + +!IF "$(DEBUGINFO)" == "Y" +ldebug = /DEBUG +cflags1=$(ccommon) $(cdebug) +lflags1=$(lcommon) $(ldebug) +!ELSE +ldebug= /DEBUG +cflags1=$(ccommon) $(crelease) +lflags1=$(lcommon) $(ldebug) +!ENDIF + +lflags= $(lflags1) + +!IF "$(TARGET_CPU)" == "x86" +cflags = $(cflags1) -D_X86_=1 -DWIN32 -D_WIN32 -W3 +scall = -Gz + +!ELSEIF "$(TARGET_CPU)" == "x64" +cflags = $(cflags1) -D_AMD64_=1 -DWIN64 -D_WIN64 -DWIN32 -D_WIN32 -W4 +scall = +!ENDIF + +!IF ($(VSVER) >= 2012) +cflags = $(cflags:-W4=-W3) +!ENDIF + +#More verbose warning output options below +#cflags = $(cflags:-W4=-wd4131 +#cflags = $(cflags:-W4=-Wall) +#cflags = $(cflags:-W3=-wd4131 +#cflags = $(cflags:-W3=-Wall) + +# declarations for use on Intel x86 systems +!IF "$(TARGET_CPU)" == "x86" +DLLENTRY = @12 +EXEVER=5.01 +MACHINE=/MACHINE:X86 +!ENDIF + +# declarations for use on AMD64 systems +!IF "$(TARGET_CPU)" == "x64" +DLLENTRY = +EXEVER=5.02 +MACHINE=/MACHINE:X64 +!ENDIF + +# for Windows applications +conlflags = $(lflags) -subsystem:console,$(EXEVER) +guilflags = $(lflags) -subsystem:windows,$(EXEVER) +dlllflags = $(lflags) -entry:_DllMainCRTStartup$(DLLENTRY) -dll + +# basic subsystem specific libraries, less the C Run-Time +baselibs = kernel32.lib $(optlibs) $(winsocklibs) advapi32.lib gdi32.lib +winlibs = $(baselibs) user32.lib comdlg32.lib winspool.lib + +# for Windows applications that use the C Run-Time libraries +conlibs = $(baselibs) +guilibs = $(winlibs) +# + +!IFNDEF ADD_CURSES +INCLDIR= /I..\include /I..\sys\winnt +!ELSE +INCLDIR= /I..\include /I..\sys\winnt /I$(CURSESINCL) +!ENDIF + +#========================================== +# Util builds +#========================================== + +cflagsBuild = $(cflags) $(INCLDIR) $(WINPFLAG) $(DLBFLG) +lflagsBuild = $(lflags) $(conlibs) $(MACHINE) + +#========================================== +# - Game build +#========================================== + +LIBS= user32.lib winmm.lib $(ZLIB) $(CURSESLIB) + +! IF ("$(USE_DLB)"=="Y") +DLB = nhdat +! ELSE +DLB = +! ENDIF + #========================================== #================ RULES ================== #========================================== @@ -597,19 +595,6 @@ DATABASE = $(DAT)\data.base {$(UTIL)}.c{$(OBJ)}.o: @$(cc) $(cflagsBuild) -Fo$@ $< -#========================================== -# Rules for files in win\curses -#========================================== - -{$(CURSES)}.c{$(OBJ)}.o: - @$(cc) $(cflagsBuild) -Fo$@ $< - -{$(CURSES)}.h{$(INCL)}.h: - @copy $< $@ - -#{$(CURSES)}.txt{$(DAT)}.txt: -# @copy $< $@ - #========================================== # Rules for files in win\share #========================================== @@ -638,15 +623,28 @@ DATABASE = $(DAT)\data.base {$(MSWIN)}.c{$(OBJ)}.o: @$(cc) $(cflagsBuild) -Fo$@ $< +#========================================== +# Rules for files in win\curses +#========================================== + +{$(WCURSES)}.c{$(OBJ)}.o: + @$(cc) $(PDCINCL) $(cflagsBuild) -Fo$@ $< + +#{$(WCURSES)}.txt{$(DAT)}.txt: +# @copy $< $@ + #========================================== # Rules for files in PDCurses #========================================== {$(PDCURSES_TOP)}.c{$(OBJ)}.o: - @$(cc) $(cflagsBuild) -Fo$@ $< + @$(cc) $(PDCINCL) $(cflagsBuild) -Fo$@ $< {$(PDCSRC)}.c{$(OBJ)}.o: - @$(cc) $(cflagsBuild) -Fo$@ $< + @$(cc) $(PDCINCL) $(cflagsBuild) -Fo$@ $< + +{$(PDCWINCON)}.c{$(OBJ)}.o: + @$(cc) $(PDCINCL) $(cflagsBuild) -Fo$@ $< #========================================== #=============== TARGETS ================== @@ -798,12 +796,12 @@ GAMEOBJ=$(GAMEOBJ:^ =^ # objs: $(GAMEOBJ) $(TTYOBJ) $(O)tile.o $(O)guistub.o -$(GAMEDIR)\NetHack.exe : $(O)gamedir.tag $(O)tile.o $(O)nttty.o $(O)guistub.o \ +$(GAMEDIR)\NetHack.exe : $(O)gamedir.tag $(PDCLIB) $(O)tile.o $(O)nttty.o $(O)guistub.o \ $(ALLOBJ) $(TTYOBJ) $(GUIOBJ) $(O)console.res $(KEYDLLS) @if not exist $(GAMEDIR)\*.* mkdir $(GAMEDIR) @echo Linking $(@:\=/) $(link) $(lflagsBuild) $(conlflags) /STACK:2048 /PDB:$(GAMEDIR)\$(@B).PDB /MAP:$(O)$(@B).MAP \ - $(PDCLIB) $(LIBS) $(conlibs) -out:$@ @<<$(@B).lnk + $(LIBS) $(PDCLIB) $(conlibs) -out:$@ @<<$(@B).lnk $(GAMEOBJ) $(TTYOBJ) $(O)nttty.o @@ -826,7 +824,7 @@ $(GAMEDIR)\NetHackW.exe : $(O)gamedir.tag $(O)tile.o $(O)ttystub.o \ @if not exist $(GAMEDIR)\*.* mkdir $(GAMEDIR) @echo Linking $(@:\=/) $(link) $(lflagsBuild) $(guilflags) /STACK:2048 /PDB:$(GAMEDIR)\$(@B).PDB \ - /MAP:$(O)$(@B).MAP $(LIBS) $(guilibs) $(COMCTRL) -out:$@ @<<$(@B).lnk + /MAP:$(O)$(@B).MAP $(LIBS) $(PDCLIB) $(guilibs) $(COMCTRL) -out:$@ @<<$(@B).lnk $(GAMEOBJ) $(GUIOBJ) $(O)tile.o @@ -1263,7 +1261,8 @@ $(O)til2bm32.o: $(WSHR)\tile2bmp.c $(HACK_H) $(TILE_H) $(MSWSYS)\win32api.h # PDCurses #========================================== -$(PDCLIB) : $(PDCLIBOBJS) +$(PDCLIB) : $(PDCLIBOBJS) $(PDCOBJS) + lib -nologo /out:$@ $(PDCLIBOBJS) $(PDCOBJS) #========================================== # Housekeeping @@ -1539,9 +1538,9 @@ $(O)topl.o: ..\win\tty\topl.c $(HACK_H) $(INCL)\tcap.h @$(CC) $(cflagsBuild) -Fo$@ ..\win\tty\topl.c $(O)wintty.o: ..\win\tty\wintty.c $(HACK_H) $(INCL)\dlb.h $(INCL)\tcap.h @$(CC) $(cflagsBuild) -Fo$@ ..\win\tty\wintty.c -$(O)Window.o: ..\win\X11\Window.c $(INCL)\xwindowp.h $(INCL)\xwindow.h \ - $(CONFIG_H) - @$(CC) $(cflagsBuild) -Fo$@ ..\win\X11\Window.c +#$(O)Window.o: ..\win\X11\Window.c $(INCL)\xwindowp.h $(INCL)\xwindow.h \ +# $(CONFIG_H) +# @$(CC) $(cflagsBuild) -Fo$@ ..\win\X11\Window.c $(O)dialogs.o: ..\win\X11\dialogs.c $(CONFIG_H) @$(CC) $(cflagsBuild) -Fo$@ ..\win\X11\dialogs.c $(O)winX.o: ..\win\X11\winX.c $(HACK_H) $(INCL)\winX.h $(INCL)\dlb.h \ @@ -1739,7 +1738,7 @@ $(O)vision.o: vision.c $(HACK_H) $(INCL)\vis_tab.h $(O)weapon.o: weapon.c $(HACK_H) $(O)were.o: were.c $(HACK_H) $(O)wield.o: wield.c $(HACK_H) -$(O)windows.o: windows.c $(HACK_H) $(INCL)\wingem.h $(INCL)\winGnome.h +#$(O)windows.o: windows.c $(HACK_H) $(INCL)\wingem.h $(INCL)\winGnome.h $(O)wizard.o: wizard.c $(HACK_H) $(INCL)\qtext.h $(O)worm.o: worm.c $(HACK_H) $(INCL)\lev.h $(O)worn.o: worn.c $(HACK_H) From 935fe5bca831f304e60b525ec03c3e46cb6c44e0 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 18 Nov 2018 06:57:17 -0500 Subject: [PATCH 12/74] Makefile macro correction --- sys/winnt/Makefile.msc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sys/winnt/Makefile.msc b/sys/winnt/Makefile.msc index 49b1aa590..1f7f5fed6 100644 --- a/sys/winnt/Makefile.msc +++ b/sys/winnt/Makefile.msc @@ -401,7 +401,7 @@ PDCOBJS = $(O)pdcclip.o $(O)pdcdisp.o $(O)pdcgetsc.o $(O)pdckbd.o $(O)pdcscrn.o PDCLIB = $(O)\pdcurses.lib -PDCINCL = /I$(PDCURSES_TOP) /I$(PDCSRC) /I$(PDCURSES_TOP)\pdcurses +PDCINCL = /I$(PDCURSES_TOP) /I$(PDCSRC) /I$(PDCWINCON) !ELSE PDCLIB = @@ -1348,6 +1348,9 @@ spotless: clean if exist $(U)tilemap.exe del $(U)tilemap.exe if exist $(U)uudecode.exe del $(U)uudecode.exe if exist $(U)dlb_main.exe del $(U)dlb_main.exe +!IF "$(ADD_CURSES)" == "Y" + if exist $(U)pdcurses.lib del $(O)pdcurses.lib +!ENDIF clean: if exist $(O)*.o del $(O)*.o if exist $(O)utility.tag del $(O)utility.tag From bf0e0b9f1281152ee5e551f8da0bad37043430fb Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 18 Nov 2018 07:10:58 -0500 Subject: [PATCH 13/74] Makefile cut-and-paste error --- sys/winnt/Makefile.msc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/winnt/Makefile.msc b/sys/winnt/Makefile.msc index 1f7f5fed6..28a7bae48 100644 --- a/sys/winnt/Makefile.msc +++ b/sys/winnt/Makefile.msc @@ -1349,7 +1349,7 @@ spotless: clean if exist $(U)uudecode.exe del $(U)uudecode.exe if exist $(U)dlb_main.exe del $(U)dlb_main.exe !IF "$(ADD_CURSES)" == "Y" - if exist $(U)pdcurses.lib del $(O)pdcurses.lib + if exist $(O)pdcurses.lib del $(O)pdcurses.lib !ENDIF clean: if exist $(O)*.o del $(O)*.o From 1b36af5d8aee7e501678ab64a6b725d825614cf1 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 18 Nov 2018 07:59:59 -0500 Subject: [PATCH 14/74] update Install.nt --- sys/winnt/Install.nt | 75 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 16 deletions(-) diff --git a/sys/winnt/Install.nt b/sys/winnt/Install.nt index 9d8fd01e0..91446103e 100644 --- a/sys/winnt/Install.nt +++ b/sys/winnt/Install.nt @@ -5,7 +5,7 @@ NetHack 3.6 on a Windows system (Windows 7/8.x/10 or later only. XP may work but is untested) ============================================================== - Last revision: $NHDT-Date: 1524317622 2018/04/21 13:33:42 $ + Last revision: $NHDT-Date: 1542545993 2018/11/18 12:59:53 $ Credit for the porting of NetHack to the Win32 Console Subsystem goes to the NT Porting Team started by Michael Allison. @@ -47,6 +47,10 @@ of NetHack you wish to run. The Visual Studio 2017 NetHack solution file can be found here: win\win32\vs2017\NetHack.sln +Before executing the steps to build listed in the next paragraph, +decide if you want to include optional curses window-port. See +the note just below entitled "Optional curses window-port support." + So the steps are: 1. Launch the IDE. 2. Open the appropriate solution file. @@ -60,6 +64,26 @@ using a "build.bat" batch file found in the same directory as the solution. Open a developer command prompt for the version of Visual Studio you are using. Change to the directory win\win32\vs2017 and run "build.bat". + + +Starting with 3.6.2, the community patch for a window-port that uses +curses was incorporated into the NetHack source code tree. That window-port, +which evolved from work originally done by Karl Garrison, has been used in +several NetHack variants and on nethack.alt.org and on +www.hardfought.org/nethack/. + +If you want to include the curses window-port support in your Visual Studio +build, you will have to first obtain the PDCurses sources from +https://github.com/wmcbrine/PDCurses +and have them available prior to building NetHack. There are two ways to +enable curses window-port support during the VS build: Either set the +environment variable PDCURSES to a folder containing a PDCurses +repository/source-tree + OR +Place the PDCurses folder alongside the NetHack source repository prior +to proceeding with steps 1 through 5 above. + + /-----------------------------------\ | Building Using Make | \-----------------------------------/ @@ -151,7 +175,26 @@ Setting Up source tree. cd src -2. Make sure all the NetHack files are in the appropriate directory +2. Starting with 3.6.2, the community patch for a window-port that uses + curses was incorporated into the NetHack source code tree. That + window-port, which evolved from work originally done by Karl Garrison, + has been used in several NetHack variants and on nethack.alt.org and + on www.hardfought.org/nethack/. + + If you want to include the optional curses window-port support in your + command line Makefile build, you will have to first obtain the + PDCurses sources from https://github.com/wmcbrine/PDCurses + and have that source code tree available prior to building NetHack. + Edit your Makefile and in Question 4 of the four decisions you can + make in there, uncomment these two lines: + ADD_CURSES=Y + PDCURSES_TOP=..\..\pdcurses + + Adjust the PDCURSES_TOP macro so that it points to the correct + location for the top of the PDCurses source tree if it differs from + the path shown. + +3. Make sure all the NetHack files are in the appropriate directory structure. You should have a main directory with subdirectories dat, doc, include, src, sys\share, sys\winnt, util, and binary (The "binary" directory was created by nhsetup.bat earlier if you @@ -164,26 +207,26 @@ Setting Up they are not necessary for building the TTY version for the Win32 console subsystem. You can delete them to save space. - Required Directories for a Win32 Console NetHack: + Required Directories for a Win32 Console NetHack build: - top - | - ----------------------------------------------------/ /----- - | | | | | | | | - util dat doc include src sys win binary - | | - ------ ----- - | | | - share winnt tty + top -------------(optional) ---------------- + | | + ------------------------------------------------- pdcurses-top + | | | | | | | | | + util dat doc include src sys win pdcurses wincon + | | + ------ ----- + | | | + share winnt tty Required Directories for a Win32 Graphical NetHack: top | - ----------------------------------------------------/ /----- - | | | | | | | | - util dat doc include src sys win binary + ------------------------------------------------- + | | | | | | | + util dat doc include src sys win | | ------ ----- | | | @@ -200,7 +243,7 @@ Setting Up trouble with them, so you may need to convert them. The compiler should not have any problems with them however. -3. Now go to the include subdirectory to check a couple of the header +4. Now go to the include subdirectory to check a couple of the header files there. Things *should* work as they are, but since you have probably set up your system in some sort of custom configuration it doesn't hurt to check out the following: From 60c3c2f1130bdaa27483524e0d22ec38faa1fc43 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 18 Nov 2018 08:34:24 -0500 Subject: [PATCH 15/74] fix a build error when curses is NOT enabled Fix an error when curses build macros are not defined makefile(1262) : fatal error U1083: target macro '$(PDCLIB)' expands to nothing --- sys/winnt/Makefile.msc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sys/winnt/Makefile.msc b/sys/winnt/Makefile.msc index 28a7bae48..926eed8ad 100644 --- a/sys/winnt/Makefile.msc +++ b/sys/winnt/Makefile.msc @@ -73,8 +73,8 @@ DEBUGINFO = Y # PDCurses header (.h) files and PDCURSES_C to the location # of your PDCurses C files. # -ADD_CURSES=Y -PDCURSES_TOP=..\..\pdcurses +#ADD_CURSES=Y +#PDCURSES_TOP=..\..\pdcurses # #============================================================================== # This marks the end of the BUILD DECISIONS section. @@ -1261,7 +1261,7 @@ $(O)til2bm32.o: $(WSHR)\tile2bmp.c $(HACK_H) $(TILE_H) $(MSWSYS)\win32api.h # PDCurses #========================================== -$(PDCLIB) : $(PDCLIBOBJS) $(PDCOBJS) +$(O)\pdcurses.lib : $(PDCLIBOBJS) $(PDCOBJS) lib -nologo /out:$@ $(PDCLIBOBJS) $(PDCOBJS) #========================================== From f7fbbb8cb0e8fcd2912111ef24f216ca9bf5ff3b Mon Sep 17 00:00:00 2001 From: Bart House Date: Sun, 18 Nov 2018 09:28:45 -0800 Subject: [PATCH 16/74] Hint file for macOS X with curses. --- sys/unix/hints/macosx10.10-curses | 355 ++++++++++++++++++++++++++++++ 1 file changed, 355 insertions(+) create mode 100644 sys/unix/hints/macosx10.10-curses diff --git a/sys/unix/hints/macosx10.10-curses b/sys/unix/hints/macosx10.10-curses new file mode 100644 index 000000000..faa935eed --- /dev/null +++ b/sys/unix/hints/macosx10.10-curses @@ -0,0 +1,355 @@ +# +# NetHack 3.6 macosx10.11 $NHDT-Date: 1515549543 2018/01/10 01:59:03 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.48 $ +# Copyright (c) Kenneth Lorber, Kensington, Maryland, 2015. +# NetHack may be freely redistributed. See license for details. +# +#-PRE +# Mac OS X (Darwin) hints file +# This is for Mac OS X 10.10 or later, and has been tested on 10.11 +# (El Capitan). If this doesn't work for some other +# version of Mac OS X, make a new file for that OS, don't change this one. +# And let us know about it. +# Useful info: http://www.opensource.apple.com/darwinsource/index.html + +# You'll need to obtain and install XQuartz if you want X11 support. +# (Attempting to run X11.app will describe where to get it.) + +# This hints file can build several different types of installations. +# Edit the next section to match the type of build you need. + +# 1. Which window system(s) should be included in this binary? +WANT_WIN_TTY=1 +#WANT_WIN_X11=1 +#WANT_WIN_QT=1 +WANT_WIN_CURSES=1 + +# 1a. What is the default window system? +#WANT_DEFAULT=tty +#WANT_DEFAULT=x11 +#WANT_DEFAULT=qt +WANT_DEFAULT=curses + +# 1b. If you set WANT_WIN_QT, you need to +# A) set QTDIR either here or in the environment to point to the Qt2 or Qt3 +# library installation root. (Qt4 will not work; Qt3 does not presently +# compile under Leopard (MacOSX 10.5) out-of-the-box.) +# B) set XPMLIB to point to the Xpm library +ifdef WANT_WIN_QT +QTDIR=/Developer/Qt +LIBXPM= -L/opt/X11/lib -lXpm +endif # WANT_WIN_QT + +# 2. Is this a build for a binary that will be shared among different users +# or will it be private to you? +# If it is shared: +# - it will be owned by the user and group listed +# - if the user does not exist, you MUST create it before installing +# NetHack +# - if the group does not exist, it will be created. +# NB: if the group already exists and is being used for something +# besides games, you probably want to specify a new group instead +# NB: the group will be created locally; if your computer is centrally +# administered this may not be what you (or your admin) want. +# Consider a non-shared install (WANT_SHARE_INSTALL=0) instead. +# - 'make install' must be run as "sudo make install" +#WANT_SHARE_INSTALL=1 +GAMEUID = $(USER) +GAMEGRP = games +# build to run in the source tree - primarily for development. Build with "make all" +#WANT_SOURCE_INSTALL=1 + +CC=gcc + +# At the moment this is just for debugging, but in the future it could be +# useful for other things. Requires SYSCF and an ANSI compiler. +#WANT_WIN_CHAIN=1 + +# +# You shouldn't need to change anything below here. +# + +#CFLAGS+=-W -Wimplicit -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wcast-qual -Wwrite-strings -DGCC_WARN +CFLAGS+=-Wall -Wextra -Wno-missing-field-initializers -Wimplicit -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wwrite-strings -DGCC_WARN -ansi -pedantic +# As of LLVM build 2336.1.00, this gives dozens of spurious messages, so +# leave it out by default. +#CFLAGS+=-Wunreachable-code + +# XXX -g vs -O should go here, -I../include goes in the makefile +CFLAGS+=-g -I../include +# older binaries use NOCLIPPING, but that disables SIGWINCH +#CFLAGS+=-DNOCLIPPING +CFLAGS+= -DNOMAIL -DNOTPARMDECL -DHACKDIR=\"$(HACKDIR)\" +CFLAGS+= -DDEFAULT_WINDOW_SYS=\"$(WANT_DEFAULT)\" -DDLB + +CFLAGS+= -DGREPPATH=\"/usr/bin/grep\" + +ifdef WANT_WIN_CHAIN +CFLAGS+= -DWINCHAIN +HINTSRC=$(CHAINSRC) +HINTOBJ=$(CHAINOBJ) +endif + +ifdef WANT_WIN_TTY +WINSRC = $(WINTTYSRC) +WINOBJ = $(WINTTYOBJ) +WINLIB = $(WINTTYLIB) +WINTTYLIB=-lncurses +else # !WANT_WIN_TTY +CFLAGS += -DNOTTYGRAPHICS +endif # !WANT_WIN_TTY + +ifdef WANT_WIN_CURSES +CFLAGS += -DCURSES_GRAPHICS +WINSRC += $(WINCURSESSRC) +WINOBJ += $(WINCURSESOBJ) +WINLIB += -lncurses +endif + +ifdef WANT_WIN_X11 +WINSRC += $(WINX11SRC) +WINOBJ += $(WINX11OBJ) +WINLIB += $(WINX11LIB) +LFLAGS=-L/opt/X11/lib +VARDATND = x11tiles NetHack.ad pet_mark.xbm pilemark.xbm +POSTINSTALL+= bdftopcf win/X11/nh10.bdf > $(HACKDIR)/nh10.pcf; (cd $(HACKDIR); mkfontdir); +CFLAGS += -DX11_GRAPHICS -I/opt/X11/include +# avoid repeated complaints about _X_NONNULL(args...) in +CFLAGS += -Wno-variadic-macros +endif # WANT_WIN_X11 + +ifdef WANT_WIN_QT +CFLAGS += -DQT_GRAPHICS -DNOUSER_SOUNDS +CFLAGS += -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4 +LINK=g++ +WINSRC += $(WINQTSRC) +WINLIB += $(WINQTLIB) $(LIBXPM) +WINLIB += -framework Carbon -framework QuickTime -lz -framework OpenGL +WINLIB += -framework AGL +ifdef WANT_WIN_X11 + # prevent duplicate tile.o in WINOBJ +WINOBJ = $(sort $(WINQTOBJ) $(WINX11OBJ)) +ifdef WANT_WIN_TTY +WINOBJ += $(WINTTYOBJ) +endif # WANT_WIN_TTY +else # !WANT_WIN_X11 +WINOBJ += $(WINQTOBJ) +endif # !WANT_WIN_X11 + +# XXX if /Developer/qt exists and QTDIR not set, use that +ifndef QTDIR +$(error QTDIR not defined in the environment or Makefile) +endif # QTDIR +# XXX make sure QTDIR points to something reasonable +else # !WANT_WIN_QT +LINK=$(CC) +endif # !WANT_WIN_QT + +ifdef WANT_SHARE_INSTALL +# if $GAMEUID is root, we install into roughly proper Mac locations, otherwise +# we install into ~/nethackdir +ifeq ($(GAMEUID),root) +PREFIX:=/Library/NetHack +SHELLDIR=/usr/local/bin +HACKDIR=$(PREFIX)/nethackdir +CHOWN=chown +CHGRP=chgrp +# We run sgid so the game has access to both HACKDIR and user preferences. +GAMEPERM = 02755 +else # ! root +PREFIX:=/Users/$(GAMEUID) +SHELLDIR=$(PREFIX)/bin +HACKDIR=$(PREFIX)/Library/NetHack/nethackdir +CHOWN=/usr/bin/true +CHGRP=/usr/bin/true +GAMEPERM = 0500 +endif # ! root +VARFILEPERM = 0664 +VARDIRPERM = 0775 +ROOTCHECK= [[ `id -u` == 0 ]] || ( echo "Must run install with sudo."; exit 1) +# XXX it's nice we don't write over sysconf, but we've already erased it +# make sure we have group GAMEUID and group GAMEGRP +PREINSTALL= . sys/unix/hints/macosx.sh user2 $(GAMEUID); . sys/unix/hints/macosx.sh group2 $(GAMEGRP); mkdir $(SHELLDIR); chown $(GAMEUID) $(SHELLDIR) +POSTINSTALL+= sys/unix/hints/macosx.sh editsysconf sys/unix/sysconf $(HACKDIR)/sysconf; $(CHOWN) $(GAMEUID) $(HACKDIR)/sysconf; $(CHGRP) $(GAMEGRP) $(HACKDIR)/sysconf; chmod $(VARFILEPERM) $(HACKDIR)/sysconf; +CFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -DSECURE +else ifdef WANT_SOURCE_INSTALL +PREFIX=$(abspath $(NHSROOT)) +# suppress nethack.sh +#SHELLDIR= +HACKDIR=$(PREFIX)/playground +CHOWN=/usr/bin/true +CHGRP=/usr/bin/true +GAMEPERM = 0700 +VARFILEPERM = 0600 +VARDIRPERM = 0700 +POSTINSTALL+= sys/unix/hints/macosx.sh editsysconf sys/unix/sysconf $(HACKDIR)/sysconf; +# We can use "make all" to build the whole thing - but it misses some things: +MOREALL=$(MAKE) install +CFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -DSECURE +else # !WANT_SOURCE_INSTALL +PREFIX:=$(wildcard ~) +SHELLDIR=$(PREFIX)/bin +HACKDIR=$(PREFIX)/nethackdir +CHOWN=/usr/bin/true +CHGRP=/usr/bin/true +GAMEPERM = 0700 +VARFILEPERM = 0600 +VARDIRPERM = 0700 +ifdef WANT_WIN_X11 +# install nethack.rc as ~/.nethackrc if no ~/.nethackrc exists +PREINSTALL= cp -n win/X11/nethack.rc ~/.nethackrc +endif # WANT_WIN_X11 +POSTINSTALL+= sys/unix/hints/macosx.sh editsysconf sys/unix/sysconf $(HACKDIR)/sysconf; $(CHOWN) $(GAMEUID) $(HACKDIR)/sysconf; $(CHGRP) $(GAMEGRP) $(HACKDIR)/sysconf; chmod $(VARFILEPERM) $(HACKDIR)/sysconf; +CFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -DSECURE +endif # !WANT_SOURCE_INSTALL + +INSTDIR=$(HACKDIR) +VARDIR=$(HACKDIR) + + +# ~/Library/Preferences/NetHack Defaults +# OPTIONS=name:player,number_pad,menustyle:partial,!time,showexp +# OPTIONS=hilite_pet,toptenwin,msghistory:200,windowtype:Qt +# +# Install.Qt mentions a patch for macos - it's not there (it seems to be in the Qt binary +# package under the docs directory). + +#-POST +ifdef MAKEFILE_TOP +### +### Packaging +### +# Notes: +# 1) The Apple developer utilities must be installed in the default location. +# 2) Do a normal build before trying to package the game. +# 3) This matches the 3.4.3 Term package, but there are some things that should +# be changed. + +ifdef WANT_WIN_TTY +DEVUTIL=/Developer/Applications/Utilities +SVS=$(shell $(NHSROOT)/util/makedefs --svs) +SVSDOT=$(shell $(NHSROOT)/util/makedefs --svs .) + +PKGROOT_UG = PKGROOT/$(PREFIX) +PKGROOT_UGLN = PKGROOT/$(HACKDIR) +PKGROOT_BIN = PKGROOT/$(SHELLDIR) +build_tty_pkg: +ifneq (,$(WANT_WIN_X11)$(WANT_WIN_QT)) + -echo build_tty_pkg only works for a tty-only build + exit 1 +else + rm -rf NetHack-$(SVS)-mac-Term.pkg NetHack-$(SVS)-mac-Term.dmg + $(MAKE) build_package_root + rm -rf RESOURCES + mkdir RESOURCES + #enscript --language=rtf -o - < dat/license >RESOURCES/License.rtf + sys/unix/hints/macosx.sh descplist > RESOURCES/Description.plist + sys/unix/hints/macosx.sh infoplist > Info.plist + + mkdir PKGROOT/Applications + #osacompile -o NetHackQt/NetHackQt.app/nethackdir/NetHackRecover.app \ + # win/macosx/NetHackRecover.applescript + #cp win/macosx/recover.pl NetHackQt/NetHackQt.app/nethackdir + osacompile -o PKGROOT/Applications/NetHackRecover.app \ + win/macosx/NetHackRecover.applescript + cp win/macosx/recover.pl $(PKGROOT_UGLN) + + osacompile -o PKGROOT/Applications/NetHackTerm.app \ + win/macosx/NetHackTerm.applescript + + # XXX integrate into Makefile.doc + (cd doc; cat Guidebook.mn | ../util/makedefs --grep --input - --output - \ + | tbl tmac.n - | groff | pstopdf -i -o Guidebook.pdf) + cp doc/Guidebook.pdf $(PKGROOT_UG)/doc/NetHackGuidebook.pdf + + osacompile -o PKGROOT/Applications/NetHackGuidebook.app \ + win/macosx/NetHackGuidebook.applescript + + mkdir -p PKG + pkgbuild --root PKGROOT --identifier org.nethack.term --scripts PKGSCRIPTS PKG/NH-Term.pkg + productbuild --synthesize --product Info.plist --package PKG/NH-Term.pkg Distribution.xml + productbuild --distribution Distribution.xml --resources RESOURCES --package-path PKG NetHack-$(SVS)-mac-Term.pkg + hdiutil create -verbose -srcfolder NetHack-$(SVS)-mac-Term.pkg NetHack-$(SVS)-mac-Term.dmg + +build_package_root: + cd src/.. # make sure we are at TOP + rm -rf PKGROOT + mkdir -p $(PKGROOT_UG)/lib $(PKGROOT_BIN) $(PKGROOT_UG)/man/man6 $(PKGROOT_UG)/doc $(PKGROOT_UGLN) + install -p src/nethack $(PKGROOT_BIN) + # XXX should this be called nethackrecover? + install -p util/recover $(PKGROOT_BIN) + install -p doc/nethack.6 $(PKGROOT_UG)/man/man6 + install -p doc/recover.6 $(PKGROOT_UG)/man/man6 + install -p doc/Guidebook $(PKGROOT_UG)/doc + install -p dat/nhdat $(PKGROOT_UGLN) + sys/unix/hints/macosx.sh editsysconf sys/unix/sysconf $(PKGROOT_UGLN)/sysconf + cd dat; install -p $(DATNODLB) ../$(PKGROOT_UGLN) +# XXX these files should be somewhere else for good Mac form + touch $(PKGROOT_UGLN)/perm $(PKGROOT_UGLN)/record $(PKGROOT_UGLN)/logfile $(PKGROOT_UGLN)/xlogfile + mkdir $(PKGROOT_UGLN)/save +# XXX what about a news file? + + mkdir -p PKGSCRIPTS + echo '#!/bin/sh' > PKGSCRIPTS/postinstall + echo dseditgroup -o create -r '"Games Group"' -s 3600 $(GAMEGRP) >> PKGSCRIPTS/postinstall + echo $(CHOWN) -R $(GAMEUID) $(HACKDIR) >> PKGSCRIPTS/postinstall + echo $(CHGRP) -R $(GAMEGRP) $(HACKDIR) >> PKGSCRIPTS/postinstall + echo $(CHOWN) $(GAMEUID) $(SHELLDIR)/nethack >> PKGSCRIPTS/postinstall + echo $(CHGRP) $(GAMEGRP) $(SHELLDIR)/nethack >> PKGSCRIPTS/postinstall + echo $(CHOWN) $(GAMEUID) $(SHELLDIR)/recover >> PKGSCRIPTS/postinstall + echo $(CHGRP) $(GAMEGRP) $(SHELLDIR)/recover >> PKGSCRIPTS/postinstall + echo chmod $(VARDIRPERM) $(HACKDIR) >> PKGSCRIPTS/postinstall + echo chmod $(VARDIRPERM) $(HACKDIR)/save >> PKGSCRIPTS/postinstall + echo chmod $(FILEPERM) $(HACKDIR)/license >> PKGSCRIPTS/postinstall + echo chmod $(FILEPERM) $(HACKDIR)/nhdat >> PKGSCRIPTS/postinstall + echo chmod $(FILEPERM) $(HACKDIR)/symbols >> PKGSCRIPTS/postinstall + echo chmod $(VARFILEPERM) $(HACKDIR)/perm >> PKGSCRIPTS/postinstall + echo chmod $(VARFILEPERM) $(HACKDIR)/record >> PKGSCRIPTS/postinstall + echo chmod $(VARFILEPERM) $(HACKDIR)/logfile >> PKGSCRIPTS/postinstall + echo chmod $(VARFILEPERM) $(HACKDIR)/xlogfile >> PKGSCRIPTS/postinstall + echo chmod $(VARFILEPERM) $(HACKDIR)/sysconf >> PKGSCRIPTS/postinstall + echo chmod $(GAMEPERM) $(SHELLDIR)/nethack >> PKGSCRIPTS/postinstall + echo chmod $(EXEPERM) $(SHELLDIR)/recover >> PKGSCRIPTS/postinstall + chmod 0775 PKGSCRIPTS/postinstall + +endif # end of build_tty_pkg +endif # WANT_WIN_TTY for packaging + +ifdef WANT_WIN_QT +# XXX untested and incomplete (see below) +build_qt_pkg: +ifneq (,$(WANT_WIN_X11)$(WANT_WIN_TTY)) + -echo build_qt_pkg only works for a qt-only build + exit 1 +else + $(MAKE) build_package_root + rm -rf NetHackQt + mkdir -p NetHackQt/NetHackQt.app/nethackdir/save + mkdir NetHackQt/Documentation + cp doc/Guidebook.txt doc/nethack.txt doc/recover.txt NetHackQt/Documentation + + osacompile -o NetHackQt/NetHackQt.app/nethackdir/NetHackRecover.app \ + win/macosx/NetHackRecover.applescript + cp win/macosx/recover.pl NetHackQt/NetHackQt.app/nethackdir + + mkdir -p NetHackQt/NetHackQt.app/Contents/Frameworks + cp $(QTDIR)/libqt-mt.3.dylib NetHackQt/NetHackQt.app/Contents/Frameworks + + mkdir NetHackQt/NetHackQt.app/Contents/MacOS + mv PKGROOT/nethack NetHackQt/NetHackQt.app/Contents/MacOS + + mv PKGROOT/lib/nethackdir NetHackQt/NetHackQt.app/nethackdir + +# XXX still missing: +#NetHackQt/NetHackQt.app +# /Contents +# Info.plist +# Resources/nethack.icns +#NetHackQt/Documentation +#NetHackQtRecover.txt +#NetHack Defaults.txt +#changes.patch XXX is this still needed? why isn't it part of the tree? +# doesn't go here + hdiutil create -verbose -srcfolder NetHackQt NetHack-$(SVS)-macosx-qt.dmg +endif # end of build_qt_pkg +endif # WANT_WIN_QT for packaging +endif # MAKEFILE_TOP From 360ee21861099d7cc973f301e5b69d7838168139 Mon Sep 17 00:00:00 2001 From: Bart House Date: Sun, 18 Nov 2018 11:45:36 -0800 Subject: [PATCH 17/74] Revert "Hint file for macOS X with curses." This reverts commit f7fbbb8cb0e8fcd2912111ef24f216ca9bf5ff3b. --- sys/unix/hints/macosx10.10-curses | 355 ------------------------------ 1 file changed, 355 deletions(-) delete mode 100644 sys/unix/hints/macosx10.10-curses diff --git a/sys/unix/hints/macosx10.10-curses b/sys/unix/hints/macosx10.10-curses deleted file mode 100644 index faa935eed..000000000 --- a/sys/unix/hints/macosx10.10-curses +++ /dev/null @@ -1,355 +0,0 @@ -# -# NetHack 3.6 macosx10.11 $NHDT-Date: 1515549543 2018/01/10 01:59:03 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.48 $ -# Copyright (c) Kenneth Lorber, Kensington, Maryland, 2015. -# NetHack may be freely redistributed. See license for details. -# -#-PRE -# Mac OS X (Darwin) hints file -# This is for Mac OS X 10.10 or later, and has been tested on 10.11 -# (El Capitan). If this doesn't work for some other -# version of Mac OS X, make a new file for that OS, don't change this one. -# And let us know about it. -# Useful info: http://www.opensource.apple.com/darwinsource/index.html - -# You'll need to obtain and install XQuartz if you want X11 support. -# (Attempting to run X11.app will describe where to get it.) - -# This hints file can build several different types of installations. -# Edit the next section to match the type of build you need. - -# 1. Which window system(s) should be included in this binary? -WANT_WIN_TTY=1 -#WANT_WIN_X11=1 -#WANT_WIN_QT=1 -WANT_WIN_CURSES=1 - -# 1a. What is the default window system? -#WANT_DEFAULT=tty -#WANT_DEFAULT=x11 -#WANT_DEFAULT=qt -WANT_DEFAULT=curses - -# 1b. If you set WANT_WIN_QT, you need to -# A) set QTDIR either here or in the environment to point to the Qt2 or Qt3 -# library installation root. (Qt4 will not work; Qt3 does not presently -# compile under Leopard (MacOSX 10.5) out-of-the-box.) -# B) set XPMLIB to point to the Xpm library -ifdef WANT_WIN_QT -QTDIR=/Developer/Qt -LIBXPM= -L/opt/X11/lib -lXpm -endif # WANT_WIN_QT - -# 2. Is this a build for a binary that will be shared among different users -# or will it be private to you? -# If it is shared: -# - it will be owned by the user and group listed -# - if the user does not exist, you MUST create it before installing -# NetHack -# - if the group does not exist, it will be created. -# NB: if the group already exists and is being used for something -# besides games, you probably want to specify a new group instead -# NB: the group will be created locally; if your computer is centrally -# administered this may not be what you (or your admin) want. -# Consider a non-shared install (WANT_SHARE_INSTALL=0) instead. -# - 'make install' must be run as "sudo make install" -#WANT_SHARE_INSTALL=1 -GAMEUID = $(USER) -GAMEGRP = games -# build to run in the source tree - primarily for development. Build with "make all" -#WANT_SOURCE_INSTALL=1 - -CC=gcc - -# At the moment this is just for debugging, but in the future it could be -# useful for other things. Requires SYSCF and an ANSI compiler. -#WANT_WIN_CHAIN=1 - -# -# You shouldn't need to change anything below here. -# - -#CFLAGS+=-W -Wimplicit -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wcast-qual -Wwrite-strings -DGCC_WARN -CFLAGS+=-Wall -Wextra -Wno-missing-field-initializers -Wimplicit -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wwrite-strings -DGCC_WARN -ansi -pedantic -# As of LLVM build 2336.1.00, this gives dozens of spurious messages, so -# leave it out by default. -#CFLAGS+=-Wunreachable-code - -# XXX -g vs -O should go here, -I../include goes in the makefile -CFLAGS+=-g -I../include -# older binaries use NOCLIPPING, but that disables SIGWINCH -#CFLAGS+=-DNOCLIPPING -CFLAGS+= -DNOMAIL -DNOTPARMDECL -DHACKDIR=\"$(HACKDIR)\" -CFLAGS+= -DDEFAULT_WINDOW_SYS=\"$(WANT_DEFAULT)\" -DDLB - -CFLAGS+= -DGREPPATH=\"/usr/bin/grep\" - -ifdef WANT_WIN_CHAIN -CFLAGS+= -DWINCHAIN -HINTSRC=$(CHAINSRC) -HINTOBJ=$(CHAINOBJ) -endif - -ifdef WANT_WIN_TTY -WINSRC = $(WINTTYSRC) -WINOBJ = $(WINTTYOBJ) -WINLIB = $(WINTTYLIB) -WINTTYLIB=-lncurses -else # !WANT_WIN_TTY -CFLAGS += -DNOTTYGRAPHICS -endif # !WANT_WIN_TTY - -ifdef WANT_WIN_CURSES -CFLAGS += -DCURSES_GRAPHICS -WINSRC += $(WINCURSESSRC) -WINOBJ += $(WINCURSESOBJ) -WINLIB += -lncurses -endif - -ifdef WANT_WIN_X11 -WINSRC += $(WINX11SRC) -WINOBJ += $(WINX11OBJ) -WINLIB += $(WINX11LIB) -LFLAGS=-L/opt/X11/lib -VARDATND = x11tiles NetHack.ad pet_mark.xbm pilemark.xbm -POSTINSTALL+= bdftopcf win/X11/nh10.bdf > $(HACKDIR)/nh10.pcf; (cd $(HACKDIR); mkfontdir); -CFLAGS += -DX11_GRAPHICS -I/opt/X11/include -# avoid repeated complaints about _X_NONNULL(args...) in -CFLAGS += -Wno-variadic-macros -endif # WANT_WIN_X11 - -ifdef WANT_WIN_QT -CFLAGS += -DQT_GRAPHICS -DNOUSER_SOUNDS -CFLAGS += -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4 -LINK=g++ -WINSRC += $(WINQTSRC) -WINLIB += $(WINQTLIB) $(LIBXPM) -WINLIB += -framework Carbon -framework QuickTime -lz -framework OpenGL -WINLIB += -framework AGL -ifdef WANT_WIN_X11 - # prevent duplicate tile.o in WINOBJ -WINOBJ = $(sort $(WINQTOBJ) $(WINX11OBJ)) -ifdef WANT_WIN_TTY -WINOBJ += $(WINTTYOBJ) -endif # WANT_WIN_TTY -else # !WANT_WIN_X11 -WINOBJ += $(WINQTOBJ) -endif # !WANT_WIN_X11 - -# XXX if /Developer/qt exists and QTDIR not set, use that -ifndef QTDIR -$(error QTDIR not defined in the environment or Makefile) -endif # QTDIR -# XXX make sure QTDIR points to something reasonable -else # !WANT_WIN_QT -LINK=$(CC) -endif # !WANT_WIN_QT - -ifdef WANT_SHARE_INSTALL -# if $GAMEUID is root, we install into roughly proper Mac locations, otherwise -# we install into ~/nethackdir -ifeq ($(GAMEUID),root) -PREFIX:=/Library/NetHack -SHELLDIR=/usr/local/bin -HACKDIR=$(PREFIX)/nethackdir -CHOWN=chown -CHGRP=chgrp -# We run sgid so the game has access to both HACKDIR and user preferences. -GAMEPERM = 02755 -else # ! root -PREFIX:=/Users/$(GAMEUID) -SHELLDIR=$(PREFIX)/bin -HACKDIR=$(PREFIX)/Library/NetHack/nethackdir -CHOWN=/usr/bin/true -CHGRP=/usr/bin/true -GAMEPERM = 0500 -endif # ! root -VARFILEPERM = 0664 -VARDIRPERM = 0775 -ROOTCHECK= [[ `id -u` == 0 ]] || ( echo "Must run install with sudo."; exit 1) -# XXX it's nice we don't write over sysconf, but we've already erased it -# make sure we have group GAMEUID and group GAMEGRP -PREINSTALL= . sys/unix/hints/macosx.sh user2 $(GAMEUID); . sys/unix/hints/macosx.sh group2 $(GAMEGRP); mkdir $(SHELLDIR); chown $(GAMEUID) $(SHELLDIR) -POSTINSTALL+= sys/unix/hints/macosx.sh editsysconf sys/unix/sysconf $(HACKDIR)/sysconf; $(CHOWN) $(GAMEUID) $(HACKDIR)/sysconf; $(CHGRP) $(GAMEGRP) $(HACKDIR)/sysconf; chmod $(VARFILEPERM) $(HACKDIR)/sysconf; -CFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -DSECURE -else ifdef WANT_SOURCE_INSTALL -PREFIX=$(abspath $(NHSROOT)) -# suppress nethack.sh -#SHELLDIR= -HACKDIR=$(PREFIX)/playground -CHOWN=/usr/bin/true -CHGRP=/usr/bin/true -GAMEPERM = 0700 -VARFILEPERM = 0600 -VARDIRPERM = 0700 -POSTINSTALL+= sys/unix/hints/macosx.sh editsysconf sys/unix/sysconf $(HACKDIR)/sysconf; -# We can use "make all" to build the whole thing - but it misses some things: -MOREALL=$(MAKE) install -CFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -DSECURE -else # !WANT_SOURCE_INSTALL -PREFIX:=$(wildcard ~) -SHELLDIR=$(PREFIX)/bin -HACKDIR=$(PREFIX)/nethackdir -CHOWN=/usr/bin/true -CHGRP=/usr/bin/true -GAMEPERM = 0700 -VARFILEPERM = 0600 -VARDIRPERM = 0700 -ifdef WANT_WIN_X11 -# install nethack.rc as ~/.nethackrc if no ~/.nethackrc exists -PREINSTALL= cp -n win/X11/nethack.rc ~/.nethackrc -endif # WANT_WIN_X11 -POSTINSTALL+= sys/unix/hints/macosx.sh editsysconf sys/unix/sysconf $(HACKDIR)/sysconf; $(CHOWN) $(GAMEUID) $(HACKDIR)/sysconf; $(CHGRP) $(GAMEGRP) $(HACKDIR)/sysconf; chmod $(VARFILEPERM) $(HACKDIR)/sysconf; -CFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -DSECURE -endif # !WANT_SOURCE_INSTALL - -INSTDIR=$(HACKDIR) -VARDIR=$(HACKDIR) - - -# ~/Library/Preferences/NetHack Defaults -# OPTIONS=name:player,number_pad,menustyle:partial,!time,showexp -# OPTIONS=hilite_pet,toptenwin,msghistory:200,windowtype:Qt -# -# Install.Qt mentions a patch for macos - it's not there (it seems to be in the Qt binary -# package under the docs directory). - -#-POST -ifdef MAKEFILE_TOP -### -### Packaging -### -# Notes: -# 1) The Apple developer utilities must be installed in the default location. -# 2) Do a normal build before trying to package the game. -# 3) This matches the 3.4.3 Term package, but there are some things that should -# be changed. - -ifdef WANT_WIN_TTY -DEVUTIL=/Developer/Applications/Utilities -SVS=$(shell $(NHSROOT)/util/makedefs --svs) -SVSDOT=$(shell $(NHSROOT)/util/makedefs --svs .) - -PKGROOT_UG = PKGROOT/$(PREFIX) -PKGROOT_UGLN = PKGROOT/$(HACKDIR) -PKGROOT_BIN = PKGROOT/$(SHELLDIR) -build_tty_pkg: -ifneq (,$(WANT_WIN_X11)$(WANT_WIN_QT)) - -echo build_tty_pkg only works for a tty-only build - exit 1 -else - rm -rf NetHack-$(SVS)-mac-Term.pkg NetHack-$(SVS)-mac-Term.dmg - $(MAKE) build_package_root - rm -rf RESOURCES - mkdir RESOURCES - #enscript --language=rtf -o - < dat/license >RESOURCES/License.rtf - sys/unix/hints/macosx.sh descplist > RESOURCES/Description.plist - sys/unix/hints/macosx.sh infoplist > Info.plist - - mkdir PKGROOT/Applications - #osacompile -o NetHackQt/NetHackQt.app/nethackdir/NetHackRecover.app \ - # win/macosx/NetHackRecover.applescript - #cp win/macosx/recover.pl NetHackQt/NetHackQt.app/nethackdir - osacompile -o PKGROOT/Applications/NetHackRecover.app \ - win/macosx/NetHackRecover.applescript - cp win/macosx/recover.pl $(PKGROOT_UGLN) - - osacompile -o PKGROOT/Applications/NetHackTerm.app \ - win/macosx/NetHackTerm.applescript - - # XXX integrate into Makefile.doc - (cd doc; cat Guidebook.mn | ../util/makedefs --grep --input - --output - \ - | tbl tmac.n - | groff | pstopdf -i -o Guidebook.pdf) - cp doc/Guidebook.pdf $(PKGROOT_UG)/doc/NetHackGuidebook.pdf - - osacompile -o PKGROOT/Applications/NetHackGuidebook.app \ - win/macosx/NetHackGuidebook.applescript - - mkdir -p PKG - pkgbuild --root PKGROOT --identifier org.nethack.term --scripts PKGSCRIPTS PKG/NH-Term.pkg - productbuild --synthesize --product Info.plist --package PKG/NH-Term.pkg Distribution.xml - productbuild --distribution Distribution.xml --resources RESOURCES --package-path PKG NetHack-$(SVS)-mac-Term.pkg - hdiutil create -verbose -srcfolder NetHack-$(SVS)-mac-Term.pkg NetHack-$(SVS)-mac-Term.dmg - -build_package_root: - cd src/.. # make sure we are at TOP - rm -rf PKGROOT - mkdir -p $(PKGROOT_UG)/lib $(PKGROOT_BIN) $(PKGROOT_UG)/man/man6 $(PKGROOT_UG)/doc $(PKGROOT_UGLN) - install -p src/nethack $(PKGROOT_BIN) - # XXX should this be called nethackrecover? - install -p util/recover $(PKGROOT_BIN) - install -p doc/nethack.6 $(PKGROOT_UG)/man/man6 - install -p doc/recover.6 $(PKGROOT_UG)/man/man6 - install -p doc/Guidebook $(PKGROOT_UG)/doc - install -p dat/nhdat $(PKGROOT_UGLN) - sys/unix/hints/macosx.sh editsysconf sys/unix/sysconf $(PKGROOT_UGLN)/sysconf - cd dat; install -p $(DATNODLB) ../$(PKGROOT_UGLN) -# XXX these files should be somewhere else for good Mac form - touch $(PKGROOT_UGLN)/perm $(PKGROOT_UGLN)/record $(PKGROOT_UGLN)/logfile $(PKGROOT_UGLN)/xlogfile - mkdir $(PKGROOT_UGLN)/save -# XXX what about a news file? - - mkdir -p PKGSCRIPTS - echo '#!/bin/sh' > PKGSCRIPTS/postinstall - echo dseditgroup -o create -r '"Games Group"' -s 3600 $(GAMEGRP) >> PKGSCRIPTS/postinstall - echo $(CHOWN) -R $(GAMEUID) $(HACKDIR) >> PKGSCRIPTS/postinstall - echo $(CHGRP) -R $(GAMEGRP) $(HACKDIR) >> PKGSCRIPTS/postinstall - echo $(CHOWN) $(GAMEUID) $(SHELLDIR)/nethack >> PKGSCRIPTS/postinstall - echo $(CHGRP) $(GAMEGRP) $(SHELLDIR)/nethack >> PKGSCRIPTS/postinstall - echo $(CHOWN) $(GAMEUID) $(SHELLDIR)/recover >> PKGSCRIPTS/postinstall - echo $(CHGRP) $(GAMEGRP) $(SHELLDIR)/recover >> PKGSCRIPTS/postinstall - echo chmod $(VARDIRPERM) $(HACKDIR) >> PKGSCRIPTS/postinstall - echo chmod $(VARDIRPERM) $(HACKDIR)/save >> PKGSCRIPTS/postinstall - echo chmod $(FILEPERM) $(HACKDIR)/license >> PKGSCRIPTS/postinstall - echo chmod $(FILEPERM) $(HACKDIR)/nhdat >> PKGSCRIPTS/postinstall - echo chmod $(FILEPERM) $(HACKDIR)/symbols >> PKGSCRIPTS/postinstall - echo chmod $(VARFILEPERM) $(HACKDIR)/perm >> PKGSCRIPTS/postinstall - echo chmod $(VARFILEPERM) $(HACKDIR)/record >> PKGSCRIPTS/postinstall - echo chmod $(VARFILEPERM) $(HACKDIR)/logfile >> PKGSCRIPTS/postinstall - echo chmod $(VARFILEPERM) $(HACKDIR)/xlogfile >> PKGSCRIPTS/postinstall - echo chmod $(VARFILEPERM) $(HACKDIR)/sysconf >> PKGSCRIPTS/postinstall - echo chmod $(GAMEPERM) $(SHELLDIR)/nethack >> PKGSCRIPTS/postinstall - echo chmod $(EXEPERM) $(SHELLDIR)/recover >> PKGSCRIPTS/postinstall - chmod 0775 PKGSCRIPTS/postinstall - -endif # end of build_tty_pkg -endif # WANT_WIN_TTY for packaging - -ifdef WANT_WIN_QT -# XXX untested and incomplete (see below) -build_qt_pkg: -ifneq (,$(WANT_WIN_X11)$(WANT_WIN_TTY)) - -echo build_qt_pkg only works for a qt-only build - exit 1 -else - $(MAKE) build_package_root - rm -rf NetHackQt - mkdir -p NetHackQt/NetHackQt.app/nethackdir/save - mkdir NetHackQt/Documentation - cp doc/Guidebook.txt doc/nethack.txt doc/recover.txt NetHackQt/Documentation - - osacompile -o NetHackQt/NetHackQt.app/nethackdir/NetHackRecover.app \ - win/macosx/NetHackRecover.applescript - cp win/macosx/recover.pl NetHackQt/NetHackQt.app/nethackdir - - mkdir -p NetHackQt/NetHackQt.app/Contents/Frameworks - cp $(QTDIR)/libqt-mt.3.dylib NetHackQt/NetHackQt.app/Contents/Frameworks - - mkdir NetHackQt/NetHackQt.app/Contents/MacOS - mv PKGROOT/nethack NetHackQt/NetHackQt.app/Contents/MacOS - - mv PKGROOT/lib/nethackdir NetHackQt/NetHackQt.app/nethackdir - -# XXX still missing: -#NetHackQt/NetHackQt.app -# /Contents -# Info.plist -# Resources/nethack.icns -#NetHackQt/Documentation -#NetHackQtRecover.txt -#NetHack Defaults.txt -#changes.patch XXX is this still needed? why isn't it part of the tree? -# doesn't go here - hdiutil create -verbose -srcfolder NetHackQt NetHack-$(SVS)-macosx-qt.dmg -endif # end of build_qt_pkg -endif # WANT_WIN_QT for packaging -endif # MAKEFILE_TOP From 7ee4fa3c3ff67fbb99cef0fc905c8561db7e08e1 Mon Sep 17 00:00:00 2001 From: nhmall Date: Mon, 19 Nov 2018 10:40:51 -0500 Subject: [PATCH 18/74] some curses window-port doc bits --- doc/fixes36.2 | 13 ++++++ sys/winnt/Install.nt | 107 ++++++++++++++++++------------------------- 2 files changed, 58 insertions(+), 62 deletions(-) diff --git a/doc/fixes36.2 b/doc/fixes36.2 index f4cfd00a1..a808ba08d 100644 --- a/doc/fixes36.2 +++ b/doc/fixes36.2 @@ -314,6 +314,19 @@ for ^X and enlightenment, display the information in a menu rather than a end of game disclosure of attributes remains single-forward-pass +NetHack Community Patches (or Variation) Included +------------------------------------------------- +curses: the community patch for an optional curses window-port was + incorporated into the NetHack source code tree. The curses + window-port evolved from work originally done by Karl Garrison, + and has been in use in several NetHack variants and on + nethack.alt.org and on www.hardfought.org/nethack/ for a while. + It is available and tested for 3.6.2 for Windows with PDCurses + layered underneath, and for Mac OSX and Unix (using ncurses as + the layer underneath). It may also work for DOS with PDCurses + layered underneath, but that has not been tested. + + Code Cleanup and Reorganization ------------------------------- generated source file monstr.c is no longer used diff --git a/sys/winnt/Install.nt b/sys/winnt/Install.nt index 91446103e..f3fe944fc 100644 --- a/sys/winnt/Install.nt +++ b/sys/winnt/Install.nt @@ -33,6 +33,24 @@ version. You can use one of the following build environments: Earlier versions of MinGW will not allow you to build the Windows Graphical version. +/---------------------------------------------\ +| Directories for a Win32 NetHack build | +\---------------------------------------------/ + + + (NetHack-top) ----------------------(optional-pdcurses-top) + | | + ---------------------------------------------- -------------- + | | | | | | | | | + util dat doc include src sys win pdcurses wincon + | | + ------ -------- + | | | | + share winnt tty win32 + | + vs2017 + + /--------------------------------------------------------\ | Building And Running Using Visual Studio 2017 | \--------------------------------------------------------/ @@ -64,7 +82,7 @@ using a "build.bat" batch file found in the same directory as the solution. Open a developer command prompt for the version of Visual Studio you are using. Change to the directory win\win32\vs2017 and run "build.bat". - + * Optional curses window-port support * Starting with 3.6.2, the community patch for a window-port that uses curses was incorporated into the NetHack source code tree. That window-port, @@ -84,9 +102,12 @@ Place the PDCurses folder alongside the NetHack source repository prior to proceeding with steps 1 through 5 above. -/-----------------------------------\ -| Building Using Make | -\-----------------------------------/ +/-------------------------------------------\ +| Building From the Command Line Using Make | +\-------------------------------------------/ + +-------------------------------------------------------------------------- +-- Beginning of prerequisite step -- The first step in building either version of NetHack via Makefile is to execute sys\winnt\nhsetup.bat to move some files to their required locations. @@ -101,9 +122,8 @@ From a Windows explorer window: If you wish to build from the command line, proceed to "BUILDING FROM THE COMMAND LINE." -/--------------------------------\ -| BUILDING FROM THE COMMAND LINE | -\--------------------------------/ +-- end of prerequisite step -- +-------------------------------------------------------------------------- Two different versions of NetHack will be built for Windows from the command line using the Makefile approach: @@ -175,11 +195,12 @@ Setting Up source tree. cd src -2. Starting with 3.6.2, the community patch for a window-port that uses - curses was incorporated into the NetHack source code tree. That +2. Starting with 3.6.2, the community patch for an optional curses + window-port was incorporated into the NetHack source code tree. That window-port, which evolved from work originally done by Karl Garrison, has been used in several NetHack variants and on nethack.alt.org and - on www.hardfought.org/nethack/. + on www.hardfought.org/nethack/. The optional curses window-port is + available for Windows, Mac OS X, and Unix (and also DOS). If you want to include the optional curses window-port support in your command line Makefile build, you will have to first obtain the @@ -194,48 +215,19 @@ Setting Up location for the top of the PDCurses source tree if it differs from the path shown. -3. Make sure all the NetHack files are in the appropriate directory - structure. You should have a main directory with subdirectories - dat, doc, include, src, sys\share, sys\winnt, util, and binary (The - "binary" directory was created by nhsetup.bat earlier if you - followed the steps appropriately). +3. Make sure all the necessary files are in the appropriate directory + structure. You should have a main NetHack top directory with + subdirectories dat, doc, include, src, sys\share, sys\winnt, + win\tty, util. - For Console NetHack you need win\tty in addition to these; for - Graphical NetHack you need win\win32 in addition to these. + If you are including the optional Curses window port into your + build,then you will need the top of the PDCurses sources in a + folder parallel to the top of the NetHack folder (or you will need + to change the value of the PDCURSES_TOP macro in the Makefile to + specify the appropriate location. - Other subdirectories may also be included in your distribution, but - they are not necessary for building the TTY version for the Win32 - console subsystem. You can delete them to save space. - - Required Directories for a Win32 Console NetHack build: - - top -------------(optional) ---------------- - | | - ------------------------------------------------- pdcurses-top - | | | | | | | | | - util dat doc include src sys win pdcurses wincon - | | - ------ ----- - | | | - share winnt tty - - - Required Directories for a Win32 Graphical NetHack: - - top - | - ------------------------------------------------- - | | | | | | | - util dat doc include src sys win - | | - ------ ----- - | | | - share winnt win32 - - Check the file "Files" in your top level directory for a more - complete listing of what file is in which directory. In order for - the Makefiles to work, all the source files must be in the proper - locations. + (You can check the file "Files" in your top level directory for a + more complete listing of what file is in which directory.) If you downloaded or ftp'd the sources from a UNIX system, the lines will probably end in UNIX-style newlines, instead of the carriage @@ -243,18 +235,6 @@ Setting Up trouble with them, so you may need to convert them. The compiler should not have any problems with them however. -4. Now go to the include subdirectory to check a couple of the header - files there. Things *should* work as they are, but since you have - probably set up your system in some sort of custom configuration it - doesn't hurt to check out the following: - - First check config.h according to the comments to match your system - and desired set of features. Mostly you need to check section 4 and - 5. - - You may include all or as few of the special game features as you - wish (they are located last in the file). - 4. Edit your Makefile if you wish, but it is not required unless you are altering the build options. @@ -319,6 +299,9 @@ Notes: - a 64-bit (x64) .exe file, which should run on any 64-bit Windows O/S. + Note that saved games are NOT compatible between the 32-bit and the + 64-bit versions at this time. + NetHack.exe is the tty version. NetHackW.exe is the graphical version. Play NetHack. From aa48ed18e727f167cb9bdcff7024086ac0e89644 Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 09:22:11 -0800 Subject: [PATCH 19/74] Initial check-in of work in progress xcode build of NetHack. Buyer beware. This is a check-point of the xcode work to allow others to play. --- include/global.h | 6 +- sys/unix/NetHack.xcodeproj/project.pbxproj | 1420 +++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 5 + .../IDEFindNavigatorScopes.plist | 5 + .../UserInterfaceState.xcuserstate | Bin 0 -> 120988 bytes .../WorkspaceSettings.xcsettings | 18 + .../xcshareddata/xcschemes/NetHack.xcscheme | 91 ++ .../xcshareddata/xcschemes/makedefs.xcscheme | 91 ++ .../xcschemes/xcschememanagement.plist | 52 + util/panic.c | 4 +- 12 files changed, 1703 insertions(+), 4 deletions(-) create mode 100644 sys/unix/NetHack.xcodeproj/project.pbxproj create mode 100644 sys/unix/NetHack.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 sys/unix/NetHack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 sys/unix/NetHack.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/IDEFindNavigatorScopes.plist create mode 100644 sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/WorkspaceSettings.xcsettings create mode 100644 sys/unix/NetHack.xcodeproj/xcshareddata/xcschemes/NetHack.xcscheme create mode 100644 sys/unix/NetHack.xcodeproj/xcshareddata/xcschemes/makedefs.xcscheme create mode 100644 sys/unix/NetHack.xcodeproj/xcuserdata/barthouse.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/include/global.h b/include/global.h index 23183005d..bb0a96cd4 100644 --- a/include/global.h +++ b/include/global.h @@ -10,8 +10,10 @@ #define BETA /* development or beta testing [MRS] */ -#define DEBUG - +#ifndef DEBUG /* allow tool chains to define without causing warnings */ +#define DEBUG +#endif +: /* * Files expected to exist in the playground directory. */ diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj new file mode 100644 index 000000000..b5cb9b1d4 --- /dev/null +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -0,0 +1,1420 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 31B8A30C21A20D8B0055BD01 /* makedefs.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A30B21A20D8B0055BD01 /* makedefs.c */; }; + 31B8A30F21A20DC10055BD01 /* objects.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A30D21A20DC10055BD01 /* objects.c */; }; + 31B8A31021A20DC10055BD01 /* monst.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A30E21A20DC10055BD01 /* monst.c */; }; + 31B8A37B21A238060055BD01 /* mkmap.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A31521A238000055BD01 /* mkmap.c */; }; + 31B8A37C21A238060055BD01 /* pager.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A31621A238000055BD01 /* pager.c */; }; + 31B8A37D21A238060055BD01 /* restore.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A31721A238000055BD01 /* restore.c */; }; + 31B8A37E21A238060055BD01 /* steal.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A31821A238000055BD01 /* steal.c */; }; + 31B8A37F21A238060055BD01 /* extralev.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A31921A238000055BD01 /* extralev.c */; }; + 31B8A38021A238060055BD01 /* sit.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A31A21A238000055BD01 /* sit.c */; }; + 31B8A38121A238060055BD01 /* mapglyph.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A31B21A238000055BD01 /* mapglyph.c */; }; + 31B8A38221A238060055BD01 /* teleport.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A31C21A238000055BD01 /* teleport.c */; }; + 31B8A38321A238060055BD01 /* mhitu.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A31D21A238000055BD01 /* mhitu.c */; }; + 31B8A38421A238060055BD01 /* do_name.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A31E21A238000055BD01 /* do_name.c */; }; + 31B8A38521A238060055BD01 /* rnd.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A31F21A238000055BD01 /* rnd.c */; }; + 31B8A38621A238060055BD01 /* mondata.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A32021A238000055BD01 /* mondata.c */; }; + 31B8A38721A238060055BD01 /* o_init.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A32121A238000055BD01 /* o_init.c */; }; + 31B8A38821A238060055BD01 /* shknam.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A32221A238010055BD01 /* shknam.c */; }; + 31B8A38921A238060055BD01 /* mklev.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A32321A238010055BD01 /* mklev.c */; }; + 31B8A38A21A238060055BD01 /* priest.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A32421A238010055BD01 /* priest.c */; }; + 31B8A38B21A238060055BD01 /* topten.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A32521A238010055BD01 /* topten.c */; }; + 31B8A38C21A238060055BD01 /* trap.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A32621A238010055BD01 /* trap.c */; }; + 31B8A38E21A238060055BD01 /* quest.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A32821A238010055BD01 /* quest.c */; }; + 31B8A38F21A238060055BD01 /* spell.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A32921A238010055BD01 /* spell.c */; }; + 31B8A39021A238060055BD01 /* objnam.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A32A21A238010055BD01 /* objnam.c */; }; + 31B8A39121A238060055BD01 /* light.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A32B21A238010055BD01 /* light.c */; }; + 31B8A39221A238060055BD01 /* do_wear.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A32C21A238010055BD01 /* do_wear.c */; }; + 31B8A39321A238060055BD01 /* were.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A32D21A238010055BD01 /* were.c */; }; + 31B8A39421A238060055BD01 /* mcastu.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A32E21A238010055BD01 /* mcastu.c */; }; + 31B8A39521A238060055BD01 /* windows.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A32F21A238010055BD01 /* windows.c */; }; + 31B8A39621A238060055BD01 /* attrib.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A33021A238010055BD01 /* attrib.c */; }; + 31B8A39721A238060055BD01 /* invent.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A33121A238010055BD01 /* invent.c */; }; + 31B8A39821A238060055BD01 /* mail.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A33221A238010055BD01 /* mail.c */; }; + 31B8A39921A238060055BD01 /* dungeon.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A33321A238010055BD01 /* dungeon.c */; }; + 31B8A39A21A238060055BD01 /* questpgr.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A33421A238010055BD01 /* questpgr.c */; }; + 31B8A39B21A238060055BD01 /* dogmove.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A33521A238010055BD01 /* dogmove.c */; }; + 31B8A39C21A238060055BD01 /* drawing.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A33621A238010055BD01 /* drawing.c */; }; + 31B8A39D21A238060055BD01 /* artifact.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A33721A238020055BD01 /* artifact.c */; }; + 31B8A39E21A238060055BD01 /* mthrowu.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A33821A238020055BD01 /* mthrowu.c */; }; + 31B8A39F21A238060055BD01 /* fountain.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A33921A238020055BD01 /* fountain.c */; }; + 31B8A3A021A238060055BD01 /* exper.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A33A21A238020055BD01 /* exper.c */; }; + 31B8A3A121A238060055BD01 /* rip.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A33B21A238020055BD01 /* rip.c */; }; + 31B8A3A221A238060055BD01 /* detect.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A33C21A238020055BD01 /* detect.c */; }; + 31B8A3A321A238060055BD01 /* mhitm.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A33D21A238020055BD01 /* mhitm.c */; }; + 31B8A3A421A238060055BD01 /* vision.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A33E21A238020055BD01 /* vision.c */; }; + 31B8A3A521A238060055BD01 /* ball.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A33F21A238020055BD01 /* ball.c */; }; + 31B8A3A621A238060055BD01 /* makemon.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A34021A238020055BD01 /* makemon.c */; }; + 31B8A3A721A238060055BD01 /* minion.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A34121A238020055BD01 /* minion.c */; }; + 31B8A3A821A238060055BD01 /* weapon.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A34221A238020055BD01 /* weapon.c */; }; + 31B8A3A921A238060055BD01 /* music.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A34321A238020055BD01 /* music.c */; }; + 31B8A3AA21A238060055BD01 /* wizard.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A34421A238020055BD01 /* wizard.c */; }; + 31B8A3AB21A238060055BD01 /* mplayer.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A34521A238020055BD01 /* mplayer.c */; }; + 31B8A3AC21A238060055BD01 /* decl.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A34621A238020055BD01 /* decl.c */; }; + 31B8A3AD21A238060055BD01 /* uhitm.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A34721A238030055BD01 /* uhitm.c */; }; + 31B8A3AE21A238060055BD01 /* worn.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A34821A238030055BD01 /* worn.c */; }; + 31B8A3AF21A238060055BD01 /* lock.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A34921A238030055BD01 /* lock.c */; }; + 31B8A3B021A238060055BD01 /* mkroom.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A34A21A238030055BD01 /* mkroom.c */; }; + 31B8A3B121A238060055BD01 /* pline.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A34B21A238030055BD01 /* pline.c */; }; + 31B8A3B221A238060055BD01 /* pray.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A34C21A238030055BD01 /* pray.c */; }; + 31B8A3B321A238060055BD01 /* track.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A34D21A238030055BD01 /* track.c */; }; + 31B8A3B421A238060055BD01 /* save.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A34E21A238030055BD01 /* save.c */; }; + 31B8A3B521A238060055BD01 /* rect.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A34F21A238030055BD01 /* rect.c */; }; + 31B8A3B621A238060055BD01 /* bones.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A35021A238030055BD01 /* bones.c */; }; + 31B8A3B721A238060055BD01 /* rumors.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A35121A238030055BD01 /* rumors.c */; }; + 31B8A3B821A238060055BD01 /* dokick.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A35221A238030055BD01 /* dokick.c */; }; + 31B8A3B921A238060055BD01 /* zap.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A35321A238030055BD01 /* zap.c */; }; + 31B8A3BA21A238060055BD01 /* mkobj.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A35421A238030055BD01 /* mkobj.c */; }; + 31B8A3BB21A238060055BD01 /* allmain.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A35521A238030055BD01 /* allmain.c */; }; + 31B8A3BC21A238060055BD01 /* eat.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A35621A238030055BD01 /* eat.c */; }; + 31B8A3BD21A238060055BD01 /* files.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A35721A238040055BD01 /* files.c */; }; + 31B8A3BE21A238060055BD01 /* hack.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A35821A238040055BD01 /* hack.c */; }; + 31B8A3BF21A238060055BD01 /* u_init.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A35921A238040055BD01 /* u_init.c */; }; + 31B8A3C021A238060055BD01 /* dig.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A35A21A238040055BD01 /* dig.c */; }; + 31B8A3C121A238060055BD01 /* read.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A35B21A238040055BD01 /* read.c */; }; + 31B8A3C221A238060055BD01 /* role.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A35C21A238040055BD01 /* role.c */; }; + 31B8A3C321A238060055BD01 /* steed.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A35D21A238040055BD01 /* steed.c */; }; + 31B8A3C421A238060055BD01 /* apply.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A35E21A238040055BD01 /* apply.c */; }; + 31B8A3C521A238060055BD01 /* timeout.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A35F21A238040055BD01 /* timeout.c */; }; + 31B8A3C621A238060055BD01 /* dbridge.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36021A238040055BD01 /* dbridge.c */; }; + 31B8A3C721A238060055BD01 /* monmove.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36121A238040055BD01 /* monmove.c */; }; + 31B8A3C821A238060055BD01 /* options.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36221A238040055BD01 /* options.c */; }; + 31B8A3C921A238060055BD01 /* sounds.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36321A238040055BD01 /* sounds.c */; }; + 31B8A3CA21A238060055BD01 /* hacklib.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36421A238040055BD01 /* hacklib.c */; }; + 31B8A3CB21A238060055BD01 /* alloc.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36521A238040055BD01 /* alloc.c */; }; + 31B8A3CC21A238060055BD01 /* pickup.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36621A238040055BD01 /* pickup.c */; }; + 31B8A3CD21A238060055BD01 /* write.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36721A238040055BD01 /* write.c */; }; + 31B8A3CE21A238060055BD01 /* potion.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36821A238050055BD01 /* potion.c */; }; + 31B8A3CF21A238060055BD01 /* sp_lev.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36921A238050055BD01 /* sp_lev.c */; }; + 31B8A3D021A238060055BD01 /* explode.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36A21A238050055BD01 /* explode.c */; }; + 31B8A3D121A238060055BD01 /* do.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36B21A238050055BD01 /* do.c */; }; + 31B8A3D221A238060055BD01 /* engrave.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36C21A238050055BD01 /* engrave.c */; }; + 31B8A3D321A238060055BD01 /* cmd.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36D21A238050055BD01 /* cmd.c */; }; + 31B8A3D421A238060055BD01 /* worm.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36E21A238050055BD01 /* worm.c */; }; + 31B8A3D521A238060055BD01 /* shk.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36F21A238050055BD01 /* shk.c */; }; + 31B8A3D621A238060055BD01 /* region.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A37021A238050055BD01 /* region.c */; }; + 31B8A3D721A238060055BD01 /* muse.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A37121A238050055BD01 /* muse.c */; }; + 31B8A3D821A238060055BD01 /* botl.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A37221A238050055BD01 /* botl.c */; }; + 31B8A3D921A238060055BD01 /* vault.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A37321A238050055BD01 /* vault.c */; }; + 31B8A3DA21A238060055BD01 /* mkmaze.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A37421A238050055BD01 /* mkmaze.c */; }; + 31B8A3DB21A238060055BD01 /* mon.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A37521A238050055BD01 /* mon.c */; }; + 31B8A3DC21A238060055BD01 /* polyself.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A37621A238050055BD01 /* polyself.c */; }; + 31B8A3DD21A238060055BD01 /* dothrow.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A37721A238060055BD01 /* dothrow.c */; }; + 31B8A3DE21A238060055BD01 /* sys.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A37821A238060055BD01 /* sys.c */; }; + 31B8A3DF21A238060055BD01 /* end.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A37921A238060055BD01 /* end.c */; }; + 31B8A3E021A238060055BD01 /* wield.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A37A21A238060055BD01 /* wield.c */; }; + 31B8A3E221A238500055BD01 /* display.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A3E121A2384F0055BD01 /* display.c */; }; + 31B8A3E521A238B30055BD01 /* dlb.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A3E321A238B30055BD01 /* dlb.c */; }; + 31B8A3E621A238B30055BD01 /* dog.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A3E421A238B30055BD01 /* dog.c */; }; + 31B8A3E821A23AB50055BD01 /* vis_tab.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A3E721A23AB50055BD01 /* vis_tab.c */; }; + 31B8A3EC21A23CF20055BD01 /* posixregex.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A3EB21A23CF20055BD01 /* posixregex.c */; }; + 31B8A3EF21A23D420055BD01 /* ioctl.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A3ED21A23D420055BD01 /* ioctl.c */; }; + 31B8A3F021A23D420055BD01 /* unixtty.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A3EE21A23D420055BD01 /* unixtty.c */; }; + 31B8A3F521A23DD10055BD01 /* unixunix.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A3F221A23DD10055BD01 /* unixunix.c */; }; + 31B8A3F621A23DD10055BD01 /* unixmain.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A3F321A23DD10055BD01 /* unixmain.c */; }; + 31B8A3F721A23DD10055BD01 /* unixres.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A3F421A23DD10055BD01 /* unixres.c */; }; + 31B8A3FE21A23E6E0055BD01 /* termcap.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A3FA21A23E6E0055BD01 /* termcap.c */; }; + 31B8A3FF21A23E6E0055BD01 /* topl.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A3FB21A23E6E0055BD01 /* topl.c */; }; + 31B8A40021A23E6E0055BD01 /* getline.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A3FC21A23E6E0055BD01 /* getline.c */; }; + 31B8A40121A23E6E0055BD01 /* wintty.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A3FD21A23E6E0055BD01 /* wintty.c */; }; + 31B8A40B21A23EEC0055BD01 /* cursmisc.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A40321A23EEB0055BD01 /* cursmisc.c */; }; + 31B8A40C21A23EEC0055BD01 /* cursdial.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A40421A23EEB0055BD01 /* cursdial.c */; }; + 31B8A40D21A23EEC0055BD01 /* cursinvt.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A40521A23EEB0055BD01 /* cursinvt.c */; }; + 31B8A40E21A23EEC0055BD01 /* cursinit.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A40621A23EEB0055BD01 /* cursinit.c */; }; + 31B8A40F21A23EEC0055BD01 /* cursmesg.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A40721A23EEB0055BD01 /* cursmesg.c */; }; + 31B8A41021A23EEC0055BD01 /* cursmain.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A40821A23EEB0055BD01 /* cursmain.c */; }; + 31B8A41121A23EEC0055BD01 /* cursstat.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A40921A23EEB0055BD01 /* cursstat.c */; }; + 31B8A41221A23EEC0055BD01 /* curswins.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A40A21A23EEB0055BD01 /* curswins.c */; }; + 31B8A41321A23F650055BD01 /* version.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A32721A238010055BD01 /* version.c */; }; + 31B8A41721A243E80055BD01 /* libncurses.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 31B8A41521A243CC0055BD01 /* libncurses.tbd */; }; + 31B8A41821A2448C0055BD01 /* monst.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A30E21A20DC10055BD01 /* monst.c */; }; + 31B8A41921A244940055BD01 /* objects.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A30D21A20DC10055BD01 /* objects.c */; }; + 31B8A42921A267E60055BD01 /* lev_yacc.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A42521A267E60055BD01 /* lev_yacc.c */; }; + 31B8A42A21A267E60055BD01 /* lev_lex.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A42621A267E60055BD01 /* lev_lex.c */; }; + 31B8A42B21A267E60055BD01 /* panic.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A42721A267E60055BD01 /* panic.c */; }; + 31B8A42C21A267E60055BD01 /* lev_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A42821A267E60055BD01 /* lev_main.c */; }; + 31B8A42D21A267F50055BD01 /* alloc.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36521A238040055BD01 /* alloc.c */; }; + 31B8A42E21A2680B0055BD01 /* drawing.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A33621A238010055BD01 /* drawing.c */; }; + 31B8A42F21A2681E0055BD01 /* decl.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A34621A238020055BD01 /* decl.c */; }; + 31B8A43021A268370055BD01 /* monst.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A30E21A20DC10055BD01 /* monst.c */; }; + 31B8A43121A268420055BD01 /* objects.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A30D21A20DC10055BD01 /* objects.c */; }; + 31B8A44321A269EA0055BD01 /* dgn_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A44221A269EA0055BD01 /* dgn_main.c */; }; + 31B8A44421A26A020055BD01 /* panic.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A42721A267E60055BD01 /* panic.c */; }; + 31B8A44521A26A0A0055BD01 /* alloc.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36521A238040055BD01 /* alloc.c */; }; + 31B8A45221A26A750055BD01 /* recover.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A45121A26A750055BD01 /* recover.c */; }; + 31B8A45E21A26ACF0055BD01 /* dlb.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A3E321A238B30055BD01 /* dlb.c */; }; + 31B8A46021A26AE70055BD01 /* dlb_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A45F21A26AE70055BD01 /* dlb_main.c */; }; + 31B8A46121A26AF60055BD01 /* panic.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A42721A267E60055BD01 /* panic.c */; }; + 31B8A46221A26B020055BD01 /* alloc.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A36521A238040055BD01 /* alloc.c */; }; + 31B8A46621A2820F0055BD01 /* dgn_comp.y in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A46421A278AC0055BD01 /* dgn_comp.y */; }; + 31B8A46921A288770055BD01 /* dgn_comp.l in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A46821A288770055BD01 /* dgn_comp.l */; }; +/* End PBXBuildFile section */ + +/* Begin PBXBuildRule section */ + 31B8A46321A270680055BD01 /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.apple.compilers.proxy.script; + filePatterns = dgn_comp.y; + fileType = sourcecode.yacc; + isEditable = 1; + outputFiles = ( + "$(INPUT_FILE_DIR)/dgn_yacc.c", + "$(INPUT_FILE_DIR)/dgn_comp.h", + ); + script = "cd ${INPUT_FILE_DIR}\nyacc -d dgn_comp.y\nsed -e 's#\"y.tab.c\"#\"dgn_yacc.c\"#' -e 's#y.tab.c:#dgn_yacc.c:#' y.tab.c > dgn_yacc.c && rm y.tab.c\nsed -e 's#\"y.tab.h\"#\"dgn_comp.h\"#' y.tab.h > dgn_comp.h && rm y.tab.h\necho $(FOO)\n"; + }; + 31B8A46721A286E70055BD01 /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.apple.compilers.proxy.script; + fileType = sourcecode.lex; + isEditable = 1; + outputFiles = ( + "$(INPUT_FILE_DIR)/dgn_lex.c", + ); + script = "cd ${INPUT_FILE_DIR}\nlex dgn_comp.l\nsed -e 's#lex.yy.c#dgn_lex.c#' -e 's# *$$##' -e 's#static void yyunput#void yyunput#' lex.yy.c > dgn_lex.c && rm lex.yy.c\n"; + }; +/* End PBXBuildRule section */ + +/* Begin PBXContainerItemProxy section */ + 31B8A31321A2355C0055BD01 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3189576921A1FCC100FB2ABE /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3189577E21A1FDA400FB2ABE; + remoteInfo = makedefs; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 3189576F21A1FCC100FB2ABE /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 3189577D21A1FDA400FB2ABE /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 31B8A41C21A2669A0055BD01 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 31B8A43421A268DF0055BD01 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 31B8A44821A26A4B0055BD01 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 31B8A45521A26A970055BD01 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 3189577121A1FCC100FB2ABE /* NetHack */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = NetHack; sourceTree = BUILT_PRODUCTS_DIR; }; + 3189577F21A1FDA400FB2ABE /* makedefs */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = makedefs; sourceTree = BUILT_PRODUCTS_DIR; }; + 31B8A30A21A20D730055BD01 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = config.h; path = ../../include/config.h; sourceTree = ""; }; + 31B8A30B21A20D8B0055BD01 /* makedefs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = makedefs.c; path = ../../util/makedefs.c; sourceTree = ""; }; + 31B8A30D21A20DC10055BD01 /* objects.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = objects.c; path = ../../src/objects.c; sourceTree = ""; }; + 31B8A30E21A20DC10055BD01 /* monst.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = monst.c; path = ../../src/monst.c; sourceTree = ""; }; + 31B8A31521A238000055BD01 /* mkmap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mkmap.c; path = ../../src/mkmap.c; sourceTree = ""; }; + 31B8A31621A238000055BD01 /* pager.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pager.c; path = ../../src/pager.c; sourceTree = ""; }; + 31B8A31721A238000055BD01 /* restore.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = restore.c; path = ../../src/restore.c; sourceTree = ""; }; + 31B8A31821A238000055BD01 /* steal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = steal.c; path = ../../src/steal.c; sourceTree = ""; }; + 31B8A31921A238000055BD01 /* extralev.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = extralev.c; path = ../../src/extralev.c; sourceTree = ""; }; + 31B8A31A21A238000055BD01 /* sit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sit.c; path = ../../src/sit.c; sourceTree = ""; }; + 31B8A31B21A238000055BD01 /* mapglyph.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mapglyph.c; path = ../../src/mapglyph.c; sourceTree = ""; }; + 31B8A31C21A238000055BD01 /* teleport.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = teleport.c; path = ../../src/teleport.c; sourceTree = ""; }; + 31B8A31D21A238000055BD01 /* mhitu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mhitu.c; path = ../../src/mhitu.c; sourceTree = ""; }; + 31B8A31E21A238000055BD01 /* do_name.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = do_name.c; path = ../../src/do_name.c; sourceTree = ""; }; + 31B8A31F21A238000055BD01 /* rnd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rnd.c; path = ../../src/rnd.c; sourceTree = ""; }; + 31B8A32021A238000055BD01 /* mondata.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mondata.c; path = ../../src/mondata.c; sourceTree = ""; }; + 31B8A32121A238000055BD01 /* o_init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = o_init.c; path = ../../src/o_init.c; sourceTree = ""; }; + 31B8A32221A238010055BD01 /* shknam.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = shknam.c; path = ../../src/shknam.c; sourceTree = ""; }; + 31B8A32321A238010055BD01 /* mklev.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mklev.c; path = ../../src/mklev.c; sourceTree = ""; }; + 31B8A32421A238010055BD01 /* priest.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = priest.c; path = ../../src/priest.c; sourceTree = ""; }; + 31B8A32521A238010055BD01 /* topten.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = topten.c; path = ../../src/topten.c; sourceTree = ""; }; + 31B8A32621A238010055BD01 /* trap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = trap.c; path = ../../src/trap.c; sourceTree = ""; }; + 31B8A32721A238010055BD01 /* version.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = version.c; path = ../../src/version.c; sourceTree = ""; }; + 31B8A32821A238010055BD01 /* quest.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = quest.c; path = ../../src/quest.c; sourceTree = ""; }; + 31B8A32921A238010055BD01 /* spell.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = spell.c; path = ../../src/spell.c; sourceTree = ""; }; + 31B8A32A21A238010055BD01 /* objnam.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = objnam.c; path = ../../src/objnam.c; sourceTree = ""; }; + 31B8A32B21A238010055BD01 /* light.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = light.c; path = ../../src/light.c; sourceTree = ""; }; + 31B8A32C21A238010055BD01 /* do_wear.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = do_wear.c; path = ../../src/do_wear.c; sourceTree = ""; }; + 31B8A32D21A238010055BD01 /* were.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = were.c; path = ../../src/were.c; sourceTree = ""; }; + 31B8A32E21A238010055BD01 /* mcastu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mcastu.c; path = ../../src/mcastu.c; sourceTree = ""; }; + 31B8A32F21A238010055BD01 /* windows.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = windows.c; path = ../../src/windows.c; sourceTree = ""; }; + 31B8A33021A238010055BD01 /* attrib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = attrib.c; path = ../../src/attrib.c; sourceTree = ""; }; + 31B8A33121A238010055BD01 /* invent.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = invent.c; path = ../../src/invent.c; sourceTree = ""; }; + 31B8A33221A238010055BD01 /* mail.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mail.c; path = ../../src/mail.c; sourceTree = ""; }; + 31B8A33321A238010055BD01 /* dungeon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dungeon.c; path = ../../src/dungeon.c; sourceTree = ""; }; + 31B8A33421A238010055BD01 /* questpgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = questpgr.c; path = ../../src/questpgr.c; sourceTree = ""; }; + 31B8A33521A238010055BD01 /* dogmove.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dogmove.c; path = ../../src/dogmove.c; sourceTree = ""; }; + 31B8A33621A238010055BD01 /* drawing.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = drawing.c; path = ../../src/drawing.c; sourceTree = ""; }; + 31B8A33721A238020055BD01 /* artifact.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = artifact.c; path = ../../src/artifact.c; sourceTree = ""; }; + 31B8A33821A238020055BD01 /* mthrowu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mthrowu.c; path = ../../src/mthrowu.c; sourceTree = ""; }; + 31B8A33921A238020055BD01 /* fountain.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = fountain.c; path = ../../src/fountain.c; sourceTree = ""; }; + 31B8A33A21A238020055BD01 /* exper.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = exper.c; path = ../../src/exper.c; sourceTree = ""; }; + 31B8A33B21A238020055BD01 /* rip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rip.c; path = ../../src/rip.c; sourceTree = ""; }; + 31B8A33C21A238020055BD01 /* detect.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = detect.c; path = ../../src/detect.c; sourceTree = ""; }; + 31B8A33D21A238020055BD01 /* mhitm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mhitm.c; path = ../../src/mhitm.c; sourceTree = ""; }; + 31B8A33E21A238020055BD01 /* vision.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vision.c; path = ../../src/vision.c; sourceTree = ""; }; + 31B8A33F21A238020055BD01 /* ball.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ball.c; path = ../../src/ball.c; sourceTree = ""; }; + 31B8A34021A238020055BD01 /* makemon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = makemon.c; path = ../../src/makemon.c; sourceTree = ""; }; + 31B8A34121A238020055BD01 /* minion.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = minion.c; path = ../../src/minion.c; sourceTree = ""; }; + 31B8A34221A238020055BD01 /* weapon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = weapon.c; path = ../../src/weapon.c; sourceTree = ""; }; + 31B8A34321A238020055BD01 /* music.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = music.c; path = ../../src/music.c; sourceTree = ""; }; + 31B8A34421A238020055BD01 /* wizard.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wizard.c; path = ../../src/wizard.c; sourceTree = ""; }; + 31B8A34521A238020055BD01 /* mplayer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mplayer.c; path = ../../src/mplayer.c; sourceTree = ""; }; + 31B8A34621A238020055BD01 /* decl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = decl.c; path = ../../src/decl.c; sourceTree = ""; }; + 31B8A34721A238030055BD01 /* uhitm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = uhitm.c; path = ../../src/uhitm.c; sourceTree = ""; }; + 31B8A34821A238030055BD01 /* worn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = worn.c; path = ../../src/worn.c; sourceTree = ""; }; + 31B8A34921A238030055BD01 /* lock.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lock.c; path = ../../src/lock.c; sourceTree = ""; }; + 31B8A34A21A238030055BD01 /* mkroom.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mkroom.c; path = ../../src/mkroom.c; sourceTree = ""; }; + 31B8A34B21A238030055BD01 /* pline.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pline.c; path = ../../src/pline.c; sourceTree = ""; }; + 31B8A34C21A238030055BD01 /* pray.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pray.c; path = ../../src/pray.c; sourceTree = ""; }; + 31B8A34D21A238030055BD01 /* track.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = track.c; path = ../../src/track.c; sourceTree = ""; }; + 31B8A34E21A238030055BD01 /* save.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = save.c; path = ../../src/save.c; sourceTree = ""; }; + 31B8A34F21A238030055BD01 /* rect.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rect.c; path = ../../src/rect.c; sourceTree = ""; }; + 31B8A35021A238030055BD01 /* bones.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = bones.c; path = ../../src/bones.c; sourceTree = ""; }; + 31B8A35121A238030055BD01 /* rumors.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rumors.c; path = ../../src/rumors.c; sourceTree = ""; }; + 31B8A35221A238030055BD01 /* dokick.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dokick.c; path = ../../src/dokick.c; sourceTree = ""; }; + 31B8A35321A238030055BD01 /* zap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zap.c; path = ../../src/zap.c; sourceTree = ""; }; + 31B8A35421A238030055BD01 /* mkobj.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mkobj.c; path = ../../src/mkobj.c; sourceTree = ""; }; + 31B8A35521A238030055BD01 /* allmain.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = allmain.c; path = ../../src/allmain.c; sourceTree = ""; }; + 31B8A35621A238030055BD01 /* eat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eat.c; path = ../../src/eat.c; sourceTree = ""; }; + 31B8A35721A238040055BD01 /* files.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = files.c; path = ../../src/files.c; sourceTree = ""; }; + 31B8A35821A238040055BD01 /* hack.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hack.c; path = ../../src/hack.c; sourceTree = ""; }; + 31B8A35921A238040055BD01 /* u_init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = u_init.c; path = ../../src/u_init.c; sourceTree = ""; }; + 31B8A35A21A238040055BD01 /* dig.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dig.c; path = ../../src/dig.c; sourceTree = ""; }; + 31B8A35B21A238040055BD01 /* read.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = read.c; path = ../../src/read.c; sourceTree = ""; }; + 31B8A35C21A238040055BD01 /* role.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = role.c; path = ../../src/role.c; sourceTree = ""; }; + 31B8A35D21A238040055BD01 /* steed.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = steed.c; path = ../../src/steed.c; sourceTree = ""; }; + 31B8A35E21A238040055BD01 /* apply.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = apply.c; path = ../../src/apply.c; sourceTree = ""; }; + 31B8A35F21A238040055BD01 /* timeout.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = timeout.c; path = ../../src/timeout.c; sourceTree = ""; }; + 31B8A36021A238040055BD01 /* dbridge.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dbridge.c; path = ../../src/dbridge.c; sourceTree = ""; }; + 31B8A36121A238040055BD01 /* monmove.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = monmove.c; path = ../../src/monmove.c; sourceTree = ""; }; + 31B8A36221A238040055BD01 /* options.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = options.c; path = ../../src/options.c; sourceTree = ""; }; + 31B8A36321A238040055BD01 /* sounds.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sounds.c; path = ../../src/sounds.c; sourceTree = ""; }; + 31B8A36421A238040055BD01 /* hacklib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hacklib.c; path = ../../src/hacklib.c; sourceTree = ""; }; + 31B8A36521A238040055BD01 /* alloc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = alloc.c; path = ../../src/alloc.c; sourceTree = ""; }; + 31B8A36621A238040055BD01 /* pickup.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pickup.c; path = ../../src/pickup.c; sourceTree = ""; }; + 31B8A36721A238040055BD01 /* write.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = write.c; path = ../../src/write.c; sourceTree = ""; }; + 31B8A36821A238050055BD01 /* potion.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = potion.c; path = ../../src/potion.c; sourceTree = ""; }; + 31B8A36921A238050055BD01 /* sp_lev.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sp_lev.c; path = ../../src/sp_lev.c; sourceTree = ""; }; + 31B8A36A21A238050055BD01 /* explode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = explode.c; path = ../../src/explode.c; sourceTree = ""; }; + 31B8A36B21A238050055BD01 /* do.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = do.c; path = ../../src/do.c; sourceTree = ""; }; + 31B8A36C21A238050055BD01 /* engrave.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = engrave.c; path = ../../src/engrave.c; sourceTree = ""; }; + 31B8A36D21A238050055BD01 /* cmd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmd.c; path = ../../src/cmd.c; sourceTree = ""; }; + 31B8A36E21A238050055BD01 /* worm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = worm.c; path = ../../src/worm.c; sourceTree = ""; }; + 31B8A36F21A238050055BD01 /* shk.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = shk.c; path = ../../src/shk.c; sourceTree = ""; }; + 31B8A37021A238050055BD01 /* region.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = region.c; path = ../../src/region.c; sourceTree = ""; }; + 31B8A37121A238050055BD01 /* muse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = muse.c; path = ../../src/muse.c; sourceTree = ""; }; + 31B8A37221A238050055BD01 /* botl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = botl.c; path = ../../src/botl.c; sourceTree = ""; }; + 31B8A37321A238050055BD01 /* vault.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vault.c; path = ../../src/vault.c; sourceTree = ""; }; + 31B8A37421A238050055BD01 /* mkmaze.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mkmaze.c; path = ../../src/mkmaze.c; sourceTree = ""; }; + 31B8A37521A238050055BD01 /* mon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mon.c; path = ../../src/mon.c; sourceTree = ""; }; + 31B8A37621A238050055BD01 /* polyself.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = polyself.c; path = ../../src/polyself.c; sourceTree = ""; }; + 31B8A37721A238060055BD01 /* dothrow.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dothrow.c; path = ../../src/dothrow.c; sourceTree = ""; }; + 31B8A37821A238060055BD01 /* sys.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sys.c; path = ../../src/sys.c; sourceTree = ""; }; + 31B8A37921A238060055BD01 /* end.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = end.c; path = ../../src/end.c; sourceTree = ""; }; + 31B8A37A21A238060055BD01 /* wield.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wield.c; path = ../../src/wield.c; sourceTree = ""; }; + 31B8A3E121A2384F0055BD01 /* display.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = display.c; path = ../../src/display.c; sourceTree = ""; }; + 31B8A3E321A238B30055BD01 /* dlb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dlb.c; path = ../../src/dlb.c; sourceTree = ""; }; + 31B8A3E421A238B30055BD01 /* dog.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dog.c; path = ../../src/dog.c; sourceTree = ""; }; + 31B8A3E721A23AB50055BD01 /* vis_tab.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vis_tab.c; path = ../../src/vis_tab.c; sourceTree = ""; }; + 31B8A3EB21A23CF20055BD01 /* posixregex.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = posixregex.c; path = ../share/posixregex.c; sourceTree = ""; }; + 31B8A3ED21A23D420055BD01 /* ioctl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ioctl.c; path = ../share/ioctl.c; sourceTree = ""; }; + 31B8A3EE21A23D420055BD01 /* unixtty.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = unixtty.c; path = ../share/unixtty.c; sourceTree = ""; }; + 31B8A3F221A23DD10055BD01 /* unixunix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = unixunix.c; sourceTree = ""; }; + 31B8A3F321A23DD10055BD01 /* unixmain.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = unixmain.c; sourceTree = ""; }; + 31B8A3F421A23DD10055BD01 /* unixres.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = unixres.c; sourceTree = ""; }; + 31B8A3FA21A23E6E0055BD01 /* termcap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = termcap.c; path = ../../win/tty/termcap.c; sourceTree = ""; }; + 31B8A3FB21A23E6E0055BD01 /* topl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = topl.c; path = ../../win/tty/topl.c; sourceTree = ""; }; + 31B8A3FC21A23E6E0055BD01 /* getline.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = getline.c; path = ../../win/tty/getline.c; sourceTree = ""; }; + 31B8A3FD21A23E6E0055BD01 /* wintty.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wintty.c; path = ../../win/tty/wintty.c; sourceTree = ""; }; + 31B8A40321A23EEB0055BD01 /* cursmisc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cursmisc.c; path = ../../win/curses/cursmisc.c; sourceTree = ""; }; + 31B8A40421A23EEB0055BD01 /* cursdial.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cursdial.c; path = ../../win/curses/cursdial.c; sourceTree = ""; }; + 31B8A40521A23EEB0055BD01 /* cursinvt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cursinvt.c; path = ../../win/curses/cursinvt.c; sourceTree = ""; }; + 31B8A40621A23EEB0055BD01 /* cursinit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cursinit.c; path = ../../win/curses/cursinit.c; sourceTree = ""; }; + 31B8A40721A23EEB0055BD01 /* cursmesg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cursmesg.c; path = ../../win/curses/cursmesg.c; sourceTree = ""; }; + 31B8A40821A23EEB0055BD01 /* cursmain.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cursmain.c; path = ../../win/curses/cursmain.c; sourceTree = ""; }; + 31B8A40921A23EEB0055BD01 /* cursstat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cursstat.c; path = ../../win/curses/cursstat.c; sourceTree = ""; }; + 31B8A40A21A23EEB0055BD01 /* curswins.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = curswins.c; path = ../../win/curses/curswins.c; sourceTree = ""; }; + 31B8A41521A243CC0055BD01 /* libncurses.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libncurses.tbd; path = usr/lib/libncurses.tbd; sourceTree = SDKROOT; }; + 31B8A41E21A2669A0055BD01 /* lev_comp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lev_comp; sourceTree = BUILT_PRODUCTS_DIR; }; + 31B8A42521A267E60055BD01 /* lev_yacc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lev_yacc.c; path = ../../util/lev_yacc.c; sourceTree = ""; }; + 31B8A42621A267E60055BD01 /* lev_lex.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lev_lex.c; path = ../../util/lev_lex.c; sourceTree = ""; }; + 31B8A42721A267E60055BD01 /* panic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = panic.c; path = ../../util/panic.c; sourceTree = ""; }; + 31B8A42821A267E60055BD01 /* lev_main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lev_main.c; path = ../../util/lev_main.c; sourceTree = ""; }; + 31B8A43621A268DF0055BD01 /* dgn_comp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dgn_comp; sourceTree = BUILT_PRODUCTS_DIR; }; + 31B8A43D21A2699B0055BD01 /* dgn_yacc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dgn_yacc.c; path = ../../util/dgn_yacc.c; sourceTree = ""; }; + 31B8A44021A269C80055BD01 /* dgn_lex.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dgn_lex.c; path = ../../util/dgn_lex.c; sourceTree = ""; }; + 31B8A44221A269EA0055BD01 /* dgn_main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dgn_main.c; path = ../../util/dgn_main.c; sourceTree = ""; }; + 31B8A44A21A26A4B0055BD01 /* recover */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = recover; sourceTree = BUILT_PRODUCTS_DIR; }; + 31B8A45121A26A750055BD01 /* recover.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = recover.c; path = ../../util/recover.c; sourceTree = ""; }; + 31B8A45721A26A970055BD01 /* dlb */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dlb; sourceTree = BUILT_PRODUCTS_DIR; }; + 31B8A45F21A26AE70055BD01 /* dlb_main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dlb_main.c; path = ../../util/dlb_main.c; sourceTree = ""; }; + 31B8A46421A278AC0055BD01 /* dgn_comp.y */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.yacc; name = dgn_comp.y; path = ../../util/dgn_comp.y; sourceTree = ""; }; + 31B8A46821A288770055BD01 /* dgn_comp.l */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.lex; name = dgn_comp.l; path = ../../util/dgn_comp.l; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 3189576E21A1FCC100FB2ABE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 31B8A41721A243E80055BD01 /* libncurses.tbd in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3189577C21A1FDA400FB2ABE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 31B8A41B21A2669A0055BD01 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 31B8A43321A268DF0055BD01 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 31B8A44721A26A4B0055BD01 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 31B8A45421A26A970055BD01 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 3189576821A1FCC100FB2ABE = { + isa = PBXGroup; + children = ( + 31B8A3F821A23E490055BD01 /* win */, + 31B8A3E921A23CC40055BD01 /* sys */, + 3189579621A2046700FB2ABE /* include */, + 3189579321A200EC00FB2ABE /* util */, + 3189578C21A1FF8200FB2ABE /* src */, + 3189577221A1FCC100FB2ABE /* Products */, + 31B8A41421A243CB0055BD01 /* Frameworks */, + ); + sourceTree = ""; + }; + 3189577221A1FCC100FB2ABE /* Products */ = { + isa = PBXGroup; + children = ( + 3189577121A1FCC100FB2ABE /* NetHack */, + 3189577F21A1FDA400FB2ABE /* makedefs */, + 31B8A41E21A2669A0055BD01 /* lev_comp */, + 31B8A43621A268DF0055BD01 /* dgn_comp */, + 31B8A44A21A26A4B0055BD01 /* recover */, + 31B8A45721A26A970055BD01 /* dlb */, + ); + name = Products; + sourceTree = ""; + }; + 3189578C21A1FF8200FB2ABE /* src */ = { + isa = PBXGroup; + children = ( + 31B8A35521A238030055BD01 /* allmain.c */, + 31B8A36521A238040055BD01 /* alloc.c */, + 31B8A35E21A238040055BD01 /* apply.c */, + 31B8A33721A238020055BD01 /* artifact.c */, + 31B8A33021A238010055BD01 /* attrib.c */, + 31B8A33F21A238020055BD01 /* ball.c */, + 31B8A35021A238030055BD01 /* bones.c */, + 31B8A37221A238050055BD01 /* botl.c */, + 31B8A36D21A238050055BD01 /* cmd.c */, + 31B8A36021A238040055BD01 /* dbridge.c */, + 31B8A34621A238020055BD01 /* decl.c */, + 31B8A33C21A238020055BD01 /* detect.c */, + 31B8A35A21A238040055BD01 /* dig.c */, + 31B8A3E121A2384F0055BD01 /* display.c */, + 31B8A3E321A238B30055BD01 /* dlb.c */, + 31B8A31E21A238000055BD01 /* do_name.c */, + 31B8A32C21A238010055BD01 /* do_wear.c */, + 31B8A36B21A238050055BD01 /* do.c */, + 31B8A3E421A238B30055BD01 /* dog.c */, + 31B8A33521A238010055BD01 /* dogmove.c */, + 31B8A35221A238030055BD01 /* dokick.c */, + 31B8A37721A238060055BD01 /* dothrow.c */, + 31B8A33621A238010055BD01 /* drawing.c */, + 31B8A33321A238010055BD01 /* dungeon.c */, + 31B8A35621A238030055BD01 /* eat.c */, + 31B8A37921A238060055BD01 /* end.c */, + 31B8A36C21A238050055BD01 /* engrave.c */, + 31B8A33A21A238020055BD01 /* exper.c */, + 31B8A36A21A238050055BD01 /* explode.c */, + 31B8A31921A238000055BD01 /* extralev.c */, + 31B8A35721A238040055BD01 /* files.c */, + 31B8A33921A238020055BD01 /* fountain.c */, + 31B8A35821A238040055BD01 /* hack.c */, + 31B8A36421A238040055BD01 /* hacklib.c */, + 31B8A33121A238010055BD01 /* invent.c */, + 31B8A32B21A238010055BD01 /* light.c */, + 31B8A34921A238030055BD01 /* lock.c */, + 31B8A33221A238010055BD01 /* mail.c */, + 31B8A34021A238020055BD01 /* makemon.c */, + 31B8A31B21A238000055BD01 /* mapglyph.c */, + 31B8A32E21A238010055BD01 /* mcastu.c */, + 31B8A33D21A238020055BD01 /* mhitm.c */, + 31B8A31D21A238000055BD01 /* mhitu.c */, + 31B8A34121A238020055BD01 /* minion.c */, + 31B8A32321A238010055BD01 /* mklev.c */, + 31B8A31521A238000055BD01 /* mkmap.c */, + 31B8A37421A238050055BD01 /* mkmaze.c */, + 31B8A35421A238030055BD01 /* mkobj.c */, + 31B8A34A21A238030055BD01 /* mkroom.c */, + 31B8A37521A238050055BD01 /* mon.c */, + 31B8A32021A238000055BD01 /* mondata.c */, + 31B8A36121A238040055BD01 /* monmove.c */, + 31B8A30E21A20DC10055BD01 /* monst.c */, + 31B8A34521A238020055BD01 /* mplayer.c */, + 31B8A33821A238020055BD01 /* mthrowu.c */, + 31B8A37121A238050055BD01 /* muse.c */, + 31B8A34321A238020055BD01 /* music.c */, + 31B8A32121A238000055BD01 /* o_init.c */, + 31B8A30D21A20DC10055BD01 /* objects.c */, + 31B8A32A21A238010055BD01 /* objnam.c */, + 31B8A36221A238040055BD01 /* options.c */, + 31B8A31621A238000055BD01 /* pager.c */, + 31B8A36621A238040055BD01 /* pickup.c */, + 31B8A34B21A238030055BD01 /* pline.c */, + 31B8A37621A238050055BD01 /* polyself.c */, + 31B8A36821A238050055BD01 /* potion.c */, + 31B8A34C21A238030055BD01 /* pray.c */, + 31B8A32421A238010055BD01 /* priest.c */, + 31B8A32821A238010055BD01 /* quest.c */, + 31B8A33421A238010055BD01 /* questpgr.c */, + 31B8A35B21A238040055BD01 /* read.c */, + 31B8A34F21A238030055BD01 /* rect.c */, + 31B8A37021A238050055BD01 /* region.c */, + 31B8A31721A238000055BD01 /* restore.c */, + 31B8A33B21A238020055BD01 /* rip.c */, + 31B8A31F21A238000055BD01 /* rnd.c */, + 31B8A35C21A238040055BD01 /* role.c */, + 31B8A35121A238030055BD01 /* rumors.c */, + 31B8A34E21A238030055BD01 /* save.c */, + 31B8A36F21A238050055BD01 /* shk.c */, + 31B8A32221A238010055BD01 /* shknam.c */, + 31B8A31A21A238000055BD01 /* sit.c */, + 31B8A36321A238040055BD01 /* sounds.c */, + 31B8A36921A238050055BD01 /* sp_lev.c */, + 31B8A32921A238010055BD01 /* spell.c */, + 31B8A31821A238000055BD01 /* steal.c */, + 31B8A35D21A238040055BD01 /* steed.c */, + 31B8A37821A238060055BD01 /* sys.c */, + 31B8A31C21A238000055BD01 /* teleport.c */, + 31B8A35F21A238040055BD01 /* timeout.c */, + 31B8A32521A238010055BD01 /* topten.c */, + 31B8A34D21A238030055BD01 /* track.c */, + 31B8A32621A238010055BD01 /* trap.c */, + 31B8A35921A238040055BD01 /* u_init.c */, + 31B8A34721A238030055BD01 /* uhitm.c */, + 31B8A37321A238050055BD01 /* vault.c */, + 31B8A32721A238010055BD01 /* version.c */, + 31B8A3E721A23AB50055BD01 /* vis_tab.c */, + 31B8A33E21A238020055BD01 /* vision.c */, + 31B8A34221A238020055BD01 /* weapon.c */, + 31B8A32D21A238010055BD01 /* were.c */, + 31B8A37A21A238060055BD01 /* wield.c */, + 31B8A32F21A238010055BD01 /* windows.c */, + 31B8A34421A238020055BD01 /* wizard.c */, + 31B8A36E21A238050055BD01 /* worm.c */, + 31B8A34821A238030055BD01 /* worn.c */, + 31B8A36721A238040055BD01 /* write.c */, + 31B8A35321A238030055BD01 /* zap.c */, + ); + name = src; + sourceTree = ""; + }; + 3189579321A200EC00FB2ABE /* util */ = { + isa = PBXGroup; + children = ( + 31B8A46421A278AC0055BD01 /* dgn_comp.y */, + 31B8A45F21A26AE70055BD01 /* dlb_main.c */, + 31B8A45121A26A750055BD01 /* recover.c */, + 31B8A44221A269EA0055BD01 /* dgn_main.c */, + 31B8A44021A269C80055BD01 /* dgn_lex.c */, + 31B8A46821A288770055BD01 /* dgn_comp.l */, + 31B8A43D21A2699B0055BD01 /* dgn_yacc.c */, + 31B8A42621A267E60055BD01 /* lev_lex.c */, + 31B8A42821A267E60055BD01 /* lev_main.c */, + 31B8A42521A267E60055BD01 /* lev_yacc.c */, + 31B8A42721A267E60055BD01 /* panic.c */, + 31B8A30B21A20D8B0055BD01 /* makedefs.c */, + ); + name = util; + sourceTree = ""; + }; + 3189579621A2046700FB2ABE /* include */ = { + isa = PBXGroup; + children = ( + 31B8A30A21A20D730055BD01 /* config.h */, + ); + name = include; + sourceTree = ""; + }; + 31B8A3E921A23CC40055BD01 /* sys */ = { + isa = PBXGroup; + children = ( + 31B8A3F121A23D4B0055BD01 /* unix */, + 31B8A3EA21A23CDB0055BD01 /* share */, + ); + name = sys; + sourceTree = ""; + }; + 31B8A3EA21A23CDB0055BD01 /* share */ = { + isa = PBXGroup; + children = ( + 31B8A3ED21A23D420055BD01 /* ioctl.c */, + 31B8A3EE21A23D420055BD01 /* unixtty.c */, + 31B8A3EB21A23CF20055BD01 /* posixregex.c */, + ); + name = share; + sourceTree = ""; + }; + 31B8A3F121A23D4B0055BD01 /* unix */ = { + isa = PBXGroup; + children = ( + 31B8A3F321A23DD10055BD01 /* unixmain.c */, + 31B8A3F421A23DD10055BD01 /* unixres.c */, + 31B8A3F221A23DD10055BD01 /* unixunix.c */, + ); + name = unix; + sourceTree = ""; + }; + 31B8A3F821A23E490055BD01 /* win */ = { + isa = PBXGroup; + children = ( + 31B8A40221A23EAA0055BD01 /* curses */, + 31B8A3F921A23E4F0055BD01 /* tty */, + ); + name = win; + sourceTree = ""; + }; + 31B8A3F921A23E4F0055BD01 /* tty */ = { + isa = PBXGroup; + children = ( + 31B8A3FC21A23E6E0055BD01 /* getline.c */, + 31B8A3FA21A23E6E0055BD01 /* termcap.c */, + 31B8A3FB21A23E6E0055BD01 /* topl.c */, + 31B8A3FD21A23E6E0055BD01 /* wintty.c */, + ); + name = tty; + sourceTree = ""; + }; + 31B8A40221A23EAA0055BD01 /* curses */ = { + isa = PBXGroup; + children = ( + 31B8A40421A23EEB0055BD01 /* cursdial.c */, + 31B8A40621A23EEB0055BD01 /* cursinit.c */, + 31B8A40521A23EEB0055BD01 /* cursinvt.c */, + 31B8A40821A23EEB0055BD01 /* cursmain.c */, + 31B8A40721A23EEB0055BD01 /* cursmesg.c */, + 31B8A40321A23EEB0055BD01 /* cursmisc.c */, + 31B8A40921A23EEB0055BD01 /* cursstat.c */, + 31B8A40A21A23EEB0055BD01 /* curswins.c */, + ); + name = curses; + sourceTree = ""; + }; + 31B8A41421A243CB0055BD01 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 31B8A41521A243CC0055BD01 /* libncurses.tbd */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 3189577021A1FCC100FB2ABE /* NetHack */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3189577821A1FCC100FB2ABE /* Build configuration list for PBXNativeTarget "NetHack" */; + buildPhases = ( + 3189576D21A1FCC100FB2ABE /* Sources */, + 3189576E21A1FCC100FB2ABE /* Frameworks */, + 3189576F21A1FCC100FB2ABE /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 31B8A31421A2355C0055BD01 /* PBXTargetDependency */, + ); + name = NetHack; + productName = NetHack; + productReference = 3189577121A1FCC100FB2ABE /* NetHack */; + productType = "com.apple.product-type.tool"; + }; + 3189577E21A1FDA400FB2ABE /* makedefs */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3189578321A1FDA400FB2ABE /* Build configuration list for PBXNativeTarget "makedefs" */; + buildPhases = ( + 3189577B21A1FDA400FB2ABE /* Sources */, + 3189577C21A1FDA400FB2ABE /* Frameworks */, + 3189577D21A1FDA400FB2ABE /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = makedefs; + productName = makedefs; + productReference = 3189577F21A1FDA400FB2ABE /* makedefs */; + productType = "com.apple.product-type.tool"; + }; + 31B8A41D21A2669A0055BD01 /* lev_comp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 31B8A42221A2669A0055BD01 /* Build configuration list for PBXNativeTarget "lev_comp" */; + buildPhases = ( + 31B8A41A21A2669A0055BD01 /* Sources */, + 31B8A41B21A2669A0055BD01 /* Frameworks */, + 31B8A41C21A2669A0055BD01 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = lev_comp; + productName = lev_comp; + productReference = 31B8A41E21A2669A0055BD01 /* lev_comp */; + productType = "com.apple.product-type.tool"; + }; + 31B8A43521A268DF0055BD01 /* dgn_comp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 31B8A43A21A268E00055BD01 /* Build configuration list for PBXNativeTarget "dgn_comp" */; + buildPhases = ( + 31B8A43221A268DF0055BD01 /* Sources */, + 31B8A43321A268DF0055BD01 /* Frameworks */, + 31B8A43421A268DF0055BD01 /* CopyFiles */, + ); + buildRules = ( + 31B8A46721A286E70055BD01 /* PBXBuildRule */, + 31B8A46321A270680055BD01 /* PBXBuildRule */, + ); + dependencies = ( + ); + name = dgn_comp; + productName = dgn_comp; + productReference = 31B8A43621A268DF0055BD01 /* dgn_comp */; + productType = "com.apple.product-type.tool"; + }; + 31B8A44921A26A4B0055BD01 /* recover */ = { + isa = PBXNativeTarget; + buildConfigurationList = 31B8A44E21A26A4B0055BD01 /* Build configuration list for PBXNativeTarget "recover" */; + buildPhases = ( + 31B8A44621A26A4B0055BD01 /* Sources */, + 31B8A44721A26A4B0055BD01 /* Frameworks */, + 31B8A44821A26A4B0055BD01 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = recover; + productName = recover; + productReference = 31B8A44A21A26A4B0055BD01 /* recover */; + productType = "com.apple.product-type.tool"; + }; + 31B8A45621A26A970055BD01 /* dlb */ = { + isa = PBXNativeTarget; + buildConfigurationList = 31B8A45B21A26A970055BD01 /* Build configuration list for PBXNativeTarget "dlb" */; + buildPhases = ( + 31B8A45321A26A970055BD01 /* Sources */, + 31B8A45421A26A970055BD01 /* Frameworks */, + 31B8A45521A26A970055BD01 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = dlb; + productName = dlb; + productReference = 31B8A45721A26A970055BD01 /* dlb */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 3189576921A1FCC100FB2ABE /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = "Bart House"; + TargetAttributes = { + 3189577021A1FCC100FB2ABE = { + CreatedOnToolsVersion = 10.1; + }; + 3189577E21A1FDA400FB2ABE = { + CreatedOnToolsVersion = 10.1; + }; + 31B8A41D21A2669A0055BD01 = { + CreatedOnToolsVersion = 10.1; + }; + 31B8A43521A268DF0055BD01 = { + CreatedOnToolsVersion = 10.1; + }; + 31B8A44921A26A4B0055BD01 = { + CreatedOnToolsVersion = 10.1; + }; + 31B8A45621A26A970055BD01 = { + CreatedOnToolsVersion = 10.1; + }; + }; + }; + buildConfigurationList = 3189576C21A1FCC100FB2ABE /* Build configuration list for PBXProject "NetHack" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 3189576821A1FCC100FB2ABE; + productRefGroup = 3189577221A1FCC100FB2ABE /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 3189577021A1FCC100FB2ABE /* NetHack */, + 3189577E21A1FDA400FB2ABE /* makedefs */, + 31B8A41D21A2669A0055BD01 /* lev_comp */, + 31B8A43521A268DF0055BD01 /* dgn_comp */, + 31B8A44921A26A4B0055BD01 /* recover */, + 31B8A45621A26A970055BD01 /* dlb */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 3189576D21A1FCC100FB2ABE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 31B8A3BC21A238060055BD01 /* eat.c in Sources */, + 31B8A3A921A238060055BD01 /* music.c in Sources */, + 31B8A3D221A238060055BD01 /* engrave.c in Sources */, + 31B8A3A021A238060055BD01 /* exper.c in Sources */, + 31B8A38A21A238060055BD01 /* priest.c in Sources */, + 31B8A3A221A238060055BD01 /* detect.c in Sources */, + 31B8A3B421A238060055BD01 /* save.c in Sources */, + 31B8A3A421A238060055BD01 /* vision.c in Sources */, + 31B8A3C621A238060055BD01 /* dbridge.c in Sources */, + 31B8A38521A238060055BD01 /* rnd.c in Sources */, + 31B8A38B21A238060055BD01 /* topten.c in Sources */, + 31B8A38121A238060055BD01 /* mapglyph.c in Sources */, + 31B8A41321A23F650055BD01 /* version.c in Sources */, + 31B8A3BB21A238060055BD01 /* allmain.c in Sources */, + 31B8A39521A238060055BD01 /* windows.c in Sources */, + 31B8A38621A238060055BD01 /* mondata.c in Sources */, + 31B8A41921A244940055BD01 /* objects.c in Sources */, + 31B8A3AA21A238060055BD01 /* wizard.c in Sources */, + 31B8A3D021A238060055BD01 /* explode.c in Sources */, + 31B8A3DE21A238060055BD01 /* sys.c in Sources */, + 31B8A38021A238060055BD01 /* sit.c in Sources */, + 31B8A3AF21A238060055BD01 /* lock.c in Sources */, + 31B8A38C21A238060055BD01 /* trap.c in Sources */, + 31B8A3AE21A238060055BD01 /* worn.c in Sources */, + 31B8A3B821A238060055BD01 /* dokick.c in Sources */, + 31B8A38221A238060055BD01 /* teleport.c in Sources */, + 31B8A37B21A238060055BD01 /* mkmap.c in Sources */, + 31B8A3AC21A238060055BD01 /* decl.c in Sources */, + 31B8A3BE21A238060055BD01 /* hack.c in Sources */, + 31B8A3EC21A23CF20055BD01 /* posixregex.c in Sources */, + 31B8A3C321A238060055BD01 /* steed.c in Sources */, + 31B8A39D21A238060055BD01 /* artifact.c in Sources */, + 31B8A3FF21A23E6E0055BD01 /* topl.c in Sources */, + 31B8A3C021A238060055BD01 /* dig.c in Sources */, + 31B8A3CB21A238060055BD01 /* alloc.c in Sources */, + 31B8A39821A238060055BD01 /* mail.c in Sources */, + 31B8A3C821A238060055BD01 /* options.c in Sources */, + 31B8A3CD21A238060055BD01 /* write.c in Sources */, + 31B8A40F21A23EEC0055BD01 /* cursmesg.c in Sources */, + 31B8A3DF21A238060055BD01 /* end.c in Sources */, + 31B8A38921A238060055BD01 /* mklev.c in Sources */, + 31B8A3D721A238060055BD01 /* muse.c in Sources */, + 31B8A40121A23E6E0055BD01 /* wintty.c in Sources */, + 31B8A3FE21A23E6E0055BD01 /* termcap.c in Sources */, + 31B8A39621A238060055BD01 /* attrib.c in Sources */, + 31B8A40C21A23EEC0055BD01 /* cursdial.c in Sources */, + 31B8A3A321A238060055BD01 /* mhitm.c in Sources */, + 31B8A3DC21A238060055BD01 /* polyself.c in Sources */, + 31B8A3A621A238060055BD01 /* makemon.c in Sources */, + 31B8A3B721A238060055BD01 /* rumors.c in Sources */, + 31B8A39921A238060055BD01 /* dungeon.c in Sources */, + 31B8A3D121A238060055BD01 /* do.c in Sources */, + 31B8A39021A238060055BD01 /* objnam.c in Sources */, + 31B8A3B621A238060055BD01 /* bones.c in Sources */, + 31B8A3C521A238060055BD01 /* timeout.c in Sources */, + 31B8A3AD21A238060055BD01 /* uhitm.c in Sources */, + 31B8A3B321A238060055BD01 /* track.c in Sources */, + 31B8A41221A23EEC0055BD01 /* curswins.c in Sources */, + 31B8A3A721A238060055BD01 /* minion.c in Sources */, + 31B8A3F021A23D420055BD01 /* unixtty.c in Sources */, + 31B8A37F21A238060055BD01 /* extralev.c in Sources */, + 31B8A39B21A238060055BD01 /* dogmove.c in Sources */, + 31B8A3C121A238060055BD01 /* read.c in Sources */, + 31B8A3D521A238060055BD01 /* shk.c in Sources */, + 31B8A3E221A238500055BD01 /* display.c in Sources */, + 31B8A3DD21A238060055BD01 /* dothrow.c in Sources */, + 31B8A39421A238060055BD01 /* mcastu.c in Sources */, + 31B8A3C221A238060055BD01 /* role.c in Sources */, + 31B8A3E821A23AB50055BD01 /* vis_tab.c in Sources */, + 31B8A38821A238060055BD01 /* shknam.c in Sources */, + 31B8A3A521A238060055BD01 /* ball.c in Sources */, + 31B8A39E21A238060055BD01 /* mthrowu.c in Sources */, + 31B8A3C721A238060055BD01 /* monmove.c in Sources */, + 31B8A3BF21A238060055BD01 /* u_init.c in Sources */, + 31B8A3D921A238060055BD01 /* vault.c in Sources */, + 31B8A38F21A238060055BD01 /* spell.c in Sources */, + 31B8A3B221A238060055BD01 /* pray.c in Sources */, + 31B8A3A821A238060055BD01 /* weapon.c in Sources */, + 31B8A3DA21A238060055BD01 /* mkmaze.c in Sources */, + 31B8A37E21A238060055BD01 /* steal.c in Sources */, + 31B8A3BA21A238060055BD01 /* mkobj.c in Sources */, + 31B8A41121A23EEC0055BD01 /* cursstat.c in Sources */, + 31B8A3E021A238060055BD01 /* wield.c in Sources */, + 31B8A41821A2448C0055BD01 /* monst.c in Sources */, + 31B8A3CA21A238060055BD01 /* hacklib.c in Sources */, + 31B8A3A121A238060055BD01 /* rip.c in Sources */, + 31B8A39321A238060055BD01 /* were.c in Sources */, + 31B8A3EF21A23D420055BD01 /* ioctl.c in Sources */, + 31B8A38321A238060055BD01 /* mhitu.c in Sources */, + 31B8A3B021A238060055BD01 /* mkroom.c in Sources */, + 31B8A3B121A238060055BD01 /* pline.c in Sources */, + 31B8A39A21A238060055BD01 /* questpgr.c in Sources */, + 31B8A3E621A238B30055BD01 /* dog.c in Sources */, + 31B8A40D21A23EEC0055BD01 /* cursinvt.c in Sources */, + 31B8A38721A238060055BD01 /* o_init.c in Sources */, + 31B8A40E21A23EEC0055BD01 /* cursinit.c in Sources */, + 31B8A3F521A23DD10055BD01 /* unixunix.c in Sources */, + 31B8A3CE21A238060055BD01 /* potion.c in Sources */, + 31B8A3F621A23DD10055BD01 /* unixmain.c in Sources */, + 31B8A3D821A238060055BD01 /* botl.c in Sources */, + 31B8A39121A238060055BD01 /* light.c in Sources */, + 31B8A3DB21A238060055BD01 /* mon.c in Sources */, + 31B8A3B921A238060055BD01 /* zap.c in Sources */, + 31B8A38421A238060055BD01 /* do_name.c in Sources */, + 31B8A3C421A238060055BD01 /* apply.c in Sources */, + 31B8A3F721A23DD10055BD01 /* unixres.c in Sources */, + 31B8A3BD21A238060055BD01 /* files.c in Sources */, + 31B8A39221A238060055BD01 /* do_wear.c in Sources */, + 31B8A3E521A238B30055BD01 /* dlb.c in Sources */, + 31B8A37D21A238060055BD01 /* restore.c in Sources */, + 31B8A39C21A238060055BD01 /* drawing.c in Sources */, + 31B8A41021A23EEC0055BD01 /* cursmain.c in Sources */, + 31B8A38E21A238060055BD01 /* quest.c in Sources */, + 31B8A3D621A238060055BD01 /* region.c in Sources */, + 31B8A3D421A238060055BD01 /* worm.c in Sources */, + 31B8A3C921A238060055BD01 /* sounds.c in Sources */, + 31B8A37C21A238060055BD01 /* pager.c in Sources */, + 31B8A39F21A238060055BD01 /* fountain.c in Sources */, + 31B8A40B21A23EEC0055BD01 /* cursmisc.c in Sources */, + 31B8A3CF21A238060055BD01 /* sp_lev.c in Sources */, + 31B8A3D321A238060055BD01 /* cmd.c in Sources */, + 31B8A3AB21A238060055BD01 /* mplayer.c in Sources */, + 31B8A3CC21A238060055BD01 /* pickup.c in Sources */, + 31B8A39721A238060055BD01 /* invent.c in Sources */, + 31B8A40021A23E6E0055BD01 /* getline.c in Sources */, + 31B8A3B521A238060055BD01 /* rect.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3189577B21A1FDA400FB2ABE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 31B8A31021A20DC10055BD01 /* monst.c in Sources */, + 31B8A30F21A20DC10055BD01 /* objects.c in Sources */, + 31B8A30C21A20D8B0055BD01 /* makedefs.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 31B8A41A21A2669A0055BD01 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 31B8A42B21A267E60055BD01 /* panic.c in Sources */, + 31B8A43021A268370055BD01 /* monst.c in Sources */, + 31B8A42921A267E60055BD01 /* lev_yacc.c in Sources */, + 31B8A42C21A267E60055BD01 /* lev_main.c in Sources */, + 31B8A42D21A267F50055BD01 /* alloc.c in Sources */, + 31B8A42E21A2680B0055BD01 /* drawing.c in Sources */, + 31B8A42A21A267E60055BD01 /* lev_lex.c in Sources */, + 31B8A43121A268420055BD01 /* objects.c in Sources */, + 31B8A42F21A2681E0055BD01 /* decl.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 31B8A43221A268DF0055BD01 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 31B8A46921A288770055BD01 /* dgn_comp.l in Sources */, + 31B8A46621A2820F0055BD01 /* dgn_comp.y in Sources */, + 31B8A44321A269EA0055BD01 /* dgn_main.c in Sources */, + 31B8A44521A26A0A0055BD01 /* alloc.c in Sources */, + 31B8A44421A26A020055BD01 /* panic.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 31B8A44621A26A4B0055BD01 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 31B8A45221A26A750055BD01 /* recover.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 31B8A45321A26A970055BD01 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 31B8A46121A26AF60055BD01 /* panic.c in Sources */, + 31B8A45E21A26ACF0055BD01 /* dlb.c in Sources */, + 31B8A46021A26AE70055BD01 /* dlb_main.c in Sources */, + 31B8A46221A26B020055BD01 /* alloc.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 31B8A31421A2355C0055BD01 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3189577E21A1FDA400FB2ABE /* makedefs */; + targetProxy = 31B8A31321A2355C0055BD01 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 3189577621A1FCC100FB2ABE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "c++98"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = NO; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = ansi; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_PEDANTIC = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "$(SRCROOT)/../../include"; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = ( + "-DNOMAIL", + "-DNOTPARMDECL", + "-DDEFAULT_WINDOW_SYS=\\\"curses\\\"", + "-DDLB", + "-DGREPPATH=\\\"/usr/bin/grep\\\"", + "-DSYSCF", + "-DSYSCF_FILE=\\\"/Users/barthouse/nethackdir/sysconf\\\"", + "-DHACKDIR=\\\"/Users/barthouse/nethackdir\\\"", + "-DSECURE", + ); + SDKROOT = macosx; + }; + name = Debug; + }; + 3189577721A1FCC100FB2ABE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "c++98"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = NO; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = ansi; + GCC_NO_COMMON_BLOCKS = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_PEDANTIC = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "$(SRCROOT)/../../include"; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + OTHER_CFLAGS = ( + "-DNOMAIL", + "-DNOTPARMDECL", + "-DDEFAULT_WINDOW_SYS=\\\"curses\\\"", + "-DDLB", + "-DGREPPATH=\\\"/usr/bin/grep\\\"", + "-DSYSCF", + "-DSYSCF_FILE=\\\"/Users/barthouse/nethackdir/sysconf\\\"", + "-DHACKDIR=\\\"/Users/barthouse/nethackdir\\\"", + "-DSECURE", + ); + SDKROOT = macosx; + }; + name = Release; + }; + 3189577921A1FCC100FB2ABE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = T4L96T5775; + OTHER_CFLAGS = ( + "-DNOMAIL", + "-DNOTPARMDECL", + "-DDEFAULT_WINDOW_SYS=\\\"curses\\\"", + "-DDLB", + "-DGREPPATH=\\\"/usr/bin/grep\\\"", + "-DSYSCF", + "-DSYSCF_FILE=\\\"/Users/barthouse/nethackdir/sysconf\\\"", + "-DHACKDIR=\\\"/Users/barthouse/nethackdir\\\"", + "-DSECURE", + "-DCURSES_GRAPHICS", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 3189577A21A1FCC100FB2ABE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = T4L96T5775; + OTHER_CFLAGS = ( + "-DNOMAIL", + "-DNOTPARMDECL", + "-DDEFAULT_WINDOW_SYS=\\\"curses\\\"", + "-DDLB", + "-DGREPPATH=\\\"/usr/bin/grep\\\"", + "-DSYSCF", + "-DSYSCF_FILE=\\\"/Users/barthouse/nethackdir/sysconf\\\"", + "-DHACKDIR=\\\"/Users/barthouse/nethackdir\\\"", + "-DSECURE", + "-DCURSES_GRAPHICS", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 3189578421A1FDA400FB2ABE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = T4L96T5775; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 3189578521A1FDA400FB2ABE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = T4L96T5775; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 31B8A42321A2669A0055BD01 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = T4L96T5775; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 31B8A42421A2669A0055BD01 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = T4L96T5775; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 31B8A43B21A268E00055BD01 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = T4L96T5775; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 31B8A43C21A268E00055BD01 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = T4L96T5775; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 31B8A44F21A26A4B0055BD01 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = T4L96T5775; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 31B8A45021A26A4B0055BD01 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = T4L96T5775; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 31B8A45C21A26A970055BD01 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = T4L96T5775; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 31B8A45D21A26A970055BD01 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = T4L96T5775; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 3189576C21A1FCC100FB2ABE /* Build configuration list for PBXProject "NetHack" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3189577621A1FCC100FB2ABE /* Debug */, + 3189577721A1FCC100FB2ABE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3189577821A1FCC100FB2ABE /* Build configuration list for PBXNativeTarget "NetHack" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3189577921A1FCC100FB2ABE /* Debug */, + 3189577A21A1FCC100FB2ABE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3189578321A1FDA400FB2ABE /* Build configuration list for PBXNativeTarget "makedefs" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3189578421A1FDA400FB2ABE /* Debug */, + 3189578521A1FDA400FB2ABE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 31B8A42221A2669A0055BD01 /* Build configuration list for PBXNativeTarget "lev_comp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 31B8A42321A2669A0055BD01 /* Debug */, + 31B8A42421A2669A0055BD01 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 31B8A43A21A268E00055BD01 /* Build configuration list for PBXNativeTarget "dgn_comp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 31B8A43B21A268E00055BD01 /* Debug */, + 31B8A43C21A268E00055BD01 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 31B8A44E21A26A4B0055BD01 /* Build configuration list for PBXNativeTarget "recover" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 31B8A44F21A26A4B0055BD01 /* Debug */, + 31B8A45021A26A4B0055BD01 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 31B8A45B21A26A970055BD01 /* Build configuration list for PBXNativeTarget "dlb" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 31B8A45C21A26A970055BD01 /* Debug */, + 31B8A45D21A26A970055BD01 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 3189576921A1FCC100FB2ABE /* Project object */; +} diff --git a/sys/unix/NetHack.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/sys/unix/NetHack.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..793cc7903 --- /dev/null +++ b/sys/unix/NetHack.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..0c67376eb --- /dev/null +++ b/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,5 @@ + + + + + diff --git a/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/IDEFindNavigatorScopes.plist b/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/IDEFindNavigatorScopes.plist new file mode 100644 index 000000000..5dd5da85f --- /dev/null +++ b/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/IDEFindNavigatorScopes.plist @@ -0,0 +1,5 @@ + + + + + diff --git a/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/UserInterfaceState.xcuserstate b/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..4c98bfa235a95a6a9f0347924d732e596cda7594 GIT binary patch literal 120988 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ⓈGiV#sO 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 M@BjDTLmFrOe~|_Mh5!Hn literal 0 HcmV?d00001 diff --git a/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/WorkspaceSettings.xcsettings b/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f25782dd5 --- /dev/null +++ b/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/WorkspaceSettings.xcsettings @@ -0,0 +1,18 @@ + + + + + BuildLocationStyle + UseAppPreferences + CustomBuildLocationType + RelativeToDerivedData + DerivedDataLocationStyle + Default + EnabledFullIndexStoreVisibility + + IssueFilterStyle + ShowActiveSchemeOnly + LiveSourceIssuesEnabled + + + diff --git a/sys/unix/NetHack.xcodeproj/xcshareddata/xcschemes/NetHack.xcscheme b/sys/unix/NetHack.xcodeproj/xcshareddata/xcschemes/NetHack.xcscheme new file mode 100644 index 000000000..92558e275 --- /dev/null +++ b/sys/unix/NetHack.xcodeproj/xcshareddata/xcschemes/NetHack.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sys/unix/NetHack.xcodeproj/xcshareddata/xcschemes/makedefs.xcscheme b/sys/unix/NetHack.xcodeproj/xcshareddata/xcschemes/makedefs.xcscheme new file mode 100644 index 000000000..57dfc65d9 --- /dev/null +++ b/sys/unix/NetHack.xcodeproj/xcshareddata/xcschemes/makedefs.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sys/unix/NetHack.xcodeproj/xcuserdata/barthouse.xcuserdatad/xcschemes/xcschememanagement.plist b/sys/unix/NetHack.xcodeproj/xcuserdata/barthouse.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..1b3fa1ceb --- /dev/null +++ b/sys/unix/NetHack.xcodeproj/xcuserdata/barthouse.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,52 @@ + + + + + SchemeUserState + + NetHack.xcscheme_^#shared#^_ + + orderHint + 2 + + dgn_comp.xcscheme_^#shared#^_ + + orderHint + 3 + + dlb.xcscheme_^#shared#^_ + + orderHint + 5 + + lev_comp.xcscheme_^#shared#^_ + + orderHint + 1 + + makedefs.xcscheme_^#shared#^_ + + orderHint + 0 + + recover.xcscheme_^#shared#^_ + + orderHint + 4 + + + SuppressBuildableAutocreation + + 3189577021A1FCC100FB2ABE + + primary + + + 3189577E21A1FDA400FB2ABE + + primary + + + + + diff --git a/util/panic.c b/util/panic.c index 36bd4596c..8a3f18c7b 100644 --- a/util/panic.c +++ b/util/panic.c @@ -20,10 +20,10 @@ extern void NDECL(vms_abort); /*VARARGS1*/ boolean panicking; -void VDECL(panic, (char *, ...)); +void VDECL(panic, (const char *, ...)); void panic -VA_DECL(char *, str) +VA_DECL(const char *, str) { VA_START(str); VA_INIT(str, char *); From 3c5556d45e55d7e031af83f800d1c9f99417aedc Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 09:53:46 -0800 Subject: [PATCH 20/74] Fix vi induced build problem. --- include/global.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/global.h b/include/global.h index bb0a96cd4..154c49ebe 100644 --- a/include/global.h +++ b/include/global.h @@ -13,7 +13,7 @@ #ifndef DEBUG /* allow tool chains to define without causing warnings */ #define DEBUG #endif -: + /* * Files expected to exist in the playground directory. */ From 4788b10d88b5145a8b0350c9c7eab24b7c4f318e Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 11:06:57 -0800 Subject: [PATCH 21/74] XCode project check-point. --- sys/unix/NetHack.xcodeproj/project.pbxproj | 28 +++++++++++++++++- .../UserInterfaceState.xcuserstate | Bin 120988 -> 120035 bytes .../WorkspaceSettings.xcsettings | 8 ++++- .../xcschemes/xcschememanagement.plist | 4 +-- 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj index b5cb9b1d4..45f876190 100644 --- a/sys/unix/NetHack.xcodeproj/project.pbxproj +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -197,7 +197,7 @@ 3189576F21A1FCC100FB2ABE /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; + dstPath = /usr/share/man/man1; dstSubfolderSpec = 0; files = ( ); @@ -714,6 +714,7 @@ 3189577B21A1FDA400FB2ABE /* Sources */, 3189577C21A1FDA400FB2ABE /* Frameworks */, 3189577D21A1FDA400FB2ABE /* CopyFiles */, + 319B338E21A32B0800B78702 /* ShellScript */, ); buildRules = ( ); @@ -845,6 +846,29 @@ }; /* End PBXProject section */ +/* Begin PBXShellScriptBuildPhase section */ + 319B338E21A32B0800B78702 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + "${SOURCE_ROOT}/../../util/makedefs", + "$(SOURCE_ROOT}/../../inlcude/date.h", + "$(SOURCE_ROOT}/../../dat/options", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Type a script or drag a script file from your workspace to insert its path\ncd ${SOURCE_ROOT}/../../util\n\ncp ${BUILT_PRODUCTS_DIR}/makedefs .\n\n# Make dat/options\n# This also will generate include/date.h\n\n./makedefs -v\n"; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ 3189576D21A1FCC100FB2ABE /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -1114,6 +1138,7 @@ "-DSYSCF_FILE=\\\"/Users/barthouse/nethackdir/sysconf\\\"", "-DHACKDIR=\\\"/Users/barthouse/nethackdir\\\"", "-DSECURE", + "-DCURSES_GRAPHICS", ); SDKROOT = macosx; }; @@ -1179,6 +1204,7 @@ "-DSYSCF_FILE=\\\"/Users/barthouse/nethackdir/sysconf\\\"", "-DHACKDIR=\\\"/Users/barthouse/nethackdir\\\"", "-DSECURE", + "-DCURSES_GRAPHICS", ); SDKROOT = macosx; }; diff --git a/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/UserInterfaceState.xcuserstate b/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/UserInterfaceState.xcuserstate index 4c98bfa235a95a6a9f0347924d732e596cda7594..fa83e0211a42b7ea33d07fd56189a465b252b14c 100644 GIT binary patch literal 120035 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 literal 120988 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ⓈGiV#sO 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 M@BjDTLmFrOe~|_Mh5!Hn diff --git a/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/WorkspaceSettings.xcsettings b/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/WorkspaceSettings.xcsettings index f25782dd5..b45a859e8 100644 --- a/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/WorkspaceSettings.xcsettings +++ b/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/WorkspaceSettings.xcsettings @@ -4,8 +4,14 @@ BuildLocationStyle UseAppPreferences + CustomBuildIntermediatesPath + ../../obj CustomBuildLocationType - RelativeToDerivedData + RelativeToWorkspace + CustomBuildProductsPath + ../../bin + CustomIndexStorePath + ../../datastore DerivedDataLocationStyle Default EnabledFullIndexStoreVisibility diff --git a/sys/unix/NetHack.xcodeproj/xcuserdata/barthouse.xcuserdatad/xcschemes/xcschememanagement.plist b/sys/unix/NetHack.xcodeproj/xcuserdata/barthouse.xcuserdatad/xcschemes/xcschememanagement.plist index 1b3fa1ceb..f8687bde7 100644 --- a/sys/unix/NetHack.xcodeproj/xcuserdata/barthouse.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/sys/unix/NetHack.xcodeproj/xcuserdata/barthouse.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ NetHack.xcscheme_^#shared#^_ orderHint - 2 + 1 dgn_comp.xcscheme_^#shared#^_ @@ -22,7 +22,7 @@ lev_comp.xcscheme_^#shared#^_ orderHint - 1 + 2 makedefs.xcscheme_^#shared#^_ From 878ac240378f968b55e60cf87bd4f015f9de6197 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 17 Nov 2018 19:26:49 +0200 Subject: [PATCH 22/74] Fix freeing monsters not on map Sometimes we free the monster data, but the monster is not on the map - usually this happens if the map is full of monsters and a new one is migrated on the level. Make m_detach check the monster x coordinate, so it knows not to touch the map if the monster isn't on it. --- src/dog.c | 1 + src/mail.c | 3 ++- src/mon.c | 15 ++++++++++++--- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/dog.c b/src/dog.c index e5767103a..71a4ea289 100644 --- a/src/dog.c +++ b/src/dog.c @@ -464,6 +464,7 @@ fail_mon_placement: } (void) mkcorpstat(CORPSE, (struct monst *) 0, mtmp->data, xlocale, ylocale, CORPSTAT_NONE); + mtmp->mx = mtmp->my = -1; /* for mongone, mon is not anywhere */ mongone(mtmp); } } diff --git a/src/mail.c b/src/mail.c index 3f47e3a55..6427cf8cd 100644 --- a/src/mail.c +++ b/src/mail.c @@ -418,7 +418,8 @@ struct mail_info *info; /* zip back to starting location */ go_back: - (void) md_rush(md, start.x, start.y); + if (!md_rush(md, start.x, start.y)) + md->mx = md->my = -1; /* for mongone, md is not on map */ mongone(md); /* deliver some classes of messages even if no daemon ever shows up */ give_up: diff --git a/src/mon.c b/src/mon.c index 079321f41..7340e1ad6 100644 --- a/src/mon.c +++ b/src/mon.c @@ -1745,6 +1745,8 @@ m_detach(mtmp, mptr) struct monst *mtmp; struct permonst *mptr; /* reflects mtmp->data _prior_ to mtmp's death */ { + boolean onmap = (mtmp->mx > -1); + if (mtmp == context.polearm.hitmon) context.polearm.hitmon = 0; if (mtmp->mleashed) @@ -1753,14 +1755,21 @@ struct permonst *mptr; /* reflects mtmp->data _prior_ to mtmp's death */ mtmp->mtrapped = 0; mtmp->mhp = 0; /* simplify some tests: force mhp to 0 */ relobj(mtmp, 0, FALSE); - remove_monster(mtmp->mx, mtmp->my); + if (onmap) { + if (mtmp->wormno) + remove_worm(mtmp); + else + remove_monster(mtmp->mx, mtmp->my); + } if (emits_light(mptr)) del_light_source(LS_MONSTER, monst_to_any(mtmp)); if (mtmp->m_ap_type) seemimic(mtmp); - newsym(mtmp->mx, mtmp->my); + if (onmap) + newsym(mtmp->mx, mtmp->my); unstuck(mtmp); - fill_pit(mtmp->mx, mtmp->my); + if (onmap) + fill_pit(mtmp->mx, mtmp->my); if (mtmp->isshk) shkgone(mtmp); From ebef31ffa5026f54dbc9cf960016efeb0a539c3e Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 17 Nov 2018 19:48:48 +0200 Subject: [PATCH 23/74] Check monster relocation degenerate cases more strictly Just in case we're trying to put the monster on the same location where it already thinks it is... but actually isn't. --- src/mon.c | 2 +- src/teleport.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mon.c b/src/mon.c index 7340e1ad6..232992d32 100644 --- a/src/mon.c +++ b/src/mon.c @@ -2586,7 +2586,7 @@ boolean move_other; /* make sure mtmp gets to x, y! so move m_at(x, y) */ xchar newx, newy; coord mm; - if (mtmp->mx == x && mtmp->my == y) + if (mtmp->mx == x && mtmp->my == y && m_at(x,y) == mtmp) return TRUE; if (move_other && (othermon = m_at(x, y)) != 0) { diff --git a/src/teleport.c b/src/teleport.c index 9a6ff8f19..a7901e3d9 100644 --- a/src/teleport.c +++ b/src/teleport.c @@ -1005,8 +1005,8 @@ register int x, y; register int oldx = mtmp->mx, oldy = mtmp->my; boolean resident_shk = mtmp->isshk && inhishop(mtmp); - if (x == mtmp->mx && y == mtmp->my) /* that was easy */ - return; + if (x == mtmp->mx && y == mtmp->my && m_at(x,y) == mtmp) + return; /* that was easy */ if (oldx) { /* "pick up" monster */ if (mtmp->wormno) { From 657f55782177b0d60a52997f0a9f2b6ea7d97fb0 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 17 Nov 2018 19:59:09 +0200 Subject: [PATCH 24/74] Fix vault guard not considering monsters in walls Two different cases here: a) Vault guard did not move away monsters except if they were standing on gold, and b) moving away monsters on a completely filled level did not work --- src/vault.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/vault.c b/src/vault.c index eea24737d..32bffdb7a 100644 --- a/src/vault.c +++ b/src/vault.c @@ -13,6 +13,7 @@ STATIC_DCL void FDECL(restfakecorr, (struct monst *)); STATIC_DCL boolean FDECL(in_fcorridor, (struct monst *, int, int)); STATIC_DCL void FDECL(move_gold, (struct obj *, int)); STATIC_DCL void FDECL(wallify_vault, (struct monst *)); +STATIC_DCL void FDECL(gd_mv_monaway, (struct monst *, int, int)); void newegd(mtmp) @@ -577,6 +578,19 @@ struct monst *grd; } } +STATIC_OVL void +gd_mv_monaway(grd, nx,ny) +register struct monst *grd; +int nx,ny; +{ + if (MON_AT(nx, ny) && nx != grd->mx && ny != grd->my) { + if (!Deaf) + verbalize("Out of my way, scum!"); + if (!rloc(m_at(nx, ny), FALSE)) + m_into_limbo(m_at(nx, ny)); + } +} + /* * return 1: guard moved, 0: guard didn't, -1: let m_move do it, -2: died */ @@ -745,11 +759,7 @@ register struct monst *grd; mpickgold(grd); /* does a newsym */ } else { /* just for insurance... */ - if (MON_AT(m, n) && m != grd->mx && n != grd->my) { - if (!Deaf) - verbalize("Out of my way, scum!"); - (void) rloc(m_at(m, n), FALSE); - } + gd_mv_monaway(grd, m,n); remove_monster(grd->mx, grd->my); newsym(grd->mx, grd->my); place_monster(grd, m, n); @@ -869,6 +879,7 @@ proceed: fcp->fy = ny; fcp->ftyp = typ; newpos: + gd_mv_monaway(grd, nx,ny); if (egrd->gddone) { /* The following is a kludge. We need to keep */ /* the guard around in order to be able to make */ From 9ad7268c0a824d654aef35d072cde6e8d28a3262 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Mon, 19 Nov 2018 21:24:08 +0200 Subject: [PATCH 25/74] Moving long worms may still put tail in old location When using rloc and friends to move monsters, and the monster happens to be a long worm, the tail may get randomly placed in the same place where the long worm was removed from. In the cases where we expect the location to really be free, explicitly recheck the location for a monster after rloc. --- src/do.c | 2 +- src/vault.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/do.c b/src/do.c index 00f0b8edd..29d27a1ce 100644 --- a/src/do.c +++ b/src/do.c @@ -1446,7 +1446,7 @@ boolean at_stairs, falling, portal; with the situation, so only say something when debugging */ if (wizard) pline("(monster in hero's way)"); - if (!rloc(mtmp, TRUE)) + if (!rloc(mtmp, TRUE) || m_at(u.ux, u.uy)) /* no room to move it; send it away, to return later */ migrate_to_level(mtmp, ledger_no(&u.uz), MIGR_RANDOM, (coord *) 0); diff --git a/src/vault.c b/src/vault.c index 32bffdb7a..b3def3bd4 100644 --- a/src/vault.c +++ b/src/vault.c @@ -586,7 +586,7 @@ int nx,ny; if (MON_AT(nx, ny) && nx != grd->mx && ny != grd->my) { if (!Deaf) verbalize("Out of my way, scum!"); - if (!rloc(m_at(nx, ny), FALSE)) + if (!rloc(m_at(nx, ny), FALSE) || m_at(nx, ny)) m_into_limbo(m_at(nx, ny)); } } From 7119baafb8f239208b4b9e7ecda157fbe627044c Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Mon, 19 Nov 2018 21:27:19 +0200 Subject: [PATCH 26/74] Long worm may get killed in middle of action If long worm attacks you, and you have a passive response that may kill the worm (eg. blue jelly), the worm may die in the middle of a loop checking for a worm segment that can attack. This'll cause a segfault because the worm segments will get freed. If the worm dies, just exit the loop. --- src/worm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/worm.c b/src/worm.c index c99787461..2a19df288 100644 --- a/src/worm.c +++ b/src/worm.c @@ -301,7 +301,8 @@ register struct monst *worm; */ for (seg = wtails[wnum]; seg; seg = seg->nseg) if (distu(seg->wx, seg->wy) < 3) - (void) mattacku(worm); + if (mattacku(worm)) + return; /* your passive ability killed the worm */ } /* cutworm() From 898a22159f5f577f7e15b57b26f23d4254eed88c Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 11:33:11 -0800 Subject: [PATCH 27/74] Added building of data to xcode build. --- sys/unix/NetHack.xcodeproj/project.pbxproj | 21 ++++++++++++++++++ .../UserInterfaceState.xcuserstate | Bin 120035 -> 120212 bytes .../xcschemes/xcschememanagement.plist | 4 ++-- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj index 45f876190..184d03fb2 100644 --- a/sys/unix/NetHack.xcodeproj/project.pbxproj +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -715,6 +715,7 @@ 3189577C21A1FDA400FB2ABE /* Frameworks */, 3189577D21A1FDA400FB2ABE /* CopyFiles */, 319B338E21A32B0800B78702 /* ShellScript */, + 319CBA3821A3458100150830 /* ShellScript */, ); buildRules = ( ); @@ -867,6 +868,26 @@ shellPath = /bin/sh; shellScript = "# Type a script or drag a script file from your workspace to insert its path\ncd ${SOURCE_ROOT}/../../util\n\ncp ${BUILT_PRODUCTS_DIR}/makedefs .\n\n# Make dat/options\n# This also will generate include/date.h\n\n./makedefs -v\n"; }; + 319CBA3821A3458100150830 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(SRC_ROOT)/../../dat/data.base", + "$(SRCROOT)/../../util/makedefs", + ); + outputFileListPaths = ( + ); + outputPaths = ( + "$(SRC_ROOT)/../../data", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# make data from data.base\ncd ${SOURCE_ROOT}/../../dat\n\n../util/makedefs -d\n"; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ diff --git a/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/UserInterfaceState.xcuserstate b/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/UserInterfaceState.xcuserstate index fa83e0211a42b7ea33d07fd56189a465b252b14c..9a259705e0bc42210a7d90b627e5acd15cdca16f 100644 GIT binary patch literal 120212 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 literal 120035 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 diff --git a/sys/unix/NetHack.xcodeproj/xcuserdata/barthouse.xcuserdatad/xcschemes/xcschememanagement.plist b/sys/unix/NetHack.xcodeproj/xcuserdata/barthouse.xcuserdatad/xcschemes/xcschememanagement.plist index f8687bde7..419979501 100644 --- a/sys/unix/NetHack.xcodeproj/xcuserdata/barthouse.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/sys/unix/NetHack.xcodeproj/xcuserdata/barthouse.xcuserdatad/xcschemes/xcschememanagement.plist @@ -12,7 +12,7 @@ dgn_comp.xcscheme_^#shared#^_ orderHint - 3 + 2 dlb.xcscheme_^#shared#^_ @@ -22,7 +22,7 @@ lev_comp.xcscheme_^#shared#^_ orderHint - 2 + 3 makedefs.xcscheme_^#shared#^_ From 2a439af3367fdddb096b085cd657ce1cca70dd3c Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Mon, 19 Nov 2018 21:49:49 +0200 Subject: [PATCH 28/74] More long worm checks when splitting When a long worm is split into two, perform more checks placing the segments on the map. --- include/extern.h | 2 +- src/mon.c | 2 +- src/restore.c | 2 +- src/worm.c | 19 +++++++++++++++---- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/include/extern.h b/include/extern.h index 8fd85e91e..ff0976e18 100644 --- a/include/extern.h +++ b/include/extern.h @@ -2835,7 +2835,7 @@ E void FDECL(see_wsegs, (struct monst *)); E void FDECL(detect_wsegs, (struct monst *, BOOLEAN_P)); E void FDECL(save_worm, (int, int)); E void FDECL(rest_worm, (int)); -E void FDECL(place_wsegs, (struct monst *)); +E void FDECL(place_wsegs, (struct monst *, struct monst *)); E void FDECL(sanity_check_worm, (struct monst *)); E void FDECL(remove_worm, (struct monst *)); E void FDECL(place_worm_tail_randomly, (struct monst *, XCHAR_P, XCHAR_P)); diff --git a/src/mon.c b/src/mon.c index 232992d32..56c5da13f 100644 --- a/src/mon.c +++ b/src/mon.c @@ -1587,7 +1587,7 @@ struct monst *mtmp, *mtmp2; if (mtmp != u.usteed) /* don't place steed onto the map */ place_monster(mtmp2, mtmp2->mx, mtmp2->my); if (mtmp2->wormno) /* update level.monsters[wseg->wx][wseg->wy] */ - place_wsegs(mtmp2); /* locations to mtmp2 not mtmp. */ + place_wsegs(mtmp2, NULL); /* locations to mtmp2 not mtmp. */ if (emits_light(mtmp2->data)) { /* since this is so rare, we don't have any `mon_move_light_source' */ new_light_source(mtmp2->mx, mtmp2->my, emits_light(mtmp2->data), diff --git a/src/restore.c b/src/restore.c index f638875b8..f7a1e6a26 100644 --- a/src/restore.c +++ b/src/restore.c @@ -1080,7 +1080,7 @@ boolean ghostly; set_residency(mtmp, FALSE); place_monster(mtmp, mtmp->mx, mtmp->my); if (mtmp->wormno) - place_wsegs(mtmp); + place_wsegs(mtmp, NULL); /* regenerate monsters while on another level */ if (!u.uz.dlevel) diff --git a/src/worm.c b/src/worm.c index 2a19df288..427ccd04f 100644 --- a/src/worm.c +++ b/src/worm.c @@ -415,7 +415,7 @@ struct obj *weap; wgrowtime[new_wnum] = 0L; /* trying to call initworm(). */ /* Place the new monster at all the segment locations. */ - place_wsegs(new_worm); + place_wsegs(new_worm, worm); if (context.mon_moving) pline("%s is cut in half.", Monnam(worm)); @@ -556,17 +556,28 @@ int fd; * place_wsegs() * * Place the segments of the given worm. Called from restore.c + * If oldworm is not NULL, assumes the oldworm segments are on map + * in the same location as worm segments */ void -place_wsegs(worm) -struct monst *worm; +place_wsegs(worm, oldworm) +struct monst *worm, *oldworm; { struct wseg *curr = wtails[worm->wormno]; /* if (!mtmp->wormno) return; bullet proofing */ while (curr != wheads[worm->wormno]) { - place_worm_seg(worm, curr->wx, curr->wy); + xchar x = curr->wx; + xchar y = curr->wy; + + if (oldworm) { + if (m_at(x,y) == oldworm) + remove_monster(x, y); + else + impossible("placing worm seg <%i,%i> over another mon", x, y); + } + place_worm_seg(worm, x, y); curr = curr->nseg; } } From b0428321b8f8448ddb572dc13561aca1250e71aa Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Mon, 19 Nov 2018 21:54:32 +0200 Subject: [PATCH 29/74] Explicitly remove long worm segments from the map When a long worm was removed from the map, the segments for that worm retained their map location info. This caused problems later on if wormgone (or toss_wsegs) was called, because it would try to remove the segments of that worm from the map. --- src/worm.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/worm.c b/src/worm.c index 427ccd04f..b2bf598dc 100644 --- a/src/worm.c +++ b/src/worm.c @@ -596,10 +596,12 @@ struct monst *worm; curr = wtails[worm->wormno]; while (curr != wheads[worm->wormno]) { - if (!isok(curr->wx, curr->wy)) - panic("worm seg not isok"); - if (level.monsters[curr->wx][curr->wy] != worm) - panic("worm not at seg location"); + if (curr->wx) { + if (!isok(curr->wx, curr->wy)) + panic("worm seg not isok"); + if (level.monsters[curr->wx][curr->wy] != worm) + panic("worm not at seg location"); + } curr = curr->nseg; } } @@ -621,8 +623,11 @@ register struct monst *worm; /* if (!mtmp->wormno) return; bullet proofing */ while (curr) { - remove_monster(curr->wx, curr->wy); - newsym(curr->wx, curr->wy); + if (curr->wx) { + remove_monster(curr->wx, curr->wy); + newsym(curr->wx, curr->wy); + curr->wx = 0; + } curr = curr->nseg; } } From bf549e865f62774dc18a97c5e9135db1882301e1 Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 12:03:02 -0800 Subject: [PATCH 30/74] Added project wide build settings for nethack directories. --- sys/unix/NetHack.xcodeproj/project.pbxproj | 14 ++++++++++---- .../UserInterfaceState.xcuserstate | Bin 120212 -> 175060 bytes 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj index 184d03fb2..0ea72156e 100644 --- a/sys/unix/NetHack.xcodeproj/project.pbxproj +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -876,17 +876,17 @@ inputFileListPaths = ( ); inputPaths = ( - "$(SRC_ROOT)/../../dat/data.base", - "$(SRCROOT)/../../util/makedefs", + "$(NH_DAT_DIR)/data.base", + "$(NH_UTIL_DIR)/makedefs", ); outputFileListPaths = ( ); outputPaths = ( - "$(SRC_ROOT)/../../data", + "$(NH_DAT_DIR)/data", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# make data from data.base\ncd ${SOURCE_ROOT}/../../dat\n\n../util/makedefs -d\n"; + shellScript = "# make data from data.base\ncd ${NH_DAT_DIR}\n\n${NH_UTIL_DIR}/makedefs -d\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -1148,6 +1148,9 @@ MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; + NH_DAT_DIR = "$(SOURCE_ROOT)/../../dat"; + NH_ROOT = "$(SOURCE_ROOT)/../.."; + NH_UTIL_DIR = "$(SOURCE_ROOT)/../../util"; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = ( "-DNOMAIL", @@ -1215,6 +1218,9 @@ MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; + NH_DAT_DIR = "$(SOURCE_ROOT)/../../dat"; + NH_ROOT = "$(SOURCE_ROOT)/../.."; + NH_UTIL_DIR = "$(SOURCE_ROOT)/../../util"; OTHER_CFLAGS = ( "-DNOMAIL", "-DNOTPARMDECL", diff --git a/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/UserInterfaceState.xcuserstate b/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/UserInterfaceState.xcuserstate index 9a259705e0bc42210a7d90b627e5acd15cdca16f..f5ae000ba75b34019b81d28c6ea752275b2477b4 100644 GIT binary patch literal 175060 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 z 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

RCo|&v2jhEU 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 u5c`v@gHUHFbe2NrTS4eqjXmpcDCYm)?S%^b- Date: Mon, 19 Nov 2018 22:04:32 +0200 Subject: [PATCH 31/74] Replace long worm on map after removing tail with wormgone Calling wormgone will also remove the long worm monster from the map, not just the worm tail. Put the monster back on map so relmon can actually remove it properly. --- src/dog.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dog.c b/src/dog.c index 71a4ea289..85e618236 100644 --- a/src/dog.c +++ b/src/dog.c @@ -651,6 +651,7 @@ boolean pets_only; /* true for ascension or final escape */ cnt = count_wsegs(mtmp); num_segs = min(cnt, MAX_NUM_WORMS - 1); wormgone(mtmp); + place_monster(mtmp, mtmp->mx, mtmp->my); } else num_segs = 0; @@ -701,6 +702,7 @@ coord *cc; /* optional destination coordinates */ cnt = count_wsegs(mtmp); num_segs = min(cnt, MAX_NUM_WORMS - 1); wormgone(mtmp); + place_monster(mtmp, mtmp->mx, mtmp->my); } /* set minvent's obj->no_charge to 0 */ From 5acddebb3c84b4e07871893d24156c324138e7db Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Mon, 19 Nov 2018 22:09:14 +0200 Subject: [PATCH 32/74] Init long worm even if it does not have a tail Long worms with no tail parts still apparently need to have the zero-length tail placed. --- src/mon.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/mon.c b/src/mon.c index 56c5da13f..785b691b5 100644 --- a/src/mon.c +++ b/src/mon.c @@ -3577,8 +3577,7 @@ boolean msg; /* "The oldmon turns into a newmon!" */ #endif /* we can now create worms with tails - 11/91 */ initworm(mtmp, rn2(5)); - if (count_wsegs(mtmp)) - place_worm_tail_randomly(mtmp, mtmp->mx, mtmp->my); + place_worm_tail_randomly(mtmp, mtmp->mx, mtmp->my); } newsym(mtmp->mx, mtmp->my); From f221db4a94f78430625f390ef8062404d0f1aaa4 Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 12:13:58 -0800 Subject: [PATCH 33/74] Added NH_INC_DIR to xcode project build settings. --- sys/unix/NetHack.xcodeproj/project.pbxproj | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj index 0ea72156e..e70743c34 100644 --- a/sys/unix/NetHack.xcodeproj/project.pbxproj +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -860,13 +860,13 @@ outputFileListPaths = ( ); outputPaths = ( - "${SOURCE_ROOT}/../../util/makedefs", - "$(SOURCE_ROOT}/../../inlcude/date.h", - "$(SOURCE_ROOT}/../../dat/options", + "$(NH_UTIL_DIR)/makedefs", + "$(NH_INC_DIR)/date.h", + "$(NH_DAT_DIR)/options", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# Type a script or drag a script file from your workspace to insert its path\ncd ${SOURCE_ROOT}/../../util\n\ncp ${BUILT_PRODUCTS_DIR}/makedefs .\n\n# Make dat/options\n# This also will generate include/date.h\n\n./makedefs -v\n"; + shellScript = "# Type a script or drag a script file from your workspace to insert its path\ncd ${NH_UTIL_DIR}\n\ncp ${BUILT_PRODUCTS_DIR}/makedefs .\n\n# Make dat/options\n# This also will generate include/date.h\n\n./makedefs -v\n"; }; 319CBA3821A3458100150830 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; @@ -1149,6 +1149,7 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; NH_DAT_DIR = "$(SOURCE_ROOT)/../../dat"; + NH_INC_DIR = "$(SOURCE_ROOT)/../../include"; NH_ROOT = "$(SOURCE_ROOT)/../.."; NH_UTIL_DIR = "$(SOURCE_ROOT)/../../util"; ONLY_ACTIVE_ARCH = YES; @@ -1219,6 +1220,7 @@ MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; NH_DAT_DIR = "$(SOURCE_ROOT)/../../dat"; + NH_INC_DIR = "$(SOURCE_ROOT)/../../include"; NH_ROOT = "$(SOURCE_ROOT)/../.."; NH_UTIL_DIR = "$(SOURCE_ROOT)/../../util"; OTHER_CFLAGS = ( From b2e65ad9cd14a572d5fb319b2c76283e47357fea Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 12:14:27 -0800 Subject: [PATCH 34/74] Adding the ignoring of xcuserdata. --- sys/unix/NetHack.xcodeproj/project.xcworkspace/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 sys/unix/NetHack.xcodeproj/project.xcworkspace/.gitignore diff --git a/sys/unix/NetHack.xcodeproj/project.xcworkspace/.gitignore b/sys/unix/NetHack.xcodeproj/project.xcworkspace/.gitignore new file mode 100644 index 000000000..9bce6af39 --- /dev/null +++ b/sys/unix/NetHack.xcodeproj/project.xcworkspace/.gitignore @@ -0,0 +1 @@ +xcuserdata From f47893258d54db40e30dd23d0cbed3674565cdf0 Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 12:14:45 -0800 Subject: [PATCH 35/74] Removed personal user data. --- .../IDEFindNavigatorScopes.plist | 5 ---- .../UserInterfaceState.xcuserstate | Bin 175060 -> 0 bytes .../WorkspaceSettings.xcsettings | 24 ------------------ 3 files changed, 29 deletions(-) delete mode 100644 sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/IDEFindNavigatorScopes.plist delete mode 100644 sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/WorkspaceSettings.xcsettings diff --git a/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/IDEFindNavigatorScopes.plist b/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/IDEFindNavigatorScopes.plist deleted file mode 100644 index 5dd5da85f..000000000 --- a/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/IDEFindNavigatorScopes.plist +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/UserInterfaceState.xcuserstate b/sys/unix/NetHack.xcodeproj/project.xcworkspace/xcuserdata/barthouse.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index f5ae000ba75b34019b81d28c6ea752275b2477b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175060 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 z 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

RCo|&v2jhEU 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 - - - - BuildLocationStyle - UseAppPreferences - CustomBuildIntermediatesPath - ../../obj - CustomBuildLocationType - RelativeToWorkspace - CustomBuildProductsPath - ../../bin - CustomIndexStorePath - ../../datastore - DerivedDataLocationStyle - Default - EnabledFullIndexStoreVisibility - - IssueFilterStyle - ShowActiveSchemeOnly - LiveSourceIssuesEnabled - - - From d83ae1a4dafe44af39a6c4afa6f565cf28952e14 Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 12:17:20 -0800 Subject: [PATCH 36/74] Adding the ignoring of xcuserdata. --- sys/unix/NetHack.xcodeproj/.gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 sys/unix/NetHack.xcodeproj/.gitignore diff --git a/sys/unix/NetHack.xcodeproj/.gitignore b/sys/unix/NetHack.xcodeproj/.gitignore new file mode 100644 index 000000000..ab5ec3aee --- /dev/null +++ b/sys/unix/NetHack.xcodeproj/.gitignore @@ -0,0 +1,2 @@ +xcuserdata + From cbe2669e054405805a1147ca92f61ad12268d4ca Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 12:17:37 -0800 Subject: [PATCH 37/74] Removing personal data. --- .../xcschemes/xcschememanagement.plist | 52 ------------------- 1 file changed, 52 deletions(-) delete mode 100644 sys/unix/NetHack.xcodeproj/xcuserdata/barthouse.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/sys/unix/NetHack.xcodeproj/xcuserdata/barthouse.xcuserdatad/xcschemes/xcschememanagement.plist b/sys/unix/NetHack.xcodeproj/xcuserdata/barthouse.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 419979501..000000000 --- a/sys/unix/NetHack.xcodeproj/xcuserdata/barthouse.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,52 +0,0 @@ - - - - - SchemeUserState - - NetHack.xcscheme_^#shared#^_ - - orderHint - 1 - - dgn_comp.xcscheme_^#shared#^_ - - orderHint - 2 - - dlb.xcscheme_^#shared#^_ - - orderHint - 5 - - lev_comp.xcscheme_^#shared#^_ - - orderHint - 3 - - makedefs.xcscheme_^#shared#^_ - - orderHint - 0 - - recover.xcscheme_^#shared#^_ - - orderHint - 4 - - - SuppressBuildableAutocreation - - 3189577021A1FCC100FB2ABE - - primary - - - 3189577E21A1FDA400FB2ABE - - primary - - - - - From b54dda56241f128b11076ffd17d8c211942478da Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Mon, 19 Nov 2018 22:38:10 +0200 Subject: [PATCH 38/74] More monster location sanity checks Placing a monster over already existing one will now complain. Define EXTRA_SANITY_CHECKS to check monster removal too. --- include/rm.h | 11 +++++++++++ src/mail.c | 8 ++++++-- src/mhitm.c | 1 + src/save.c | 5 +++++ src/steed.c | 2 ++ src/worm.c | 1 + 6 files changed, 26 insertions(+), 2 deletions(-) diff --git a/include/rm.h b/include/rm.h index 7fd41c47c..93362d67b 100644 --- a/include/rm.h +++ b/include/rm.h @@ -629,8 +629,19 @@ extern dlevel_t level; /* structure describing the current level */ #define MON_BURIED_AT(x, y) \ (level.monsters[x][y] != (struct monst *) 0 \ && (level.monsters[x][y])->mburied) +#if EXTRA_SANITY_CHECKS +#define place_worm_seg(m, x, y) do { \ + if (level.monsters[x][y] && level.monsters[x][y] != m) impossible("place_worm_seg over mon"); \ + level.monsters[x][y] = m; \ + } while(0) +#define remove_monster(x, y) do { \ + if (!level.monsters[x][y]) impossible("no monster to remove"); \ + level.monsters[x][y] = (struct monst *) 0; \ + } while(0) +#else #define place_worm_seg(m, x, y) level.monsters[x][y] = m #define remove_monster(x, y) level.monsters[x][y] = (struct monst *) 0 +#endif #define m_at(x, y) (MON_AT(x, y) ? level.monsters[x][y] : (struct monst *) 0) #define m_buried_at(x, y) \ (MON_BURIED_AT(x, y) ? level.monsters[x][y] : (struct monst *) 0) diff --git a/src/mail.c b/src/mail.c index 6427cf8cd..8e3eec8f7 100644 --- a/src/mail.c +++ b/src/mail.c @@ -336,19 +336,21 @@ register int tx, ty; /* destination of mail daemon */ else if (fx == u.ux && fy == u.uy) verbalize("Excuse me."); + if (mon) + remove_monster(fx, fy); place_monster(md, fx, fy); /* put md down */ newsym(fx, fy); /* see it */ flush_screen(0); /* make sure md shows up */ delay_output(); /* wait a little bit */ /* Remove md from the dungeon. Restore original mon, if necessary. */ + remove_monster(fx, fy); if (mon) { if ((mon->mx != fx) || (mon->my != fy)) place_worm_seg(mon, fx, fy); else place_monster(mon, fx, fy); - } else - remove_monster(fx, fy); + } newsym(fx, fy); } @@ -357,9 +359,11 @@ register int tx, ty; /* destination of mail daemon */ * very unlikely). If one exists, then have the md leave in disgust. */ if ((mon = m_at(fx, fy)) != 0) { + remove_monster(fx, fy); place_monster(md, fx, fy); /* display md with text below */ newsym(fx, fy); verbalize("This place's too crowded. I'm outta here."); + remove_monster(fx, fy); if ((mon->mx != fx) || (mon->my != fy)) /* put mon back */ place_worm_seg(mon, fx, fy); diff --git a/src/mhitm.c b/src/mhitm.c index ba322a8ca..774e9a56e 100644 --- a/src/mhitm.c +++ b/src/mhitm.c @@ -725,6 +725,7 @@ register struct attack *mattk; * but don't leave it on the screen. Move the aggressor to the * defender's position. */ + remove_monster(dx, dy); remove_monster(ax, ay); place_monster(magr, dx, dy); newsym(ax, ay); /* erase old position */ diff --git a/src/save.c b/src/save.c index d7827fcfd..bca03c49e 100644 --- a/src/save.c +++ b/src/save.c @@ -536,6 +536,11 @@ skip_lots: saveobjchn(fd, level.buriedobjlist, mode); saveobjchn(fd, billobjs, mode); if (release_data(mode)) { + int x,y; + + for (y = 0; y < ROWNO; y++) + for (x = 0; x < COLNO; x++) + level.monsters[x][y] = 0; fmon = 0; ftrap = 0; fobj = 0; diff --git a/src/steed.c b/src/steed.c index 6b940c26e..61f252a4c 100644 --- a/src/steed.c +++ b/src/steed.c @@ -704,6 +704,8 @@ int x, y; (mon == u.usteed) ? "steed" : "defunct monster"); return; } + if (level.monsters[x][y]) + impossible("placing monster over another?"); mon->mx = x, mon->my = y; level.monsters[x][y] = mon; } diff --git a/src/worm.c b/src/worm.c index b2bf598dc..4e9d144b1 100644 --- a/src/worm.c +++ b/src/worm.c @@ -383,6 +383,7 @@ struct obj *weap; /* Sometimes the tail end dies. */ if (!new_worm) { + place_worm_seg(worm, x, y); /* place the "head" segment back */ if (context.mon_moving) { if (canspotmon(worm)) pline("Part of %s tail has been cut off.", From d1b6581c087ef7a02765a4971646370a50474fbc Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 13:03:06 -0800 Subject: [PATCH 39/74] Added building of more resources in xcode build. --- sys/unix/NetHack.xcodeproj/project.pbxproj | 104 ++++++++++++++++++++- 1 file changed, 100 insertions(+), 4 deletions(-) diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj index e70743c34..b3b2b044f 100644 --- a/sys/unix/NetHack.xcodeproj/project.pbxproj +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -714,8 +714,12 @@ 3189577B21A1FDA400FB2ABE /* Sources */, 3189577C21A1FDA400FB2ABE /* Frameworks */, 3189577D21A1FDA400FB2ABE /* CopyFiles */, - 319B338E21A32B0800B78702 /* ShellScript */, - 319CBA3821A3458100150830 /* ShellScript */, + 319B338E21A32B0800B78702 /* Build options */, + 319CBA3821A3458100150830 /* Build data */, + 317E7C4521A3548F00F6E4E5 /* Build rumors */, + 317E7C4621A355E700F6E4E5 /* Build quest.dat */, + 317E7C4721A357F700F6E4E5 /* Build oracles */, + 317E7C4821A358AE00F6E4E5 /* Build engrave, epitaph and bogusmon */, ); buildRules = ( ); @@ -848,7 +852,7 @@ /* End PBXProject section */ /* Begin PBXShellScriptBuildPhase section */ - 319B338E21A32B0800B78702 /* ShellScript */ = { + 317E7C4521A3548F00F6E4E5 /* Build rumors */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -856,7 +860,98 @@ inputFileListPaths = ( ); inputPaths = ( + "$(NH_DAT_DIR)/rumors.tru", + "$(NH_DAT_DIR)/rumors.fal", + "$(NH_UTIL_DIR)/makedefs", ); + name = "Build rumors"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(NH_DAT_DIR)/rumors", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/makedefs -r\n"; + }; + 317E7C4621A355E700F6E4E5 /* Build quest.dat */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(NH_DAT_DIR)/quest.txt", + "$(NH_UTIL_DIR)/makedefs", + ); + name = "Build quest.dat"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(NH_DAT_DIR)/quest.dat", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/makedefs -q\n\n"; + }; + 317E7C4721A357F700F6E4E5 /* Build oracles */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(NH_DAT_DIR)/oracles.txt", + "$(NH_UTIL_DIR)/makedefs", + ); + name = "Build oracles"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(NH_DAT_DIR)/oracles", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/makedefs -h\n"; + }; + 317E7C4821A358AE00F6E4E5 /* Build engrave, epitaph and bogusmon */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(NH_UTIL_DIR)/makedefs", + "$(NH_DAT_DIR)/engrave.txt", + "$(NH_DAT_DIR)/epitaph.txt", + "$(NH_DAT_DIR)/bogusmon.txt", + ); + name = "Build engrave, epitaph and bogusmon"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(NH_DAT_DIR)/engrave", + "$(NH_DAT_DIR)/epitaph", + "$(NH_DAT_DIR)/bogusmon", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/makedefs -h\n"; + }; + 319B338E21A32B0800B78702 /* Build options */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(BUILT_PRODUCTS_DIR)/makedefs", + ); + name = "Build options"; outputFileListPaths = ( ); outputPaths = ( @@ -868,7 +963,7 @@ shellPath = /bin/sh; shellScript = "# Type a script or drag a script file from your workspace to insert its path\ncd ${NH_UTIL_DIR}\n\ncp ${BUILT_PRODUCTS_DIR}/makedefs .\n\n# Make dat/options\n# This also will generate include/date.h\n\n./makedefs -v\n"; }; - 319CBA3821A3458100150830 /* ShellScript */ = { + 319CBA3821A3458100150830 /* Build data */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -879,6 +974,7 @@ "$(NH_DAT_DIR)/data.base", "$(NH_UTIL_DIR)/makedefs", ); + name = "Build data"; outputFileListPaths = ( ); outputPaths = ( From becfe90bfc2ec0d95e59c55b6967a934b159686a Mon Sep 17 00:00:00 2001 From: nhmall Date: Mon, 19 Nov 2018 16:27:57 -0500 Subject: [PATCH 40/74] more .gitignore updates for XCode --- sys/unix/NetHack.xcodeproj/.gitignore | 36 +++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/sys/unix/NetHack.xcodeproj/.gitignore b/sys/unix/NetHack.xcodeproj/.gitignore index ab5ec3aee..72068cdad 100644 --- a/sys/unix/NetHack.xcodeproj/.gitignore +++ b/sys/unix/NetHack.xcodeproj/.gitignore @@ -1,2 +1,34 @@ -xcuserdata - +# OS X temporary files that should never be committed +# +.DS_Store +.Trashes +*.swp +#*.lock +# +# NB: NIB/XIB files still exist even on Storyboard projects, so we want this... +*~.nib +# +# NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "DerivedData" +DerivedData/ +# NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "build" +build/ +# Xcode private settings (window sizes, bookmarks, breakpoints, custom executables, smart groups) +# +#*.pbxuser +*.mode1v3 +*.mode2v3 +*.perspectivev3 +# NB: also, whitelist the default ones, some projects need to use these +!default.pbxuser +!default.mode1v3 +!default.mode2v3 +!default.perspectivev3 +#### +# Xcode 4 - semi-personal settings +*.xccheckout +# throw away ALL personal settings (including custom schemes! +# - unless they are "shared") +# As per build/ and DerivedData/, this ought to have a trailing slash +xcuserdata/ +# +*.moved-aside From 9f525b324185e43485fe6feffe85e0a42385d5ab Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 14:11:39 -0800 Subject: [PATCH 41/74] Added building of special and quest levels in xcode build. --- sys/unix/NetHack.xcodeproj/project.pbxproj | 153 ++++++++++++++++----- 1 file changed, 118 insertions(+), 35 deletions(-) diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj index b3b2b044f..f03cc42fb 100644 --- a/sys/unix/NetHack.xcodeproj/project.pbxproj +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -206,7 +206,7 @@ 3189577D21A1FDA400FB2ABE /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; + dstPath = /usr/share/man/man1; dstSubfolderSpec = 0; files = ( ); @@ -714,12 +714,12 @@ 3189577B21A1FDA400FB2ABE /* Sources */, 3189577C21A1FDA400FB2ABE /* Frameworks */, 3189577D21A1FDA400FB2ABE /* CopyFiles */, - 319B338E21A32B0800B78702 /* Build options */, + 317E7C4B21A35F0500F6E4E5 /* Copy makedefs */, 319CBA3821A3458100150830 /* Build data */, 317E7C4521A3548F00F6E4E5 /* Build rumors */, 317E7C4621A355E700F6E4E5 /* Build quest.dat */, - 317E7C4721A357F700F6E4E5 /* Build oracles */, - 317E7C4821A358AE00F6E4E5 /* Build engrave, epitaph and bogusmon */, + 317E7C4E21A3697300F6E4E5 /* Build options */, + 317E7C4F21A36A5700F6E4E5 /* Build engrave, epitaph and bogusmon */, ); buildRules = ( ); @@ -737,6 +737,9 @@ 31B8A41A21A2669A0055BD01 /* Sources */, 31B8A41B21A2669A0055BD01 /* Frameworks */, 31B8A41C21A2669A0055BD01 /* CopyFiles */, + 317E7C4C21A3625000F6E4E5 /* Copy lev_comp */, + 317E7C4A21A35E9400F6E4E5 /* Build special levels */, + 317E7C4D21A3649B00F6E4E5 /* Build quest levels */, ); buildRules = ( ); @@ -895,7 +898,7 @@ shellPath = /bin/sh; shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/makedefs -q\n\n"; }; - 317E7C4721A357F700F6E4E5 /* Build oracles */ = { + 317E7C4A21A35E9400F6E4E5 /* Build special levels */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -903,20 +906,102 @@ inputFileListPaths = ( ); inputPaths = ( - "$(NH_DAT_DIR)/oracles.txt", - "$(NH_UTIL_DIR)/makedefs", + "$(NH_UTIL_DIR)/lev_comp", + "$(NH_DAT_DIR)/bigroom.des", + "$(NH_DAT_DIR)/castle.des", + "$(NH_DAT_DIR)/endgame.des", + "$(NH_DAT_DIR)/knox.des", + "$(NH_DAT_DIR)/medusa.des", + "$(NH_DAT_DIR)/mines.des", + "$(NH_DAT_DIR)/oracle.des", + "$(NH_DAT_DIR)/sokoban.des", + "$(NH_DAT_DIR)/tower.des", + "$(NH_DAT_DIR)/yendor.des", ); - name = "Build oracles"; + name = "Build special levels"; outputFileListPaths = ( ); outputPaths = ( - "$(NH_DAT_DIR)/oracles", + "$(NH_DAT_DIR)/spec_levs", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/makedefs -h\n"; + shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/lev_comp bigroom.des\n${NH_UTIL_DIR}/lev_comp castle.des\n${NH_UTIL_DIR}/lev_comp endgame.des\n${NH_UTIL_DIR}/lev_comp gehennom.des\n${NH_UTIL_DIR}/lev_comp knox.des\n${NH_UTIL_DIR}/lev_comp medusa.des\n${NH_UTIL_DIR}/lev_comp mines.des\n${NH_UTIL_DIR}/lev_comp oracle.des\n${NH_UTIL_DIR}/lev_comp sokoban.des\n${NH_UTIL_DIR}/lev_comp tower.des\n${NH_UTIL_DIR}/lev_comp yendor.des\ntouch spec_levs\n"; }; - 317E7C4821A358AE00F6E4E5 /* Build engrave, epitaph and bogusmon */ = { + 317E7C4B21A35F0500F6E4E5 /* Copy makedefs */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(BUILT_PRODUCTS_DIR)/makedefs", + ); + name = "Copy makedefs"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(NH_UTIL_DIR)/makedefs", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cp ${BUILT_PRODUCTS_DIR}/makedefs ${NH_UTIL_DIR}/makedefs\n"; + }; + 317E7C4C21A3625000F6E4E5 /* Copy lev_comp */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(BUILT_PRODUCTS_DIR)/lev_comp", + ); + name = "Copy lev_comp"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(NH_UTIL_DIR)/lev_comp", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cp ${BUILT_PRODUCTS_DIR}/lev_comp ${NH_UTIL_DIR}/lev_comp\n"; + }; + 317E7C4D21A3649B00F6E4E5 /* Build quest levels */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(NH_UTIL_DIR)/lev_comp", + "$(NH_DAT_DIR)/Arch.des", + "$(NH_DAT_DIR)/Barb.des", + "$(NH_DAT_DIR)/Caveman.des", + "$(NH_DAT_DIR)/Healer.des", + "$(NH_DAT_DIR)/Knight.des", + "$(NH_DAT_DIR)/Monk.des", + "$(NH_DAT_DIR)/Priest.des", + "$(NH_DAT_DIR)/Ranger.des", + "$(NH_DAT_DIR)/Rogue.des", + "$(NH_DAT_DIR)/Samurai.des", + "$(NH_DAT_DIR)/Tourist.des", + "$(NH_DAT_DIR)/Valkyrie.des", + "$(NH_DAT_DIR)/Wizard.des", + ); + name = "Build quest levels"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(NH_DAT_DIR)/quest_levs", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/lev_comp Arch.des\n${NH_UTIL_DIR}/lev_comp Barb.des\n${NH_UTIL_DIR}/lev_comp Caveman.des\n${NH_UTIL_DIR}/lev_comp Healer.des\n${NH_UTIL_DIR}/lev_comp Knight.des\n${NH_UTIL_DIR}/lev_comp Monk.des\n${NH_UTIL_DIR}/lev_comp Priest.des\n${NH_UTIL_DIR}/lev_comp Ranger.des\n${NH_UTIL_DIR}/lev_comp Rogue.des\n${NH_UTIL_DIR}/lev_comp Samurai.des\n${NH_UTIL_DIR}/lev_comp Tourist.des\n${NH_UTIL_DIR}/lev_comp Valkyrie.des\n${NH_UTIL_DIR}/lev_comp Wizard.des\ntouch quest_levs\n"; + }; + 317E7C4E21A3697300F6E4E5 /* Build options */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -925,6 +1010,26 @@ ); inputPaths = ( "$(NH_UTIL_DIR)/makedefs", + ); + name = "Build options"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(NH_UTIL_DIR)/options", + "$(NH_INC_DIR)/date.h", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/makedefs -v\n"; + }; + 317E7C4F21A36A5700F6E4E5 /* Build engrave, epitaph and bogusmon */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( "$(NH_DAT_DIR)/engrave.txt", "$(NH_DAT_DIR)/epitaph.txt", "$(NH_DAT_DIR)/bogusmon.txt", @@ -939,29 +1044,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/makedefs -h\n"; - }; - 319B338E21A32B0800B78702 /* Build options */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "$(BUILT_PRODUCTS_DIR)/makedefs", - ); - name = "Build options"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(NH_UTIL_DIR)/makedefs", - "$(NH_INC_DIR)/date.h", - "$(NH_DAT_DIR)/options", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Type a script or drag a script file from your workspace to insert its path\ncd ${NH_UTIL_DIR}\n\ncp ${BUILT_PRODUCTS_DIR}/makedefs .\n\n# Make dat/options\n# This also will generate include/date.h\n\n./makedefs -v\n"; + shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/makedefs -s\n"; }; 319CBA3821A3458100150830 /* Build data */ = { isa = PBXShellScriptBuildPhase; @@ -982,7 +1065,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# make data from data.base\ncd ${NH_DAT_DIR}\n\n${NH_UTIL_DIR}/makedefs -d\n"; + shellScript = "# make data from data.base\ncd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/makedefs -d\n"; }; /* End PBXShellScriptBuildPhase section */ From abb59e728339c65d4e976938377f17388268d7c1 Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 14:51:24 -0800 Subject: [PATCH 42/74] Added building dungeon to xcode project. --- sys/unix/NetHack.xcodeproj/project.pbxproj | 44 ++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj index f03cc42fb..26faf3aad 100644 --- a/sys/unix/NetHack.xcodeproj/project.pbxproj +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -757,6 +757,8 @@ 31B8A43221A268DF0055BD01 /* Sources */, 31B8A43321A268DF0055BD01 /* Frameworks */, 31B8A43421A268DF0055BD01 /* CopyFiles */, + 317E7C5021A3735300F6E4E5 /* Copy dgn_comp */, + 317E7C5121A373E100F6E4E5 /* Build dungeon */, ); buildRules = ( 31B8A46721A286E70055BD01 /* PBXBuildRule */, @@ -1046,6 +1048,48 @@ shellPath = /bin/sh; shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/makedefs -s\n"; }; + 317E7C5021A3735300F6E4E5 /* Copy dgn_comp */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(BUILT_PRODUCTS_DIR)/dgn_comp", + ); + name = "Copy dgn_comp"; + outputFileListPaths = ( + ); + outputPaths = ( + "${NH_UTIL_DIR}/dgn_comp", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cp ${BUILT_PRODUCTS_DIR}/dgn_comp ${NH_UTIL_DIR}/dgn_comp\n"; + }; + 317E7C5121A373E100F6E4E5 /* Build dungeon */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(NH_UTIL_DIR)/makedefs", + "$(NH_UTIL_DIR)/dgn_comp", + "$(NH_DAT_DIR)/dungeon.pdf", + ); + name = "Build dungeon"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(NH_DAT_DIR)/dungeon", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/makedefs -e\n${NH_UTIL_DIR}/dgn_comp dungeon.pdf\n"; + }; 319CBA3821A3458100150830 /* Build data */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; From 46184c06af4e428fc4574693abeb7e566b82fb99 Mon Sep 17 00:00:00 2001 From: PatR Date: Mon, 19 Nov 2018 16:22:10 -0800 Subject: [PATCH 43/74] \#stats - delayed_killer Include memory allocated to delayed killer(s) in #stats feedback. --- src/cmd.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/cmd.c b/src/cmd.c index b2debe337..3e61a7580 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 cmd.c $NHDT-Date: 1541902950 2018/11/11 02:22:30 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.301 $ */ +/* NetHack 3.6 cmd.c $NHDT-Date: 1542673290 2018/11/20 00:21:30 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.302 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2013. */ /* NetHack may be freely redistributed. See license for details. */ @@ -3820,6 +3820,7 @@ long *total_size; int idx; struct trap *tt; struct damage *sd; /* shop damage */ + struct kinfo *k; /* delayed killer */ struct cemetery *bi; /* bones info */ /* traps and engravings are output unconditionally; @@ -3884,6 +3885,20 @@ long *total_size; putstr(win, 0, buf); } + count = size = 0L; + for (k = killer.next; k; k = k->next) { + ++count; + size += (long) sizeof *k; + } + if (count || size) { + *total_count += count; + *total_size += size; + Sprintf(hdrbuf, "delayed killer%s, size %ld", + plur(count), (long) sizeof (struct kinfo)); + Sprintf(buf, template, hdrbuf, count, size); + putstr(win, 0, buf); + } + count = size = 0L; for (bi = level.bonesinfo; bi; bi = bi->next) { ++count; From 6cf6e3c75027dd0004393e095786eac0bcf3f508 Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 16:22:16 -0800 Subject: [PATCH 44/74] Added support for building Guidebook in xcode build. --- sys/unix/NetHack.xcodeproj/project.pbxproj | 67 ++++++++++++++++++++-- 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj index 26faf3aad..4c984ce97 100644 --- a/sys/unix/NetHack.xcodeproj/project.pbxproj +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -159,6 +159,27 @@ /* End PBXBuildFile section */ /* Begin PBXBuildRule section */ + 317E7C5221A3774F00F6E4E5 /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.apple.compilers.proxy.script; + fileType = sourcecode.yacc; + isEditable = 1; + outputFiles = ( + "$(NH_INC_DIR)/lev_comp.h", + "$(NH_UTIL_DIR)/lev_yacc.c", + ); + script = "cd {NH_UTIL_DIR}\nyacc -d lev_comp.y\nsed -e 's#y.tab.c#lev_yacc.c#' -e 's#y.tab.c:#lev_yacc.c:#' y.tab.c > lev_yacc.c && rm y.tab.c\nsed -e 's#y.tab.h#lev_comp.h#' y.tab.h > ${NH_INC_DIR}/lev_comp.h && rm y.tab.h\n"; + }; + 317E7C5321A3796200F6E4E5 /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.apple.compilers.proxy.script; + fileType = sourcecode.lex; + isEditable = 1; + outputFiles = ( + "$(NH_UTIL_DIR)/lev_lex.c", + ); + script = "cd ${NH_UTIL_DIR}\nlex lev_comp.l\nsed -e 's#lex.yy.c#lev_lex.c#' -e 's# *$$##' -e 's#static void yyunput#void yyunput#' lex.yy.c > lev_lex.c && rm lex.yy.c\n"; + }; 31B8A46321A270680055BD01 /* PBXBuildRule */ = { isa = PBXBuildRule; compilerSpec = com.apple.compilers.proxy.script; @@ -167,9 +188,9 @@ isEditable = 1; outputFiles = ( "$(INPUT_FILE_DIR)/dgn_yacc.c", - "$(INPUT_FILE_DIR)/dgn_comp.h", + "$(NH_INC_DIR)/dgn_comp.h", ); - script = "cd ${INPUT_FILE_DIR}\nyacc -d dgn_comp.y\nsed -e 's#\"y.tab.c\"#\"dgn_yacc.c\"#' -e 's#y.tab.c:#dgn_yacc.c:#' y.tab.c > dgn_yacc.c && rm y.tab.c\nsed -e 's#\"y.tab.h\"#\"dgn_comp.h\"#' y.tab.h > dgn_comp.h && rm y.tab.h\necho $(FOO)\n"; + script = "cd ${INPUT_FILE_DIR}\nyacc -d dgn_comp.y\nsed -e 's#\"y.tab.c\"#\"dgn_yacc.c\"#' -e 's#y.tab.c:#dgn_yacc.c:#' y.tab.c > dgn_yacc.c && rm y.tab.c\nsed -e 's#\"y.tab.h\"#\"dgn_comp.h\"#' y.tab.h > ${NH_INC_DIR}/dgn_comp.h && rm y.tab.h\necho $(FOO)\n"; }; 31B8A46721A286E70055BD01 /* PBXBuildRule */ = { isa = PBXBuildRule; @@ -696,6 +717,7 @@ 3189576D21A1FCC100FB2ABE /* Sources */, 3189576E21A1FCC100FB2ABE /* Frameworks */, 3189576F21A1FCC100FB2ABE /* CopyFiles */, + 317E7C5421A3804400F6E4E5 /* Build Guidebook */, ); buildRules = ( ); @@ -718,7 +740,7 @@ 319CBA3821A3458100150830 /* Build data */, 317E7C4521A3548F00F6E4E5 /* Build rumors */, 317E7C4621A355E700F6E4E5 /* Build quest.dat */, - 317E7C4E21A3697300F6E4E5 /* Build options */, + 317E7C4E21A3697300F6E4E5 /* Build options and headers */, 317E7C4F21A36A5700F6E4E5 /* Build engrave, epitaph and bogusmon */, ); buildRules = ( @@ -742,6 +764,8 @@ 317E7C4D21A3649B00F6E4E5 /* Build quest levels */, ); buildRules = ( + 317E7C5321A3796200F6E4E5 /* PBXBuildRule */, + 317E7C5221A3774F00F6E4E5 /* PBXBuildRule */, ); dependencies = ( ); @@ -1003,7 +1027,7 @@ shellPath = /bin/sh; shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/lev_comp Arch.des\n${NH_UTIL_DIR}/lev_comp Barb.des\n${NH_UTIL_DIR}/lev_comp Caveman.des\n${NH_UTIL_DIR}/lev_comp Healer.des\n${NH_UTIL_DIR}/lev_comp Knight.des\n${NH_UTIL_DIR}/lev_comp Monk.des\n${NH_UTIL_DIR}/lev_comp Priest.des\n${NH_UTIL_DIR}/lev_comp Ranger.des\n${NH_UTIL_DIR}/lev_comp Rogue.des\n${NH_UTIL_DIR}/lev_comp Samurai.des\n${NH_UTIL_DIR}/lev_comp Tourist.des\n${NH_UTIL_DIR}/lev_comp Valkyrie.des\n${NH_UTIL_DIR}/lev_comp Wizard.des\ntouch quest_levs\n"; }; - 317E7C4E21A3697300F6E4E5 /* Build options */ = { + 317E7C4E21A3697300F6E4E5 /* Build options and headers */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1013,16 +1037,20 @@ inputPaths = ( "$(NH_UTIL_DIR)/makedefs", ); - name = "Build options"; + name = "Build options and headers"; outputFileListPaths = ( ); outputPaths = ( "$(NH_UTIL_DIR)/options", "$(NH_INC_DIR)/date.h", + "$(NH_INC_DIR)/onames.h", + "$(NH_INC_DIR)/pm.h", + "$(NH_INC_DIR)/vis_tab.h", + "$(NH_SRC_DIR)/vis_tab.c", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/makedefs -v\n"; + shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/makedefs -v\ncd ${NH_UTIL_DIR}\n./makedefs -o\n./makedefs -p\n./makedefs -z\n"; }; 317E7C4F21A36A5700F6E4E5 /* Build engrave, epitaph and bogusmon */ = { isa = PBXShellScriptBuildPhase; @@ -1090,6 +1118,29 @@ shellPath = /bin/sh; shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/makedefs -e\n${NH_UTIL_DIR}/dgn_comp dungeon.pdf\n"; }; + 317E7C5421A3804400F6E4E5 /* Build Guidebook */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(NH_UTIL_DIR)/makedefs", + "$(NH_DOC_DIR)/Guidebook.mn", + "$(NH_DOC_DIR)/tmac.n", + "$(NH_DOC_DIR)/tmac.nh", + ); + name = "Build Guidebook"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(NH_DOC_DIR)/Guidebook", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd ${NH_DOC_DIR}\ncat Guidebook.mn | ${NH_UTIL_DIR}/makedefs --grep --input - --output - | tbl tmac.n - | nroff -c -Tascii | col -bx > Guidebook\n"; + }; 319CBA3821A3458100150830 /* Build data */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1372,8 +1423,10 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; NH_DAT_DIR = "$(SOURCE_ROOT)/../../dat"; + NH_DOC_DIR = "$(SOURCE_ROOT)/../../doc"; NH_INC_DIR = "$(SOURCE_ROOT)/../../include"; NH_ROOT = "$(SOURCE_ROOT)/../.."; + NH_SRC_DIR = "$(SOURCE_ROOT)/../../src"; NH_UTIL_DIR = "$(SOURCE_ROOT)/../../util"; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = ( @@ -1443,8 +1496,10 @@ MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; NH_DAT_DIR = "$(SOURCE_ROOT)/../../dat"; + NH_DOC_DIR = "$(SOURCE_ROOT)/../../doc"; NH_INC_DIR = "$(SOURCE_ROOT)/../../include"; NH_ROOT = "$(SOURCE_ROOT)/../.."; + NH_SRC_DIR = "$(SOURCE_ROOT)/../../src"; NH_UTIL_DIR = "$(SOURCE_ROOT)/../../util"; OTHER_CFLAGS = ( "-DNOMAIL", From ffac5f1a65a427591f2b3166eb6f7811ac19550c Mon Sep 17 00:00:00 2001 From: PatR Date: Mon, 19 Nov 2018 16:24:10 -0800 Subject: [PATCH 45/74] life-saving vs sickness Replace an old instance of direct manipulation of an intrinsic. If life-saving occurs 1 turn before sickness will kill the hero, the sickness if cured. But it was leaving delated_killer for SICK allocated. Harmless but a bug none the less. --- src/end.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/end.c b/src/end.c index a2f8967d0..7d89bd03a 100644 --- a/src/end.c +++ b/src/end.c @@ -861,8 +861,7 @@ int how; } /* cure impending doom of sickness hero won't have time to fix */ if ((Sick & TIMEOUT) == 1L) { - u.usick_type = 0; - set_itimeout(&Sick, 0L); + make_sick(0L, (char *) 0, FALSE, SICK_ALL); } if (how == CHOKING) init_uhunger(); @@ -2051,10 +2050,11 @@ struct kinfo *kptr; } if (k == (struct kinfo *) 0) { - impossible("dealloc_killer not on list"); + impossible("dealloc_killer (#%d) not on list", kptr->id); } else { prev->next = k->next; free((genericptr_t) k); + debugpline1("freed delayed killer #%d", kptr->id); } } @@ -2067,7 +2067,7 @@ int mode; if (perform_bwrite(mode)) { for (kptr = &killer; kptr != (struct kinfo *) 0; kptr = kptr->next) { - bwrite(fd, (genericptr_t) kptr, sizeof(struct kinfo)); + bwrite(fd, (genericptr_t) kptr, sizeof (struct kinfo)); } } if (release_data(mode)) { @@ -2086,9 +2086,9 @@ int fd; struct kinfo *kptr; for (kptr = &killer; kptr != (struct kinfo *) 0; kptr = kptr->next) { - mread(fd, (genericptr_t) kptr, sizeof(struct kinfo)); + mread(fd, (genericptr_t) kptr, sizeof (struct kinfo)); if (kptr->next) { - kptr->next = (struct kinfo *) alloc(sizeof(struct kinfo)); + kptr->next = (struct kinfo *) alloc(sizeof (struct kinfo)); } } } From dd9ca9202cf8d997316eb8c7bbe279bcb5c06bfd Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 16:54:31 -0800 Subject: [PATCH 46/74] Added building of nhdat to xcode project. --- sys/unix/NetHack.xcodeproj/project.pbxproj | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj index 4c984ce97..ecbe15cad 100644 --- a/sys/unix/NetHack.xcodeproj/project.pbxproj +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -718,6 +718,7 @@ 3189576E21A1FCC100FB2ABE /* Frameworks */, 3189576F21A1FCC100FB2ABE /* CopyFiles */, 317E7C5421A3804400F6E4E5 /* Build Guidebook */, + 317E7C5521A3912D00F6E4E5 /* Build nhdat */, ); buildRules = ( ); @@ -1141,6 +1142,26 @@ shellPath = /bin/sh; shellScript = "cd ${NH_DOC_DIR}\ncat Guidebook.mn | ${NH_UTIL_DIR}/makedefs --grep --input - --output - | tbl tmac.n - | nroff -c -Tascii | col -bx > Guidebook\n"; }; + 317E7C5521A3912D00F6E4E5 /* Build nhdat */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(NH_DAT_DIR)/help", + ); + name = "Build nhdat"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(NH_DAT_DIR)/nhdat", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/dlb cf nhdat help hh cmdhelp keyhelp history opthelp wizhelp dungeon tribute asmodeus.lev baalz.lev bigrm-*.lev castle.lev fakewiz?.lev juiblex.lev knox.lev medusa-?.lev minend-?.lev minefill.lev minetn-?.lev oracle.lev orcus.lev sanctum.lev soko?-?.lev tower?.lev valley.lev wizard?.lev astral.lev air.lev earth.lev fire.lev water.lev ???-goal.lev ???-fil?.lev ???-loca.lev ???-strt.lev bogusmon data engrave epitaph oracles options quest.dat rumors\n\n"; + }; 319CBA3821A3458100150830 /* Build data */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; From 1af98716f25027fc82be1b78b153fdce4a9d1f86 Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 17:23:04 -0800 Subject: [PATCH 47/74] Added the building of nhdat to xcode project. --- sys/unix/NetHack.xcodeproj/project.pbxproj | 136 +++++++++++++++++++++ 1 file changed, 136 insertions(+) diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj index ecbe15cad..9ee78b829 100644 --- a/sys/unix/NetHack.xcodeproj/project.pbxproj +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -1150,7 +1150,143 @@ inputFileListPaths = ( ); inputPaths = ( + "$(NH_DAT_DIR)/Arc-fila.lev", + "$(NH_DAT_DIR)/Arc-filb.lev", + "$(NH_DAT_DIR)/Arc-goal.lev", + "$(NH_DAT_DIR)/Arc-loca.lev", + "$(NH_DAT_DIR)/Arc-strt.lev", + "$(NH_DAT_DIR)/Bar-fila.lev", + "$(NH_DAT_DIR)/Bar-filb.lev", + "$(NH_DAT_DIR)/Bar-goal.lev", + "$(NH_DAT_DIR)/Bar-loca.lev", + "$(NH_DAT_DIR)/Bar-strt.lev", + "$(NH_DAT_DIR)/Cav-fila.lev", + "$(NH_DAT_DIR)/Cav-filb.lev", + "$(NH_DAT_DIR)/Cav-goal.lev", + "$(NH_DAT_DIR)/Cav-loca.lev", + "$(NH_DAT_DIR)/Cav-strt.lev", + "$(NH_DAT_DIR)/Hea-fila.lev", + "$(NH_DAT_DIR)/Hea-filb.lev", + "$(NH_DAT_DIR)/Hea-goal.lev", + "$(NH_DAT_DIR)/Hea-loca.lev", + "$(NH_DAT_DIR)/Hea-strt.lev", + "$(NH_DAT_DIR)/Kni-fila.lev", + "$(NH_DAT_DIR)/Kni-filb.lev", + "$(NH_DAT_DIR)/Kni-goal.lev", + "$(NH_DAT_DIR)/Kni-loca.lev", + "$(NH_DAT_DIR)/Kni-strt.lev", + "$(NH_DAT_DIR)/Mon-fila.lev", + "$(NH_DAT_DIR)/Mon-filb.lev", + "$(NH_DAT_DIR)/Mon-goal.lev", + "$(NH_DAT_DIR)/Mon-loca.lev", + "$(NH_DAT_DIR)/Mon-strt.lev", + "$(NH_DAT_DIR)/Pri-fila.lev", + "$(NH_DAT_DIR)/Pri-filb.lev", + "$(NH_DAT_DIR)/Pri-goal.lev", + "$(NH_DAT_DIR)/Pri-loca.lev", + "$(NH_DAT_DIR)/Pri-strt.lev", + "$(NH_DAT_DIR)/Ran-fila.lev", + "$(NH_DAT_DIR)/Ran-filb.lev", + "$(NH_DAT_DIR)/Ran-goal.lev", + "$(NH_DAT_DIR)/Ran-loca.lev", + "$(NH_DAT_DIR)/Ran-strt.lev", + "$(NH_DAT_DIR)/Rog-fila.lev", + "$(NH_DAT_DIR)/Rog-filb.lev", + "$(NH_DAT_DIR)/Rog-goal.lev", + "$(NH_DAT_DIR)/Rog-loca.lev", + "$(NH_DAT_DIR)/Rog-strt.lev", + "$(NH_DAT_DIR)/Sam-fila.lev", + "$(NH_DAT_DIR)/Sam-filb.lev", + "$(NH_DAT_DIR)/Sam-goal.lev", + "$(NH_DAT_DIR)/Sam-loca.lev", + "$(NH_DAT_DIR)/Sam-strt.lev", + "$(NH_DAT_DIR)/Tou-fila.lev", + "$(NH_DAT_DIR)/Tou-filb.lev", + "$(NH_DAT_DIR)/Tou-goal.lev", + "$(NH_DAT_DIR)/Tou-loca.lev", + "$(NH_DAT_DIR)/Tou-strt.lev", + "$(NH_DAT_DIR)/Val-fila.lev", + "$(NH_DAT_DIR)/Val-filb.lev", + "$(NH_DAT_DIR)/Val-goal.lev", + "$(NH_DAT_DIR)/Val-loca.lev", + "$(NH_DAT_DIR)/Val-strt.lev", + "$(NH_DAT_DIR)/Wiz-fila.lev", + "$(NH_DAT_DIR)/Wiz-filb.lev", + "$(NH_DAT_DIR)/Wiz-goal.lev", + "$(NH_DAT_DIR)/Wiz-loca.lev", + "$(NH_DAT_DIR)/Wiz-strt.lev", + "$(NH_DAT_DIR)/air.lev", + "$(NH_DAT_DIR)/asmodeus.lev", + "$(NH_DAT_DIR)/astral.lev", + "$(NH_DAT_DIR)/baalz.lev", + "$(NH_DAT_DIR)/bigrm-1.lev", + "$(NH_DAT_DIR)/bigrm-10.lev", + "$(NH_DAT_DIR)/bigrm-2.lev", + "$(NH_DAT_DIR)/bigrm-3.lev", + "$(NH_DAT_DIR)/bigrm-4.lev", + "$(NH_DAT_DIR)/bigrm-5.lev", + "$(NH_DAT_DIR)/bigrm-6.lev", + "$(NH_DAT_DIR)/bigrm-7.lev", + "$(NH_DAT_DIR)/bigrm-8.lev", + "$(NH_DAT_DIR)/bigrm-9.lev", + "$(NH_DAT_DIR)/bogusmon", + "$(NH_DAT_DIR)/castle.lev", + "$(NH_DAT_DIR)/cmdhelp", + "$(NH_DAT_DIR)/data", + "$(NH_DAT_DIR)/dungeon", + "$(NH_DAT_DIR)/earth.lev", + "$(NH_DAT_DIR)/engrave", + "$(NH_DAT_DIR)/epitaph", + "$(NH_DAT_DIR)/fakewiz1.lev", + "$(NH_DAT_DIR)/fakewiz2.lev", + "$(NH_DAT_DIR)/fire.lev", "$(NH_DAT_DIR)/help", + "$(NH_DAT_DIR)/hh", + "$(NH_DAT_DIR)/history", + "$(NH_DAT_DIR)/juiblex.lev", + "$(NH_DAT_DIR)/keyhelp", + "$(NH_DAT_DIR)/knox.lev", + "$(NH_DAT_DIR)/medusa-1.lev", + "$(NH_DAT_DIR)/medusa-2.lev", + "$(NH_DAT_DIR)/medusa-3.lev", + "$(NH_DAT_DIR)/medusa-4.lev", + "$(NH_DAT_DIR)/minefill.lev", + "$(NH_DAT_DIR)/minend-1.lev", + "$(NH_DAT_DIR)/minend-2.lev", + "$(NH_DAT_DIR)/minend-3.lev", + "$(NH_DAT_DIR)/minetn-1.lev", + "$(NH_DAT_DIR)/minetn-2.lev", + "$(NH_DAT_DIR)/minetn-3.lev", + "$(NH_DAT_DIR)/minetn-4.lev", + "$(NH_DAT_DIR)/minetn-5.lev", + "$(NH_DAT_DIR)/minetn-6.lev", + "$(NH_DAT_DIR)/minetn-7.lev", + "$(NH_DAT_DIR)/opthelp", + "$(NH_DAT_DIR)/options", + "$(NH_DAT_DIR)/oracle.lev", + "$(NH_DAT_DIR)/oracles", + "$(NH_DAT_DIR)/orcus.lev", + "$(NH_DAT_DIR)/quest.dat", + "$(NH_DAT_DIR)/rumors", + "$(NH_DAT_DIR)/sanctum.lev", + "$(NH_DAT_DIR)/soko1-1.lev", + "$(NH_DAT_DIR)/soko1-2.lev", + "$(NH_DAT_DIR)/soko2-1.lev", + "$(NH_DAT_DIR)/soko2-2.lev", + "$(NH_DAT_DIR)/soko3-1.lev", + "$(NH_DAT_DIR)/soko3-2.lev", + "$(NH_DAT_DIR)/soko4-1.lev", + "$(NH_DAT_DIR)/soko4-2.lev", + "$(NH_DAT_DIR)/tower1.lev", + "$(NH_DAT_DIR)/tower2.lev", + "$(NH_DAT_DIR)/tower3.lev", + "$(NH_DAT_DIR)/tribute", + "$(NH_DAT_DIR)/valley.lev", + "$(NH_DAT_DIR)/water.lev", + "$(NH_DAT_DIR)/wizard1.lev", + "$(NH_DAT_DIR)/wizard2.lev", + "$(NH_DAT_DIR)/wizard3.lev", + "$(NH_DAT_DIR)/wizhelp", ); name = "Build nhdat"; outputFileListPaths = ( From a68a8f21d4216b92858244d8faf7c23075591d06 Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 19:48:01 -0800 Subject: [PATCH 48/74] Full build of nethack now supported in xcode. --- sys/unix/NetHack.xcodeproj/project.pbxproj | 195 +++++++++++++++++++-- 1 file changed, 177 insertions(+), 18 deletions(-) diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj index 9ee78b829..982f03319 100644 --- a/sys/unix/NetHack.xcodeproj/project.pbxproj +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 3192867C21A3ACAC00325BEB /* lev_comp.y in Sources */ = {isa = PBXBuildFile; fileRef = 3192867B21A3ACAB00325BEB /* lev_comp.y */; }; + 3192867E21A3ACB800325BEB /* lev_comp.l in Sources */ = {isa = PBXBuildFile; fileRef = 3192867D21A3ACB800325BEB /* lev_comp.l */; }; 31B8A30C21A20D8B0055BD01 /* makedefs.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A30B21A20D8B0055BD01 /* makedefs.c */; }; 31B8A30F21A20DC10055BD01 /* objects.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A30D21A20DC10055BD01 /* objects.c */; }; 31B8A31021A20DC10055BD01 /* monst.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A30E21A20DC10055BD01 /* monst.c */; }; @@ -168,7 +170,7 @@ "$(NH_INC_DIR)/lev_comp.h", "$(NH_UTIL_DIR)/lev_yacc.c", ); - script = "cd {NH_UTIL_DIR}\nyacc -d lev_comp.y\nsed -e 's#y.tab.c#lev_yacc.c#' -e 's#y.tab.c:#lev_yacc.c:#' y.tab.c > lev_yacc.c && rm y.tab.c\nsed -e 's#y.tab.h#lev_comp.h#' y.tab.h > ${NH_INC_DIR}/lev_comp.h && rm y.tab.h\n"; + script = "cd ${NH_UTIL_DIR}\nbison -o lev_yacc.c -d lev_comp.y\nmv lev_yacc.h ${NH_INC_DIR}/lev_comp.h \n"; }; 317E7C5321A3796200F6E4E5 /* PBXBuildRule */ = { isa = PBXBuildRule; @@ -178,7 +180,7 @@ outputFiles = ( "$(NH_UTIL_DIR)/lev_lex.c", ); - script = "cd ${NH_UTIL_DIR}\nlex lev_comp.l\nsed -e 's#lex.yy.c#lev_lex.c#' -e 's# *$$##' -e 's#static void yyunput#void yyunput#' lex.yy.c > lev_lex.c && rm lex.yy.c\n"; + script = "cd ${NH_UTIL_DIR}\nlex -o lev_lex.c lev_comp.l\nsed -e 's# *$$##' -e 's#static void yyunput#void yyunput#' lev_lex.c > lev_lex.x\nmv lev_lex.x lev_lex.c\n"; }; 31B8A46321A270680055BD01 /* PBXBuildRule */ = { isa = PBXBuildRule; @@ -187,10 +189,10 @@ fileType = sourcecode.yacc; isEditable = 1; outputFiles = ( - "$(INPUT_FILE_DIR)/dgn_yacc.c", + "$(NH_UTIL_DIR)/dgn_yacc.c", "$(NH_INC_DIR)/dgn_comp.h", ); - script = "cd ${INPUT_FILE_DIR}\nyacc -d dgn_comp.y\nsed -e 's#\"y.tab.c\"#\"dgn_yacc.c\"#' -e 's#y.tab.c:#dgn_yacc.c:#' y.tab.c > dgn_yacc.c && rm y.tab.c\nsed -e 's#\"y.tab.h\"#\"dgn_comp.h\"#' y.tab.h > ${NH_INC_DIR}/dgn_comp.h && rm y.tab.h\necho $(FOO)\n"; + script = "cd ${NH_UTIL_DIR}\nbison -o dgn_yacc.c -d dgn_comp.y\nmv dgn_yacc.h ${NH_INC_DIR}/dgn_comp.h \n"; }; 31B8A46721A286E70055BD01 /* PBXBuildRule */ = { isa = PBXBuildRule; @@ -198,13 +200,41 @@ fileType = sourcecode.lex; isEditable = 1; outputFiles = ( - "$(INPUT_FILE_DIR)/dgn_lex.c", + "$(NH_UTIL_DIR)/dgn_lex.c", ); - script = "cd ${INPUT_FILE_DIR}\nlex dgn_comp.l\nsed -e 's#lex.yy.c#dgn_lex.c#' -e 's# *$$##' -e 's#static void yyunput#void yyunput#' lex.yy.c > dgn_lex.c && rm lex.yy.c\n"; + script = "cd ${NH_UTIL_DIR}\nlex -o dgn_lex.c dgn_comp.l\nsed -e 's# *$$##' -e 's#static void yyunput#void yyunput#' dgn_lex.c > dgn_lex.x\nmv dgn_lex.x dgn_lex.c\n"; }; /* End PBXBuildRule section */ /* Begin PBXContainerItemProxy section */ + 3192867321A3AAFA00325BEB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3189576921A1FCC100FB2ABE /* Project object */; + proxyType = 1; + remoteGlobalIDString = 31B8A44921A26A4B0055BD01; + remoteInfo = recover; + }; + 3192867521A3AAFE00325BEB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3189576921A1FCC100FB2ABE /* Project object */; + proxyType = 1; + remoteGlobalIDString = 31B8A45621A26A970055BD01; + remoteInfo = dlb; + }; + 3192867721A3AB0400325BEB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3189576921A1FCC100FB2ABE /* Project object */; + proxyType = 1; + remoteGlobalIDString = 31B8A43521A268DF0055BD01; + remoteInfo = dgn_comp; + }; + 3192867921A3AB0800325BEB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3189576921A1FCC100FB2ABE /* Project object */; + proxyType = 1; + remoteGlobalIDString = 31B8A41D21A2669A0055BD01; + remoteInfo = lev_comp; + }; 31B8A31321A2355C0055BD01 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 3189576921A1FCC100FB2ABE /* Project object */; @@ -274,6 +304,8 @@ /* Begin PBXFileReference section */ 3189577121A1FCC100FB2ABE /* NetHack */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = NetHack; sourceTree = BUILT_PRODUCTS_DIR; }; 3189577F21A1FDA400FB2ABE /* makedefs */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = makedefs; sourceTree = BUILT_PRODUCTS_DIR; }; + 3192867B21A3ACAB00325BEB /* lev_comp.y */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.yacc; name = lev_comp.y; path = ../../util/lev_comp.y; sourceTree = ""; }; + 3192867D21A3ACB800325BEB /* lev_comp.l */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.lex; name = lev_comp.l; path = ../../util/lev_comp.l; sourceTree = ""; }; 31B8A30A21A20D730055BD01 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = config.h; path = ../../include/config.h; sourceTree = ""; }; 31B8A30B21A20D8B0055BD01 /* makedefs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = makedefs.c; path = ../../util/makedefs.c; sourceTree = ""; }; 31B8A30D21A20DC10055BD01 /* objects.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = objects.c; path = ../../src/objects.c; sourceTree = ""; }; @@ -611,6 +643,8 @@ 3189579321A200EC00FB2ABE /* util */ = { isa = PBXGroup; children = ( + 3192867D21A3ACB800325BEB /* lev_comp.l */, + 3192867B21A3ACAB00325BEB /* lev_comp.y */, 31B8A46421A278AC0055BD01 /* dgn_comp.y */, 31B8A45F21A26AE70055BD01 /* dlb_main.c */, 31B8A45121A26A750055BD01 /* recover.c */, @@ -717,13 +751,19 @@ 3189576D21A1FCC100FB2ABE /* Sources */, 3189576E21A1FCC100FB2ABE /* Frameworks */, 3189576F21A1FCC100FB2ABE /* CopyFiles */, + 3192867121A3A2D500325BEB /* Copy nethack */, 317E7C5421A3804400F6E4E5 /* Build Guidebook */, 317E7C5521A3912D00F6E4E5 /* Build nhdat */, + 3192867021A39F6A00325BEB /* Install */, ); buildRules = ( ); dependencies = ( 31B8A31421A2355C0055BD01 /* PBXTargetDependency */, + 3192867A21A3AB0800325BEB /* PBXTargetDependency */, + 3192867821A3AB0400325BEB /* PBXTargetDependency */, + 3192867621A3AAFE00325BEB /* PBXTargetDependency */, + 3192867421A3AAFA00325BEB /* PBXTargetDependency */, ); name = NetHack; productName = NetHack; @@ -743,6 +783,7 @@ 317E7C4621A355E700F6E4E5 /* Build quest.dat */, 317E7C4E21A3697300F6E4E5 /* Build options and headers */, 317E7C4F21A36A5700F6E4E5 /* Build engrave, epitaph and bogusmon */, + 3192867F21A3AF8000325BEB /* Build oracles */, ); buildRules = ( ); @@ -820,6 +861,7 @@ 31B8A45321A26A970055BD01 /* Sources */, 31B8A45421A26A970055BD01 /* Frameworks */, 31B8A45521A26A970055BD01 /* CopyFiles */, + 3192867221A3AA5700325BEB /* copy dlb */, ); buildRules = ( ); @@ -1298,6 +1340,97 @@ shellPath = /bin/sh; shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/dlb cf nhdat help hh cmdhelp keyhelp history opthelp wizhelp dungeon tribute asmodeus.lev baalz.lev bigrm-*.lev castle.lev fakewiz?.lev juiblex.lev knox.lev medusa-?.lev minend-?.lev minefill.lev minetn-?.lev oracle.lev orcus.lev sanctum.lev soko?-?.lev tower?.lev valley.lev wizard?.lev astral.lev air.lev earth.lev fire.lev water.lev ???-goal.lev ???-fil?.lev ???-loca.lev ???-strt.lev bogusmon data engrave epitaph oracles options quest.dat rumors\n\n"; }; + 3192867021A39F6A00325BEB /* Install */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(NH_DAT_DIR)/nhdat", + "$(NH_DAT_DIR)/license", + "$(NH_DAT_DIR)/symbols", + "$(NH_SRC_DIR)/nethack", + "$(NH_UTIL_DIR)/recover", + "$(NH_UNIX_DIR)/sysconf", + "$(NH_UNIX_DIR)/hints/macosx.sh", + ); + name = Install; + outputFileListPaths = ( + ); + outputPaths = ( + "$(NH_INSTALL_DIR)/nhdat", + "$(NH_INSTALL_DIR)/licenses", + "$(NH_INSTALL_DIR)/symbols", + "$(NH_INSTALL_DIR)/nethack", + "$(NH_INSTALL_DIR)/recover", + "$(NH_INSTALL_DIR)/sysconf", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "mkdir -p ${NH_INSTALL_DIR}/save\ncd ${NH_DAT_DIR}\ncp nhdat license symbols ${NH_INSTALL_DIR}\ncp ${NH_SRC_DIR}/nethack ${NH_INSTALL_DIR}\ncp ${NH_UTIL_DIR}/recover ${NH_INSTALL_DIR}\ntouch ${NH_INSTALL_DIR}/perm\ntouch ${NH_INSTALL_DIR}/record\ntouch ${NH_INSTALL_DIR}/logfile\ntouch ${NH_INSTALL_DIR}/xlogfile\ncd ${NH_ROOT_DIR}\nsys/unix/hints/macosx.sh editsysconf sys/unix/sysconf ${NH_INSTALL_DIR}/sysconf\n"; + }; + 3192867121A3A2D500325BEB /* Copy nethack */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(BUILT_PRODUCTS_DIR)/nethack", + ); + name = "Copy nethack"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(NH_SRC_DIR)/nethack", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cp ${BUILT_PRODUCTS_DIR}/nethack ${NH_SRC_DIR}/nethack\n"; + }; + 3192867221A3AA5700325BEB /* copy dlb */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${BUILT_PRODUCTS_DIR}/dlb", + ); + name = "copy dlb"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(NH_UTIL_DIR)/dlb", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cp ${BUILT_PRODUCTS_DIR}/dlb ${NH_UTIL_DIR}/dlb\n"; + }; + 3192867F21A3AF8000325BEB /* Build oracles */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(NH_DAT_DIR)/oracles.txt", + ); + name = "Build oracles"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(NH_DAT_DIR)/oracles", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd ${NH_DAT_DIR}\n${NH_UTIL_DIR}/makedefs -h\n"; + }; 319CBA3821A3458100150830 /* Build data */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1469,12 +1602,14 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 3192867C21A3ACAC00325BEB /* lev_comp.y in Sources */, 31B8A42B21A267E60055BD01 /* panic.c in Sources */, 31B8A43021A268370055BD01 /* monst.c in Sources */, 31B8A42921A267E60055BD01 /* lev_yacc.c in Sources */, 31B8A42C21A267E60055BD01 /* lev_main.c in Sources */, 31B8A42D21A267F50055BD01 /* alloc.c in Sources */, 31B8A42E21A2680B0055BD01 /* drawing.c in Sources */, + 3192867E21A3ACB800325BEB /* lev_comp.l in Sources */, 31B8A42A21A267E60055BD01 /* lev_lex.c in Sources */, 31B8A43121A268420055BD01 /* objects.c in Sources */, 31B8A42F21A2681E0055BD01 /* decl.c in Sources */, @@ -1515,6 +1650,26 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 3192867421A3AAFA00325BEB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 31B8A44921A26A4B0055BD01 /* recover */; + targetProxy = 3192867321A3AAFA00325BEB /* PBXContainerItemProxy */; + }; + 3192867621A3AAFE00325BEB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 31B8A45621A26A970055BD01 /* dlb */; + targetProxy = 3192867521A3AAFE00325BEB /* PBXContainerItemProxy */; + }; + 3192867821A3AB0400325BEB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 31B8A43521A268DF0055BD01 /* dgn_comp */; + targetProxy = 3192867721A3AB0400325BEB /* PBXContainerItemProxy */; + }; + 3192867A21A3AB0800325BEB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 31B8A41D21A2669A0055BD01 /* lev_comp */; + targetProxy = 3192867921A3AB0800325BEB /* PBXContainerItemProxy */; + }; 31B8A31421A2355C0055BD01 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 3189577E21A1FDA400FB2ABE /* makedefs */; @@ -1579,12 +1734,14 @@ MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; - NH_DAT_DIR = "$(SOURCE_ROOT)/../../dat"; - NH_DOC_DIR = "$(SOURCE_ROOT)/../../doc"; - NH_INC_DIR = "$(SOURCE_ROOT)/../../include"; - NH_ROOT = "$(SOURCE_ROOT)/../.."; - NH_SRC_DIR = "$(SOURCE_ROOT)/../../src"; - NH_UTIL_DIR = "$(SOURCE_ROOT)/../../util"; + NH_DAT_DIR = "$(NH_ROOT_DIR)/dat"; + NH_DOC_DIR = "$(NH_ROOT_DIR)/doc"; + NH_INC_DIR = "$(NH_ROOT_DIR)/include"; + NH_INSTALL_DIR = "$(HOME)/nethackdir"; + NH_ROOT_DIR = "$(SOURCE_ROOT)/../.."; + NH_SRC_DIR = "$(NH_ROOT_DIR)/src"; + NH_UNIX_DIR = "$(NH_ROOT_DIR)/sys/unix"; + NH_UTIL_DIR = "$(NH_ROOT_DIR)/util"; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = ( "-DNOMAIL", @@ -1652,12 +1809,14 @@ MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - NH_DAT_DIR = "$(SOURCE_ROOT)/../../dat"; - NH_DOC_DIR = "$(SOURCE_ROOT)/../../doc"; - NH_INC_DIR = "$(SOURCE_ROOT)/../../include"; - NH_ROOT = "$(SOURCE_ROOT)/../.."; - NH_SRC_DIR = "$(SOURCE_ROOT)/../../src"; - NH_UTIL_DIR = "$(SOURCE_ROOT)/../../util"; + NH_DAT_DIR = "$(NH_ROOT_DIR)/dat"; + NH_DOC_DIR = "$(NH_ROOT_DIR)/doc"; + NH_INC_DIR = "$(NH_ROOT_DIR)/include"; + NH_INSTALL_DIR = "$(HOME)/nethackdir"; + NH_ROOT_DIR = "$(SOURCE_ROOT)/../.."; + NH_SRC_DIR = "$(NH_ROOT_DIR)/src"; + NH_UNIX_DIR = "$(NH_ROOT_DIR)/sys/unix"; + NH_UTIL_DIR = "$(NH_ROOT_DIR)/util"; OTHER_CFLAGS = ( "-DNOMAIL", "-DNOTPARMDECL", From 9f8b419ec82eadf107f34c2dc592f8f988a0b406 Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 19:58:21 -0800 Subject: [PATCH 49/74] Added necessary build dependencies for xcode project. --- sys/unix/NetHack.xcodeproj/project.pbxproj | 52 ++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj index 982f03319..be5ae1524 100644 --- a/sys/unix/NetHack.xcodeproj/project.pbxproj +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -207,6 +207,34 @@ /* End PBXBuildRule section */ /* Begin PBXContainerItemProxy section */ + 316B91C621A3BD5000EC3E81 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3189576921A1FCC100FB2ABE /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3189577E21A1FDA400FB2ABE; + remoteInfo = makedefs; + }; + 316B91C821A3BD5C00EC3E81 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3189576921A1FCC100FB2ABE /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3189577E21A1FDA400FB2ABE; + remoteInfo = makedefs; + }; + 316B91CA21A3BD7C00EC3E81 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3189576921A1FCC100FB2ABE /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3189577E21A1FDA400FB2ABE; + remoteInfo = makedefs; + }; + 316B91CC21A3BD8F00EC3E81 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3189576921A1FCC100FB2ABE /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3189577E21A1FDA400FB2ABE; + remoteInfo = makedefs; + }; 3192867321A3AAFA00325BEB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 3189576921A1FCC100FB2ABE /* Project object */; @@ -810,6 +838,7 @@ 317E7C5221A3774F00F6E4E5 /* PBXBuildRule */, ); dependencies = ( + 316B91C921A3BD5C00EC3E81 /* PBXTargetDependency */, ); name = lev_comp; productName = lev_comp; @@ -831,6 +860,7 @@ 31B8A46321A270680055BD01 /* PBXBuildRule */, ); dependencies = ( + 316B91C721A3BD5000EC3E81 /* PBXTargetDependency */, ); name = dgn_comp; productName = dgn_comp; @@ -848,6 +878,7 @@ buildRules = ( ); dependencies = ( + 316B91CD21A3BD8F00EC3E81 /* PBXTargetDependency */, ); name = recover; productName = recover; @@ -866,6 +897,7 @@ buildRules = ( ); dependencies = ( + 316B91CB21A3BD7C00EC3E81 /* PBXTargetDependency */, ); name = dlb; productName = dlb; @@ -1650,6 +1682,26 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 316B91C721A3BD5000EC3E81 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3189577E21A1FDA400FB2ABE /* makedefs */; + targetProxy = 316B91C621A3BD5000EC3E81 /* PBXContainerItemProxy */; + }; + 316B91C921A3BD5C00EC3E81 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3189577E21A1FDA400FB2ABE /* makedefs */; + targetProxy = 316B91C821A3BD5C00EC3E81 /* PBXContainerItemProxy */; + }; + 316B91CB21A3BD7C00EC3E81 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3189577E21A1FDA400FB2ABE /* makedefs */; + targetProxy = 316B91CA21A3BD7C00EC3E81 /* PBXContainerItemProxy */; + }; + 316B91CD21A3BD8F00EC3E81 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3189577E21A1FDA400FB2ABE /* makedefs */; + targetProxy = 316B91CC21A3BD8F00EC3E81 /* PBXContainerItemProxy */; + }; 3192867421A3AAFA00325BEB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 31B8A44921A26A4B0055BD01 /* recover */; From f768197074289b7e0852be2803b1e49d00218334 Mon Sep 17 00:00:00 2001 From: Groot Date: Tue, 20 Nov 2018 01:14:18 -0800 Subject: [PATCH 50/74] Created mechanism to provide development team ID which is git friendly. Please see XCodeConfig.xcconfig for details. --- sys/unix/.gitignore | 1 + sys/unix/NetHack.xcodeproj/project.pbxproj | 16 +--- .../xcshareddata/xcschemes/recover.xcscheme | 91 +++++++++++++++++++ sys/unix/XCode.xcconfig | 38 ++++++++ 4 files changed, 134 insertions(+), 12 deletions(-) create mode 100644 sys/unix/.gitignore create mode 100644 sys/unix/NetHack.xcodeproj/xcshareddata/xcschemes/recover.xcscheme create mode 100644 sys/unix/XCode.xcconfig diff --git a/sys/unix/.gitignore b/sys/unix/.gitignore new file mode 100644 index 000000000..775181f34 --- /dev/null +++ b/sys/unix/.gitignore @@ -0,0 +1 @@ +XCodeLocal.xcconfig diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj index be5ae1524..48bce7083 100644 --- a/sys/unix/NetHack.xcodeproj/project.pbxproj +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -330,6 +330,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 2A953FB221A3F404007906E5 /* XCode.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = XCode.xcconfig; sourceTree = ""; }; 3189577121A1FCC100FB2ABE /* NetHack */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = NetHack; sourceTree = BUILT_PRODUCTS_DIR; }; 3189577F21A1FDA400FB2ABE /* makedefs */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = makedefs; sourceTree = BUILT_PRODUCTS_DIR; }; 3192867B21A3ACAB00325BEB /* lev_comp.y */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.yacc; name = lev_comp.y; path = ../../util/lev_comp.y; sourceTree = ""; }; @@ -530,6 +531,7 @@ 3189576821A1FCC100FB2ABE = { isa = PBXGroup; children = ( + 2A953FB221A3F404007906E5 /* XCode.xcconfig */, 31B8A3F821A23E490055BD01 /* win */, 31B8A3E921A23CC40055BD01 /* sys */, 3189579621A2046700FB2ABE /* include */, @@ -1732,6 +1734,7 @@ /* Begin XCBuildConfiguration section */ 3189577621A1FCC100FB2ABE /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 2A953FB221A3F404007906E5 /* XCode.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -1813,6 +1816,7 @@ }; 3189577721A1FCC100FB2ABE /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 2A953FB221A3F404007906E5 /* XCode.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -1889,7 +1893,6 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = T4L96T5775; OTHER_CFLAGS = ( "-DNOMAIL", "-DNOTPARMDECL", @@ -1910,7 +1913,6 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = T4L96T5775; OTHER_CFLAGS = ( "-DNOMAIL", "-DNOTPARMDECL", @@ -1931,7 +1933,6 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = T4L96T5775; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -1940,7 +1941,6 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = T4L96T5775; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; @@ -1951,7 +1951,6 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = T4L96T5775; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1964,7 +1963,6 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = T4L96T5775; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1977,7 +1975,6 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = T4L96T5775; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1990,7 +1987,6 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = T4L96T5775; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2003,7 +1999,6 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = T4L96T5775; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2016,7 +2011,6 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = T4L96T5775; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2029,7 +2023,6 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = T4L96T5775; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2042,7 +2035,6 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = T4L96T5775; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/sys/unix/NetHack.xcodeproj/xcshareddata/xcschemes/recover.xcscheme b/sys/unix/NetHack.xcodeproj/xcshareddata/xcschemes/recover.xcscheme new file mode 100644 index 000000000..4a2449167 --- /dev/null +++ b/sys/unix/NetHack.xcodeproj/xcshareddata/xcschemes/recover.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sys/unix/XCode.xcconfig b/sys/unix/XCode.xcconfig new file mode 100644 index 000000000..0f582e07f --- /dev/null +++ b/sys/unix/XCode.xcconfig @@ -0,0 +1,38 @@ +// XCodeConfig.xcconfig +// NetHack +// +// Created by Groot on 11/19/18. +// Copyright © 2018 Bart House. All rights reserved. +// + +// Configuration settings file format documentation can be found at: +// https://help.apple.com/xcode/#/dev745c5c974 + +// PLEASE READ +// +// You must define the build configuration setting DEVELOPMENT_TEAM +// in order for the project to build successfully. This setting provides +// the identifier XCode needs in order to sign your builds. +// +// Your DEVELOPMENT_TEAM can be found by opening Keychain Access +// (found by Finder->Applications->Utilities). Click on "My Certificates". +// Look for your "Mac Developer" certificate. Right click on +// the certificate to open a dialog that shows certificate details. +// Look for "Organizational Unit" among the details. This ten digit value +// is your development team identifier. +// +// Once found, you now need to create a file named "XCodeLocal.xcconfig" +// in the same folder as "XCode.xcconfig". This file should contain at +// least one line that defines your DEVELOPMENT_TEAM. The line should have +// the form: +// DEVELOPMENT_TEAM = XXXXXXXXXX +// +// If you know what you are doing, it can also have other build settings +// you wish to override. +// +// This new file is ignored by git and should never be submitted to the +// repository. It is meant to be local to you machine only. +// + +// Include locally provided config file that must define DEVELOPMENT_TEAM +#include? "XCodeLocal.xcconfig" From 8c61ac476de7642a28a16715ae57544c534b27f6 Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 07:32:23 -0800 Subject: [PATCH 51/74] Fixed HACKDIR buid setting. --- sys/unix/NetHack.xcodeproj/project.pbxproj | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj index 48bce7083..854285c91 100644 --- a/sys/unix/NetHack.xcodeproj/project.pbxproj +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -1805,8 +1805,8 @@ "-DDLB", "-DGREPPATH=\\\"/usr/bin/grep\\\"", "-DSYSCF", - "-DSYSCF_FILE=\\\"/Users/barthouse/nethackdir/sysconf\\\"", - "-DHACKDIR=\\\"/Users/barthouse/nethackdir\\\"", + "-DSYSCF_FILE=\\\"$(NH_INSTALL_DIR)/sysconf\\\"", + "-DHACKDIR=\\\"$(NH_INSTALL_DIR)\\\"", "-DSECURE", "-DCURSES_GRAPHICS", ); @@ -1880,8 +1880,8 @@ "-DDLB", "-DGREPPATH=\\\"/usr/bin/grep\\\"", "-DSYSCF", - "-DSYSCF_FILE=\\\"/Users/barthouse/nethackdir/sysconf\\\"", - "-DHACKDIR=\\\"/Users/barthouse/nethackdir\\\"", + "-DSYSCF_FILE=\\\"$(NH_INSTALL_DIR)/sysconf\\\"", + "-DHACKDIR=\\\"$(NH_INSTALL_DIR)\\\"", "-DSECURE", "-DCURSES_GRAPHICS", ); @@ -1900,8 +1900,8 @@ "-DDLB", "-DGREPPATH=\\\"/usr/bin/grep\\\"", "-DSYSCF", - "-DSYSCF_FILE=\\\"/Users/barthouse/nethackdir/sysconf\\\"", - "-DHACKDIR=\\\"/Users/barthouse/nethackdir\\\"", + "-DSYSCF_FILE=\\\"$(NH_INSTALL_DIR)/sysconf\\\"", + "-DHACKDIR=\\\"$(NH_INSTALL_DIR)\\\"", "-DSECURE", "-DCURSES_GRAPHICS", ); @@ -1920,8 +1920,8 @@ "-DDLB", "-DGREPPATH=\\\"/usr/bin/grep\\\"", "-DSYSCF", - "-DSYSCF_FILE=\\\"/Users/barthouse/nethackdir/sysconf\\\"", - "-DHACKDIR=\\\"/Users/barthouse/nethackdir\\\"", + "-DSYSCF_FILE=\\\"$(NH_INSTALL_DIR)/sysconf\\\"", + "-DHACKDIR=\\\"$(NH_INSTALL_DIR)\\\"", "-DSECURE", "-DCURSES_GRAPHICS", ); From 8799f05904165d5ae730ad5da50def806b661634 Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 10:26:09 -0800 Subject: [PATCH 52/74] Fix lrand48 and srand48 declarations. --- include/system.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/system.h b/include/system.h index a3eb984cb..f0b53fe3c 100644 --- a/include/system.h +++ b/include/system.h @@ -91,8 +91,8 @@ E int FDECL(srandom, (unsigned int)); #endif #endif #else -E long lrand48(); -E void srand48(); +E long NDECL(lrand48); +E void FDECL(srand48, (long)); #endif /* BSD || ULTRIX || RANDOM */ #if !defined(BSD) || defined(ultrix) From 7f4a4188a016d3dde6eec6f9bfcf5bc053f0ddb8 Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 10:27:09 -0800 Subject: [PATCH 53/74] Added initialization of newlevel to quite compiler warnings. --- src/cmd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd.c b/src/cmd.c index 8c830b9c3..586a67844 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -901,7 +901,7 @@ STATIC_PTR int wiz_level_change(VOID_ARGS) { char buf[BUFSZ] = DUMMY; - int newlevel; + int newlevel = 0; int ret; getlin("To what experience level do you want to be set?", buf); From d1cd20998f168a21fabfb4b9e9c3c45f717105cb Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 10:27:35 -0800 Subject: [PATCH 54/74] Added initialization if ilet to quite compiler warnings. --- src/invent.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/invent.c b/src/invent.c index 2a52cda32..718e1feb5 100644 --- a/src/invent.c +++ b/src/invent.c @@ -1380,7 +1380,7 @@ getobj(let, word) register const char *let, *word; { register struct obj *otmp; - register char ilet; + register char ilet = 0; char buf[BUFSZ], qbuf[QBUFSZ]; char lets[BUFSZ], altlets[BUFSZ], *ap; register int foo = 0; From a19b05d262dd1695638c219e23866c9be825d25d Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 10:29:05 -0800 Subject: [PATCH 55/74] Added initialization of cc in do_look() to quite compiler warnings. --- src/pager.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pager.c b/src/pager.c index d9bdb4f63..f8146615d 100644 --- a/src/pager.c +++ b/src/pager.c @@ -1066,6 +1066,9 @@ coord *click_cc; boolean save_verbose; /* saved value of flags.verbose */ boolean from_screen; /* question from the screen */ + cc.x = 0; + cc.y = 0; + if (!clicklook) { if (quick) { from_screen = TRUE; /* yes, we want to use the cursor */ From c987a3dc2f51a3c866579cc0050a570d693024d0 Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 10:30:11 -0800 Subject: [PATCH 56/74] Added initialization of locals in create_room() to quite compiler warnings. --- src/sp_lev.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sp_lev.c b/src/sp_lev.c index 52fe277ec..6ebf7e9df 100644 --- a/src/sp_lev.c +++ b/src/sp_lev.c @@ -1130,7 +1130,7 @@ xchar w, h; xchar xal, yal; xchar rtype, rlit; { - xchar xabs, yabs; + xchar xabs = 0, yabs = 0; int wtmp, htmp, xaltmp, yaltmp, xtmp, ytmp; NhRect *r1 = 0, r2; int trycnt = 0; @@ -2000,7 +2000,7 @@ struct mkroom *croom; * other contents, but that can be specified as an empty container. */ if (o->id == STATUE && Is_medusa_level(&u.uz) && o->corpsenm == NON_PM) { - struct monst *was; + struct monst *was = NULL; struct obj *obj; int wastyp; int i = 0; /* prevent endless loop in case makemon always fails */ From be11d50d91765f1ffeae96837d0eec12dcfaa95b Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 10:33:36 -0800 Subject: [PATCH 57/74] Added use of SCCS_Id to quite compiler warnings. --- util/makedefs.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/util/makedefs.c b/util/makedefs.c index 39816cb12..6d5ab510a 100644 --- a/util/makedefs.c +++ b/util/makedefs.c @@ -297,6 +297,9 @@ link_sanity_check() */ monst_init(); objects_init(); + + /* Quite unused warning */ + (void) SCCS_Id; } void From 0b1e975b079913c3925993130fbc370be643ed36 Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 10:35:25 -0800 Subject: [PATCH 58/74] Addressed compiler warnings. Moved locals before code. Changed comment type. --- win/curses/cursdial.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/win/curses/cursdial.c b/win/curses/cursdial.c index 274710db1..48ac91535 100644 --- a/win/curses/cursdial.c +++ b/win/curses/cursdial.c @@ -80,6 +80,10 @@ curses_line_input_dialog(const char *prompt, char *answer, int buffer) { int map_height, map_width, maxwidth, remaining_buf, winx, winy, count; WINDOW *askwin, *bwin; + char *tmpstr; + int prompt_width = strlen(prompt) + buffer + 1; + int prompt_height = 1; + int height = prompt_height; #if __STDC_VERSION__ >= 199901L char input[buffer]; #else @@ -90,10 +94,6 @@ curses_line_input_dialog(const char *prompt, char *answer, int buffer) buffer = BUFSZ - 1; #endif - char *tmpstr; - int prompt_width = strlen(prompt) + buffer + 1; - int prompt_height = 1; - int height = prompt_height; maxwidth = term_cols - 2; @@ -869,7 +869,7 @@ menu_win_size(nhmenu *menu) } else { /* Add space for accelerator */ curentrywidth = strlen(menu_item_ptr->str) + 4; -#if 0 // FIXME: menu glyphs +#if 0 /* FIXME: menu glyphs */ if (menu_item_ptr->glyph != NO_GLYPH && iflags.use_menu_glyphs) curentrywidth += 2; From 616e946393ca859471f73e8d5c4e85450c488c21 Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 10:42:13 -0800 Subject: [PATCH 59/74] Scoped existing code in a new block to quite compiler warnings. --- win/curses/cursinit.c | 178 +++++++++++++++++++++--------------------- 1 file changed, 90 insertions(+), 88 deletions(-) diff --git a/win/curses/cursinit.c b/win/curses/cursinit.c index 3e87693a7..5f7e07681 100644 --- a/win/curses/cursinit.c +++ b/win/curses/cursinit.c @@ -178,110 +178,112 @@ curses_create_main_windows() based on configuration. The priority alignment-wise is: status > msgarea > game. Define everything as taking as much space as possible and shrink/move based on alignment positions. */ - int message_x = 0; - int message_y = 0; - int status_x = 0; - int status_y = 0; - int inv_x = 0; - int inv_y = 0; - int map_x = 0; - int map_y = 0; + { + int message_x = 0; + int message_y = 0; + int status_x = 0; + int status_y = 0; + int inv_x = 0; + int inv_y = 0; + int map_x = 0; + int map_y = 0; - int message_height = 0; - int message_width = 0; - int status_height = 0; - int status_width = 0; - int inv_height = 0; - int inv_width = 0; - int map_height = (term_rows - border_space); - int map_width = (term_cols - border_space); + int message_height = 0; + int message_width = 0; + int status_height = 0; + int status_width = 0; + int inv_height = 0; + int inv_width = 0; + int map_height = (term_rows - border_space); + int map_width = (term_cols - border_space); + int statusheight = 3; - boolean status_vertical = FALSE; - boolean msg_vertical = FALSE; - if (status_orientation == ALIGN_LEFT || - status_orientation == ALIGN_RIGHT) - status_vertical = TRUE; - if (message_orientation == ALIGN_LEFT || - message_orientation == ALIGN_RIGHT) - msg_vertical = TRUE; + boolean status_vertical = FALSE; + boolean msg_vertical = FALSE; + if (status_orientation == ALIGN_LEFT || + status_orientation == ALIGN_RIGHT) + status_vertical = TRUE; + if (message_orientation == ALIGN_LEFT || + message_orientation == ALIGN_RIGHT) + msg_vertical = TRUE; - int statusheight = 3; - if (iflags.statuslines < 3) - statusheight = 2; + if (iflags.statuslines < 3) + statusheight = 2; - /* Vertical windows have priority. Otherwise, priotity is: - status > inv > msg */ - if (status_vertical) - set_window_position(&status_x, &status_y, &status_width, &status_height, - status_orientation, &map_x, &map_y, &map_width, &map_height, - border_space, statusheight, 26); + /* Vertical windows have priority. Otherwise, priotity is: + status > inv > msg */ + if (status_vertical) + set_window_position(&status_x, &status_y, &status_width, &status_height, + status_orientation, &map_x, &map_y, &map_width, &map_height, + border_space, statusheight, 26); + + if (iflags.perm_invent) { + /* Take up all width unless msgbar is also vertical. */ + int width = -25; + if (msg_vertical) + width = 25; + + set_window_position(&inv_x, &inv_y, &inv_width, &inv_height, + ALIGN_RIGHT, &map_x, &map_y, &map_width, &map_height, + border_space, -1, width); + } - if (iflags.perm_invent) { - /* Take up all width unless msgbar is also vertical. */ - int width = -25; if (msg_vertical) - width = 25; + set_window_position(&message_x, &message_y, &message_width, &message_height, + message_orientation, &map_x, &map_y, &map_width, &map_height, + border_space, -1, -25); - set_window_position(&inv_x, &inv_y, &inv_width, &inv_height, - ALIGN_RIGHT, &map_x, &map_y, &map_width, &map_height, - border_space, -1, width); - } + /* Now draw horizontal windows */ + if (!status_vertical) + set_window_position(&status_x, &status_y, &status_width, &status_height, + status_orientation, &map_x, &map_y, &map_width, &map_height, + border_space, statusheight, 26); - if (msg_vertical) - set_window_position(&message_x, &message_y, &message_width, &message_height, - message_orientation, &map_x, &map_y, &map_width, &map_height, - border_space, -1, -25); + if (!msg_vertical) + set_window_position(&message_x, &message_y, &message_width, &message_height, + message_orientation, &map_x, &map_y, &map_width, &map_height, + border_space, -1, -25); - /* Now draw horizontal windows */ - if (!status_vertical) - set_window_position(&status_x, &status_y, &status_width, &status_height, - status_orientation, &map_x, &map_y, &map_width, &map_height, - border_space, statusheight, 26); + if (map_width > COLNO) + map_width = COLNO; - if (!msg_vertical) - set_window_position(&message_x, &message_y, &message_width, &message_height, - message_orientation, &map_x, &map_y, &map_width, &map_height, - border_space, -1, -25); + if (map_height > ROWNO) + map_height = ROWNO; - if (map_width > COLNO) - map_width = COLNO; + if (curses_get_nhwin(STATUS_WIN)) { + curses_del_nhwin(STATUS_WIN); + curses_del_nhwin(MESSAGE_WIN); + curses_del_nhwin(MAP_WIN); + curses_del_nhwin(INV_WIN); - if (map_height > ROWNO) - map_height = ROWNO; + clear(); + } - if (curses_get_nhwin(STATUS_WIN)) { - curses_del_nhwin(STATUS_WIN); - curses_del_nhwin(MESSAGE_WIN); - curses_del_nhwin(MAP_WIN); - curses_del_nhwin(INV_WIN); + curses_add_nhwin(STATUS_WIN, status_height, status_width, status_y, + status_x, status_orientation, borders); - clear(); - } + curses_add_nhwin(MESSAGE_WIN, message_height, message_width, message_y, + message_x, message_orientation, borders); - curses_add_nhwin(STATUS_WIN, status_height, status_width, status_y, - status_x, status_orientation, borders); - - curses_add_nhwin(MESSAGE_WIN, message_height, message_width, message_y, - message_x, message_orientation, borders); - - if (iflags.perm_invent) - curses_add_nhwin(INV_WIN, inv_height, inv_width, inv_y, inv_x, - ALIGN_RIGHT, borders); - - curses_add_nhwin(MAP_WIN, map_height, map_width, map_y, map_x, 0, borders); - - refresh(); - - curses_refresh_nethack_windows(); -/* - if (iflags.window_inited) { - curses_update_stats(); if (iflags.perm_invent) - curses_update_inventory(); - } else { - iflags.window_inited = TRUE; + curses_add_nhwin(INV_WIN, inv_height, inv_width, inv_y, inv_x, + ALIGN_RIGHT, borders); + + curses_add_nhwin(MAP_WIN, map_height, map_width, map_y, map_x, 0, borders); + + refresh(); + + curses_refresh_nethack_windows(); + /* + if (iflags.window_inited) { + curses_update_stats(); + if (iflags.perm_invent) + curses_update_inventory(); + } else { + iflags.window_inited = TRUE; + } + */ } -*/ } @@ -304,6 +306,7 @@ curses_init_nhcolors() { int i; + boolean hicolor = FALSE; int clr_remap[16] = { COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW, @@ -319,7 +322,6 @@ curses_init_nhcolors() init_pair(17 + (i * 2) + 1, clr_remap[i], COLOR_BLUE); } - boolean hicolor = FALSE; if (COLORS >= 16) hicolor = TRUE; From fcb28cd2e5b72a9f9f2028fb45f2e10038c0d072 Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 10:43:35 -0800 Subject: [PATCH 60/74] Addressed compiler warnings. Moved local declarations before code. Changed comments to c-style. --- win/curses/cursinvt.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/win/curses/cursinvt.c b/win/curses/cursinvt.c index f5a362d7d..c9441b7bc 100644 --- a/win/curses/cursinvt.c +++ b/win/curses/cursinvt.c @@ -12,6 +12,10 @@ void curses_update_inv(void) { WINDOW *win = curses_get_nhwin(INV_WIN); + boolean border; + int x = 0; + int y = 0; + attr_t attr = A_UNDERLINE; /* Check if the inventory window is enabled in first place */ if (!win) { @@ -25,11 +29,9 @@ curses_update_inv(void) return; } - boolean border = curses_window_has_border(INV_WIN); + border = curses_window_has_border(INV_WIN); /* Figure out drawing area */ - int x = 0; - int y = 0; if (border) { x++; y++; @@ -39,7 +41,6 @@ curses_update_inv(void) werase(win); wmove(win, y, x); - attr_t attr = A_UNDERLINE; wattron(win, attr); wprintw(win, "Inventory:"); wattroff(win, attr); @@ -62,6 +63,7 @@ curses_add_inv(int y, int glyph, CHAR_P accelerator, attr_t attr, const char *str) { WINDOW *win = curses_get_nhwin(INV_WIN); + int color = NO_COLOR; /* Figure out where to draw the line */ int x = 0; @@ -78,7 +80,7 @@ curses_add_inv(int y, int glyph, CHAR_P accelerator, attr_t attr, wattroff(win, bold); wprintw(win, ") "); } -#if 0 // FIXME: MENU GLYPHS +#if 0 /* FIXME: MENU GLYPHS */ if (accelerator && glyph != NO_GLYPH && iflags.use_menu_glyphs) { unsigned dummy = 0; /* Not used */ int color = 0; @@ -91,21 +93,19 @@ curses_add_inv(int y, int glyph, CHAR_P accelerator, attr_t attr, wattroff(win, glyphclr); } #endif - int color = NO_COLOR; if (accelerator && /* Don't colorize categories */ iflags.use_menu_color) { - boolean menu_color = FALSE; char str_mutable[BUFSZ]; Strcpy(str_mutable, str); attr = 0; - get_menu_coloring(str_mutable, &color, &attr); + get_menu_coloring(str_mutable, &color, (int *) &attr); attr = curses_convert_attr(attr); } if (color == NO_COLOR) color = NONE; curses_toggle_color_attr(win, color, attr, ON); - //wattron(win, attr); + /* wattron(win, attr); */ wprintw(win, "%s", str); - //wattroff(win, attr); + /* wattroff(win, attr); */ curses_toggle_color_attr(win, color, attr, OFF); wclrtoeol(win); } From 347c45b4204dec94a3b97a9bb67f05253efe2e2a Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 10:44:44 -0800 Subject: [PATCH 61/74] Addressed compiler warnings. Changed to c-style comments. Placed locals before code. Added initialization of local value ret in curses_block. --- win/curses/cursmesg.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/win/curses/cursmesg.c b/win/curses/cursmesg.c index 9fc1d6442..43597f911 100644 --- a/win/curses/cursmesg.c +++ b/win/curses/cursmesg.c @@ -138,7 +138,7 @@ curses_block(boolean noscroll) /* noscroll - blocking because of msgtype = stop/alert */ /* else blocking because window is full, so need to scroll after */ { - int height, width, ret; + int height, width, ret = 0; WINDOW *win = curses_get_nhwin(MESSAGE_WIN); char *resp = " \n\033"; /* space, enter, esc */ @@ -225,6 +225,8 @@ void curses_last_messages() { boolean border = curses_window_has_border(MESSAGE_WIN); + nhprev_mesg *mesg; + int i; if (border) { mx = 1; @@ -234,8 +236,6 @@ curses_last_messages() my = 0; } - nhprev_mesg *mesg; - int i; for (i = (num_messages - 1); i > 0; i--) { mesg = get_msg_line(TRUE, i); if (mesg && mesg->str && strcmp(mesg->str, "")) From e66a8c4c7344dd608e11ba24488795a4a5591f2d Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 10:45:04 -0800 Subject: [PATCH 62/74] Changed comments to c-style. --- win/curses/cursmisc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/win/curses/cursmisc.c b/win/curses/cursmisc.c index 4b424884d..40ce0c2e9 100644 --- a/win/curses/cursmisc.c +++ b/win/curses/cursmisc.c @@ -89,9 +89,9 @@ curses_toggle_color_attr(WINDOW * win, int color, int attr, int onoff) } /* GUI color disabled */ -// if ((!iflags.wc2_guicolor) && (win != mapwin)) { -// return; -// } + /* if ((!iflags.wc2_guicolor) && (win != mapwin)) { + return; + } */ if (color == 0) { /* make black fg visible */ # ifdef USE_DARKGRAY @@ -562,7 +562,7 @@ void curses_posthousekeeping() { curs_set(0); - //curses_decrement_highlights(FALSE); + /* curses_decrement_highlights(FALSE); */ curses_clear_unhighlight_message_window(); } From d177b5e7057903adbb3a2078a3e8e7c3fc932932 Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 10:46:45 -0800 Subject: [PATCH 63/74] Addressed compiler warnings. Fixed declarations of draw_classic, draw_vertical and draw_horizontal. Moved definitions of locals before code. Added initialization of locals. Changed comments to c-style. --- win/curses/cursstat.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/win/curses/cursstat.c b/win/curses/cursstat.c index ab3ca0ca5..2f95e5660 100644 --- a/win/curses/cursstat.c +++ b/win/curses/cursstat.c @@ -31,9 +31,9 @@ static int FDECL(condcolor, (long, unsigned long *)); static int FDECL(condattr, (long, unsigned long *)); #endif /* STATUS_HILITES */ static void FDECL(draw_status, (unsigned long *)); -static void FDECL(draw_classic, (boolean, unsigned long *)); -static void FDECL(draw_vertical, (boolean, unsigned long *)); -static void FDECL(draw_horizontal, (boolean, unsigned long *)); +static void FDECL(draw_classic, (BOOLEAN_P, unsigned long *)); +static void FDECL(draw_vertical, (BOOLEAN_P, unsigned long *)); +static void FDECL(draw_horizontal, (BOOLEAN_P, unsigned long *)); void curses_status_init() @@ -246,14 +246,15 @@ unsigned long *colormasks; /* Figure out if we have proper window dimensions for horizontal statusbar. */ if (horiz) { + int ax = 0; + int ay = 0; + /* correct y */ int cy = 3; if (iflags.statuslines < 3) cy = 2; /* actual y (and x) */ - int ax = 0; - int ay = 0; getmaxyx(win, ay, ax); if (border) ay -= 2; @@ -339,7 +340,7 @@ unsigned long *colormasks; /* hitpointbar using hp percent calculation */ int bar_pos, bar_len; char *bar2 = (char *)0; - char bar[MAXCO], savedch; + char bar[MAXCO], savedch = 0; boolean twoparts = FALSE; text = status_vals[fldidx1]; @@ -536,7 +537,7 @@ unsigned long *colormasks; /* hitpointbar using hp percent calculation */ int bar_pos, bar_len; char *bar2 = (char *)0; - char bar[MAXCO], savedch; + char bar[MAXCO], savedch = 0; boolean twoparts = FALSE; int height,width; @@ -642,7 +643,7 @@ unsigned long *bmarray; } #endif /* STATUS_HILITES */ -#if 0 //old stuff to be re-incorporated +#if 0 /* old stuff to be re-incorporated */ /* Private declarations */ /* Used to track previous value of things, to highlight changes. */ From 520b130a5cc9769d1909b59b83c0d4a786c175e7 Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 10:47:12 -0800 Subject: [PATCH 64/74] Added initialization of locals to quite compiler warnings. --- win/curses/curswins.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/win/curses/curswins.c b/win/curses/curswins.c index b04fd94c7..012821280 100644 --- a/win/curses/curswins.c +++ b/win/curses/curswins.c @@ -46,7 +46,7 @@ static void clear_map(void); WINDOW * curses_create_window(int width, int height, orient orientation) { - int mapx, mapy, maph, mapw = 0; + int mapx = 0, mapy = 0, maph = 0, mapw = 0; int startx = 0; int starty = 0; WINDOW *win; From 2a6bd3e8ac9c1e84e181d330f72e7f9abaae8f76 Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 10:48:44 -0800 Subject: [PATCH 65/74] Addressed compiler warnings. Added the initialization of several locals. In check_fields, validate that we have a valid index (idx) before using. --- win/tty/wintty.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/win/tty/wintty.c b/win/tty/wintty.c index 8ebac1267..d5cac96c3 100644 --- a/win/tty/wintty.c +++ b/win/tty/wintty.c @@ -3867,7 +3867,7 @@ boolean forcefields; int *topsz, *bottomsz; { int c, i, row, col, trackx, idx; - boolean valid = TRUE, matchprev = FALSE, update_right, disregard; + boolean valid = TRUE, matchprev = FALSE, update_right, disregard = FALSE; if (!windowdata_init && !check_windowdata()) return FALSE; @@ -3876,6 +3876,7 @@ int *topsz, *bottomsz; col = 1; trackx = 1; update_right = FALSE; + idx = -1; for (i = 0; fieldorder[row][i] != BL_FLUSH; ++i) { idx = fieldorder[row][i]; if (!status_activefields[idx]) @@ -3941,10 +3942,12 @@ int *topsz, *bottomsz; tty_status[NOW][idx].redraw = TRUE; col += tty_status[NOW][idx].lth; } - if (row && bottomsz) - *bottomsz = col + tty_status[NOW][idx].lth; - else if (topsz) - *topsz = col + tty_status[NOW][idx].lth; + if (idx != -1) { + if (row && bottomsz) + *bottomsz = col + tty_status[NOW][idx].lth; + else if (topsz) + *topsz = col + tty_status[NOW][idx].lth; + } } return valid; } @@ -3960,7 +3963,7 @@ struct tty_status_fields *fld; const char *val; int x, y; { - int i, n, ncols, lth; + int i, n, ncols, lth = 0; struct WinDesc *cw = 0; const char *text = (char *)0; @@ -4273,7 +4276,7 @@ render_status(VOID_ARGS) /* hitpointbar using hp percent calculation */ int bar_pos, bar_len; char *bar2 = (char *)0; - char bar[MAXCO], savedch; + char bar[MAXCO], savedch = 0; boolean twoparts = FALSE; bar_len = strlen(text); From da1e7de9251fcfe025f7875f49875267c26e9a92 Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 10:51:03 -0800 Subject: [PATCH 66/74] Adjusted compiler settings to reduce warnings in XCode project. --- sys/unix/NetHack.xcodeproj/project.pbxproj | 70 ++++------------------ 1 file changed, 10 insertions(+), 60 deletions(-) diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj index 854285c91..5dd7657bf 100644 --- a/sys/unix/NetHack.xcodeproj/project.pbxproj +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -1746,11 +1746,11 @@ CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; + CLANG_WARN_COMMA = NO; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = NO; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; @@ -1760,10 +1760,10 @@ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_STRICT_PROTOTYPES = NO; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN_UNREACHABLE_CODE = NO; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Mac Developer"; COPY_PHASE_STRIP = NO; @@ -1778,7 +1778,7 @@ "DEBUG=1", "$(inherited)", ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_PEDANTIC = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -1828,11 +1828,11 @@ CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; + CLANG_WARN_COMMA = NO; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = NO; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; @@ -1842,10 +1842,10 @@ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_STRICT_PROTOTYPES = NO; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN_UNREACHABLE_CODE = NO; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Mac Developer"; COPY_PHASE_STRIP = NO; @@ -1854,7 +1854,7 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = ansi; GCC_NO_COMMON_BLOCKS = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_PEDANTIC = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -1893,18 +1893,6 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; - OTHER_CFLAGS = ( - "-DNOMAIL", - "-DNOTPARMDECL", - "-DDEFAULT_WINDOW_SYS=\\\"curses\\\"", - "-DDLB", - "-DGREPPATH=\\\"/usr/bin/grep\\\"", - "-DSYSCF", - "-DSYSCF_FILE=\\\"$(NH_INSTALL_DIR)/sysconf\\\"", - "-DHACKDIR=\\\"$(NH_INSTALL_DIR)\\\"", - "-DSECURE", - "-DCURSES_GRAPHICS", - ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -1913,18 +1901,6 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; - OTHER_CFLAGS = ( - "-DNOMAIL", - "-DNOTPARMDECL", - "-DDEFAULT_WINDOW_SYS=\\\"curses\\\"", - "-DDLB", - "-DGREPPATH=\\\"/usr/bin/grep\\\"", - "-DSYSCF", - "-DSYSCF_FILE=\\\"$(NH_INSTALL_DIR)/sysconf\\\"", - "-DHACKDIR=\\\"$(NH_INSTALL_DIR)\\\"", - "-DSECURE", - "-DCURSES_GRAPHICS", - ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; @@ -1948,11 +1924,7 @@ 31B8A42321A2669A0055BD01 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -1960,11 +1932,7 @@ 31B8A42421A2669A0055BD01 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; @@ -1976,7 +1944,6 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -1988,7 +1955,6 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; @@ -1996,11 +1962,7 @@ 31B8A44F21A26A4B0055BD01 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -2008,11 +1970,7 @@ 31B8A45021A26A4B0055BD01 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; @@ -2020,11 +1978,7 @@ 31B8A45C21A26A970055BD01 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -2032,11 +1986,7 @@ 31B8A45D21A26A970055BD01 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; From aa939a62b0b604ff924a8ea1d96a06004cc414bc Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 11:16:24 -0800 Subject: [PATCH 67/74] Adding README for building NetHack with XCode. --- sys/unix/README.xcode | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 sys/unix/README.xcode diff --git a/sys/unix/README.xcode b/sys/unix/README.xcode new file mode 100644 index 000000000..5ba6741e4 --- /dev/null +++ b/sys/unix/README.xcode @@ -0,0 +1,39 @@ +This README provides the instructions for building the unofficial Mac +binaries using the Apple provided developer IDE named XCode. + +Establish a developer team in XCode +=================================== + +Your first step should be to establish a developer team within XCode. +Launch XCode and open the preferences diaglog (XCode Menu->Preferences). +Select the "Accounts" tab. Add an account (usually this should just be +your apple ID accoung you used to setup the Mac). After adding the account, +select the account and then add a team (usually this will be just a +personal team for Mac Development). + +Obtain your developer team identifier +===================================== + +Your DEVELOPMENT_TEAM can be found by opening Keychain Access +(found by Finder->Applications->Utilities). Click on "My Certificates". +Look for your "Mac Developer" certificate. Right click on +the certificate to open a dialog that shows certificate details. +Look for "Organizational Unit" among the details. This ten digit value +is your development team identifier. + +Create XCodeLocal.xcconfig file +=============================== + +Now you need to create the XCodeLocal.xcconfig file that will be used by +XCode to get your development team identifier. Create the file in +sys/unix and add a single line such as: +DEVELOPMENT_TEAM = XXXXXXXXXX + +Where XXXXXXXXXX is replaced with your development team identifier. + +Open the project and build +========================== + +In XCode open the project file sys\unix\NetHack.xcodeproj, select +the product NetHack and build. The build results are placed in +~nethackdir. From d15dacc44cd2835e7864522a060f86ca12191801 Mon Sep 17 00:00:00 2001 From: PatR Date: Tue, 20 Nov 2018 13:13:23 -0800 Subject: [PATCH 68/74] fix #H7530 - corpse from corpseless monster Migrating monster attempting to arrive on a level which is already full of monsters gets killed off. It was leaving a corpse without regard for whether it was a type of of monster which should never leave corpses. I'd prefer that it be put back on the migrating_mons list rather than be killed off, but this just suppresses impossible corpses. --- doc/fixes36.2 | 3 +++ src/dog.c | 26 +++++++++++++++++++++++--- src/mon.c | 4 +++- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/doc/fixes36.2 b/doc/fixes36.2 index f4cfd00a1..5d18bb3e8 100644 --- a/doc/fixes36.2 +++ b/doc/fixes36.2 @@ -202,6 +202,9 @@ a stale gold symbol could be displayed on the status line following a switch to a new symset, as observed and reported for Windows RogueEpyx symset successfully paying for shop damage with shop credit would be followed by impossible "zero payment in money2mon" +if a migrating monster was killed off because there was no room on the + destination level, it would leave a corpse even if it was a type + which should never leave one (demon, golem, blob, &c) Fixes to Post-3.6.1 Problems that Were Exposed Via git Repository diff --git a/src/dog.c b/src/dog.c index 85e618236..144427e0d 100644 --- a/src/dog.c +++ b/src/dog.c @@ -7,6 +7,11 @@ STATIC_DCL int NDECL(pet_type); +/* cloned from mon.c; used here if mon_arrive() can't place mon */ +#define LEVEL_SPECIFIC_NOCORPSE(mdat) \ + (Is_rogue_level(&u.uz) \ + || (level.flags.graveyard && is_undead(mdat) && rn2(3))) + void newedog(mtmp) struct monst *mtmp; @@ -79,6 +84,7 @@ boolean quietly; do { if (otmp) { /* figurine; otherwise spell */ int mndx = otmp->corpsenm; + pm = &mons[mndx]; /* activating a figurine provides one way to exceed the maximum number of the target critter created--unless @@ -294,6 +300,7 @@ struct monst *mtmp; boolean with_you; { struct trap *t; + struct obj *obj; xchar xlocale, ylocale, xyloc, xyflags, wander; int num_segs; @@ -417,8 +424,10 @@ boolean with_you; /* monster moved a bit; pick a nearby location */ /* mnearto() deals w/stone, et al */ char *r = in_rooms(xlocale, ylocale, 0); + if (r && *r) { coord c; + /* somexy() handles irregular rooms */ if (somexy(&rooms[*r - ROOMOFFSET], &c)) xlocale = c.x, ylocale = c.y; @@ -426,6 +435,7 @@ boolean with_you; xlocale = ylocale = 0; } else { /* not in a room */ int i, j; + i = max(1, xlocale - wander); j = min(COLNO - 1, xlocale + wander); xlocale = rn1(j - i, i); @@ -446,8 +456,11 @@ boolean with_you; * Failed to place migrating monster, * probably because the level is full. * Dump the monster's cargo and leave the monster dead. + * + * TODO? Put back on migrating_mons list instead so + * that if hero leaves this level and then returns, + * monster will have another chance to arrive. */ - struct obj *obj; fail_mon_placement: while ((obj = mtmp->minvent) != 0) { obj_extract_self(obj); @@ -462,8 +475,15 @@ fail_mon_placement: impossible("Can't find relocated object."); } } - (void) mkcorpstat(CORPSE, (struct monst *) 0, mtmp->data, xlocale, - ylocale, CORPSTAT_NONE); + /* + * TODO? Maybe switch to make_corpse() [won't be needed if + * we re-migrate as suggested above], probably with new + * CORPSTAT_NOOBJS flag to suppress dragon scales and such. + */ + if (!(mvitals[monsndx(mtmp->data)].mvflags & G_NOCORPSE) + && !LEVEL_SPECIFIC_NOCORPSE(mtmp->data)) + (void) mkcorpstat(CORPSE, mtmp, mtmp->data, + xlocale, ylocale, CORPSTAT_NONE); mtmp->mx = mtmp->my = -1; /* for mongone, mon is not anywhere */ mongone(mtmp); } diff --git a/src/mon.c b/src/mon.c index 785b691b5..64f906e6b 100644 --- a/src/mon.c +++ b/src/mon.c @@ -29,6 +29,7 @@ STATIC_DCL struct obj *FDECL(make_corpse, (struct monst *, unsigned)); STATIC_DCL void FDECL(m_detach, (struct monst *, struct permonst *)); STATIC_DCL void FDECL(lifesaved_monster, (struct monst *)); +/* note: duplicated in dog.c */ #define LEVEL_SPECIFIC_NOCORPSE(mdat) \ (Is_rogue_level(&u.uz) \ || (level.flags.graveyard && is_undead(mdat) && rn2(3))) @@ -446,7 +447,8 @@ unsigned corpseflags; } /* All special cases should precede the G_NOCORPSE check */ - if (!obj) return NULL; + if (!obj) + return (struct obj *) 0; /* if polymorph or undead turning has killed this monster, prevent the same attack beam from hitting its corpse */ From b19502563545da4b8bc20782e6c57563bfaff501 Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 13:22:48 -0800 Subject: [PATCH 69/74] Added all header files to Xcode project. --- sys/unix/NetHack.xcodeproj/project.pbxproj | 214 +++++++++++++++++++++ 1 file changed, 214 insertions(+) diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj index 5dd7657bf..1842e3c27 100644 --- a/sys/unix/NetHack.xcodeproj/project.pbxproj +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -331,6 +331,113 @@ /* Begin PBXFileReference section */ 2A953FB221A3F404007906E5 /* XCode.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = XCode.xcconfig; sourceTree = ""; }; + 3186A36D21A4B0F90052BF02 /* xwindowp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = xwindowp.h; path = ../../include/xwindowp.h; sourceTree = ""; }; + 3186A36E21A4B0FA0052BF02 /* botl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = botl.h; path = ../../include/botl.h; sourceTree = ""; }; + 3186A36F21A4B0FA0052BF02 /* winprocs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = winprocs.h; path = ../../include/winprocs.h; sourceTree = ""; }; + 3186A37021A4B0FA0052BF02 /* extern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = extern.h; path = ../../include/extern.h; sourceTree = ""; }; + 3186A37121A4B0FA0052BF02 /* context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = context.h; path = ../../include/context.h; sourceTree = ""; }; + 3186A37221A4B0FA0052BF02 /* mac-term.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "mac-term.h"; path = "../../include/mac-term.h"; sourceTree = ""; }; + 3186A37321A4B0FA0052BF02 /* func_tab.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = func_tab.h; path = ../../include/func_tab.h; sourceTree = ""; }; + 3186A37421A4B0FA0052BF02 /* attrib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = attrib.h; path = ../../include/attrib.h; sourceTree = ""; }; + 3186A37521A4B0FA0052BF02 /* patchlevel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = patchlevel.h; path = ../../include/patchlevel.h; sourceTree = ""; }; + 3186A37621A4B0FA0052BF02 /* wincurs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wincurs.h; path = ../../include/wincurs.h; sourceTree = ""; }; + 3186A37721A4B0FA0052BF02 /* pm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pm.h; path = ../../include/pm.h; sourceTree = ""; }; + 3186A37821A4B0FA0052BF02 /* qt_kde0.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = qt_kde0.h; path = ../../include/qt_kde0.h; sourceTree = ""; }; + 3186A37921A4B0FA0052BF02 /* monattk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = monattk.h; path = ../../include/monattk.h; sourceTree = ""; }; + 3186A37A21A4B0FA0052BF02 /* integer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = integer.h; path = ../../include/integer.h; sourceTree = ""; }; + 3186A37B21A4B0FA0052BF02 /* region.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = region.h; path = ../../include/region.h; sourceTree = ""; }; + 3186A37C21A4B0FA0052BF02 /* rect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rect.h; path = ../../include/rect.h; sourceTree = ""; }; + 3186A37D21A4B0FA0052BF02 /* wingem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wingem.h; path = ../../include/wingem.h; sourceTree = ""; }; + 3186A37E21A4B0FA0052BF02 /* vision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = vision.h; path = ../../include/vision.h; sourceTree = ""; }; + 3186A37F21A4B0FA0052BF02 /* prop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = prop.h; path = ../../include/prop.h; sourceTree = ""; }; + 3186A38021A4B0FB0052BF02 /* amiconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = amiconf.h; path = ../../include/amiconf.h; sourceTree = ""; }; + 3186A38121A4B0FB0052BF02 /* pcconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pcconf.h; path = ../../include/pcconf.h; sourceTree = ""; }; + 3186A38221A4B0FB0052BF02 /* skills.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = skills.h; path = ../../include/skills.h; sourceTree = ""; }; + 3186A38321A4B0FB0052BF02 /* permonst.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = permonst.h; path = ../../include/permonst.h; sourceTree = ""; }; + 3186A38421A4B0FB0052BF02 /* monsym.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = monsym.h; path = ../../include/monsym.h; sourceTree = ""; }; + 3186A38521A4B0FB0052BF02 /* mextra.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mextra.h; path = ../../include/mextra.h; sourceTree = ""; }; + 3186A38621A4B0FB0052BF02 /* dgn_comp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dgn_comp.h; path = ../../include/dgn_comp.h; sourceTree = ""; }; + 3186A38721A4B0FB0052BF02 /* color.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = color.h; path = ../../include/color.h; sourceTree = ""; }; + 3186A38821A4B0FB0052BF02 /* artifact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = artifact.h; path = ../../include/artifact.h; sourceTree = ""; }; + 3186A38921A4B0FB0052BF02 /* mttypriv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mttypriv.h; path = ../../include/mttypriv.h; sourceTree = ""; }; + 3186A38A21A4B0FB0052BF02 /* system.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = system.h; path = ../../include/system.h; sourceTree = ""; }; + 3186A38B21A4B0FC0052BF02 /* onames.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = onames.h; path = ../../include/onames.h; sourceTree = ""; }; + 3186A38C21A4B0FC0052BF02 /* trampoli.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = trampoli.h; path = ../../include/trampoli.h; sourceTree = ""; }; + 3186A38D21A4B0FC0052BF02 /* vis_tab.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = vis_tab.h; path = ../../include/vis_tab.h; sourceTree = ""; }; + 3186A38E21A4B0FC0052BF02 /* dlb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dlb.h; path = ../../include/dlb.h; sourceTree = ""; }; + 3186A38F21A4B0FC0052BF02 /* monflag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = monflag.h; path = ../../include/monflag.h; sourceTree = ""; }; + 3186A39021A4B0FC0052BF02 /* lev_comp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lev_comp.h; path = ../../include/lev_comp.h; sourceTree = ""; }; + 3186A39121A4B0FC0052BF02 /* micro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = micro.h; path = ../../include/micro.h; sourceTree = ""; }; + 3186A39221A4B0FC0052BF02 /* qtext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = qtext.h; path = ../../include/qtext.h; sourceTree = ""; }; + 3186A39321A4B0FC0052BF02 /* xwindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = xwindow.h; path = ../../include/xwindow.h; sourceTree = ""; }; + 3186A39421A4B0FC0052BF02 /* tileset.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tileset.h; path = ../../include/tileset.h; sourceTree = ""; }; + 3186A39521A4B0FC0052BF02 /* obj.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = obj.h; path = ../../include/obj.h; sourceTree = ""; }; + 3186A39621A4B0FC0052BF02 /* os2conf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = os2conf.h; path = ../../include/os2conf.h; sourceTree = ""; }; + 3186A39721A4B0FC0052BF02 /* rm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rm.h; path = ../../include/rm.h; sourceTree = ""; }; + 3186A39821A4B0FC0052BF02 /* qt_clust.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = qt_clust.h; path = ../../include/qt_clust.h; sourceTree = ""; }; + 3186A39921A4B0FD0052BF02 /* load_img.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = load_img.h; path = ../../include/load_img.h; sourceTree = ""; }; + 3186A39A21A4B0FD0052BF02 /* wintty.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wintty.h; path = ../../include/wintty.h; sourceTree = ""; }; + 3186A39B21A4B0FD0052BF02 /* ntconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ntconf.h; path = ../../include/ntconf.h; sourceTree = ""; }; + 3186A39C21A4B0FD0052BF02 /* mkroom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mkroom.h; path = ../../include/mkroom.h; sourceTree = ""; }; + 3186A39D21A4B0FD0052BF02 /* macpopup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = macpopup.h; path = ../../include/macpopup.h; sourceTree = ""; }; + 3186A39E21A4B0FD0052BF02 /* quest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = quest.h; path = ../../include/quest.h; sourceTree = ""; }; + 3186A39F21A4B0FD0052BF02 /* mac-qt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "mac-qt.h"; path = "../../include/mac-qt.h"; sourceTree = ""; }; + 3186A3A021A4B0FD0052BF02 /* dgn_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dgn_file.h; path = ../../include/dgn_file.h; sourceTree = ""; }; + 3186A3A121A4B0FD0052BF02 /* tile2x11.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tile2x11.h; path = ../../include/tile2x11.h; sourceTree = ""; }; + 3186A3A221A4B0FD0052BF02 /* engrave.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = engrave.h; path = ../../include/engrave.h; sourceTree = ""; }; + 3186A3A321A4B0FD0052BF02 /* spell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = spell.h; path = ../../include/spell.h; sourceTree = ""; }; + 3186A3A421A4B0FD0052BF02 /* mac-carbon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "mac-carbon.h"; path = "../../include/mac-carbon.h"; sourceTree = ""; }; + 3186A3A521A4B0FD0052BF02 /* hack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = hack.h; path = ../../include/hack.h; sourceTree = ""; }; + 3186A3A621A4B0FD0052BF02 /* macconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = macconf.h; path = ../../include/macconf.h; sourceTree = ""; }; + 3186A3A721A4B0FD0052BF02 /* youprop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = youprop.h; path = ../../include/youprop.h; sourceTree = ""; }; + 3186A3A821A4B0FD0052BF02 /* objclass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = objclass.h; path = ../../include/objclass.h; sourceTree = ""; }; + 3186A3A921A4B0FD0052BF02 /* display.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = display.h; path = ../../include/display.h; sourceTree = ""; }; + 3186A3AA21A4B0FD0052BF02 /* winami.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = winami.h; path = ../../include/winami.h; sourceTree = ""; }; + 3186A3AB21A4B0FD0052BF02 /* artilist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = artilist.h; path = ../../include/artilist.h; sourceTree = ""; }; + 3186A3AC21A4B0FD0052BF02 /* dungeon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dungeon.h; path = ../../include/dungeon.h; sourceTree = ""; }; + 3186A3AD21A4B0FD0052BF02 /* unixconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = unixconf.h; path = ../../include/unixconf.h; sourceTree = ""; }; + 3186A3AE21A4B0FD0052BF02 /* mactty.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mactty.h; path = ../../include/mactty.h; sourceTree = ""; }; + 3186A3AF21A4B0FD0052BF02 /* def_os2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = def_os2.h; path = ../../include/def_os2.h; sourceTree = ""; }; + 3186A3B021A4B0FD0052BF02 /* date.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = date.h; path = ../../include/date.h; sourceTree = ""; }; + 3186A3B121A4B0FD0052BF02 /* bitmfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bitmfile.h; path = ../../include/bitmfile.h; sourceTree = ""; }; + 3186A3B221A4B0FD0052BF02 /* wceconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wceconf.h; path = ../../include/wceconf.h; sourceTree = ""; }; + 3186A3B321A4B0FD0052BF02 /* mfndpos.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mfndpos.h; path = ../../include/mfndpos.h; sourceTree = ""; }; + 3186A3B421A4B0FD0052BF02 /* qt_win.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = qt_win.h; path = ../../include/qt_win.h; sourceTree = ""; }; + 3186A3B521A4B0FD0052BF02 /* flag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = flag.h; path = ../../include/flag.h; sourceTree = ""; }; + 3186A3B621A4B0FD0052BF02 /* sp_lev.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sp_lev.h; path = ../../include/sp_lev.h; sourceTree = ""; }; + 3186A3B721A4B0FD0052BF02 /* align.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = align.h; path = ../../include/align.h; sourceTree = ""; }; + 3186A3B821A4B0FD0052BF02 /* mail.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mail.h; path = ../../include/mail.h; sourceTree = ""; }; + 3186A3B921A4B0FD0052BF02 /* tosconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tosconf.h; path = ../../include/tosconf.h; sourceTree = ""; }; + 3186A3BA21A4B0FD0052BF02 /* beconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = beconf.h; path = ../../include/beconf.h; sourceTree = ""; }; + 3186A3BB21A4B0FD0052BF02 /* monst.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = monst.h; path = ../../include/monst.h; sourceTree = ""; }; + 3186A3BC21A4B0FD0052BF02 /* lint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lint.h; path = ../../include/lint.h; sourceTree = ""; }; + 3186A3BD21A4B0FD0052BF02 /* qt_xpms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = qt_xpms.h; path = ../../include/qt_xpms.h; sourceTree = ""; }; + 3186A3BE21A4B0FD0052BF02 /* vmsconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = vmsconf.h; path = ../../include/vmsconf.h; sourceTree = ""; }; + 3186A3BF21A4B0FD0052BF02 /* you.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = you.h; path = ../../include/you.h; sourceTree = ""; }; + 3186A3C021A4B0FD0052BF02 /* wintype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wintype.h; path = ../../include/wintype.h; sourceTree = ""; }; + 3186A3C121A4B0FD0052BF02 /* global.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = global.h; path = ../../include/global.h; sourceTree = ""; }; + 3186A3C221A4B0FE0052BF02 /* winX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = winX.h; path = ../../include/winX.h; sourceTree = ""; }; + 3186A3C321A4B0FE0052BF02 /* tcap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tcap.h; path = ../../include/tcap.h; sourceTree = ""; }; + 3186A3C421A4B0FE0052BF02 /* qttableview.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = qttableview.h; path = ../../include/qttableview.h; sourceTree = ""; }; + 3186A3C521A4B0FE0052BF02 /* coord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = coord.h; path = ../../include/coord.h; sourceTree = ""; }; + 3186A3C621A4B0FE0052BF02 /* config1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = config1.h; path = ../../include/config1.h; sourceTree = ""; }; + 3186A3C721A4B0FE0052BF02 /* tradstdc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tradstdc.h; path = ../../include/tradstdc.h; sourceTree = ""; }; + 3186A3C821A4B0FE0052BF02 /* mondata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mondata.h; path = ../../include/mondata.h; sourceTree = ""; }; + 3186A3C921A4B0FE0052BF02 /* macwin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = macwin.h; path = ../../include/macwin.h; sourceTree = ""; }; + 3186A3CA21A4B0FE0052BF02 /* timeout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = timeout.h; path = ../../include/timeout.h; sourceTree = ""; }; + 3186A3CB21A4B0FE0052BF02 /* sys.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sys.h; path = ../../include/sys.h; sourceTree = ""; }; + 3186A3CC21A4B0FE0052BF02 /* gem_rsc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gem_rsc.h; path = ../../include/gem_rsc.h; sourceTree = ""; }; + 3186A3CD21A4B0FE0052BF02 /* trap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = trap.h; path = ../../include/trap.h; sourceTree = ""; }; + 3186A3CE21A4B0FE0052BF02 /* winGnome.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = winGnome.h; path = ../../include/winGnome.h; sourceTree = ""; }; + 3186A3CF21A4B0FE0052BF02 /* lev.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lev.h; path = ../../include/lev.h; sourceTree = ""; }; + 3186A3D021A4B0FE0052BF02 /* decl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = decl.h; path = ../../include/decl.h; sourceTree = ""; }; + 3186A3D321A4B14B0052BF02 /* cursstat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cursstat.h; path = ../../win/curses/cursstat.h; sourceTree = ""; }; + 3186A3D421A4B14B0052BF02 /* cursdial.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cursdial.h; path = ../../win/curses/cursdial.h; sourceTree = ""; }; + 3186A3D521A4B14B0052BF02 /* cursmesg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cursmesg.h; path = ../../win/curses/cursmesg.h; sourceTree = ""; }; + 3186A3D621A4B14B0052BF02 /* cursinit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cursinit.h; path = ../../win/curses/cursinit.h; sourceTree = ""; }; + 3186A3D721A4B14B0052BF02 /* cursinvt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cursinvt.h; path = ../../win/curses/cursinvt.h; sourceTree = ""; }; + 3186A3D821A4B14B0052BF02 /* cursmisc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cursmisc.h; path = ../../win/curses/cursmisc.h; sourceTree = ""; }; + 3186A3D921A4B14B0052BF02 /* curswins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = curswins.h; path = ../../win/curses/curswins.h; sourceTree = ""; }; 3189577121A1FCC100FB2ABE /* NetHack */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = NetHack; sourceTree = BUILT_PRODUCTS_DIR; }; 3189577F21A1FDA400FB2ABE /* makedefs */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = makedefs; sourceTree = BUILT_PRODUCTS_DIR; }; 3192867B21A3ACAB00325BEB /* lev_comp.y */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.yacc; name = lev_comp.y; path = ../../util/lev_comp.y; sourceTree = ""; }; @@ -694,6 +801,106 @@ 3189579621A2046700FB2ABE /* include */ = { isa = PBXGroup; children = ( + 3186A3B721A4B0FD0052BF02 /* align.h */, + 3186A38021A4B0FB0052BF02 /* amiconf.h */, + 3186A38821A4B0FB0052BF02 /* artifact.h */, + 3186A3AB21A4B0FD0052BF02 /* artilist.h */, + 3186A37421A4B0FA0052BF02 /* attrib.h */, + 3186A3BA21A4B0FD0052BF02 /* beconf.h */, + 3186A3B121A4B0FD0052BF02 /* bitmfile.h */, + 3186A36E21A4B0FA0052BF02 /* botl.h */, + 3186A38721A4B0FB0052BF02 /* color.h */, + 3186A3C621A4B0FE0052BF02 /* config1.h */, + 3186A37121A4B0FA0052BF02 /* context.h */, + 3186A3C521A4B0FE0052BF02 /* coord.h */, + 3186A3B021A4B0FD0052BF02 /* date.h */, + 3186A3D021A4B0FE0052BF02 /* decl.h */, + 3186A3AF21A4B0FD0052BF02 /* def_os2.h */, + 3186A38621A4B0FB0052BF02 /* dgn_comp.h */, + 3186A3A021A4B0FD0052BF02 /* dgn_file.h */, + 3186A3A921A4B0FD0052BF02 /* display.h */, + 3186A38E21A4B0FC0052BF02 /* dlb.h */, + 3186A3AC21A4B0FD0052BF02 /* dungeon.h */, + 3186A3A221A4B0FD0052BF02 /* engrave.h */, + 3186A37021A4B0FA0052BF02 /* extern.h */, + 3186A3B521A4B0FD0052BF02 /* flag.h */, + 3186A37321A4B0FA0052BF02 /* func_tab.h */, + 3186A3CC21A4B0FE0052BF02 /* gem_rsc.h */, + 3186A3C121A4B0FD0052BF02 /* global.h */, + 3186A3A521A4B0FD0052BF02 /* hack.h */, + 3186A37A21A4B0FA0052BF02 /* integer.h */, + 3186A39021A4B0FC0052BF02 /* lev_comp.h */, + 3186A3CF21A4B0FE0052BF02 /* lev.h */, + 3186A3BC21A4B0FD0052BF02 /* lint.h */, + 3186A39921A4B0FD0052BF02 /* load_img.h */, + 3186A3A421A4B0FD0052BF02 /* mac-carbon.h */, + 3186A39F21A4B0FD0052BF02 /* mac-qt.h */, + 3186A37221A4B0FA0052BF02 /* mac-term.h */, + 3186A3A621A4B0FD0052BF02 /* macconf.h */, + 3186A39D21A4B0FD0052BF02 /* macpopup.h */, + 3186A3AE21A4B0FD0052BF02 /* mactty.h */, + 3186A3C921A4B0FE0052BF02 /* macwin.h */, + 3186A3B821A4B0FD0052BF02 /* mail.h */, + 3186A38521A4B0FB0052BF02 /* mextra.h */, + 3186A3B321A4B0FD0052BF02 /* mfndpos.h */, + 3186A39121A4B0FC0052BF02 /* micro.h */, + 3186A39C21A4B0FD0052BF02 /* mkroom.h */, + 3186A37921A4B0FA0052BF02 /* monattk.h */, + 3186A3C821A4B0FE0052BF02 /* mondata.h */, + 3186A38F21A4B0FC0052BF02 /* monflag.h */, + 3186A3BB21A4B0FD0052BF02 /* monst.h */, + 3186A38421A4B0FB0052BF02 /* monsym.h */, + 3186A38921A4B0FB0052BF02 /* mttypriv.h */, + 3186A39B21A4B0FD0052BF02 /* ntconf.h */, + 3186A39521A4B0FC0052BF02 /* obj.h */, + 3186A3A821A4B0FD0052BF02 /* objclass.h */, + 3186A38B21A4B0FC0052BF02 /* onames.h */, + 3186A39621A4B0FC0052BF02 /* os2conf.h */, + 3186A37521A4B0FA0052BF02 /* patchlevel.h */, + 3186A38121A4B0FB0052BF02 /* pcconf.h */, + 3186A38321A4B0FB0052BF02 /* permonst.h */, + 3186A37721A4B0FA0052BF02 /* pm.h */, + 3186A37F21A4B0FA0052BF02 /* prop.h */, + 3186A39821A4B0FC0052BF02 /* qt_clust.h */, + 3186A37821A4B0FA0052BF02 /* qt_kde0.h */, + 3186A3B421A4B0FD0052BF02 /* qt_win.h */, + 3186A3BD21A4B0FD0052BF02 /* qt_xpms.h */, + 3186A39221A4B0FC0052BF02 /* qtext.h */, + 3186A3C421A4B0FE0052BF02 /* qttableview.h */, + 3186A39E21A4B0FD0052BF02 /* quest.h */, + 3186A37C21A4B0FA0052BF02 /* rect.h */, + 3186A37B21A4B0FA0052BF02 /* region.h */, + 3186A39721A4B0FC0052BF02 /* rm.h */, + 3186A38221A4B0FB0052BF02 /* skills.h */, + 3186A3B621A4B0FD0052BF02 /* sp_lev.h */, + 3186A3A321A4B0FD0052BF02 /* spell.h */, + 3186A3CB21A4B0FE0052BF02 /* sys.h */, + 3186A38A21A4B0FB0052BF02 /* system.h */, + 3186A3C321A4B0FE0052BF02 /* tcap.h */, + 3186A3A121A4B0FD0052BF02 /* tile2x11.h */, + 3186A39421A4B0FC0052BF02 /* tileset.h */, + 3186A3CA21A4B0FE0052BF02 /* timeout.h */, + 3186A3B921A4B0FD0052BF02 /* tosconf.h */, + 3186A3C721A4B0FE0052BF02 /* tradstdc.h */, + 3186A38C21A4B0FC0052BF02 /* trampoli.h */, + 3186A3CD21A4B0FE0052BF02 /* trap.h */, + 3186A3AD21A4B0FD0052BF02 /* unixconf.h */, + 3186A38D21A4B0FC0052BF02 /* vis_tab.h */, + 3186A37E21A4B0FA0052BF02 /* vision.h */, + 3186A3BE21A4B0FD0052BF02 /* vmsconf.h */, + 3186A3B221A4B0FD0052BF02 /* wceconf.h */, + 3186A3AA21A4B0FD0052BF02 /* winami.h */, + 3186A37621A4B0FA0052BF02 /* wincurs.h */, + 3186A37D21A4B0FA0052BF02 /* wingem.h */, + 3186A3CE21A4B0FE0052BF02 /* winGnome.h */, + 3186A36F21A4B0FA0052BF02 /* winprocs.h */, + 3186A39A21A4B0FD0052BF02 /* wintty.h */, + 3186A3C021A4B0FD0052BF02 /* wintype.h */, + 3186A3C221A4B0FE0052BF02 /* winX.h */, + 3186A39321A4B0FC0052BF02 /* xwindow.h */, + 3186A36D21A4B0F90052BF02 /* xwindowp.h */, + 3186A3BF21A4B0FD0052BF02 /* you.h */, + 3186A3A721A4B0FD0052BF02 /* youprop.h */, 31B8A30A21A20D730055BD01 /* config.h */, ); name = include; @@ -751,6 +958,13 @@ 31B8A40221A23EAA0055BD01 /* curses */ = { isa = PBXGroup; children = ( + 3186A3D421A4B14B0052BF02 /* cursdial.h */, + 3186A3D621A4B14B0052BF02 /* cursinit.h */, + 3186A3D721A4B14B0052BF02 /* cursinvt.h */, + 3186A3D521A4B14B0052BF02 /* cursmesg.h */, + 3186A3D821A4B14B0052BF02 /* cursmisc.h */, + 3186A3D321A4B14B0052BF02 /* cursstat.h */, + 3186A3D921A4B14B0052BF02 /* curswins.h */, 31B8A40421A23EEB0055BD01 /* cursdial.c */, 31B8A40621A23EEB0055BD01 /* cursinit.c */, 31B8A40521A23EEB0055BD01 /* cursinvt.c */, From 4228cf534e89780e06fbf677234dc3e354b95d2a Mon Sep 17 00:00:00 2001 From: nhmall Date: Tue, 20 Nov 2018 19:09:05 -0500 Subject: [PATCH 70/74] follow-up bits --- include/system.h | 5 +++++ util/makedefs.c | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/include/system.h b/include/system.h index f0b53fe3c..1074d6c03 100644 --- a/include/system.h +++ b/include/system.h @@ -91,8 +91,13 @@ E int FDECL(srandom, (unsigned int)); #endif #endif #else +#if defined(MACOSX) E long NDECL(lrand48); E void FDECL(srand48, (long)); +#else +E long lrand48(); +E void srand48(); +#endif /* MACOSX */ #endif /* BSD || ULTRIX || RANDOM */ #if !defined(BSD) || defined(ultrix) diff --git a/util/makedefs.c b/util/makedefs.c index 6d5ab510a..a9a39048f 100644 --- a/util/makedefs.c +++ b/util/makedefs.c @@ -298,7 +298,7 @@ link_sanity_check() monst_init(); objects_init(); - /* Quite unused warning */ + /* Quiet unused warning */ (void) SCCS_Id; } From d10a18ff001a88753f65d5d505c7946860fb1d48 Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 16:11:22 -0800 Subject: [PATCH 71/74] Switching back to tty on picked by default for XCode biuld. --- sys/unix/NetHack.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/unix/NetHack.xcodeproj/project.pbxproj b/sys/unix/NetHack.xcodeproj/project.pbxproj index 1842e3c27..4a0d53ae5 100644 --- a/sys/unix/NetHack.xcodeproj/project.pbxproj +++ b/sys/unix/NetHack.xcodeproj/project.pbxproj @@ -2015,7 +2015,7 @@ OTHER_CFLAGS = ( "-DNOMAIL", "-DNOTPARMDECL", - "-DDEFAULT_WINDOW_SYS=\\\"curses\\\"", + "-DDEFAULT_WINDOW_SYS=\\\"tty\\\"", "-DDLB", "-DGREPPATH=\\\"/usr/bin/grep\\\"", "-DSYSCF", @@ -2090,7 +2090,7 @@ OTHER_CFLAGS = ( "-DNOMAIL", "-DNOTPARMDECL", - "-DDEFAULT_WINDOW_SYS=\\\"curses\\\"", + "-DDEFAULT_WINDOW_SYS=\\\"tty\\\"", "-DDLB", "-DGREPPATH=\\\"/usr/bin/grep\\\"", "-DSYSCF", From b4be8852a467efd51679d5572867824cc0454d45 Mon Sep 17 00:00:00 2001 From: nhmall Date: Tue, 20 Nov 2018 20:30:44 -0500 Subject: [PATCH 72/74] suppress compiler warning differently --- include/tradstdc.h | 5 +++++ util/makedefs.c | 4 +--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/include/tradstdc.h b/include/tradstdc.h index 1caf7a667..5e5cbd7c2 100644 --- a/include/tradstdc.h +++ b/include/tradstdc.h @@ -389,6 +389,11 @@ typedef genericptr genericptr_t; /* (void *) or (char *) */ #undef signed #endif +#ifdef __clang__ +#define UNUSED __attribute__((unused)) +#define NORETURN __attribute__((noreturn)) +#endif + /* * Allow gcc2 to check parameters of printf-like calls with -Wformat; * append this to a prototype declaration (see pline() in extern.h). diff --git a/util/makedefs.c b/util/makedefs.c index a9a39048f..0b97a8bcb 100644 --- a/util/makedefs.c +++ b/util/makedefs.c @@ -53,7 +53,7 @@ #endif #if defined(UNIX) && !defined(LINT) && !defined(GCC_WARN) -static const char SCCS_Id[] = "@(#)makedefs.c\t3.6\t2018/03/02"; +static const char SCCS_Id[] UNUSED = "@(#)makedefs.c\t3.6\t2018/03/02"; #endif /* names of files to be generated */ @@ -298,8 +298,6 @@ link_sanity_check() monst_init(); objects_init(); - /* Quiet unused warning */ - (void) SCCS_Id; } void From 50cb52ab31a738a9b3d921ed19efe70213e82537 Mon Sep 17 00:00:00 2001 From: PatR Date: Tue, 20 Nov 2018 17:56:16 -0800 Subject: [PATCH 73/74] sentence spacing Use two spaces between sentences. This only fixes the instances of one-space that were fairly easy to find. --- src/apply.c | 4 ++-- src/dig.c | 4 ++-- src/do.c | 4 ++-- src/eat.c | 30 +++++++++++++++--------------- src/files.c | 8 ++++---- src/mail.c | 4 ++-- src/mthrowu.c | 6 +++--- src/music.c | 4 ++-- src/region.c | 4 ++-- src/sounds.c | 4 ++-- src/spell.c | 4 ++-- src/steed.c | 4 ++-- src/trap.c | 10 +++++----- src/uhitm.c | 4 ++-- src/vault.c | 10 ++++++---- 15 files changed, 53 insertions(+), 51 deletions(-) diff --git a/src/apply.c b/src/apply.c index 5a7ba6d19..d202acc77 100644 --- a/src/apply.c +++ b/src/apply.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 apply.c $NHDT-Date: 1526769961 2018/05/19 22:46:01 $ $NHDT-Branch: NetHack-3.6.2 $:$NHDT-Revision: 1.246 $ */ +/* NetHack 3.6 apply.c $NHDT-Date: 1542765339 2018/11/21 01:55:39 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.254 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */ /* NetHack may be freely redistributed. See license for details. */ @@ -116,7 +116,7 @@ struct obj *obj; if (!ublindf) { old = u.ucreamed; u.ucreamed += rn1(10, 3); - pline("Yecch! Your %s %s gunk on it!", body_part(FACE), + pline("Yecch! Your %s %s gunk on it!", body_part(FACE), (old ? "has more" : "now has")); make_blinded(Blinded + (long) u.ucreamed - old, TRUE); } else { diff --git a/src/dig.c b/src/dig.c index 1cdaee380..3f5e74bc0 100644 --- a/src/dig.c +++ b/src/dig.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 dig.c $NHDT-Date: 1517913682 2018/02/06 10:41:22 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.108 $ */ +/* NetHack 3.6 dig.c $NHDT-Date: 1542765354 2018/11/21 01:55:54 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.115 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Michael Allison, 2012. */ /* NetHack may be freely redistributed. See license for details. */ @@ -811,7 +811,7 @@ coord *cc; * digging makes a hole, but the boulder immediately * fills it. Final outcome: no hole, no boulder. */ - pline("KADOOM! The boulder falls in!"); + pline("KADOOM! The boulder falls in!"); (void) delfloortrap(ttmp); } delobj(boulder_here); diff --git a/src/do.c b/src/do.c index 29d27a1ce..4bb739254 100644 --- a/src/do.c +++ b/src/do.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 do.c $NHDT-Date: 1472809073 2016/09/02 09:37:53 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.158 $ */ +/* NetHack 3.6 do.c $NHDT-Date: 1542765356 2018/11/21 01:55:56 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.174 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Derek S. Ray, 2015. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1063,7 +1063,7 @@ doup() if (ledger_no(&u.uz) == 1) { if (iflags.debug_fuzzer) return 0; - if (yn("Beware, there will be no return! Still climb?") != 'y') + if (yn("Beware, there will be no return! Still climb?") != 'y') return 0; } if (!next_to_u()) { diff --git a/src/eat.c b/src/eat.c index 0d9df6ce7..94a86568a 100644 --- a/src/eat.c +++ b/src/eat.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 eat.c $NHDT-Date: 1540596900 2018/10/26 23:35:00 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.193 $ */ +/* NetHack 3.6 eat.c $NHDT-Date: 1542765357 2018/11/21 01:55:57 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.197 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1085,7 +1085,7 @@ int pm; case PM_MASTER_MIND_FLAYER: if (ABASE(A_INT) < ATTRMAX(A_INT)) { if (!rn2(2)) { - pline("Yum! That was real brain food!"); + pline("Yum! That was real brain food!"); (void) adjattrib(A_INT, 1, FALSE); break; /* don't give them telepathy, too */ } @@ -1802,7 +1802,7 @@ struct obj *otmp; if (carnivorous(youmonst.data) && !humanoid(youmonst.data)) pline("That tripe ration was surprisingly good!"); else if (maybe_polyd(is_orc(youmonst.data), Race_if(PM_ORC))) - pline(Hallucination ? "Tastes great! Less filling!" + pline(Hallucination ? "Tastes great! Less filling!" : "Mmm, tripe... not bad!"); else { pline("Yak - dog food!"); @@ -2336,7 +2336,7 @@ struct obj *otmp; */ if (cadaver && mnum != PM_ACID_BLOB && rotted > 5L && !Sick_resistance) { /* Tainted meat */ - Sprintf(buf, "%s like %s could be tainted! %s", foodsmell, it_or_they, + Sprintf(buf, "%s like %s could be tainted! %s", foodsmell, it_or_they, eat_it_anyway); if (yn_function(buf, ynchars, 'n') == 'n') return 1; @@ -2344,7 +2344,7 @@ struct obj *otmp; return 2; } if (stoneorslime) { - Sprintf(buf, "%s like %s could be something very dangerous! %s", + Sprintf(buf, "%s like %s could be something very dangerous! %s", foodsmell, it_or_they, eat_it_anyway); if (yn_function(buf, ynchars, 'n') == 'n') return 1; @@ -2353,7 +2353,7 @@ struct obj *otmp; } if (otmp->orotten || (cadaver && rotted > 3L)) { /* Rotten */ - Sprintf(buf, "%s like %s could be rotten! %s", foodsmell, it_or_they, + Sprintf(buf, "%s like %s could be rotten! %s", foodsmell, it_or_they, eat_it_anyway); if (yn_function(buf, ynchars, 'n') == 'n') return 1; @@ -2362,7 +2362,7 @@ struct obj *otmp; } if (cadaver && poisonous(&mons[mnum]) && !Poison_resistance) { /* poisonous */ - Sprintf(buf, "%s like %s might be poisonous! %s", foodsmell, + Sprintf(buf, "%s like %s might be poisonous! %s", foodsmell, it_or_they, eat_it_anyway); if (yn_function(buf, ynchars, 'n') == 'n') return 1; @@ -2371,20 +2371,20 @@ struct obj *otmp; } if (otmp->otyp == APPLE && otmp->cursed && !Sleep_resistance) { /* causes sleep, for long enough to be dangerous */ - Sprintf(buf, "%s like %s might have been poisoned. %s", foodsmell, + Sprintf(buf, "%s like %s might have been poisoned. %s", foodsmell, it_or_they, eat_it_anyway); return (yn_function(buf, ynchars, 'n') == 'n') ? 1 : 2; } if (cadaver && !vegetarian(&mons[mnum]) && !u.uconduct.unvegetarian && Role_if(PM_MONK)) { - Sprintf(buf, "%s unhealthy. %s", foodsmell, eat_it_anyway); + Sprintf(buf, "%s unhealthy. %s", foodsmell, eat_it_anyway); if (yn_function(buf, ynchars, 'n') == 'n') return 1; else return 2; } if (cadaver && acidic(&mons[mnum]) && !Acid_resistance) { - Sprintf(buf, "%s rather acidic. %s", foodsmell, eat_it_anyway); + Sprintf(buf, "%s rather acidic. %s", foodsmell, eat_it_anyway); if (yn_function(buf, ynchars, 'n') == 'n') return 1; else @@ -2392,7 +2392,7 @@ struct obj *otmp; } if (Upolyd && u.umonnum == PM_RUST_MONSTER && is_metallic(otmp) && otmp->oerodeproof) { - Sprintf(buf, "%s disgusting to you right now. %s", foodsmell, + Sprintf(buf, "%s disgusting to you right now. %s", foodsmell, eat_it_anyway); if (yn_function(buf, ynchars, 'n') == 'n') return 1; @@ -2407,7 +2407,7 @@ struct obj *otmp; && ((material == LEATHER || material == BONE || material == DRAGON_HIDE || material == WAX) || (cadaver && !vegan(&mons[mnum])))) { - Sprintf(buf, "%s foul and unfamiliar to you. %s", foodsmell, + Sprintf(buf, "%s foul and unfamiliar to you. %s", foodsmell, eat_it_anyway); if (yn_function(buf, ynchars, 'n') == 'n') return 1; @@ -2418,7 +2418,7 @@ struct obj *otmp; && ((material == LEATHER || material == BONE || material == DRAGON_HIDE) || (cadaver && !vegetarian(&mons[mnum])))) { - Sprintf(buf, "%s unfamiliar to you. %s", foodsmell, eat_it_anyway); + Sprintf(buf, "%s unfamiliar to you. %s", foodsmell, eat_it_anyway); if (yn_function(buf, ynchars, 'n') == 'n') return 1; else @@ -2427,8 +2427,8 @@ struct obj *otmp; if (cadaver && mnum != PM_ACID_BLOB && rotted > 5L && Sick_resistance) { /* Tainted meat with Sick_resistance */ - Sprintf(buf, "%s like %s could be tainted! %s", foodsmell, it_or_they, - eat_it_anyway); + Sprintf(buf, "%s like %s could be tainted! %s", + foodsmell, it_or_they, eat_it_anyway); if (yn_function(buf, ynchars, 'n') == 'n') return 1; else diff --git a/src/files.c b/src/files.c index 2b2a67f56..6385f8beb 100644 --- a/src/files.c +++ b/src/files.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 files.c $NHDT-Date: 1541719971 2018/11/08 23:32:51 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.242 $ */ +/* NetHack 3.6 files.c $NHDT-Date: 1542765358 2018/11/21 01:55:58 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.243 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Derek S. Ray, 2015. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1692,7 +1692,7 @@ int retryct; #ifdef USE_FCNTL lockfd = open(filename, O_RDWR); if (lockfd == -1) { - HUP raw_printf("Cannot open file %s. Is NetHack installed correctly?", + HUP raw_printf("Cannot open file %s. Is NetHack installed correctly?", filename); nesting--; return FALSE; @@ -1717,8 +1717,8 @@ int retryct; #ifdef USE_FCNTL if (retryct--) { HUP raw_printf( - "Waiting for release of fcntl lock on %s. (%d retries left).", - filename, retryct); + "Waiting for release of fcntl lock on %s. (%d retries left.)", + filename, retryct); sleep(1); } else { HUP(void) raw_print("I give up. Sorry."); diff --git a/src/mail.c b/src/mail.c index 8e3eec8f7..376fb4a2a 100644 --- a/src/mail.c +++ b/src/mail.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 mail.c $NHDT-Date: 1519070343 2018/02/19 19:59:03 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.31 $ */ +/* NetHack 3.6 mail.c $NHDT-Date: 1542765359 2018/11/21 01:55:59 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.37 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Pasi Kallinen, 2018. */ /* NetHack may be freely redistributed. See license for details. */ @@ -468,7 +468,7 @@ struct obj *otmp UNUSED; "Please find enclosed a small token to represent your Owlbear", "**FR33 P0T10N 0F FULL H34L1NG**", "Please return to sender (Asmodeus)", - "Buy a potion of gain level for only $19.99! Guaranteed to be blessed!", + "Buy a potion of gain level for only $19.99! Guaranteed to be blessed!", "Invitation: Visit the NetHack web site at http://www.nethack.org!" }; diff --git a/src/mthrowu.c b/src/mthrowu.c index b2ffd6d28..588a516c8 100644 --- a/src/mthrowu.c +++ b/src/mthrowu.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 mthrowu.c $NHDT-Date: 1514152830 2017/12/24 22:00:30 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.73 $ */ +/* NetHack 3.6 mthrowu.c $NHDT-Date: 1542765360 2018/11/21 01:56:00 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.78 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Pasi Kallinen, 2016. */ /* NetHack may be freely redistributed. See license for details. */ @@ -356,12 +356,12 @@ boolean verbose; /* give message(s) even when you can't see what happened */ mtmp->msleeping = 0; if (vis) { if (otmp->otyp == EGG) - pline("Splat! %s is hit with %s egg!", Monnam(mtmp), + pline("Splat! %s is hit with %s egg!", Monnam(mtmp), otmp->known ? an(mons[otmp->corpsenm].mname) : "an"); else hit(distant_name(otmp, mshot_xname), mtmp, exclam(damage)); } else if (verbose && !target) - pline("%s%s is hit%s", (otmp->otyp == EGG) ? "Splat! " : "", + pline("%s%s is hit%s", (otmp->otyp == EGG) ? "Splat! " : "", Monnam(mtmp), exclam(damage)); if (otmp->opoisoned && is_poisonable(otmp)) { diff --git a/src/music.c b/src/music.c index b9e159e75..6b5d3330f 100644 --- a/src/music.c +++ b/src/music.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 music.c $NHDT-Date: 1517877381 2018/02/06 00:36:21 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.47 $ */ +/* NetHack 3.6 music.c $NHDT-Date: 1542765361 2018/11/21 01:56:01 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.56 $ */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ @@ -328,7 +328,7 @@ int force; if ((otmp = sobj_at(BOULDER, x, y)) != 0) { if (cansee(x, y)) - pline("KADOOM! The boulder falls into a chasm%s!", + pline("KADOOM! The boulder falls into a chasm%s!", (x == u.ux && y == u.uy) ? " below you" : ""); if (mtmp) diff --git a/src/region.c b/src/region.c index 258dab98a..526eae801 100644 --- a/src/region.c +++ b/src/region.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 region.c $NHDT-Date: 1496087244 2017/05/29 19:47:24 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.40 $ */ +/* NetHack 3.6 region.c $NHDT-Date: 1542765361 2018/11/21 01:56:01 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.42 $ */ /* Copyright (c) 1996 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ @@ -857,7 +857,7 @@ genericptr_t p2; if (p2 == (genericptr_t) 0) { /* That means the player */ if (!Blind) - You("bump into %s. Ouch!", + You("bump into %s. Ouch!", Hallucination ? "an invisible tree" : "some kind of invisible wall"); else diff --git a/src/sounds.c b/src/sounds.c index 4860915a9..7d4c0be63 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 sounds.c $NHDT-Date: 1452992329 2016/01/17 00:58:49 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.78 $ */ +/* NetHack 3.6 sounds.c $NHDT-Date: 1542765362 2018/11/21 01:56:02 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.81 $ */ /* Copyright (c) 1989 Janet Walz, Mike Threepoint */ /* NetHack may be freely redistributed. See license for details. */ @@ -601,7 +601,7 @@ register struct monst *mtmp; else if (youmonst.data == &mons[PM_SILVER_DRAGON] || youmonst.data == &mons[PM_BABY_SILVER_DRAGON]) { /* Silver dragons are silver in color, not made of silver */ - Sprintf(verbuf, "%s! Your silver sheen does not frighten me!", + Sprintf(verbuf, "%s! Your silver sheen does not frighten me!", youmonst.data == &mons[PM_SILVER_DRAGON] ? "Fool" : "Young Fool"); diff --git a/src/spell.c b/src/spell.c index 27702bfdd..a7fd388ca 100644 --- a/src/spell.c +++ b/src/spell.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 spell.c $NHDT-Date: 1508479722 2017/10/20 06:08:42 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.84 $ */ +/* NetHack 3.6 spell.c $NHDT-Date: 1542765363 2018/11/21 01:56:03 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.87 $ */ /* Copyright (c) M. Stephenson 1988 */ /* NetHack may be freely redistributed. See license for details. */ @@ -1230,7 +1230,7 @@ throwspell() struct monst *mtmp; if (u.uinwater) { - pline("You're joking! In this weather?"); + pline("You're joking! In this weather?"); return 0; } else if (Is_waterlevel(&u.uz)) { You("had better wait for the sun to come out."); diff --git a/src/steed.c b/src/steed.c index 61f252a4c..bf675cca9 100644 --- a/src/steed.c +++ b/src/steed.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 steed.c $NHDT-Date: 1541806894 2018/11/09 23:41:34 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.54 $ */ +/* NetHack 3.6 steed.c $NHDT-Date: 1542765364 2018/11/21 01:56:04 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.57 $ */ /* Copyright (c) Kevin Hugo, 1998-1999. */ /* NetHack may be freely redistributed. See license for details. */ @@ -529,7 +529,7 @@ int reason; /* Player was thrown off etc. */ return; } if (!have_spot) { - You("can't. There isn't anywhere for you to stand."); + You("can't. There isn't anywhere for you to stand."); return; } if (!has_mname(mtmp)) { diff --git a/src/trap.c b/src/trap.c index ab7ed7883..da7e01625 100644 --- a/src/trap.c +++ b/src/trap.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 trap.c $NHDT-Date: 1524312044 2018/04/21 12:00:44 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.290 $ */ +/* NetHack 3.6 trap.c $NHDT-Date: 1542765365 2018/11/21 01:56:05 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.303 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2013. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1523,7 +1523,7 @@ unsigned trflags; int style = ROLL | (trap->tseen ? LAUNCH_KNOWN : 0); feeltrap(trap); - pline("Click! You trigger a rolling boulder trap!"); + pline("Click! You trigger a rolling boulder trap!"); if (!launch_obj(BOULDER, trap->launch.x, trap->launch.y, trap->launch2.x, trap->launch2.y, style)) { deltrap(trap); @@ -2673,7 +2673,7 @@ register struct monst *mtmp; newsym(mtmp->mx, mtmp->my); if (in_sight) - pline("Click! %s triggers %s.", Monnam(mtmp), + pline("Click! %s triggers %s.", Monnam(mtmp), trap->tseen ? "a rolling boulder trap" : something); if (launch_obj(BOULDER, trap->launch.x, trap->launch.y, trap->launch2.x, trap->launch2.y, style)) { @@ -4064,7 +4064,7 @@ boolean force_failure; if (ttmp2) { pline_The( - "webbing sticks to you. You're caught too!"); + "webbing sticks to you. You're caught too!"); dotrap(ttmp2, NOWEBMSG); if (u.usteed && u.utrap) { /* you, not steed, are trapped */ @@ -4402,7 +4402,7 @@ boolean force; deal_with_floor_trap = FALSE; } else { Sprintf( - qbuf, "There %s and %s here. %s %s?", + qbuf, "There %s and %s here. %s %s?", (boxcnt == 1) ? "is a container" : "are containers", an(trapdescr), (ttmp->ttyp == WEB) ? "Remove" : "Disarm", the_trap); diff --git a/src/uhitm.c b/src/uhitm.c index b69fa8720..a14218543 100644 --- a/src/uhitm.c +++ b/src/uhitm.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 uhitm.c $NHDT-Date: 1521684760 2018/03/22 02:12:40 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.176 $ */ +/* NetHack 3.6 uhitm.c $NHDT-Date: 1542765366 2018/11/21 01:56:06 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.185 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */ /* NetHack may be freely redistributed. See license for details. */ @@ -930,7 +930,7 @@ int dieroll; if (touch_petrifies(&mons[obj->corpsenm])) { /*learn_egg_type(obj->corpsenm);*/ - pline("Splat! You hit %s with %s %s egg%s!", + pline("Splat! You hit %s with %s %s egg%s!", mon_nam(mon), obj->known ? "the" : cnt > 1L ? "some" : "a", obj->known ? mons[obj->corpsenm].mname diff --git a/src/vault.c b/src/vault.c index b3def3bd4..1947aa75b 100644 --- a/src/vault.c +++ b/src/vault.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 vault.c $NHDT-Date: 1452132199 2016/01/07 02:03:19 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.42 $ */ +/* NetHack 3.6 vault.c $NHDT-Date: 1542765368 2018/11/21 01:56:08 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.55 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2011. */ /* NetHack may be freely redistributed. See license for details. */ @@ -352,7 +352,8 @@ invault() newsym(guard->mx, guard->my); if (u.uswallow) { /* can't interrogate hero, don't interrogate engulfer */ - if (!Deaf) verbalize("What's going on here?"); + if (!Deaf) + verbalize("What's going on here?"); if (gsensed) pline_The("other presence vanishes."); mongone(guard); @@ -361,8 +362,9 @@ invault() if (youmonst.m_ap_type == M_AP_OBJECT || u.uundetected) { if (youmonst.m_ap_type == M_AP_OBJECT && youmonst.mappearance != GOLD_PIECE) - if (!Deaf) verbalize("Hey! Who left that %s in here?", - mimic_obj_name(&youmonst)); + if (!Deaf) + verbalize("Hey! Who left that %s in here?", + mimic_obj_name(&youmonst)); /* You're mimicking some object or you're hidden. */ pline("Puzzled, %s turns around and leaves.", mhe(guard)); mongone(guard); From f295b00ad1717178c3b6cc80491d7694cff4d76c Mon Sep 17 00:00:00 2001 From: nhmall Date: Tue, 20 Nov 2018 21:00:03 -0500 Subject: [PATCH 74/74] fixes updates for curses and Xcode --- doc/fixes36.2 | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/doc/fixes36.2 b/doc/fixes36.2 index a808ba08d..835f8dad8 100644 --- a/doc/fixes36.2 +++ b/doc/fixes36.2 @@ -230,8 +230,8 @@ X11: its use of genl_status_update exposed a negative index use that could X11: rollback disabling of keystroke input for PICK_NONE menus (for scrolling) -Platform- and/or Interface-Specific Fixes ------------------------------------------ +Platform- and/or Interface-Specific Fixes or Features +----------------------------------------------------- move 'perm_invent' value from flags to iflags to keep it out of save files; affects X11, win32, and curses windows-gui: In nethackw, there could be conflicts between menu accelerators @@ -258,16 +258,22 @@ windows-tty: augment codepage850-to-Unicode mappings that are not displayable on the map windows: Added ntassert() mechanism for Windows based port use windows: heed OPTIONS=symset:default in config file if it is present +windows: add curses window port tty: significant optimizations for performance and per field rendering tty: use WC2_FLUSH_STATUS to buffer changes until BL_FLUSH is received tty: support BL_RESET in status_update to force an update to all status fields tty: stop hitpointbar from jumping to 100% health at zero hit points +MacOSX: add curses window port +MacOSX: add Xcode project to sys/unixNetHack.xcodeproj +MacOSX: add Xcode supporting files README.xcode and XCode.xcconfig + containing important build info unix: Makefile.src and Makefile.utl inadvertently relied on a 'gnu make' extension when using $(VERBOSEMAKE) to reduce build-time feedback; replace with $(QUIETCC) which operates the same but defaults to verbose so doesn't use '$<' for multi-prerequisite targets unless specifically requested; use 'make QUIETCC=1 ' to get the 3.6.1 behavior back +unix: add curses window port vms: data file processing and playground setup were missing post-3.4.3 files engrave, epitaph, and bogusmon made from corresponding *.txt Qt: add Qt5 specific hints file for linux and Mac OS X (Ray Chason)