From cb430610766793433d67831eaf28feff585895d0 Mon Sep 17 00:00:00 2001 From: nhmall Date: Fri, 16 Nov 2018 20:51:22 -0500 Subject: [PATCH 01/60] 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/60] 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/60] 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/60] 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/60] 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/60] 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/60] 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/60] 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/60] 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/60] 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/60] 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/60] 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/60] 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/60] 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/60] 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/60] 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/60] 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/60] 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/60] 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 zcmd442VfON*YLlyyK{Tly)Cze-dpIsr2&yNlF-W~nrXwdW!f=OOnasS(~;@KbY{9R1DQcg0&^ELm`P-km}F)c zGlm(Ey%zexQ%sl2%W-+sjScnIp`H%*V{9%xBDZ%=gR%<_G3S<`VM_hCs?4#^s>=O2I zb~(F(eVToSUCV~qjqE0NGrNU-f!)FGVqa!oXLqyv*f-hz?7Qp%_8@zd{g6Guo@7t6 zpR!-FU$Nh?=h*Mr3+zwq&+M=4Z|qg}8heBNn`1eS({eh_#F;sfvvDpig7a~Ht^wDO zYsxj_T5+wpD6T!%nd`#!;Cga>xqe(M7sn0a61XHTnM>o+x#8RhE{6+px!eS9BA3sV za5K1>+&$bp?ji1BZa%kwTgWZrR&lGjHQW|%E4Pi?&b`3xCZEL@@;oAGMdXe`s&&7#-4?brzjfC+I|-Q|H$;(KXdI({xSz_=tk;B=|<}Ux?J4^-9%lUZi+6XE79GnlXRfFPd8il zpzaafQr#1}WxB9#oo>BugKneldEE}(i@KL|J9WEsZ|L^w_UR7k4(pESj_N+tozQ)z z`$l(8cV2f{_p9zV-4)&My6bwR*Xs>>qdr3K)_e3`y-#0X-%Q_5AEj@v@2&5n@2l^p z@2`*357wvaGxS6Cnffe!wmwH6)aU7o^;7ia`n&Zr^bhLi>gVYn(m$+!RKHaJwEh|W zD*f~N&H63+t@>^H7xk~{U)S%}@6qqqzpH;we_Ve;e^URk{uBLY`m_3P^yl;!^*`x< z*8i#hOMgTExBjMqGZ+jugWcdTG%z$YG%_?cG%>U=L>amnx*K{J;tc}~0}X==35Fy? zhGD2-m|>hDU>I-6Hxw8O4Mm1xL#bhgVYcCZ!vltehDCyub49^;N z8g?08HoRhZ)v(9#j^U8uu;GZ|Q^RM5&kbJ~zBHUQTrm7#_|fp2;fmpRBWvW0yb&8U zMuSl_dW>G9&)D49!r0Q-%GlZ%W$bF~YwTz2Z%i~M8Iz4E##Cd5akMepm}3kYrx-)V z5@V^c%vf%ejB}0ij1L)?8lNyOGcGr-Fg|TuXWVSuV%%zc&G@=;w{eg04dYwJ4~)l* z9~qAuzcPMpJYzg-{Koj5@n_>7#;e9_CT!A}v?iTNZ!()4Cci1tRL|7P)Y{a>)YjC_ z)X~(#6m5zz#hOw~siq;OG*h~1xM`dz*EGR2(Nt$(znCtY zel`7R`pa~~tT!9XMzhImHj8Gr*<<#aeP+M8iMgq{nYp96lex3Gi@B@0r#adjV~#Zs zHYb{s%p=XC%%ja?%wx@&=85KF^AvN)Jj;BqSu%t9KJy&&0`ueMrRFEhYt3QvI`ew- z2J>^~7tA}%ubE#r?>4`0{=j^|e9(Nz{Gs_1^C|P!<}>EA=AX@%%)gi~n}0R`VgB2q zv1lzii^JlyxGWJCx5aO1Y-w$2V`*#YVd-h89=9yDJYiX8S!G#mS!3B^*=pHl*=~8k zveUBL@{VP{Sk79$v7ED9wESebZu!&lm*s}#Z!2rnTScqQ zYPZ(6Hn29dHnKLhHn+C3cC~i1cDKe^toi1)`^1zqekn{$TyldeM5tdd+&>`nUC_U>6*MQ*a3pf?MziUco2S7di+X zg-$|ep^MN}=q7X*dI-IR{z9BENJtctgdxIEVYDzt$P^|E`9gtEC=?0B!W3bKFjKfk zkOUAO5atLE36BX2h2_Eu;Yneo@RYDd*d}ZjUJ!N&FA6USJB8PU-NKu~LE(^aSU4ga z6;2DE3ZDsI3Fn0K!neXN!e!xC;Wy!m@VjtbG>AsgB$`EwXcYy~A-YAsZLlrbHpG@; z8*UqA8*3YH%eLj(@@)CGB3sB-W}9xCVVh+G+x@l&Z4cQN*dDVjwk@?Sx2?22V_Rce zXWM9d&bGz2-S(nwm+e*CZrfhlTekhS_iYDlM{LJzCv2bCKDB*e``Y%6?OWRg+eO2idJGSfWM!Ur>+8y=?yVo9RZ(wh1Z)R_4Z)1`&UCwy(B_?HlaR+Be&`*>~7?+F!B1Zhyo6ru`lJd-enN!}bsD$L$~6PuoAY ze`P;wKX3ou{-gb8`(^tT`&Ij&_P-s-!8^1LgTw3)9CnAx;c@sK^&O2IO&u*9tsU(g z9UPq<-5fm~eH{HAv5oKNe|?HK3CbmTZDI3_s?9L0_j$5cnTW2WO? z$9;|m9CIBHJ05W?bS!Z^;aK5#%CX9^*0J8P$??2ntK$X7OOBTvuQ~QO_Bq~myzBVD zamaDh@sZ=C&GCohy5okEadJ+LQ|~l6txlWM>2y1N z&U(&<&L+<0&Q{L0&i2ku&aTcL&fd;`&KPIBbC7eeGub)Bnc*Dn9OWGA9Pi9_<~sA7 z`OYF|$XVu`?wsMAd2%5f#xXqDMr(h}ejPh`S}5 z_MXn3o}Rv*RL>AknkU_p;Th@~<{9o8;Ti3j?8)~OcnUp5o?_1wPssDK=M~SZp4U9D zdv<&Fc;4{r_3ZP!>3PfZw&xwse$Ts}_dM@=KJXmy9P}LW9QGXX9QAzYIp+DubKG;n zbJFv%=M&E<&uP!6p3gj=d%o~|>G{g@wdaiItmhlgInQ~|x1R4j-+L~2e(?P0x#;=H z^RwrY=NHdq&##`}JXbuwd;aiT^<48@_x$Pk+pF-4(35ni{~Y*G}&t?9G>d{&>+=kj@d^?dbxjeX61EqpC~ZGG*0 zQNCWj-o8G*Sl>Y3Am0ezNZ%;mXx|uLmT#gj&sX9r^_BT%`0n*dzB#`6zD2%ezU96R zzKy<3zOBA(zMZ~ZzTLikzIS~Gd{Ef@tyLW_MP#a^?l>J;Jf6z?)%gCmtW)8 z`gMMr-|lz#y?&p+i@&SCo4>oihrg%4m%q2akH4?KpTECNrk+5cB06Uj&FBK48hNM~gI z$i|UfBD+TRj_e;fATlvBDKaf`Smf}?(UD^!$3|vG1|xGLLy;wsrIBTkQzP$-oE>?8 zxb7Wd)skII1E$p`CW3J@9>&Y~ z7(Wxq)MM&PSkg#ZNhj$ggJhIUl6e!;kZHs;W|}ZfnPyCLrUlbdvXFU=<}uJL2F+^F z>;ui4pm`fK??_Ea?P5Z~%*n+?d4;7V(b=VWQ!`70IRU{N7tGBp%P)=3$tx`irI(W5 zmJBEg4NXfd86zhPre{wK76gd^<;S$L!nj~bX=7Rqb5fFOaDog!sVQHu+e`rG0N>km&xs;kkyA!CL`i<4q)`Q#lY=?I z+>&F=I3~c1XEH}AW}+~&AUHz#Yp`T!ayn7aHRPYOMkJ@F$UCaHH!N3fg#Z7yM&wK= z3}lm0toBA8Gnr|%nwcckTg~K4_2to^jzhKQ5{t5BBS2bCt!6P3TFp$68c0o!Go?%! zGnM>q8Z(_4&D=e*G_Qadjm(1LfZ&Q7mT_xPrDjeDCYKdt1w*5ADl8_!BsG*8Ngk;lY6$_A%iJxsBrW$VE$_YPdQ+_`Y6Y{Bih5FNy_$JSYFl|!tdW(cO+YB0 z-gY`QOKo%VN{FKh7G&j@lL0}N2Su(LthtBQ0_UO{FOV>_a+IMc>;kJLim9u-t+-~hN+pG0l$2`ll z3N!1O4a`PnlhjU%lG;lh!pw8b^Q47aq>fS-(!#D(pS-F)$_ZB3))Lv!%WkD{^?%GJ zRx4ljQ0PtRSXHsAKX(I5A-?+rc|5IE0Ci4zsTf@A?ye)N;y02mOGw(`0q@Gf*p}9nU$v9P~ z6N7~lN+&A94>F-uQWFtfQ50(~b94<=AXVfs<~Z%>kEA}UnG;gK${l@L?&!V&A?x2v z-Gsc-C}N%pgXQfCgQXKmzqcz2O^8Y!R3f{dsFL!MsItPm>8ibJC+kZwaV}Bxi+GrJ z#aYwoU)2hI&YYn=`UUeP^A+>8)L)90Vx-tGb5`!r^HQALqXX(zk6xrb`jZr|_UJFP zN2e?Qk-k*^Yoa#sD)Xn(jn_#x4y4_9gLLB{saKT_B#*qTt1B`g7L8z9Z54(h4)F*h z4bmbV(jx;hA`>zr3$h{siO7cR$bp>5g(8p}d5{jdRBT~+9GX}UXWgtc1kZxuS%~=d!)V6o6_6Te(62w1L>f2 zSUM^lla5O#rB9^O(r3~a(pS43%p zngD1Dpc#N30Q4xJ<$%@#+6-tHpnZTo0CXJC7l6J4bQ#cJz-oXMfQ0rxX-*MR4Mw*nst zd~@JC0pADsfxr&|el+m8mFyFGLAFnW1Hyp+*gl1_$%LwSLVkJi#CF-Y&5+P8S$0xD zh_8+8sd*&<;=wD6eq9!w5)fi*Bf6wGn4e!+@IG1akXqKcps28*Xlk&s=>4+j^jg-r zpsXY>yRzT|vf!b$taC;1KxNTKWzoX}!l3_@b6#O~epya1D!ZsKH*Z3_iMK1r30eBc zfH3esm0nhwmmifMoEj*|%qy&1b;a|J4hYfzsqhk_*`d7R%3{Bi>pZrWy%?NM)-;s` zeZmx||`lq-sz8 zDwjeghJ$NgN`BTI3b-m4Frk(Mh|Cy6nNqREC= z?KPa5DY{^Nw$G3c3LgDOjGv!DsyQni!QIFUXxu~g1oZiRVmw& zs*Zu}D@&do5bpX<4Xf(i=>nB{_)7krjg{p;P}`bM4iyzuQIbKjWU|3iyO{%ZI^~(! zmFH7zk}P~)K#2KIvCx?VnW$Bw(R17aF5z~(ZwWUwqoB?*+y=cSzH_yTU1D& zdeA*#b&olf>`vzvg$hcdk}|VX(nqu_uK2}mY0~2c-}>j0oXJsTC7~#F6cl7;PbAho zdt&8bFj;QwEPM5B4-o#}X)4`REGf#K z94xJ@s*lKZS{o3O)X`J*$;|(>T}gB_D!VLH5-gGb$jQsB(o>7&BG&ykOgEiPwJX1E zMaeFcg>R_scpw&|ymDtfB@5nE3q_z{N=wV5NFaU{BFe*n=V~EaUItTVmLHs6x!xP( zdT*|!p)CrK*+Z3S$@8-0t+ljjbiX^lstw;Ri{4&K(G?*8m3i!xMenGkX!7hlv%Jaz zo_$Rg{ZcJa7i5#C^HpY-du7SHYN^#zY1BYv8t=%0U#TSx^5}~4s4V&eS@dhQH1s*a z>?(uhh%9$^Ed~pnoRyO2R`L_^O4k0kEc=bx;>Zf+Xr=Y(I#MZQ(b9w0M=$(4KdtStAPT54l{-h_!&wDCJx@VozwXJwTcsn7e# z+)R1!U%5dS<#OK-2;=_CeWMn4hZX;2xy%E#R5h}Vm``I`DrxZ_vgkwqg*{uMawH6< z@(kfGS^AOx-VC9d;&MnX;=@`rK=rlcPvUYb;o&s0^p9#`KyGb1SM|1>QI>t8mb1`c zVdd2lC&*$yuEmr|U7<`VC3DeA9m+Xn;iqarTNOSbzlcouD@*sv(m$=GQ=AseEUvPv z&DEDBe_qQGR8TrGR5Y!!zvY_9qQ9&K?^`NTZFhldDGUF)7DQy>#hHawo&$01WXWf1 zX_%*l@=7aP6t0sj_*^a3nmiP%JQBOhV!y2|X4T487T!k|{(UWB6igfBex8_WtU^aOk8@lC)<)~q9BsY!(%5bB&(cBnrtaL^CUHU`18s-8t zP=?EruE~Kif7Yo$87_|m%5amU>lJ}ATtQ8NGF&M)O%9adrjkIJzeu1AS55+DZd41D z5u>_SgvoHTxY?A-y`036XangcAO;W##$dzT{W6#b0dbTJAY8Z5JVMcscnw}bnJU{593EFutrc=z1Q%gNI)AR0Qy#=rKo5?3EWM$suHsKiIiLpALMg+ z66Dt(P&6PyD>lsM$%>T^NDhw$RJY<|`4Y;l6p$Jq%TK!_H?^g+cu-hLlogGTK2~e6we+&BUL>6YQ*y%e?Yl7fYC4jIFP(cMC zY^(_owqd6X2sw4r#~0-C1cXK2|M6i*r;Q1J|{5ziPLQ1FbScxF>PnH10ccfiA{ zcycj${Vj|q;E6a7lQA_15Lu_r1vD>=^JP3mfF4rt%&%K`rcyl906nbYxw}R@fbUoE z%%*r2P&{)eo=2+V*`!nPJd7Wsc;@2;_z_H&$d3UczI+j&#bLZq#dsxFzJQ}h_enG+WVx7XHF%Uc& zvVpau0*}U06CRCI;@Mdp&!ejE($v>9A$T+mGz~S4G-RvbWk9b0 zdKJ)XVNFvRPYXb=D|q(QEj&>aPkTVSRXm+)#M4vLN5RvZ;(3GO=|}PGt%iq84I6kX z^hXn?NuYq@H3KvQHG=@X3Fs|AZv%QKthq}DlmuwM0_eTE1t^08BI}@cRX`(Z1QgI@ zDS$F5p!ezU`j@$n%4VXbfU?QcOwvr&koEZiKnDRG0(3a6DU{hv0dz!R^I_d$Go7+2 z2Xs_rGqXlEvo&)RHV;rX$EfnmrONYBHRTbzsyot}1)4<^&m)>gHIHeCPd@>OEWSPl z^hsE=SjMvy&?yDar*#X@QxwnBfKID;R#QB$@*Mq0oynG>@}<7^tJ$b|P66~R1@svO zw3!0>ygHyqPOJL!f@T*5v_tcv<|PeTp??YJD?ncZIuq8sECYHC&{+l0xw-}DO$vw@ zf^Sqn`)kynLz<%so+A{`d5Y&4#q(`7JT``Hb65rRvF0-h=o8H;&1nr;qkj+R0-zrN z{TSAKE(0RGE-HY2u3Lby`0n zJrvJ%f=BD8c>b)0hd8gtuT}ukHq^JK)};cv zmjKdAJV!skM$qSC@;5y}q)+4ijnu~)&DG}5)6Q3zJxrOAbCmXLAEC_r)tPl6uTRUH zt=h%fWt7^|+9!am2W)*{8vxrdtX(dv6gg?2k)l#f>K3uJlvo(p#wxK5HLBDW z?REvvHj1Yy#j}IrX;vN2BvA3ZtldrVyrO+o`Y z9&%C)u;j#_>PN-oG^hZiV|7{rNXO}T9oCW4J$eJ%2iU&A_6zHDRDX0vVEZe8V(Jti zos9s}5#t$M0Z8YnNq=;ax(2fT=;~8Iu>_E=5d{=i4Uky!u8OC*t_{W0Lf2B)O4l0L z0l*Ffb`Y=$VO?7pPkUhRQt%|!Ej-;Qp6UjF> zQSl_|hEP07x@297E)`hv{~^Gp0h=DyrRmaj8M>jsW&k@J*b%^vtXqJ_P(WjW9jXEv zPXOsMiOQ1?u)|2)7yY8{EUIyTL3L+XZTuu%fkG^w5*tN{6;WcNs}Um`jHa<_wo+X= zWmcw}s+*=G<&YYT12zEc_^|G7S*7j)Hd9fl?7BtleoE{CV6#+Wb8A$oM|F!7Knp3L z913U&1r)3XNL(^Q#j{-ZG{v(*_oQy6?kQj=06P)bJYXkw21eR$bA2lX zPfLpDF^Z=R#j~(Fo=|@kPX~Qhil?K#lfJXQ3$TlUT>|Xmz%C8zyUBQZ0{eu5XL;Si z6HW2N0C`zhS@i4UYs8bNPf_qBQ#>muo*@*^lhyI0Z&UFM(~qWjhU-V@N9sobOHB6D zz&-=)s<3{Hek{=*;@VaNyOz4saNXjQOZgB7vqt4J>5hCF_iv||X|>HEeVGEPl!97E zK~1Be)>i{XwvYTaHQP)*P*nHmXX)?N6AQEv*iFC^ckx_Uf1j*L#J4`LXwsItMQT1J zwE)=7Dk*YM?7y$o^iSwlD1eqzKwBxGl@!pnYJkMn>Pla~TECv+S)*U859`+f`vR~# zfPE3zm%{oD+K_&eo}k((?~c3*$b?BT{{dNk7)OeQ)h#cG+*6-Bsq90&i2KE)@ zn@lI!NOCb0t3ET-zoCCqfwhmqdY!_0o5I>%9aiDnsxG~+KTKhLpg*8Ls6Pbk8^G=b zmaO&P4C{{&SRd+-0sEE=i%baKty{28QCO#eeOra~IfeBFu@&S4>^sy{kS{Vx+8``c zTYO&sy@KgGis?Oy=?9AG{py(3-KS={q`yKj{i46D|5g7Ruw))|5Lm+Na9IDlJmjtc zt2|O;>((PR14AGg5U}baH3MJMkTVz!78#GhO!3f1Y6gMgxx*v1zB?=M7@P(#!DDb4 zA`EVW2iOz9o&@$|U_S{Pd=!s?Y_}tvPL}Z4V@G`9Vs6A zK+VvF;;H^XjhO7OJF9?t8v0Q{y$rn#eGFt*KS(hz0|zK2$R#6GVm-(yQbH>^VBj$QQLpgG9EY+UDVgQ3|S&6xDYW)fkHE z`|1O2Xiqg$rXiPt$}(gdatuLW$u#>%U@rpuQ`j(p?@!8{1nkcwRG$|5OWoo$g>ni3 zd#S=48Omx@rJ06%6+W{lpUadFP(Hs_=kw()MVe!HnDTkhFxN28K&IDMfc+iVKY+a& zHq4ht+M~eAui*jvXWhcHl;U{;SoK9b!-^X5tTu!dJZmYQzbKyd6wi(7c*a~;)#o|G zHj3wY!)C)416e8G1dag?0mp_7+hsg20;jx-$Kkq#=QWDwb>Mhad)}xK&wj)E3ZC}} z9!^8?93XheQ*mi;OkK zof~aNCGOlv z*c7 zb7PD#));4u2d*V>t$=F{T$`{_jypHr1)TCS9#^+s#xo9~c+!9zj8K86#<+9i7^4z* zZlrPN9DNzjNaN1AJG_i{ue#7T<{D|-xp9JVqA|}n3Aj$cbq1~ra9zVjIquw81Y9>o zdwSF@?U_pPOao4R70*~>+_@2qO5C}T#+`FLDIOYk&h@G`xX4_w$3|6u9yZd*bK`vD z0^=jbM}g}DTwmb&0oOlllq1iLOMr`30L9iVKu=OYD}jqq^{2+jbK`oW5_xW^|- z1w)3 zJlBmh?%epN@h{^IBe_6gG;m{p8w=dHut|C3-dc6B~TQ^Chn-$Vn?O$|&9O^r;AfeQkc3)}?YCWcLN z;JJz1w2`OqnOwK{(7 zZs94Xct~Yusd(OWS|SsA0=NeiLi6etp{FUKXMmfl5?WIup-rae6++KZLJtu_xHlzq zhnF^0I4_uXQ8+tHFPdI5?F4Qis`1AF(Wez+#2B40v85uUD(WCNuHrtIby6HdJ6TljyXt+0MLbwwuWw#76Rd2e%P8@@k#{g0*q~ z1{HxHYTS!C(yWB1nQ3?$x0xU_)9^HIOLb&9aTUnS&CN7C&D_G=(%i~SR;t^8+Ya0d z!0iZ|+iFARC^PY^o3V3I&xwLA_cH6nXcf``2o=WOF)2m10gc4>6OOHQBM-4cs2!-UypB zr~x+*2X3!oqu#7rpvF;90pRwjpt5Q*;O0DYz5-}61@smLR7e56eFs2jt)v1fF;Ay} zO3h{Fspe_G?Fa5%;NAo7{jj-Q1~e164-`NL>lUEd6cBO82UI{0)(Gek^FjsCV-(OK z3TQC}bofqyEXgXMW#*?SpylQj<|oZ$v3wM`4}m)d+(%*a(=wpdz#UfreO$KyZKQxU z0e3FD)nz_y{#=3d8HIF~Li&^`o{b{g>=q*-u$hZcviA<{uVg$ zm+!;o3o@jOz+F%v{aCjk{YD{O0qzGC($yLV+D!{9^4|9CsPGU&9tF#bdDn_nU&}_d12g;vsk}Uf`}&;ITy3gvZjv z(p6X!!F~I9+Oge7_a#~+qnr&OMDWV+U^(vwX1d(N;ZY%u&Z=fbf z{w7w)Bbe1T7h6gcR3VDWOi`6lRF-O}M7%@IbhqVR3TlRBrsW>XEZ_y;Mc{3~+rt*g z0%V}g2HpX@hj<6RZoQ0Vd5Cg)7@DcL2n{aXnTEW;@nQt?U z+WO@dj7UM_y)i?3|r(w zQ7z8{ue^-L*R7Y)Ec8%R%ZtFPFQZv@)j0U}Sd>FiE%Z=Sp1zD`p@*XK)n7&HWz;^|{Ti9|%Hs)7>@2(j0o^=b>O#;ix0NG7z1FT%!3k4NQuSF=!L+ik2G24Hnq=>e%$r`2VRu)2Zo3w%G|`vV^x zw#o;jTFKqdF$$o#It9qugaT>`e5?wn#sgBVQC8)ER4Y9om5--@=mDwxfI9(tBdtP% ztUavsh*WD&YcFeWE4lu95bz1W-v#{Ou(co6AZrZpi3*_Px&kr{yc%AWNZ>ly{oYKn-yk!B53MAhF&BVO&9NEOm1>lO;>S?hDw=dGK8 z9H`4r1U?V=Nnz_&8PW^DPgWom)GaM~g+e0glCMJAU89+P+xo5oXg>v1NC27Wp;vc! z_NcNsWIe*PT5UZHeDP}QQQ$*T)7$Q;v&uK013x7oY@6OzzO1P2w4%^ta=&ACQE_?C zsHmv_!+ZDo#SP0yFDeUV2kE_*p`!elP-bEF#DpAj#bsV@UNAH`Sl)+RO<7bjy{&RR zU)x-AIb+B69lAHWbJi5)W@wtPeY4W?;$WXFS)|&+Ppn@st=3sjSx;L(wSH#(9QYC- z2Nd&Vz)uB!+B)l(WK4qfjP)$=)9I-60ACLL-Bb}eB*ev6s_oE(;Y#ykN%P}#@=A+B z>Ew#8Y7dS@@P>3q09fGlmU66 zl2TH{KX3y=^BVKTWtIj9=f*r)1_07oNgUE2eW$wyX17u z?2z55M`p*)oiaNFbGiq!J9kRY$yDD;v;JiLg=w|M`m^;C@H2s*wZ?kcN@hqB@Gn)? zF!@e%;K^ObX|=vRBRN<)h}_fHPFB?7P|>8@Raw5_9C&i~@%UO7RQcMjI}|IwnkO)V zo@upFKmsdp0xw`eL)J1n-~ssifG5kd`+-^iU=WOgNiYi*!72y>SXb?vNwiPV#DMaZ*O9Hu(XsIqFeR8Q+ic=B~BIc?^GRSFb8wuin7ZJ zh)GH;s<@E1!kUmP10tDLtH{xs>Mt4yEtpmtgoZ*R693vnXeu-lngdVPw#4x+0R9o+ z9|is~;1_NXS_-X%)<3E-CjFTa1-Kxwwzi??@-GA@ak z3#k2BElFHnNp^lwNiZjw+z($ul6Gv@J|MU|b%^O6-MLezjvb;qcI_TFpndx;U1H+e zclhU@y8Qb;b*}zT%_jd#71Jw>6uHezuBTdZ$Eq??<#X?aoZ_}XtJ!;Nm zA*FJ{G=V%(x;^JGf$Ti37KQ`AaE z{%PRX0k4J;3RyxfV_Pd^3pqj%_-BA8EnK};m>^6P$c$qR@N0n&OTEStx&PSZG4!XB zVRrBgX$gdjyGo&h2=N}om#{F}~%ZpmI$su9tovJd8X($i} zx1MYg@f)OGsg3*Jvscci^usLS-f_43AvzSwEMF_kVrDa00U_dF`duyXK7riGLy_J} zTFqc6^vDCA)xuohH%m>93lB4;%v8oG%oi3|uL_TjEKwaQ@LPf3LVN@8FE)lz$0=Yps zvXa@UY6#W}tAy2*Ma{_qf}QkX)yyiVwZbMcB@x2HI$=F|M{XnVJAvN?{L8?<0{pA% zglC24gy)6L0%`nfz`qXse&F8)je(N=KQ(jz_YCy^kpaDP#cQ(Xp4+sovaMG+?h;<1 zBbH#>y;>l%Wcf(ee;cuT=!kto*bDp{z`uRlh|6i$My%S54}}wVs=!HQoW7%u(}3{rM3iAg-osoid;$D>w-2kYg)_ogfjFT9z<&Vz z`(!ZvKbQj1@rsXFH@>7c@;iZ?;;>fuUbrCq0Q^DV4*`F8t#DEJN%$G~Bfyiz2YH3F z%E%1}js8^&Zu#bahWGyjh@QtFTm}Bvt!20Hr^qs`)(d|LH-x{1nT+zp2xT26B=H z#5xrRL#25^GRtZ5uk9n=oL*O~h-iFUvWo2G!!q;Bf|XOnl0`yhF_{5WE~&ghEScF) zC<@6%-i}n2MQ04RiIVk66ov7tMH}#^$!Iyo7)7V(5+gZ$Pl#@+|4Hh_&R`J|=4f zaq{xdO1Y83_^l#pBi0k^iw(qvVk5D!*hFk9HWQnREyR{$E3viMMrwboi3`O=;$m@$__(-Kd_r6%E*DpbPl_wWr^KhlXT(+FYH^LY zRt$^l#P#9^aih3Nd{%r;d|uovZV|VN+r;hS3*rv(Me!wZr?^XeS$su&ReVi+UED41 z5#JE^iu=Sj#ka(_#dpO0;=AH|;``zU;sNoXct|`f9ubdEuIn2ir=gvcuD+4ye$4I z{w7`#e;5A{uZq{i>*Al{U*Zk%Z}Fy$u^}64<7~VQ+cY+r(i?fWHC!-@xAla#0FKfLXvCU>-0A ztO2YAazzQ&12zCQ0yY6Q1GWIR0u}&^fNg;7fE|FHfL(wi0J{Nu0DA%Z0Q&()0XwC+yZb*z^wqc2HXb7l^?hr;3&ZD0e1l05pXBKodI_N z+!b&)z}*4&0NfLBFCgKfxDVjIfcpXN4>%fd4B%M6ae(6i4*)z6@F2hmfbRl47;qxs zB*4jlQvjy|9s=YF4V(@*1MpD5!vGHlJOc1Yz@q?<20RAvSis`|2LO);oC!D!a5mr^ zz(K&dfF}T+2sjV$B*2pa=L0SPTnM-ba53O1fJ1;w0G9$T13VSTl@xe7;Bvrs1D*kR zCg6Jj&jNfeU@Z*4&0)7JUGQi6LuK@fckSiYWQ-Gfa{0!h#fL8-v19&aqFyM87*8|=Fcq8CV zfS(2Y9N^~xZw9;t@K(Uv0B;BU0^l7$u5Z9E0p1CC7vPrxzXJGGz^?&*9q?|zdjP)y zcrTDE6Y!gW-vazL;CBG;2mCJJ_W-{S_yfQP03QT=2=HORM*trM{2}0DfIk9!9PkOi zCjoy9_!A(PA>h-1KLz|5;Libn0r*S6UjhCa@EO2o0e=Jd9FPkL@V9`!1N=SU3xIzB z{3GCtfPVt~GvG^re*t_M@UMV>1AGPW?|}aRd=>CDz}Er)3HUF-Hvs<)_$Fu=&>+yT zK&}*B}0`oOitCfTB@O`sVQk0@o|CF#ORCxDQQW! z8G)Fg$#IGCYSt{ZF%<>I zCr8I5#s^Z8199=B#JE6Oe0s{zwAlDtRV1rZQdoyuh20@3DUNgj>41df^o;1l#6U*$ zz+3qz%K2N@n4dN;K7-5yQqstzK&|U!Ij09Hlc8JFxS2E4M<(6gL52U8E+yu!+tW>v z(>1+=yg|`vv>(&rV^fk+(*tn{x9U(T=jl?Br(zG8^i$&S=#l9G1$_GOgaH`=((>fE z=(M;%VnR$>bXvkc1gFU|>Q$8yGc+MFE-;KFjZV(Eh3jrPv9D_4fw8fHVex6{MA20| zWVuT^rghbnvhFc6y(cT4BUz9q?3t+<5b|Eaina>o8u z>v^l6DkKDyxnz1^Kw3%?(f5QzGK3WEuhf@hr;XI3T~%?>si}zxvC-6q1mZ_z#3xh8 zf#}o(GAa^Bs?5m3h-B_qHFJ7wG)YTT{x)W$A}JKV+`L;IyGRz$psE1bC{(bc<5ew> z?DvuKB2ZkgIKQZz?lBU*&qzy19guk2;94f9@>fa~otP1ymP|zsOiLL`w$K!VNVbNF zz<*1cGMsdwnv`r+k)*zVk(zW{*RGaRw)mHnsqtw^3F#CkK|+-27K^Z)tzo5XL~mmf zlH&t|65&*_~eX0Vv5pzYW>OnH>rQKe@mX4lAb~I zgV?xqqN-}9&2lDhrA(?ls|1qlA`$6#PFM-!4mn}HJ4&Pw1GFpE;>peqk?N?FIF5Aq zZH|cS`H&=@N=eij(gl<%itGcCbWJOzQ@ueP@gvk&6AdR?pMFc-$X*A@)3#EcTdsiE z^R$8S)YZks4@-z86^~9z_-AOmd53zX4^Bu`-GN%KcjR=DmCA@sNgWwT9Tc4&Pb?MD zZZ++Da@r=9(#i=`p|ZV}J)D|_>|2l~xbKi9J!9lQ9`LZ7tgTR})tR6|) z=KrK6K6fy2`Ed#9WHL%7CS)o%Fp&(AO5U3+HA${E|KuW$G(A3TSUk~5wJ2&F(gSoN zNSw&68Lgdcc2#Z)nYkzgR0Bjys(@wZ<G2~frq*PpM+c+q zJ=D|&Iko*C>7*{nDS_04|Bton0Bq{k+Sg9F*UXqCc07XvgzexxnDK;^EHc<7gv2B% zAxWKtRcNj5y-W8yZIz`M$ABV1kjzC|ROO$wX9!bxTWX77lL8<>atTs$?c~YFMpxHOng#gw-rf zZZZusYSXHqWl0PvNop3N`JhoX6&0naGklJLB~4M!3NdLgE!8-dDn&gLCRv%U8ZB7| zQ#gdh0G)*;0l+bdHcgQd)PczWY)Cyhr;sJePjb2_6sm-ERkDN{7}Q*MQJI*eQWZ+*L%0fRwzQ&ZQJQAw6tOJh z2h1Xx-yqsXkj zOQ{k>kfLUlY03rX8I)_fjIP>RTejBIXq0W+sG(L`vVtx#FxjIBbf2n<^rk6gISXZ# zh|s8SVk0uO(3eBpuplx0V@!n2kZMonRIofnsd)lbA*!Jz<>3lu=%AGX%VwrWRnVFS@!o&$nYNlG2(3F}mv@8^;tzk>(#L_`ZzKkU|4w4*AoLtf8tYm4Y zr>0GEj@F|CvbbJ^e*mLcVtJjjn&m7=&6#MF%0&w(m9&Pb@6T1TQ>9NyIgKoBnq-n( zr4A*ci$6{N$%Nv7h5E*AZmf;c^!gB1%7oM!q-3tGsjS7g1^0?C(O)*O9D@{>R#4L1 zO$<^U`zuatmH2{EYRJz1Vh|Oh%$Kh88(G3M1xeN<$(KZT3rjvJwc=E@X}>^XHZxb( zEeylV^ws#JOxswd$*Gy7(O9zK!WE@-Yb9k#kaGmfH9j?0vI8Z~5gM&r)j!N}Xy;oWzn%OiM-=E=;NGFs1ibk5gHe zG`UvR`mx4OItuzr=nR%=N@_Xc7$q7XQc0n5cs9^NQgfWmvZZzMrBxWOApd>?!nrK% zFr%S|lgGL~UNpF*UmbD$!2 zvK-_3Z(f?z`2F~T2mTg2AEXH-4Z|jlZzd^CNWRm$C5%? z10*eH)+M#+2Q1}5mQ_1Y*3`9m&Lb?HE}0JghEQomCG+ysgnVTZ+mEq?1<8bQKQ z7?xmPz&5KXNv=qqWa*);67S-ql$1@{jPwjkJtdhM!`PA%>c`A-N^3C} zNcG;!2uuTk&0S_cqA?pya8z#FmYDKuFzPTm)WoVy+VQUqlCh+m7ML*T6H1>b@lBSo zpkIli0Bfk5G);Ezu=G><~b^prJFYuAyv7Gb!a@@w4VP9dl{oo> zQJ#}dIe>5%(}GA_BpP2Bh;)M?f9(R+7S!6KKFU(s|Kp@`xxYbbna2eO3tb<99wu^l z)~Op>B9*~Nd56SRd}v`~MSxZho@t2=&*<0=K!%U0>i)p%;6ZGDwfh+*F@uM7_|ebByF^K)5En^9x6p& zPfSKqCH0KdXU1?2)lq;X*vK$~6WuPiVO@p{0DrGNV+3iEfjuwHFr3@X( zkEM5Fb3AtG|Vb)K^_rwzxY*3{FCAE@$S-bn(p^>2 zQZA*&M>!^7<^iKaT|6uVA5vTlqJJ#W;D@nN77VqNcy7A=$6V3U1Q#EaCEgEbR0rwc z{dteeQ6vuI2evu2Iwfj^QF9HI$24k*iXP2~c!o+us;IBFrh*QJ5--OwGR1?EsaQ)- zKelX)m;>Uh6XyoIV$hdw=3uu< zl{}qM>SMOQH%Ng5ANW zl&4p%4;9)WF|5LFq~SJLjiq?x(Jv6)SdBR!eIY)4Cp6=HMtn&+@md_6Uf0q_k1a%+ z>v147+JAA1a7P;B0;>MdLf?`Sl$l(oV!8?~NGyAEFJgtP_ytcH|Cx!$_ZFeav zsEKFo9 zpC6kIP+zL3pc(8x&ELo!=#q_Yl1s{S3!^)*^6X#Ap|VPZ zrT8m?k`p)g_P@ttLa1Q`1vAs!7ogz;@b^%IImzQ)jBcM1We8G*ofk|vi*oN}RQ&%y zf_}tJP_EK_ez^}Yg5iHaP^#eoL?32E|Gr|n9CbAnb#@!}pKAsn``>?Dd203zK=27h zFz^p5&kXzlC_c?7`u+h$x=!fdJkK$D|7852CKY0?;EXG+qvP!W#9w5@huqOqx?@Qh zjR-~~v2Bz7Y`@GXhyIZmSomcKjvcn+m5AofeU;Iy94gI3$Bc*GGcPQiPs0!fx_lLm z5YUKCX$*OTksor;N{|;vy{Zs~>GISlr`)$0!QkKKSK8}9Gz`YLh1lj!jC1cYl8gT~ zNs&j1Fm|L7n35uv1pN;f{UMLfePkffhbdE2K^N``x*s#TLmp%Xp<5nWO1EO92K$T= z?c<^wd_YanUYr9Fcl&Ck?XukeF=GFu-%3jf(ejp<`}$u=l6eggfz2SR_c*rAIO54^_ zHz)SSaZGFp_LS3?C#tcG?vS-P(K8VIO?Lp}F@4mEm%6elmyztVB;UWVnG9;n7nS1_ z1u9OJB|$Eak^3jM47~Lr1nDxz2;IYzR8RMh8DvXVNfjh=Mn>-M4=%Okj2v1dvC*kA zFEDTs9e2ZtLrH8?8M!_?Kq+dH;#*|u zu_Uw%OGJzzRf+I%)rk5-pgPxCRIn$J3M_sDlJVs{lPM$6+(d;WJ z7mw9egu@7ptq6-D#S%pyqu9rFy`Q#(|Jt%F8M&9JV35%n+{7EeBPcHHS^OG}z7JrN z%Li{)GI&6>fDs*h9XS}$x?rt%VliRmU{5t59sg1t#K;c5k{FDv$fPvY`D!ZYo<7VJ z#4^?-cbHUV|B!1&URtvCH!CXt4c95QIpuaa+mplEBB`O(e~0Tt7lQi@?t9VJU}FZe z+F)l&`n80S9egFYe_6vBSrzu-JRMF`B%Erh<&5UwqyJzuB_Whogs_QJndnuk{-I=3 zTwMv(V6HUL?2$xJ$H)(EJEXCjkZjzojCeOONGDB$*D{iWFIER8Ngcn`Duaz9k(GFi zFoJ^{BWVOvtR_}(dIYl$UnZ6*s%A#6c2N5+g`BCr4Iz3}*mmek76D|UlYyNXtzL-p zk}2E4s`adls()8T!i>iP9^qM3E(u$*?f;_yc=qWriy(F5*J1EY*+QjnP_nSYF z6H@{`=s_<^NSu3BZDkbZRCghWt-<7Lt8d+cAUW#xrXM?7Iz`X^mTlYUsYJqJ^7_DG`S}dFoawzHS z?52AeBBODJ=)R9H$U^Ao2X-kzVsbr}k@WvV3K$|ff4llZGuoR z>PwW!oIF@n#VXQZXRH!rV+bR0q3v+!vCxQCKJq_bj(lLlvka{hX0&(^y^YgoW2^wA4z+A zs$Gm=U_aa*kRbXeteynLD;UKAMy8>&DB4ewM=sTMs=As{A7C^YI&~Hon~VokUB^f+ z{5K+qugTM_vi~r$`_ruhN|w&P%rPx>rknpgtMQ3FP=WIf64~1r*|PmepgMv((_6YQ zGxZszaY(YZiXLTWJ3w@;$0#Q!syi9&l7B@TaeDB_z#K`&|Eum{beH`rx`_Ry?1$)? z1cYGGZQu|B)#=uSB%1qKF}Osq@06X;w*!kNwHVxrQMnYSU=tgms)tw!mH%%glr5sC zk)%UGsz(|5f7iCD6~LlCF?>GGXz#D9|2^Tr#t&3VJI|`881?-Pq<@e45{%SRK#S^G zMqE!H888RM5D{EAQB#@>IabQzH;k%YP`#LTp|k2`)#u!_8d6URS-L zdQ
TT6Ks(q?=Rqv_ZSAC%RQ1y}OW7Q|BPgS20eiY%y5MD|6Y{KUfUQKun;dO*J z5I&#qCc=*={6xY}BK#D>Pb2&c!WR+VLUZI5 z{iym$^|R_1)vv1GRKKhKQ2nX;OO2b+T!f!Xcpu^Ygbx$Gl<*F(?=+}~#kd%_9F3cdq<0!x+new{gU=dp`Rz8p z*%tJA%npw~VD`gXZ1y_b9=FfuaD;+*_ID{al3T_t=T@jkh=j8G5%PEgjzBORG`rk> z5VCkfX51?7H9G@NpT}vlxI+FwDxoZq(Aa*2{K2pl90bh)mpf#3_?`s5! zV)q6@?o>j#BB7jqgsh>U+wJ!T&33!XZgzNG4zthivY5RV{Bb)%0f!e4TP3Te6$z>O z5%PPT7K(HBWQL6 ztS+-J2)dy#MCY-3!g$6amCyu{kahq<7Khyva+uv=x5Mmk1Uw+*3Y*N1>%>`|AT71q_LUTky6Z#QySezki z(B?AR{C04J%w})cX)_0Hj-b;XwAgI^G>&{CA>8}hr>}XeVZR0a#O$#-(fszX&Fph~ zo#uem;`FN_i__-B zJ1_QBLMucWns59=t^s~Mv;)cA0hN^TgXaBA%_(lg`ChMw*$@Z z@p{0M!yooLQmfV?5_0w#?g!j<Mp{2V-sJ-$ls;j#BEe>R&U{!E8Eq> z)Od?U8QI(c4_6Id(&=o7wsdqYZ=tW-&^w+9kDjE!TtoO-d(=m$W86s9b84bK5|1U| ztcR4WG}6}8)eK50-?0m;mB$i(HoFp9eYEs*mN?rhXx&I$nJOuCu|Z<<6jM-BMdQrldn?oE)-TtQ@W>7318hEeZU<0VR|*{&jdKq~oKTJm*-4-QmvuKE_K zk|p1UlI1BS->JSkN&X(fFObOJPsu+(_=N+J*Q)WxfY`Vy!k19;PjDmEx2d0` zjhmIyQg|n*p700JhEzX;B+sg!TZ(JJ8}YRt&$9Bc-|(J-`UUli2PZE4rg?Vat3BM> zCFRxhZ;~)xR=<+u_Eo}{N!-3cxy2>xuYO?6!BNb<% z#aRhoKTvTt^>(Saadg}eyFuQpyg5l?u!S2WV#SmgEaS!jh~+IvcEAWaV88KmXqEx% zheM68|?TTA%$0}=D( z!N?c8T_NFH6Yb31pVrPB^4gQcu^?!Zh||$L52JbeK*YmIot;c|HqPnxJUkv8AAj;< zgg;awb`&LcG~uHI5nGgZlEmp$!gnT><`l{)SP+MUywjmH8DmqF=BzwC)*=&JpM{~{EhIZ48WthMI)DZbQ1p5L}O_(X>q4X#c2c-C&OGWHI`52BDwb`iUmwAlmCm>jHQ5?HmwlxsN0X~jY1EoLjYgx@U`2j5 z;m;vFRQ_DTpGWxf2@h?*@JfvVkGnK$#%WBN0?l}?fbbX5XI^#^{$j#kLikGwe_0IA ze=qN1@1o)6@)a$eq1Kir@qs9{_;nC(r!_=MI+wOY@n#ZzGc7mu2kB<*I%T%_b?Oc4 zi7!PW;rb0Nt>|K^R08zrkyd)A1MI8R?@K!Icw<8}(iK@LKGkTo6j>d(e6(?6S0m%e z+)D3WHT;sa5*ZMwUpI2SUodf?6ZMbW7oLxK8(hpacW$I z?(Yc|@Wb;_yxPc4?gjPD7>3ii|&*T9(y<(x@+I!9`SWtvq3)#PB! zYT61I6mMXyFriqa!Yww{vb|X;e?-$VKz>EFX1%7B$d?lSCc@twE3BGjTGrUqR!8+i z%6h1#dw{H(jhamwjQ$vPZzKHevBC-SzfP+GGe9-l)z4Lo9lL2QUTW*?vRGb{$ulyC z@iDS&;zscznPn5(*;&EP^H8?UDt(n->-ht<;kG<>$Wr3i`QtI@ENt35LU2ac- zcWx-WU|~r`^^z3_H*Gkyd&{=kiEZ7jt$T)#7&&V6n8bTEOC~nZ#|rUqov#ZI*sO)J zcgEx~Q!HaixE|;E8~2RO9+9KgQtNnqWJ~7?{6Ee}Z>}nq85`D{r-|_~T}%a|IE*Jz zkrI#iv`1ey=8rRtC>TFsVj+I1#x*S{bRD}L0Hp;Z;ma?3l#(P%r055ajOL5k zBWBI%nH^Kc)RdcfK5g&(;@H?&cCSAW%ZcU2;K0)(k3^8ZzSsxEE&8{k+G#u+n6bz8&KK$2N3CyEsl(iS+hH^agxB8lPJ?b#>71=^&B2c0K(p&!nHD zU=W`*^mCK=c?L@(elDh;8#lByA`Ruaqj5tc{rm_%AHT6Xg3lSH_$3WW(hve;W)*prj*ZXQ$Ba0lOiog9~F+a zG&OgbrZh}7!8zwKEsSi!)YfHYx28rL**zikZCf}_tTWBUWmDOjAY_-->w+7z2;xut zv)>;RsrLVYwyl`ryTz={Wa_7r-zD=VziaR1IL{A|&FRVS)}GICw;#iCn%9%xO}vcb zvX17s+n!6QkDBUBb5~af_AfSV+EmmMX(*xsP5g7f1c{V`e@H2>h?bX-oeBF)_1&#q zCMwhh48`41Qzz|VhzseX#Q!*B3R@|B%&3a2i$o)BD2l%RNskc2&cY+p7?eycZG*M& zKg^cG1N|uKH9q9*`jgA8E8>*T<#HMSdz#D48Odd=x&*(-675zxdy~Yk9VI(ScBbqCS&!^0*^RP0We>`pki8&#P4=$rQ`xt&U*#F{QSw~5Q9emNQ|^)b zcHri}`WS~aSB)TyJc81=xY*G7Fedi3Z?ql-tc7~M7c)X`Uset7iTqkkTg zGp1-v$(Y75M~t~}%xz;{9P?$?@T|ftU)JiZtyw#=Zq9lx>kH*@ys{in)+-NJUZ}iN z`HJ#~u{n4KumVr=os7rvo*4T{wt&atLfMVkM`!QMemML6oQ#|aIf0ypoTGAf{_wY3iHQd)2?@8S{L3 zk-QV~uFrch?=+-PSo6>d0F$T)}#$-*K5zv-mZO1m#LekTddopyF~Y>?hAdc zezv|rf1>^-{p$v~VVa@JaF}7I;c3GU#(d)fV~6p4TDa_E%aDKAasr+TKYpL+4s=cmc1Ij1#GyKvfb)8*4$(_5xrJpF|k!)ADA zw9V+9@rrqr*=OEpzQ+7+k-Dg~=*Xhmi@uyWapsDdXUu$T=ARa)rPZ>_@`g3rdXV)< z>s{7wZPRQGwhL`9*+<*M_9N_f*uQa1cSIbQI9_$;ILn;JIUjQV;c~m8uIpW&x+l8V zxG!?Q;>qu zZvEVzx%=js=B=4`*}Q%83+C6)@16f%@r2^W;@!m``=$2+V z>uz2%Y|YX&SFicKzM{Uj{)e?CYcE>+bwi-x+=kB^iyO~w{4_E*a%SY?b#vF9x$cvu zxlLy^ecC*~c}MdXErFH`TE01C;USkE^3(c?^;fL_t95DX4I302)@-=5ExT=f+avAy z?VH^RR})9@$bB^XP(^YP|HMOMktr<+4|M7WCZKJE?caPJZXcogeL5vg@(S zJ(pj#Teth9-G5xscE!FctFC~M~chTKf+*5GRh4-rNJ?*{`_Z@xTU-xgl|Az-U9{A$HrU&1DsP3UR9$xnF zOOGsm;#D1|9UqVT_^MBApWO3l_|xYF(E0_!a-k@|kmHn#9ueWa0j$KV%u;mD(EqV4TnF&U@e#&SB?C8AZb zlBrLN-dKmziX9W%Fe|*+SSJ<+4iHA4_D*WGiH=WUFOcWT(k)l05>O<0;uQvgc%b zVR^hEdrP)Y_MYqm*+=qBdA{5vA1|LQx5;PA7c%Q(xx884D({kSk)I|%3--q~^6O!J z{8#>r{CW8s@=xSn%74pHW@uo0%*vRPF)t&OaZpBOMpZ^l#*&Pc84X!CWZjr`Th=34 zk7HJSDeK*=53;_=`Z4QIrA)~y^~!vuT^Uj?RF+Xg4Q8BV-@#r_{YMEOSHg1|(;SEA zl;H|HQgf7Mk>(f;c6;FvyOZ#D!6!!ey9s~KZcW)(1?JC_#wx~QBN_fNY=PZN`1{$1 z;nYz!e*YdVx~@N9B4`j2P2N8xny9*KOY4DC*0fOPFH*j!Ihz})IY+aDE{VJFEq&`c zxcc~SR}lU_w(+SsPjkMg!jWFhd31X^cX^}}e$dAHEvEV|lXsTWYpN_$ekQsZFUB*= z+?ZHKibt_WvlISq`el!17vUd{ySp`4B$JAHuTieKjJ>5f0z6&MMX#1wvc6J%hOoBR zRqxB}EZptg*e;T}4e@C#Xe}4fYca@N!{XY;CtkwV+^u<-n|6if9?iX)`!x4!9?(3f zd5G|j5&m()KSB5>3I7z~pCS7;v5JPPmiW14%Z7n|_U5*{~x>?8_o3O~;L*s;RZ zko!^u4YY3xN8x9wQ_iDbv`5#owNy?0S}bk4qIj-460JkjkK5yQhY^AiMwF5_6f%2* zF2C7|c&Cuv>2zA$9?^L!QbcZleROGk=aQCA>JVSr($!pzf>` z_8F$btZuJ;hRN%)Y~L>VJ73md+vO_FUd=0-S2eF`Ue~;#c~kS2=54}bL+1s;zexB! zgnxR* zn14?P|>rnjbYkX@1uHqWM+xo91`TADTZ2|2pB{AUwhZ z-Xc7t_YUE)iS;hw-y{6{S8F+~Oe@!BXfw6Lw7gc(Dzq4Eu&MPm;eRE<0wOFY!U`fB zL4=(|xQYn(u;GWjwq68Q7PWL0CFD}%2TSWa+FRJJg81rt|3uYWHmq%Lg_Cj+A_!x_ zp2T3khS6sbNh7@&pD0^;WxjuTVu&*yTN|W2ChWlrq_^7FDNTc9#^l+}UgX8bOCm`% zd?F2zcn7X6Nf8iL19U_WnAR3+eOkXZpbcXA87BNUg#VWCh+O%e@IMg#N5cPfg|e9|pntTb znJcvAkSg5x_(S-g5sO6lU#O-}q_t-Xn~)_P8ED(q<3he@XGI&`7Nq0k0Ld1%;HGzM zry#|Ifm0;L1(8m{z^QOEJ>D&jm!(Tdvmt_zGqh}*XvEbi2O@yI&xWo@qsSk+79CSU zEPgH0SVG$mQTCV~wadl1Qfh@&+6I^^+Jm*LwRPGx+IsC;!eb}-cf$Wcc#JE55rNwc zy^H`&0PbDI5Fum##bqh@9HtU9p)_>qg!ugJU7|L!X$F?1XsDznNzv$JB0ABeCRz|} z@9yw#VFYr-a6D9}5$=Dg;8E0*iaa$3dI)~)TX-&fn4&7DWmYq7c6q&2pB*-6w#V+; zzFm}5r*h2=%7C^@+pXQG-K5>D-J;#9JxsezyIp&@_6TiEOSDI7kJ28kJw|)1_BieF z+7q-VYEROhtUX10s`fPP>2QafsXa@3w)PzD4(++x^R(w{FVJ47y-0hp_7d%-+RL;( z+FtEW?Jn)*+TGeKv{!1c(q65-MtiOHI_>q^8?^t?-l)Avd$aZy?XB9|h>$^qOd<>; z0#5{i2nr$$C&CCKj3mM+B8(;iCcG>nD2XtZ2-!r)Awn(@R76k{A&&?eB4~-ABZ8g? z1|k@VkWYkhL@*JdfC%G>Fo6gYiBL#{Nko`TgegRrN`z@dm`;QlL@*PfhzK)@U?GB) z2sR?viQpiDlL#&%xQXB)f|m%hh%lQ7bBHjP2=j~0@|j{S&LMpUiehp1BovU=TadpK-y2JJy?s7t9Weuu>uupmg@<3v0- zV!9E2i-=xt00E{xU%=z>hLfoSc8A|<_s}SP8b9jr+sqz>+?zu%ubd&5!xiw_lc|Ri zBb-d_ci8P7chGHi*}b6cgQ?~ZIXz$ufzyan4+X;DWD3>Nt}U~qD2Z8}4b71aky+)D zu7%jTHsL-}dU5M4OOmkD6>!@`m`V{# zwIR?AAU@q1vUtoMcNlbC9;?~owYtr|P!M73Zg;@$wk5gn`)L5W$8YuoY2dxf=0J41 z19A^p-2r#l5Ba5tE^Ko;Jr)~+;=`2Za1f2?uvpDFj}WkiePNHyi|Agd5d)4OLb1bP zvptMc7>LDpnmu+eP6vdXp|I2C@*zY&CAHg!NO(`k?DW#GWS<`_+kI%spvUI$dK^xt z*Og4|cR3vhdAFGnr5y&}2+#M1a9G0^LT;Ov#t^%cscm+r*XOZ2%pnT`<{dt-7Y7~! z4zu0ib^5Fpm)jmp;lvtpI}wkLra<_)+2OWZ%@821fzM_O25lafBSls1i0=O$*DTovVFocF2N>F^Viq@dphhrdU8lMYGicrV`S@@i0 z8B(;jYf-~ft)o~ZFz5XK(D{&6@I^jjUaln!IVp^XEb zR7uLh8M67qfe=PLjBrrA0F>H~%A)Hyf)>Buitd+89m3e=bwK+qAv%tQgE(0cuzSr` zPr%~D*^HpilA_d3bW|v$&kRzKvx}aYvAZp1YakTzx!sl!jzA=7yWGxD(B%l2ZFYwn zN)1l@PP^aias~rooR~qhehMc;Ikk|a?Qpo9Axpq#_V|5tD5IS*81|b30i1d9`<(&5 zCzwp_cjFw5)e<&?9q{dUVnp>i-DbDjV?~#7*aC={N(>^da2UMd)Px7WVSxA9>4^uN zIKtTgyVdWu`0?UzBDKY5^Z2b8^85~Hg(HZQ1UO#hWix>#U~@R}9&|Fb#|fQuU|7PT z5lY*F@q><+UaQaT$AKZ7X9^@!+i=PPCoNn!0u;bt;P+vO4LHG$%@y(lJXpK?Qd-B0 zA;XEY9cB;aAhZrD2z?Hj!#;EY%o|Qe*q5a3v)jVxs5TscLERhtMV$%ej7<&DY4;gCPneDmsX926Q;kV^d%~8W(}nU~9t=Sa50u;&g4Kah!xli( zhSJ(HOxHBCa0qr&7=s$>hdIHGV}pLX546!6 zTvmG+of#68Cg9e{MizxPgo(k2gH~uPm)Y+0VaW8@aN^31BY@t3$KhgTWvW1&bU1fn z)C1$xP(&3y@baPU9YMDZ?G{E`+~^!a4MW}_%m$0iY<0n| zh4l=j^ZaiR2k`jYZ5ot&H2tK)PsA}l0ANv|$LTS|n3u;ivo zMeU*8k?596gl%p>>}-@q(Z*e%2d`rejQCFUN4q=Ji6{_#t zQqx{SpM8T1bTQ?IExlJV#%LUDdmDC1*x#z*_`^!GfxYCWn2Zzu#x;ffB-8|iVU9rxm z^Xme-pf02f6JaIwwh6086QPa>Ylu)!gtbIyAVT9c%4S^&SD;%oR-r4Sf2b=? zhr8f*5+Oo8$?NE*jIcfaFTSR~Y^SP5qpCyEXnR!jIG~LaJ~ab=65U7}s6N7t20ur` zdbSe)#|4$I&bnQe~PlVRk?5dW=s;(`G$mqpQ zQm&1x-;*jau&9Ky3{0Yk$&Hu{ikc^zD66Kn_Ab-9_U^XE#Vum9+@ibnG9nz#xK_^B z-QKI5&#jeI=}z4PaH8t&(%r4QM|UrVp!2FZ*)Wu z2PWFdh=5LU3LPL%r8S@<8e>x$o0#8ObkPR7qX_EkDy{FvTv#pEE)nU; z+`CrfURb{|B2LV$ty?52fy!D&wTUWmb4x4UZG|Ts^%p(z>^F3DJebps4F;UmP6|kD zySJ6Idvxy*0au=#EuHmPfQ1?j7Balx5*eaJ@?M85S0rtYVs9>6rT)5zfZA`m*j%-Cx{D zJ*Ss(%k>%hO#LuDkIvh-L#<9azv&@%mSO{TIFet}nSmZ&uUIGLP5wqLi5)~hH#mm~ zm)0q*iLJ22^hN7X6xxgnn8aaZV@tHXjSh&xc3KYOTtA$P?$VFYkJOLS!<;*p2p16H zA|hOjO?bUhKNj`K&N@$@yCPX~E#rv@xJnH(_W3KErjDiv%%^(Mn9=9yHL&d)&)6^U@L~{2|-0eu&z0+ItPIP#!PH)rZ=@BOJ2@w!=0lVq)U3!zxyL-)<~jaVsd8m1=tl<-2(`O?%auX zm(;%!`Qvt@B$$KsbxFajA;Jww!8GV2h>OuT65&5R`gKIOF;*xIYf|n*^tcgYr+&S@ zl`g$*BErpBeeKki(m!bjTvi!vZ^YJiXAL@RtCV@8esi+uEkw9AS@bsj_5s?Y zzb+9yjH~!gu>NQw+>s=4oc@F)_a_qJ&cv>+{uDjEib4-N@TML;M%=rSKb@tgho|*t z6XEV2Rs}FGZLCOqU!cDXTkQISpu!jHFVW^vHK1C2FA?s88eFdL(f2C%>UZfcCjw^Z zhe_t6M8Lm~Nz*UdB0|rR_1SLyTPh$ibG80jNI(xQe4s~v9T6Vf&tACxM*YpSc4()E zdX#&?7iw3&u#-g?NCfZD-<2eIHxV95iu67`j#Z~@kLw@OKaxy~8vZw#_Hq3a1GHfO zUiFNgp03tEON1wS^q2{sq(UmdOcuplixV2rNMitVa1$b7LYrZB&~dILDBi82e@VHf zSO2npFA<(10^U`^p5KJTY(b+*5+OAbjUp<03~UETwYa;bVg15Lt8`#e|Azi;I2-hD z>fa&)czv#yc5<<6Q-)P+;X`epQUt9;8YL5G+_I{~FLARe9Bto_*r=C;{-OS3NI{8n zuJ`unp-L~rW6<=UV}YapLjOPgmqdVZ^fD1%MKz^t-{^nfvUe&Ql#R*=$-Isrl_E3xIC8`ho0*)pWZ>2{{a2`xFN%VghWCKt#$hiVTCK2{hO0S6LvXk*b z6N=ARlS;%e+%S3|B4a>ANrcxZk=G@55-~_L@@PVFM{yb@l_3xEFsO;}W)D{&&I0;` zB;#B9G`K0gB8^wWU@%O<^4wrF0YV2sS$3NaFPw0<>BDMEI=75G2CqwDyG}AMtp%!HSSbEHoTMNt6)biyp%wBK!}l z+A`Q|((e_9YUq%m(y-W2MFeO)Y~ZhV8fwrYm{7l=@>fzFnwnNBv(u{)VFynf3pkWc zmm)F>y)!*+JcOn1_X{HJ@DxU|VnqCkVHNH=Fu;xTZ6apVu*T4gU?4-iVXdLT&}fJl z))|_J@EsApC&CXz_>l-d5dr<~mn#e{hC>YN4XyaoCbJOXS0emI6q!V!VE<;tcEt); z(UFJ-MpF05N|D3(azitiS%zjxGvDYW0#jO=;|KUnFa4GrJQGnZE2ZCRt4gtU?&w|% zKVQ+7`i2H`+LU0}YB+++-h~4-+YH+chZEs(#Da~ z#?eVZYmE`HVnv-y=oq^(Lihi%fySn?$``e-Th|#u>{-EnQ?dD1LD&Rt2Xhb0 zZRyl2HoTOos4~)2-`U-nY%#H}57G8{m?*}^CZazkmkm~{)rJ^en=KLbXL!u;B&J}) zjHICi#*k`HCp;4iZe6lvNZ?kIyh+lR7Dl?+iZ;RPxU#`B$PCM@ue{ zO8$ci`A?!SCB`zN%!tjCM8U>kNMYoO0uk!z&0zPU8Bz;2jxdg*12`HXx5o%|pO`S7 zjY?xS{R#5Z^cc}Zg~^}PM%@7H8ui>}qmd{kQFfhic8w;=OaW0$PO>}EIAe%IuhDEQ zGR`zwj23RL>Jy@vLKIVpVg^xI@NZ0w>tpGhH4&F#6xGv<=ZhL)B?d!9>}CxF_{FU> zIw;2#!{|18VdaV!02yZy#Wac0xs=g)L@|A!`*8YP0F*Lb;5_0&eWvjsBTNVfQ53Q9 z!b}wQ!F?Txp@R9zBaL9RGsV|oEQdGOSYfOrikU=VO^g;s%UA_Q1Js@FE1Vy{K1B3> z7?+8^*~H(ZK_THb*u$~WL0v~j2f|z9!vi$gxR%ztfhb%D)|Mt?D;E34W@C%-5aW8H z@DPQUC?LeyyNnx*ZDSS24x*St6h6v@B7pTsX=ELXU0+^B59d=GZ-r=Di2g>logu}y zCrlivsWut6(c(56w-~n?4vV$5Udze=&MbgvJ4Mrl8??6@BXQTXf*N1On_Zbn)XMm<%rjx*9F zs_}TD@MH48Oa#pw3kB?KZ;h|_X`Q9IooYNCsl_#d@eHB}#zzg~*;oY`Ⓢ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/60] 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/60] 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 898a22159f5f577f7e15b57b26f23d4254eed88c Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 11:33:11 -0800 Subject: [PATCH 22/60] 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 bf549e865f62774dc18a97c5e9135db1882301e1 Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 12:03:02 -0800 Subject: [PATCH 23/60] 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 12:13:58 -0800 Subject: [PATCH 24/60] 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 25/60] 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 26/60] 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 zcmd4a2YeLO8Zi7hQ?{3xEo4i!ge?IC5_<2w_g+FsmJmoI1qgK>RFvM4rnIFiT@(vN zx-=26H$+5{rh*EHe&@_EUP8Ee?|XB9-y84U4cY9RnfcFi%FH}7Gc+e7Jug2o@dAY? znqnxH;wV-87x7>A4UUfF=A~z6^$lhZ9T7>%&+8XV&P^Gfjz8`h%+JoTP-yC^ZG!Fq zrKU8Lm9kNG>KUpsRfVcbB~Xb}HL5yQgQ`i@qS{bxsdiL*ssq)L>O^&>`ci|bBq~Cs zQzNJ>Dw`^xMpNUcDb%ynbJX+HbZQngk9vt(Lam@yQ){S=)F$dRYA3ae+D*Mh?W6Wn zC#h4^Y3dAhmO4*;Mtx3wL48MEp}wbnq^?odsb8qysNWHTSi~U}QX@UGAQy6@SoA(R zgU+J!=mPo#eTu$BU!iZ&Wpow&fUct(=x6i``VIY#9-u#Iibga?t7sjqr_D4^+h{xO zq+PU^_R#@4NLQdM(pBiHbalE0U5BnqH>4ZU&FJQIYq|~Hf$m6mrMuC+=-zaHdH|h7 z51~`(2%S!kptI;~I*-n$$I^xLM0yfEg?^TPfqs#mNzbC^(evrW^h@+|dIi0TUQMr~ z*VCKnE%Y{eJH4BJo!(2oMen2c(}(E8^l|zGeVRT)e@LIFKc+vSzo5UQFVWx9-_uv= zpXlrKZTe^WF8v#QpMF69%}@->aEzAGF($^$SQ#7RV4RGH@iOI^029wtU@9|Jm}*RQ zrZ!WDX}~mOnljCpR!nQAJ=1~d!gOVNGQF67On+uDlfFiX3MhyHpo_HtFTqs`fLNXA=`*;%rFjKF5&JUx3cHfs!oJGB z#%^V|vAfu}*!S2&>|yo;_8j{md!D_(e!_muUS)q^e`N2nzp=lwf3Wx1haAfpI3s7` zT%4PWY?f{HLcdF z1+_(ORr}O_b)34qI-rhMS5?jS(N2)W_ znd(vMv1(Bb>M82k>N)DU>Urw<>c#4p)vu^ms#mEusyC@OtM{niP`|0(tA0zpPklsv zT75=+R{gp93-y=kuhd_wFRQPqe^LLczN4WuNJDEF4Xe>;%$gXDL*vwhG+|A=rh=xT zri!MfrlF>hrm?2Irh}%Vrjw?#rn{z}CRsC7lcLGiYsB)SS|s)|}Ct)qJe^MDwZU zispOGRm~5YA2l~LcQk)$9%}y5>a=>TL2J~Sv=*&X8>cO=4QLaziP~z~>e?FGI@-qC z*4j4Ow%VTBUfSN;KH9$8f!Y-9NNt8TQ(LGVryZ}Ipq;1%?TgxJ+Iiaf+6CH`+Ev=s z+BMp>+6~&R+CADgv~Ow;YmaD;YL97;Yfov_&}Hhfbfa}+bYpeT>7Lh3)xDs5Q8!b!K(}1CLie(6lWwzai|$q3 zYq}k}H+2Ve2X*i1&gjnSKG2=heW?3L_oeQN?t9%;-LJYky1TmHbieB!=xIHpXY~fX zQE$?_^lp8u-lO;G%j+xZtLdxjYv`Nko9dhCo9kQX+vq#%d+Yn?`|4Bm5&bZIntr%G zL!YM~ub-fwsGp{vuAiZwsh_2vr(dF9rC+UIqu;9Err)mLq2Huj~KN-_zgMKhXbapbTn**}xkFgU8@C_zZqSoFQbWY^Z6d zWvFdvZfId>X=r6=ZD?=kX6R?=Zx~=mGYmJR8%7vL8nO+e4U-I$4WePDVU}UGVUA(0 zVWDBUVXYx*SZCN_*lE~h*ll>-u-9&RE_UFb0hwV?|@4v6`{Ev4*jxv7xb%v9Ynev4gRr zv6Hd0vAeOKvA=PEF~yi_j2K55bB%e%d}D#J&?p*TG)^;4H!e25WL#ogYFuV~#kkJ+ znsKXfoAGVqJH~g7`;7aIhm7wVPa4k~FBmTxFB!izUN(Mbykh*(c-#21@t*O%@qtNg z(wMX+ok?#po64EICZEY~s%)xas%lCwC7NoQ8kky`TAEs!x|zD0dYF2edYSr}hM0z% z(oG{wqfKK>V@-voai&S8=S@>hFPP?-=9=c2UN*gAT4`EkT5Vcqde!urX{%|QX}jr7 z(_YhCrlY1~rsJj)ruR)}OczaGn!Yl9ZTiV{-E_lr({#)9tLeV!f$2}vLo;VqnJs3k z*=Dwz%b8u~ICDjFCG#`pI_A3Odgl7(2IeN_*5=OUF6OT0f#yNx!R93M5Ob<|q&d%= zZ!R!{d5Za2^K<6s&C|?t%}dNn&CAT|%^S=c&6~`d&0Ec{oA;RanfIFym`|Bco6nff znm;gKFn?~oZ2r!C&3w~*%ly#%m-%m=;t@~t4A1f$Z{!8u!k6P?_;|hoUy-lGKf_n% ztMFC%ntUz3KHrjW#kc0$@NM~ae0#np-;3|f_v5qq9DWp^%jfa=d;ve2AH$F33;Bus zBz_7%m7mVf=I8T^`DOfaekH$-U(avnckny;UHoqTb$%~@f`6Ys$)Dm+^Jn<87Rtg} zG#0(ZWDzVjON_;3@mTzpfF*3HXsK*TuvE9yvedOSur#(bv$V9dv9z~zvUIidu=KX{ zvkbH(S%z97mf@C>mMqICOTJ}{Wt?TAMYKF?nQED4nQ570nQvKSSz=jkdBw8Y618lw zY__~+*>2fo*<;yjdB?Kf@}A|0<+$af<&5Q=<$~p7%V(A^E#Fu!TfVpaXt{2=W%j3LuYqB-fnr0ng&9vrN^Q@z-h1Lny$<`^>=dCYVXIN)j=UEq8 zU$QQ)Y0S)`Ql=)??Q9t*5OYSkGHOvVLm)!uqxK zTk93;57wWoH?2Qg?^u7g-nTxqQ8vb=vT1Dwo7rZu*=-J++vc^!*@CusTP0f+TcWLo zt+uV6t)Z=nt+}n0t*xztt+TD0t*5Pzt-o!MZHO(!Hq4f8%dlnJa%}~+v9|HHNj9)O zXM4dm-8RcM*S5g6*tXQR!nV@3#vr z0eje9(O%h}V6SekWv^>*U~g=1W^ZY4V{dQoWbbP4Vef74XCG)!vJbUK?8EIN?OFCw z_I&#o`#AeVyJ&ybKGi_IK}Tzt+CQ^@ZvWc;o&Adad;4ws&-P#JzuNEE@7nK`)0Wef)0Z=pGnO-z zGsiTJX%^EmrcF%ym`*WWV|v8&j_DUOFeWKxXiOw#c+AL{te8GsG5o4Z> znHn=KW@gNsnE5e_VwS`#k9j3#bxbs7L(Jxw*J8HE?26eFvp43QnEf&D#T(QGj^`aOI%YU#JLWkSI$m-tbG+1geU5{U!;WK)_Z_DlA2`lCK5~5O_`>nE<6FlS#}AI595)?5JMK7scieY8bW%>n zsd8$a2B+C+aoU{@r`zdu#yNw|cxNSN6=$NehO@S_p0lB|iL<%0m9wq0gR`@AcYfu()3vRnb-1mEfxGs^zNdYT#<@YUXO` zYU66}>g4L`>f!3`>gO8hN^%W#MO?#OBVAdpQLcQ~7}q%0M3?A#)-}~N%{9|C$2H%z z$hE|^-1UlUwJYk{;M(kZ&9&XN%eBX~*Y%ETzw15MQP&CAX}8vGber53x78ivcDQ5R z9(SC(ygTfUcR%B<>`ru7bJud$cGq_|a5r%`b+>f4a<_B0cXxJoarbcdboX`la}RP4 zb`N!@xYOLj-5Kso_b7L+d$fCud%SysTXci_dG}QJboUJR9QR!JLiZx~a`y`ND)&bB zR`*W#9`{@B{q7^~6YjI_i|&uypSizrf9JmDzUjW>{@wjBmWfrz8e`3|_E=}EFSdMa zDE67ygxFfK^wHjix`+cCCFZ1>o{u>)g=#-_%Oh|P-4j~x>`E>?_vE_QnC+}MS& z%VL+uu8v(7yCrr<>>IJ~#vY747JDN0Z0z~iPh-E1y&U^v?Dg1Nv3Fzd#s2M~Jd8){ zF?y_?avrD0=LvW!dJ;S}JoP+HJWV|( zGu1QGGs`pAv%s^|^Rj2HXT4{WXPalcXNTvA=cwnH=eXyD=Y7vf&neGo&l%5I&j+4! zo)0}=c)s*}<@wrk)$_CG7tgPrJD$6q-#ov2k(c%|Ue;^!n!UW&<#l^wy*_V(H_=S|;Mc&2Um%Q7&+r2xyJH5NSyS=Y__jup%zUkfTJ?MSUd&qm%`+@hI_e1Y_?*;Eg z?}%p{>TBj}?rY&|>1*X{?Q7#}>ucw0@9W^}=Ko!q_6_x=_)>il_ZHtUU#>6D zm+vd^jrNW6jrUFSP4~_4&GpUmE%L4Ot@3T~z2@8M+v(fmd&Bp(Z@=$=@1XC9@2KyX z@3`+<-(}x-zAL`(eOG-y_doFHT-1NAGaf{*>$1RK7T>kU& zUzNX9{=4#5%U>&hqx|jizn1^4{Jrvjmj63I2e^PHpbwY=LckV?3Ah5DfIkojgaZ`= zl>-TZ>VaB;x`76P#(`#mmVq{b_JK};u7Mtb-hqCBfq|sJ&_E{1rq&HmDBjg2o^pv6l@x75o{f77wj1966_xA73>=v5F8v#4yFdv zf+K>N!JJ@TaCERRI3YMWI3@Ue@WtSa;OyYM;KJZb!DYdhgR6pTgX@Evg0BX*1$PEt z555_EJGd`+FnBn4Eckx#bnt`V`QS&vPlI0szYcyIyb}B&_*3v^@aN#2;P1iv!G|F# z#Dr8KZO9NZhb$p`$PsdfyrH;IFccrE6si(R4AltL4%G`a3^fTg548%l4Rr{04s{Fl z4D|{14-EHmy zhkgzH7P=SuGxT?u4s&5mSRXcpg|ICg6Ly6?VShLf4u>m-D~A)p)x)*Ib;Aw9jl<2t zEyHcX?ZchIUBf-Xy~F*&1H(z-q2Wk4J)9BF4CjUO!(+n}!V|-j!c)Ri!!Lwi49^VD z3NHvR3@-~u!|TH9!yCd|!taLnh4+UKgb#+_3m*y}4j&1h44(~O41XT}B77-)CH#H( zTKK2%t?;kmJK_7`zvH#>x_EuOJ-%FgOuR4NA0HQAF}_lK&G@?U4da`}H;eBO-zC0B ze4qHf@u~5V_+jyB@x$Zu;|t!|})CPsg8&zZm~%uV7X|M#gzcOX(;*WuVNIrBCM`RYyh&^ZMhTkB;8< z4yI%z=jE-TjFd^FMP?1fQ-a8Xrl!~`iMO?D*{V-=?#R5H>6hRcf|qomi!A^_n%Rw5nSzv3ac)wOZD#)Lc_=UC6FE^Oszr^c6?LLsG>FDcR2)^F3Q$2RM1`q%ssdF}G>K+VKLia08WU)$ zf+hhp)j(5StbmuUd2S?mWKMQ^R(@Wyl>GG3$@!7gB;M6BGAy|uBfnK@dVY3pk9_=T zUhC}KUfnz94V1nX>5(!#k{Q7T$iH?k$Z8qM%TLcr&c_F~lla7r$$9xLvNLlsBDlb= zpK3;KovgXNokyL5I^!&o^k(}&YEMiu0`lM&2W{=6kOCkTOS#EA}RvMmLR({LK z(1NsfS;MmN*Ly@V@Uinq>OWt1bdRLq@5sxn6h;(AU$Pd z$L#Ep^4zM*Ka%+ReN(biBUSM?I;7`6`czqzs$C;#$$15NowKuAr)NZZ6k?Ig9@z!C zDUlX6a>#~!a{40QN#f)GneS78I%cOS^H4Tf7pezU zX)V>2>PB@J9im(GtfhKVy{O)zPpl|b6)T*l`r*3SpBg|7qy~}NITQ!i0Q@sIl7WM9 zbVQ^?m*`C5+YiI&^%D{jdgbA8OcDw!HerSzApepYg3q_6zXNM5hbJ#f&i z!GBKe+qp*<=?u@~3prd`px7jS(!X1vj_E^llXDC4Oh-pDvU4K22@)FqJr}P}YRlyO zVyJUlm&oC4a=Q5s{37;i;pu#uX+sFG$ZwO~5gdT7b_o zJ+TsxFH@$pOy2)z%aodym6U>83uUY4P`Om4)zm1_znaPu zH4|&st5v;L?HaWbYbI8E?9cy9S-1MII*G}N%5ol{j!>1N)IsV!>JW8UtSix&Jd z)KTgfCO#oH6q{h;rer(0l#V1d@~BhHlX_@rJP;`U#}wS%WJp7cs@cPaJE#71Jg{QCu}FiKs-%Zp!PW4yfN70RYje*ivlOYZxv+Z?Muxbc|%B zwM=bMq`_MhX~iy&wkR@?Ejn5LAKsSo|KcC5BC?`#(q=?^qH3r*s)1^v zTBtUvgX*Gss6J|d8lpz1F=~REqGqT$YJpm!R;V>VbNqUZ^+fgZiR=s6QHj2BJY|FiJv0P%;{dQcx<2pkXKt4M*u{1R9AlP$tSk*(e8% zLb+m3vA5V)>@N-!2a7|*p<=2yOdKwb5HrLqF-Oc5^TpBPSaF;o4#53Xt;)mh|@gwmQ@iXxY@hkBg@mujb@q6(H@tSyDyeZxme-ZD9 zzlnc{_r*U6Yd$JKqtO^N78Rm#Xgr#LCZb7bG7=G>Dd<`B9C{v2MK7Qi(KIw2%|J8J zEHoRtrm(eR|C0d16qcvzPilTLBJ=%aaqD^Qs z+Jat1uc57I8`_R`pq*$J+KpaEd(a!`O|%!ih2BQ*pm)(ev>zQn2hn@z5IT&Gprhy* zIxhYNNCU_MC>Br{P<22J0ks9x9ne5P!vN&~8VBe(K(hfY0kj6ttAO?ZIsoW>K<5E{ z3Fs=Ip8-7pngiMlv=its(1}3T2f8KDoq_HPbOh*ZpeF+T0?_k-UJmp+ptl447SP9l zJ`ePlKwky=SD+sPqXtF*#sf?|Fx7x*08A@jx&YG;m=s_#ff)k~05b!ag}}T5%w}NT z1m-X>XMp(xn9IQ21m+K5XLwsq8*Ue5=xwJvu!v2@hk67X7hQbiX9NMQMu8%ZX%U z6fO7*so(*nT;|N|tjz4uk)lOkl8PQw%4NAU)06m?rCDBFTkvqKNXaxSl{~VP zC1;MzOdeM>q-m{Ga%K|W^}k+bWq6|uq;XsF#FnH@(p>Nnp$?^=OUBTr%)lzmU{on9 z5FRq-CO=W>X@^uaKGapJt(uozkd>NObgO!#k_$??(Aha;*YJs=%S%O%DP@dj4o}a| zEV|6`Qo)6#tdptPX+?{zEEPMxloYAiN#rn3(W0wKMNj-+L^x@t$RUuY1Ym7xE|W{^ zl2Npmq#H=ZLMdIw$VY37x-^xFezufxjgPNm@}ecTl1hHQlp~U1xW?ocYf0KmW#hv# zr5ZMnz%D4d&|Rd0r~%XO-eGn9{qG zJyg=e7wO;W!BYA7SX8MRzs!-j+1XD7Ns3hRywZ*wNT*YnoKkc=Ma#!;7bNk`|LgvS zjEV7)=b{@@J_fs}l+`ggBcpg1nJam`RNBDCU3}5u4n0OHcxfqHrj*Roq7)OPVwaaP zGLrN2bJL$_^FS*3d$w_FDokh-9k%Q*SLHMrte8RBo z+|0a$PRS`HJBDtK)v>%dT4a?uUHNGf+-Da*wb;E8gVN#$-R zWt^tsJ(MDC?@FoIO{HwtBV+S(lX3T7wCt!<_Lj#EUH|_VspP0)UUtgJNPf{!-6Sp3 zYe{@3rS|;ao=d|qnvhbEn-|HGex#-+Ke45@O0(GZzi7J2XsT-AV|$eJE~)SxrL7OR z#V9PgvEGyl-c^b~ATas)g$elbuO~$0vjMM{qHJk5m~>_tk+DUW`#ov7-za56o1KJ5 z4^IqBj!7l&EoG}lPR3?D*@mBzihjG4ML$a3DC%)eD*D}07LBtWk_(^Mfu}!`ir!yJ z>dX|JSMkK?@^h)=gQbk>(InrasKz%^!G}tzfzMqLkD^6ik%~T2%7#8QlJZ1lxh9o+ ztQ3`n9M;LlC$6Mih9a%~Evf7irR5l!o1U8X#MtkSRP@Ote$ap0u>Nx*NIC(eoDTZu zXYn!NJ!zJwOSuK`$Y5mAE&G>L?%7gCV@7(~@S@SkFjB$i{ud|9iW(_d9e8Xer*{-t zAx0z3_k0pR_S7r)LPFg~`7+E><`tr|j9JdCU|t5K1*8L{2V{scDyb6XDqm$fWSR zRwB=C<_(!=58>en&tAeK6yxDHD?0m_LqumkbAUO>ya&h%$Ogy`s9cmeEa@Br6eH_6 z%a+a=qH`8-&Xk-!$9!0#&Zo>5vd-s3$3=9$B0BD3I>O!e6`sq?4}|AC<_hyYgHvTZ zfV_Zwfc#PBM~UY;pg5T)P_}q}B|LWk;Y4F80g(B?C$Fpmu=T1L^>%W0VCc zmTItY9px#k-y~MK#P#>A6U)hSJ?Sy9spuP&v?h<+4X7|ZF?-HK= zgy#U^8Bm(gxjm1guQT8YHI(vh?2`CNFa6svRMnu`$ z63?%IM#?;yWsB!N;duZkL*e|#7P`Fz}@M?jpJvtb~P z=LF8eSpkg#lnW>iP=1uN6Cln3s6Yl9Q>K789|q$5fJQ$8;sPZCRpP41K$Qv5SOSzl zfC`HN3AgMDPfe~K;i<*d=IU^`Pah9x0-%Y2CPlgW5)ba%Cd)ifws=|+o>qWFg{N(a zJYBf%GEXfa05Bq^x!?eseoPp^kS4tl6Zy!nkMti zC|f+~gl7bx=?YI~i9Gq-7@21@;h9Nz3JK4wr|{4U&m`_y!ZVo@IpC%MngeJqpm~7i zN4e)D9!#}B=2=v>cxDqGyu1q)p7|y6Eag_nJj)5sV#4zZ;d!Yz&nAt+vzFUPc%s}o zZaudF&{9Cl04)c!BFb%&c<|K?FUveD%NEZr!m}IDD+a~;b%54Kxib>aIY1j^o=s(o=M%#7DWHuC&le@~ zT;{%)d9Dzi&4lL%!n36qkA-5yMhegk?iT`dle@*;=6(kB8lbI!wgK86<$jfbegm{a z2HI7&fF2T{zX0ug1f)VG0jV@9y#%Dv5un`|NM$5IuNMOnE^m0mqq3-CFptWrvZ?H< za)90d^d_LafZmF#9E3;Z2K2Vf^KO~qQI*F$ssNyO6rOO2JXKVQGEV~G*++P)6Q2FW zdFCj6m#U7cA>pa3s;8>2Y5?dUAbhy&5TL_RRU?T9?%;ptE! zPj^)>nWrb=IZk-`5S|moc<|8B?^5DtpemUF4N?tOC8>r0Itd83LZ<Q5KzJ|t ztPFInYyo8upiDp?C_p(S0*z6PlYt5e(1#f4-;I3~8&UNsW-)w3$Re|`bbML>9G z=HsYps$??_&?mCZXJyM~F0sL5kWUqxg(cc7SG^+Jyi9C9C&9Cd1kV@6f=8&W9E4V_ zQ*9s1?68&!D!{3}3T1NsKgrKoC)#Dg2^Z)KkE$`;S-gl7++%L>n4!gG=Jl9z}N zV^x*k;+0T1pgJT2y+?qq5TGLj==6Tlmw*Ksf`kl+CYHr zVIZ}c0NpPJBy?W%h(~QxJ28*it}dsJQR6-IKLI@iga;IVN7XLEqxJwzNjx-Nrg+pr z!V>}-DLfTQXN!9=D`;aKINkNMSmzj_0;%=OHp-wbpv%nbt9lv zK&ye)0IiLxn@B*-f!4`DhO!0JjsUd>TCV_gDiNrsx{nOhn*bRJP(K1>dK!>tfC4mF zokD<;)I-$C>Y+gMKnp-yfVM`}sS;2c&^8&UT-gH3B0%{1b-MzTTOv@QdV&lzo&d!V zph*PCQ4C0^vrOT6R{bL3c~1SjdaC*bpj|+_fsO^*6ID-BPgl=S&ji{FbR5v-fi7ET z3e^h;&_bYn3eZa!NWFyhk{8f^aw<%EC$|r26lhvrIg_DuYUER`nM3c4GFb`Ze`d^){g6fvx~_MWFGAJEV}>4YYjnkgig;Lh5ZI_72d> z$wT%25<}{!`h?7LobXg7JSPcHLh+Cq0SeCt>WhTuoccrcdG!ULs{vgd=o&!RjH*A9 zcs>QXmR#fTeR;~zeQng=5S~jw*H!}RyApYRQs0z$ZV;Zjgy%NlsaKrmk3$O2UG;s! z^PBp2^&jecKsNxoA<($#ZX8uVka+$Ax{1uwtW5D}ILxELJxtR_JQ{6DJQ`kOm3TB3 z!qXh{XzYZiMKK<{KbGo$1f+3kd>BaM*2HQ&8eENA0o@wtHbA$HYWxI969BrM4Ah}) z0aYSE&j8(C0jgReP%TYe8K@2c!gsX0q^VDUIu!#F@{TDyO*AbDPg6}ZO>+(Yau=Yx z0^JSh?omxEiKi{lJ!GC9+t0D53lGeR>`lcC83dJxb4X=%VN(Fu@oZq0uf6sCWa3%8U`to&D6{z zX0tT2HFGp`fgT2Q8qgRoJ*t^6h14RTN5~zh-$u(Lh3TmQ{<3(u55{2BVs=R z{j4H(v&4|PtNBCb`JM1QPk8PVo~gxo3h+bUq#>l{Z!L>?w3HTUX)Ocvi$G5UdOFZE zqFRpdXf;63lzC>CDITpE^JsaXXFcN4T1(>5y0jjNM;l9c=3pMJkMPVb&cowNNhKa_ zP+O7kgtTF8ytV?+^MPIfG#=?MifSuKJXL^REb}ZWTRb%hPc5KdQh4f?$kRmIT;^#; zc$N~LmV{?nah}|!3Qs$2XTsB7+dS} zcgU+1o=6Sz3If!KgM{o1-12#m)43pf>=$5$H`( zZN9buS1#P-Z3g;P(w)9mwtOZLAKX%IQGBL6)hE!js@zN~>pWdMONN?BptcgIIRt83 zF(^FNjVwpp|om z+K;uL$ylEftRn>L3xajDI9AqSMfj5TdxG_?_OkXn?G>Pp1APK$yZ|So+N&7rN9{GB zPf1vK_8*ijte*+iFF>DGumSe$9ylt&ZkG&+)cuG8vtI=#*SG(JLd5$KPA{y3^Lsi#wubpp_zU?wulvUN^P zM{>_~PN0=@YC4j8{%>y+s|)DDQW)t%#D|QOHo}7(j@6>11+CZqs!JgHC-dZ(-`Q>kAg_otVEu+x(+f=d%{D`sOdTp zp5kZJaGQOprUKMm*M|W0(Dl^y()9-V2cUlh8rQ9#qPo87>ALSscgPpEz=UekKj zS0*adO(Ia^bmMgsbQ6KT1N2>>e*^mWsBSVl0MBy@(D?LP3o_IDWy@(AaheYFJtdT8 zl^9A3buY<2i;2$z;wg0272R6mvr@N8w_3Lb=)Zve8yE^06xBtgnzjKL zTI&26wrufiB|O^z-?BhHP@>yeBF|pkJ2KDPn1|sA&pynDDpb69so zcT{%_7!5F5V06Ifqq-9k&naLGGLNZj@th|-7XaVo;1SQqCGvcwyCm~`LwL-D=Q82p zi}Ms7PaOX2(p?9}0*n1AH%qM?8O$ zM(CmLFY*G$0gO|A$K8E^=O3-Hp3}>z=X#QQ&bTp?o}`}R`z1ViidOjX17#w!o+O^@ zdA*>w=rNEN7#}cxVB(^BDe+v7XIEZk3YIA*JxM&*<0TC|V$zqGc&@LcmlMzRB=MXH z5gw9wj&I6Pj3=>`!c$XE63_Lu^tJVM^mT!$08B+-DgpCMR4*l->l*=6S>~x)ws=V5 zxgOslyo$n8V&b{Ji(XDV*OSC^CV}vf#B(OGI8WB|3Qs>hNj%s0*ALJS)DHrtIxsbW zsR>N2s9s7u*AE4zw#-wvZ1JQMo)N&*QFuyBJlE&z<-~J6Njzuj5gw9wj&CzjEP5s@ zd;0oGdXjjqpR5=4pq~OvLtt>YGzO+gR4*l->t6t-sm#;7Z1Kz{Jad3)rtp-Qc&=Zn zmlMzRB=MYSL3l{wIn%Nj4<0Ml+o;6PT0KcU*GKj1^y~GwH*XD08(`W3(=Mu)QqT3T z0@Gdw>R7gbb`hZ6z;sZ6N=!Z1@6*ev=X#QQ&U7L`B=wx>TntF4d`ICqt|zJI`V;#1 z^(XbXH}48eH(vQqT40faxjo^e$UGpAeo;f$632l$d(1zpR&2&-GUbPancV zQqP&b#d+R1t?=B?lf-lVP5mwXZ9VSI`vWron1R3yit44rbNz3?43>F@lr0{Tc&^8N zdD0^u11f0*WY8Go#B&2lJZF+IkAWnfGee8>?Uuo>)za=@el69Hxz zFlkYPlz47%12bIa8BwNq3?%W~5CA4!;VCik+)%|JC!QNf;yE*t@Q}oFCZjkHQYk!j z3=IiST|+%XeFJ`)MiwyHz~lfkDr%4t&kaq1$(4EX%N7qwJU8H0GEdGs^T6QV z{aIk11Lpat;RUjLVVDlgRGH_+vc)rx@XQD11%+o(iEYmc!%AuI%kT=}nMQb46Q1eC zcyQOA)Jp+cZ`eYBHW)Snuy1k7S!UIJ!G)F7pu8_ol> zRJK`Owroh+x#4qQmMJzRrkxwE8055b14%n)R*>K!Y3Iz##ezqexLygJTLzMJZn$mu z+3<_uS725GvkI8iz^sWH?rPpN{BHOIn6)IKfmsjChOz}j($0+(FwsXqMv``JWU0yI z1In79t)0jPkj3lQqZxkm>ZK;qoF_Ppo zV^d=@V{;?^@?K!x0_JUC-iaDpsizy;7;&$P&!5Esa{!owWs8iYry21sz&?eHq^B8s z;>f};VD^*9!f)i*v{^v+lyx3xOp;@3FoAlHKqV8XL&c!*l^=C4DU%H|jwDoR#^J_v zBi>Iw0?bihjsbH#YRn+*w-Jw)PRMQ4$+87Cnn2;Fp}ns_jVr1BHiGdv8R%I8bcz5? zB|xX20)*Cz3eXJWTmm%HILkQOI0x_@vzQNn!8>FhMve0%poPGkmw_&pEuiHDXaz7A z6rhzQ0wrejyQk4a^TR(NATI=zBtR z6__6tBAk~N)f_WkCoht<$KX?bn&hz1B3VXe~FrCf@I==`Bg@`Tc(gq_%WrcO-5kuJVG+@B~>(2jL9YO zn4E;?H_T&-B|N_u=Q+^f5sxX(6vjNJ@}__(Xu@%M519MFJOJj;s3~6JsRYbJndk4a z#Z!&&;A6&rDLl1GLz-knp{w4Axn^I+-6vCq;Ji`c&z8DYg=r4^`fJT~f z2vCM8)0Ab(2G$6y30O0*eAF~bGt!i2$_ISAL3#+VHel^#i)cI{ngFatA)1VdOrqu( zc>!xBO_21CTOlWJRMz=L(+rtvI-x2@sAdtWm||1{w@aC5zUd_bwZOE{w8*p=@J$X` z7qD(%W22@erlq(YS`MrS*z&k{U;|~#X$^5&3;5D$xkEFpCr%qo8}Vy1us&e@(t8|s zvhivjpG$l6pR)ElOuJ>WU4)EWie}nF$ewm7nsWJ`>21>iLiUd7UDH0(eqiH)tpIFA zVDX0srOJ00Sou;kwrpLBW;#j4P64Z2ie@@nV&(hD^r_7A3E?4^qM1G?JjE|X!<8?l zxuW`w=?Ve5Wct>0+4LQ-)qt%I_*Rx|&8X>n(^bj7K8Yz5VALi97R z%H?RLJ0z&?;);M@z}6x40KefK63q{Rra?KN1dVd;+4PrL&QCLw{4}-!Hv4x+mL74L z)n)_cGHc9Qv(Bsswh^$6fo%e8)2P`<;>pYd+e~iETa+m*a}35ZJAhU0XK8kq6i?>z z=8zOm<{+_YiEYgBB%WFoYoYK_w?Rq{fVr}{8Uda{fjX5fpoRnpZ_tj9nkaMA5`o&7+si=h2vBDN)R6#nc^c6E?n(r8GxsJy-OWAB zJ;PZ~0y_xU!BO)Bi3eBgB$+3Me+hR4j)k>Z=!N>wRxU-p$xQu01YKTiwRIlaUh>biJ#@>RRm~-`DODf=9R!k zfE@;G8nDBo=G78V6xehbsBB$}X5K=8UIli90<;YSnYZIc6Tg5RNt$c?hDQL(1$*W< z%x}p=dkGP_9?kp?Au4`78t&CrdK9FC=A#7ZJ@X;+Ve=7SbATNMY%Z{QQS&hg>3v}H zWu(z%D~iq$qz{2ru17OpEU}V(Vg6bM`icOJ!9f4+%%fs+#e9{jwA%bVuy{s406Si+ z@YoaT%s0qG4S*e&#BU#4MS4t8l`+}5Bk_|RQ?hdk>n9{6{9itCuSv_^J$qyq>5nLaE%lG`Ct*eEkOB|C3y75Tw@RfgfmGFDHlRyX|gNxR6; zgeKD^hVu(^B8`ShMJj7}+x#0k z`{oD00;!edft>>Evm_9zwQJd`$kO&|*GFFc7I^hrrKaa+=k~x4=Sm@urEZs%8X23! zC;SJ~bS}so8p-W4tb6vDy#H`6DcCBbYj$2bnN<>B>pz%F>-5~bd_0SP;U@9%B~I5e zIX}`mJtIGoYyJDte@T3WYPC|6YeZ_M)~Zo2wNCY#k(7FoTB)^@tEJSamt4JOjpS;P z)Vh(Bnl*Z)CM(yZ@hV6?Ndn^mJL zULhQ5a@2Lrjf_suF32nLVT+99JRDCIp7Q;w_@V5$(sfM7k1fH^ze~>_ogNvJ#6R96j*!#;vih^ziQe*@>^c-^t|+;8IdHO$G?*KbxKadkESe0#UI7}Yl{?FoPU*} z2{cU|BJHLqi_(Gb^0Y>(yH#fO(E#HTlL8U6i_UBWnN}Kor{6KyXKbXfggiq#&@+rWs0(Ld9Yk*w~_%`e8 zI$+lWy8+mZoA?Mnj8Ef-^XdEuek7m4X9BwkSiJZC8n9b|-3IJ-!1p<4cLFQjX4C)J z=6XD=%jGuU)hre3AYGM-as8OwMy;^nZw5(pOS+&+J zo7GHAY~8$iv*xX&Kh$-Fr5pKXYveJwwk2P(B!=N|YMWjj90KSxzswTd*bas%`NkMCFX z_y;rinMFUC!{gINkAGtUzp&^BFY!y{4|8c$86 z^!#dm4bSt@etAll2<#ic?g4fxaDN1v9XPlC)ZiwKm4(~DBgkE7;IVD|$1 z)>{5m{xu%Q&)dMh11!D+X>Ymp=`FVaNqqUoOp8|g$C{ph-!}AB9>6892T88r@j~wV zXCThM#UCWC_S^hB{JZ=zBgWj~nWoNN#?izXk4N)3S5ZBeN3yi=DoS+iaf=18^ zIzcZO1fyUQ%mOb6f<>?jHo-2G6Ji91;1pbfTZk1rf>-bfej!dMF9d|35E8;dyih@? zC{z-j5h@E+gsMV6K!XRO=kR%Kd zl7*o{ijXQqgkeIOFkDC%MhGK?3?Wm<60(IHVU&<7k}oVS+GG zm?TUVL;-{;!n4A2!t=sZ;RWGEVVW>qm?6v*W(l)}Il^3Fo-kinAS@IX35$i7geAgK zVVSU8SRuSDydta=Rtc+xHNsjUDy$RM3mb%u!X{y}utj)Pcum+UY!kK%JA|FWE@8Lu zy0AxhLwHlzE4(GVExaSVE9?{Y3kQUQ!h6CY;jnN-I4T?yjteJ*_l1+fDdDtmMmQ^c zAe<9E6wV75gp0yQ!pFiV!l%M#!so&l!k5BV!q>t#!X@Eb;j-|Za7FlDxGMZ0{3u)# zeiE(=H-wwQE#bECv+#@Xt8hoSEBq$>F8m?f6YdKSgg=Fc!e7811@<`L=T@+Izw9Ki z_^{_`V9x-17T6DfJqIk_BRUW41z_=>^hdyc4D2VsehTboz{q~k4eU3- zUIO-8U@rrU4`^Ni7Vqj@1s3n>;6s_$fc**B>%iUs{2U1O7O=O0{TbL_fc+KNJHX<- zh2Mbv9oRpBy$9@lz|US_{{;3Suy{HD295#_0Y?MJ0LKEy0jB~^4V(rzEpR&E^uQT_ zGXiG<&I}w6oB*5!@KY5y8*p~u$^jPx_<0JP6F3)eZs1~p^8n`s&IkBO23#C)<$((T z7X%JBFJa)~fvW&qMc^s{_Y82AfvW;sRp1hUO9ZYOaMgjU0bEVsY5`XpxH^EJQoz*% zu0C)LfNKa`Bj6eX*95qxz%>J|IdCn2YYAK{;93LM2DrAswF9m_a2HE)}>4 zaKnI018z8Q>45LF&y55w1Gr4!vVhA5E(f?#z~us$2V6dI1;C94ZVYf^fhz=V9B|`- zn*iKI;3fe#88{I*0B#C!&jR-xaL)rb6}T6Gdl9&4z)c5k25>Whn+4o#z;~|a<^nel zxcR^>0B#|0i-21U+)KbM0d6U9%Ya)B+zQ}c2JRK$Rsy#QxYfX|0d6gDQQ+1Aw;u3a z>A8)-Z31pHa9e_dakZ0pI1FI}O|!;LZZ~0sMd5 zeRp7!Rri0=@jMT^(B{c#GuQ|OlQwNr6eP2av`uMJpn%5E23jd?OZ?<$wrKmkINaC z+g$IP)zce>c%9_I_gU-Zws1=ueD`KcZ(lgnvvH%%>Gb$L-g;YYz~`Lr!>DCk{x~L3 zFeVnaApbUao0YXLhR_9n7n>N4z=|Z`Mn?_631W;w8f794wAkqN`bDY&q?(vS)zr}7 zZS=dGfreU}-|cOzi{cg{M{y#@LR+oJ8L&wu;E{5w+}6_*>ZSem`CR@$gUvBNP-m<6 zxLrPfpsBGo(9q~|dlrilsgY}Dl*?6T2Qgy2zJRA5SiH_Ahd*F%s(049MAj0qGm!>e z^)`F0E8wjUI9<@9GtlVrd7By?u4rfU$YG8)mVy+TgVBPq^3?nMw%Xc&-&P&vpMd-` zGV;^zx%`frfVa`z%enXQ0+&Z?rXfVj46f zhAt7q-sGuu1{MOTt==D1mj#K76N#%Gj=(}!qYvhUsGdrsoRLULyWpvHHNs#xU5i01 zZ=)+94712N8#$*Za=I2fYMY#(2*CmZZh#5Y+v;LHnS+c|6B(;r^{z&n-$iW>m^}5> z0f*NawYhnzoAcBU)SLqu=Os259j6FFpvGkbv+)Jojov!2cTX)$A;J3N#?p;&vl8KK z4Gpy(hmE?MfNQbeRZo>1ur+vKR@63&I)led;HXLynSBl$(1OWJbOwTWsrs>d(SfZ+ z07D`GI)#Yt=zJC1^CG!Y?hL`#oUfy~5U_iHqo=`LE16udPY0<=;;3x3eph2Xg{*G$ zHovq={n^{aKtMk3{s;gmG$IjfA?Ch*XIII+SAb-AG&%N9=?Fmn=j*NTQA-5hZM} z`D;X|HApu(j!s++oUo2iXAKq(R_}|N+dAYi#_>d#0`TXJ)h@c!Ib91q4iMZ{=ZQ^? zjVa{v&G$5j%Yi7@u}G(lYs2AfXbv>g*nBSVRAAjA?QuvuDUKEiL{RkCxWb7n|3Vg3 z3KpNgIkp0xjAZe)Bp^rpcypcITN^di(~x{>9IB_G##`_5f^&)4pr9gAmNSqmehBJp z4zF)X)we6ksNz}%TLcj!0g)Sgc?>gTt|hO(ID|vcOdQ5 z7%i;1^I^$%dVCO!LSO=+Ty-r>k+{_xl48)p%orCeq&`>ULKoPi*c5dRz5opbVG)T% zw2(iG?+QdNf(AqfL|YP-^&nD@k2RD`8nDBZ7wI7r7LV>)90{!<(xa0RR}YaIGGstq z7()kH>b-#mPZaMdq~K!|v{wOG4E?ach%k^10GKH;BC5l{B9Ff&LnsHC17K3bm|#*v z)Ee+NH$;IUsQ@%ZF&YeNS0Hu9Q9-r> zs3hhY4aw?kJ{ZXWgu*V^4A50rQ~)G4fJdSwFbC8Dh!LI1kn{i|T};yXE>{CYSDuA5 zz@Xt$V||nu5+gud86$>~SY#~C5MygJLi%m7issPHQ7)qlnY7g#4 zFtbJ8#`*D<4fz*fnUIo22*;b_86ZzHAOl@eqg{i14lqbe8oCC)lF|fxF1n|KU7Lg+ z(mp^h(VNfJV8a+$FzJ8`Hn`$Qz}6UuC1Wg(MBErd-Uz7Fu}=D6L?gB(jR_&G6fbI1 zeN=y`<`ZO};&B(*8tZ8cUmIs*g)*d*bO}@-F|!7#aTVqw@eDcLwRNewNOvJ+lzq?jFJPx9sqzi)7B_P_Jt#nStDh}C^O{(}MsZfWsahi!qC2=K%2<|1mjo`09|49yE0n$#D`$9p;b{ZOjy=^q*C!~@hi%1g;d)!J==tr)}30$!`n_~4T zT!cIm5_kmrNVQxQE|K zl_c=Ns7GuQT#9H~T}YZ}E@&Vb8VDnoLGEjZvmtalLo;y!pQjpL9!v1e zG|34%ZE!i_{NJg_Rw(y}dgw`{jT`+meGi-Q=)(1Hq$rh8&?qHFy$=pO!@L6CRh)enlk&X0cfg-KT-@#OTxLP!leXGg8r zhij0>ke)|~E=2O{2O{@1xg{aujp@awRw;Nb5&IS-9-m$m3?^es_w7hO-`3sT5i-Du zxXzUZqrukN3J>FY489SklAmBP(_NHna3mWaw9Azz?|02}AgMeCWt$+jz z-5&uSEaZ?`r)g*r>H&nR%1Ww;Ye8S(pxuMaw21RC;*<`6Lm%GIU;;Mau>G+~vd)E% zA;6q00HRYIwFH4Z9dl`_vhYd7I%F_d=w!rB#qX(}K{Rs~XwGH`*dV&XB#c8;>9J zOz=VA^x#327>m;2sZo5?Rrq4oJrf2S*9&k1)v$(xd-5)#PhF#fzYEa@GD$jUk)emw zTD_|l=6ZB75<9sYp{5R?q}tkrb%9#HSLAvFxl99aQ2`oVG&G0=q9Xg-$X=EOJB$b< zS?XXS*1iWmb;Wt@VMWMXO?`vP$e%tDr?`bIB2@vHTE z8=@Nh3b_ZG$AU)bkfzeAI6C_fD{B5_RI68wEi zjb!9+sBMDGag#3&=O@HTw6oMWV$R4Bhwy8vp47tX(idC_&jaY7I3Q#Tczp2CfySs1 zxzRU7P5goUv*O1joSGnHVuUiy3Os zgFPEeYM2ZV7e#Wx&d4?>-~%gw7R1pgLNrSz<-|ZJ9t2MDS)3vzLS!7!lzf_jn~rD{ zPaZ&e(cM%Z7i|=25h7tir_^kN4Gt8*VFJvKiq56Tfcy!oOgz7@2F@bEdesztW>Yi~ zxn^h5nXtG-&aH^2DTM8=MEO$?D8a*u%|o2%m@z|)3>}LXr=L;>AWoVInF2>JE71gI zB6phkA#ziX5*ZCgLj$B>94=VCVu4@Lfryf3DAJ%bLdI2;q7?ZTrB*8N3y(VKQ&k~S zuBE|8JuJYO0i&)iax4U1NKyEl04MT-ku#3_riTM;$Q1W%Sd zqDKK7f***@Y1ApA9fW8V*~%D)7VYR<1hHldB6if)h?fO3m-b z^pq$7%}Ti%8@-KDQI;cAf(1mNdcdRDIywv;k#H~S6S0H1AAyLW!4K)J0G-e9@EL*u ziGv9tcuoA^qz9*#hR}{07aX63!#wmrDcvl@Wju@85H=yzkp-;H4i6i^e5s)VrZah& zUxmn?Yy}o3JBsY|I`Fx;u*srZHu{iUG@eexO>I1xwd|^EfMY3kuTxCo79BM>8KX*d z!=Ydd&20{PoB;AYG+>U&*o(Lc9wiH{LY(J}CX0%WMil!HG-!u&6I81BoL|v;1auDp zQ0!p}&`k(Bc*Cr)1pMAWSt&e!_NRdDA9Cku*p~wEcm#9|q4OBvr$9Ur5p6?2r2B;A z;W-8IhT=bHNCjuEAQ@L1p#C-m_~{6q^+cCUM^7C+5e$Qbk4=)rJ`<5$LsA1CzjQ%j z2cLLFPjeTYgP0B3Vn!!su%XOb zaVsH2-lA~V?UyDoYXFOgknn-WT~STmfVkdlEkM#~p9?b3-ddXJbirW}SD?=2ukk_* zC|Ub%M)a)L(daluya1f^Y>W=iZHSe%`Aa1g9t0$t(VYmHuouc|#A(1F9uO(I2Vt_F zMN-Ki2MBJ@+XSbqL=Twk{O(8mp%`WZJUOYe;q4~TkRC#?!?PW5IwV3&3ft(&(OY;D zD;gA?mCpR6L1TVE`dkQk}dLHL`!cMC|q;|<7A40iIRPjjbu?Q zxJU(OVWM3W4K_NZzC*Osc>ubtOjKJVJSu^c-0;*3?g!Xvn|+=r)QhXZjGPz*$Cr>C9ir3-FK*eA!V1Ok{gGM{n^S3<@tGX#Eut2x z7&REFqf-ddZ;-whVh!{e7_~v18L=-#0m7!=31-$cBqJN$Hn>j*w<)4YHANv}ruY8o zFhwQQdtLAlsX?4o3Vw*1m880&rh%z6A?y)Vpho!gu|u4=QO!ou%5dIIIHVJ2!6gWp zezTeyk|us>R0c7Q2rJ5{N5J&KNF1OfYQlcgE0_UzGrCPtOhCA%wDFw;&JgT`BYKVS z*dY-X4v+~+2D~%stAYEHlE=Y{$=F8Y{?Vo4>GW+zJg_EZ7 z1K@lm4;d6Quz{@nP)aS)GdqyT@Hk=BanO?^usFsZhbU$tyxHrsMb1RPk|k6Mh~Cl{ z4o6T5;ZD5tY=Xj!{AC&WqnxlL(2E|lP(t+HtHOc^2m5;A5L=7E)*0+r2Z!Wn+MB-Y zY3~s-`|CDtq_--C@fQxS2n#42oD&VS5}~|VK&6Diqmi_T11`)z39O#f=Sv>SD;g2BYG|O< z4l&88XhIyJcZ>)%|Wu1Buyz) zr_B%NkHlwtio+4mkwMx40bzbZ)DuMvB4P^9l)Z>T{3K@Nq^VOyE25|HCfTFox!Blw zK*dUgtl1wGME2xyQQ46Qo5{8Y)GS?nF)=Mprq%l|YGh$|c;UW-2-}UYbs03^3qdvH z_Fh<-61+5Al5A?ESK09i5Z&t`a%`dML2S={VZ%8+$j3l95 z^iBdC!J?0WU2ssHKDrQ9vkseqQc;OZcGTVmR*ke7sEX0B2yVefAA~A4VhaubSPOOY z>1`zOQjp?Ugx|lhm39C&^-=eE9Aamh>Vs1b#Q2T|@yWB|Ux=Q`kq!=hA$V%>K#SsJ z1TUuL!;MbihzOLM@Yg0CIaZv8l!|!D`WmPX5Uu#7I0I?aNidD`NgBJoxQd~y9%ifxMRimMbm6i}b; z50d{U$^VPw|4kU#Rf=mB*D0=7>{Q%97&&2b2s4r}qX=8y52Z>|m1!2sE=PJOlwciv zdFfOIqebWx6`fO&ixpB6^#s*ZQwg4_zVyI)yi;*E6pU8fMVQX7HQ1K99@(BaU5V2si;!(wuP^DS%nBsB86NF(1!xDzurg#bqMl-|ycLk$Gb9hPd zYAOMCW0`1XgjgmzlVu4L<{hYxt9X|%qa{^-6?+u#D?TXLPMEQTDIm-ksO|fIP*a_j z56*va%r$q2o%~esC6o_Ve5UwZ@daVV5vGtZMcWj66<;a7CX9kGJYkgm(-uWcI8sJ9 ztNOuG6}2i&3fUGazFPsLw~zj+y9)P&IxrkF4#gwYa4 zw}a2&b7}ElEFaA130q5R2mk+GJ(w@R>cKPlvHUo`kT2pDJkKk66|d$sd@*0bYk3{7 z=MDULegZ#{pTtk*r|?txY5W2FbbbaulQ;6S_yc(pZ{|z+GTy?M^A&t0Z{@4_+5AEL z!TcP4E`JC=kGJu5-oZP07w_h)`5NBCAIi_?Yxz39p7-(%`~tp__wjzdiC@Ss;urJH z{1SdCzl=YOKb#NnNAN*@Ip4y!@*#c&zmjj`+xa8;ReT4(n(ySh_-_6vKFs&Ls&0oV`%U{P| z&+p`K;BVw_;&0|};cw+{<8SBh;P2$`;_v3~;qT?|>Xdq=K{;MIK{-)5NjX_LMLAVDO?iNFx^jkcrqZaKr94n+ zQks>e$}*)zS+1;5Rw}K^D&=hDLCS*(V<60U!b~8{M8ZrW%w)n$A^-66Q+eQt%L~?W(8qZ5~htX?Swg!FslgD zL73Hq=_E`SVY&%(6k)=I=^;!nVfqNOhA>AHW-VdX5oSGMHV|ebVKx!w7{VM&n0~?# z!W>7K;|X&DVg5y!6A5z?VNNE@DTFzdFsBjbbi(|bFlP|vOv0Q+n6n9U4q?tE%z1=4 zpD>#Va{*y4B+NyGxtK7Q5av?CTt=A733CNut|ZJB!fYkXHo|Nt%vFThL71xva}8mx zCCqh%xt=gP33CHsZY0c2gt?h8w-Dx5!rVrf+X-_AVeTZ%U4*%tF!vDVUc%f*nEMIy z0AU^^%tM5Em@tnJ=25~tMwrJ5^8{g@B+OHUd73cK5awCJJV%)43G*Mqyg-;23G)(R zUM9>g!n{J5R|&J5Fs~8jb;7(sm^TUY7Gd5d%sYg6moV=U=D&p5Lzwpo^8sN#B+N&I z`Is=D5av_Dd`6hh3G)SEz9h_E!hA)TuL<)FVfGQ`Tf%%tnC}Vm17Ut7%uj^*nJ~W) z=2yb}Mws6T^9N!6B+Org`J1pZ!paGoL)cux<`FiZunb{Y!g7QiM%dwm9YNTUgoV&- zG-1aOwt%o>2|JFkg@i34tb(vSVU>hc5mrrD4PlE3TS8bZVReLsWyC<(@r0c~*olOl zMA*rMokG~Dgq=p%0|+~vurmldldwj@&LZrAgf$V?OxRMwmJ!xM*mA;F5Vn%AR>D>h zb~a%TBJ9D0okQ5Uggu0?^9XArtevn9!a51-BCMOR)r74ftcS3N5_Wzpv{njP!htIV z;|)ipkOItD{#PmF_Xa5cs}xdpgDC&26q0aRl>b!<*|b5H|5Xa zGPLr)N+CBg^zy$-A^nkU`Cp}w&={cnuTn^6WK;fEDdaTLkxJ{@DRG5JV?~AG zB&e7iSDuHIgDwB7ya3ssxdki+AG>`OSN>Od zEAkAf{IBwk6mq2~|Es(k>9Q*StGo|s2UGr6`5>|kRQ^}_2$IFy5Yukwe)uD}h8@yL>W`CrwfEEuHad{tACL1NO-wG8EdRnw7PqPGm?e^o{# zmW;7D64LWZDicx-SpHX4mMCiG^1rHzL|l4sm7cLqu(2wnlXMAGAThJJN~o%Xk$4E@ ze^rMdXI$aYfy)1??8p;Wem3j!zbY3p$5nR~E|4db|5eo>VO(|B4CQ}Skh=gs5LX#g zLJmV5tL>($N7^Bj|5YtO&aBJ-s{F}PMQi>gRHRoeLfSaZ#LC%9DnO~0AYq*TV}ydk zg8o7b8mR#gXV-@z^B~Iqs*cFiTwFu3a5w7FS~4{!j7ogr7}W~oh*N`b8!n;zuc{ph z;|wIGhL~KDWm46FO!VLmj6|Skt_T1zp6fDh?|At79w5wU)5UV$+G;f zY6DUaRQ^|W43Z6|{I7~2OPpQ@EdQ%I0htC{{#SJpvc*mEbmf0lry^})J=X!s|Em6t zT!SkAt2zsLvM>LuIu{uRQT|u889A~n|EszPssD-czp6`9LPe8FgDC&2x&onwQvO%9 z6+-*{#W$|(hsKmuj*}N$*%mb z>OCYLRQX@k`^b}R`CrvX1Chs-|5bgOUVIv?$Cdw8eSySTm;Y6Lh4cxfGX9D3zp8zR zoN&o-NacT3-wy&RbNOG@PY9K8EijE#kvdqZ%KxfJf-G zkV#UVM}|Ia`Cs*Dgi0vPn53kH^1te_$YqMZ+Lgpb1xQu?S6zhciDg+6D{52rH06KQ zN<>H~;gBSNa5Owsp;~FBbhQS-5-N@+fl+Z1%m1pi$eM8ZJ0)w{^1o^WVhl8uY4hTD zABiPR;z~@bCn8Qlamtjkq$vNZo`T#1&0|5McvUV%QRT?KP<;SmCC#IB@x2bvg16t^BXrip&WEn$URKTBYiP zkUL|w*i_|z)pL<=@a2EiHe^gFpcXGKW@j^&|5ZB?C1EngqePrqV)4-+tmH$;QM2Lh5ol>(Y%m1pI zkw0OTiRVu)|EpexT>D@CR~Pk9AyeSQmH$~U~(x6Dn|EgCZ|DyP%TcV49r2MbC6I=O*%m1p6Lew-99QvLhdqj^y zsuQm7#+Uz9_afT-`d#xSM$r8^H^dN#%dl zn-DHxF;534tm)~>|El{D>mMlpt3Do)62jKZQbmRkyD7PuuRal>66R7u;ob-@JsJUD zTY?br<$u+uAWA~<#sn0q>{#YI`|`i)(-HiCTmDylCN`2#5Ny9|3@4ZWRiA?mC0JCX z49y_R|EkYNtOOU90V|>WulhpdPq3rZ{Qk`4f7O>DRDuOas_X1e`Cs+r2%f$=P69Z! zG%UH3x%{ts3&JL(I?~G=g%zp|Not}b)>Be%N93UtXUkarSA8|&rZ%2Imj6{>H#ixi zy&s_bulfeWP4FmLXf>|X#8PebuLQ@`^>OXf4(F^1td=5pqF%Y@LM<5o8pB)0Y2L zzmE7>`{x85i1=6mOj^T2{TAY8?PSv6#+Uz9zl)#=DZ2E^kXUbW`Cs)O1RKh{6?0`m z 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

RCo|&v2jhEU ztFfNbzI`5T^(c^4+Iy+KL>)f@`sxMb4(MTLL_a+s%^x85st9*Xo7m!6n!ah>-J8!? z;5mE;N=*B1I4&G$Z+Y>|eHlhAHdwIr8UVepsoB}`7hd1#(E&enT$1ICjhTRxfFRGs zcB#$U5QSRUYWPb>HiY9^4ebYEJbFOeePE~5HjH2~(yN*XH=FjFwwrdE zzBj!WqcFX0`pUH1v;{u-GWXovJ8~b$y(jnH+~;Km`0d`@M{@7MS37g>ho4)beDM}8 z%%gY}ZC}zu)R(9&N-vJok&&4ywLPj|sm0I{%T6Nch{k&aVRUfT zjh;B#JenOneRTO~+i3ad@$geRdLF!*IC{e9+R;k*v}W|w(azDuQGEz=oXSDxJGC&; zFT}i9Gkhvq0_|TL*g+V5Rxr}v#6BA0dPzN6yL48`N5RY#S`vJM*rupgw2-)&)dVfI z%Z>&)!k||=+dILR7~*KCC#GHqEKD6nTpuhJI2Y>Fm9QFG1K>% z1DQkNbrq%Rg%}&w8=0f4dtJDFWm~U7I5_L+Y?(FF00%o@b)zv8rIE?LUx2ZYoPWNh zFT6&0FOU8&A09xBkrm0*u&Pdk)!GQXs+1iBYo-fg0I$ps$BYh#ezd_zhC#C%WkhzO z>@?X~vh!sZ%dU`Zmt8BnQFg2BF4_IEM`TaRo|C;K+bw$=){~EAU&{8$evvF6xv=I8ix4$E1Yb5zdyoD*`+$hk0Q zYtGJ`J98e%c`j#n&YqkvbAHT~<&MbZbI0czbFI0KTyO4@+!eXu++%W2&E1^4HTOpF z0Z-+=lDj8&Z|<*oOkQE0A$zPnmGXLoO6Z1Fc@5sL+{|WHWALswXFboglQwihN%pA#VU`}T)V{T#| zW?p7KWPW5>R?W^}=dfNj$o8@)vKO&C*@xI&?8odc+z3w3m2z%w3D?OT$8F}W;~wO8 zai4O(4=WfpdD!e>-eIl7)(tyz*!E%f4tsIf$HRUfK6d!j;d6%jhaWkd48L&rjl-W9 z{?734M~oOTVMNu41tZ!=^pCi3#LXj~9`XK&Uq_A`IenyKFeeCE!0fjBU)} zW7dz^Jm$7BFOJz;FsxuofukT;a7@7^1@{!ZUhw1C!m;MD-m$C4o<8=vvCoYCY#cjo z$~f1!)^R6{+cxg8aUT}u7EUa56t)x|U%0*SiNcSIn4+mgo}wd*PAj^h=!K$vig5~y zVxeNK;u6IJiamTTe6zF%zR~$i_$KAo_}}20hi%G`@)YHb%3aEzRmG}#s*vhb)lI71 zs^8QGwM)H9eYW~8^}Cup&2-HI&C#06HBV^v78eyCRNPX0YVobbZ%l?@Svt?T~3lP1`!{)dQFVtOu+* z;Iac=nw~Sge0tmTOQyd#BWFg%jP@Cq&3Jic{>-YGoin%2eBC(GXfv)cUT=JV7C)Ls7a#IJaZf~2%nGZD|XTI0`UFr1FmeNZ~Uo9I|<}N$7 z?C!E}Ei)`3%jK3g$_vZu%1*>~~tMaSt zRmWD{U-j$kirKxhZ=LAY{w?Y!_Hi1wewWx3$Agl zCfCKT_uLcQE8W+-_f?lyZ>WB_CckEW&Dk}td$gVw&$XU?hgKfC>CngLkDTwDfARbe zYNywRYwxYgsXMgp+`4z_C)an@-{qBgJ>GM@?>0D;k65YUgTVK&Z0ew4_v%y@pH|Z=Jw{hm#|9~ zF4?i<$EB{N=P&(uS^2UPm%Vn_)Wg;u_RQg$!#fUtATTBn4BU1^{t=6gxbBEQg5KcP z;E&5a%P(ENuf@@FLCcq|^IFeq{X8@$bWZ5g6?0acv*NRrb5@?a^7FPs+BUcCZFjU^ z-2Uy6HAh}?-$&V`)lT|xn#{RM=w13wzXr|cCLMX-Sl;*towAm zd;L`#@;0<=cy#0Vjb!8dn{1o593www`7w_kJMq{Pj{Ug5y8jw7oU9`MInH$4Imi8Q z{G#LUJwbay{|O)dtNLHppE&x&@QJUVbkIpxoSb)Z`^hhyQg+Hkr~Gwl>#5J4W;$*2 zX@8vFa{9CXHvjv=fB${PiZfm~v*OIl&tlH%JnOZy4>|jqbH<*t{+tibtvmP5^9<*m zdfpG`2hM+Hvt{!Y7Yx6k?}9xS)?Rq`MUyT%>!Lp{Zo7E*CH6~hy0qldQ!f4avewIX zT|V#f8?Vq_aoQEXUD?SIb?pw#j?;Ghd3ER2 zd#-7`=J9JQuf6uVlIzaAKIi(r>p$PQZ0AciIB&T7M&pfJZsKn`?Pl4{eK&t`%MrJ{ zcI*6GAHB_b+l{wRzWvfW3hy}ePWhed?%a1*+g*F^Zod2Fdk($l(R&ZN_m2B!-FNl< z6emtSjo?Ty!$y}sv-);B(Tv*XQg-&*t5?{D`*5P#~s z1@CTtujIY0|2^QpH|?p|^T7Mg_n-g3_rcpAwtV>IM?D|?@$m_tjQV8rr}|H?{jBt} z`#*Po{?Zpqzxepe?k|7ed*WAPzq<76XZhkS;j~RpUp*v)@Tkq9^N(H|m+slRu0HN};NP$jQa70U*}8!yo{oWYUyu`uCfizt zyyez@NIj)^9}fx553LKe;TW3I1?bS8u-@vOQyE8i-4TsAMTbZEdonWNT&r zlAR=Ma7TDQD!v4iafvE|5x|3m-d{wNNMJxS6TbW>&1 zcW6J?P0&r$eyN+Rn}QDr;NPk6jDT>{2zS5^?N!#~w6g*z=IDKA_|1;sH6K*Db zk^eJ&a4;crhMy)m2P6U;0-~vzktmU`cO8AmGytW)ojwc$%3V5(Y=o{{S3#48z3}ct z+ruyKc;=60cuFz@Pk!mFx+=klLtAxLddh38zpE88aKT=K**v?v%3!N2_yV7~=;pvB z2HEKT+}Pt4olWO}hkx|VEjlOROp#}Qy6PCIz&pR73NA>&-3K_vrK^{%yRLwRI|!d@ zK9McZyrgS_8w~Ghp!C$g@E!p?={%;tm|jib%J7Z?JXr1MpDH;PDC?)k0{bV54>tlj zI0tjJ?g(8_w_MkvYt@BxD+pIkxC+8m63$AvD#Fbs+(B3C+H~y&Hr*;+kUr)k+`)u{ z!UY$R;ST{ZKIrS8b~p^gA~?#|b+kJSS?EB)T>3^=cvTP0E-1K0i%LPY%E9^!y9Qk&Ym6w;BDy_oPB>@q*?ZNP(V9&z#9{R*^QG0Kj z50dU36gN;XP1=&c5vcbyhI$~2PLKKddcg{)%Lx?dMRN(I5v@QS?T5dst7CaE>=9cP z9=u5(l!ugTA?H z!hKD+?+N!4877A}hUL;(#lsiH!}FqGXRoWZ9s1r=8(i1b*9%E`=##Il>*)I6n)a2# zGdB8G^jBLr1iGPbc{+Q#@#%x`R$*Oebys*Dq?fzfoT24?D_7E|5i_ZZQjRP<41n(@ zqP#wMbk)1CJ#_Rk`cI5k6s4)R9SGV(J@i4eATDJSm35(Rn{4`Zx{Gud>n_nY6(|IxO&2Q3D-cl1=s1e>#ox6&|R&&Mt805I^FfU zow^$c2a}?Oa2OU2=}<|8QJvhx+io` z>Yma)O}K@GTSU0Uglpa|J689c?s?sR`X>`^3E`F!ZW&I5?r^AwK0WJP>1*lg4msMo zx_YSPmcY}^URSVZoxjV|3FZfWVF4A!L7#dqMY-tHb39{!zxiM`z%w}U;DG`x#2)Nz zX`_ZgA4DQIr1m>oU(>y&dtLX2?oHiW;H}@*y;D#lTdMo7ZclTtv!xB5gLkfMMo51s zyt;Wc1#tv>LQCi)yH=EP34V;C5H3i#!?=DK;ou?j@>c=z1Ko$Zk8~fym8=tVpTfZg zI7Z#k-qPOdZ13sr2u98bEC#);rmLr)W^f1>pa_RAh1ORFAUD&~6&4n-FLYl5gtRk4 zM}T{)ZZBQYQh%86eoO=OA(;TZPxo!0K$ip^r^v0k?`RtXP>JLJgAN|zU#u`KwQfdlnxWV>LFkx>eJ!~>Q4H-4A zP=rP!p;;Y@Sh^6zrUrnMFfF}cA?RyB+KCc?h&QLwM*T4r1tSLiC?R}^s8L^_S3>Bf zAFCe+nTR62LJ#5EYQl9Au8VNpggc6G;T;7w`lBz_m*};0g%|$gdI)zS;ZC9oG(h{{ z*rKYkclEk)*5WD)v9=(hl%z4#0+TV3iY~NLs_Jl8U$=c7A`}Xj1Yn4w55b}9G-{M` zM4|zJ?~OHH)B-U^u)8OYS5U~5f~uPe#_6Z(r|A#SPuI`T&(s_Bv-Ah*O?tDwR9~jI z=*#sL`bs^7J}`Ou2)BlCM-y%>;nopuJ>fPGZX@9~5$+hm9ZR@=!V$v30)9N3eF1Y`M7yTSATb0#P3RhB`F=}hM8_3{Zirs9fG+N5x;!KqbZeCWF+N&%k z_)})Dj8T_XRG8hRa0juuBZ9GD}&x4K7StD;IT#yXbk67?;Img(Gjy z3ZvU>fqR1R2X3Fh?HXsP)eINltmRI7X^gtuSx#>_RvF=LAzUo6IqXKO-3j;a%noaX z$ywoqdpr=RQJ>tqZg%U+&Hz12HM^&!Ewnl`yFS!g14n=i5g}%qV!+wl>WNX8o6D=< z?jPJ{w8Nb}i`@lR3GG!NmD_5mbiySim$NKJ4Od~DPOIB)tZ=~f9*fBaw_z+5a5<*j z;;OJ)?PiC)Dn?ypHrdRT^om+#IsD^vL(u9jw;18FW2K`Cu5vmZ?ih78mxyB2r4aR+ ztIFUa4!ynzw_)LWAKaian&F0++h($wT_%aKShBcRB*BKeb>(GXT2}aQCgu5gSPH*kFc% zEZVTaG}B2!k%X zd(;lLh+YF6i_&SYjyg2z)!{RGgd_q7?v;Ag#=g!@SjFvd_-|DY-R?;I55#P=;RvM% z5TI=ue?-tkC%jVM0kMp}4HCge>Q@o&Y{H#GxN`}2-gfF8J|qBt6wgrJRyrT;?Zc*$djDqCtTvoZFC1eejw^)M9;bJVF zfYfi)A151k6?F9&=xV|7?go5_<6W`X7$*m~<>6rjY(<-7Hp^%uxS=r7b?BwMP#M1QINGClb9g2XFchsV|? zdU*{gRzo-tdmBPs552VJT_N(uKBIxz6@vt}R zwcLa<5pD~~0|VT;q}ww?xvq3CQj ztmq0GB11U0@YuhFKNx)KAJso5qyyrV80!ceuoZR&c#wFj{&Ct5nm)*iKF-YHaB`w& zt0>6&9cXWlrU11>@gF$t5(gBW)CY@)Z-^5AQvI>(q;3BCTN}6Tp1u0XHeVvfA8w+HR zt`!0>Xe30vE4(MV9XyyPoI-?8;;1P=J2i3oN!Rp1jA+Sal$=8bv*_I6E)@!hoBoY0~y<*M;9DnEWDkdn|6BM z69$7izzmepK`WAWp6+I7LlNl>oMAYe`Zo+C+@o6zBMA2xb*)q?Tn~F}al~T`1wx&a zIJ+*bG{cHb?OFsaGVn1_CE=dzcZnZq48?J!Rt!4BM7r25G#Cuy^*^J|VEg_IXmPt? z65Xd6rV{R1x^RQhK1X#%9lARRW&@k+p5C5hE2Wm;!=N$wGs%2RmfL7JFebN&aL>o& zE;Cr-<*qc$g+Rn$HB=d98xDej2iadB+>3;JiEuAtKOWd&IK(gyN8e$9Y~3!x;RK{} z@Lj^aM>|6YN3?rfj|3~A*|X@_$9--OfolszJ0_6RO{HM_;vy0yh?)WQ#6AZW8tO|@ znm9c34RurlwS;?Ri=m!yuVylbMuQ)6)CM2nc5g8>5$?7AX$fcR4b6tbVRQ{k3`-5m z42Kc!b;7+txHk#+7JUvu*{(nNCFjEU{DH0?zNp^8}Uy_XwCA$d;wph?WAUFib!QI`17Hffefl_yO zcXu}`zweyMY<5Eew9k9}umANtpZDq8%$)n2`<(IFIilLfqT1)&gAmoe6xF^mhsM7g z1LjFBy`F2n79VuWz^=@Wh+SsGcZzDC6i0Ac@#)3-c3;E+v%UL8wa<#VFK6DA%T7(0 zB=7Or1s;hoe=$^2;Bisyi_%PXgg&jS);C&^Qwh)2RY?TvUe zf?dn^qS_DgB0SQ6Hf7$=_21OC%izAQ`9!GUC6?+lW%RJI3AuR_?5sQ;@f^tLxY4*XuXvHS`fw4_^Wel)=3HIZ4Lwqi(xZiX ztx%aafMXRGoY6uXBeW$#TO+jHLc7)M{fOAy5kscrO-?s|p)<+6gbY60G*3&|j;+ke zt4pq8#t$D-!0|rJY?XCAmRn%v!h9-X{yS@FjwM;v?|!WR-!oUCy1qOHo5Jc6nyDR!52*L#{p^bqRx#kxzVHxxDWrf`vC|J|)8GN|-8 zJzh@`Y7L>@DAbz!^xkw)vQTT89Wu%sRE>h7%F9F#550H}AfEx+zhmKH1)FQ|vL!cK z%l`ZL+_S*eNlOtsLW?#nH6%SsLXd>S0B`;hv{L4J}WFr zpDol#QJF8b?iOm4sPene2AUmLTkeb7$Y0;tKdG`BFL&~~FcUvdsL@5vm%{cavy|D& zmHI+`QCL{mexW*r>JXI|i7LOzhxJblnsLUi-*SC5zrzc=DeSOLRrn<1-9l}+PhS&u zTwf>DMjY9N+SnYh)*NQKd3*XKde8Z zKdL{bKdwKaKdC>ZKh3*_&+5q@9OXA z@9Q7vAL<|JAM2m!pX#6KpX*=fU+Q1!U+drK-|FA#-|IiWsEk)7-Nk* zW1KPG$Tub!6O966k}=tsVoWur8Pkm!#!O?DQE1FI<`{F0B17;l=X_&JYzg-JZC&_ykNX&ykxv=ykfj+yk@*E z)Mi3$F4Pu6Z7I}NLTxS7HbQMH)OJE`FVqe~WiQ`JsO;st2(_zFy9u?sP}y(y6e|1e zUP6r#YOGM*LX8t@yinO)CknN`lEw%@k^uQ2Pos zTc|lg?I+a!LLDGfcBO-a>J#cTsdv3U!1~M+$Y6P)7@Oj8Ml4HBYGH zggRcR`9hr_)QLhZ5b7kMP8RAEp-vU*G@(ux>I|XI6zVLY77CT!(Hx=96>5=Cg;3eU z%opkcp)M5aBB3r8>Jp(Y73wmfE*I(wp{^9_Dxt0x>KdW06)L-s^+Mes)Qv*jB-G79 zW#iu})NMlDF4P@D-6_;vLSM5b#D%9JAdb?2X5bB*my-TQf3-unMo)+pEp`I1$y+S=F)cb^b zzfd0#>VrakNT?4B^%0>yD%8h>`nXV^5bBdceM+cL3-uYHJ}cDcg!;TtUl8hxLVZc7 zFAMb*p}s2A*M$1IP~Q;hn?ij{sBa7P9ihG})c1t?zED39>W4!8NT?qR^%J3fD%8(} z`ngcQ5bBpg{Yt1`3-ueJek;`Pg!;Wue-P@ALj6goKMVC2q5dk=--Pd7=I( z)W3xKw^08Pnj*9ip;Z!EsL(14t%}gD5L#8CRTG*jG+sf!QfOBR?P{T2BeZLU7ACan zLc30A*9+|iq16!DjY6v_v|2)|Ewnm93l~~lq16*weW5iFT7=Map>e#86k3$fIAL%I z%_+2oLTedfkgw|eY9fa0VXq|-CS!i8^ z)>UZTgw|bXJ%rX%XfC1k5?YMVVuj`wTAa}0g_a<+M4|N-T9VL`g_a_;RH3B_EnR4R zgq9&RkI=kA%M@Cc(E183TWC2#>&N+h$v1BeUh#UAi--_;^e_3`!KA`Mo?Rt+6Vp;% z$v(cP;IWr}PcB{Kf~7NJ68y`2D3_^Ob{UE>=g+W9`a~`jdBIYd>FH@1UN>K0Pj-3Z z(lS!~Wg_m7}IjIt3eXhV7SX1&jLwI8;ce2?SkH_uxrMqI1m|Y|_F^=h!eCFu~ z(^1DIX4^HgX5DM*U(21+i)xgv>+vO~vPxQPCbMAoVvdnyx4kOYg(Q*2lmxVA+fHSA zI3mXSGTffD%#0YfzcD|{HCp-CV78~SixQ45pab|yvzPg2d|p?)e|>AZye1c2-)x@S z8Lj6gyR$Ymk3ufZ(G@L{(dSc!I!{`1mwmSmywpjcu!1b z6S78sP+wZ}wlyzXocROy#2A;k4`Es~ubUsw^G~kyL|N1Q)!((&>}L%t zSdw|I%XL`_TjN4v`scs)rz>)gI6jyxdxU;4*iwIhtsh*P4a#EO( z*O#1Tb)Vf-YmzcYMT@7WdAy7d_HiDDs=X3#@{;g6K`Yt&v!F!wyvTw*hN{BaYY9$XCDo?fhu>_jBrN1 z$3NVx3AdUBt>Zrwus_d;cbkVg9-1V^P;pmEV(F%lA*&u-FHcfpx_vmX>y;^&s}~d_ zCM`Y3m!9DAxY<)Ny6t7H*{`C4mX!oQ!f72E|Wu9!4WcE#&(-$Ndn z1Gji@*2SV&(?JD~^S-_R`ku zKG&C)PF+&deCdh)@_2oPhTd4ZgxM+|2SYCh7`vD~av?|QLS_zqeG|P27de&NCs(Rb zx)K{TXRSVSZgsohgL0W0N|%u*wLwj=X1l2yu!uK-?qfuG)6$ZIj_}sxH37pj%~~`z zXenzdnt_QU8Iu1@HJ0K^H?`9;WK?M>8E*f0 zh|6G@^-ar23Le?_%2kYVSFujVbAngkmLntN;wzYkRDaVRk}CuZX`05q(p<*pahun4 zT(t!(|EOF(Aa5SGImI!lu!gkH%~h-26FmE;HUWKX_e4-1KP{K4UD`+wJz6rh0?!Gb zD_hmfRDb@;+n!!5Tdp~$wRsMo96ZKek;?@%i4+73v-F_B^}1ZRNr-vXmN$B)e9x$` z&^%E~PV8r1VsNl01e;GrT5#9ACD)7&N$2IoAtU7;**rtfA>GMtd1WgPSmsFf_s+X= zo#uh-#ALY5Y$vA1rO6W=dMQSp;&W-td8RAFe`f!IT)9r*%JM9UVAcW4?xv6Bf)RlW zy0hIenO;{fE|mP24))@o$;IncusB^@dPN`krChd2;IgGPr}xYqvUR=4{Q>r3{>$sg zZ{(VK;F|tUNl%J5O9|?j?=P%X=|)xN(D;*FHYhWtwF=yo{3;g=%75vC)((sImYj2Q zZ4@-F|Bx$32DTtz4@7Zj-Ubk`m$QOd=_S-nznL0Qs~QK52; zpfp$mBgGXo=%cQX3kD64(w3Cg%Pv=yi#q}vZVqj8yI^5?WcK(H;yBH8d0qBOSIL!} zfh*a2WBVK~E-jfe7r8&O*Sc1&WdyEO+5~(3fF6yyPOcEN721~&CFe&xBu(`u#wGf9 z+)*{;It>DY*y~()<`-2ytEZ2%IvsURgTh7rZs+nBJD6@_=KFT{>MYWVG zM3z~>K6I8BqK#amL76o&-2KWezr9?#Yni3}H=MZfmdU*>&O`%3`8=7uthvb30`8_o zbt<jh`qI=2p>XuoLUN0G& z>{9HZ<(7+<9WHW!TqHn(Tq`2P!w*p9!PC4G=kp}Sb90OB)tfA*!}hl$$*#|Zi(4DG z*FH{0rOHLgRym8N%Ck%JoW9&BedMaO%Ud<@+C0iDm#b5{9QPaC$!Y2GE|1skO0jd( zS1zcRE?9COn;W_8mN>uQ+{~Nkzaoj^IRd)`Myp+S>!4Jco4_Md)Ihm(!_uYMjb$a8 zw*{?zvw4$~oTj^Dg7$xdFhaQ$WOPC&*P&; zSFmDYsu|FKLhm2+{)l;UMg4+^Rsy}|ZPK9J<;&$8Ua-8!dR$_*%U?rQwi{MZK^Pf; z(~`uv964dMz5Eopd{juu`#si3FS)R$x8!gPKAVY}E?21^v`Wb$@-#8qJz%j&*inFD@>%xF<8N^b|2_LB-WKN2Rsbvddm97uGATiaePt zJ#;UV%O_c1H{++b<3~m`i*OAeZvJv8!ZXDDjquFe0`3(hb7R5BBR9q*9{}PJm6y}` z3~p1TdR+`8E;LCg6S4NSYqC<7+%>pl^W)9 zUDTR?QB*eHBhQl8NAiYY26xse&p)cy%c446R;@~QEplHGV>XXF({`0M$#Pm>q8#(# zjd?P`1vr;Ku7JDFQCnpJ-7cd5|0XW8#EHGx=Yh8>qjt!$di3VLhrMi>Z*8K+~yOBp_QO-*wDLFYS#h2_&v)8&= zuGR7qYnc_uaGR$FB`2cx>L=yuZ7ySVdW4%SDQrl+xb*fv9FMw9meBnYC0H9}S~>^P z#D3QHNKWOkFYr>~PFYyfOB80dCXRbiT=M&$R7Bk)S8aD0t9lbSQpS2*ab`BCOKESO zm1SINQB%k~z9e;S=+mwJ;`PIA!xCdU)tyo}+T+X8sF16EDd1n+Nwv@cJd2sLPY$ zOLFIMYcSSc`DM9snGOwJImTxm&obGeo1;oTzPHzYO|ISOVxeQ$tq|6e!?DkPHzVpz zxnARot(TZ8uUR>V47hC^^^RPz!^KvVcW31tYI~P!U7?k}YY_FmETzoG7~JTRjBz|- z_n7X##ToUHT(!*Mquf>HMC5~$nkM+&;Q&k>eEY?#x)xoH5&uxMJ4xw zV@ocBd>%#t5$xXhLYCI{V#z5j#4L{!r!seOzLrH?v_s2X@4HKfF3G5T^MKonaha*X zXB$7tBFb#g_ONz%&J$yrG_lVNW3sa=-lYDK1+cwz)?s>5Z85bZ)`KxH){4p7=#qk)>476%~|{!5vq-7S-hXealZO>syaH&8Mo? znR2pu@{!5`Sl$6McXifVFY-pV|7xq`Mzh`F(O1eS@s}ILy1Qn+>*A5OqU{4*$xhj> z`!%xE3O4Wy>t2$_l3REFvrfCT>aw)dN${nL9(fE;VH_ zJu56GP0shh>@dw@tfNjzZFnlic)4JZ)RD!NIhY3w_@Lsfj+VP-SzPd)hv<5;tS*;V zHLI+^%5mOmH!?z&ROYnx;q7Xl66b2TV&Hx zJn zaN(JJMu3k@ao3|)?kIlG!Y|-2xH#o?NAn#QO6}!NaAhSDv-CQZ!<9SUf7u(|R0iqy ze;gz=GdbC1y%J!zriBbtW<>QJQefVqi%8EmzhITiPQ%QWxzUo41YRmIFBg;LzhH0d z-)36NvdZkjE>c#yJJ!X`F#kAeC)Y1Cj>=!(D{oJg>_+5WDR)LjT86(W9c58vMnFkX zlh~uU^710`N>2Cu`$XA5c|F1zL%NsSTRwAp=HW9Z1Eq(Z=q|GGgy7DpxNv{&ViMfE zKFiBI<_o3f#X`^>&*<*5*fO^|E~8jiFCI29e9iL=%8b3>FdyxbB`02Pg{_TUW+OH& zMqaa87g^>doB5F39z3zK-0}y{#k1^AN$0hcUTLxRP2A}Ce^*C;Qsa0jSe}}@V$9bG zxZh)*FqhV`w=B2J9_2E!%6VR_|7KBiiY%qqf5>1j-kUIM6@1SxI$ahR_a6$hTUbt^ z9$DzWADHdi`n+krHm!O7>@BC*tpD72^R%y=0&`@6G5?|Q@&vz}5(mf%QuJf-5DD{jUm`^^1qIfW0Eg-yTyI(Qp~eOv;Mx&8aOiL%H(|GG%4j&{L3k>uF!6{kSZ8wk+(wY`6BMgmva^SFY%P%4E8E*MNhFb;F0pUH(kYm*u8i?g$8Iw8zaI z=(J?>PN$ofMclp=w>Ke;bHIRO-y&K1WgkcV{Zz6S;7!jAfA=hvWnK3053H&6AmGAb zv_ckH=33~odfYr=uwM{~UM-8c?5!xUX50g0x0ja5#i_jqym05YPL}^)24*@>PEuU* z*G=|7+9(Sfbh#aFc8PUP%4KxPtG7IfwFi{BRr*ht&1a~=XRBLeurg=+6(=|#n4Jy# z&W?QSXTHv7-deaY&~_Q9_rGbCJPkDKZ=Jo$TWRLm0^47z*M1c{dY3HtviD#CeVb|C z=H%HpKNHL1nR1!SlVVx!Wshe6mch&4)-S*0JALL^ynj>PFN-X5Nq+HU%N%5;CZ+N# z3L0(>7JqSvWO4uHT!y>#ZeG%rH%827c=pgc@}DaxFInxOU>A2>7WeOWE}5yaIC{kY zpfmb}EbFp&*8$xj%Q9ayW%pNlnS1O1RyTg4l<7~~9sgU}uBUD8h5-LkkcPk;i3 zNx;2DIXtr5*<2#B56SSqJ|2DM5>+Z&24Bx5JMykvR$_)XlT*l8u0QQ6os-3txlMMF zDscmeQ$_P_6Lt&c(?|2IT>rp*K$ceVxR90e_n>)N>#vi)FuP_CUrx>ZW${BQ-i7fO zXAf9^%^s7bm46?=ysRvnwhSJX@Fq7;z4(2AD>=uL=r8I?SyaV`uChgWN{=)tJW;pX z_lzv2;*C5wSJr7?VygAC+O)VhUX4wQvtB8-OMG6ISmxICMf#Ha*DbS4-`w*z@FiJJ z#iw}X+!3@c>=QZB_nL3t$MBHL#oeybmj|L>m4#M(9a&MKzSvCb7mNP09Gp@s&hH#aflL4|OhYn)yth(-hui^p-whihlb))>;;CU$R|zTJhfhQtN3qMJ$4GdmBm+l?hsU6e`ZT= zEAzga^^#7|2>wA9S@Fec`9+#HemUbYf5~kZYuE8-SzyH{BS8fQoHfaIn?J$y@h?j+ zQ+|`hWmb587f@UTpSFtNCcgbZNbVJ6vAjTL-DHrz8TBOad&z*u!O`bsjEw&+hW|94 z3wU17GV|g;m;C$xA^>;x&7WDsnz!+N?0f?rGB`qHfXmtsm768=ogHpuB*t>oi80?C z;ow;MIK)v|7T+q(<0^S4f=nfDUy zV(M1ZRI7<*N1NXRGvC1VKiu%QS8n6X*%l|SLG2(T~W7iH4Ed#{;w*WFH96il_e!xR{M?+a?r~g)He2jgQ)6qnh zV}AF(%m#Tm*`*vGClB(MMyWCO(bLgfmYMqB%H+O$FY}#P>&KTDob)(a$->JS`ThzA z97-Ufw^lpY1u?$^v69Qrk-w$o9!ukH5qYvcz)sOqX9p>-@>SBNuq<)X`a% zUe4a+@=KTR#g@Jg=;$VkO!!|?P;yNkcvj}*t%q9&7-fpF>P;5G5>p2OAhQY zY5d;7E;ddUD?fuAd|dJ;)x*d13z&iAf+59^Br`M2pR&s*K<2fcEV=YRl_<+jyhwI0 zT{iFOaX*IBk<$179m%rX?Ek4;-u*SJ?>2vvz$;khV_-Kgs+*54?9`;mFrNRjFnkpw zy)VCl^*;!8WXK5V|7Q_WlFVNt**^+$WXj_Ix4sR`6BqUV-DkEe`(m5=rTaFpY|imx z((NbDj{dUri|t7NUFliusqGh99D`)x;hB6Xxf!2sHD3|oa}(a=3tl;P43SIL2wpNZ zfv*Gjzxd@CE|;l&!7_Y5fLlf8$Dx>s(lLU`G8`j?#zRs28)XjbF`ItDn*4&(T#++D zKCjBpb}se>&47tF9OE7N4R$ytItqj~Txf&Mi83^w(1!WKTKGTO9Q0XJYfg;j{%;^ z&Jy65?^wXMa$~c+_IFb4FLdp7EHvknDDO{p`M$6YR{gEdo$?`cbJiu#lnE2^3nn+W zK6q*u+dOC)s~tqE)L_t(kAKb!-2Z`W>qrYxtzDW3|x67CY7o zEwAX`ewEj;(XrY8RbIyyp^fu@8Qrnnv6~O_I(9gAI(7+dywLK6HesJ*k22S>S7;MS zsTL^Z0MkjiPGd|Np+n8&&!}-r;=OJl5S@ zUi>k;NXe(g&F==6eEin&h~qK7!5;p+sJgM(@wm_mi#WeCx8bMEv^_1f*+tHm&2b)H ztjrGI8@^BJAC?e4v+g8Obxn~{O;nvNs@@g2UB2RYmF@C%#~VUhD6}HEUCtF68$?AD z*!Z_dIX6e{aB~`zfC+3IZ!0tQI^J=-D>Nar`K6oZUCeHB%^2)dQ*N`=-P&f&_I_u!_j{o&F1y{d>BM%^p+m>g?dE64uMGOImZI{yV#jYn zTUzq{UB`L8Gw=A*@t4rp09TfNfZeG$E0^=db7vJrck%(t<$Up6TT$fBp|7kBJhJDK zj)5OKcV6WTE3bg+VJ_$OLR)2iVP0EpZcXOw9rpLUtxu*89UN3rEoV4isCU*jH+#1E zv3s3$oqPgwozT`7H5@2E0iK>eiC?wlk2iX-X30Qt8qR2Qy-2>mt?@O}>-RbxPCkyg zQE1zW8s@mnSvkk^0e*Y&CQfG4xM1sdwp8Xi`C{fKbL-zyGSr;yI9xdScIM`QjCFE$ zwk80OqtV&TT!hbPZe=PK+Yc9d3H+NlfSU7W>gP88Z+0WVEIlwtkXnTZKEHw6Y`}RA1&cR_1Ifn{u zzt9ewgHk)noC?XgBjgOYIT@ozj*|b>&-xm={OGzhqmDgGuK#=Mc7{hg$D85CILA8k zoa2OcKxhYrc1UP9?dRk4bLIS&e2hNYp4T!wYe>Opb1ENZE6$xJKa!s@WSTY83tx8& z{;NHwq&YV#AFdDjqgW3I#19OApx1IA=I#vB@~ueI6-R=29t+ zG}YN1P0G(Jna;#)vfZ>I=RB6Sra5rV7uvCs4a~WS4a~XNxkPBkg~qc$dxit&a_8#u zwvRPzV2tdW%?<39BDX)`kv&E5R65L$)S6H*dfX7Et&pGF z5BQVNPBRCXcAL=deZ_gyd5jpxoi{sgA)>2=(F(Vys!LO{?ycrby{d=g?4+u{@i)H^A7Vo%XzoZ?hzWZOIhbx zcU#-#X>;>9BeXmHyJhD&>#XUne{t3n)I8_oH1L$Nz?{ccXlKl7oi$Ia*hxE|F~i+N zPKuoJOw0L#^F?dcB>zDqXddz4UfAn=$vpcqCt13j#jOahIA68qE4|bzd!4VDrJJ+v zU24%6!f&B5Z-k#rt6q8YP`2<%lUufYDWp)gdC23D7$;hkEsriPEfZ_nV*YX9Nef!J5uI zos&uP&{8s>%wcLx)&AnOVb!m@{)VimVdf;Z+0#aw6TI^=->@4d_@}ujom#F)4XadC zjo*EEI=5=y;f0#DYS-y!tvQ|<39_w!G^bvupXw={5h63uJ>HyIV7Pzk!o9V_vr|3R zeT5h6)xWlZ9@#h5(|m01j7k0Y-;%r)M-*LIY!qEvbp4Cbj%%F_8!=sDs>d^ot#Z6I zG%_<2xy546T}P{f|K#C!-9=XwU0rky)BCn*)2>Zyo7S#oo!WMAHEY>6u2r)*W@&8} z=jz3rrtR9sxH`rSm}O?SDd}z7ayCtC)_hQKiF=!czu2zs~4ZF6dt5*y^Du_== z?46XHlA4y@C&T0QWcAI?>DPb2z=3ukS#3JVJ9@G?txk3N->N}I?j(*Mxdn6@8*Z-x zrfgxc#7V@-O7&zWCdSguiIdEUK9~a~)e|?mU=p*YOq!6-?;Q&Ia~Ihhb=GVaVg6FB zoKE7;p2;)va#My(8p}nO9n-&cCdOJ};|nIpIMg6<_;i1EQm2d?np;p5QWRQrMK!gk zl3G-?sB)1Oc5P9Wq8q}L>Q`)1swvf#I!dI{OlhrjP|}o4Wg1t7Yn6k_A?2L%i1M`Z zit@Gct@6F{qjEk(3Ar-lhLCn49Yb6p2_fkr{X+(Z_(Fz+3=7E($qQK=vLj?y$exhB zA&-Z=67puq7a?DV{8TBdQtL`>E48oGv68paxJm_;M5P6lmR8zSX=|mMD&14*%}SqF z`aZNuXjo{i&<3FmL%W2=hxQ8{5n33!ICM?u?$F}UeW3?J4~8BJJsf%@^jPT4p(jF5 zh29o=N9bMh=%rK&vHn*XRPw(i{}XyzR9$spk3a8x$N6ric?T!A$Xv4;YQsPiv_ofb z;#lKBJdRiJ4nD_s_!+Ussi*d-uL`=dIEWt9Y zz-p|+Mr^@$>_Rd2;U2t-k8oa5YBont3uoBGwJ zowZltP0)_o-{Lor%Q~UB3iL^xaMVKs>;Y}4LmTSQhB~w%ye(XaMH~`Aox)Qb?frRrhVYi}Q+7uQIAa#g$-;)T@sO5T{-gnt^dwuN!)x7id>K+Es5T#$r4s zfOgfJkA+x_rC6>g^~qcP8lcSj(Qu+MnxZ+nfb#28etp_j|19YD`qaHX{av5_uKzly zfBlc}2|mLY_zK@BN(1WOpcOJfzc!eSBFw`Ati&cT{u*opd1}D;Z9xAu*o&jM3&d_f z-W!nj2IQ{+W3T~rY48+Y!22L>gD>$l*zOwq4#r3Xb%?kIVYnW&If8zRAde9aG(=;p z2Jx8+PKh{#!ytYH{U31$s7J&-ID>m}AKqpTFUFuw?({gMAp>48#&sV?VGQy>pXl_7 zPM_#=K@RjqSORjv#5{_=7K|C@$We6aq2I>tW(e3u47L$tBp9#8Sd2qHCSnq%fbnb0 zz$}n&gE)o&W58ex7>mIeFqVUu1~Cm{8pJdim?ym#-L6HxiQF%L2is& za1yuTcHD`(aT@fSaSr$6K|G8{@i?Bu(|8uo<3+rTSMfUD1o<`I#ryaWALCPejxX^w zzQyJ!PBkEAYPbb3roGWRXk&CV zoXAHZ=79Lo^Y9qRcQoT5nsE?K&K<1dXbE!RXp8n>JqPu4EXPVvR|o4j=oiN)_zd)o zliWFbfqXgRkO11`+zr~{+=m1B9Q2*@H~azmuOaI-OhX@#+lHCgfx|co+THLLuwJ83 zR6$j!7=Y0r=Z(gJwl-p%HF^S!twzt_IYnt)3*@6Q`Dok-O;CWj5SWjJcp7iuEieWf zzsD&EW2H$O(8eYm&T?YI+ngLRr;1;%{yFkA{xo1ht3uk|!6z#=RG{m}Y3P_Ne1tM&W%P*K{@mNwL@4fSe6pS9@%+S6twR%0#J z<5hfwPw*MOP?WZ`sV((tOTF60A`Xw@CAJF zw58p9_!{5hd;F*t`hA9uJDjEfGZ6{RD~cVtX-WK49t0XKqi)RA$~k#W(HanW%C?!be17__tFqhRnomG_XSKxZoKuy#J%XcS#-N|2f^4FdGb-xGX ztvhw>P93{b#~!s14JR6*2?{V50`svD=CW_#Exd#G6s0HQs%HmuLKo1^o(r%RQ zY{uL80$<@9e5WX`wjdua^5JqL9<1jg7cTPeBL6P(?_xdIulOD3@t30XV!d9eNJj>| zAdkHc<0y{f7O;FwHE6gB*MMbXhF}||yJBfqEbWS=Zn3xF4iG!`UfhQV@i2%V zOZ?c6K)hJ;75gI?AF<@YT?tiC6)LEUo3^>>J2zv}O?})OuoJ{|@52Gyj5|S0H)F?r z7Uyt3p23TF8LxppbH9rZKt0^VcmJ#?am0?h62yzEjvG)D5r{-IoM?=uNJKsu4{@hJ z+&J1BN6a|d8}}558Ap5LUdNjtb{w(ezQXq)b{uVwqd(*RQj~ZF)FYnw@x+hULA>~8 zXo)sxj~?iSSj2(4#3x}CR)PA&KM(pjo|y6P;RAe$pFqs`-|z?69^?O3lmyzI5Qghe z19ear4M05-h@U|Ggq|Q?LNd~jflLg-5DY^us7t~aEC%B?f%+uS-wE_{0x=W*QIy0G zXt*9XqBe+`NX$fHCX)9=@}Afl9nc9~;X({(dtw6mq8~{Mo0*v9r zwP4&Nz65g7o4)QH0b=%cpdnhJGl2QZ|c#T_`QkW zn{B2y@p`YrMr^@$?8hM-0r}~D0;ljSepZwua*@;#v^9x%N%0`>N#r|;cu51{!w``3 zB;qEG$3)D*e9-PB+MTo#)FFvFByGSx9K@|SgL8NQ592XB5Au@q3SPsTU>qeeUXsaC zGWAI&W^x|#QGm&q4cePb%w%$%OsF>%`lQUmau73RE!JZP4uF^`hjA3-JLMM8 z_LTeaARfV!cpA@vdZZ9Ph4?AogLo-_DN3q>P+Wm)aUE{Jji4^6;h^7A*&b4Hkd<*K4M*KA5r-gxdX?4N&l4c+p z&Cv>N&<@lkjWL|YHj+mFq*0%=`|vo3nf5H6#~b(%#7raKX`kaud=1*3_K%{ZhoCZ4 zT#0KyJ<^Gv9tGm26Dz$NdLjmKpwj6X@Pch7JqP_U9lP)V$aOkxO($OZclZJ46{QdH z`jG2B)u7=j5Vub_B0#(Q(C$8s(G)E}J^B#85Apk?gLr)gz=xs8#du7_BuoKy=`$0X zaTe5vDk~YZHG`NL*P=S=AQHsPaH0{Kpc!a;Mi00Ui$o+L71Sex_!-2{$OrKJR@{NN6vab*JmlKb5XAH}M@w`y&G(+-g9^WPvRLohZjIyyszRXMaiUp zGO17IK#Tw}GxIPW(@+FrW|HsBMOcDmpzWDEunWaFh?{T})FYGlnZ(b03dGBN4R7Kd zypJ#NHNM67FzfP*qGVkU`X`I}WEEl|h?%tom^dK0J&^ z@dT(x7V)#*197v=Sij>>{G%v+E8$99gD_l&8mNi3=!ZEV*L`VgU*h#WhMRFGh}V}~ z_k9SD;4u)l@2hwVw7W0u?)wQo!7K)jp| zU|Y@UhMq`7GE$Ka>XMU*0&D^G$$1kWftWd8;4A!$zZHd4D*ecJzsk4*)j-?(F&6vP zMFT{^fkvPn{fOVM2Z-B`SpBlmAA>LiV=xZ+n25=kiuJe~Z-ZR-r>*^o*Z)dfjT=F{ z{^YuUB%@#qce(VzJJM}c_#iPwJ`W@0uLVJVhlCDwrbRR3G> zGJaQ-0rd3%;trs#1Bf|*m;+jam;;D8fc6e>AqK=Akb%CS(*_Ix?H(`;BS1X{5Ptyi z2P_8h2GI5ao3Ir-Z~!;q2#$fe3^<8r@ROnpq&@@b>w&a&ATbBVApw2R55yek191lq z2XO~Z!gLUKAnhK=zGC14P=|rEf8Z8u2XO}yYv66T6ZhaO9>L>y5{%n{&*24pt0;pQ z6N5S-8^jz$%t0eD8U>gIVh)-Mf%#a7b=VBrJ&1M>D#kt>1oaq1{6S|x+(E<|M1Kr= z4R7Kdd4>LZ?S36_C;`-tb;g+17d{UEOIR@?>J z?W5hk2k;Oc1@-U|-$#7kXCR)B{_y>ZKk%2L488&?7`KBNw}Yw6;Oo!=Y!8E}&)_Yf zt%Hd<_z(``6i$PfgU{i9Jcx%u+Xugj*YOtK$A|a?)MGI52mh%kLx?+sSVQQKA+->W z`f#E#nxZ*cp$*b8729w(XzLK-4S5Vt;6)H`2)Q2e9zMWFAnuSK@f&FO5ZXPo5-OuA zsK-#^53L8{4kgx5`eSG(bVUy&APFf*Lk7HQpW{oA@1bVAe-vd{ z2trW>#2t16YJ+wUqus+I5sikR9>a(~jQGP6LA+t~$FOYl#~_Tv7>vUNOu`hb!(AX3 z!_F(paN0SXc*8YZ1@b+dc*Au>!3p9GC*Q;A_u(DU1+;lM?Hx{ghZBEzU*uo_h(DaT z!-+e5HWpziR$w)#!|?6c1;*^~y*PkFcnDu8O71mi26CNCTXSh^Zg<3kzRo3PE;-K4 z0`1Q2hmpv`c#!*C#zXFO%mVeuC4MgPb9aDvxi{e`ZpKO6gR@}F=H3tLlKTkgw-Jnk z5!7cyGRXA^VvgvKff#{&5OV~19zmW*Ov4P&_7Tgm5^Jy#jENE3Ks`nfe+2PIoCfhm zJc=jqG@irjcnj}Ser&H$Xi`5q}i%N1a!c(Zm~F6&kKa z7;2*~>LUWwWpp%pVHBv(=%b*mqlr2C9-P6$cm~8A{Q_RXD|ijGee@Uj3g6-<{DR*> zJ;o4!4DrX*0rAE-&jN36T#3ByE!1gfaIGzG+9Yee^Z{lry0^*JN0mK~h zD~LJ9jQO{sjHT^ki9NO^X!BUwJXQzs$1*0yHbFCV1#!owqA&V^@j7-esKeMif_Qnv%OhSMZOywDwLrW)+MGv@^PHgFdBn}5&3WC>1LQt09*l{+ zWKfSh;^z@RZybo1Hv@&3i+Na%RalD+*o>{X18*q`t106efOd`}-niyyiB2HiI5!fI z1mcZL2m6X~UJ!en543w6Z5~IP$5DrIvoIS)pbq1RJ&xGpig5(TaRQ9lanxhnIXnQi z*Kv>FaXg976lMH1XpKG~-{Xlnp7xF(im{jsVvZ-z<7a}lkDr6(Sc7#S|Kqn|2X=#c zj3@qh;*Y-%#2e4J8UHL^0OM!;J9r--f^j?EtjiaQl26~|Hv{#_p8)cmPt5$e5Lkxw zAZ9+f&L`LT+p!b0J^vP*#BI16jEnqxK|S(`pHKY!cR{@TFYyh&$4~f6Q3$C_s06mz z3DjkR3dZRK#=`{uIAJxmfS40@VGj=D6o@&2d{4Lw_uvd@`-Erk9A3n0cmr>PdQ2ex z1maKlTTvzwZ=!~)5r*qg7Y(3;@jH>aOl%0o%|!ZVBK4VgGwuX2C!WPQJcj2%%!%ZC z;;VQaZ-TZ@{2Jfl2mFfP@h7N90r3lnUr-OkD`o=mPM6L&K0 zo!kMP&=s_KGHsqrnkqS+-X~J5X7B!94Bx)?!-MfgD3F}-URWceTpyeHNL~| z_!Dd=gjA+em+4hN|4pZVrcRBoKb?9^C;s$rLEIU{no$i`;u=&(9WZuhL?99lFpg%pF&5-v2C-+* z&Kb0G##x-hV|X6Kn?bx8#G6698T9>(_wXTT^NgSIEB?SgiZYY!XJ%zwff}fVXf#JF zv_%JWMhxPRh$N&U9pgaX%%n~;i9M4(p7{Yj205Qe+?nKh=6U=D;?5%OEb=`o48)yP z6SRF+1L%kXZJ*T+9YOnN5pPx>c+nUAFbpFw3S&TBX60iA=$l#8XBKUqMIRRuvyiqH z($>OjL0b!nSy&hKLCy>5`@$BW-G%MZ3Ej~Xw7-yg6cWFX_=Uqkyut}!dnufX8JLHK zSd68hE`_Ub6!cLc^_hJG>VcTEBM}X9KDz^mIlBwGp$A-`?Xx||L^cM(hoPVzvxz^O z__ODOc(WNNv)5rGwxAgMaS%6wy39Tf#_DYPXAbq5(*|8Z%sIUfixgxb2LnLNImDbp z%sJ$J4tbw51v62IxmbWjpzU*(V;gqj2yVq4xEp714vgJ7PvU7jix=<`zE_mFjElMC zVlI6>m%g4$%(#GETY+vk$^x#WHB25iN4?7}`A0BxU3J?0XBF7f9+4&u#y z8L#0@yaUGV+%NDIzJXbn9~GsD@mka#)Td|$=<6b47A?Uttj7)zvuF?Yg1i@z_afR} zbQkWySv-J;@F=K95%G(NU-TJ>SM(Ep#UJ=fQN$HcaV4$>brIKr@hTV>g8B&hTF}>m znBou);}lMVn1XzZ`|%(i25lFw;&r@*_wgY<0re2X7sQ`e6~vo&J#Iv8)I~HJqA{9+ zy3A_@#_K%#XCC#LcPH)xG3Pyk$M8Jf05Rv0?|JXx1AGM9KJOR&hVzOtUqK~Q0ri+q z{Q2P^?tEg+Z;KA-jBbcSB9g%Pou7^jVTLF>mvdNqCndhwns;FK~MC88`NVV@fQ+*;Rq0KVFB1y7f#14 zEWlzc#d1)Wg==seFM|3kBG-!=fS8M-;Y3Sx0x=hn??pY}LJVm8BF5sPzUT)ZhG00T z$0Fh{BK{&8x`=p-)?x!TV;lD2Aa24DP?trw;3?2Qi>c4zcIXabE{;VU(vS^eE+*fL z2VpRVg0?SaEH0jk8JL42%m?*YO#H>fU%Vg0TYLg+tBdcz-FN^G<54^g>azG5e5oi) z=$|FjXNeaBLCht?kc;t{24XHD-%Dm=E(B=%lJ(e#E!c_O*bC~hg!oH{zvMv>Z^^TG z0Wae*HAU-pZlEGO=AVlBTG*P#Y#K}QrEXox0g zhTfQf4ItOcY3p+0Eq?$H;b{B zy;8+B2*dTD-7D*$9;nAk;;$tB%I+ZEO4`0M1?li$0DKq<#_h^c7=y()4)VY9JNyna z-am@6ingwze^(K2)r}zLs&Ei<6){(l_f?T-iFW9K&gcObX!|O*+f|v!260!7$3#rV zG|a?&EW%QdpH-`|7B}N1kcZVZ5dq?@rk_`n_tms_HSt!H@72UyO}adzRtY+I?y#&j#1;yBpLpTERv-%D&ZdaedIWUG+Glo{buPAG( zf-$hBH^}uG;;qR+e+&ol)=U5~*GvI1*AR0}A?AWMuc5tb)?*X4V<+}tFHVB^YaYZ? zVC<}U0WaevgAb7UX*!ao0VA7eTw%(e8C`<6V3J>amXa>wZ&| z^~7CIto7A#18SlUBEi^M&)8Yt7|qZE$)Io6lZ*AYgLbYb-uj2|2*~$(;;nxZ#9aR# zh`FAa>&f|g;;uL2{(-*~Wdm*BP#Ls+18v_>3*jK{hE`~c4q)tV=!Q5jUNXF*ilQ0ouNa zoNwxYuILUIX#1uF(DqH#V-xW=5r0!2h_`7vW?>ElmSH7UV=bu5Ci-pDt#}>OXLDUd zgP5C}pc&eu2Z*^j25!V75wv}Ce+2u{$}EDUJl}I-i&S7i9I-sW4IY7 zKwUO7jyAu5-xOsF_1V$|u^{G_-bh9!27#Dc$oH1v7=cls?OSG|5Oc8ri?9^bV+--O z>;`eS5Npd_IE{O8Kc2wTcn&Y(6}*O@6=iEU$i-G-Z>61EY3J5)V7zT5-&@J^R^n}4 zjAbC-TgmrU^1XFEX!F(sID{j(1t)PE?!d!%3@_syypNCYDZapu_yxb?JpNV`nxky1 z2l{3kb=pQ-w-IyOI&1_v-$vYR>%zAV(n;$j_88!h(~XvARQiL zq5xZP2E^V$J9p5|9prk)SNIv^cqj385^pE*b`o!=hO2QSYJ)cKq`f<7?@rpgllVJ3 zpfkE63E3Ee;TVZA7>B8tfmxW1BFqD0bSL9sCpq6m%w6Pq7rEX=TXzw27yF1^#N0*9 zT`kZGZ9wc@y+E6HC4%i`S0B*kU0I+WyNJIl55(O?tX&JS1k14so58@^wFA3QjD5Hd zpD4<1+P|Az?!S`5ApWoVBVl#-cxp zKgU=27Qf*<{=z?svbPc{LkDAG?^rAYZQV=Ey<4#z`*9p6a0<8MP7rr5are^hy~N%7 zEM5R@-}^df`(E0<_iOwBV(zPkD{&2~;|A121PnyMiAIP+9@c>N?z;=b+jlP*Z~Gnx z@%FuhSMVBW`#$3Cquu+y!FTu(w0++npzZsp$A04P4@Z5_{{6(=Pu%^)-QOM^(HY%9 z8T(o90Chh=-4C$t0qTB$x*wU|&@tbd>}nxQ3HV+6L~DMdL*t`9ax2Mh&&JII(j zI32Sv2lW5JMOcdEVBLe;!1i`!76;P)`^xGlIIJ6K;z3X;@0ee7y-t;AY!+HFzD2IuCn06e#0(B6HhG+uX zcDNO~!;J(aAr+a(Mt=;#V2lUtK1^K?p91wcd zfVv$fABX9iBUgd?ABjL4(1%Alp(}cz7pT(_>U4xU9idJ~hF~~GVhqNCwjY^gq_%feK-i}e(VHp#T}p>$IjsqkoV(N5r*2JZpW$DaUIm@co$HglR7>r@a1^GWt{f_5h9c~7>I!-=rrtLTPM53acIE-UpUvPr)a)SNP3F>v?H0}j? zKJgG9#S?fM&*4S9g4gjD-o*!CES;b)PSBnc-{5;No=*G<`s2i3igHpxC>ZZ2Ra}K@ zaUE))7O3ON`k?(Mqu@ki&_^ffpOcKolkL$7T|qycWIUc^Jf5VlPBI=(rh+~@NuQmh z&rXu3ljP|nc{)j+PL9B6kfW3ND8Lj<$1ME67VbLAtFr4G_&LLXjMCEGD58WSDpCd| zNFyN)lMEp$w%F1sNO$RQ(+xvPmoy^XC0zo;`|*9>XRXikJZo{zb?yD#`^+ErTKDfO zzTta*q7VHU#8Aw5?nuTko=Hq)2EQZoxtg83fW<6hC97G7xzF9qHhc$jcVk9#4|15J zoZvL)xX2Z*ag#gT=OK@SU|s~NNy}4YATwFXL2mLU ztY8&u`GZYtWe0zAebK#$rC(DdNT1e*~vv-3Q(A0 zJi~LmKv`a*0BvYHvXPTK=WUDl6H*X3T!UWz2k` z`xd%qp?elOYhg{^;Um7{8|JVSd$v%I3-z{8Z;J}^953)borvXo`lE(LvRx$8MKWDv z?-pIa-HY|KSTBq9vbX^)XvODvfALRvZ?PFHHiO0PTP(xHGF;-_CEi`)-6h^x5=|WL zTH>80?porWCH8sA?I2hxx25u0DzBx@X^&c$+L@(xWoci2V?K-6$5Br3I0%-dGHAI&*hu=lf6N( zB9ioEq7>zMg=Vy)BYIfj{T23n#XRiq3fZmD!-|Vs34)b5C`b|Bp)v3AB|p*|@2>Rj zO7E_;Co9crr9DZ`P65n3xhi@{u0sMJ(i1r(%OP0~$!pol4$k8{NWK*WtK_gs4y)v_ zsy2;i%Ex@owd9q}Y$|JDp*DDqgdo{iYyHFj%_T-KV&TDh#vMI+v)4YFK2 zkRdE)HR@O^hqZE8D~EMC(Z{-?=w+Q=*6C%PJlDx{ojljMd)*ku+xJ3TJGXhwL^aa~eCi!7Mk*ZKK>a%5CH8=zn8Py7L+K zapQF6FrR~*z!{s;VGlOxd(&&UdsB7VVRoAm8OB&9u$kTL3j+UdusI56Y%WE4UZFj5 z-`s`a$b0i7%zN`L_HaK4wnUH`d2K1fi+sT6=y{8bwrs#fTjaYnBofbVeHFcKHJ_~= ziD59KQ0rDZvekQAw_(0p&3CK$ZYxe{%3(*gy+;e|$F^R4hpe{AYMZRK>2uprS!H&%2CLdR0r z`#a2Nr+at0cc*)IR^%;eU_Lv0@G&DWpPiH0h@5xIc~>Dy@;sgS2zTys$1WM|TF2uc z_%kg}QI%TMp&!5SD}Ql{vq7+1AG?bn%iYoFf48~qR{L%<+wI)l&fMe7Jbrv$Rt-h=<`56)N!B@O&P>U{2e*4mAxDYf`hpzOfj5& zup2%2jrr*HptBEN;-4Tm>_ z@h5namUJYBc`V0yC+x_HY~;khpGc$|ayTJ}6V5uRj+5qhGAr-$9xWKp41VVpkAlET z2dDIZsxh8BHHN8p?vy#5x{J(CSEdHFF{9IFbb30sQTLe;-_4nZG{O64=CS}YIU9kD z&ep-dpKXS@oLz{yoQotqnULW*8J?5jxoONs2IubZI0()=>%6|stM|OV&O7J4bIv>G z{JkK!pq2~HyP&TN`nuq`3+8%3-517jg9oVlVijuQ*^AD(=$wnrxs;9knExfad8sF# zv4NfJ4uZ?MC`>V8vA>r;WEt!5?3F08;JhnMXiYn0eC2=0=*o3ue8oKesfrx`sl)g5 zXApb%n`1$6RZUmzse4z7NR9l5%mjX`iN4gQu~bN98n_#Upw^_m^HW;WOC zz_oK+<7NblVoecW)y4Yl7e-y4sE;AUE$q7m=Y zhRMkErup46vs?cCRtCI(OAfc>aLase{rB(lxQ%;mhp6?o9k^`=Zp-twJa5bMP9BO< z0`s`@9Y5lkJD$1o-!l(`;BIQvbhifeQP*9W-EfwU76pN`MtN0(LK-I`-O2# z%{O;e!o&UbgyELFb!x_m5E^;LZ9#lq64}3=tob$jr51jMB zGY>rTz%vi4P!l`(a0veWp_(3Ez&swx=}{%BVgD@z`i@eNF3}PsAS;k8Cag-B03c@fAQKTayImts6 zs!^MGx-*#REMOsvSi)YM7hdKnH@M9`9t2^8J0jc>;f@G*MELdWh-~Db1|KkyT|t;C zATQ5Siqe#$JQa9{#x&=B+R&b^e9WhO!PopqZ~8G1^`{z76011HHSY2+@`!YQ+*Grxtb4e^f)7AcrV9M9Cql9UY0mPDaTjsvA8p`>0R(g0K0OANZNR z48Z)OhB1OsjAa6{ikikul9HF<}3X@GC% z$@geME85b5XyWKhS3ck)KH+n|;v2r_C;HHzK@4R$BN@YZCNY&6{LcTF%K{d&jFqfr z9UIupHg>X`eH`R4M>)Z1&T)||T;nEpxX(i#2jNo@q$Vv-k%7!)B?r05M?s2EoM$OT zY06QaSExv3s__;zs7+n!(}<=t=Y87Ho=(J)Ko`36AwBtwFX_d1{77&5F_0nr!mo^G z921$sbbezNbC}N}ma>9XtmO|jv6UVC$zBfd7e_eGDb8|%%UtCKx4FjyQi3pDNF-12 zBd}xUG@~W0X-7w5h^Gf1BcpV( zNhh0h`cJ3tbox$rl1uy(gz3#ay?LiM@APJw-VD>5VS4jOZw~3rA^mKYu$&WI#ExYs zL`j}UEg961K@AzqErWSwFs}^1vw+1M<2>%pScFoP#;#TM)S|;{fy?G(R&$J zvKsegyuZ{b#?yHy zN(pMxfW{>7Aw3z&7{;@aUF-?Mtf@#xMxNs(>`K=6XiEq5kk$KHhclOD$S$iMvR>eF z5N5NB+3a98JD9CDjcCdj{J_t6H=B2}c{iIq$!1pB>`C@)+pk~=32X-R8jnR@_(S;Q*Tky{SA<&awrd2*nSJa##cUh?QA zk6!Y~Gmkv;$TN?-^NeO3-p{j@9bDwUGwuXoUgzX>PG0BawNrUp&kW?XDO z|Gjeob1I&RT;#=Uir1$R-YedV@AwVx6<@>wykFdmO1QU#drP>t#B01sbD&r*s6KE$2RxZ@caJ+qdSAbj=-o}>yjd569XV+4md$(bN5sgII{ zk!8tF=)a`7l~j94Gb`!blFoe2na?@%xtFL!ReJCRU$c;8)&yax2=rMh1D-9Vzf!gM zhCcLXGkPkuF9@G^_VY4*{%IQVK5ZDv7{+s$)0_*!7xGaYS-jASXyO>fWTtVD6L_bz zvrFrxnRwL4|624T79kYl+DsJooA%YDRbmav@vp1a3`Abe4+FSe!~ zzq5eF+z-N+Wc^ZVDpP~n{J;PPvzH^-zw-8{{Il4f^6~WGWAszr?8>jfeJ@91CNDR` zoiFR@<&|t;a}ZW2PHD=a_6nc#6|$+I_6p9b@F)mhNkbGZ=s+}cS%&jowIi=)B?tcf z)y{N94zJ4LRcF1Xj@QiZwWp~|Q<^i5>HNk`9`ZN{E9&3xT89-qS8+5`@LWZ6s(1&P zy205aSL@<3h>=jYCvPWUuh2WF_X$6GOGLz{=M>hm`mjam`jyZq$49T ztRllIGORL{{~?1aw@C@Ys?Msaud3>;s;{cfsp_1n&Z&Ag@E@n(ylVQYrmt$At7fj% z)Lm^X*ZCK9zfqYQc-C)8hi^FN4d=X>m3)~0n|AZfkNK28*ukGc_*PB|QIr_$?^``s z%33`8c3Lvyytf{hLrpd8WDPr6 z!~ARb4r+XY9jUR74MA8lHU5^=ba%}<_#SG?wWb}YX*MoZ&qSg@X zK`qbLl2t8P)sj_hb=7WwK59Fow%Ti(Z|#&IeCG+Cq#-S7%_L;{j``IwvpW90PI|mw zM-Fx5P{(}z-fdWCF1K)x|F|)%tJb=9pspRLE6=*}tSirVb5n%kn1|nz4d49%&%EoI zcmI3lK@ir9L{0UoQxA33lX*Rv*Hd>rnb(tfJ(>GG*08>e>U*yKFvc>0!<^<^5H@&$ z3cSVuMlcHbHMoa68@@$d>eG*3_?6>a;BpW)s)U*v`HmVnr;&3SIj50l8hNIXXBtR+W;?hUgw4&axmh=l zzzmvaMz+oCVFu0ZVe@9R#EvvKaPUl7rmj zqab#$g&p*}m0^ogl%_0Z*P<$KU_LEA<0pEf<`!yh;TvtSi`~e(g}hs)!%SM{!5uB# z(Nb0|+asTr(Zn&1-?7JjV=`{ZIYqM-Eo7S>v-H$cwKsK#q(|TVJws{iSw~Mm(Glw(WKsIe;)5fgZzCcA}(^fWZ&8clqzDG7~Wz*K2+OB3hvS}-uw&v6>itNay zoow2fQ@e(=K{oAV)6SgQjb;Y2X(yX@=Hzz|!*3?AA)^kvad(FcT*kc}u5ttYc64_~cXv#S z{pzTOj+rP$d0xR>I?AGBLz?g&&1gw$68MTIqkKBbrlagT zu4f~g*}`^qafD->M6Dgw+VQ_y&8DNh?f5VVJDGW>bYvt8*|3kD3L?Kw#d!vGcQV6H z_NmjGm}93}G)11BqKTt3UHO0y`4atf(oZMfL#I)UWjqs@%rwlm(;}9#mOt3UJ`Qr2 zqnzLrX3$Abo%Gb{RuD$(BU&HPa*x(av|gh15?z?0l)x@T+lA-~*vse|)TS=>BDxVx zFpFsW9&JaX^%ea&<`S)s=x_L*pBTmn^c1a+XnjP_L?6-mh+e@e^b>7Het$8HHkar< z=qvgnSI|fFHEwbz2xC%_hNsC+F6?tm0ScjynCB@&IrI^ukC-~>B}OkXdWmUE2lNnQ zCNX9b^AX=-7BN5LZ-L)*3}Xf{5<3=SHZc>?M~puFeq$J;ml(ao=p|++yU|08*~FMl zj9rU4%LUBF?>dID`tTc$VXSW=)_h{kC)R9Y-=YDH@eRbbpcQS1#di?fg>I-bR-LhZ zP;0DOV+Z3qh*e|k6s9Bh*xy-#dSjDW!#eCzta@YB8>`+}^~N6MIO>g6Z>$-_`ui29 z-Z-_!J%xJX)Ek!t*~i(XxYCrPJg-oZN>ry7b$A!K$3>%`xHvk~l`r@jGl_{IqXV&B5I8P05!&|FW4s#UPoTzlHO8wkUXAhp@-PS!)R>^g1i2@qM~w;UODKUF{r+T_@B;Eq zs7y8NQG(r1kb6Qyn$QgUl%S6UeI$IyM|{HP=p{if2?MZ43B%A+!aSCfjJ-*)Hwp4h zP`V&s0{si?WsK0Z7J@0I9IzLTza*-EVcP>Opo~I1uP;=+n*p<$8sZS%! zptHT{Y;QWNzjF^h<~x3*H~koh+B^HZ(|Iftn8ae1VFsO7vKoDK-o+mFbBvRm;Rd(4 z#{*J=Fi}5=QKTaynJLb*m_cGGN~4d&804GSlh06RqB;}RnJCjldy+VY@u)A+x9WE< zL%(|&`rXSg(QYShVLLlfXQDb2)tPvTvs^%(iRw&LXBT_Y#h!GrCtWh2zAjHA=Pq*Y zQh}Ph!@D$~G4Ek7y0k*hUAm+8F7oa2DPQn4-|_=Lp^q*@8Ha4U>_A;z)X_B)GU-|# z=XPyJdlL8rXLWT}S7&v#b6w4>>kxk7S4N@luIGcWTga1SBPV&tkDj{uPP>)hB`Q*x zYS{g5dhDjhZhGvd$8Jq=Z#NltJH$!k*X=rH+g*0uW!GJH-DTI^ecj#H-F@BN*S#Qm z>i!&MaaZ@Zk!N>zb$3_yCN!fZt&wH-4s=G2-FsmVy4!>9^6Neb8Fsf1-R(p7(b$9T zzq23+f3CtC)Z=~HAjh9O5laGH_?)l!hVL<-pZm}s+5Y_BS$giBisyM5_4lqpZ5m-t zy`A5?2Or_Q-p=c--rnl%t}@{1)!BO-6PQU7|6?x8SWYq<`I}?NyZ0H)wD(1> zaE+VX;XV(7u#Xw^G4DRUu|DR|Cl4i2cb_u6i2D1y%InCekL>%Hb02f=W0(8rrH@_i zqn|$V>eCT@^^rrLBSF~L9ethIw>s_kl0J+@Pkkpd4ZZc%Ti@BtV25(c7+9WcR+5Ex9ARHRv+@X3MYJNj2 z@EVn<%9~V24nylukA^g%87*mzjE0)U&=}(Rl?~hq!eNCeiRXv?h}jG~7KFc~ry_BT zKuy2crQwBe&+yL}%qT`Pj^A0ra*|oYdN#6!1N_Ai+%fzFW-;6>hF=K65s~EQ6&m5Y z9`P*$QS%7*jBwA0iA-S@bC}OU+&y9$=I%F0!e8ylukZ36EoensWbJoG!e4*jXZkV# z{rozN@l3)UzfNN&N&Juf+zrB!c4cI0e48Wf<;V==p(rJg>B#4K1M?W!k)D|G$Y0RU zNd1h|&q)1@+{aO5;rBwqkyo%|em5i>c{>P4MUbAS$xbfp<|ucKDubDfYD^D$@g3$l zsy9Q>(qH6^qU~zXlIYEfip)Z;GEIJnT5uI!}M&IE+4|yDfWAryho@1V%Fx6;IEMMU6F~5W3{@CY`%UIva*qXe9*`1* z<3b`)=eQ`$eB3iUikmvZfs6lP&qQ>!R9PgVL-+^f2P~Uj9 z`JIn&{D-J({4$R6C`6a7!9z-!2TLRDlj;ceVEp#|=l;GPNYnc$uY z?wRljpYs*p@I7{S!cPpuw=zK%6MkbBbC}N}mhcA~*vMv%bA@Z%BjxnNI9T4Dlq=jUMP@qCO_- zW1=1=_Mty|nV8HW&T@gvT;&G0f^bqAWI9PrlX8(4JMA|>!bv5O?PLl5= z`A%v`BO22b^-TJVFX_d1{D?i9_lohOEEp~0nMmBQ}Gn;CkrrM{e_GxNX)HO9X`B2}~A{6IYO7SMuQQK6tO;y{} z`p9ysET_tHYD-$vjt=~YET_tF>S_*f61hxs_q1YE#JSV#!L-IWYubC*(`hlplZZW? zCWC3Cn9gs^Vh-~$qiM^~=d>OC$zI$!?I?C)ni)+y%lROjuIK6cnlAI{b>kPX;!`{yrgG^_*Z^lYCV6HQ^q3;>TknxN&=+kelgfrYd zGsNGKndUw-1Li(6Cwa(EA&O8F+0T^u%x?7HBfe!IL(uz7z0cJ9Ouf%k%gp~Vmjx_F z?=zQ^jM>jrW0GA;l6g{T%2A$Is7Ph1VID~}sExTKnM;znB>DT0)EwVKQX9-DsS~jz zAjc#*Cdtw7k%WGaButWHk{pxFEXmB0deaYmBehDm0aWQIwz zn8SP)p{FF@RnjWfVzx<}*oy3v{$wu)_=_W$eUiOPvUf=rxXe{2*`5BVuXQA$vf=PARByv(b- zP8HtZZEErk@6v$AyhjUK(UuNG6Gvyd@&O<537_*7-|#&@(TDyFVkpBI$r#2niK)!s zcmBs*7On;^!g;B9j+b!vysmu0=h&5bc4VF%nP>jo0K427*ddDDTVni zY(!JMzfeXC`{T}qc6XuOU3i=eTn@rT*~m{JDq}|$Ib%@_-RQwE#xjA$tY#g@IM1aZ zT>Lb7DL_4%(UP9@!mccyOcJxv!(#6*KFOmXT#^RaEz!f0^1OmwTw({8*uf>k8P6m( z@h5xn?o#hA_3l!8vec}W+LNX2h{w#A_C*g%N3e)htVIq><*-x^%hHpbT)fEZR6!2Q zHLN)SN_G3AWV+nDb$fHhh#Y<%OSY~`bf6R$$ClFOR`>)<(Vu` zze^G(yF2+D7lUw>_gCd0H!tIiRd3*&RnA%EoK<#e)ih?JhE-}S(;T`U8eA8hxzZ#y$@6FbLPkaZOsDp)C4e(|{JVVgMr;#cDR=j5UvfaINgt zMo}6&xYjJ!%5AOO*2-<|Pw0Q`P*(5<_HpeE9*`1*>xxhcXRLbwdu9>jsmA z*{xf`G0t--2-jyN9|d`b#yDerPkQkkvyl7xrJO+C>#qdiALji>9`f@Rb*YcM{`j1) zSjh(Tyg^1AGULt-^4(B}dU$rj_vm$l`D~cYJpSekYTal@HhOPk4$OC>`EE2{zcmtW z{ERQLBO50%75lMqD?5~(ID5}>%x2GRQi5==UiUhC@5{W3=l0s6 zy2cpR@O^;Xx4YkK_qFxBo3_pw|7rF^juF zcpxAZZzJmi4d}yAhVv(XaU=*27UWs%-$DCx@FVPx-v$W}u3~Kv9@5VtvpbX?_Z_N_ znfOhR@Q^zX>FKX1vXG4r_?)j$`(GQ`f@}_}{jjqR*Pz1!sAs@_whRTZjO&-0^UFVkjFuI!c0!oMMft^;NMS7##~MY zn9Ip}G@~UlJSoGIGCX;mf04ndYShMAr}TA7y?z5EJms9z&N=Oz({G}d)6P4suhaTE z?YYzDdRpD5F9hM4N>oSPXZkP{&z^D4S?8Q}&e^uaVg6_B=GnFU5rpS5lbd{WB#~~+ z$NrvM6@=$glL613Z%iwkcYXphNkYcw?<1oNuOs6N=5e7fa=aj?3p+W;;UK)2pAwWr zO&9ItMLT)X{4e?rF0K#4OLpW^MzYWVe@ia8`_ixY9xloCk{!5YHka(c<#JS{GCwg0 zSzJDfJ-F=IE3&#Gt1Gg)qOL1r(Z>~MTv7WK^ZlnbjcCd^rt=&BAk%-$@2Z(y_3u}k z?eFuLA;SJB+ z@XQU*+^9i))O2GAqfyrlnctB44Rzm?`AwPMl=;np$mpi$ZXV|XmxJ(D3Ci#ypYa_( z@)xH#8-%yzcl#~ed3z8e8N)$Na5@O@l%hPZ&>J<~@g3c9&K>96an4=O-1W>|&)n_9 zQ0(O0BmDR8YP$Cl=5bF>_kLzDW^(Ts=kYh+?|y{$)pK7x_nmQHE%$u`_htOAz5X{1 z@6(A`mb0FXLHHmC1u264dhiwBu$#l!iw6&b@S&_9rp2=lpGEBtYtn$myhjT<5RHBw zPQzUfld-Q4-TBa+54YgVN6viY%tud=p4{Z40EH=uIXu$)qc^FJJ0H38Q4F2=7I!^z z_M`3WVh{Vcf(#znvy=c?q{t%0ohfFVBG(jWr#L&s*(tT~w=ty|ZD^0oQev@xDfTbr zLwfQlQ(1|-Qsk6k_9>@1%grEs9DyDmyYI0cAKTT(cJ*;qugvV1Jd$E7KUeRy1f z*LWQ@J#IobzGnjRd@RGq*GUQ7LL^V{BcZd7n14XE@`T z!gPKkiKVPy6>HhVJ`Qr2qnzUwclnoxK}49Ev^+(6ilL@ZO`&>1^@QpPt5S=1X+UG% zqaz7)p*tV)IbYF>@A!d%{K{0+8_s4P3sHBd?oi#~A8h0hC%KB6Lp6tL4j%^*5fP+D zu71ZQA|f{>C`D=1A0f|(*Qi7l)E*(vh*q?v1JNYXjSu*Uo~S!Q-4Q?18<|IpK>ZP; zn9MY0qL+wu?BW1_afIW@JK`dj(MQB}{^d~+kt#qRsWOs@%sfqA3Q(A$ypGyaHKYm6 zXh~~gh(`~p^pL6tdPpVvR6jG6-&w*M*0YfE%{kItk@AX^Poz5{ zc`t}aZN{n7A*0k;$cDO77oZUGNnM;Wyh?4_@F~MEv()PHyEGB0)sB - - - - 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 27/60] 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 28/60] 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 d1b6581c087ef7a02765a4971646370a50474fbc Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 13:03:06 -0800 Subject: [PATCH 29/60] 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 30/60] 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 31/60] 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 32/60] 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 6cf6e3c75027dd0004393e095786eac0bcf3f508 Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 16:22:16 -0800 Subject: [PATCH 33/60] 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 dd9ca9202cf8d997316eb8c7bbe279bcb5c06bfd Mon Sep 17 00:00:00 2001 From: Bart House Date: Mon, 19 Nov 2018 16:54:31 -0800 Subject: [PATCH 34/60] 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 35/60] 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 36/60] 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 37/60] 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 38/60] 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 39/60] 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 40/60] 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 41/60] 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 42/60] 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 43/60] 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 44/60] 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 45/60] 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 46/60] 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 47/60] 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 48/60] 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 49/60] 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 50/60] 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 51/60] 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 52/60] 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 53/60] 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 54/60] 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 55/60] 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 b19502563545da4b8bc20782e6c57563bfaff501 Mon Sep 17 00:00:00 2001 From: Bart House Date: Tue, 20 Nov 2018 13:22:48 -0800 Subject: [PATCH 56/60] 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 57/60] 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 58/60] 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 59/60] 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 f295b00ad1717178c3b6cc80491d7694cff4d76c Mon Sep 17 00:00:00 2001 From: nhmall Date: Tue, 20 Nov 2018 21:00:03 -0500 Subject: [PATCH 60/60] 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)